📄 commands.c
字号:
return;
}
#ifdef notdef
printf("\tFlags are 0x%x: %s\n", res, decodeflags(res));
#endif
}
#endif /* defined(unix) && defined(TN3270) */
/*
* Print status about the connection.
*/
/*ARGSUSED*/
static
status(argc, argv)
int argc;
char *argv[];
{
if (connected) {
printf("Connected to %s.\n", hostname);
if ((argc < 2) || strcmp(argv[1], "notmuch")) {
int mode = getconnmode();
if (my_want_state_is_will(TELOPT_LINEMODE)) {
printf("Operating with LINEMODE option\n");
printf("%s line editing\n", (mode&MODE_EDIT) ? "Local" : "No");
printf("%s catching of signals\n",
(mode&MODE_TRAPSIG) ? "Local" : "No");
slcstate();
#ifdef KLUDGELINEMODE
} else if (kludgelinemode && my_want_state_is_dont(TELOPT_SGA)) {
printf("Operating in obsolete linemode\n");
#endif
} else {
printf("Operating in single character mode\n");
if (localchars)
printf("Catching signals locally\n");
}
printf("%s character echo\n", (mode&MODE_ECHO) ? "Local" : "Remote");
if (my_want_state_is_will(TELOPT_LFLOW))
printf("%s flow control\n", (mode&MODE_FLOW) ? "Local" : "No");
#ifdef ENCRYPTION
encrypt_display();
#endif /* ENCRYPTION */
}
} else {
printf("No connection.\n");
}
# if !defined(TN3270)
printf("Escape character is '%s'.\n", control(escape));
(void) fflush(stdout);
# else /* !defined(TN3270) */
if ((!In3270) && ((argc < 2) || strcmp(argv[1], "notmuch"))) {
printf("Escape character is '%s'.\n", control(escape));
}
# if defined(unix)
if ((argc >= 2) && !strcmp(argv[1], "everything")) {
printf("SIGIO received %d time%s.\n",
sigiocount, (sigiocount == 1)? "":"s");
if (In3270) {
printf("Process ID %d, process group %d.\n",
getpid(), getpgrp(getpid()));
printf("Terminal input:\n");
filestuff(tin);
printf("Terminal output:\n");
filestuff(tout);
printf("Network socket:\n");
filestuff(net);
}
}
if (In3270 && transcom) {
printf("Transparent mode command is '%s'.\n", transcom);
}
# endif /* defined(unix) */
(void) fflush(stdout);
if (In3270) {
return 0;
}
# endif /* defined(TN3270) */
return 1;
}
#ifdef SIGINFO
/*
* Function that gets called when SIGINFO is received.
*/
ayt_status()
{
(void) call(status, "status", "notmuch", 0);
}
#endif
unsigned long inet_addr();
int
tn(argc, argv)
int argc;
char *argv[];
{
register struct hostent *host = 0;
struct sockaddr_in sin;
struct servent *sp = 0;
unsigned long temp;
extern char *inet_ntoa();
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
char *srp = 0, *strrchr();
unsigned long sourceroute(), srlen;
#endif
char *cmd, *hostp = 0, *portp = 0, *user = 0;
/* clear the socket address prior to use */
memset((char *)&sin, 0, sizeof(sin));
if (connected) {
printf("?Already connected to %s\n", hostname);
setuid(getuid());
return 0;
}
if (argc < 2) {
(void) strcpy(line, "open ");
printf("(to) ");
(void) fgets(&line[strlen(line)], sizeof(line) - strlen(line), stdin);
makeargv();
argc = margc;
argv = margv;
}
cmd = *argv;
--argc; ++argv;
while (argc) {
if (strcmp(*argv, "help") == 0 || isprefix(*argv, "?"))
goto usage;
if (strcmp(*argv, "-l") == 0) {
--argc; ++argv;
if (argc == 0)
goto usage;
user = *argv++;
--argc;
continue;
}
if (strcmp(*argv, "-a") == 0) {
--argc; ++argv;
autologin = 1;
continue;
}
if (hostp == 0) {
hostp = *argv++;
--argc;
continue;
}
if (portp == 0) {
portp = *argv++;
--argc;
continue;
}
usage:
printf("usage: %s [-l user] [-a] host-name [port]\n", cmd);
setuid(getuid());
return 0;
}
if (hostp == 0)
goto usage;
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
if (hostp[0] == '@' || hostp[0] == '!') {
if ((hostname = strrchr(hostp, ':')) == NULL)
hostname = strrchr(hostp, '@');
hostname++;
srp = 0;
temp = sourceroute(hostp, &srp, &srlen);
if (temp == 0) {
herror(srp);
setuid(getuid());
return 0;
} else if (temp == -1) {
printf("Bad source route option: %s\n", hostp);
setuid(getuid());
return 0;
} else {
sin.sin_addr.s_addr = temp;
sin.sin_family = AF_INET;
}
} else {
#endif
temp = inet_addr(hostp);
if (temp != (unsigned long) -1) {
sin.sin_addr.s_addr = temp;
sin.sin_family = AF_INET;
(void) strcpy(_hostname, hostp);
hostname = _hostname;
} else {
host = gethostbyname(hostp);
if (host) {
sin.sin_family = host->h_addrtype;
#if defined(h_addr) /* In 4.3, this is a #define */
memmove((caddr_t)&sin.sin_addr,
host->h_addr_list[0], host->h_length);
#else /* defined(h_addr) */
memmove((caddr_t)&sin.sin_addr, host->h_addr, host->h_length);
#endif /* defined(h_addr) */
strncpy(_hostname, host->h_name, sizeof(_hostname));
_hostname[sizeof(_hostname)-1] = '\0';
hostname = _hostname;
} else {
herror(hostp);
setuid(getuid());
return 0;
}
}
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
}
#endif
if (portp) {
if (*portp == '-') {
portp++;
telnetport = 1;
} else
telnetport = 0;
sin.sin_port = atoi(portp);
if (sin.sin_port == 0) {
sp = getservbyname(portp, "tcp");
if (sp)
sin.sin_port = sp->s_port;
else {
printf("%s: bad port number\n", portp);
setuid(getuid());
return 0;
}
} else {
#if !defined(htons)
u_short htons P((unsigned short));
#endif /* !defined(htons) */
sin.sin_port = htons(sin.sin_port);
}
} else {
if (sp == 0) {
sp = getservbyname("telnet", "tcp");
if (sp == 0) {
fprintf(stderr, "telnet: tcp/telnet: unknown service\n");
setuid(getuid());
return 0;
}
sin.sin_port = sp->s_port;
}
telnetport = 1;
}
printf("Trying %s...\n", inet_ntoa(sin.sin_addr));
do {
net = socket(AF_INET, SOCK_STREAM, 0);
setuid(getuid());
if (net < 0) {
perror("telnet: socket");
return 0;
}
#if defined(IP_OPTIONS) && defined(IPPROTO_IP)
if (srp && setsockopt(net, IPPROTO_IP, IP_OPTIONS, (char *)srp, srlen) < 0)
perror("setsockopt (IP_OPTIONS)");
#endif
#if defined(IPPROTO_IP) && defined(IP_TOS)
{
# if defined(HAS_GETTOS)
struct tosent *tp;
if (tos < 0 && (tp = gettosbyname("telnet", "tcp")))
tos = tp->t_tos;
# endif
if (tos < 0)
tos = 020; /* Low Delay bit */
if (tos
&& (setsockopt(net, IPPROTO_IP, IP_TOS,
(char *)&tos, sizeof(int)) < 0)
&& (errno != ENOPROTOOPT))
perror("telnet: setsockopt (IP_TOS) (ignored)");
}
#endif /* defined(IPPROTO_IP) && defined(IP_TOS) */
if (debug && SetSockOpt(net, SOL_SOCKET, SO_DEBUG, 1) < 0) {
perror("setsockopt (SO_DEBUG)");
}
if (connect(net, (struct sockaddr *)&sin, sizeof (sin)) < 0) {
#if defined(h_addr) /* In 4.3, this is a #define */
if (host && host->h_addr_list[1]) {
int oerrno = errno;
fprintf(stderr, "telnet: connect to address %s: ",
inet_ntoa(sin.sin_addr));
errno = oerrno;
perror((char *)0);
host->h_addr_list++;
memmove((caddr_t)&sin.sin_addr,
host->h_addr_list[0], host->h_length);
(void) NetClose(net);
continue;
}
#endif /* defined(h_addr) */
perror("telnet: Unable to connect to remote host");
return 0;
}
connected++;
#if defined(AUTHENTICATION) || defined(ENCRYPTION)
auth_encrypt_connect(connected);
#endif /* defined(AUTHENTICATION) || defined(ENCRYPTION) */
} while (connected == 0);
cmdrc(hostp, hostname);
if (autologin && user == NULL) {
struct passwd *pw;
user = getenv("USER");
if (user == NULL ||
(pw = getpwnam(user)) && pw->pw_uid != getuid()) {
if (pw = getpwuid(getuid()))
user = pw->pw_name;
else
user = NULL;
}
}
if (user) {
env_define((unsigned char *)"USER", (unsigned char *)user);
env_export((unsigned char *)"USER");
}
(void) call(status, "status", "notmuch", 0);
if (setjmp(peerdied) == 0)
telnet(user);
(void) NetClose(net);
ExitString("Connection closed by foreign host.\n",1);
/*NOTREACHED*/
}
#define HELPINDENT (sizeof ("connect"))
static char
openhelp[] = "connect to a site",
closehelp[] = "close current connection",
logouthelp[] = "forcibly logout remote user and close the connection",
quithelp[] = "exit telnet",
statushelp[] = "print status information",
helphelp[] = "print help information",
sendhelp[] = "transmit special characters ('send ?' for more)",
sethelp[] = "set operating parameters ('set ?' for more)",
unsethelp[] = "unset operating parameters ('unset ?' for more)",
togglestring[] ="toggle operating parameters ('toggle ?' for more)",
slchelp[] = "change state of special charaters ('slc ?' for more)",
displayhelp[] = "display operating parameters",
#if defined(TN3270) && defined(unix)
transcomhelp[] = "specify Unix command for transparent mode pipe",
#endif /* defined(TN3270) && defined(unix) */
#if defined(AUTHENTICATION)
authhelp[] = "turn on (off) authentication ('auth ?' for more)",
#endif
#ifdef ENCRYPTION
encrypthelp[] = "turn on (off) encryption ('encrypt ?' for more)",
#endif /* ENCRYPTION */
#if defined(unix)
zhelp[] = "suspend telnet",
#endif /* defined(unix) */
shellhelp[] = "invoke a subshell",
envhelp[] = "change environment variables ('environ ?' for more)",
modestring[] = "try to enter line or character mode ('mode ?' for more)";
static int help();
static Command cmdtab[] = {
{ "close", closehelp, bye, 1 },
{ "logout", logouthelp, logout, 1 },
{ "display", displayhelp, display, 0 },
{ "mode", modestring, modecmd, 0 },
{ "open", openhelp, tn, 0 },
{ "quit", quithelp, quit, 0 },
{ "send", sendhelp, sendcmd, 0 },
{ "set", sethelp, setcmd, 0 },
{ "unset", unsethelp, unsetcmd, 0 },
{ "status", statushelp, status, 0 },
{ "toggle", togglestring, toggle, 0 },
{ "slc", slchelp, slccmd, 0 },
#if defined(TN3270) && defined(unix)
{ "transcom", transcomhelp, settranscom, 0 },
#endif /* defined(TN3270) && defined(unix) */
#if defined(AUTHENTICATION)
{ "auth", authhelp, auth_cmd, 0 },
#endif
#ifdef ENCRYPTION
{ "encrypt", encrypthelp, encrypt_cmd, 0 },
#endif /* ENCRYPTION */
#if defined(unix)
{ "z", zhelp, suspend, 0 },
#endif /* defined(unix) */
#if defined(TN3270)
{ "!", shellhelp, shell, 1 },
#else
{ "!", shellhelp, shell, 0 },
#endif
{ "environ", envhelp, env_cmd, 0 },
{ "?", helphelp, help, 0 },
0
};
static char crmodhelp[] = "deprecated command -- use 'toggle crmod' instead";
static char escapehelp[] = "deprecated command -- use 'set escape' instead";
static Command cmdtab2[] = {
{ "help", 0, help, 0 },
{ "escape", escapehelp, setescape, 0 },
{ "crmod", crmodhelp, togcrmod, 0 },
0
};
/*
* Call routine with argc, argv set from args (terminated by 0).
*/
/*VARARGS1*/
static
call(va_alist)
va_dcl
{
va_list ap;
typedef int (*intrtn_t)();
intrtn_t routine;
char *args[100];
int argno = 0;
va_start(ap);
routine = (va_arg(ap, intrtn_t));
while ((args[argno++] = va_arg(ap, char *)) != 0) {
;
}
va_end(ap);
return (*routine)(argno-1, args);
}
static Command *
getcmd(name)
char *name;
{
Command *cm;
if (cm = (Command *) genget(name, (char **) cmdtab, sizeof(Command)))
return cm;
return (Command *) genget(name, (char **) cmdtab2, sizeof(Command));
}
void
command(top, tbuf, cnt)
int top;
char *tbuf;
int cnt;
{
register Command *c;
setcommandmode();
if (!top) {
putchar('\n');
#if defined(unix)
} else {
(void) signal(SIGINT, SIG_DFL);
(void) signal(SIGQUIT, SIG_DFL);
#endif /* defined(unix) */
}
for (;;) {
if (rlogin == _POSIX_VDISABLE)
printf("%s> ", prompt);
if (tbuf) {
register char *cp;
cp = line;
while (cnt > 0 && (*cp++ = *tbuf++) != '\n')
cnt--;
tbuf = 0;
if (cp == line || *--cp != '\n' || cp == line)
goto getline;
*cp = '\0';
if (rlogin == _POSIX_VDISABLE)
printf("%s\n", line);
} else {
getline:
if (rlogin != _POSIX_VDISABLE)
printf("%s> ", prompt);
if (fgets(line, sizeof(line), stdin) == NULL) {
if (feof(stdin) || ferror(stdin)) {
(void) quit();
/*NOTREACHED*/
}
break;
}
}
if (line[0] == 0)
break;
makeargv();
if (margv[0] == 0) {
break;
}
c = getcmd(margv[0]);
if (Ambiguous(c)) {
printf("?Ambiguous command\n");
continue;
}
if (c == 0) {
printf("?Invalid command\n");
continue;
}
if (c->needconnect && !connected) {
printf("?Need to be connected first.\n");
continue;
}
if ((*c->handler)(margc, margv)) {
break;
}
}
if (!top) {
if (!connected) {
longjmp(toplevel, 1);
/*NOTREACHED*/
}
#if defined(TN3270)
if (shell_active == 0) {
setconnmode(0);
}
#else /* defined(TN3270) */
setconnmode(0);
#endif /* defined(TN3270) */
}
}
/*
* Help command.
*/
static
help(argc, argv)
int argc;
char *argv[];
{
register Command *c;
if (argc == 1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -