|
|
| version 1.2.2.15, 2010/06/08 08:43:47 | version 1.2.2.17, 2010/06/09 09:32:30 |
|---|---|
| Line 1190 cliReadLine(linebuffer_t * __restrict buffer) | Line 1190 cliReadLine(linebuffer_t * __restrict buffer) |
| memset(buf, 0, sizeof buf); | memset(buf, 0, sizeof buf); |
| readLen = read(buffer->line_in, buf, BUFSIZ); | readLen = read(buffer->line_in, buf, BUFSIZ); |
| printf("+++ %s %d\n", buf, readLen); | |
| if (readLen == -1) { | if (readLen == -1) { |
| LOGERR; | LOGERR; |
| return str; | return str; |
| Line 1238 recheck: | Line 1239 recheck: |
| * @buffer = CLI buffer | * @buffer = CLI buffer |
| * @csHistFile = History file name | * @csHistFile = History file name |
| * @sock = client socket | * @sock = client socket |
| * @term = stdin termios | |
| * @win = window size of tty | |
| * return: RETCODE_ERR error, RETCODE_OK ok | * return: RETCODE_ERR error, RETCODE_OK ok |
| */ | */ |
| int | int |
| cliNetLoop(linebuffer_t * __restrict buffer, const char *csHistFile, int sock, | cliNetLoop(linebuffer_t * __restrict buffer, const char *csHistFile, int sock) |
| struct termios *term, struct winsize *win) | |
| { | { |
| u_char buf[BUFSIZ]; | u_char buf[BUFSIZ]; |
| int pty, r, s, alen, attrlen, flg, ret = 0; | int pty, r, s, alen, flg, attrlen = 0, ret = 0; |
| fd_set fds; | fd_set fds; |
| struct timeval tv = { DEFAULT_SOCK_TIMEOUT, 0 }; | struct timeval tv = { DEFAULT_SOCK_TIMEOUT, 0 }; |
| struct telnetAttrs *a, Attr[10]; | struct telnetAttrs *a, Attr[10]; |
| switch (forkpty(&pty, NULL, term, win)) { | switch (forkpty(&pty, NULL, NULL, NULL)) { |
| case -1: | case -1: |
| LOGERR; | LOGERR; |
| return -1; | return -1; |
| Line 1265 cliNetLoop(linebuffer_t * __restrict buffer, const cha | Line 1263 cliNetLoop(linebuffer_t * __restrict buffer, const cha |
| cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); | cli_SetErr(EINVAL, "Error:: invalid input parameters ..."); |
| /* spawn Shell mode */ | /* spawn Shell mode */ |
| /* | //execl("/bin/tcsh", "tcsh", NULL); |
| execl("/bin/tcsh", "tcsh", NULL); | |
| */ | |
| _exit(ret); | _exit(ret); |
| default: | default: |
| /* spawn Shell mode */ | |
| telnet_SetCmd(Attr + 0, DO, TELOPT_TTYPE); | telnet_SetCmd(Attr + 0, DO, TELOPT_TTYPE); |
| telnet_SetCmd(Attr + 1, WILL, TELOPT_ECHO); | telnet_SetCmd(Attr + 1, WILL, TELOPT_ECHO); |
| telnet_Set_SubOpt(Attr + 2, TELOPT_LFLOW, LFLOW_OFF, NULL, 0); | telnet_Set_SubOpt(Attr + 2, TELOPT_LFLOW, LFLOW_OFF, NULL, 0); |
| Line 1298 cliNetLoop(linebuffer_t * __restrict buffer, const cha | Line 1293 cliNetLoop(linebuffer_t * __restrict buffer, const cha |
| r = FD_ISSET(sock, &fds) ? sock : pty; | r = FD_ISSET(sock, &fds) ? sock : pty; |
| s = FD_ISSET(sock, &fds) ? pty : sock; | s = FD_ISSET(sock, &fds) ? pty : sock; |
| if ((ret = telnetRecv(r, &a, &alen, buf, BUFSIZ)) < 0) { | if (FD_ISSET(sock, &fds)) { |
| memset(buf, 0, BUFSIZ); | |
| if ((ret = telnetRecv(sock, &a, &alen, buf, BUFSIZ)) < 0) { | |
| if (a) | |
| free(a); | |
| if (-2 == ret) | |
| continue; | |
| // EOF | |
| if (-3 == ret) | |
| shutdown(sock, SHUT_RD); | |
| else { | |
| cli_Errno = telnet_GetErrno(); | |
| strlcpy(cli_Error, telnet_GetError(), STRSIZ); | |
| } | |
| break; | |
| } | |
| attrlen = 0; | |
| if (1 == flg && alen) { | |
| telnet_SetCmd(&Attr[attrlen++], DONT, TELOPT_SGA); | |
| telnet_SetCmd(&Attr[attrlen++], DO, TELOPT_ECHO); | |
| } | |
| if (2 == flg && alen) { | |
| telnet_SetCmd(&Attr[attrlen++], WILL, TELOPT_ECHO); | |
| telnet_Set_SubOpt(&Attr[attrlen++], TELOPT_LFLOW, | |
| LFLOW_OFF, NULL, 0); | |
| telnet_Set_SubOpt(&Attr[attrlen++], TELOPT_LFLOW, | |
| LFLOW_RESTART_XON, NULL, 0); | |
| telnet_SetCmd(&Attr[attrlen++], DONT, TELOPT_LINEMODE); | |
| } | |
| if (a) | if (a) |
| free(a); | free(a); |
| if (-2 == ret) | if ((ret = write(pty, buf, ret)) == -1) { |
| continue; | LOGERR; |
| // EOF | break; |
| if (-3 == ret) | |
| shutdown(r, SHUT_RD); | |
| else { | |
| cli_Errno = telnet_GetErrno(); | |
| strlcpy(cli_Error, telnet_GetError(), STRSIZ); | |
| } | } |
| break; | |
| } | } |
| attrlen = 0; | |
| if (1 == flg && alen) { | |
| telnet_SetCmd(&Attr[attrlen++], DONT, TELOPT_SGA); | |
| telnet_SetCmd(&Attr[attrlen++], DO, TELOPT_ECHO); | |
| } | |
| if (2 == flg && alen) { | |
| telnet_SetCmd(&Attr[attrlen++], WILL, TELOPT_ECHO); | |
| telnet_Set_SubOpt(&Attr[attrlen++], TELOPT_LFLOW, | |
| LFLOW_OFF, NULL, 0); | |
| telnet_Set_SubOpt(&Attr[attrlen++], TELOPT_LFLOW, | |
| LFLOW_RESTART_XON, NULL, 0); | |
| telnet_SetCmd(&Attr[attrlen++], DONT, TELOPT_LINEMODE); | |
| } | |
| if (a) | |
| free(a); | |
| if ((ret = telnetSend(s, Attr, pty == s ? 0 : attrlen, buf, ret, 0)) == -1) { | if (FD_ISSET(pty, &fds)) { |
| cli_Errno = telnet_GetErrno(); | memset(buf, 0, BUFSIZ); |
| strlcpy(cli_Error, telnet_GetError(), STRSIZ); | if ((ret = read(pty, buf, BUFSIZ)) == -1) { |
| break; | LOGERR; |
| } else | break; |
| flg++; | } |
| if ((ret = telnetSend(sock, Attr, pty == s ? 0 : attrlen, buf, ret, 0)) == -1) { | |
| cli_Errno = telnet_GetErrno(); | |
| strlcpy(cli_Error, telnet_GetError(), STRSIZ); | |
| break; | |
| } else | |
| flg++; | |
| } | |
| } | } |
| close(pty); | close(pty); |