diff options
author | Erik Troan <ewt@redhat.com> | 2002-01-10 17:07:15 +0000 |
---|---|---|
committer | Erik Troan <ewt@redhat.com> | 2002-01-10 17:07:15 +0000 |
commit | 7824129a5179c169b37a14e630467510bb6b3fb9 (patch) | |
tree | 99628bd0b9c2fe95dcdf23a95549a3429d265b21 /loader | |
parent | cbc663fa5aeea673e79616cbeda56547231bdba4 (diff) | |
download | anaconda-7824129a5179c169b37a14e630467510bb6b3fb9.tar.gz anaconda-7824129a5179c169b37a14e630467510bb6b3fb9.tar.xz anaconda-7824129a5179c169b37a14e630467510bb6b3fb9.zip |
1) added terminal size
2) removed debugging messages
Diffstat (limited to 'loader')
-rw-r--r-- | loader/telnet.c | 38 | ||||
-rw-r--r-- | loader/telnet.h | 3 |
2 files changed, 24 insertions, 17 deletions
diff --git a/loader/telnet.c b/loader/telnet.c index 5e8f5a25f..fda836639 100644 --- a/loader/telnet.c +++ b/loader/telnet.c @@ -38,6 +38,7 @@ #define ECHO "\x01" #define SUPPRESS_GO_AHEAD "\x03" #define TERMINAL_TYPE "\x18" +#define NAWS "\x1f" #define LINEMODE "\x22" #define NEWENVIRON "\x27" #define MODE "\x01" @@ -54,20 +55,26 @@ * too. */ void -telnet_negotiate(int socket, char ** term_type_ptr) { +telnet_negotiate(int socket, char ** term_type_ptr, int * heightPtr, + int * widthPtr) { char ch; int done = 0; char * termType = NULL; int termLength = 0, termAlloced = 0; - enum { ST_NONE, ST_TERMTYPE, ST_TERMSIZE } state; + enum { ST_NONE, ST_TERMTYPE, ST_WINDOWSIZE } state; + char sizeBuf[4]; + int height = -1, width = -1; + char * sizePtr = sizeBuf; char request[]= IAC DONT ECHO IAC WILL ECHO + IAC WILL NAWS IAC WILL SUPPRESS_GO_AHEAD IAC DO SUPPRESS_GO_AHEAD IAC DONT NEWENVIRON IAC WONT NEWENVIRON IAC WONT LINEMODE + IAC DO NAWS IAC SB TERMINAL_TYPE "\x01" IAC SE ; @@ -80,36 +87,29 @@ telnet_negotiate(int socket, char ** term_type_ptr) { do { read(socket, &ch, 1); if (ch != '\xff') { - printf("got 0x%x\n", ch); abort(); } - printf("got IAC\n"); - read(socket, &ch, 1); /* command */ - printf("command %d\n", (unsigned char) ch); - if (ch != '\xfa') { read(socket, &ch, 1); /* verb */ - printf("verb %d\n", (unsigned char) ch); continue; } read(socket, &ch, 1); /* suboption */ - printf("suboption %d\n", (unsigned char) ch); if (ch == '\x18') { state = ST_TERMTYPE; read(socket, &ch, 1); /* should be 0x0! */ done = 1; + } else if (ch == '\x1f') { + state = ST_WINDOWSIZE; } else { state = ST_NONE;; } read(socket, &ch, 1); /* data */ while (ch != '\xff') { - printf("got %d '%c'\n", (unsigned char) ch, ch); - if (state == ST_TERMTYPE) { if (termAlloced == termLength) { termAlloced += 10; @@ -117,21 +117,27 @@ telnet_negotiate(int socket, char ** term_type_ptr) { } termType[termLength++] = tolower(ch); + } else if (state == ST_WINDOWSIZE) { + if ((sizePtr - sizeBuf) < sizeof(sizeBuf)) + *sizePtr++ = ch; } read(socket, &ch, 1); /* data */ } read(socket, &ch, 1); /* should be a SE */ - printf("ended on %d\n", (unsigned char) ch); - printf("---\n"); + } while (!done); - termType[termLength] = '\0'; + termType[termLength] = '\0'; - } while (!done); + if (sizePtr - sizeBuf == sizeof(sizeBuf)) { + width = (sizeBuf[0] << 8) + sizeBuf[1]; + height = (sizeBuf[2] << 8) + sizeBuf[3]; + } - printf("term is %s\n", termType); + if (heightPtr) *heightPtr = height; + if (widthPtr) *widthPtr = width; if (term_type_ptr) *term_type_ptr = termType; } diff --git a/loader/telnet.h b/loader/telnet.h index d1a7f990a..58ea5ba0a 100644 --- a/loader/telnet.h +++ b/loader/telnet.h @@ -30,7 +30,8 @@ typedef enum { } telnet_state; void -telnet_negotiate(int socket, char ** term_type_ptr); +telnet_negotiate(int socket, char ** term_type_ptr, int * heightPtr, + int * widthPtr); int telnet_process_input(telnet_state * ts, char *data, int len); void |