From: John Hodge (sonata) Date: Thu, 1 Aug 2013 04:07:43 +0000 (+0800) Subject: Merge branch 'master' of git://cadel.mutabah.net/acess2 X-Git-Tag: rel0.15~292^2 X-Git-Url: https://git.ucc.asn.au/?p=tpg%2Facess2.git;a=commitdiff_plain;h=e7a76b0d8a0cc6aa77966509780973a6f8216ef7;hp=79c17683913c5ebd7195714affa5567b69a66712 Merge branch 'master' of git://cadel.mutabah.net/acess2 Conflicts: Usermode/Applications/telnetd_src/main.c Usermode/Libraries/libc.so_src/perror.c --- diff --git a/.gitignore b/.gitignore index fb452775..50205787 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,8 @@ Map*.txt map.txt Doxylog*.txt LineCounts.*.txt -bochs*.txt +bochsout.txt +bochsdbg.txt serial.txt *.gz *.img diff --git a/KernelLand/Kernel/drv/vterm.h b/KernelLand/Kernel/drv/vterm.h index 39cc4386..5acb4640 100644 --- a/KernelLand/Kernel/drv/vterm.h +++ b/KernelLand/Kernel/drv/vterm.h @@ -62,6 +62,7 @@ struct sVTerm 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; diff --git a/KernelLand/Kernel/drv/vterm_vt100.c b/KernelLand/Kernel/drv/vterm_vt100.c index 1f344794..8ebd9bfd 100644 --- a/KernelLand/Kernel/drv/vterm_vt100.c +++ b/KernelLand/Kernel/drv/vterm_vt100.c @@ -228,7 +228,19 @@ void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int 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; diff --git a/RunBochs b/RunBochs new file mode 100755 index 00000000..13abab47 --- /dev/null +++ b/RunBochs @@ -0,0 +1,9 @@ +#!/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 + diff --git a/Usermode/Applications/irc_src/main.c b/Usermode/Applications/irc_src/main.c index b96fcc9e..8336879a 100644 --- a/Usermode/Applications/irc_src/main.c +++ b/Usermode/Applications/irc_src/main.c @@ -7,6 +7,7 @@ #include #include #include +#include // === TYPES === typedef struct sServer { @@ -64,7 +65,7 @@ void Redraw_Screen(void); int ProcessIncoming(tServer *Server); // --- Helpers - int SetCursorPos(int Row, int Col); +void SetCursorPos(int Row, int Col); int writef(int FD, const char *Format, ...); int OpenTCP(const char *AddressString, short PortNumber); char *GetValue(char *Str, int *Ofs); @@ -102,8 +103,16 @@ int main(int argc, const char *argv[], const char *envp[]) atexit(ExitHandler); - giTerminal_Width = _SysIOCtl(1, 5, NULL); // getset_width - giTerminal_Height = _SysIOCtl(1, 6, NULL); // getset_height + { + struct ptydims dims; + if( _SysIOCtl(1, PTY_IOCTL_GETDIMS, &dims) ) { + perror("Can't get terminal dimensions"); + return 1; + } + + giTerminal_Width = dims.W; + giTerminal_Height = dims.H; + } printf("\x1B[?1047h"); printf("\x1B[%i;%ir", 0, giTerminal_Height-1); @@ -125,6 +134,7 @@ int main(int argc, const char *argv[], const char *envp[]) SetCursorPos(giTerminal_Height-1, 0); printf("[(status)] "); + fflush(stdout); readline_info = Readline_Init(1); for( ;; ) @@ -146,7 +156,7 @@ int main(int argc, const char *argv[], const char *envp[]) maxFD = srv->FD; } - rv = select(maxFD+1, &readfds, 0, &errorfds, NULL); + rv = _SysSelect(maxFD+1, &readfds, 0, &errorfds, NULL, 0); if( rv == -1 ) break; if(FD_ISSET(0, &readfds)) @@ -167,6 +177,7 @@ int main(int argc, const char *argv[], const char *envp[]) printf("[%s:%s] ", gpCurrentWindow->Server->Name, gpCurrentWindow->Name); else printf("[(status)] "); + fflush(stdout); } } @@ -377,16 +388,15 @@ tMessage *Message_AppendF(tServer *Server, int Type, const char *Source, const c tMessage *Message_Append(tServer *Server, int Type, const char *Source, const char *Dest, const char *Message) { - tMessage *ret; tWindow *win = NULL; int msgLen = strlen(Message); - // NULL servers are internal messages + // Server==NULL indicates an internal message if( Server == NULL || Source[0] == '\0' ) { win = &gWindow_Status; } - // Determine if it's a channel or PM message + // Determine if it's a channel or PM else if( Dest[0] == '#' || Dest[0] == '&' ) // TODO: Better determining here { for(win = gpWindows; win; win = win->Next) @@ -438,7 +448,10 @@ tMessage *Message_Append(tServer *Server, int Type, const char *Source, const ch win = Window_Create(Server, Dest); } } - + + // Create message cache + _SysDebug("Win (%s) msg: <%s> %s", win->Name, Source, Message); + tMessage *ret; ret = malloc( sizeof(tMessage) + msgLen + 1 + strlen(Source) + 1 ); ret->Source = ret->Data + msgLen + 1; strcpy(ret->Source, Source); @@ -446,29 +459,28 @@ tMessage *Message_Append(tServer *Server, int Type, const char *Source, const ch ret->Type = Type; ret->Server = Server; - // TODO: Append to window message list + // Append to window message list ret->Next = win->Messages; win->Messages = ret; - //TODO: Set location - + // Print now if current window + if( win == gpCurrentWindow ) { - int pos = SetCursorPos(giTerminal_Height-2, 0); - if( win == gpCurrentWindow ) { - int prefixlen = strlen(Source) + 3; - int avail = giTerminal_Width - prefixlen; - int msglen = strlen(Message); - printf("\x1B[T"); // Scroll down 1 (free space below) - printf("[%s] %.*s\n", Source, avail, Message); - while( msglen > avail ) { - msglen -= avail; - Message += avail; - printf("\x1B[T"); - SetCursorPos(giTerminal_Height-2, prefixlen); - printf("%.*s\n", avail, Message); - } + printf("\x1b[s"); + SetCursorPos(giTerminal_Height-2, 0); + int prefixlen = strlen(Source) + 3; + int avail = giTerminal_Width - prefixlen; + int msglen = strlen(Message); + printf("\x1B[T"); // Scroll down 1 (free space below) + printf("[%s] %.*s\n", Source, avail, Message); + while( msglen > avail ) { + msglen -= avail; + Message += avail; + printf("\x1B[T"); + SetCursorPos(giTerminal_Height-2, prefixlen); + printf("%.*s\n", avail, Message); } - SetCursorPos(-1, pos); + printf("\x1b[u"); } return ret; @@ -551,7 +563,7 @@ void ParseServerLine(tServer *Server, char *Line) int pos = 0; char *ident, *cmd; - _SysDebug("[%s] %s", Server->Name, Line); +// _SysDebug("[%s] %s", Server->Name, Line); // Message? if( *Line == ':' ) @@ -825,16 +837,9 @@ char *GetValue(char *Src, int *Ofs) return ret; } -int SetCursorPos(int Row, int Col) +void SetCursorPos(int Row, int Col) { - int rv; - if( Row == -1 ) { - Row = Col / giTerminal_Width; - Col = Col % giTerminal_Width; - } - rv = _SysIOCtl(1, 9, NULL); // Ugh, constants printf("\x1B[%i;%iH", Col, Row); - return rv; } static inline int isdigit(int ch) diff --git a/Usermode/Applications/login_src/main.c b/Usermode/Applications/login_src/main.c index 4059953f..86b18842 100644 --- a/Usermode/Applications/login_src/main.c +++ b/Usermode/Applications/login_src/main.c @@ -29,9 +29,12 @@ int main(int argc, char *argv[]) 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"); @@ -65,6 +68,7 @@ int main(int argc, char *argv[]) // 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; @@ -117,7 +121,7 @@ char *_GetString(int bEcho) mode.InputMode |= PTYIMODE_ECHO; _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode); } - + return strdup(ret); } diff --git a/Usermode/Applications/telnetd_src/main.c b/Usermode/Applications/telnetd_src/main.c index 05268011..7fac367b 100644 --- a/Usermode/Applications/telnetd_src/main.c +++ b/Usermode/Applications/telnetd_src/main.c @@ -13,11 +13,23 @@ #include // === 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 === @@ -77,10 +89,10 @@ void EventLoop(void) 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! @@ -98,7 +110,7 @@ void EventLoop(void) // 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]); @@ -139,20 +151,97 @@ void Server_NewClient(int FD) // 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) @@ -160,7 +249,7 @@ 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); } diff --git a/Usermode/Libraries/ld-acess.so_src/include_exp/acess/devices/pty.h b/Usermode/Libraries/ld-acess.so_src/include_exp/acess/devices/pty.h index 9c243ce0..137b86fb 100644 --- a/Usermode/Libraries/ld-acess.so_src/include_exp/acess/devices/pty.h +++ b/Usermode/Libraries/ld-acess.so_src/include_exp/acess/devices/pty.h @@ -11,9 +11,12 @@ #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 diff --git a/Usermode/Libraries/libc.so_src/Makefile b/Usermode/Libraries/libc.so_src/Makefile index 7b345871..6dba912e 100644 --- a/Usermode/Libraries/libc.so_src/Makefile +++ b/Usermode/Libraries/libc.so_src/Makefile @@ -11,7 +11,7 @@ LDFLAGS += -Map map.txt INCFILES := stdio.h stdlib.h OBJ = stub.o heap.o stdlib.o env.o stdio.o string.o rand.o -OBJ += perror.o scanf.o signals.o strtoi.o strtof.o +OBJ += scanf.o signals.o strtoi.o strtof.o OBJ += printf.o time.o errno.o OBJ += arch/$(ARCHDIR).ao # signals.o diff --git a/Usermode/Libraries/libc.so_src/errno.c b/Usermode/Libraries/libc.so_src/errno.c index a2d78909..7e1905cd 100644 --- a/Usermode/Libraries/libc.so_src/errno.c +++ b/Usermode/Libraries/libc.so_src/errno.c @@ -6,6 +6,7 @@ * - errno and strerror */ #include "lib.h" +#include #include #include #include @@ -62,3 +63,16 @@ EXPORT int strerror_r(int errnum, char *buf, size_t bufsiz) 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); +} + diff --git a/Usermode/Libraries/libc.so_src/heap.c b/Usermode/Libraries/libc.so_src/heap.c index bdf64de3..1c0c7acf 100644 --- a/Usermode/Libraries/libc.so_src/heap.c +++ b/Usermode/Libraries/libc.so_src/heap.c @@ -94,13 +94,16 @@ EXPORT void *malloc(size_t bytes) //Corrupt Heap Heap_Dump(); _SysDebug("malloc: Corrupt Heap\n"); + exit(128); return NULL; } curBlock = (heap_head*)((uintptr_t)curBlock + curBlock->size); } if((uintptr_t)curBlock < (uintptr_t)_heap_start) { + Heap_Dump(); _SysDebug("malloc: Heap underrun for some reason\n"); + exit(128); return NULL; } diff --git a/Usermode/Libraries/libc.so_src/perror.c b/Usermode/Libraries/libc.so_src/perror.c deleted file mode 100644 index 53c01f89..00000000 --- a/Usermode/Libraries/libc.so_src/perror.c +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Acess2 C Library - * - By John Hodge (thePowersGang) - * - * perror.c - * - perror() and friends - */ -#include -#include -#include - -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)); -} diff --git a/Usermode/Libraries/libposix.so_src/termios.c b/Usermode/Libraries/libposix.so_src/termios.c index 57b1b421..32fa9e16 100644 --- a/Usermode/Libraries/libposix.so_src/termios.c +++ b/Usermode/Libraries/libposix.so_src/termios.c @@ -66,7 +66,7 @@ int tcsetattr(int fd, int optional_actions, const struct termios *termios_p) return -1; } - struct ptymode mode = {0}; + struct ptymode mode = {0,0}; if(termios_p->c_lflag & ICANON) mode.InputMode |= PTYIMODE_CANON; diff --git a/bochsrc.txt b/bochsrc.txt new file mode 100644 index 00000000..97447a15 --- /dev/null +++ b/bochsrc.txt @@ -0,0 +1,56 @@ +# 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 +