=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tftp/main.c,v retrieving revision 1.24 retrieving revision 1.25 diff -c -r1.24 -r1.25 *** src/usr.bin/tftp/main.c 2006/05/08 13:02:51 1.24 --- src/usr.bin/tftp/main.c 2006/07/12 16:58:51 1.25 *************** *** 1,4 **** ! /* $OpenBSD: main.c,v 1.24 2006/05/08 13:02:51 claudio Exp $ */ /* $NetBSD: main.c,v 1.6 1995/05/21 16:54:10 mycroft Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: main.c,v 1.25 2006/07/12 16:58:51 mglocker Exp $ */ /* $NetBSD: main.c,v 1.6 1995/05/21 16:54:10 mycroft Exp $ */ /* *************** *** 40,52 **** #if 0 static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93"; #endif ! static const char rcsid[] = "$OpenBSD: main.c,v 1.24 2006/05/08 13:02:51 claudio Exp $"; #endif /* not lint */ - /* Many bug fixes are from Jim Guyton */ - /* ! * TFTP User Program -- Command Interface. */ #include --- 40,53 ---- #if 0 static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93"; #endif ! static const char rcsid[] = ! "$OpenBSD: main.c,v 1.25 2006/07/12 16:58:51 mglocker Exp $"; #endif /* not lint */ /* ! * TFTP User Program -- Command Interface ! * ! * This version includes many modifications by Jim Guyton */ #include *************** *** 57,71 **** #include #include #include #include #include #include #include #include #include - #include - #include #include "extern.h" --- 58,72 ---- #include #include + #include #include #include + #include #include #include #include #include #include #include "extern.h" *************** *** 74,127 **** #define MAXARGV 20 #define HELPINDENT (sizeof("connect")) ! struct sockaddr_in peeraddr; ! int f; ! short port; ! int trace; ! int verbose; ! int connected; ! char mode[32]; ! char line[LBUFLEN]; ! int margc; ! char *margv[MAXARGV+1]; ! char *prompt = "tftp"; ! void intr(int); ! struct servent *sp; ! int rexmtval = TIMEOUT; ! int maxtimeout = 5 * TIMEOUT; ! char hostname[MAXHOSTNAMELEN]; ! FILE *file = NULL; ! volatile sig_atomic_t intrflag = 0; - void get(int, char **); - void help(int, char **); - void modecmd(int, char **); - void put(int, char **); - void quit(int, char **); - void setascii(int, char **); - void setbinary(int, char **); - void setpeer(int, char **); - void setrexmt(int, char **); - void settimeout(int, char **); - void settrace(int, char **); - void setverbose(int, char **); - void status(int, char **); - int readcmd(char *, int, FILE *); - - static __dead void command(void); - - static void getusage(char *); - static int makeargv(void); - static void putusage(char *); - static void settftpmode(char *); - - struct cmd { - char *name; - char *help; - void (*handler)(int, char **); - }; - char vhelp[] = "toggle verbose mode"; char thelp[] = "toggle packet tracing"; char chelp[] = "connect to remote tftp"; --- 75,121 ---- #define MAXARGV 20 #define HELPINDENT (sizeof("connect")) ! void get(int, char **); ! void help(int, char **); ! void modecmd(int, char **); ! void put(int, char **); ! void quit(int, char **); ! void setascii(int, char **); ! void setbinary(int, char **); ! void setpeer(int, char **); ! void setrexmt(int, char **); ! void settimeout(int, char **); ! void settrace(int, char **); ! void setverbose(int, char **); ! void status(int, char **); ! int readcmd(char *, int, FILE *); ! static void getusage(char *); ! static int makeargv(void); ! static void putusage(char *); ! static void settftpmode(char *); ! static __dead void command(void); ! struct cmd *getcmd(char *); ! char *tail(char *); ! struct sockaddr_in peeraddr; ! int f; ! short port; ! int trace; ! int verbose; ! int connected; ! char mode[32]; ! char line[LBUFLEN]; ! int margc; ! char *margv[MAXARGV+1]; ! char *prompt = "tftp"; ! void intr(int); ! struct servent *sp; ! int rexmtval = TIMEOUT; ! int maxtimeout = 5 * TIMEOUT; ! char hostname[MAXHOSTNAMELEN]; ! FILE *file = NULL; ! volatile sig_atomic_t intrflag = 0; char vhelp[] = "toggle verbose mode"; char thelp[] = "toggle packet tracing"; char chelp[] = "connect to remote tftp"; *************** *** 136,162 **** char ashelp[] = "set mode to netascii"; char bnhelp[] = "set mode to octet"; struct cmd cmdtab[] = { ! { "connect", chelp, setpeer }, ! { "mode", mhelp, modecmd }, ! { "put", shelp, put }, ! { "get", rhelp, get }, ! { "quit", qhelp, quit }, ! { "verbose", vhelp, setverbose }, ! { "trace", thelp, settrace }, ! { "status", sthelp, status }, ! { "binary", bnhelp, setbinary }, ! { "ascii", ashelp, setascii }, ! { "rexmt", xhelp, setrexmt }, ! { "timeout", ihelp, settimeout }, ! { "help", hhelp, help }, ! { "?", hhelp, help }, ! { NULL, NULL, NULL } }; struct modes { ! char *m_name; ! char *m_mode; } modes[] = { { "ascii", "netascii" }, { "netascii", "netascii" }, --- 130,162 ---- char ashelp[] = "set mode to netascii"; char bnhelp[] = "set mode to octet"; + struct cmd { + char *name; + char *help; + void (*handler)(int, char **); + }; + struct cmd cmdtab[] = { ! { "connect", chelp, setpeer }, ! { "mode", mhelp, modecmd }, ! { "put", shelp, put }, ! { "get", rhelp, get }, ! { "quit", qhelp, quit }, ! { "verbose", vhelp, setverbose }, ! { "trace", thelp, settrace }, ! { "status", sthelp, status }, ! { "binary", bnhelp, setbinary }, ! { "ascii", ashelp, setascii }, ! { "rexmt", xhelp, setrexmt }, ! { "timeout", ihelp, settimeout }, ! { "help", hhelp, help }, ! { "?", hhelp, help }, ! { NULL, NULL, NULL } }; struct modes { ! char *m_name; ! char *m_mode; } modes[] = { { "ascii", "netascii" }, { "netascii", "netascii" }, *************** *** 167,179 **** { NULL, NULL } }; - struct cmd *getcmd(char *); - char *tail(char *); - int main(int argc, char *argv[]) { ! struct sockaddr_in s_in; /* socket, bind */ sp = getservbyname("tftp", "udp"); --- 167,176 ---- { NULL, NULL } }; int main(int argc, char *argv[]) { ! struct sockaddr_in s_in; /* socket, bind */ sp = getservbyname("tftp", "udp"); *************** *** 206,217 **** void setpeer(int argc, char *argv[]) { ! struct hostent *host; if (argc < 2) { ! strlcpy(line, "Connect ", sizeof line); printf("(to) "); ! readcmd(&line[strlen(line)], LBUFLEN-strlen(line), stdin); if (makeargv()) return; argc = margc; --- 203,214 ---- void setpeer(int argc, char *argv[]) { ! struct hostent *host; if (argc < 2) { ! strlcpy(line, "Connect ", sizeof(line)); printf("(to) "); ! readcmd(&line[strlen(line)], LBUFLEN - strlen(line), stdin); if (makeargv()) return; argc = margc; *************** *** 223,230 **** } if (inet_aton(argv[1], &peeraddr.sin_addr) != 0) { peeraddr.sin_family = AF_INET; ! (void) strncpy(hostname, argv[1], sizeof hostname); ! hostname[sizeof(hostname)-1] = '\0'; } else { host = gethostbyname(argv[1]); if (host == 0) { --- 220,227 ---- } if (inet_aton(argv[1], &peeraddr.sin_addr) != 0) { peeraddr.sin_family = AF_INET; ! (void)strncpy(hostname, argv[1], sizeof(hostname)); ! hostname[sizeof(hostname) - 1] = '\0'; } else { host = gethostbyname(argv[1]); if (host == 0) { *************** *** 234,240 **** } peeraddr.sin_family = host->h_addrtype; bcopy(host->h_addr, &peeraddr.sin_addr, host->h_length); ! (void) strlcpy(hostname, host->h_name, sizeof hostname); } port = sp->s_port; if (argc == 3) { --- 231,237 ---- } peeraddr.sin_family = host->h_addrtype; bcopy(host->h_addr, &peeraddr.sin_addr, host->h_length); ! (void)strlcpy(hostname, host->h_name, sizeof(hostname)); } port = sp->s_port; if (argc == 3) { *************** *** 252,259 **** void modecmd(int argc, char *argv[]) { ! struct modes *p; ! char *sep; if (argc < 2) { printf("Using %s mode to transfer files.\n", mode); --- 249,256 ---- void modecmd(int argc, char *argv[]) { ! struct modes *p; ! char *sep; if (argc < 2) { printf("Using %s mode to transfer files.\n", mode); *************** *** 279,284 **** --- 276,282 ---- sep = " | "; } printf(" ]\n"); + return; } *************** *** 297,303 **** static void settftpmode(char *newmode) { ! strlcpy(mode, newmode, sizeof mode); if (verbose) printf("mode set to %s\n", mode); } --- 295,301 ---- static void settftpmode(char *newmode) { ! strlcpy(mode, newmode, sizeof(mode)); if (verbose) printf("mode set to %s\n", mode); } *************** *** 308,319 **** void put(int argc, char *argv[]) { ! int fd; ! int n; ! char *cp, *targ; if (argc < 2) { ! strlcpy(line, "send ", sizeof line); printf("(file) "); readcmd(&line[strlen(line)], LBUFLEN - strlen(line), stdin); if (makeargv()) --- 306,317 ---- void put(int argc, char *argv[]) { ! int fd; ! int n; ! char *cp, *targ; if (argc < 2) { ! strlcpy(line, "send ", sizeof(line)); printf("(file) "); readcmd(&line[strlen(line)], LBUFLEN - strlen(line), stdin); if (makeargv()) *************** *** 327,334 **** } targ = argv[argc - 1]; if (strchr(argv[argc - 1], ':')) { ! char *cp; ! struct hostent *hp; for (n = 1; n < argc - 1; n++) if (strchr(argv[n], ':')) { --- 325,332 ---- } targ = argv[argc - 1]; if (strchr(argv[argc - 1], ':')) { ! char *cp; ! struct hostent *hp; for (n = 1; n < argc - 1; n++) if (strchr(argv[n], ':')) { *************** *** 347,353 **** peeraddr.sin_family = hp->h_addrtype; connected = 1; port = sp->s_port; ! strlcpy(hostname, hp->h_name, sizeof hostname); } if (!connected) { printf("No target machine specified.\n"); --- 345,351 ---- peeraddr.sin_family = hp->h_addrtype; connected = 1; port = sp->s_port; ! strlcpy(hostname, hp->h_name, sizeof(hostname)); } if (!connected) { printf("No target machine specified.\n"); *************** *** 404,418 **** void get(int argc, char *argv[]) { ! int fd; ! int n; ! char *cp; ! char *src; if (argc < 2) { ! strlcpy(line, "get ", sizeof line); printf("(files) "); ! readcmd(&line[strlen(line)], LBUFLEN-strlen(line), stdin); if (makeargv()) return; argc = margc; --- 402,416 ---- void get(int argc, char *argv[]) { ! int fd; ! int n; ! char *cp; ! char *src; if (argc < 2) { ! strlcpy(line, "get ", sizeof(line)); printf("(files) "); ! readcmd(&line[strlen(line)], LBUFLEN - strlen(line), stdin); if (makeargv()) return; argc = margc; *************** *** 423,440 **** 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]); --- 421,438 ---- 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]); *************** *** 446,452 **** hp->h_length); peeraddr.sin_family = hp->h_addrtype; connected = 1; ! strlcpy(hostname, hp->h_name, sizeof hostname); } if (argc < 4) { cp = argc == 3 ? argv[2] : tail(src); --- 444,450 ---- hp->h_length); peeraddr.sin_family = hp->h_addrtype; connected = 1; ! strlcpy(hostname, hp->h_name, sizeof(hostname)); } if (argc < 4) { cp = argc == 3 ? argv[2] : tail(src); *************** *** 462,468 **** recvfile(fd, src, mode); break; } ! cp = tail(src); /* new .. jdg */ fd = creat(cp, 0644); if (fd < 0) { warn("create: %s", cp); --- 460,466 ---- recvfile(fd, src, mode); break; } ! cp = tail(src); /* new .. jdg */ fd = creat(cp, 0644); if (fd < 0) { warn("create: %s", cp); *************** *** 486,497 **** void setrexmt(int argc, char *argv[]) { ! int t; if (argc < 2) { ! strlcpy(line, "Rexmt-timeout ", sizeof line); printf("(value) "); ! readcmd(&line[strlen(line)], LBUFLEN-strlen(line), stdin); if (makeargv()) return; argc = margc; --- 484,495 ---- void setrexmt(int argc, char *argv[]) { ! int t; if (argc < 2) { ! strlcpy(line, "Rexmt-timeout ", sizeof(line)); printf("(value) "); ! readcmd(&line[strlen(line)], LBUFLEN - strlen(line), stdin); if (makeargv()) return; argc = margc; *************** *** 511,522 **** void settimeout(int argc, char *argv[]) { ! int t; if (argc < 2) { ! strlcpy(line, "Maximum-timeout ", sizeof line); printf("(value) "); ! readcmd(&line[strlen(line)], LBUFLEN-strlen(line), stdin); if (makeargv()) return; argc = margc; --- 509,520 ---- void settimeout(int argc, char *argv[]) { ! int t; if (argc < 2) { ! strlcpy(line, "Maximum-timeout ", sizeof(line)); printf("(value) "); ! readcmd(&line[strlen(line)], LBUFLEN - strlen(line), stdin); if (makeargv()) return; argc = margc; *************** *** 540,549 **** 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); } void --- 538,547 ---- 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); } void *************** *** 555,561 **** char * tail(char *filename) { ! char *s; while (*filename) { s = strrchr(filename, '/'); --- 553,559 ---- char * tail(char *filename) { ! char *s; while (*filename) { s = strrchr(filename, '/'); *************** *** 565,570 **** --- 563,569 ---- return (s + 1); *s = '\0'; } + return (filename); } *************** *** 574,580 **** static __dead void command(void) { ! struct cmd *c; for (;;) { printf("%s> ", prompt); --- 573,579 ---- static __dead void command(void) { ! struct cmd *c; for (;;) { printf("%s> ", prompt); *************** *** 587,593 **** if (margc == 0) continue; c = getcmd(margv[0]); ! if (c == (struct cmd *)-1) { printf("?Ambiguous command\n"); continue; } --- 586,592 ---- if (margc == 0) continue; c = getcmd(margv[0]); ! if (c == (struct cmd *) - 1) { printf("?Ambiguous command\n"); continue; } *************** *** 602,610 **** struct cmd * getcmd(char *name) { ! char *p, *q; ! struct cmd *c, *found; ! int nmatches, longest; longest = 0; nmatches = 0; --- 601,609 ---- struct cmd * getcmd(char *name) { ! char *p, *q; ! struct cmd *c, *found; ! int nmatches, longest; longest = 0; nmatches = 0; *************** *** 624,630 **** } } if (nmatches > 1) ! return ((struct cmd *)-1); return (found); } --- 623,630 ---- } } if (nmatches > 1) ! return ((struct cmd *) - 1); ! return (found); } *************** *** 634,642 **** static int makeargv(void) { ! char *cp; ! char **argp = margv; ! int ret = 0; margc = 0; for (cp = line; *cp;) { --- 634,642 ---- static int makeargv(void) { ! char *cp; ! char **argp = margv; ! int ret = 0; margc = 0; for (cp = line; *cp;) { *************** *** 658,663 **** --- 658,664 ---- *cp++ = '\0'; } *argp++ = 0; + return (ret); } *************** *** 673,679 **** void help(int argc, char *argv[]) { ! struct cmd *c; if (argc == 1) { printf("Commands may be abbreviated. Commands are:\n\n"); --- 674,680 ---- void help(int argc, char *argv[]) { ! struct cmd *c; if (argc == 1) { printf("Commands may be abbreviated. Commands are:\n\n"); *************** *** 685,691 **** 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); --- 686,692 ---- 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);