📄 cmds.c
字号:
* Send the result as a one-line command and get response. */static voidquote1(const char *initial, int argc, char **argv){ register int i, len; char buf[BUFSIZ]; /* must be >= sizeof(line) */ (void) strcpy(buf, initial); if (argc > 1) { len = strlen(buf); len += strlen(strcpy(&buf[len], argv[1])); for (i = 2; i < argc; i++) { buf[len++] = ' '; len += strlen(strcpy(&buf[len], argv[i])); } } if (command(buf) == PRELIM) { while (getreply(0) == PRELIM); }}voiddo_chmod(int argc, char *argv[]){ if (argc < 2 && !another(&argc, &argv, "mode")) goto usage; if (argc < 3 && !another(&argc, &argv, "file-name")) {usage: printf("usage: %s mode file-name\n", argv[0]); code = -1; return; } (void) command("SITE CHMOD %s %s", argv[1], argv[2]);}voiddo_umask(argc, argv) int argc; char *argv[];{ int oldverbose = verbose; verbose = 1; (void) command(argc == 1 ? "SITE UMASK" : "SITE UMASK %s", argv[1]); verbose = oldverbose;}voididle_cmd(argc, argv) int argc; char *argv[];{ int oldverbose = verbose; verbose = 1; (void) command(argc == 1 ? "SITE IDLE" : "SITE IDLE %s", argv[1]); verbose = oldverbose;}/* * Ask the other side for help. */voidrmthelp(argc, argv) int argc; char *argv[];{ int oldverbose = verbose; verbose = 1; (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]); verbose = oldverbose;}/* * Terminate session and exit. */voidquit(void){ if (connected) disconnect(); pswitch(1); if (connected) { disconnect(); } exit(0);}/* * Terminate session, but don't exit. */voiddisconnect(void){ if (!connected) return; (void) command("QUIT"); if (cout) { (void) fclose(cout); } cout = NULL; connected = 0; data = -1; if (!proxy) { macnum = 0; }}static intconfirm(const char *cmd, const char *file){ char lyne[BUFSIZ]; if (!interactive) return (1);#ifdef __USE_READLINE__ if (fromatty) { char *lineread; snprintf(lyne, BUFSIZ, "%s %s? ", cmd, file); lineread = readline(lyne); if (!lineread) return 0; strcpy(lyne, lineread); free(lineread); } else {#endif printf("%s %s? ", cmd, file); fflush(stdout); if (fgets(lyne, sizeof(lyne), stdin) == NULL) { return 0; }#ifdef __USE_READLINE__ }#endif return (*lyne != 'n' && *lyne != 'N');}voidfatal(const char *msg){ fprintf(stderr, "ftp: %s\n", msg); exit(1);}/* * Glob a local file name specification with * the expectation of a single return value. * Can't control multiple values being expanded * from the expression, we return only the first. */static char *globulize(char *cpp){ char **globbed; char *rv = cpp; if (!doglob) return cpp; globbed = ftpglob(cpp); if (globerr != NULL) { printf("%s: %s\n", cpp, globerr); if (globbed) { blkfree(globbed); free(globbed); } return NULL; } if (globbed) { rv = globbed[0]; /* don't waste too much memory */ if (globbed[0]) { blkfree(globbed+1); } free(globbed); } return rv;}voidaccount(int argc, char *argv[]){ char buf[128], *ap; if (argc > 1) { *buf = 0; while (argc > 1) { --argc; ++argv; strncat(buf, *argv, sizeof(buf)-strlen(buf)); buf[sizeof(buf)-1] = 0; } ap = buf; } else { ap = getpass("Account:"); } command("ACCT %s", ap);}static voidproxabort(int ignore){ (void)ignore; if (!proxy) { pswitch(1); } if (connected) { proxflag = 1; } else { proxflag = 0; } pswitch(0); siglongjmp(abortprox,1);}voiddoproxy(int argc, char *argv[]){ register struct cmd *c; void (*oldintr)(int); if (argc < 2 && !another(&argc, &argv, "command")) { printf("usage: %s command\n", argv[0]); code = -1; return; } c = getcmd(argv[1]); if (c == (struct cmd *) -1) { printf("?Ambiguous command\n"); (void) fflush(stdout); code = -1; return; } if (c == 0) { printf("?Invalid command\n"); (void) fflush(stdout); code = -1; return; } if (!c->c_proxy) { printf("?Invalid proxy command\n"); (void) fflush(stdout); code = -1; return; } if (sigsetjmp(abortprox, 1)) { code = -1; return; } oldintr = signal(SIGINT, proxabort); pswitch(1); if (c->c_conn && !connected) { printf("Not connected\n"); (void) fflush(stdout); pswitch(0); (void) signal(SIGINT, oldintr); code = -1; return; } if (c->c_handler_v) c->c_handler_v(argc-1, argv+1); else if (c->c_handler_0) c->c_handler_0(); else c->c_handler_1(NULL); /* should not reach this */ if (connected) { proxflag = 1; } else { proxflag = 0; } pswitch(0); (void) signal(SIGINT, oldintr);}voidsetcase(void){ mcase = !mcase; printf("Case mapping %s.\n", onoff(mcase)); code = mcase;}voidsetcr(void){ crflag = !crflag; printf("Carriage Return stripping %s.\n", onoff(crflag)); code = crflag;}voidsetntrans(argc,argv) int argc; char *argv[];{ if (argc == 1) { ntflag = 0; printf("Ntrans off.\n"); code = ntflag; return; } ntflag++; code = ntflag; (void) strncpy(ntin, argv[1], 16); ntin[16] = '\0'; if (argc == 2) { ntout[0] = '\0'; return; } (void) strncpy(ntout, argv[2], 16); ntout[16] = '\0';}static char *dotrans(char *name){ static char new[MAXPATHLEN]; char *cp1, *cp2 = new; register int i, ostop, found; for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++); for (cp1 = name; *cp1; cp1++) { found = 0; for (i = 0; *(ntin + i) && i < 16; i++) { if (*cp1 == *(ntin + i)) { found++; if (i < ostop) { *cp2++ = *(ntout + i); } break; } } if (!found) { *cp2++ = *cp1; } } *cp2 = '\0'; return(new);}voidsetnmap(argc, argv) int argc; char *argv[];{ char *cp; if (argc == 1) { mapflag = 0; printf("Nmap off.\n"); code = mapflag; return; } if (argc < 3 && !another(&argc, &argv, "mapout")) { printf("Usage: %s [mapin mapout]\n",argv[0]); code = -1; return; } mapflag = 1; code = 1; cp = index(altarg, ' '); if (proxy) { while(*++cp == ' '); altarg = cp; cp = index(altarg, ' '); } *cp = '\0'; (void) strncpy(mapin, altarg, MAXPATHLEN - 1); while (*++cp == ' '); (void) strncpy(mapout, cp, MAXPATHLEN - 1);}staticchar *domap(char *name){ static char new[MAXPATHLEN]; register char *cp1 = name, *cp2 = mapin; char *tp[9], *te[9]; int i, toks[9], toknum = 0, match = 1; for (i=0; i < 9; ++i) { toks[i] = 0; } while (match && *cp1 && *cp2) { switch (*cp2) { case '\\': if (*++cp2 != *cp1) { match = 0; } break; case '$': if (*(cp2+1) >= '1' && (*cp2+1) <= '9') { if (*cp1 != *(++cp2+1)) { toks[toknum = *cp2 - '1']++; tp[toknum] = cp1; while (*++cp1 && *(cp2+1) != *cp1); te[toknum] = cp1; } cp2++; break; } /* FALLTHROUGH */ default: if (*cp2 != *cp1) { match = 0; } break; } if (match && *cp1) { cp1++; } if (match && *cp2) { cp2++; } } if (!match && *cp1) /* last token mismatch */ { toks[toknum] = 0; } cp1 = new; *cp1 = '\0'; cp2 = mapout; while (*cp2) { match = 0; switch (*cp2) { case '\\': if (*(cp2 + 1)) { *cp1++ = *++cp2; } break; case '[':LOOP: if (*++cp2 == '$' && isdigit(*(cp2+1))) { if (*++cp2 == '0') { char *cp3 = name; while (*cp3) { *cp1++ = *cp3++; } match = 1; } else if (toks[toknum = *cp2 - '1']) { char *cp3 = tp[toknum]; while (cp3 != te[toknum]) { *cp1++ = *cp3++; } match = 1; } } else { while (*cp2 && *cp2 != ',' && *cp2 != ']') { if (*cp2 == '\\') { cp2++; } else if (*cp2 == '$' && isdigit(*(cp2+1))) { if (*++cp2 == '0') { char *cp3 = name; while (*cp3) { *cp1++ = *cp3++; } } else if (toks[toknum = *cp2 - '1']) { char *cp3=tp[toknum]; while (cp3 != te[toknum]) { *cp1++ = *cp3++; } } } else if (*cp2) { *cp1++ = *cp2++; } } if (!*cp2) { printf("nmap: unbalanced brackets\n"); return(name); } match = 1; cp2--; } if (match) { while (*++cp2 && *cp2 != ']') { if (*cp2 == '\\' && *(cp2 + 1)) { cp2++; } } if (!*cp2) { printf("nmap: unbalanced brackets\n"); return(name); } break; } switch (*++cp2) { case ',': goto LOOP; case ']': break; default: cp2--; goto LOOP; } break; case '$': if (isdigit(*(cp2 + 1))) { if (*++cp2 == '0') { char *cp3 = name; while (*cp3) { *cp1++ = *cp3++; } } else if (toks[toknum = *cp2 - '1']) { char *cp3 = tp[toknum]; while (cp3 != te[toknum]) { *cp1++ = *cp3++; } } break; } /* intentional drop through */ default: *cp1++ = *cp2; break; } cp2++; } *cp1 = '\0'; if (!*new) { return(name); } return(new);}voidsetsunique(void){ sunique = !sunique; printf("Store unique %s.\n", onoff(sunique)); code = sunique;}voidsetrunique(void){ runique = !runique; printf("Receive unique %s.\n", onoff(runique)); code = runique;}/* change directory to parent directory */voidcdup(void){ if (command("CDUP") == ERROR && code == 500) { if (verbose) printf("CDUP command not recognized, trying XCUP\n"); (void) command("XCUP"); }}/* restart transfer at specific point */voidrestart(int argc, char *argv[]){ if (argc != 2) printf("restart: offset not specified\n"); else { restart_point = atol(argv[1]); printf("restarting at %ld. %s\n", restart_point, "execute get, put or append to initiate transfer"); }}/* show remote system type */voidsyst(void){ command("SYST");}voidmacdef(argc, argv) int argc; char *argv[];{ char *tmp; int c; if (macnum == 16) { printf("Limit of 16 macros have already been defined\n"); code = -1; return; } if (argc < 2 && !another(&argc, &argv, "macro name")) { printf("Usage: %s macro_name\n",argv[0]); code = -1; return; } if (interactive) { printf("Enter macro line by line, terminating it with a null line\n"); } (void) strncpy(macros[macnum].mac_name, argv[1], 8); if (macnum == 0) { macros[macnum].mac_start = macbuf; } else { macros[macnum].mac_start = macros[macnum - 1].mac_end + 1; } tmp = macros[macnum].mac_start; while (tmp != macbuf+4096) { if ((c = getchar()) == EOF) { printf("macdef:end of file encountered\n"); code = -1; return; } if ((*tmp = c) == '\n') { if (tmp == macros[macnum].mac_start) { macros[macnum++].mac_end = tmp; code = 0; return; } if (*(tmp-1) == '\0') { macros[macnum++].mac_end = tmp - 1; code = 0; return; } *tmp = '\0'; } tmp++; } while (1) { while ((c = getchar()) != '\n' && c != EOF) /* LOOP */; if (c == EOF || getchar() == '\n') { printf("Macro not defined - 4k buffer exceeded\n"); code = -1; return; } }}/* * Start up passive mode interaction */voidsetpassive(void){ passivemode = !passivemode; printf("Passive mode %s.\n", onoff(passivemode)); code = passivemode;}/* * get size of file on remote machine */voidsizecmd(argc, argv) int argc; char *argv[];{ if (argc < 2 && !another(&argc, &argv, "filename")) { printf("usage: %s filename\n", argv[0]); code = -1; return; } (void) command("SIZE %s", argv[1]);}/* * get last modification time of file on remote machine */voidmodtime(argc, argv) int argc; char *argv[];{ int overbose; if (argc < 2 && !another(&argc, &argv, "filename")) { printf("usage: %s filename\n", argv[0]); code = -1; return; } overbose = verbose; if (debug == 0) verbose = -1; if (command("MDTM %s", argv[1]) == COMPLETE) { int yy, mo, day, hour, min, sec; sscanf(reply_string, "%*s %04d%02d%02d%02d%02d%02d", &yy, &mo, &day, &hour, &min, &sec); /* might want to print this in local time */ printf("%s\t%02d/%02d/%04d %02d:%02d:%02d GMT\n", argv[1], mo, day, yy, hour, min, sec); } else printf("%s\n", reply_string); verbose = overbose;}/* * show status on remote machine */voidrmtstatus(argc, argv) int argc; char *argv[];{ (void) command(argc > 1 ? "STAT %s" : "STAT" , argv[1]);}/* * get file if modtime is more recent than current file */voidnewer(int argc, char *argv[]){ if (getit(argc, argv, -1, "w")) { /* This should be controlled by some verbose flag */ printf("Local file \"%s\" is newer than remote file \"%s\"\n", argv[2], argv[1]); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -