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

📄 ftp.c

📁 UNIX FTP client
💻 C
📖 第 1 页 / 共 3 页
字号:
			code = -1;			return;		}	}	if (initconn()) {		(void) signal(SIGINT, oldintr);		if (oldintp)			(void) signal(SIGPIPE, oldintp);		code = -1;		if (closefunc != NULL)			(*closefunc)(fin);		return;	}	if (sigsetjmp(sendabort, 1))		goto abort;	if (restart_point &&	    (strcmp(cmd, "STOR") == 0 || strcmp(cmd, "APPE") == 0)) {		if (fseek(fin, (long) restart_point, 0) < 0) {			fprintf(stderr, "local: %s: %s\n", local,				strerror(errno));			restart_point = 0;			if (closefunc != NULL)				(*closefunc)(fin);			return;		}		if (command("REST %ld", (long) restart_point)			!= CONTINUE) {			restart_point = 0;			if (closefunc != NULL)				(*closefunc)(fin);			return;		}		restart_point = 0;		lmode = "r+w";	}	if (remote) {		if (command("%s %s", cmd, remote) != PRELIM) {			(void) signal(SIGINT, oldintr);			if (oldintp)				(void) signal(SIGPIPE, oldintp);			if (closefunc != NULL)				(*closefunc)(fin);			return;		}	} else		if (command("%s", cmd) != PRELIM) {			(void) signal(SIGINT, oldintr);			if (oldintp)				(void) signal(SIGPIPE, oldintp);			if (closefunc != NULL)				(*closefunc)(fin);			return;		}	dout = dataconn(lmode);	if (dout == NULL)		goto abort;	(void) gettimeofday(&start, (struct timezone *)0);	oldintp = signal(SIGPIPE, SIG_IGN);	switch (curtype) {	case TYPE_I:	case TYPE_L:		errno = d = 0;		while ((c = read(fileno(fin), buf, sizeof (buf))) > 0) {			bytes += c;			for (bufp = buf; c > 0; c -= d, bufp += d)				if ((d = write(fileno(dout), bufp, c)) <= 0)					break;			if (hash) {				while (bytes >= hashbytes) {					(void) putchar('#');					hashbytes += HASHBYTES;				}				(void) fflush(stdout);			}			if (tick && (bytes >= hashbytes)) {				printf("\rBytes transferred: %ld", bytes);				(void) fflush(stdout);				while (bytes >= hashbytes)					hashbytes += TICKBYTES;			}		}		if (hash && (bytes > 0)) {			if (bytes < HASHBYTES)				(void) putchar('#');			(void) putchar('\n');			(void) fflush(stdout);		}		if (tick) {			(void) printf("\rBytes transferred: %ld\n", bytes);			(void) fflush(stdout);		}		if (c < 0)			fprintf(stderr, "local: %s: %s\n", local,				strerror(errno));		if (d < 0) {			if (errno != EPIPE) 				perror("netout");			bytes = -1;		}		break;	case TYPE_A:		while ((c = getc(fin)) != EOF) {			if (c == '\n') {				while (hash && (bytes >= hashbytes)) {					(void) putchar('#');					(void) fflush(stdout);					hashbytes += HASHBYTES;				}				if (tick && (bytes >= hashbytes)) {					(void) printf("\rBytes transferred: %ld",						bytes);					(void) fflush(stdout);					while (bytes >= hashbytes)						hashbytes += TICKBYTES;				}				if (ferror(dout))					break;				(void) putc('\r', dout);				bytes++;			}			(void) putc(c, dout);			bytes++;	/*		if (c == '\r') {			  	*/	/*		(void)	putc('\0', dout);  (* this violates rfc */	/*			bytes++;				*/	/*		}                          			*/     		}		if (hash) {			if (bytes < hashbytes)				(void) putchar('#');			(void) putchar('\n');			(void) fflush(stdout);		}		if (tick) {			(void) printf("\rBytes transferred: %ld\n", bytes);			(void) fflush(stdout);		}		if (ferror(fin))			fprintf(stderr, "local: %s: %s\n", local,				strerror(errno));		if (ferror(dout)) {			if (errno != EPIPE)				perror("netout");			bytes = -1;		}		break;	}	(void) gettimeofday(&stop, (struct timezone *)0);	if (closefunc != NULL)		(*closefunc)(fin);	(void) fclose(dout);	(void) getreply(0);	(void) signal(SIGINT, oldintr);	if (oldintp)		(void) signal(SIGPIPE, oldintp);	if (bytes > 0)		ptransfer("sent", bytes, &start, &stop);	return;abort:	(void) gettimeofday(&stop, (struct timezone *)0);	(void) signal(SIGINT, oldintr);	if (oldintp)		(void) signal(SIGPIPE, oldintp);	if (!cpend) {		code = -1;		return;	}	if (data >= 0) {		(void) close(data);		data = -1;	}	if (dout)		(void) fclose(dout);	(void) getreply(0);	code = -1;	if (closefunc != NULL && fin != NULL)		(*closefunc)(fin);	if (bytes > 0)		ptransfer("sent", bytes, &start, &stop);}static voidabortrecv(int ignore){	(void)ignore;	mflag = 0;	abrtflag = 0;	printf("\nreceive aborted\nwaiting for remote to finish abort\n");	(void) fflush(stdout);	siglongjmp(recvabort, 1);}voidrecvrequest(const char *cmd, 	    char *volatile local, char *remote, 	    const char *lmode, int printnames){	FILE *volatile fout, *volatile din = 0;	int (*volatile closefunc)(FILE *);	void (*volatile oldintp)(int);	void (*volatile oldintr)(int);	volatile int is_retr, tcrflag, bare_lfs = 0;	static unsigned bufsize;	static char *buf;	volatile long bytes = 0, hashbytes = HASHBYTES;	register int c, d;	struct timeval start, stop;	struct stat st;	is_retr = strcmp(cmd, "RETR") == 0;	if (is_retr && verbose && printnames) {		if (local && *local != '-')			printf("local: %s ", local);		if (remote)			printf("remote: %s\n", remote);	}	if (proxy && is_retr) {		proxtrans(cmd, local, remote);		return;	}	closefunc = NULL;	oldintr = NULL;	oldintp = NULL;	tcrflag = !crflag && is_retr;	if (sigsetjmp(recvabort, 1)) {		while (cpend) {			(void) getreply(0);		}		if (data >= 0) {			(void) close(data);			data = -1;		}		if (oldintr)			(void) signal(SIGINT, oldintr);		code = -1;		return;	}	oldintr = signal(SIGINT, abortrecv);	if (strcmp(local, "-") && *local != '|') {		if (access(local, 2) < 0) {			char *dir = rindex(local, '/');			if (errno != ENOENT && errno != EACCES) {				fprintf(stderr, "local: %s: %s\n", local,					strerror(errno));				(void) signal(SIGINT, oldintr);				code = -1;				return;			}			if (dir != NULL)				*dir = 0;			d = access(dir ? local : ".", 2);			if (dir != NULL)				*dir = '/';			if (d < 0) {				fprintf(stderr, "local: %s: %s\n", local,					strerror(errno));				(void) signal(SIGINT, oldintr);				code = -1;				return;			}			if (!runique && errno == EACCES &&			    chmod(local, 0600) < 0) {				fprintf(stderr, "local: %s: %s\n", local,					strerror(errno));				(void) signal(SIGINT, oldintr);				(void) signal(SIGINT, oldintr);				code = -1;				return;			}			if (runique && errno == EACCES &&			   (local = gunique(local)) == NULL) {				(void) signal(SIGINT, oldintr);				code = -1;				return;			}		}		else if (runique && (local = gunique(local)) == NULL) {			(void) signal(SIGINT, oldintr);			code = -1;			return;		}	}	if (!is_retr) {		if (curtype != TYPE_A)			changetype(TYPE_A, 0);	} 	else if (curtype != type) {		changetype(type, 0);	}	if (initconn()) {		(void) signal(SIGINT, oldintr);		code = -1;		return;	}	if (sigsetjmp(recvabort, 1))		goto abort;	if (is_retr && restart_point &&	    command("REST %ld", (long) restart_point) != CONTINUE)		return;	if (remote) {		if (command("%s %s", cmd, remote) != PRELIM) {			(void) signal(SIGINT, oldintr);			return;		}	} 	else {		if (command("%s", cmd) != PRELIM) {			(void) signal(SIGINT, oldintr);			return;		}	}	din = dataconn("r");	if (din == NULL)		goto abort;	if (strcmp(local, "-") == 0)		fout = stdout;	else if (*local == '|') {		oldintp = signal(SIGPIPE, SIG_IGN);		fout = popen(local + 1, "w");		if (fout == NULL) {			perror(local+1);			goto abort;		}		closefunc = pclose;	} 	else {		fout = fopen(local, lmode);		if (fout == NULL) {			fprintf(stderr, "local: %s: %s\n", local,				strerror(errno));			goto abort;		}		closefunc = fclose;	}	if (fstat(fileno(fout), &st) < 0 || st.st_blksize == 0)		st.st_blksize = BUFSIZ;	if (st.st_blksize > bufsize) {		if (buf)			(void) free(buf);		buf = malloc((unsigned)st.st_blksize);		if (buf == NULL) {			perror("malloc");			bufsize = 0;			goto abort;		}		bufsize = st.st_blksize;	}	(void) gettimeofday(&start, (struct timezone *)0);	switch (curtype) {	case TYPE_I:	case TYPE_L:		if (restart_point &&		    lseek(fileno(fout), (long) restart_point, L_SET) < 0) {			fprintf(stderr, "local: %s: %s\n", local,				strerror(errno));			if (closefunc != NULL)				(*closefunc)(fout);			return;		}		errno = d = 0;		while ((c = read(fileno(din), buf, bufsize)) > 0) {			if ((d = write(fileno(fout), buf, c)) != c)				break;			bytes += c;			if (hash && is_retr) {				while (bytes >= hashbytes) {					(void) putchar('#');					hashbytes += HASHBYTES;				}				(void) fflush(stdout);			}			if (tick && (bytes >= hashbytes) && is_retr) {				(void) printf("\rBytes transferred: %ld",					bytes);				(void) fflush(stdout);				while (bytes >= hashbytes)					hashbytes += TICKBYTES;			}		}		if (hash && bytes > 0) {			if (bytes < HASHBYTES)				(void) putchar('#');			(void) putchar('\n');			(void) fflush(stdout);		}		if (tick && is_retr) {			(void) printf("\rBytes transferred: %ld\n", bytes);			(void) fflush(stdout);		}		if (c < 0) {			if (errno != EPIPE)				perror("netin");			bytes = -1;		}		if (d < c) {			if (d < 0)				fprintf(stderr, "local: %s: %s\n", local,					strerror(errno));			else				fprintf(stderr, "%s: short write\n", local);		}		break;	case TYPE_A:		if (restart_point) {			register int i, n, ch;			if (fseek(fout, 0L, L_SET) < 0)				goto done;			n = restart_point;			for (i = 0; i++ < n;) {				if ((ch = getc(fout)) == EOF)					goto done;				if (ch == '\n')					i++;			}			if (fseek(fout, 0L, L_INCR) < 0) {done:				fprintf(stderr, "local: %s: %s\n", local,					strerror(errno));				if (closefunc != NULL)					(*closefunc)(fout);				return;			}		}		while ((c = getc(din)) != EOF) {			if (c == '\n')				bare_lfs++;			while (c == '\r') {				while (hash && (bytes >= hashbytes)					&& is_retr) {					(void) putchar('#');					(void) fflush(stdout);					hashbytes += HASHBYTES;				}				if (tick && (bytes >= hashbytes) && is_retr) {					printf("\rBytes transferred: %ld",						bytes);					fflush(stdout);					while (bytes >= hashbytes)						hashbytes += TICKBYTES;				}				bytes++;				if ((c = getc(din)) != '\n' || tcrflag) {					if (ferror(fout))						goto break2;					(void) putc('\r', fout);					if (c == '\0') {						bytes++;						goto contin2;					}					if (c == EOF)						goto contin2;				}			}			(void) putc(c, fout);			bytes++;	contin2:	;		}break2:		if (hash && is_retr) {			if (bytes < hashbytes)				(void) putchar('#');			(void) putchar('\n');			(void) fflush(stdout);		}		if (tick && is_retr) {			(void) printf("\rBytes transferred: %ld\n", bytes);			(void) fflush(stdout);		}		if (bare_lfs) {			printf("WARNING! %d bare linefeeds received in ASCII mode\n", bare_lfs);			printf("File may not have transferred correctly.\n");		}		if (ferror(din)) {			if (errno != EPIPE)				perror("netin");			bytes = -1;		}		if (ferror(fout))			fprintf(stderr, "local: %s: %s\n", local,				strerror(errno));		break;	}	if (closefunc != NULL)		(*closefunc)(fout);	(void) signal(SIGINT, oldintr);	if (oldintp)		(void) signal(SIGPIPE, oldintp);	(void) gettimeofday(&stop, (struct timezone *)0);	(void) fclose(din);	(void) getreply(0);	if (bytes > 0 && is_retr)		ptransfer("received", bytes, &start, &stop);	return;abort:/* abort using RFC959 recommended IP,SYNC sequence  */	(void) gettimeofday(&stop, (struct timezone *)0);	if (oldintp)		(void) signal(SIGPIPE, oldintr);	(void) signal(SIGINT, SIG_IGN);	if (!cpend) {		code = -1;		(void) signal(SIGINT, oldintr);		return;	}	abort_remote(din);	code = -1;	if (data >= 0) {		(void) close(data);		data = -1;	}	if (closefunc != NULL && fout != NULL)		(*closefunc)(fout);	if (din)		(void) fclose(din);	if (bytes > 0)		ptransfer("received", bytes, &start, &stop);	(void) signal(SIGINT, oldintr);}/* * Need to start a listen on the data channel before we send the command,

⌨️ 快捷键说明

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