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

📄 ftp.c

📁 socket5 代理服务代码 socket5 代理服务代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	}	if (data >= 0) {	    close(data);	    data = -1;	}	if (oldintr)	    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));		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));		Signal(SIGINT, oldintr);		code = -1;		return;	    }	    if (!runique && errno == EACCES &&		chmod(local, 0600) < 0) {		fprintf(stderr, "local: %s: %s\n", local,			strerror(errno));		Signal(SIGINT, oldintr);		Signal(SIGINT, oldintr);		code = -1;		return;	    }	    if (runique && errno == EACCES &&		(local = gunique(local)) == NULL) {		Signal(SIGINT, oldintr);		code = -1;		return;	    }	}	else if (runique && (local = gunique(local)) == NULL) {	    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()) {	Signal(SIGINT, oldintr);	code = -1;	return;    }    if (setjmp(recvabort))	goto abort;    if (is_retr && restart_point &&	command("REST %ld\r\n", (long) restart_point) != CONTINUE)	return;    if (remote) {	if (command("%s %s\r\n", cmd, remote) != PRELIM) {	    Signal(SIGINT, oldintr);	    return;	}    } else {	if (command("%s\r\n", cmd) != PRELIM) {	    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;    }#ifndef SVR3    if (fstat(fileno(fout), &st) < 0 || st.st_blksize == 0)#endif	st.st_blksize = BUFSIZ;    if (st.st_blksize > bufsize) {	if (buf) free(buf);	buf = malloc((unsigned)st.st_blksize);	if (buf == NULL) {	    perror("malloc");	    bufsize = 0;	    goto abort;	}    	bufsize = st.st_blksize;        }    gettimeofday(&start, (struct timezone *)0);    switch (curtype) {	case TYPE_I:	case TYPE_L:#ifdef SEEK_SET#define FTP_SEEK_SET SEEK_SET#else#define FTP_SEEK_SET L_SET#endif#ifdef SEEK_CUR#define FTP_SEEK_CUR SEEK_CUR#else#define FTP_SEEK_CUR L_CUR#endif	    if (restart_point && lseek(fileno(fout), (long) restart_point, FTP_SEEK_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) {		    while (bytes >= hashbytes) {			putchar('#');			hashbytes += HASHBYTES;		    }		    fflush(stdout);		}	    }	    if (hash && bytes > 0) {		if (bytes < HASHBYTES) putchar('#');		putchar('\n');		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, FTP_SEEK_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, FTP_SEEK_CUR) < 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)) {			putchar('#');			fflush(stdout);			hashbytes += HASHBYTES;		    }		    bytes++;		    if ((c = getc(din)) != '\n' || tcrflag) {			if (ferror(fout)) goto break2;			putc('\r', fout);			if (c == '\0') {			    bytes++;			    goto contin2;			}			if (c == EOF) goto contin2;		    }		}		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) putchar('#');		putchar('\n');		fflush(stdout);	    }	    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);    Signal(SIGINT, oldintr);    if (oldintp) Signal(SIGPIPE, oldintp);    gettimeofday(&stop, (struct timezone *)0);    fclose(din);    if(data >= 0) {	close(data);	data = -1;    }    getreply(0);    if (bytes > 0 && is_retr) {#ifdef FASCIST	syslog(LOG_NOTICE, "Received remote file %s as %s -- %d bytes", remote, local, bytes);#endif	ptransfer("received", bytes, &start, &stop);    }    return;abort:    /* abort using RFC959 recommended IP,SYNC sequence  */      gettimeofday(&stop, (struct timezone *)0);    if (oldintp) Signal(SIGPIPE, oldintr);    Signal(SIGINT, SIG_IGN);    if (!cpend) {	code = -1;	Signal(SIGINT, oldintr);	return;    }      abort_remote(din);    code = -1;    if (data >= 0) {	close(data);	data = -1;    }    if (closefunc != NULL && fout != NULL) (*closefunc)(fout);    if (din) fclose(din);    if (bytes > 0) {#ifdef FASCIST	syslog(LOG_NOTICE, "Received remote file %s as %s -- %d bytes", remote, local, bytes);#endif	ptransfer("received", bytes, &start, &stop);    }    Signal(SIGINT, oldintr);}	FILE *dataconn(lmode)    char *lmode;{    struct sockaddr_in from;    int s, fromlen = sizeof (from), tos;    if ((s = accept(data, (struct sockaddr *) &from, &fromlen)) < 0) {	perror("ftp: accept");	close(data), data = -1;	return (NULL);    }    close(data);    data = s;#if defined(IP_TOS) && defined(IPTOS_THROUGHPUT)    tos = IPTOS_THROUGHPUT;    if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0)	perror("ftp: setsockopt TOS (ignored)");#endif    return (fdopen(data, lmode));}void psabort() {    extern int abrtflag;    abrtflag++;}void pswitch(int flag) {    extern int proxy, abrtflag;    Sig_t oldintr;    static struct comvars {	int connect;	char name[MAXHOSTNAMELEN];	struct sockaddr_in mctl;	struct sockaddr_in hctl;	FILE *in;	FILE *out;	int tpe;	int curtpe;	int cpnd;	int sunqe;	int runqe;	int mcse;	int ntflg;	char nti[17];	char nto[17];	int mapflg;	char mi[MAXPATHLEN];	char mo[MAXPATHLEN];    } proxstruct, tmpstruct;    struct comvars *ip, *op;    abrtflag = 0;    oldintr = Signal(SIGINT, psabort);    if (flag) {	if (proxy) return;	ip = &tmpstruct;	op = &proxstruct;	proxy++;    } else {	if (!proxy) return;	ip = &proxstruct;	op = &tmpstruct;	proxy = 0;    }    ip->connect = connected;    connected = op->connect;    if (hostname) {	strncpy(ip->name, hostname, sizeof(ip->name) - 1);	ip->name[strlen(ip->name)] = '\0';    } else {	ip->name[0] = '\0';    }    hostname = op->name;    ip->hctl = hisctladdr;    hisctladdr = op->hctl;    ip->mctl = myctladdr;    myctladdr = op->mctl;    ip->in = cin;    cin = op->in;    ip->out = cout;    cout = op->out;    ip->tpe = type;    type = op->tpe;    ip->curtpe = curtype;    curtype = op->curtpe;    ip->cpnd = cpend;    cpend = op->cpnd;    ip->sunqe = sunique;    sunique = op->sunqe;    ip->runqe = runique;    runique = op->runqe;    ip->mcse = mcase;    mcase = op->mcse;    ip->ntflg = ntflag;    ntflag = op->ntflg;    strncpy(ip->nti, ntin, 16);    (ip->nti)[strlen(ip->nti)] = '\0';    strcpy(ntin, op->nti);    strncpy(ip->nto, ntout, 16);    (ip->nto)[strlen(ip->nto)] = '\0';    strcpy(ntout, op->nto);    ip->mapflg = mapflag;    mapflag = op->mapflg;    strncpy(ip->mi, mapin, MAXPATHLEN - 1);    (ip->mi)[strlen(ip->mi)] = '\0';    strcpy(mapin, op->mi);    strncpy(ip->mo, mapout, MAXPATHLEN - 1);    (ip->mo)[strlen(ip->mo)] = '\0';    strcpy(mapout, op->mo);    Signal(SIGINT, oldintr);    if (abrtflag) {	abrtflag = 0;	kill(getpid(),SIGINT);    }}void abortpt() {    printf("\n");    fflush(stdout);    ptabflg++;    mflag    = 0;    abrtflag = 0;    longjmp(ptabort, 1);}void reset() {    fd_set mask;    int nfnd = 1;        FD_ZERO(&mask);    while (nfnd > 0) {	FD_SET(fileno(cin), &mask);	if ((nfnd = empty(&mask,0)) < 0) {	    perror("reset");	    code = -1;	    lostpeer();	} else if (nfnd) {	    getreply(0);	}    }}char *gunique(char *local) {    static char new[MAXPATHLEN];    char *cp = rindex(local, '/');    int d, count=0;    char ext = '1';    if (cp) *cp = '\0';    d = access(cp ? local : ".", 2);    if (cp) *cp = '/';    if (d < 0) {	fprintf(stderr, "local: %s: %s\n", local, strerror(errno));	return((char *) 0);    }        strcpy(new, local);    cp = new + strlen(new);    *cp++ = '.';    while (!d) {	if (++count == 100) {	    printf("runique: can't find unique file name.\n");	    return((char *) 0);	}	*cp++ = ext;	*cp = '\0';	if (ext == '9') ext = '0';	else            ext++;	if ((d = access(new, 0)) < 0) break;	if (ext != '0') cp--;	else if (*(cp - 2) == '.') *(cp - 1) = '1';	else {	    *(cp - 2) = *(cp - 2) + 1;	    cp--;	}    }    return(new);}

⌨️ 快捷键说明

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