📄 commands.c
字号:
} if (!connected && needconnect) { printf("?Need to be connected first.\r\n"); printf("'send ?' for help\r\n"); return 0; } /* Now, do we have enough room? */ if (NETROOM() < count) { printf("There is not enough room in the buffer TO the network\r\n"); printf("to process your request. Nothing will be done.\r\n"); printf("('send synch' will throw away most data in the network\r\n"); printf("buffer, if this might help.)\r\n"); return 0; } /* OK, they are all OK, now go through again and actually send */ count = 0; for (i = 1; i < argc; i++) { if ((s = GETSEND(argv[i])) == 0) { fprintf(stderr, "Telnet 'send' error - argument disappeared!\r\n"); (void) quit(); /*NOTREACHED*/ } if (s->handler) { count++;#if 0 /* XXX no command takes more than 1 arg */ success += (*s->handler)((s->narg > 0) ? argv[i+1] : 0, (s->narg > 1) ? argv[i+2] : 0);#else success += (*s->handler)((s->narg > 0) ? argv[i+1] : NULL);#endif i += s->narg; } else { NET2ADD(IAC, s->what); printoption("SENT", IAC, s->what); } } return (count == success);}typedef void (*tncmd_handler_t) P((int, int)); static intsend_tncmd(tncmd_handler_t func, const char *cmd, const char *name); static intsend_esc(const char *arg){ (void)arg; NETADD(escape); return 1;} static intsend_docmd(const char *name){ return(send_tncmd(send_do, "do", name));} static intsend_dontcmd(const char *name){ return(send_tncmd(send_dont, "dont", name));} static intsend_willcmd(const char *name){ return(send_tncmd(send_will, "will", name));} static intsend_wontcmd(const char *name){ return(send_tncmd(send_wont, "wont", name));}extern char *telopts[]; intsend_tncmd(tncmd_handler_t func, const char *cmd, const char *name){ char **cpp; int val = 0; if (isprefix(name, "help") || isprefix(name, "?")) { int col, len; printf("Usage: send %s <value|option>\r\n", cmd); printf("\"value\" must be from 0 to 255\r\n"); printf("Valid options are:\r\n\t"); col = 8; for (cpp = telopts; *cpp; cpp++) { len = strlen(*cpp) + 3; if (col + len > 65) { printf("\r\n\t"); col = 8; } printf(" \"%s\"", *cpp); col += len; } printf("\r\n"); return 0; } cpp = (char **)genget(name, telopts, sizeof(char *)); if (Ambiguous(cpp)) { fprintf(stderr,"'%s': ambiguous argument ('send %s ?' for help).\r\n", name, cmd); return 0; } if (cpp) { val = cpp - telopts; } else { const char *cp = name; while (*cp >= '0' && *cp <= '9') { val *= 10; val += *cp - '0'; cp++; } if (*cp != 0) { fprintf(stderr, "'%s': unknown argument ('send %s ?' for help).\r\n", name, cmd); return 0; } else if (val < 0 || val > 255) { fprintf(stderr, "'%s': bad value ('send %s ?' for help).\r\n", name, cmd); return 0; } } if (!connected) { printf("?Need to be connected first.\r\n"); return 0; } (*func)(val, 1); return 1;} static intsend_help(const char *arg){ struct sendlist *s; /* pointer to current command */ (void)arg; for (s = Sendlist; s->name; s++) { if (s->help) printf("%-15s %s\r\n", s->name, s->help); } return(0);}/* * The following are the routines and data structures referred * to by the arguments to the "toggle" command. */ static intlclchars(int arg){ (void)arg; donelclchars = 1; return 1;} static inttogdebug(int arg){ (void)arg;#ifndef NOT43 if (net > 0 && (SetSockOpt(net, SOL_SOCKET, SO_DEBUG, debug)) < 0) { perror("setsockopt (SO_DEBUG)"); }#else /* NOT43 */ if (debug) { if (net > 0 && SetSockOpt(net, SOL_SOCKET, SO_DEBUG, 0, 0) < 0) perror("setsockopt (SO_DEBUG)"); } else printf("Cannot turn off socket debugging\r\n");#endif /* NOT43 */ return 1;} static inttogcrlf(int arg){ (void)arg; if (crlf) { printf("Will send carriage returns as telnet <CR><LF>.\r\n"); } else { printf("Will send carriage returns as telnet <CR><NUL>.\r\n"); } return 1;}int binmode; static inttogbinary(int val){ donebinarytoggle = 1; if (val >= 0) { binmode = val; } else { if (my_want_state_is_will(TELOPT_BINARY) && my_want_state_is_do(TELOPT_BINARY)) { binmode = 1; } else if (my_want_state_is_wont(TELOPT_BINARY) && my_want_state_is_dont(TELOPT_BINARY)) { binmode = 0; } val = binmode ? 0 : 1; } if (val == 1) { if (my_want_state_is_will(TELOPT_BINARY) && my_want_state_is_do(TELOPT_BINARY)) { printf("Already operating in binary mode with remote host.\r\n"); } else { printf("Negotiating binary mode with remote host.\r\n"); tel_enter_binary(3); } } else { if (my_want_state_is_wont(TELOPT_BINARY) && my_want_state_is_dont(TELOPT_BINARY)) { printf("Already in network ascii mode with remote host.\r\n"); } else { printf("Negotiating network ascii mode with remote host.\r\n"); tel_leave_binary(3); } } return 1;} static inttogrbinary(int val){ donebinarytoggle = 1; if (val == -1) val = my_want_state_is_do(TELOPT_BINARY) ? 0 : 1; if (val == 1) { if (my_want_state_is_do(TELOPT_BINARY)) { printf("Already receiving in binary mode.\r\n"); } else { printf("Negotiating binary mode on input.\r\n"); tel_enter_binary(1); } } else { if (my_want_state_is_dont(TELOPT_BINARY)) { printf("Already receiving in network ascii mode.\r\n"); } else { printf("Negotiating network ascii mode on input.\r\n"); tel_leave_binary(1); } } return 1;} static inttogxbinary(int val){ donebinarytoggle = 1; if (val == -1) val = my_want_state_is_will(TELOPT_BINARY) ? 0 : 1; if (val == 1) { if (my_want_state_is_will(TELOPT_BINARY)) { printf("Already transmitting in binary mode.\r\n"); } else { printf("Negotiating binary mode on output.\r\n"); tel_enter_binary(2); } } else { if (my_want_state_is_wont(TELOPT_BINARY)) { printf("Already transmitting in network ascii mode.\r\n"); } else { printf("Negotiating network ascii mode on output.\r\n"); tel_leave_binary(2); } } return 1;}static int togglehelp P((int));#if defined(AUTHENTICATION)extern int auth_togdebug P((int));#endif#if defined(ENCRYPTION)extern int EncryptAutoEnc P((int));extern int EncryptAutoDec P((int));extern int EncryptDebug P((int));extern int EncryptVerbose P((int));#endiftypedef int (*toggle_handler_t) P((int));struct togglelist { const char *name; /* name of toggle */ const char *help; /* help message */ toggle_handler_t handler; /* routine to do actual setting */ int *variable; char *actionexplanation; int needconnect; /* Need to be connected */};static struct togglelist Togglelist[] = { { "autoflush", "flushing of output when sending interrupt characters", 0, &autoflush, "flush output when sending interrupt characters", 0 }, { "autosynch", "automatic sending of interrupt characters in urgent mode", 0,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -