📄 ftp.c
字号:
} 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 + -