⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmds.c

📁 linux下ftp client程序的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
}/* * Get multiple files. */voidmget(argc, argv)	int argc;	char **argv;{	sig_t oldintr;	int ch, ointer;	char *cp, *tp, *tp2;	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);	(void) setjmp(jabort);	while ((cp = remglob(argv,proxy)) != NULL) {		if (*cp == '\0') {			mflag = 0;			continue;		}		if (mflag && confirm(argv[0], cp)) {			tp = cp;			if (mcase && ! all_lower (tp))				tp = strdown (strdup (tp));			if (ntflag) {				char *new = dotrans (tp);				if (tp != cp)					free (tp);				tp = new;			}			if (mapflag) {				char *new = domap (tp);				if (tp != cp)					free (tp);				tp = new;			}			recvrequest("RETR", tp, cp, "w",				    tp != cp || !interactive);			if (!mflag && fromatty) {				ointer = interactive;				interactive = 1;				if (confirm("Continue with","mget")) {					mflag++;				}				interactive = ointer;			}			if (tp != cp)				free (tp);		}		free (cp);	}	(void) signal(SIGINT,oldintr);	mflag = 0;}char *remglob(argv,doswitch)	char *argv[];	int doswitch;{	static FILE *ftemp = NULL;	static char **args;	int buf_len = 0;	char *buf = 0;	int sofar = 0;	int oldverbose, oldhash;	int fd;	char *cp, *mode, *end;	if (!mflag) {		if (!doglob) {			args = NULL;		}		else {			if (ftemp) {				(void) fclose(ftemp);				ftemp = NULL;			}		}		return (NULL);	}	if (!doglob) {		if (args == NULL)			args = argv;		if ((cp = *++args) == NULL)			args = NULL;		return cp ? 0 : strdup (cp);	}	if (ftemp == NULL) {		char temp[sizeof PATH_TMP + sizeof "XXXXXX"];		strcpy (temp, PATH_TMP);		strcat (temp, "XXXXXX");#ifdef HAVE_MKSTEMP		fd = mkstemp (temp);#else		if (mktemp (temp) != NULL)			fd = open(temp, O_CREAT|O_EXCL|O_RDWR, 0600);		else			fd = -1;#endif		if (fd < 0) {		  printf("unable to create temporary file %s: %s\n", temp,			 strerror(errno));		  return (NULL);		}		close (fd);		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");		(void) unlink(temp);		if (ftemp == NULL) {			printf("can't find list of remote files, oops\n");			return (NULL);		}	}	buf_len = 100;		/* Any old size */	buf = malloc (buf_len + 1);	sofar = 0;	for (;;) {		if (! buf) {			printf ("malloc failure\n");			return 0;		}		if (! fgets(buf + sofar, buf_len - sofar, ftemp)) {			fclose(ftemp);			ftemp = NULL;			free (buf);			return 0;		}		sofar = strlen (buf);		if (buf[sofar - 1] == '\n') {			buf[sofar - 1] = '\0';			return buf;		}		/* Make more room and read some more... */		buf_len += buf_len;		buf = realloc (buf, buf_len);	}}char *onoff(bool)	int bool;{	return (bool ? "on" : "off");}/* * Show status. *//*ARGSUSED*/voidstatus(argc, argv)	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*/voidsetbell(argc, argv)	int argc;	char *argv[];{	bell = !bell;	printf("Bell mode %s.\n", onoff(bell));	code = bell;}/* * Turn on packet tracing. *//*VARARGS*/voidsettrace(argc, argv)	int argc;	char *argv[];{	trace = !trace;	printf("Packet tracing %s.\n", onoff(trace));	code = trace;}/* * Toggle hash mark printing during transfers. *//*VARARGS*/voidsethash(argc, argv)	int argc;	char *argv[];{	if (argv[1] != NULL)		sscanf(argv[1], "%d", &hashbytes);	if (hashbytes <= 0)		hashbytes=1024;	hash = !hash;	printf("Hash mark printing %s", onoff(hash));	code = hash;	if (hash)		printf(" (%d bytes/hash mark)", hashbytes);	printf(".\n");}/* * Turn on printing of server echo's. *//*VARARGS*/voidsetverbose(argc, argv)	int argc;	char *argv[];{	verbose = !verbose;	printf("Verbose mode %s.\n", onoff(verbose));	code = verbose;}/* * Toggle PORT cmd use before each data connection. *//*VARARGS*/voidsetport(argc, argv)	int argc;	char *argv[];{	sendport = !sendport;	printf("Use of PORT cmds %s.\n", onoff(sendport));	code = sendport;}/* * Turn on interactive prompting * during mget, mput, and mdelete. *//*VARARGS*/voidsetprompt(argc, argv)	int argc;	char *argv[];{	interactive = !interactive;	printf("Interactive mode %s.\n", onoff(interactive));	code = interactive;}/* * Toggle metacharacter interpretation * on local file names. *//*VARARGS*/voidsetglob(argc, argv)	int argc;	char *argv[];{	doglob = !doglob;	printf("Globbing %s.\n", onoff(doglob));	code = doglob;}/* * Set debugging mode on/off and/or * set level of debugging. *//*VARARGS*/voidsetdebug(argc, argv)	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. */voidcd(argc, argv)	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", argv[1]) == ERROR && code == 500) {		if (verbose)			printf("CWD command not recognized, trying XCWD\n");		(void) command("XCWD %s", argv[1]);	}}/* * Set current working directory * on local machine. */voidlcd(argc, argv)	int argc;	char *argv[];{	char *dir;	extern char *xgetcwd();	if (argc < 2)		argc++, argv[1] = home;	if (argc != 2) {		printf("usage: %s local-directory\n", argv[0]);		code = -1;		return;	}	dir = globulize (argv[1]);	if (! dir) {		code = -1;		return;	}	if (chdir(dir) < 0) {		error (0, errno, "dir: %s", dir);		free (dir);		code = -1;		return;	}	free (dir);	dir = xgetcwd ();	if (dir) {		printf("Local directory now %s\n", dir);		free (dir);	} else		error (0, errno, "getcwd");	code = 0;}/* * Delete a single file. */voiddelete(argc, argv)	int argc;	char *argv[];{	if (argc < 2 && !another(&argc, &argv, "remote-file")) {		printf("usage: %s remote-file\n", argv[0]);		code = -1;		return;	}	(void) command("DELE %s", argv[1]);}/* * Delete multiple files. */voidmdelete(argc, argv)	int argc;	char **argv;{	sig_t oldintr;	int ointer;	char *cp;	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);	(void) setjmp(jabort);	while ((cp = remglob(argv,0)) != NULL) {		if (*cp == '\0') {			mflag = 0;			continue;		}		if (mflag && confirm(argv[0], cp)) {			(void) command("DELE %s", cp);			if (!mflag && fromatty) {				ointer = interactive;				interactive = 1;				if (confirm("Continue with", "mdelete")) {					mflag++;				}				interactive = ointer;			}		}		free (cp);	}	(void) signal(SIGINT, oldintr);	mflag = 0;}/* * Rename a remote file. */voidrenamefile(argc, argv)	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", argv[1]) == CONTINUE)		(void) command("RNTO %s", argv[2]);}/* * Get a directory listing * of remote files. */voidls(argc, argv)	int argc;	char *argv[];{	char *cmd, *dest;	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], "-") != 0) {		dest = globulize(argv[2]);		if (! dest) {			code = -1;			return;		}		if (*dest != '|' && !confirm("output to local-file:", dest)) {			code = -1;			goto out;		}	} else		dest = 0;	recvrequest(cmd, dest ? dest : "-", argv[1], "w", 0); out:	if (dest)		free (dest);}/* * Get a directory listing * of multiple remote files. */voidmls(argc, argv)	int argc;	char **argv;{	sig_t oldintr;	int ointer, i;	char *cmd, mode[1], *dest;	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 != '|') {		dest = globulize (dest);		if (! dest) {			code = -1;			return;		}		if (! confirm("output to local-file:", dest)) {			code = -1;			free (dest);			return;		}	} else		dest = strdup (dest);	cmd = argv[0][1] == 'l' ? "NLST" : "LIST";	mname = argv[0];	mflag = 1;	oldintr = signal(SIGINT, mabort);	(void) 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;		}	}	(void) signal(SIGINT, oldintr);	mflag = 0;	free (dest);}/* * Do a shell escape *//*ARGSUSED*/voidshell(argc, argv)	int argc;	char **argv;{	pid_t pid;	sig_t old1, old2;	char shellnam[40], *shell, *namep;	old1 = signal (SIGINT, SIG_IGN);	old2 = signal (SIGQUIT, SIG_IGN);	if ((pid = fork()) == 0) {		for (pid = 3; pid < 20; pid++)			(void) close(pid);		(void) signal(SIGINT, SIG_DFL);		(void) signal(SIGQUIT, SIG_DFL);		shell = getenv("SHELL");		if (shell == NULL)			shell = PATH_BSHELL;		namep = strrchr(shell,'/');		if (namep == NULL)			namep = shell;		(void) strcpy(shellnam,"-");		(void) strcat(shellnam, ++namep);		if (strcmp(namep, "sh") != 0)			shellnam[0] = '+';		if (debug) {			printf ("%s\n", shell);			(void) fflush (stdout);		}		if (argc > 1) {			execl(shell,shellnam,"-c",altarg,(char *)0);		}		else {			execl(shell,shellnam,(char *)0);		}		error (0, errno, "shell");		code = -1;		exit(1);	}	if (pid > 0)		while (wait(0) != pid)			;	(void) signal(SIGINT, old1);	(void) signal(SIGQUIT, old2);	if (pid == -1) {		error (0, errno, "Try again later");		code = -1;	}	else {		code = 0;	}}/* * Send new user information (re-login) */voiduser(argc, argv)	int argc;	char **argv;{	char acct[80];	int n, aflag = 0;	if (argc < 2)		(void) another(&argc, &argv, "username");	if (argc < 2 || argc > 4) {		printf("usage: %s username [password] [account]\n", argv[0]);		code = -1;		return;	}	n = command("USER %s", argv[1]);	if (n == CONTINUE) {		if (argc < 3 )			argv[2] = getpass("Password: "), argc++;		n = command("PASS %s", argv[2]);	}	if (n == CONTINUE) {		if (argc < 4) {			printf("Account: "); (void) fflush(stdout);			(void) fgets(acct, sizeof(acct) - 1, stdin);			acct[strlen(acct) - 1] = '\0';			argv[3] = acct; argc++;		}		n = command("ACCT %s", argv[3]);		aflag++;	}	if (n != COMPLETE) {		fprintf(stdout, "Login failed.\n");		return;	}	if (!aflag && argc == 4) {		(void) command("ACCT %s", argv[3]);	}}/* * Print working directory. *//*VARARGS*/voidpwd(argc, argv)	int argc;	char *argv[];{	int oldverbose = verbose;	/*	 * If we aren't verbose, this doesn't do anything!	 */	verbose = 1;	if (command("PWD") == ERROR && code == 500) {		printf("PWD command not recognized, trying XPWD\n");		(void) command("XPWD");	}	verbose = oldverbose;}/* * Make a directory. */voidmakedir(argc, argv)	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", argv[1]) == ERROR && code == 500) {		if (verbose)			printf("MKD command not recognized, trying XMKD\n");		(void) command("XMKD %s", argv[1]);	}}/* * Remove a directory. */voidremovedir(argc, argv)	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", argv[1]) == ERROR && code == 500) {		if (verbose)			printf("RMD command not recognized, trying XRMD\n");		(void) command("XRMD %s", argv[1]);	}}/* * Send a line, verbatim, to the remote machine. */voidquote(argc, argv)	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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -