diff options
Diffstat (limited to 'contrib/lukemftp/src/cmds.c')
-rw-r--r-- | contrib/lukemftp/src/cmds.c | 324 |
1 files changed, 173 insertions, 151 deletions
diff --git a/contrib/lukemftp/src/cmds.c b/contrib/lukemftp/src/cmds.c index fe469cc..087bc56 100644 --- a/contrib/lukemftp/src/cmds.c +++ b/contrib/lukemftp/src/cmds.c @@ -1,7 +1,7 @@ -/* $NetBSD: cmds.c,v 1.102 2003/08/07 11:13:52 agc Exp $ */ +/* $NetBSD: cmds.c,v 1.111 2005/02/11 06:21:22 simonb Exp $ */ /*- - * Copyright (c) 1996-2002 The NetBSD Foundation, Inc. + * Copyright (c) 1996-2005 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -103,7 +103,7 @@ #if 0 static char sccsid[] = "@(#)cmds.c 8.6 (Berkeley) 10/9/94"; #else -__RCSID("$NetBSD: cmds.c,v 1.102 2003/08/07 11:13:52 agc Exp $"); +__RCSID("$NetBSD: cmds.c,v 1.111 2005/02/11 06:21:22 simonb Exp $"); #endif #endif /* not lint */ @@ -147,10 +147,15 @@ struct types { }; sigjmp_buf jabort; -char *mname; +const char *mname; static int confirm(const char *, const char *); +static const char *doprocess(char *, size_t, const char *, int, int, int); +static const char *domap(char *, size_t, const char *); +static const char *docase(char *, size_t, const char *); +static const char *dotrans(char *, size_t, const char *); + static int confirm(const char *cmd, const char *file) { @@ -167,7 +172,7 @@ confirm(const char *cmd, const char *file) clearerr(stdin); return (0); } - switch (tolower(*line)) { + switch (tolower((unsigned char)*line)) { case 'a': confirmrest = 1; fprintf(ttyout, @@ -392,9 +397,11 @@ setstruct(int argc, char *argv[]) void put(int argc, char *argv[]) { + char buf[MAXPATHLEN]; char *cmd; int loc = 0; - char *locfile, *remfile; + char *locfile; + const char *remfile; if (argc == 2) { argc++; @@ -418,15 +425,26 @@ put(int argc, char *argv[]) if (loc) /* If argv[2] is a copy of the old argv[1], update it */ remfile = locfile; cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR"); - if (loc && ntflag) - remfile = dotrans(remfile); - if (loc && mapflag) - remfile = domap(remfile); + remfile = doprocess(buf, sizeof(buf), remfile, + 0, loc && ntflag, loc && mapflag); sendrequest(cmd, locfile, remfile, locfile != argv[1] || remfile != argv[2]); free(locfile); } +static const char * +doprocess(char *dst, size_t dlen, const char *src, + int casef, int transf, int mapf) +{ + if (casef) + src = docase(dst, dlen, src); + if (transf) + src = dotrans(dst, dlen, src); + if (mapf) + src = domap(dst, dlen, src); + return src; +} + /* * Send multiple files. */ @@ -436,7 +454,7 @@ mput(int argc, char *argv[]) int i; sigfunc oldintr; int ointer; - char *tp; + const char *tp; if (argc == 0 || (argc == 1 && !another(&argc, &argv, "local-files"))) { fprintf(ttyout, "usage: %s local-files\n", argv[0]); @@ -457,13 +475,9 @@ mput(int argc, char *argv[]) continue; } if (mflag && confirm(argv[0], cp)) { - tp = cp; - if (mcase) - tp = docase(tp); - if (ntflag) - tp = dotrans(tp); - if (mapflag) - tp = domap(tp); + char buf[MAXPATHLEN]; + tp = doprocess(buf, sizeof(buf), cp, + mcase, ntflag, mapflag); sendrequest((sunique) ? "STOU" : "STOR", cp, tp, cp != tp || !interactive); if (!mflag && fromatty) { @@ -485,8 +499,9 @@ mput(int argc, char *argv[]) if (!doglob) { if (mflag && confirm(argv[0], argv[i])) { - tp = (ntflag) ? dotrans(argv[i]) : argv[i]; - tp = (mapflag) ? domap(tp) : tp; + char buf[MAXPATHLEN]; + tp = doprocess(buf, sizeof(buf), argv[i], + 0, ntflag, mapflag); sendrequest((sunique) ? "STOU" : "STOR", argv[i], tp, tp != argv[i] || !interactive); if (!mflag && fromatty) { @@ -511,8 +526,10 @@ mput(int argc, char *argv[]) for (cpp = gl.gl_pathv; cpp && *cpp != NULL && connected; cpp++) { if (mflag && confirm(argv[0], *cpp)) { - tp = (ntflag) ? dotrans(*cpp) : *cpp; - tp = (mapflag) ? domap(tp) : tp; + char buf[MAXPATHLEN]; + tp = *cpp; + tp = doprocess(buf, sizeof(buf), *cpp, + 0, ntflag, mapflag); sendrequest((sunique) ? "STOU" : "STOR", *cpp, tp, *cpp != tp || !interactive); if (!mflag && fromatty) { @@ -555,7 +572,9 @@ int getit(int argc, char *argv[], int restartit, const char *mode) { int loc, rval; - char *remfile, *locfile, *olocfile; + char *remfile, *olocfile; + const char *locfile; + char buf[MAXPATHLEN]; loc = rval = 0; if (argc == 2) { @@ -577,13 +596,8 @@ getit(int argc, char *argv[], int restartit, const char *mode) code = -1; return (0); } - locfile = olocfile; - if (loc && mcase) - locfile = docase(locfile); - if (loc && ntflag) - locfile = dotrans(locfile); - if (loc && mapflag) - locfile = domap(locfile); + locfile = doprocess(buf, sizeof(buf), olocfile, + loc && mcase, loc && ntflag, loc && mapflag); if (restartit) { struct stat stbuf; int ret; @@ -663,7 +677,8 @@ mget(int argc, char *argv[]) { sigfunc oldintr; int ointer; - char *cp, *tp; + char *cp; + const char *tp; int restartit; if (argc == 0 || @@ -688,19 +703,21 @@ mget(int argc, char *argv[]) if (sigsetjmp(jabort, 1)) mabort(); while ((cp = remglob(argv, proxy, NULL)) != NULL) { + char buf[MAXPATHLEN]; if (*cp == '\0' || !connected) { mflag = 0; continue; } - if (! mflag || !confirm(argv[0], cp)) + if (! mflag) continue; - tp = cp; - if (mcase) - tp = docase(tp); - if (ntflag) - tp = dotrans(tp); - if (mapflag) - tp = domap(tp); + if (! fileindir(cp, localcwd)) { + fprintf(ttyout, "Skipping non-relative filename `%s'\n", + cp); + continue; + } + if (!confirm(argv[0], cp)) + continue; + tp = doprocess(buf, sizeof(buf), cp, mcase, ntflag, mapflag); if (restartit) { struct stat stbuf; @@ -774,13 +791,13 @@ onoff(int bool) void status(int argc, char *argv[]) { - int i; if (argc == 0) { fprintf(ttyout, "usage: %s\n", argv[0]); code = -1; return; } +#ifndef NO_STATUS if (connected) fprintf(ttyout, "Connected %sto %s.\n", connected == -1 ? "and logged in" : "", hostname); @@ -844,13 +861,16 @@ status(int argc, char *argv[]) onoff(editing) #endif /* !def NO_EDITCOMPLETE */ ); - fprintf(ttyout, "Version: %s %s\n", FTP_PRODUCT, FTP_VERSION); if (macnum > 0) { + int i; + fputs("Macros:\n", ttyout); for (i=0; i<macnum; i++) { fprintf(ttyout, "\t%s\n", macros[i].mac_name); } } +#endif /* !def NO_STATUS */ + fprintf(ttyout, "Version: %s %s\n", FTP_PRODUCT, FTP_VERSION); code = 0; } @@ -1131,7 +1151,7 @@ cd(int argc, char *argv[]) } if (r == COMPLETE) { dirchange = 1; - updateremotepwd(); + updateremotecwd(); } } @@ -1141,7 +1161,6 @@ cd(int argc, char *argv[]) void lcd(int argc, char *argv[]) { - char buf[MAXPATHLEN]; char *locdir; code = -1; @@ -1155,14 +1174,16 @@ lcd(int argc, char *argv[]) } if ((locdir = globulize(argv[1])) == NULL) return; - if (chdir(locdir) < 0) - warn("local: %s", locdir); + if (chdir(locdir) == -1) + warn("lcd %s", locdir); else { - if (getcwd(buf, sizeof(buf)) != NULL) { - fprintf(ttyout, "Local directory now %s\n", buf); + updatelocalcwd(); + if (localcwd[0]) { + fprintf(ttyout, "Local directory now: %s\n", localcwd); code = 0; - } else - warn("getcwd: %s", locdir); + } else { + fprintf(ttyout, "Unable to determine local directory\n"); + } } (void)free(locdir); } @@ -1174,7 +1195,6 @@ void delete(int argc, char *argv[]) { - if (argc == 0 || argc > 2 || (argc == 1 && !another(&argc, &argv, "remote-file"))) { fprintf(ttyout, "usage: %s remote-file\n", argv[0]); @@ -1323,6 +1343,7 @@ ls(int argc, char *argv[]) (void)strlcpy(locfile + 1, p, len - 1); freelocfile = 1; } else if ((strcmp(locfile, "-") != 0) && *locfile != '|') { + mname = argv[0]; if ((locfile = globulize(locfile)) == NULL || !confirm("output to local-file:", locfile)) { code = -1; @@ -1359,6 +1380,7 @@ mls(int argc, char *argv[]) } odest = dest = argv[argc - 1]; argv[argc - 1] = NULL; + mname = argv[0]; if (strcmp(dest, "-") && *dest != '|') if (((dest = globulize(dest)) == NULL) || !confirm("output to local-file:", dest)) { @@ -1366,7 +1388,6 @@ mls(int argc, char *argv[]) return; } dolist = strcmp(argv[0], "mls"); - mname = argv[0]; mflag = 1; oldintr = xsignal(SIGINT, mintr); if (sigsetjmp(jabort, 1)) @@ -1379,7 +1400,7 @@ mls(int argc, char *argv[]) ointer = interactive; interactive = 1; if (confirm("Continue with", argv[0])) { - mflag ++; + mflag++; } interactive = ointer; } @@ -1398,7 +1419,7 @@ void shell(int argc, char *argv[]) { pid_t pid; - sigfunc old1; + sigfunc oldintr; char shellnam[MAXPATHLEN], *shell, *namep; int wait_status; @@ -1407,7 +1428,7 @@ shell(int argc, char *argv[]) code = -1; return; } - old1 = xsignal(SIGINT, SIG_IGN); + oldintr = xsignal(SIGINT, SIG_IGN); if ((pid = fork()) == 0) { for (pid = 3; pid < 20; pid++) (void)close(pid); @@ -1438,7 +1459,7 @@ shell(int argc, char *argv[]) if (pid > 0) while (wait(&wait_status) != pid) ; - (void)xsignal(SIGINT, old1); + (void)xsignal(SIGINT, oldintr); if (pid == -1) { warn("Try again later"); code = -1; @@ -1509,19 +1530,20 @@ user(int argc, char *argv[]) void pwd(int argc, char *argv[]) { - int oldverbose = verbose; - if (argc == 0) { + code = -1; + if (argc != 1) { fprintf(ttyout, "usage: %s\n", argv[0]); - code = -1; return; } - verbose = 1; /* If we aren't verbose, this doesn't do anything! */ - if (command("PWD") == ERROR && code == 500) { - fputs("PWD command not recognized, trying XPWD.\n", ttyout); - (void)command("XPWD"); + if (! remotecwd[0]) + updateremotecwd(); + if (! remotecwd[0]) + fprintf(ttyout, "Unable to determine remote directory\n"); + else { + fprintf(ttyout, "Remote directory: %s\n", remotecwd); + code = 0; } - verbose = oldverbose; } /* @@ -1530,19 +1552,19 @@ pwd(int argc, char *argv[]) void lpwd(int argc, char *argv[]) { - char buf[MAXPATHLEN]; - if (argc == 0) { + code = -1; + if (argc != 1) { fprintf(ttyout, "usage: %s\n", argv[0]); - code = -1; return; } - if (getcwd(buf, sizeof(buf)) != NULL) { - fprintf(ttyout, "Local directory %s\n", buf); + if (! localcwd[0]) + updatelocalcwd(); + if (! localcwd[0]) + fprintf(ttyout, "Unable to determine local directory\n"); + else { + fprintf(ttyout, "Local directory: %s\n", localcwd); code = 0; - } else { - warn("getcwd"); - code = -1; } } @@ -1788,6 +1810,7 @@ void proxabort(int notused) { + sigint_raised = 1; alarmtimer(0); if (!proxy) { pswitch(1); @@ -1869,26 +1892,25 @@ setcase(int argc, char *argv[]) * convert the given name to lower case if it's all upper case, into * a static buffer which is returned to the caller */ -char * -docase(char *name) +static const char * +docase(char *dst, size_t dlen, const char *src) { - static char new[MAXPATHLEN]; - int i, dochange; + size_t i; + int dochange = 1; - dochange = 1; - for (i = 0; name[i] != '\0' && i < sizeof(new) - 1; i++) { - new[i] = name[i]; - if (islower((unsigned char)new[i])) + for (i = 0; src[i] != '\0' && i < dlen - 1; i++) { + dst[i] = src[i]; + if (islower((unsigned char)dst[i])) dochange = 0; } - new[i] = '\0'; + dst[i] = '\0'; if (dochange) { - for (i = 0; new[i] != '\0'; i++) - if (isupper((unsigned char)new[i])) - new[i] = tolower(new[i]); + for (i = 0; dst[i] != '\0'; i++) + if (isupper((unsigned char)dst[i])) + dst[i] = tolower((unsigned char)dst[i]); } - return (new); + return dst; } void @@ -1923,22 +1945,24 @@ setntrans(int argc, char *argv[]) (void)strlcpy(ntout, argv[2], sizeof(ntout)); } -char * -dotrans(char *name) +static const char * +dotrans(char *dst, size_t dlen, const char *src) { - static char new[MAXPATHLEN]; - char *cp1, *cp2 = new; - int i, ostop, found; + const char *cp1; + char *cp2 = dst; + size_t i, ostop; for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++) continue; - for (cp1 = name; *cp1; cp1++) { - found = 0; + for (cp1 = src; *cp1; cp1++) { + int found = 0; for (i = 0; *(ntin + i) && i < 16; i++) { if (*cp1 == *(ntin + i)) { found++; if (i < ostop) { *cp2++ = *(ntout + i); + if (cp2 - dst >= dlen - 1) + goto out; } break; } @@ -1947,8 +1971,9 @@ dotrans(char *name) *cp2++ = *cp1; } } +out: *cp2 = '\0'; - return (new); + return dst; } void @@ -1984,12 +2009,12 @@ setnmap(int argc, char *argv[]) (void)strlcpy(mapout, cp, MAXPATHLEN); } -char * -domap(char *name) +static const char * +domap(char *dst, size_t dlen, const char *src) { - static char new[MAXPATHLEN]; - char *cp1 = name, *cp2 = mapin; - char *tp[9], *te[9]; + const char *cp1 = src; + char *cp2 = mapin; + const char *tp[9], *te[9]; int i, toks[9], toknum = 0, match = 1; for (i=0; i < 9; ++i) { @@ -2032,130 +2057,127 @@ domap(char *name) { toks[toknum] = 0; } - cp1 = new; - *cp1 = '\0'; - cp2 = mapout; - while (*cp2) { + cp2 = dst; + *cp2 = '\0'; + cp1 = mapout; + while (*cp1) { match = 0; - switch (*cp2) { + switch (*cp1) { case '\\': - if (*(cp2 + 1)) { - *cp1++ = *++cp2; + if (*(cp1 + 1)) { + *cp2++ = *++cp1; } break; case '[': LOOP: - if (*++cp2 == '$' && - isdigit((unsigned char)*(cp2+1))) { - if (*++cp2 == '0') { - char *cp3 = name; + if (*++cp1 == '$' && + isdigit((unsigned char)*(cp1+1))) { + if (*++cp1 == '0') { + const char *cp3 = src; while (*cp3) { - *cp1++ = *cp3++; + *cp2++ = *cp3++; } match = 1; } - else if (toks[toknum = *cp2 - '1']) { - char *cp3 = tp[toknum]; + else if (toks[toknum = *cp1 - '1']) { + const char *cp3 = tp[toknum]; while (cp3 != te[toknum]) { - *cp1++ = *cp3++; + *cp2++ = *cp3++; } match = 1; } } else { - while (*cp2 && *cp2 != ',' && - *cp2 != ']') { - if (*cp2 == '\\') { - cp2++; + while (*cp1 && *cp1 != ',' && + *cp1 != ']') { + if (*cp1 == '\\') { + cp1++; } - else if (*cp2 == '$' && - isdigit((unsigned char)*(cp2+1))) { - if (*++cp2 == '0') { - char *cp3 = name; + else if (*cp1 == '$' && + isdigit((unsigned char)*(cp1+1))) { + if (*++cp1 == '0') { + const char *cp3 = src; while (*cp3) { - *cp1++ = *cp3++; + *cp2++ = *cp3++; } } else if (toks[toknum = - *cp2 - '1']) { - char *cp3=tp[toknum]; + *cp1 - '1']) { + const char *cp3=tp[toknum]; while (cp3 != te[toknum]) { - *cp1++ = *cp3++; + *cp2++ = *cp3++; } } } - else if (*cp2) { - *cp1++ = *cp2++; + else if (*cp1) { + *cp2++ = *cp1++; } } - if (!*cp2) { + if (!*cp1) { fputs( "nmap: unbalanced brackets.\n", ttyout); - return (name); + return (src); } match = 1; - cp2--; + cp1--; } if (match) { - while (*++cp2 && *cp2 != ']') { - if (*cp2 == '\\' && *(cp2 + 1)) { - cp2++; + while (*++cp1 && *cp1 != ']') { + if (*cp1 == '\\' && *(cp1 + 1)) { + cp1++; } } - if (!*cp2) { + if (!*cp1) { fputs( "nmap: unbalanced brackets.\n", ttyout); - return (name); + return (src); } break; } - switch (*++cp2) { + switch (*++cp1) { case ',': goto LOOP; case ']': break; default: - cp2--; + cp1--; goto LOOP; } break; case '$': - if (isdigit((unsigned char)*(cp2 + 1))) { - if (*++cp2 == '0') { - char *cp3 = name; + if (isdigit((unsigned char)*(cp1 + 1))) { + if (*++cp1 == '0') { + const char *cp3 = src; while (*cp3) { - *cp1++ = *cp3++; + *cp2++ = *cp3++; } } - else if (toks[toknum = *cp2 - '1']) { - char *cp3 = tp[toknum]; + else if (toks[toknum = *cp1 - '1']) { + const char *cp3 = tp[toknum]; while (cp3 != te[toknum]) { - *cp1++ = *cp3++; + *cp2++ = *cp3++; } } break; } /* intentional drop through */ default: - *cp1++ = *cp2; + *cp2++ = *cp1; break; } - cp2++; + cp1++; } - *cp1 = '\0'; - if (!*new) { - return (name); - } - return (new); + *cp2 = '\0'; + return *dst ? dst : src; } void @@ -2307,7 +2329,7 @@ cdup(int argc, char *argv[]) } if (r == COMPLETE) { dirchange = 1; - updateremotepwd(); + updateremotecwd(); } } |