📄 main.c
字号:
{ putusage (argv[0]); return; } targ = argv[argc - 1]; if (strchr (argv[argc - 1], ':')) { char *cp; for (n = 1; n < argc - 1; n++) if (strchr (argv[n], ':')) { putusage (argv[0]); return; } cp = argv[argc - 1]; targ = strchr (cp, ':'); *targ++ = 0; if (resolve_name (cp, 0) != RESOLVE_OK) return; } if (!connected) { printf ("No target machine specified.\n"); return; } if (argc < 4) { cp = argc == 2 ? tail (targ) : argv[1]; fd = open (cp, O_RDONLY); if (fd < 0) { fprintf (stderr, "tftp: "); perror (cp); return; } if (verbose) printf ("putting %s to %s:%s [%s]\n", cp, hostname, targ, mode); peeraddr.sin_port = port ? port : sp->s_port; send_file (fd, targ, 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); 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); peeraddr.sin_port = port ? port : sp->s_port; send_file (fd, targ, 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; register int n; register char *cp; char *src; if (argc < 2) get_args ("get", "(files) ", &argc, &argv); 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 { *src++ = 0; if (resolve_name (argv[n], 0) != RESOLVE_OK) continue; } if (argc < 4) { cp = argc == 3 ? argv[2] : tail (src); fd = creat (cp, 0644); if (fd < 0) { fprintf (stderr, "tftp: "); perror (cp); return; } if (verbose) printf ("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode); peeraddr.sin_port = port ? port : sp->s_port; recvfile (fd, src, mode); break; } cp = tail (src); /* new .. jdg */ fd = creat (cp, 0644); if (fd < 0) { fprintf (stderr, "tftp: "); perror (cp); continue; } if (verbose) printf ("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode); peeraddr.sin_port = port ? port : sp->s_port; recvfile (fd, src, 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) get_args ("Rexmt-timeout", "(value) ", &argc, &argv); 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) get_args ("Maximum-timeout", "(value) ", &argc, &argv); 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[]){ if (connected) printf ("Connected to %s.\n", hostname); else printf ("Not connected.\n"); printf ("Mode: %s Verbose: %s Tracing: %s\n", mode, verbose ? "on" : "off", trace ? "on" : "off"); printf ("Rexmt-interval: %d seconds, Max-timeout: %d seconds\n", rexmtval, maxtimeout);}voidintr (){ signal (SIGALRM, SIG_IGN); alarm (0); longjmp (toplevel, -1);}char *tail (char *filename){ register 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 (){ register struct cmd *c; for (;;) { printf ("%s> ", prompt); if (fgets (line, sizeof line, stdin) == 0) { if (feof (stdin)) exit (0); else continue; } if (line[0] == 0) continue; 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 (register char *name){ register char *p, *q; register struct cmd *c, *found; register 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 (){ register char *cp; register 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[]){ exit (0);}/* * Help command. */voidhelp (int argc, char *argv[]){ register struct cmd *c; 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) { register 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){ trace = !trace; printf ("Packet tracing %s.\n", trace ? "on" : "off");}voidsetverbose (int argc, char **argv){ verbose = !verbose; printf ("Verbose mode %s.\n", verbose ? "on" : "off");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -