X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibreadline.so_src%2Fmain.c;h=5937c6bd3d25cb59edc3d827099f067684fea136;hb=f8cde3fab5eb27ebacf9d76a7ac478a68a36a38b;hp=58db03a54b208d782dbd5c041f9271f526442e00;hpb=04a050f42807686dc119838c82372409246d55bb;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libreadline.so_src/main.c b/Usermode/Libraries/libreadline.so_src/main.c index 58db03a5..5937c6bd 100644 --- a/Usermode/Libraries/libreadline.so_src/main.c +++ b/Usermode/Libraries/libreadline.so_src/main.c @@ -6,9 +6,11 @@ */ #include #include +#include #include #include #include +#include #define STDIN_FD 0 #define STDOUT_FD 1 @@ -104,15 +106,24 @@ char *Readline_NonBlock(tReadline *Info) } // Return NULL when command is still being edited + errno = EAGAIN; return NULL; } char *Readline(tReadline *Info) { char *ret; + + // stty -echo,canon + struct ptymode mode = {.InputMode = 0, .OutputMode = 0}; + _SysIOCtl(STDIN_FD, PTY_IOCTL_SETMODE, &mode); - while( NULL == (ret = Readline_NonBlock(Info)) ); - + while( NULL == (ret = Readline_NonBlock(Info)) && errno == EAGAIN ); + + // stty +echo,canon + mode.InputMode = PTYIMODE_CANON|PTYIMODE_ECHO; + _SysIOCtl(STDIN_FD, PTY_IOCTL_SETMODE, &mode); + return ret; } @@ -271,7 +282,7 @@ int Readline_int_ParseCharacter(tReadline *Info, char *Input) case '\b': if(Info->BufferWritePos <= 0) break; // Protect against underflows // Write the backsapce - _SysWrite(STDOUT_FD, &ch, 1); + _SysWrite(STDOUT_FD, "\b \b", 3); if(Info->BufferWritePos == Info->BufferUsed) // Simple case: End of string { Info->BufferUsed --;