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

📄 cmds.c

📁 UNIX FTP client
💻 C
📖 第 1 页 / 共 3 页
字号:
 * 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 + -