map.txt
Doxylog*.txt
LineCounts.*.txt
-bochs*.txt
+bochsout.txt
+bochsdbg.txt
serial.txt
*.gz
*.img
int AltWritePos; //!< Alternate write position
short ScrollTop; //!< Top of scrolling region (smallest)
short ScrollHeight; //!< Length of scrolling region
+ int SavedWritePos; //!< Saved cursor position (\e[s and \e[u)
char EscapeCodeCache[16];
size_t EscapeCodeLen;
Term->ScrollTop = args[0];
Term->ScrollHeight = args[1] - args[0];
break;
-
+
+ // Save cursor position
+ case 's':
+ if( argc != 0 ) break;
+ Term->SavedWritePos = (Term->Flags & VT_FLAG_ALTBUF) ? Term->AltWritePos : Term->WritePos;
+ break;
+
+ // Restore saved cursor position
+ case 'u':
+ if( argc != 0 ) break;
+ *((Term->Flags & VT_FLAG_ALTBUF) ? &Term->AltWritePos : &Term->WritePos) = Term->SavedWritePos;
+ break;
+
default:
Log_Warning("VTerm", "Unknown control sequence '\\x1B[%c'", CmdChar);
break;
--- /dev/null
+#!/bin/bash
+#umount /mnt/AcessHDD
+#mount /mnt/AcessHDD
+#cd ~/Bochs/OSDev
+#/opt/BochsDbg/bin/bochs -q
+#sudo bochs -q | tee BochsLog.txt
+/home/tpg/apps/bin/bochs -q
+# | tee BochsLog.txt
+
#include <string.h>\r
#include <net.h>\r
#include <readline.h>\r
+#include <acess/devices/pty.h>\r
\r
// === TYPES ===\r
typedef struct sServer {\r
\r
int ProcessIncoming(tServer *Server);\r
// --- Helpers\r
- int SetCursorPos(int Row, int Col);\r
+void SetCursorPos(int Row, int Col);\r
int writef(int FD, const char *Format, ...);\r
int OpenTCP(const char *AddressString, short PortNumber);\r
char *GetValue(char *Str, int *Ofs);\r
\r
atexit(ExitHandler);\r
\r
- giTerminal_Width = _SysIOCtl(1, 5, NULL); // getset_width\r
- giTerminal_Height = _SysIOCtl(1, 6, NULL); // getset_height\r
+ {\r
+ struct ptydims dims;\r
+ if( _SysIOCtl(1, PTY_IOCTL_GETDIMS, &dims) ) {\r
+ perror("Can't get terminal dimensions");\r
+ return 1;\r
+ }\r
+ \r
+ giTerminal_Width = dims.W;\r
+ giTerminal_Height = dims.H;\r
+ }\r
\r
printf("\x1B[?1047h");\r
printf("\x1B[%i;%ir", 0, giTerminal_Height-1);\r
\r
SetCursorPos(giTerminal_Height-1, 0);\r
printf("[(status)] ");\r
+ fflush(stdout);\r
readline_info = Readline_Init(1);\r
\r
for( ;; )\r
maxFD = srv->FD;\r
}\r
\r
- rv = select(maxFD+1, &readfds, 0, &errorfds, NULL);\r
+ rv = _SysSelect(maxFD+1, &readfds, 0, &errorfds, NULL, 0);\r
if( rv == -1 ) break;\r
\r
if(FD_ISSET(0, &readfds))\r
printf("[%s:%s] ", gpCurrentWindow->Server->Name, gpCurrentWindow->Name);\r
else\r
printf("[(status)] ");\r
+ fflush(stdout);\r
}\r
}\r
\r
\r
tMessage *Message_Append(tServer *Server, int Type, const char *Source, const char *Dest, const char *Message)\r
{\r
- tMessage *ret;\r
tWindow *win = NULL;\r
int msgLen = strlen(Message);\r
\r
- // NULL servers are internal messages\r
+ // Server==NULL indicates an internal message\r
if( Server == NULL || Source[0] == '\0' )\r
{\r
win = &gWindow_Status;\r
}\r
- // Determine if it's a channel or PM message\r
+ // Determine if it's a channel or PM\r
else if( Dest[0] == '#' || Dest[0] == '&' ) // TODO: Better determining here\r
{\r
for(win = gpWindows; win; win = win->Next)\r
win = Window_Create(Server, Dest);\r
}\r
}\r
- \r
+\r
+ // Create message cache \r
+ _SysDebug("Win (%s) msg: <%s> %s", win->Name, Source, Message);\r
+ tMessage *ret;\r
ret = malloc( sizeof(tMessage) + msgLen + 1 + strlen(Source) + 1 );\r
ret->Source = ret->Data + msgLen + 1;\r
strcpy(ret->Source, Source);\r
ret->Type = Type;\r
ret->Server = Server;\r
\r
- // TODO: Append to window message list\r
+ // Append to window message list\r
ret->Next = win->Messages;\r
win->Messages = ret;\r
\r
- //TODO: Set location\r
- \r
+ // Print now if current window\r
+ if( win == gpCurrentWindow )\r
{\r
- int pos = SetCursorPos(giTerminal_Height-2, 0);\r
- if( win == gpCurrentWindow ) {\r
- int prefixlen = strlen(Source) + 3;\r
- int avail = giTerminal_Width - prefixlen;\r
- int msglen = strlen(Message);\r
- printf("\x1B[T"); // Scroll down 1 (free space below)\r
- printf("[%s] %.*s\n", Source, avail, Message);\r
- while( msglen > avail ) {\r
- msglen -= avail;\r
- Message += avail;\r
- printf("\x1B[T");\r
- SetCursorPos(giTerminal_Height-2, prefixlen);\r
- printf("%.*s\n", avail, Message);\r
- }\r
+ printf("\x1b[s");\r
+ SetCursorPos(giTerminal_Height-2, 0);\r
+ int prefixlen = strlen(Source) + 3;\r
+ int avail = giTerminal_Width - prefixlen;\r
+ int msglen = strlen(Message);\r
+ printf("\x1B[T"); // Scroll down 1 (free space below)\r
+ printf("[%s] %.*s\n", Source, avail, Message);\r
+ while( msglen > avail ) {\r
+ msglen -= avail;\r
+ Message += avail;\r
+ printf("\x1B[T");\r
+ SetCursorPos(giTerminal_Height-2, prefixlen);\r
+ printf("%.*s\n", avail, Message);\r
}\r
- SetCursorPos(-1, pos);\r
+ printf("\x1b[u");\r
}\r
\r
return ret;\r
int pos = 0;\r
char *ident, *cmd;\r
\r
- _SysDebug("[%s] %s", Server->Name, Line); \r
+// _SysDebug("[%s] %s", Server->Name, Line); \r
\r
// Message?\r
if( *Line == ':' )\r
return ret;\r
}\r
\r
-int SetCursorPos(int Row, int Col)\r
+void SetCursorPos(int Row, int Col)\r
{\r
- int rv;\r
- if( Row == -1 ) {\r
- Row = Col / giTerminal_Width;\r
- Col = Col % giTerminal_Width;\r
- }\r
- rv = _SysIOCtl(1, 9, NULL); // Ugh, constants\r
printf("\x1B[%i;%iH", Col, Row);\r
- return rv;\r
}\r
\r
static inline int isdigit(int ch)\r
for(;;)
{
sUsername = GetUsername();
- if(!sUsername) continue;
+ if(!sUsername || !sUsername[0]) continue;
sPassword = GetPassword();
- if(!sPassword) continue;
+ if(!sPassword) {
+ free(sUsername);
+ continue;
+ }
if( (uid = ValidateUser(sUsername, sPassword)) == -1 )
{
printf("\nInvalid username or password\n");
// Clear graphics mode
struct ptymode mode = {.InputMode = PTYIMODE_ECHO|PTYIMODE_CANON,.OutputMode=0};
_SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
+ fprintf(stderr, "\x1b[R");
}
return 0;
mode.InputMode |= PTYIMODE_ECHO;
_SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
}
-
+
return strdup(ret);
}
#include <assert.h>
// === TYPES ===
+enum eTelnetMode
+{
+ MODE_DATA,
+ MODE_IAC,
+ MODE_WILL,
+ MODE_WONT,
+ MODE_DO,
+ MODE_DONT
+};
+
typedef struct sClient
{
+ enum eTelnetMode Mode;
int Socket;
- int stdout;
+ int pty;
int stdin;
+ int stdout;
} tClient;
// === PROTOTYPES ===
for( int i = 0; i < giConfig_MaxClients; i ++ )
{
if( gaClients[i].Socket == 0 ) continue ;
- _SysDebug("Socket = %i, stdout = %i",
- gaClients[i].Socket, gaClients[i].stdout);
+ _SysDebug("Socket = %i, pty = %i",
+ gaClients[i].Socket, gaClients[i].pty);
FD_SET_MAX(&fds, gaClients[i].Socket, &maxfd);
- FD_SET_MAX(&fds, gaClients[i].stdout, &maxfd);
+ FD_SET_MAX(&fds, gaClients[i].pty, &maxfd);
}
// Select!
// Handle client data
HandleServerBoundData(&gaClients[i]);
}
- if( FD_ISSET(gaClients[i].stdout, &fds) )
+ if( FD_ISSET(gaClients[i].pty, &fds) )
{
// Handle output from terminal
HandleClientBoundData(&gaClients[i]);
// TODO: Arguments and envp
{
- int fds[3] = {clt->stdin, clt->stdout, clt->stdout};
- const char *argv[] = {NULL};
+ int clientfd = _SysOpen("/Devices/pts/telnetd0c", OPENFLAG_READ|OPENFLAG_WRITE);
+ if(clientfd < 0) {
+ perror("Unable to open login PTY");
+ _SysClose(clt->Socket);
+ _SysClose(clt->pty);
+ clt->Socket = 0;
+ return ;
+ }
+ int fds[3] = {clientfd, clientfd, clientfd};
+ const char *argv[] = {"login", NULL};
_SysSpawn("/Acess/SBin/login", argv, argv, 3, fds, NULL);
}
}
void HandleServerBoundData(tClient *Client)
{
- char buf[BUFSIZ];
- int len;
+ uint8_t buf[BUFSIZ];
+ size_t len;
len = _SysRead(Client->Socket, buf, BUFSIZ);
- if( len <= 0 ) return ;
- _SysWrite(Client->stdin, buf, len);
+ if( len == 0 ) return ;
+ if( len == -1 ) {
+ return ;
+ }
+ // handle options
+ int last_flush = 0;
+ for( int i = 0; i < len; i ++ )
+ {
+ switch(Client->Mode)
+ {
+ case MODE_IAC:
+ Client->Mode = MODE_DATA;
+ switch(buf[i])
+ {
+ case 240: // End of subnegotiation parameters
+ case 241: // Nop
+ break;
+ case 242: // SYNCH
+ case 243: // NVT Break
+ case 244: // Function 'IP' (Ctrl-C)
+
+ break;
+ case 245: // Function 'AO'
+ case 246: // Function 'AYT'
+ case 247: // Function 'EC'
+ case 248: // Function 'EL'
+ case 249: // GA Signal
+ case 250: // Subnegotation
+ break;
+ case 251: // WILL
+ Client->Mode = MODE_WILL;
+ break;
+ case 252: // WONT
+ Client->Mode = MODE_WILL;
+ break;
+ case 253: // DO
+ Client->Mode = MODE_WILL;
+ break;
+ case 254: // DONT
+ Client->Mode = MODE_WILL;
+ break;
+ case 255: // Literal 255
+ Client->Mode = MODE_DATA;
+ i --; // hacky!
+ break;
+ }
+ break;
+ case MODE_WILL:
+ _SysDebug("Option %i WILL", buf[i]);
+ Client->Mode = MODE_DATA;
+ break;
+ case MODE_WONT:
+ _SysDebug("Option %i WONT", buf[i]);
+ Client->Mode = MODE_DATA;
+ break;
+ case MODE_DO:
+ _SysDebug("Option %i DO", buf[i]);
+ Client->Mode = MODE_DATA;
+ break;
+ case MODE_DONT:
+ _SysDebug("Option %i DONT", buf[i]);
+ Client->Mode = MODE_DATA;
+ break;
+ case MODE_DATA:
+ if( buf[i] == 255 )
+ Client->Mode = MODE_IAC;
+ else
+ _SysWrite(Client->pty, buf+i, 1);
+ break;
+ }
+ }
}
void HandleClientBoundData(tClient *Client)
char buf[BUFSIZ];
int len;
- len = _SysRead(Client->stdout, buf, BUFSIZ);
+ len = _SysRead(Client->pty, buf, BUFSIZ);
if( len <= 0 ) return ;
_SysWrite(Client->Socket, buf, len);
}
#include "../devices.h"
-#define PTYIMODE_CANON 0x001
-#define PTYIMODE_ECHO 0x002
-#define PTYIMODE_RAW 0x004
+#define PTYSFLAG_ILOCAL 0x001 //!< Input modes are handled in the server process
+#define PTYSFLAG_SMODE 0x002 //!< Inform server of mode changes by the user
+
+#define PTYIMODE_CANON 0x001 //!< Line-buffered input
+#define PTYIMODE_ECHO 0x002 //!< Echo input characters
+#define PTYIMODE_RAW 0x004 //!< Disable all input processing
#define PTYOMODE_BUFFMT 0x003
#define PTYBUFFMT_TEXT 0x000
INCFILES := stdio.h stdlib.h\r
\r
OBJ = stub.o heap.o stdlib.o env.o stdio.o string.o rand.o\r
-OBJ += perror.o scanf.o signals.o strtoi.o strtof.o\r
+OBJ += scanf.o signals.o strtoi.o strtof.o\r
OBJ += printf.o time.o errno.o\r
OBJ += arch/$(ARCHDIR).ao\r
# signals.o\r
* - errno and strerror
*/
#include "lib.h"
+#include <stdio.h>
#include <errno.h>
#include <acess/sys.h>
#include <string.h>
return 0;
}
+// stdio.h
+EXPORT void perror(const char *s)
+{
+ int err = errno;
+ if( s && s[0] ) {
+ fprintf(stderr, "%s: (%i) %s\n", s, err, strerror(err));
+ }
+ else {
+ fprintf(stderr, "(%i) %s\n", err, strerror(err));
+ }
+ _SysDebug("perror('%s'): %s (%i)", s, strerror(err), err);
+}
+
//Corrupt Heap\r
Heap_Dump();\r
_SysDebug("malloc: Corrupt Heap\n");\r
+ exit(128);\r
return NULL;\r
}\r
curBlock = (heap_head*)((uintptr_t)curBlock + curBlock->size);\r
}\r
\r
if((uintptr_t)curBlock < (uintptr_t)_heap_start) {\r
+ Heap_Dump();\r
_SysDebug("malloc: Heap underrun for some reason\n");\r
+ exit(128);\r
return NULL;\r
}\r
\r
+++ /dev/null
-/*
- * Acess2 C Library
- * - By John Hodge (thePowersGang)
- *
- * perror.c
- * - perror() and friends
- */
-#include <errno.h>
-#include <stdio.h>
-#include <acess/sys.h>
-
-void perror(const char *s)
-{
- int errnum = errno;
- _SysDebug("perror(): %s: Error (%i) %s", s, errnum, strerror(errnum));
- fprintf(stderr, "%s: Error (%i) %s\n", s, errnum, strerror(errnum));
-}
return -1;
}
- struct ptymode mode = {0};
+ struct ptymode mode = {0,0};
if(termios_p->c_lflag & ICANON)
mode.InputMode |= PTYIMODE_CANON;
--- /dev/null
+# configuration file generated by Bochs
+plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, iodebug=1
+config_interface: textconfig
+display_library: sdl
+memory: host=32, guest=32
+romimage: file="/home/tpg/apps/share/bochs/BIOS-bochs-latest"
+vgaromimage: file="/home/tpg/apps/share/bochs/VGABIOS-lgpl-latest"
+boot: floppy
+floppy_bootsig_check: disabled=0
+floppya: type=1_44, 1_44="DiskImage.img", status=inserted
+# no floppyb
+ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
+#ata0-slave: type=disk, mode=flat, translation=auto, path="AcessHDD.img", cylinders=10, heads=128, spt=32, biosdetect=auto, model="Acess"
+ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
+ata2: enabled=0
+ata3: enabled=0
+parport1: enabled=1, file=""
+parport2: enabled=0
+com1: enabled=1, mode=file, dev="serial.txt"
+com2: enabled=0
+com3: enabled=0
+com4: enabled=0
+usb_uhci: enabled=1, port1=mouse, port2=hub:4
+#usb_ohci: enabled=0
+usb_xhci: enabled=1
+pci: enabled=1, chipset=i440fx, slot1=pcivga
+#, slot2=ne2k
+vga: extension=vbe, update_freq=50
+cpu: count=1:2:1, ips=4000000, quantum=5, reset_on_triple_fault=0, ignore_bad_msrs=1
+#cpuid: cpuid_limit_winnt=0, mmx=1, sse=sse2, xapic=1, sep=1, aes=0, xsave=0, movbe=0, 1g_pages=0
+print_timestamps: enabled=0
+debugger_log: bochsdbg.txt
+magic_break: enabled=1
+port_e9_hack: enabled=1
+#text_snapshot_check: enabled=0
+private_colormap: enabled=0
+clock: sync=none, time0=local
+# no cmosimage
+ne2k: enabled=0
+pnic: enabled=0
+#sb16: enabled=0
+# no loader
+log: bochsout.txt
+logprefix: %t%e%d
+panic: action=ask
+error: action=report
+info: action=report
+debug: action=ignore
+#debug: action=report
+#pass: action=fatal
+keyboard: type=mf,serial_delay=250,paste_delay=10000
+user_shortcut: keys=none
+mouse: enabled=0, type=ps2
+
+#ne2k: ioaddr=0x300, irq=9, mac=fe:fd:00:00:00:01, ethmod=tuntap, ethdev=/dev/net/tun, script=./tunconfig
+