📄 cmds.c
字号:
mflag = 0; longjmp(jabort,0);}void mput(int argc, char **argv) { extern jmp_buf jabort; register int i; Sig_t oldintr; int ointer; char *tp; void mabort(); if (argc < 2 && !another(&argc, &argv, "local-files")) { printf("usage: %s local-files\n", argv[0]); code = -1; return; } mname = argv[0]; mflag = 1; oldintr = Signal(SIGINT, mabort); setjmp(jabort); if (proxy) { char *cp, *tp2, tmpbuf[MAXPATHLEN]; while ((cp = remglob(argv,0)) != NULL) { if (*cp == 0) { mflag = 0; continue; } if (mflag && confirm(argv[0], cp)) { tp = cp; if (mcase) { while (*tp && !islower((unsigned char)*tp)) { tp++; } if (!*tp) { tp = cp; tp2 = tmpbuf; while ((*tp2 = *tp)) { if (isupper((unsigned char)*tp2)) { *tp2 = 'a' + *tp2 - 'A'; } tp++; tp2++; } } tp = tmpbuf; } if (ntflag) { tp = dotrans(tp); } if (mapflag) { tp = domap(tp); } sendrequest((sunique) ? "STOU" : "STOR", cp, tp, cp != tp || !interactive); if (!mflag && fromatty) { ointer = interactive; interactive = 1; if (confirm("Continue with","mput")) { mflag++; } interactive = ointer; } } } Signal(SIGINT, oldintr); mflag = 0; return; } for (i = 1; i < argc; i++) { register char **cpp, **gargs; if (!doglob) { if (mflag && confirm(argv[0], argv[i])) { tp = (ntflag) ? dotrans(argv[i]) : argv[i]; tp = (mapflag) ? domap(tp) : tp; sendrequest((sunique) ? "STOU" : "STOR", argv[i], tp, tp != argv[i] || !interactive); if (!mflag && fromatty) { ointer = interactive; interactive = 1; if (confirm("Continue with","mput")) { mflag++; } interactive = ointer; } } continue; } gargs = ftpglob(argv[i]); if (globerr != NULL) { printf("%s\n", globerr); if (gargs) { blkfree(gargs); free((char *)gargs); } continue; } for (cpp = gargs; cpp && *cpp != NULL; cpp++) { if (mflag && confirm(argv[0], *cpp)) { tp = (ntflag) ? dotrans(*cpp) : *cpp; tp = (mapflag) ? domap(tp) : tp; sendrequest((sunique) ? "STOU" : "STOR", *cpp, tp, *cpp != tp || !interactive); if (!mflag && fromatty) { ointer = interactive; interactive = 1; if (confirm("Continue with","mput")) { mflag++; } interactive = ointer; } } } if (gargs != NULL) { blkfree(gargs); free((char *)gargs); } } Signal(SIGINT, oldintr); mflag = 0;}/* Receive one file. */int getit(int argc, char *argv[], int restartit, char *mode) { int loc = 0; char *oldargv1, *oldargv2; if (argc == 2) { argc++; argv[2] = argv[1]; loc++; } if (argc < 2 && !another(&argc, &argv, "remote-file")) goto usage; if (argc < 3 && !another(&argc, &argv, "local-file")) { usage: printf("usage: %s remote-file [ local-file ]\n", argv[0]); code = -1; return (0); } oldargv1 = argv[1]; oldargv2 = argv[2]; if (!globulize(&argv[2])) { code = -1; return (0); } if (loc && mcase) { char *tp = argv[1], *tp2, tmpbuf[MAXPATHLEN]; while (*tp && !islower((unsigned char)*tp)) tp++; if (!*tp) { tp = argv[2]; tp2 = tmpbuf; while ((*tp2 = *tp)) { if (isupper((unsigned char)*tp2)) *tp2 = tolower(*tp2); tp2++; tp++; } argv[2] = tmpbuf; } } if (loc && ntflag) argv[2] = dotrans(argv[2]); if (loc && mapflag) argv[2] = domap(argv[2]); if (restartit) { struct stat stbuf; int ret; ret = stat(argv[2], &stbuf); if (restartit == 1) { if (ret < 0) { fprintf(stderr, "local: %s: %s\n", argv[2], strerror(errno)); return (0); } restart_point = stbuf.st_size; } else { if (ret == 0) { int overbose; overbose = verbose; if (debug == 0) verbose = -1; if (command("MDTM %s\r\n", argv[1]) == COMPLETE) { int yy, mo, day, hour, min, sec; struct tm *tm; verbose = overbose; sscanf(reply_string, "%*s %04d%02d%02d%02d%02d%02d", &yy, &mo, &day, &hour, &min, &sec); tm = gmtime(&stbuf.st_mtime); tm->tm_mon++; if ((tm->tm_year + 1900) > yy) return (1); else if ((tm->tm_year + 1900) == yy) { if (tm->tm_mon > mo) return (1); } else if (tm->tm_mon == mo) { if (tm->tm_mday > day) return (1); } else if (tm->tm_mday == day) { if (tm->tm_hour > hour) return (1); } else if (tm->tm_hour == hour) { if (tm->tm_min > min) return (1); } else if (tm->tm_min == min) { if (tm->tm_sec > sec) return (1); } } else { printf("%s\n", reply_string); verbose = overbose; return (0); } } } } recvrequest("RETR", argv[2], argv[1], mode, argv[1] != oldargv1 || argv[2] != oldargv2); restart_point = 0; return (0);}void reget(int argc, char *argv[]) { getit(argc, argv, 1, "r+w");}void get(int argc, char *argv[]){ getit(argc, argv, 0, restart_point ? "r+w" : "w" );}/* Get multiple files. */void mget(int argc, char **argv) { extern jmp_buf jabort; Sig_t oldintr; int ointer; char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN]; void mabort(); if (argc < 2 && !another(&argc, &argv, "remote-files")) { printf("usage: %s remote-files\n", argv[0]); code = -1; return; } mname = argv[0]; mflag = 1; oldintr = Signal(SIGINT,mabort); setjmp(jabort); while ((cp = remglob(argv,proxy)) != NULL) { if (*cp == '\0') { mflag = 0; continue; } if (mflag && confirm(argv[0], cp)) { tp = cp; if (mcase) { while (*tp && !islower((unsigned char)*tp)) { tp++; } if (!*tp) { tp = cp; tp2 = tmpbuf; while ((*tp2 = *tp)) { if (isupper((unsigned char)*tp2)) *tp2 = tolower(*tp2); tp2++; tp++; } } tp = tmpbuf; } if (ntflag) { tp = dotrans(tp); } if (mapflag) { tp = domap(tp); } recvrequest("RETR", tp, cp, "w", tp != cp || !interactive); if (!mflag && fromatty) { ointer = interactive; interactive = 1; if (confirm("Continue with","mget")) { mflag++; } interactive = ointer; } } } Signal(SIGINT,oldintr); mflag = 0;}char *remglob(char *argv[], int doswitch) { char temp[16]; static char buf[MAXPATHLEN]; static FILE *ftemp = NULL; static char **args; int oldverbose, oldhash; char *cp, *mode; if (!mflag) { if (!doglob) { args = NULL; } else { if (ftemp) { fclose(ftemp); ftemp = NULL; } } return(NULL); } if (!doglob) { if (args == NULL) args = argv; if ((cp = *++args) == NULL) args = NULL; return (cp); } if (ftemp == NULL) { strcpy(temp, _PATH_TMP); mktemp(temp); oldverbose = verbose, verbose = 0; oldhash = hash, hash = 0; if (doswitch) { pswitch(!proxy); } for (mode = "w"; *++argv != NULL; mode = "a") recvrequest ("NLST", temp, *argv, mode, 0); if (doswitch) { pswitch(!proxy); } verbose = oldverbose; hash = oldhash; ftemp = fopen(temp, "r"); unlink(temp); if (ftemp == NULL) { printf("can't find list of remote files, oops\n"); return (NULL); } } if (fgets(buf, sizeof (buf), ftemp) == NULL) { fclose(ftemp), ftemp = NULL; return (NULL); } if ((cp = index(buf, '\n')) != NULL) *cp = '\0'; return (buf);}char *onoff(int bool) { return (bool ? "on" : "off");}/* Show status. *//* *//* ARGSUSED */void status(int argc, char *argv[]) { int i; if (connected) { printf("Connected to %s.\n", hostname); } else { printf("Not connected.\n"); } if (!proxy) { pswitch(1); if (connected) { printf("Connected for proxy commands to %s.\n", hostname); } else { printf("No proxy connection.\n"); } pswitch(0); } printf("Mode: %s; Type: %s; Form: %s; Structure: %s\n", modename, typename, formname, structname); printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n", onoff(verbose), onoff(bell), onoff(interactive), onoff(doglob)); printf("Store unique: %s; Receive unique: %s\n", onoff(sunique), onoff(runique)); printf("Case: %s; CR stripping: %s\n",onoff(mcase),onoff(crflag)); if (ntflag) { printf("Ntrans: (in) %s (out) %s\n", ntin,ntout); } else { printf("Ntrans: off\n"); } if (mapflag) { printf("Nmap: (in) %s (out) %s\n", mapin, mapout); } else { printf("Nmap: off\n"); } printf("Hash mark printing: %s; Use of PORT cmds: %s\n", onoff(hash), onoff(sendport)); if (macnum > 0) { printf("Macros:\n"); for (i=0; i<macnum; i++) { printf("\t%s\n",macros[i].mac_name); } } code = 0;}/* Set beep on cmd completed mode. *//* *//* VARARGS */void setbell() { bell = !bell; printf("Bell mode %s.\n", onoff(bell)); code = bell;}/* Turn on packet tracing. *//* *//* VARARGS */void settrace() { trace = !trace; printf("Packet tracing %s.\n", onoff(trace)); code = trace;}/* Toggle hash mark printing during transfers. *//* *//* VARARGS */void sethash() { hash = !hash; printf("Hash mark printing %s", onoff(hash)); code = hash; if (hash) printf(" (%d bytes/hash mark)", 1024); printf(".\n");}/* Turn on printing of server echo's. *//* *//* VARARGS */void setverbose() { verbose = !verbose; printf("Verbose mode %s.\n", onoff(verbose)); code = verbose;}/* Toggle PORT cmd use before each data connection. *//* *//* VARARGS */void setport() { sendport = !sendport; printf("Use of PORT cmds %s.\n", onoff(sendport)); code = sendport;}/* Turn on interactive prompting during mget, mput, and mdelete. *//* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -