Merge branch 'master' of git://cadel.mutabah.net/acess2
authorJohn Hodge (sonata) <[email protected]>
Thu, 1 Aug 2013 04:07:43 +0000 (12:07 +0800)
committerJohn Hodge (sonata) <[email protected]>
Thu, 1 Aug 2013 04:07:43 +0000 (12:07 +0800)
Conflicts:
Usermode/Applications/telnetd_src/main.c
Usermode/Libraries/libc.so_src/perror.c

14 files changed:
.gitignore
KernelLand/Kernel/drv/vterm.h
KernelLand/Kernel/drv/vterm_vt100.c
RunBochs [new file with mode: 0755]
Usermode/Applications/irc_src/main.c
Usermode/Applications/login_src/main.c
Usermode/Applications/telnetd_src/main.c
Usermode/Libraries/ld-acess.so_src/include_exp/acess/devices/pty.h
Usermode/Libraries/libc.so_src/Makefile
Usermode/Libraries/libc.so_src/errno.c
Usermode/Libraries/libc.so_src/heap.c
Usermode/Libraries/libc.so_src/perror.c [deleted file]
Usermode/Libraries/libposix.so_src/termios.c
bochsrc.txt [new file with mode: 0644]

index fb45277..5020578 100644 (file)
@@ -19,7 +19,8 @@ Map*.txt
 map.txt
 Doxylog*.txt
 LineCounts.*.txt
-bochs*.txt
+bochsout.txt
+bochsdbg.txt
 serial.txt
 *.gz
 *.img
index 39cc438..5acb464 100644 (file)
@@ -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;
index 1f34479..8ebd9bf 100644 (file)
@@ -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 (executable)
index 0000000..13abab4
--- /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
+
index b96fcc9..8336879 100644 (file)
@@ -7,6 +7,7 @@
 #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
@@ -64,7 +65,7 @@ void  Redraw_Screen(void);
 \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
@@ -102,8 +103,16 @@ int main(int argc, const char *argv[], const char *envp[])
        \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
@@ -125,6 +134,7 @@ int main(int argc, const char *argv[], const char *envp[])
        \r
        SetCursorPos(giTerminal_Height-1, 0);\r
        printf("[(status)] ");\r
+       fflush(stdout);\r
        readline_info = Readline_Init(1);\r
        \r
        for( ;; )\r
@@ -146,7 +156,7 @@ int main(int argc, const char *argv[], const char *envp[])
                                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
@@ -167,6 +177,7 @@ int main(int argc, const char *argv[], const char *envp[])
                                        printf("[%s:%s] ", gpCurrentWindow->Server->Name, gpCurrentWindow->Name);\r
                                else\r
                                        printf("[(status)] ");\r
+                               fflush(stdout);\r
                        }\r
                }\r
                \r
@@ -377,16 +388,15 @@ tMessage *Message_AppendF(tServer *Server, int Type, const char *Source, const c
 \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
@@ -438,7 +448,10 @@ tMessage *Message_Append(tServer *Server, int Type, const char *Source, const ch
                        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
@@ -446,29 +459,28 @@ tMessage *Message_Append(tServer *Server, int Type, const char *Source, const ch
        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
@@ -551,7 +563,7 @@ void ParseServerLine(tServer *Server, char *Line)
         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
@@ -825,16 +837,9 @@ char *GetValue(char *Src, int *Ofs)
        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
index 4059953..86b1884 100644 (file)
@@ -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);
 }
 
index 0526801..7fac367 100644 (file)
 #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 ===
@@ -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);
 }
index 9c243ce..137b86f 100644 (file)
 
 #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
index 7b34587..6dba912 100644 (file)
@@ -11,7 +11,7 @@ LDFLAGS  += -Map map.txt
 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
index a2d7890..7e1905c 100644 (file)
@@ -6,6 +6,7 @@
  * - errno and strerror
  */
 #include "lib.h"
+#include <stdio.h>
 #include <errno.h>
 #include <acess/sys.h>
 #include <string.h>
@@ -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);
+}
+
index bdf64de..1c0c7ac 100644 (file)
@@ -94,13 +94,16 @@ EXPORT void *malloc(size_t bytes)
                        //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
diff --git a/Usermode/Libraries/libc.so_src/perror.c b/Usermode/Libraries/libc.so_src/perror.c
deleted file mode 100644 (file)
index 53c01f8..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * 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));
-}
index 57b1b42..32fa9e1 100644 (file)
@@ -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 (file)
index 0000000..97447a1
--- /dev/null
@@ -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
+

UCC git Repository :: git.ucc.asn.au