📄 main.c
字号:
sep = " | "; } printf(" ]\n"); return;}voidsetbinary(int argc, char *argv[]){ (void)argc; (void)argv; /* Quiet unused warning */ settftpmode(MODE_OCTET);}voidsetascii(int argc, char *argv[]){ (void)argc; (void)argv; /* Quiet unused warning */ settftpmode(MODE_NETASCII);}static voidsettftpmode(const struct modes *newmode){ mode = newmode; if (verbose) printf("mode set to %s\n", mode->m_mode);}/* * Send file(s). */voidput(int argc, char *argv[]){ int fd; int n; char *cp, *targ; if (argc < 2) { getmoreargs("send ", "(file) "); makeargv(); argc = margc; argv = margv; } if (argc < 2) { putusage(argv[0]); return; } targ = argv[argc - 1]; if (strchr(argv[argc - 1], ':')) { struct hostent *hp; for (n = 1; n < argc - 1; n++) if (strchr(argv[n], ':')) { putusage(argv[0]); return; } cp = argv[argc - 1]; targ = strchr(cp, ':'); *targ++ = 0; hp = gethostbyname(cp); if (hp == NULL) { fprintf(stderr, "tftp: %s: ", cp); herror((char *)NULL); return; } bcopy(hp->h_addr, &peeraddr.sin_addr, hp->h_length); peeraddr.sin_family = hp->h_addrtype; connected = 1; hostname = xstrdup(hp->h_name); } if (!connected) { printf("No target machine specified.\n"); return; } if (argc < 4) { cp = argc == 2 ? tail(targ) : argv[1]; fd = open(cp, O_RDONLY|mode->m_openflags); if (fd < 0) { fprintf(stderr, "tftp: "); perror(cp); return; } if (verbose) printf("putting %s to %s:%s [%s]\n", cp, hostname, targ, mode->m_mode); peeraddr.sin_port = port; tftp_sendfile(fd, targ, mode->m_mode); return; } /* this assumes the target is a directory */ /* on a remote unix system. hmmmm. */ cp = strchr(targ, '\0'); *cp++ = '/'; for (n = 1; n < argc - 1; n++) { strcpy(cp, tail(argv[n])); fd = open(argv[n], O_RDONLY|mode->m_openflags); if (fd < 0) { fprintf(stderr, "tftp: "); perror(argv[n]); continue; } if (verbose) printf("putting %s to %s:%s [%s]\n", argv[n], hostname, targ, mode->m_mode); peeraddr.sin_port = port; tftp_sendfile(fd, targ, mode->m_mode); }}static voidputusage(char *s){ printf("usage: %s file ... host:target, or\n", s); printf(" %s file ... target (when already connected)\n", s);}/* * Receive file(s). */voidget(int argc, char *argv[]){ int fd; int n; char *cp; char *src; if (argc < 2) { getmoreargs("get ", "(files) "); makeargv(); argc = margc; argv = margv; } if (argc < 2) { getusage(argv[0]); return; } if (!connected) { for (n = 1; n < argc ; n++) if (strchr(argv[n], ':') == 0) { getusage(argv[0]); return; } } for (n = 1; n < argc ; n++) { src = strchr(argv[n], ':'); if (src == NULL) src = argv[n]; else { struct hostent *hp; *src++ = 0; hp = gethostbyname(argv[n]); if (hp == NULL) { fprintf(stderr, "tftp: %s: ", argv[n]); herror((char *)NULL); continue; } bcopy(hp->h_addr, (caddr_t)&peeraddr.sin_addr, hp->h_length); peeraddr.sin_family = hp->h_addrtype; connected = 1; hostname = xstrdup(hp->h_name); } if (argc < 4) { cp = argc == 3 ? argv[2] : tail(src); fd = open(cp, O_WRONLY|O_CREAT|O_TRUNC|mode->m_openflags, 0666); if (fd < 0) { fprintf(stderr, "tftp: "); perror(cp); return; } if (verbose) printf("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode->m_mode); peeraddr.sin_port = port; tftp_recvfile(fd, src, mode->m_mode); break; } cp = tail(src); /* new .. jdg */ fd = open(cp, O_WRONLY|O_CREAT|O_TRUNC|mode->m_openflags, 0666); if (fd < 0) { fprintf(stderr, "tftp: "); perror(cp); continue; } if (verbose) printf("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode->m_mode); peeraddr.sin_port = port; tftp_recvfile(fd, src, mode->m_mode); }}static voidgetusage(char *s){ printf("usage: %s host:file host:file ... file, or\n", s); printf(" %s file file ... file if connected\n", s);}int rexmtval = TIMEOUT;voidsetrexmt(int argc, char *argv[]){ int t; if (argc < 2) { getmoreargs("rexmt-timeout ", "(value) "); makeargv(); argc = margc; argv = margv; } if (argc != 2) { printf("usage: %s value\n", argv[0]); return; } t = atoi(argv[1]); if (t < 0) printf("%s: bad value\n", argv[1]); else rexmtval = t;}int maxtimeout = 5 * TIMEOUT;voidsettimeout(int argc, char *argv[]){ int t; if (argc < 2) { getmoreargs("maximum-timeout ", "(value) "); makeargv(); argc = margc; argv = margv; } if (argc != 2) { printf("usage: %s value\n", argv[0]); return; } t = atoi(argv[1]); if (t < 0) printf("%s: bad value\n", argv[1]); else maxtimeout = t;}voidstatus(int argc, char *argv[]){ (void)argc; (void)argv; /* Quiet unused warning */ if (connected) printf("Connected to %s.\n", hostname); else printf("Not connected.\n"); printf("Mode: %s Verbose: %s Tracing: %s\n", mode->m_mode, verbose ? "on" : "off", trace ? "on" : "off"); printf("Rexmt-interval: %d seconds, Max-timeout: %d seconds\n", rexmtval, maxtimeout);}voidintr(int sig){ (void)sig; /* Quiet unused warning */ bsd_signal(SIGALRM, SIG_IGN); alarm(0); siglongjmp(toplevel, -1);}char *tail(char *filename){ char *s; while (*filename) { s = strrchr(filename, '/'); if (s == NULL) break; if (s[1]) return (s + 1); *s = '\0'; } return (filename);}/* * Command parser. */static voidcommand(void){ struct cmd *c; for (;;) {#ifdef WITH_READLINE if ( line ) free(line); line = readline(prompt); if ( !line ) exit(0); /* EOF */#else fputs(prompt, stdout); if (fgets(line, LBUFLEN, stdin) == 0) { if (feof(stdin)) { exit(0); } else { continue; } }#endif if ((line[0] == 0) || (line[0] == '\n')) continue;#ifdef WITH_READLINE#ifdef HAVE_READLINE_HISTORY_H add_history(line);#endif#endif makeargv(); if (margc == 0) continue; c = getcmd(margv[0]); if (c == (struct cmd *)-1) { printf("?Ambiguous command\n"); continue; } if (c == 0) { printf("?Invalid command\n"); continue; } (*c->handler)(margc, margv); }}struct cmd *getcmd(char *name){ const char *p; char *q; struct cmd *c, *found; int nmatches, longest; longest = 0; nmatches = 0; found = 0; for (c = cmdtab; (p = c->name) != NULL; c++) { for (q = name; *q == *p++; q++) if (*q == 0) /* exact match? */ return (c); if (!*q) { /* the name was a prefix */ if (q - name > longest) { longest = q - name; nmatches = 1; found = c; } else if (q - name == longest) nmatches++; } } if (nmatches > 1) return ((struct cmd *)-1); return (found);}/* * Slice a string up into argc/argv. */static voidmakeargv(void){ char *cp; char **argp = margv; margc = 0; for (cp = line; *cp;) { while (isspace(*cp)) cp++; if (*cp == '\0') break; *argp++ = cp; margc += 1; while (*cp != '\0' && !isspace(*cp)) cp++; if (*cp == '\0') break; *cp++ = '\0'; } *argp++ = 0;}voidquit(int argc, char *argv[]){ (void)argc; (void)argv; /* Quiet unused warning */ exit(0);}/* * Help command. */voidhelp(int argc, char *argv[]){ struct cmd *c; printf("%s\n", VERSION); if (argc == 1) { printf("Commands may be abbreviated. Commands are:\n\n"); for (c = cmdtab; c->name; c++) printf("%-*s\t%s\n", (int)HELPINDENT, c->name, c->help); return; } while (--argc > 0) { char *arg; arg = *++argv; c = getcmd(arg); if (c == (struct cmd *)-1) printf("?Ambiguous help command %s\n", arg); else if (c == (struct cmd *)0) printf("?Invalid help command %s\n", arg); else printf("%s\n", c->help); }}voidsettrace(int argc, char *argv[]){ (void)argc; (void)argv; /* Quiet unused warning */ trace = !trace; printf("Packet tracing %s.\n", trace ? "on" : "off");}voidsetverbose(int argc, char *argv[]){ (void)argc; (void)argv; /* Quiet unused warning */ verbose = !verbose; printf("Verbose mode %s.\n", verbose ? "on" : "off");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -