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

📄 ftp.c

📁 Linux下的socks的程序源程序,用于socks的代理服务
💻 C
📖 第 1 页 / 共 3 页
字号:
	int printnames;{	struct stat st;	struct timeval start, stop;	register int c, d;	FILE *fin, *dout = 0, *popen();	int (*closefunc)(), pclose(), fclose();	sig_t oldintr, oldintp;	long bytes = 0, hashbytes = HASHBYTES;	char *lmode, buf[BUFSIZ], *bufp;	void abortsend();	if (verbose && printnames) {		if (local && *local != '-')			printf("local: %s ", local);		if (remote)			printf("remote: %s\n", remote);	}	if (proxy) {		proxtrans(cmd, local, remote);		return;	}	if (curtype != type)		changetype(type, 0);	closefunc = NULL;	oldintr = NULL;	oldintp = NULL;	lmode = "w";	if (setjmp(sendabort)) {		while (cpend) {			(void) getreply(0);		}		if (data >= 0) {			(void) close(data);			data = -1;		}		if (oldintr)			(void) signal(SIGINT,oldintr);		if (oldintp)			(void) signal(SIGPIPE,oldintp);		code = -1;		return;	}	oldintr = signal(SIGINT, abortsend);	if (strcmp(local, "-") == 0)		fin = stdin;	else if (*local == '|') {		oldintp = signal(SIGPIPE,SIG_IGN);		fin = popen(local + 1, "r");		if (fin == NULL) {			perror(local + 1);			(void) signal(SIGINT, oldintr);			(void) signal(SIGPIPE, oldintp);			code = -1;			return;		}		closefunc = pclose;	} else {		fin = fopen(local, "r");		if (fin == NULL) {			fprintf(stderr, "local: %s: %s\n", local,				strerror(errno));			(void) signal(SIGINT, oldintr);			code = -1;			return;		}		closefunc = fclose;		if (fstat(fileno(fin), &st) < 0 ||		    (st.st_mode&S_IFMT) != S_IFREG) {			fprintf(stdout, "%s: not a plain file.\n", local);			(void) signal(SIGINT, oldintr);			fclose(fin);			code = -1;			return;		}	}	if (initconn()) {		(void) signal(SIGINT, oldintr);		if (oldintp)			(void) signal(SIGPIPE, oldintp);		code = -1;		if (closefunc != NULL)			(*closefunc)(fin);		return;	}	if (setjmp(sendabort))		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 (hash && bytes > 0) {			if (bytes < HASHBYTES)				(void) putchar('#');			(void) putchar('\n');			(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 (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 (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) {#ifdef FASCIST		syslog(LOG_NOTICE, "Sent local file %s as %s -- %d bytes", local, remote, bytes);#endif		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) {#ifdef FASCIST		syslog(LOG_NOTICE, "Sent local file %s as %s -- %d bytes", local, remote, bytes);#endif		ptransfer("sent", bytes, &start, &stop);	}}jmp_buf	recvabort;voidabortrecv(){	mflag = 0;	abrtflag = 0;	printf("\nreceive aborted\nwaiting for remote to finish abort\n");	(void) fflush(stdout);	longjmp(recvabort, 1);}recvrequest(cmd, local, remote, lmode, printnames)	char *cmd, *local, *remote, *lmode;{	FILE *fout, *din = 0, *popen();	int (*closefunc)(), pclose(), fclose();	sig_t oldintr, oldintp;	int is_retr, tcrflag, bare_lfs = 0;	char *gunique();	static int bufsize;	static char *buf;	long bytes = 0, hashbytes = HASHBYTES;	register int c, d;	struct timeval start, stop;	struct stat st;	off_t lseek();	void abortrecv();	char *malloc();	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 (setjmp(recvabort)) {		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 (setjmp(recvabort))		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;	}#ifdef SVR3        if (BUFSIZ > bufsize) {#else            	if (fstat(fileno(fout), &st) < 0 || st.st_blksize == 0)		st.st_blksize = BUFSIZ;	if (st.st_blksize > bufsize) {#endif		if (buf)			(void) free(buf);#ifdef SVR3                buf = malloc((unsigned) BUFSIZ);#else				buf = malloc((unsigned)st.st_blksize);#endif				if (buf == NULL) {			perror("malloc");			bufsize = 0;			goto abort;		}#ifdef SVR3                bufsize = BUFSIZ;#else                		bufsize = st.st_blksize;#endif			}	(void) gettimeofday(&start, (struct timezone *)0);	switch (curtype) {	case TYPE_I:	case TYPE_L:		if (restart_point &&#if defined(SEEK_SET)		  lseek(fileno(fout), (long) restart_point, SEEK_SET) < 0) {#else		  lseek(fileno(fout), (long) restart_point, L_SET) < 0) {#endif			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) {				while (bytes >= hashbytes) {					(void) putchar('#');					hashbytes += HASHBYTES;				}				(void) fflush(stdout);			}		}		if (hash && bytes > 0) {			if (bytes < HASHBYTES)				(void) putchar('#');			(void) putchar('\n');			(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 defined(SEEK_SET)			if (fseek(fout, 0L, SEEK_SET) < 0)#else			if (fseek(fout, 0L, L_SET) < 0)#endif				goto done;			n = restart_point;			for (i = 0; i++ < n;) {				if ((ch = getc(fout)) == EOF)					goto done;				if (ch == '\n')					i++;			}#if defined(SEEK_CUR)			if (fseek(fout, 0L, SEEK_CUR) < 0) {#else			if (fseek(fout, 0L, L_INCR) < 0) {#endifdone:				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)) {					(void) putchar('#');					(void) fflush(stdout);					hashbytes += HASHBYTES;				}				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 (bare_lfs) {			printf("WARNING! %d bare linefeeds received in ASCII mode\n", bare_lfs);			printf("File may not have transferred correctly.\n");		}		if (hash) {			if (bytes < hashbytes)

⌨️ 快捷键说明

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