📄 cmds.c
字号:
/* VARARGS */void setprompt() { interactive = !interactive; printf("Interactive mode %s.\n", onoff(interactive)); code = interactive;}/* Toggle metacharacter interpretation on local file names. *//* *//* VARARGS */void setglob() { doglob = !doglob; printf("Globbing %s.\n", onoff(doglob)); code = doglob;}/* Set debugging mode on/off and/or set level of debugging. *//* *//* VARARGS */void setdebug(int argc, char *argv[]) { int val; if (argc > 1) { val = atoi(argv[1]); if (val < 0) { printf("%s: bad debugging value.\n", argv[1]); code = -1; return; } } else val = !debug; debug = val; if (debug) options |= SO_DEBUG; else options &= ~SO_DEBUG; printf("Debugging %s (debug=%d).\n", onoff(debug), debug); code = debug > 0;}/* Set current working directory on remote machine. */void cd(int argc, char **argv) { if (argc < 2 && !another(&argc, &argv, "remote-directory")) { printf("usage: %s remote-directory\n", argv[0]); code = -1; return; } if (command("CWD %s\r\n", argv[1]) == ERROR && code == 500) { if (verbose) printf("CWD command not recognized, trying XCWD\n"); command("XCWD %s\r\n", argv[1]); }}/* Set current working directory on local machine. */void lcd(int argc, char **argv) { char buf[MAXPATHLEN]; if (argc < 2) argc++, argv[1] = home; if (argc != 2) { printf("usage: %s local-directory\n", argv[0]); code = -1; return; } if (!globulize(&argv[1])) { code = -1; return; } if (chdir(argv[1]) < 0) { fprintf(stderr, "local: %s: %s\n", argv[1], strerror(errno)); code = -1; return; }#ifdef HAVE_GETCWD printf("Local directory now %s\n", getcwd(buf, MAXPATHLEN-1));#else printf("Local directory now %s\n", getwd(buf));#endif code = 0;}/* Delete a single file. */void delete(int argc, char *argv[]) { if (argc < 2 && !another(&argc, &argv, "remote-file")) { printf("usage: %s remote-file\n", argv[0]); code = -1; return; } command("DELE %s\r\n", argv[1]);}/* Delete multiple files. */void mdelete(int argc, char *argv[]) { extern jmp_buf jabort; Sig_t oldintr; int ointer; char *cp; void mabort(); if (argc < 2 && !another(&argc, &argv, "remote-files")) { printf("usage: %s remote-files\n", argv[0]); code = -1; return; } mflag = 1; mname = argv[0]; oldintr = Signal(SIGINT, mabort); setjmp(jabort); while ((cp = remglob(argv,0)) != NULL) { if (*cp == '\0') { mflag = 0; continue; } if (mflag && confirm(argv[0], cp)) { command("DELE %s\r\n", cp); if (!mflag && fromatty) { ointer = interactive; interactive = 1; if (confirm("Continue with", "mdelete")) { mflag++; } interactive = ointer; } } } Signal(SIGINT, oldintr); mflag = 0;}/* Rename a remote file. */void renamefile(int argc, char *argv[]) { if (argc < 2 && !another(&argc, &argv, "from-name")) goto usage; if (argc < 3 && !another(&argc, &argv, "to-name")) { usage: printf("%s from-name to-name\n", argv[0]); code = -1; return; } if (command("RNFR %s\r\n", argv[1]) == CONTINUE) command("RNTO %s\r\n", argv[2]);}/* Get a directory listing *//* of remote files. */void ls(int argc, char *argv[]) { char *cmd; if (argc < 2) argc++, argv[1] = NULL; if (argc < 3) argc++, argv[2] = "-"; if (argc > 3) { printf("usage: %s remote-directory local-file\n", argv[0]); code = -1; return; } cmd = argv[0][0] == 'n' ? "NLST" : "LIST"; if (strcmp(argv[2], "-") && !globulize(&argv[2])) { code = -1; return; } if (strcmp(argv[2], "-") && *argv[2] != '|') if (!globulize(&argv[2]) || !confirm("output to local-file:", argv[2])) { code = -1; return; } recvrequest(cmd, argv[2], argv[1], "w", 0);}/* Get a directory listing *//* of multiple remote files. */void mls(int argc, char **argv) { extern jmp_buf jabort; Sig_t oldintr; int ointer, i; char *cmd, mode[1], *dest; void mabort(); if (argc < 2 && !another(&argc, &argv, "remote-files")) goto usage; if (argc < 3 && !another(&argc, &argv, "local-file")) { usage: printf("usage: %s remote-files local-file\n", argv[0]); code = -1; return; } dest = argv[argc - 1]; argv[argc - 1] = NULL; if (strcmp(dest, "-") && *dest != '|') if (!globulize(&dest) || !confirm("output to local-file:", dest)) { code = -1; return; } cmd = argv[0][1] == 'l' ? "NLST" : "LIST"; mname = argv[0]; mflag = 1; oldintr = Signal(SIGINT, mabort); setjmp(jabort); for (i = 1; mflag && i < argc-1; ++i) { *mode = (i == 1) ? 'w' : 'a'; recvrequest(cmd, dest, argv[i], mode, 0); if (!mflag && fromatty) { ointer = interactive; interactive = 1; if (confirm("Continue with", argv[0])) { mflag ++; } interactive = ointer; } } Signal(SIGINT, oldintr); mflag = 0;}/* Do a shell escape *//* *//* ARGSUSED */int shell(int argc, char **argv) { int pid; Sig_t old1, old2; char shellnam[40], *shell, *namep; int status; old1 = Signal (SIGINT, SIG_IGN); old2 = Signal (SIGQUIT, SIG_IGN); if ((pid = fork()) == 0) { for (pid = 3; pid < 20; pid++) close(pid); Signal(SIGINT, SIG_DFL); Signal(SIGQUIT, SIG_DFL); shell = getenv("SHELL"); if (shell == NULL) shell = _PATH_BSHELL; namep = rindex(shell,'/'); if (namep == NULL) namep = shell; strcpy(shellnam,"-"); strcat(shellnam, ++namep); if (strcmp(namep, "sh") != 0) shellnam[0] = '+'; if (debug) { printf ("%s\n", shell); fflush (stdout); } if (argc > 1) { execl(shell,shellnam,"-c",altarg,(char *)0); } else { execl(shell,shellnam,(char *)0); } perror(shell); code = -1; exit(1); } if (pid > 0) while (wait(&status) != pid) ; Signal(SIGINT, old1); Signal(SIGQUIT, old2); if (pid == -1) { perror("Try again later"); code = -1; } else { code = 0; } return (0);}/* Send new user information (re-login) */int user(int argc, char **argv) { char acct[80], *GETPASS(); int n, aflag = 0; if (argc < 2) { another(&argc, &argv, "username"); } if (argc < 2 || argc > 4) { printf("usage: %s username [password] [account]\n", argv[0]); code = -1; return (0); } if ((n = command("USER %s\r\n", argv[1])) == CONTINUE) { if (argc < 3 ){ if (!strcmp(argv[1], "anonymous") || !strcmp(argv[1], "ftp")) { printf("Password: "); fflush(stdout); fgets(acct, sizeof(acct) - 1, stdin); acct[strlen(acct) - 1] = '\0'; argv[2] = acct; } else argv[2] = GETPASS("Password: "); argc++; } n = command("PASS %s\r\n", argv[2]); } if (n == CONTINUE) { if (argc < 4) { printf("Account: "); fflush(stdout); fgets(acct, sizeof(acct) - 1, stdin); acct[strlen(acct) - 1] = '\0'; argv[3] = acct; argc++; } n = command("ACCT %s\r\n", argv[3]); aflag++; } if (n != COMPLETE) { fprintf(stdout, "Login failed.\n"); return (0); } if (!aflag && argc == 4) { command("ACCT %s\r\n", argv[3]); } return (1);}/* Print working directory. *//* *//* VARARGS */void pwd() { int oldverbose = verbose; /* If we aren't verbose, this doesn't do anything! */ verbose = 1; if (command("PWD\r\n") == ERROR && code == 500) { printf("PWD command not recognized, trying XPWD\n"); command("XPWD\r\n"); } verbose = oldverbose;}/* Make a directory. */void makedir(int argc, char *argv[]) { if (argc < 2 && !another(&argc, &argv, "directory-name")) { printf("usage: %s directory-name\n", argv[0]); code = -1; return; } if (command("MKD %s\r\n", argv[1]) == ERROR && code == 500) { if (verbose) printf("MKD command not recognized, trying XMKD\n"); command("XMKD %s\r\n", argv[1]); }}/* Remove a directory. */void removedir(int argc, char *argv[]) { if (argc < 2 && !another(&argc, &argv, "directory-name")) { printf("usage: %s directory-name\n", argv[0]); code = -1; return; } if (command("RMD %s\r\n", argv[1]) == ERROR && code == 500) { if (verbose) printf("RMD command not recognized, trying XRMD\n"); command("XRMD %s\r\n", argv[1]); }}/* Turn argv[1..argc) into a space-separated string, then prepend initial *//* text. Send the result as a one-line command and get response. */void quote1(char *initial, int argc, char **argv) { register int i, len=0; char buf[BUFSIZ]; /* must be >= sizeof(line) */ char *eolstr = "\r\n"; bzero(buf, BUFSIZ); len += strlen(strncpy(buf, initial, MIN((BUFSIZ-len), strlen(initial)))); if (argc > 1) { len += strlen(strncpy(&buf[len], argv[1], MIN((BUFSIZ-len), strlen(argv[1])))); for (i = 2; i < argc; i++) { buf[len++] = ' '; len += strlen(strncpy(&buf[len], argv[i], MIN((BUFSIZ-len), strlen(argv[i])))); } } len += strlen(strncpy(&buf[len], eolstr, MIN((BUFSIZ-len), strlen(eolstr)))); buf[MIN((BUFSIZ-1), len)] = '\0'; if (command(buf) == PRELIM) { while (getreply(0) == PRELIM); }}/* Send a line, verbatim, to the remote machine. */void quote(int argc, char *argv[]) { if (argc < 2 && !another(&argc, &argv, "command line to send")) { printf("usage: %s line-to-send\n", argv[0]); code = -1; return; } quote1("", argc, argv);}/* Send a SITE command to the remote machine. The line *//* is sent verbatim to the remote machine, except that the *//* word "SITE" is added at the front. */void site(int argc, char *argv[]) { if (argc < 2 && !another(&argc, &argv, "arguments to SITE command")) { printf("usage: %s line-to-send\n", argv[0]); code = -1; return; } quote1("SITE ", argc, argv);}void do_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; } command("SITE CHMOD %s %s\r\n", argv[1], argv[2]);}void do_umask(int argc, char *argv[]) { int oldverbose = verbose; verbose = 1; command(argc == 1 ? "SITE UMASK\r\n" : "SITE UMASK %s\r\n", argv[1]); verbose = oldverbose;}void idletime(int argc, char *argv[]) { int oldverbose = verbose; verbose = 1; command(argc == 1 ? "SITE IDLE\r\n" : "SITE IDLE %s\r\n", argv[1]); verbose = oldverbose;}/* Ask the other side for help. */void rmthelp(int argc, char *argv[]) { int oldverbose = verbose; verbose = 1; command(argc == 1 ? "HELP\r\n" : "HELP %s\r\n", argv[1]); verbose = oldverbose;}/* Terminate session, but don't exit. */void disconnect() { extern FILE *cout; extern int data; if (!connected) return; command("QUIT\r\n"); if (cout) { fclose(cout); } cout = NULL; connected = 0; data = -1; if (!proxy) { macnum = 0; }}/* Terminate session and exit. *//* *//* VARARGS */int quit() { if (connected) disconnect(); pswitch(1); if (connected) disconnect(); exit(0); return -1;}void fatal(char *msg) { fprintf(stderr, "ftp: %s\n", msg); exit(1);}void account(int argc, char **argv) { char acct[50], *GETPASS(), *ap; if (argc > 1) { ++argv; --argc; strncpy(acct,*argv,49); acct[49] = '\0'; while (argc > 1) { --argc; ++argv; strncat(acct,*argv, 49-strlen(acct));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -