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

📄 cmds.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef lintstatic char RCSid[] = "$Header: cmds.c,v 2.3 86/12/15 11:40:49 jqj Exp $";#endif/* $Log:	cmds.c,v $ * Revision 2.3  86/12/15  11:40:49  jqj * Added support for more ViewPoint file types (no other attributes, though) *  * Revision 2.2  86/12/11  06:11:30  jqj * Eliminated form, mode, and struct commands.  Started adding support for * more file types. *  * Revision 2.1  86/06/30  12:18:56  jqj * get proper order of args to allow mget to work right. *  * Revision 2.0  85/11/21  07:22:41  jqj * 4.3BSD standard release *  * Revision 1.2  85/10/30  08:06:37  root * if prompt=off but verbose=on, print the name of each file during * multiplefile transfers. *  * Revision 1.1  85/05/27  06:30:51  jqj * Initial revision *  * based on Berkeley tcp/ftp *//* static char sccsid[] = "@(#)cmds.c	4.9 (Berkeley) 7/26/83"; *//* * FTP User Program -- Command Routines. */#include <sys/param.h>#include <sys/stat.h>#include <sys/socket.h>#include <signal.h>#include <stdio.h>#include <errno.h>#include "ftp_var.h"extern	char *globerr;extern	char **glob();extern	char *home;extern	short gflag;extern	char *remglob();extern	char *getenv();extern	char *index();extern	char *rindex();/* * Connect to peer server and * auto-login, if possible. */setpeer(argc, argv)	int argc;	char *argv[];{	CourierConnection *hookup();	if (connected != (CourierConnection*)0) {		printf("Already connected to %s, use disconnect first.\n",			hostname);		return;	}	if (argc < 2) {		strcat(line, " ");		printf("(to) ");		gets(&line[strlen(line)]);		makeargv();		argc = margc;		argv = margv;	}	if (argc > 2) {		printf("usage: %s fileservice-name\n", argv[0]);		return;	}	connected = hookup(argv[1]);	if (connected != (CourierConnection*)0) {		if (autologin) {			char *pwd, name[128], *getXNSpass();			printf("XNS UserName: ");			gets(name);			pwd = getXNSpass("Password:");			login(name,pwd);		}	}}struct	types {	char	*t_name;	int	t_type;} types[] = {	{ "ascii",	TYPE_A },	{ "binary",	TYPE_I },	{ "image",	TYPE_I },	{ "interpress",	TYPE_Interpress },	{ "viewpoint",	TYPE_VP },	{ "vpcanvas",	TYPE_VPCanvas },	{ "vpdictionary",TYPE_VPDictionary },	{ "vpmailnote",	TYPE_VPMailNote },	{ "vpreference",TYPE_VPReference },	0};/* * Set transfer type. */settype(argc, argv)	char *argv[];{	register struct types *p;	int comret;	if (argc > 2 || (argc == 2 && strcmp(argv[1],"?") == 0)) {		char *sep;		printf("usage: %s [ <integer> ", argv[0]);		sep = " | ";		for (p = types; p->t_name; p++) {			printf("%s%s", sep, p->t_name);		}		printf(" ]\n");		return;	}	if (argc < 2) {		printf("Using %s mode to transfer files.\n", typename);		return;	}	for (p = types; p->t_name; p++)		if (strcmp(argv[1], p->t_name) == 0)			break;	if (p->t_name == 0) {		int tmp = atoi(argv[1]);		if (tmp == 0 && strcmp(argv[1],"0") != 0) {			printf("%s: unknown mode (\"%s ?\" for help)\n",				argv[1], argv[0]);			return;		}		sprintf(typename,"%d",tmp);		typevalue = tmp;		return;	}	strcpy(typename, p->t_name);	typevalue = p->t_type;}/* * Set binary transfer type. *//*VARARGS*/setbinary(){	call(settype, "type", "binary", 0);}/* * Set ascii transfer type. *//*VARARGS*/setascii(){	call(settype, "type", "ascii", 0);}put(argc, argv)	int argc;	char *argv[];{	char *cmd;	if (argc == 2)		argc++, argv[2] = argv[1];	if (argc < 2) {		strcat(line, " ");		printf("(local-file) ");		gets(&line[strlen(line)]);		makeargv();		argc = margc;		argv = margv;	}	if (argc < 2) {usage:		printf("%s local-file remote-file\n", argv[0]);		return;	}	if (argc < 3) {		strcat(line, " ");		printf("(remote-file) ");		gets(&line[strlen(line)]);		makeargv();		argc = margc;		argv = margv;	}	if (argc < 3) 		goto usage;	if (!globulize(&argv[1]))		return;	cmd = (argv[0][0] == 'a') ? "APPE" : "STOR";	sendrequest(cmd, argv[1], argv[2]);}/* * Send multiple files. */mput(argc, argv)	char *argv[];{	register int i;	if (argc < 2) {		strcat(line, " ");		printf("(local-files) ");		gets(&line[strlen(line)]);		makeargv();		argc = margc;		argv = margv;	}	if (argc < 2) {		printf("%s local-files\n", argv[0]);		return;	}	for (i = 1; i < argc; i++) {		register char **cpp, **gargs;		if (!doglob) {			if (confirm(argv[0], argv[i]))				sendrequest("STOR", argv[i], argv[i]);			continue;		}		gargs = glob(argv[i]);		if (globerr != NULL) {			printf("%s\n", globerr);			if (gargs)				blkfree(gargs);			continue;		}		for (cpp = gargs; cpp && *cpp != NULL; cpp++)			if (confirm(argv[0], *cpp))				sendrequest("STOR", *cpp, *cpp);		if (gargs != NULL)			blkfree(gargs);	}}/* * Receive one file. */get(argc, argv)	char *argv[];{	if (argc == 2)		argc++, argv[2] = argv[1];	if (argc < 2) {		strcat(line, " ");		printf("(remote-file) ");		gets(&line[strlen(line)]);		makeargv();		argc = margc;		argv = margv;	}	if (argc < 2) {usage:		printf("%s remote-file [ local-file ]\n", argv[0]);		return;	}	if (argc < 3) {		strcat(line, " ");		printf("(local-file) ");		gets(&line[strlen(line)]);		makeargv();		argc = margc;		argv = margv;	}	if (argc < 3) 		goto usage;	if (!globulize(&argv[2]))		return;	recvrequest("RETR", argv[2], argv[1], "w");}/* * given a remote file name, strip directory path and version number */char *getlocalname(cp)	char *cp;{	char *result;	static char buf[MAXPATHLEN];	result = rindex(cp,'/'); /* find last component */	if (result == NULL) result = cp;	else result += 1;	strcpy(buf, result);	result = index(buf,'!'); /* strip version # if any */	if (result != NULL && result != buf) *result = '\000';	return(buf);}/* * Get multiple files. */mget(argc, argv)	char *argv[];{	char *cp;	char *tailp;	if (argc < 2) {		strcat(line, " ");		printf("(remote-files) ");		gets(&line[strlen(line)]);		makeargv();		argc = margc;		argv = margv;	}	if (argc < 2) {		printf("%s remote-files\n", argv[0]);		return;	}	while ((cp = remglob(argc, argv)) != NULL)		if (confirm(argv[0], cp)) {			tailp = getlocalname(cp);			recvrequest("RETR", tailp, cp, "w");		}}char *remglob(argc, argv)	char *argv[];{	char temp[16];	static char buf[MAXPATHLEN];	static FILE *ftemp = NULL;	static char **args;	int oldverbose, oldhash;	char *cp, *mode;	if (!doglob) {		if (args == NULL)			args = argv;		if ((cp = *++args) == NULL)			args = NULL;		return (cp);	}	if (ftemp == NULL) {		strcpy(temp, "/tmp/ftpXXXXXX");		mktemp(temp);		oldverbose = verbose, verbose = 0;		oldhash = hash, hash = 0;		for (mode = "w"; *++argv != NULL; mode = "a")			recvrequest("NLST", temp, *argv, mode);		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(bool)	int bool;{	return (bool ? "on" : "off");}/* * Show status. */status(argc, argv)	char *argv[];{	if (connected)		printf("Connected to %s.\n", hostname);	else		printf("Not connected.\n");	printf("Type: %s\n", typename);	printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n", 		onoff(verbose), onoff(bell), onoff(interactive),		onoff(doglob));	printf("Hash mark printing: %s\n",		onoff(hash));}/* * Set beep on cmd completed mode. *//*VARARGS*/setbell(){	bell = !bell;	printf("Bell mode %s.\n", onoff(bell));}/* * Turn on packet tracing. *//*VARARGS*/settrace(){	trace = !trace;	printf("Packet tracing %s.\n", onoff(trace));}/* * Toggle hash mark printing during transfers. *//*VARARGS*/sethash(){	hash = !hash;	printf("Hash mark printing %s", onoff(hash));	if (hash)		printf(" (1 packet/hash mark)");	printf(".\n");}/* * Turn on printing of server echo's. *//*VARARGS*/setverbose(){	verbose = !verbose;	printf("Verbose mode %s.\n", onoff(verbose));}/* * Turn on interactive prompting * during mget, mput, and mdelete. *//*VARARGS*/setprompt(){

⌨️ 快捷键说明

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