Annotation of researchv10no/ipc/bin/ftp/ftp.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <errno.h>
                      3: #include <fcntl.h>
                      4: #include <pwd.h>
                      5: #include <varargs.h>
                      6: #include <string.h>
                      7: #include <sys/types.h>
                      8: #include <sys/stat.h>
                      9: #include <ipc.h>
                     10: #include <sys/inet/in.h>
                     11: #include <sys/inet/tcp.h>
                     12: 
                     13: 
                     14: #include "ftp.h"
                     15: #include "telnet.h"
                     16: #include "ftp_var.h"
                     17: 
                     18: int    data = -1;
                     19: int    abrtflag = 0;
                     20: int    ptflag = 0;
                     21: int    connected;
                     22: int    getuid();
                     23: 
                     24: in_addr myaddr;
                     25: tcp_port dataport;
                     26: char *mynetname;
                     27: char *mymachname;
                     28: 
                     29: FILE   *cin, *cout;
                     30: FILE   *dataconn();
                     31: 
                     32: char *
                     33: hookup(host)
                     34:        char *host;
                     35: {
                     36:        int s;
                     37:        char *fields[4];
                     38:        static char myname[128];
                     39: 
                     40:        s = ipcopen(ipcpath(host, "tcp", "ftp"), "light");
                     41:        if (s < 0) {
                     42:                fprintf(stderr, "%s opening connection to %s\n", errstr, host);
                     43:                goto bad;
                     44:        }
                     45:        strcpy(myname, ipcname);
                     46:        setfields("!");
                     47:        getmfields(myname, fields, 4);
                     48:        mynetname = fields[0];
                     49:        mymachname = fields[1];
                     50:        myaddr = in_aton(mymachname);
                     51:        hostname = host;
                     52: 
                     53:        cin = fdopen(s, "r");
                     54:        cout = fdopen(s, "w");
                     55:        if (cin == NULL || cout == NULL) {
                     56:                fprintf(stderr, "ftp: fdopen failed.\n");
                     57:                if (cin)
                     58:                        (void) fclose(cin);
                     59:                if (cout)
                     60:                        (void) fclose(cout);
                     61:                code = -1;
                     62:                goto bad;
                     63:        }
                     64:        if (verbose)
                     65:                printf("Connected to %s.\n", hostname);
                     66:        if (getreply(0) > 2) {  /* read startup message from server */
                     67:                if (cin)
                     68:                        (void) fclose(cin);
                     69:                if (cout)
                     70:                        (void) fclose(cout);
                     71:                code = -1;
                     72:                goto bad;
                     73:        }
                     74:        return (hostname);
                     75: 
                     76: bad:
                     77:        (void) close(s);
                     78:        return ((char *)0);
                     79: }
                     80: 
                     81: login(host)
                     82:        char *host;
                     83: {
                     84:        char tmp[80];
                     85:        char *user, *pass, *acct, *getlogin(), *getpass();
                     86:        int n, aflag = 0;
                     87: 
                     88:        user = pass = acct = 0;
                     89:        if (ruserpass(host, &user, &pass, &acct) < 0) {
                     90:                code = -1;
                     91:                return(0);
                     92:        }
                     93:        if (user == NULL) {
                     94:                char *myname = getlogin();
                     95: 
                     96:                if (myname == NULL) {
                     97:                        struct passwd *pp = getpwuid(getuid());
                     98: 
                     99:                        if (pp != NULL)
                    100:                                myname = pp->pw_name;
                    101:                }
                    102:                printf("Name (%s:%s): ", host, myname);
                    103:                (void) fgets(tmp, sizeof(tmp) - 1, stdin);
                    104:                tmp[strlen(tmp) - 1] = '\0';
                    105:                if (*tmp == '\0')
                    106:                        user = myname;
                    107:                else
                    108:                        user = tmp;
                    109:        }
                    110:        n = command("USER %s", user);
                    111:        if (n == CONTINUE) {
                    112:                if (pass == NULL)
                    113:                        pass = getpass("Password:");
                    114:                n = command("PASS %s", pass);
                    115:        }
                    116:        if (n == CONTINUE) {
                    117:                aflag++;
                    118:                acct = getpass("Account:");
                    119:                n = command("ACCT %s", acct);
                    120:        }
                    121:        if (n != COMPLETE) {
                    122:                fprintf(stderr, "Login failed.\n");
                    123:                return (0);
                    124:        }
                    125:        if (!aflag && acct != NULL)
                    126:                (void) command("ACCT %s", acct);
                    127:        if (proxy)
                    128:                return(1);
                    129:        for (n = 0; n < macnum; ++n) {
                    130:                if (!strcmp("init", macros[n].mac_name)) {
                    131:                        (void) strcpy(line, "$init");
                    132:                        makeargv();
                    133:                        domacro(margc, margv);
                    134:                        break;
                    135:                }
                    136:        }
                    137:        return (1);
                    138: }
                    139: 
                    140: /*VARARGS1*/
                    141: command(fmt, va_alist)
                    142:        char *fmt;
                    143:        va_dcl
                    144: {
                    145:        int r;
                    146:        va_list ap;
                    147: 
                    148:        va_start(ap);
                    149:        if (debug) {
                    150:                printf("---> ");
                    151:                _doprnt(fmt, ap, stdout);
                    152:                printf("\n");
                    153:                (void) fflush(stdout);
                    154:        }
                    155:        if (cout == NULL) {
                    156:                perror ("No control connection for command");
                    157:                code = -1;
                    158:                return (0);
                    159:        }
                    160:        _doprnt(fmt, ap, cout);
                    161:        fprintf(cout, "\r\n");
                    162:        (void) fflush(cout);
                    163:        va_end(ap);
                    164:        cpend = 1;
                    165:        r = getreply(!strcmp(fmt, "QUIT"));
                    166:        return(r);
                    167: }
                    168: 
                    169: char reply_string[BUFSIZ];
                    170: 
                    171: #include <ctype.h>
                    172: 
                    173: getreply(expecteof)
                    174:        int expecteof;
                    175: {
                    176:        register int c, n;
                    177:        register int dig;
                    178:        register char *cp;
                    179:        int originalcode = 0, continuation = 0;
                    180:        int pflag = 0;
                    181:        char *pt = pasv;
                    182: 
                    183:        cp = reply_string;
                    184:        for (;;) {
                    185:                dig = n = code = 0;
                    186:                while ((c = getc(cin)) != '\n') {
                    187:                        if (c == IAC) {     /* handle telnet commands */
                    188:                                switch (c = getc(cin)) {
                    189:                                case WILL:
                    190:                                case WONT:
                    191:                                        c = getc(cin);
                    192:                                        fprintf(cout, "%c%c%c",IAC,DONT,c);
                    193:                                        (void) fflush(cout);
                    194:                                        break;
                    195:                                case DO:
                    196:                                case DONT:
                    197:                                        c = getc(cin);
                    198:                                        fprintf(cout, "%c%c%c",IAC,WONT,c);
                    199:                                        (void) fflush(cout);
                    200:                                        break;
                    201:                                default:
                    202:                                        break;
                    203:                                }
                    204:                                continue;
                    205:                        }
                    206:                        dig++;
                    207:                        if (c == EOF) {
                    208:                                if (expecteof) {
                    209:                                        code = 221;
                    210:                                        return (0);
                    211:                                }
                    212:                                lostpeer();
                    213:                                if (verbose) {
                    214:                                        printf("421 Service not available, remote server has closed connection\n");
                    215:                                        (void) fflush(stdout);
                    216:                                }
                    217:                                code = 421;
                    218:                                return(4);
                    219:                        }
                    220:                        if (c != '\r' && (verbose > 0 ||
                    221:                            (verbose > -1 && n == '5' && dig > 4))) {
                    222:                                if (proxflag &&
                    223:                                   (dig == 1 || dig == 5 && verbose == 0))
                    224:                                        printf("%s:",hostname);
                    225:                                (void) putchar(c);
                    226:                        }
                    227:                        if (dig < 4 && isdigit(c))
                    228:                                code = code * 10 + (c - '0');
                    229:                        if (!pflag && code == 227)
                    230:                                pflag = 1;
                    231:                        if (dig > 4 && pflag == 1 && isdigit(c))
                    232:                                pflag = 2;
                    233:                        if (pflag == 2) {
                    234:                                if (c != '\r' && c != ')')
                    235:                                        *pt++ = c;
                    236:                                else {
                    237:                                        *pt = '\0';
                    238:                                        pflag = 3;
                    239:                                }
                    240:                        }
                    241:                        if (dig == 4 && c == '-') {
                    242:                                if (continuation)
                    243:                                        code = 0;
                    244:                                continuation++;
                    245:                        }
                    246:                        if (n == 0)
                    247:                                n = c;
                    248:                        *cp++ = c;
                    249:                }
                    250:                if (verbose > 0 || verbose > -1 && n == '5') {
                    251:                        (void) putchar(c);
                    252:                        (void) fflush (stdout);
                    253:                }
                    254:                if (continuation && code != originalcode) {
                    255:                        if (originalcode == 0)
                    256:                                originalcode = code;
                    257:                        continue;
                    258:                }
                    259:                *cp = '\0';
                    260:                if (n != '1')
                    261:                        cpend = 0;
                    262:                if (code == 421 || originalcode == 421)
                    263:                        lostpeer();
                    264:                return (n - '0');
                    265:        }
                    266: }
                    267: 
                    268: empty(mask, sec)
                    269:        struct fd_set *mask;
                    270:        int sec;
                    271: {
                    272:        return(select(32, mask, (struct fd_set *) 0, 1000*sec));
                    273: }
                    274: 
                    275: #define HASHBYTES 4096
                    276: 
                    277: sendrequest(cmd, local, remote)
                    278:        char *cmd, *local, *remote;
                    279: {
                    280:        FILE *fin, *dout = 0, *popen();
                    281:        int (*closefunc)(), pclose(), fclose();
                    282:        char buf[BUFSIZ], *bufp;
                    283:        long bytes = 0, hashbytes = HASHBYTES;
                    284:        register int c, d;
                    285:        struct stat st;
                    286:        long start, stop;
                    287:        char *mode;
                    288: 
                    289:        if (proxy) {
                    290:                proxtrans(cmd, local, remote);
                    291:                return;
                    292:        }
                    293:        closefunc = NULL;
                    294:        mode = "w";
                    295:        if (strcmp(local, "-") == 0)
                    296:                fin = stdin;
                    297:        else if (*local == '|') {
                    298:                fin = popen(local + 1, "r");
                    299:                if (fin == NULL) {
                    300:                        perror(local + 1);
                    301:                        code = -1;
                    302:                        return;
                    303:                }
                    304:                closefunc = pclose;
                    305:        } else {
                    306:                fin = fopen(local, "r");
                    307:                if (fin == NULL) {
                    308:                        perror(local);
                    309:                        code = -1;
                    310:                        return;
                    311:                }
                    312:                closefunc = fclose;
                    313:                if (fstat(fileno(fin), &st) < 0 ||
                    314:                    (st.st_mode&S_IFMT) != S_IFREG) {
                    315:                        fprintf(stdout, "%s: not a plain file.\n", local);
                    316:                        fclose(fin);
                    317:                        code = -1;
                    318:                        return;
                    319:                }
                    320:        }
                    321:        if (initconn()) {
                    322:                code = -1;
                    323:                if (closefunc != NULL)
                    324:                        (*closefunc)(fin);
                    325:                return;
                    326:        }
                    327:        if (remote) {
                    328:                if (command("%s %s", cmd, remote) != PRELIM) {
                    329:                        if (closefunc != NULL)
                    330:                                (*closefunc)(fin);
                    331:                        return;
                    332:                }
                    333:        } else
                    334:                if (command("%s", cmd) != PRELIM) {
                    335:                        if (closefunc != NULL)
                    336:                                (*closefunc)(fin);
                    337:                        return;
                    338:                }
                    339:        dout = dataconn(mode);
                    340:        if (dout == NULL)
                    341:                goto abort;
                    342:        time(&start);
                    343:        switch (type) {
                    344: 
                    345:        case TYPE_I:
                    346:        case TYPE_L:
                    347:                errno = d = 0;
                    348:                while ((c = read(fileno(fin), buf, sizeof (buf))) > 0) {
                    349:                        bytes += c;
                    350:                        for (bufp = buf; c > 0; c -= d, bufp += d)
                    351:                                if ((d = write(fileno(dout), bufp, c)) <= 0)
                    352:                                        break;
                    353:                        if (hash) {
                    354:                                while (bytes >= hashbytes) {
                    355:                                        (void) putchar('#');
                    356:                                        hashbytes += HASHBYTES;
                    357:                                }
                    358:                                (void) fflush(stdout);
                    359:                        }
                    360:                }
                    361:                if (hash && bytes > 0) {
                    362:                        if (bytes < HASHBYTES)
                    363:                                (void) putchar('#');
                    364:                        (void) putchar('\n');
                    365:                        (void) fflush(stdout);
                    366:                }
                    367:                if (c < 0)
                    368:                        perror(local);
                    369:                if (d <= 0) {
                    370:                        if (d == 0)
                    371:                                fprintf(stderr, "netout: write returned 0?\n");
                    372:                        else if (errno != EPIPE) 
                    373:                                perror("netout");
                    374:                        bytes = -1;
                    375:                }
                    376:                break;
                    377: 
                    378:        case TYPE_A:
                    379:                while ((c = getc(fin)) != EOF) {
                    380:                        if (c == '\n') {
                    381:                                while (hash && (bytes >= hashbytes)) {
                    382:                                        (void) putchar('#');
                    383:                                        (void) fflush(stdout);
                    384:                                        hashbytes += HASHBYTES;
                    385:                                }
                    386:                                if (ferror(dout))
                    387:                                        break;
                    388:                                (void) putc('\r', dout);
                    389:                                bytes++;
                    390:                        }
                    391:                        (void) putc(c, dout);
                    392:                        bytes++;
                    393:        /*              if (c == '\r') {                                */
                    394:        /*              (void)  putc('\0', dout);  /* this violates rfc */
                    395:        /*                      bytes++;                                */
                    396:        /*              }                                               */      
                    397:                }
                    398:                if (hash) {
                    399:                        if (bytes < hashbytes)
                    400:                                (void) putchar('#');
                    401:                        (void) putchar('\n');
                    402:                        (void) fflush(stdout);
                    403:                }
                    404:                if (ferror(fin))
                    405:                        perror(local);
                    406:                if (ferror(dout)) {
                    407:                        if (errno != EPIPE)
                    408:                                perror("netout");
                    409:                        bytes = -1;
                    410:                }
                    411:                break;
                    412:        }
                    413:        time(&stop);
                    414:        if (closefunc != NULL)
                    415:                (*closefunc)(fin);
                    416:        /*
                    417:         * *** hack because linger call in ipc/tcpconnect
                    418:         *     doesn't seem to work:
                    419:         */
                    420:        sleep(5);
                    421:        (void) fclose(dout);
                    422:        (void) getreply(0);
                    423:        if (bytes > 0)
                    424:                ptransfer("sent", bytes, start, stop, local, remote);
                    425:        return;
                    426: abort:
                    427:        time(&stop);
                    428:        if (!cpend) {
                    429:                code = -1;
                    430:                return;
                    431:        }
                    432:        if (data >= 0) {
                    433:                (void) close(data);
                    434:                data = -1;
                    435:        }
                    436:        if (dout)
                    437:                (void) fclose(dout);
                    438:        (void) getreply(0);
                    439:        code = -1;
                    440:        if (closefunc != NULL && fin != NULL)
                    441:                (*closefunc)(fin);
                    442:        if (bytes > 0)
                    443:                ptransfer("sent", bytes, start, stop, local, remote);
                    444: }
                    445: 
                    446: recvrequest(cmd, local, remote, mode)
                    447:        char *cmd, *local, *remote, *mode;
                    448: {
                    449:        FILE *fout, *din = 0, *popen();
                    450:        int (*closefunc)(), pclose(), fclose();
                    451:        int oldverbose, oldtype = 0, is_retr, tcrflag, nfnd;
                    452:        char *bufp, *gunique(), msg;
                    453:        static char *buf;
                    454:        static int bufsize;
                    455:        long bytes = 0, hashbytes = HASHBYTES;
                    456:        struct fd_set mask;
                    457:        register int c, d;
                    458:        long start, stop;
                    459:        struct stat st;
                    460:        extern char *malloc();
                    461: 
                    462:        is_retr = strcmp(cmd, "RETR") == 0;
                    463:        if (proxy && is_retr) {
                    464:                proxtrans(cmd, local, remote);
                    465:                return;
                    466:        }
                    467:        closefunc = NULL;
                    468:        tcrflag = !crflag && is_retr;
                    469:        if (strcmp(local, "-") && *local != '|') {
                    470:                if (access(local, 2) < 0) {
                    471:                        char *dir = strrchr(local, '/');
                    472: 
                    473:                        if (errno != ENOENT && errno != EACCES) {
                    474:                                perror(local);
                    475:                                code = -1;
                    476:                                return;
                    477:                        }
                    478:                        if (dir != NULL)
                    479:                                *dir = 0;
                    480:                        d = access(dir ? local : ".", 2);
                    481:                        if (dir != NULL)
                    482:                                *dir = '/';
                    483:                        if (d < 0) {
                    484:                                perror(local);
                    485:                                code = -1;
                    486:                                return;
                    487:                        }
                    488:                        if (!runique && errno == EACCES &&
                    489:                            chmod(local, 0600) < 0) {
                    490:                                perror(local);
                    491:                                code = -1;
                    492:                                return;
                    493:                        }
                    494:                        if (runique && errno == EACCES &&
                    495:                           (local = gunique(local)) == NULL) {
                    496:                                code = -1;
                    497:                                return;
                    498:                        }
                    499:                }
                    500:                else if (runique && (local = gunique(local)) == NULL) {
                    501:                        code = -1;
                    502:                        return;
                    503:                }
                    504:        }
                    505:        if (initconn()) {
                    506:                code = -1;
                    507:                return;
                    508:        }
                    509:        if (!is_retr) {
                    510:                if (type != TYPE_A) {
                    511:                        oldtype = type;
                    512:                        oldverbose = verbose;
                    513:                        if (!debug)
                    514:                                verbose = 0;
                    515:                        setascii();
                    516:                        verbose = oldverbose;
                    517:                }
                    518:        }
                    519:        if (remote) {
                    520:                if (command("%s %s", cmd, remote) != PRELIM) {
                    521:                        if (oldtype) {
                    522:                                if (!debug)
                    523:                                        verbose = 0;
                    524:                                switch (oldtype) {
                    525:                                        case TYPE_I:
                    526:                                                setbinary();
                    527:                                                break;
                    528:                                        case TYPE_E:
                    529:                                                setebcdic();
                    530:                                                break;
                    531:                                        case TYPE_L:
                    532:                                                settenex();
                    533:                                                break;
                    534:                                }
                    535:                                verbose = oldverbose;
                    536:                        }
                    537:                        return;
                    538:                }
                    539:        } else {
                    540:                if (command("%s", cmd) != PRELIM) {
                    541:                        if (oldtype) {
                    542:                                if (!debug)
                    543:                                        verbose = 0;
                    544:                                switch (oldtype) {
                    545:                                        case TYPE_I:
                    546:                                                setbinary();
                    547:                                                break;
                    548:                                        case TYPE_E:
                    549:                                                setebcdic();
                    550:                                                break;
                    551:                                        case TYPE_L:
                    552:                                                settenex();
                    553:                                                break;
                    554:                                }
                    555:                                verbose = oldverbose;
                    556:                        }
                    557:                        return;
                    558:                }
                    559:        }
                    560:        din = dataconn("r");
                    561:        if (din == NULL)
                    562:                goto abt;
                    563:        if (strcmp(local, "-") == 0)
                    564:                fout = stdout;
                    565:        else if (*local == '|') {
                    566:                fout = popen(local + 1, "w");
                    567:                if (fout == NULL) {
                    568:                        perror(local+1);
                    569:                        goto abt;
                    570:                }
                    571:                closefunc = pclose;
                    572:        } else {
                    573:                fout = fopen(local, mode);
                    574:                if (fout == NULL) {
                    575:                        perror(local);
                    576:                        goto abt;
                    577:                }
                    578:                closefunc = fclose;
                    579:        }
                    580:        if (BUFSIZ > bufsize) {
                    581:                if (buf)
                    582:                        (void) free(buf);
                    583:                buf = malloc(BUFSIZ);
                    584:                if (buf == NULL) {
                    585:                        perror("malloc");
                    586:                        fprintf(stderr, "recvrequest: malloc failed...tell ches\n");
                    587:                        fflush(stderr);
                    588:                        abort();
                    589:                        bufsize = 0;
                    590:                        goto abt;
                    591:                }
                    592:                bufsize = BUFSIZ;
                    593:        }
                    594:        time(&start);
                    595:        switch (type) {
                    596: 
                    597:        case TYPE_I:
                    598:        case TYPE_L:
                    599:                errno = d = 0;
                    600:                while ((c = read(fileno(din), buf, bufsize)) > 0) {
                    601:                        if ((d = write(fileno(fout), buf, c)) != c)
                    602:                                break;
                    603:                        bytes += c;
                    604:                        if (hash) {
                    605:                                while (bytes >= hashbytes) {
                    606:                                        (void) putchar('#');
                    607:                                        hashbytes += HASHBYTES;
                    608:                                }
                    609:                                (void) fflush(stdout);
                    610:                        }
                    611:                }
                    612:                if (hash && bytes > 0) {
                    613:                        if (bytes < HASHBYTES)
                    614:                                (void) putchar('#');
                    615:                        (void) putchar('\n');
                    616:                        (void) fflush(stdout);
                    617:                }
                    618:                if (c < 0) {
                    619:                        if (errno != EPIPE)
                    620:                                perror("netin1");
                    621:                        bytes = -1;
                    622:                }
                    623:                if (d < c) {
                    624:                        if (d < 0)
                    625:                                perror(local);
                    626:                        else
                    627:                                fprintf(stderr, "%s: short write\n", local);
                    628:                }
                    629:                break;
                    630: 
                    631:        case TYPE_A:
                    632:                while ((c = getc(din)) != EOF) {
                    633:                        while (c == '\r') {
                    634:                                while (hash && (bytes >= hashbytes)) {
                    635:                                        (void) putchar('#');
                    636:                                        (void) fflush(stdout);
                    637:                                        hashbytes += HASHBYTES;
                    638:                                }
                    639:                                bytes++;
                    640:                                if ((c = getc(din)) != '\n' || tcrflag) {
                    641:                                        if (ferror(fout))
                    642:                                                goto break2;
                    643:                                        (void) putc('\r', fout);
                    644:                                        if (c == '\0') {
                    645:                                                bytes++;
                    646:                                                goto contin2;
                    647:                                        }
                    648:                                        if (c == EOF)
                    649:                                                goto contin2;
                    650:                                }
                    651:                        }
                    652:                        (void) putc(c, fout);
                    653:                        bytes++;
                    654:        contin2:        ;
                    655:                }
                    656: break2:
                    657:                if (hash) {
                    658:                        if (bytes < hashbytes)
                    659:                                (void) putchar('#');
                    660:                        (void) putchar('\n');
                    661:                        (void) fflush(stdout);
                    662:                }
                    663:                if (ferror(din)) {
                    664:                        if (errno != EPIPE)
                    665:                                perror("netin2");
                    666:                        bytes = -1;
                    667:                }
                    668:                if (ferror(fout))
                    669:                        perror(local);
                    670:                break;
                    671:        }
                    672:        if (closefunc != NULL)
                    673:                (*closefunc)(fout);
                    674:        time(&stop);
                    675:        (void) fclose(din);
                    676:        (void) getreply(0);
                    677:        if (bytes > 0 && is_retr)
                    678:                ptransfer("received", bytes, start, stop, local, remote);
                    679:        if (oldtype) {
                    680:                if (!debug)
                    681:                        verbose = 0;
                    682:                switch (oldtype) {
                    683:                        case TYPE_I:
                    684:                                setbinary();
                    685:                                break;
                    686:                        case TYPE_E:
                    687:                                setebcdic();
                    688:                                break;
                    689:                        case TYPE_L:
                    690:                                settenex();
                    691:                                break;
                    692:                }
                    693:                verbose = oldverbose;
                    694:        }
                    695:        return;
                    696: abt:
                    697: 
                    698: /* abt using RFC959 recommended IP,SYNC sequence  */
                    699: 
                    700:        time(&stop);
                    701:        if (oldtype) {
                    702:                if (!debug)
                    703:                        verbose = 0;
                    704:                switch (oldtype) {
                    705:                        case TYPE_I:
                    706:                                setbinary();
                    707:                                break;
                    708:                        case TYPE_E:
                    709:                                setebcdic();
                    710:                                break;
                    711:                        case TYPE_L:
                    712:                                settenex();
                    713:                                break;
                    714:                }
                    715:                verbose = oldverbose;
                    716:        }
                    717:        if (!cpend) {
                    718:                code = -1;
                    719:                return;
                    720:        }
                    721: 
                    722:        fprintf(cout,"%c%c",IAC,IP);
                    723:        (void) fflush(cout); 
                    724:        msg = IAC;
                    725: #ifdef STUB
                    726: /* send IAC in urgent mode instead of DM because UNIX places oob mark */
                    727: /* after urgent byte rather than before as now is protocol            */
                    728:        if (sendurgent(fileno(cout),&msg,1) != 1) {
                    729:                perror("abt");
                    730:        }
                    731:        fprintf(cout,"%cABOR\r\n",DM);
                    732: #endif
                    733:        fprintf(cout,"ABOR\r\n");
                    734:        (void) fflush(cout);
                    735:        FD_ZERO(mask);
                    736:        FD_SET(fileno(cin), mask);
                    737:        if (din) { 
                    738:                FD_SET(fileno(din), mask);
                    739:        }
                    740:        if ((nfnd = empty(&mask,10)) <= 0) {
                    741:                if (nfnd < 0) {
                    742:                        perror("abt");
                    743:                }
                    744:                code = -1;
                    745:                lostpeer();
                    746:        }
                    747:        if (din && FD_ISSET(fileno(din), mask)) {
                    748:                while ((c = read(fileno(din), buf, bufsize)) > 0)
                    749:                        ;
                    750:        }
                    751:        if ((c = getreply(0)) == ERROR && code == 552) { /* needed for nic style abt */
                    752:                if (data >= 0) {
                    753:                        (void) close(data);
                    754:                        data = -1;
                    755:                }
                    756:                (void) getreply(0);
                    757:        }
                    758:        (void) getreply(0);
                    759:        code = -1;
                    760:        if (data >= 0) {
                    761:                (void) close(data);
                    762:                data = -1;
                    763:        }
                    764:        if (closefunc != NULL && fout != NULL)
                    765:                (*closefunc)(fout);
                    766:        if (din)
                    767:                (void) fclose(din);
                    768:        if (bytes > 0)
                    769:                ptransfer("received", bytes, start, stop, local, remote);
                    770: }
                    771: 
                    772: /*
                    773:  * Need to start a listen on the data channel
                    774:  * before we send the command, otherwise the
                    775:  * server's connect may fail.
                    776:  */
                    777: 
                    778: initconn()
                    779: {
                    780:        int result;
                    781:        char *a, *p;
                    782:        char *fields[4];
                    783:        char myname[128];
                    784:        in_addr hostorderaddr;
                    785:        tcp_port hostorderport;
                    786: 
                    787:        /*
                    788:         *  network = mynetname
                    789:         *  host name = mymachname
                    790:         *  port = *
                    791:         */
                    792:        a = ipcpath(mymachname, mynetname, "*");
                    793:        data = ipccreat(a, "heavy");
                    794:        if(data<0) {
                    795:                fprintf(stderr, "ftp: %s creating data connection\n", errstr);
                    796:                return(1);
                    797:        }
                    798:        strcpy(myname, ipcname);
                    799:        setfields("!");
                    800:        getmfields(myname, fields, 4);
                    801:        dataport = atoi(fields[2]);
                    802:        hostorderport = htons(dataport);
                    803:        hostorderaddr = htonl(myaddr);
                    804:        p = (char *)&hostorderport;
                    805:        a = (char *)&hostorderaddr;
                    806: #define        UC(b)   (((int)b)&0xff)
                    807:        result =
                    808:            command("PORT %d,%d,%d,%d,%d,%d",
                    809:              UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),
                    810:              UC(p[0]), UC(p[1]));
                    811:        return (result != COMPLETE);
                    812: }
                    813: 
                    814: 
                    815: FILE *
                    816: dataconn(mode)
                    817:        char *mode;
                    818: {
                    819:        int s;
                    820:        ipcinfo *ip;
                    821: 
                    822:        ip = ipclisten(data);
                    823:        if (ip == NULL) {
                    824:                perror("ftp: listen");
                    825:                (void) close(data), data = -1;
                    826:                return (NULL);
                    827:        }
                    828:        s = ipcaccept(ip);
                    829:        (void) close(data);
                    830:        data = s;
                    831:        return (fdopen(data, mode));
                    832: }
                    833: 
                    834: ptransfer(direction, bytes, t0, t1, local, remote)
                    835:        char *direction, *local, *remote;
                    836:        long bytes;
                    837:        long t0, t1;
                    838: {
                    839:        long td;
                    840:        float s;
                    841:        int bs;
                    842: 
                    843:        if (verbose) {
                    844:                td = t1 - t0;
                    845: #define        nz(x)   ((x) == 0 ? 1 : (x))
                    846:                bs = bytes / nz(td);
                    847:                printf("%ld bytes %s in %d seconds (%d bytes/s)\n",
                    848:                    bytes, direction, td, bs);
                    849:        } else {
                    850:                if (local && *local != '-')
                    851:                        printf("local: %s ", local);
                    852:                if (remote)
                    853:                        printf("remote: %s\n", remote);
                    854:        }
                    855: }
                    856: 
                    857: psabort()
                    858: {
                    859:        extern int abrtflag;
                    860: 
                    861:        abrtflag++;
                    862: }
                    863: 
                    864: pswitch(flag)
                    865:        int flag;
                    866: {
                    867:        extern int proxy, abrtflag;
                    868:        static struct comvars {
                    869:                int connect;
                    870:                char name[MAXHOSTNAMELEN];
                    871:                FILE *in;
                    872:                FILE *out;
                    873:                int tpe;
                    874:                int cpnd;
                    875:                int sunqe;
                    876:                int runqe;
                    877:                int mcse;
                    878:                int ntflg;
                    879:                char nti[17];
                    880:                char nto[17];
                    881:                int mapflg;
                    882:                char mi[MAXPATHLEN];
                    883:                char mo[MAXPATHLEN];
                    884:                } proxstruct, tmpstruct;
                    885:        struct comvars *ip, *op;
                    886: 
                    887:        abrtflag = 0;
                    888:        if (flag) {
                    889:                if (proxy)
                    890:                        return;
                    891:                ip = &tmpstruct;
                    892:                op = &proxstruct;
                    893:                proxy++;
                    894:        }
                    895:        else {
                    896:                if (!proxy)
                    897:                        return;
                    898:                ip = &proxstruct;
                    899:                op = &tmpstruct;
                    900:                proxy = 0;
                    901:        }
                    902:        ip->connect = connected;
                    903:        connected = op->connect;
                    904:        if (hostname) {
                    905:                (void) strncpy(ip->name, hostname, sizeof(ip->name) - 1);
                    906:                ip->name[strlen(ip->name)] = '\0';
                    907:        } else
                    908:                ip->name[0] = 0;
                    909:        hostname = op->name;
                    910: #ifdef REMOVE
                    911:        ip->hctl = hisctladdr;
                    912:        hisctladdr = op->hctl;
                    913:        ip->mctl = myctladdr;
                    914:        myctladdr = op->mctl;
                    915: #endif
                    916:        ip->in = cin;
                    917:        cin = op->in;
                    918:        ip->out = cout;
                    919:        cout = op->out;
                    920:        ip->tpe = type;
                    921:        type = op->tpe;
                    922:        if (!type)
                    923:                type = 1;
                    924:        ip->cpnd = cpend;
                    925:        cpend = op->cpnd;
                    926:        ip->sunqe = sunique;
                    927:        sunique = op->sunqe;
                    928:        ip->runqe = runique;
                    929:        runique = op->runqe;
                    930:        ip->mcse = mcase;
                    931:        mcase = op->mcse;
                    932:        ip->ntflg = ntflag;
                    933:        ntflag = op->ntflg;
                    934:        (void) strncpy(ip->nti, ntin, 16);
                    935:        (ip->nti)[strlen(ip->nti)] = '\0';
                    936:        (void) strcpy(ntin, op->nti);
                    937:        (void) strncpy(ip->nto, ntout, 16);
                    938:        (ip->nto)[strlen(ip->nto)] = '\0';
                    939:        (void) strcpy(ntout, op->nto);
                    940:        ip->mapflg = mapflag;
                    941:        mapflag = op->mapflg;
                    942:        (void) strncpy(ip->mi, mapin, MAXPATHLEN - 1);
                    943:        (ip->mi)[strlen(ip->mi)] = '\0';
                    944:        (void) strcpy(mapin, op->mi);
                    945:        (void) strncpy(ip->mo, mapout, MAXPATHLEN - 1);
                    946:        (ip->mo)[strlen(ip->mo)] = '\0';
                    947:        (void) strcpy(mapout, op->mo);
                    948: }
                    949: 
                    950: int ptabflg;
                    951: 
                    952: proxtrans(cmd, local, remote)
                    953:        char *cmd, *local, *remote;
                    954: {
                    955:        int tmptype, oldtype = 0, secndflag = 0, nfnd;
                    956:        char *cmd2;
                    957:        struct fd_set mask;
                    958: 
                    959:        if (strcmp(cmd, "RETR"))
                    960:                cmd2 = "RETR";
                    961:        else
                    962:                cmd2 = runique ? "STOU" : "STOR";
                    963:        if (command("PASV") != COMPLETE) {
                    964:                printf("proxy server does not support third part transfers.\n");
                    965:                return;
                    966:        }
                    967:        tmptype = type;
                    968:        pswitch(0);
                    969:        if (!connected) {
                    970:                printf("No primary connection\n");
                    971:                pswitch(1);
                    972:                code = -1;
                    973:                return;
                    974:        }
                    975:        if (type != tmptype) {
                    976:                oldtype = type;
                    977:                switch (tmptype) {
                    978:                        case TYPE_A:
                    979:                                setascii();
                    980:                                break;
                    981:                        case TYPE_I:
                    982:                                setbinary();
                    983:                                break;
                    984:                        case TYPE_E:
                    985:                                setebcdic();
                    986:                                break;
                    987:                        case TYPE_L:
                    988:                                settenex();
                    989:                                break;
                    990:                }
                    991:        }
                    992:        if (command("PORT %s", pasv) != COMPLETE) {
                    993:                switch (oldtype) {
                    994:                        case 0:
                    995:                                break;
                    996:                        case TYPE_A:
                    997:                                setascii();
                    998:                                break;
                    999:                        case TYPE_I:
                   1000:                                setbinary();
                   1001:                                break;
                   1002:                        case TYPE_E:
                   1003:                                setebcdic();
                   1004:                                break;
                   1005:                        case TYPE_L:
                   1006:                                settenex();
                   1007:                                break;
                   1008:                }
                   1009:                pswitch(1);
                   1010:                return;
                   1011:        }
                   1012:        if (command("%s %s", cmd, remote) != PRELIM) {
                   1013:                switch (oldtype) {
                   1014:                        case 0:
                   1015:                                break;
                   1016:                        case TYPE_A:
                   1017:                                setascii();
                   1018:                                break;
                   1019:                        case TYPE_I:
                   1020:                                setbinary();
                   1021:                                break;
                   1022:                        case TYPE_E:
                   1023:                                setebcdic();
                   1024:                                break;
                   1025:                        case TYPE_L:
                   1026:                                settenex();
                   1027:                                break;
                   1028:                }
                   1029:                pswitch(1);
                   1030:                return;
                   1031:        }
                   1032:        sleep(2);
                   1033:        pswitch(1);
                   1034:        secndflag++;
                   1035:        if (command("%s %s", cmd2, local) != PRELIM)
                   1036:                goto abort;
                   1037:        ptflag++;
                   1038:        (void) getreply(0);
                   1039:        pswitch(0);
                   1040:        (void) getreply(0);
                   1041:        switch (oldtype) {
                   1042:                case 0:
                   1043:                        break;
                   1044:                case TYPE_A:
                   1045:                        setascii();
                   1046:                        break;
                   1047:                case TYPE_I:
                   1048:                        setbinary();
                   1049:                        break;
                   1050:                case TYPE_E:
                   1051:                        setebcdic();
                   1052:                        break;
                   1053:                case TYPE_L:
                   1054:                        settenex();
                   1055:                        break;
                   1056:        }
                   1057:        pswitch(1);
                   1058:        ptflag = 0;
                   1059:        printf("local: %s remote: %s\n", local, remote);
                   1060:        return;
                   1061: abort:
                   1062:        ptflag = 0;
                   1063:        if (strcmp(cmd, "RETR") && !proxy)
                   1064:                pswitch(1);
                   1065:        else if (!strcmp(cmd, "RETR") && proxy)
                   1066:                pswitch(0);
                   1067:        if (!cpend && !secndflag) {  /* only here if cmd = "STOR" (proxy=1) */
                   1068:                if (command("%s %s", cmd2, local) != PRELIM) {
                   1069:                        pswitch(0);
                   1070:                        switch (oldtype) {
                   1071:                                case 0:
                   1072:                                        break;
                   1073:                                case TYPE_A:
                   1074:                                        setascii();
                   1075:                                        break;
                   1076:                                case TYPE_I:
                   1077:                                        setbinary();
                   1078:                                        break;
                   1079:                                case TYPE_E:
                   1080:                                        setebcdic();
                   1081:                                        break;
                   1082:                                case TYPE_L:
                   1083:                                        settenex();
                   1084:                                        break;
                   1085:                        }
                   1086:                        if (cpend) {
                   1087:                                char msg[2];
                   1088: 
                   1089:                                fprintf(cout,"%c%c",IAC,IP);
                   1090:                                (void) fflush(cout); 
                   1091:                                *msg = IAC;
                   1092:                                *(msg+1) = DM;
                   1093: #ifdef STUB
                   1094: #ifdef OLD
                   1095:                                if (send(fileno(cout),msg,2,MSG_OOB) != 2)
                   1096:                                        perror("abort");
                   1097: #else
                   1098:                                if (sendurgent(fileno(cout),msg,2) != 2)
                   1099:                                        perror("abort");
                   1100: #endif
                   1101: #endif
                   1102:                                fprintf(cout,"ABOR\r\n");
                   1103:                                (void) fflush(cout);
                   1104:                                FD_ZERO(mask);
                   1105:                                FD_SET(fileno(cin), mask);
                   1106:                                if ((nfnd = empty(&mask,10)) <= 0) {
                   1107:                                        if (nfnd < 0) {
                   1108:                                                perror("abort");
                   1109:                                        }
                   1110:                                        if (ptabflg)
                   1111:                                                code = -1;
                   1112:                                        lostpeer();
                   1113:                                }
                   1114:                                (void) getreply(0);
                   1115:                                (void) getreply(0);
                   1116:                        }
                   1117:                }
                   1118:                pswitch(1);
                   1119:                if (ptabflg)
                   1120:                        code = -1;
                   1121:                return;
                   1122:        }
                   1123:        if (cpend) {
                   1124:                char msg[2];
                   1125: 
                   1126:                fprintf(cout,"%c%c",IAC,IP);
                   1127:                (void) fflush(cout); 
                   1128: #ifdef STUB
                   1129:                *msg = IAC;
                   1130:                *(msg+1) = DM;
                   1131:                if (sendurgent(fileno(cout),msg,2) != 2)
                   1132:                        perror("abort");
                   1133: #endif
                   1134:                fprintf(cout,"ABOR\r\n");
                   1135:                (void) fflush(cout);
                   1136:                FD_ZERO(mask);
                   1137:                FD_SET(fileno(cin), mask);
                   1138:                if ((nfnd = empty(&mask,10)) <= 0) {
                   1139:                        if (nfnd < 0) {
                   1140:                                perror("abort");
                   1141:                        }
                   1142:                        if (ptabflg)
                   1143:                                code = -1;
                   1144:                        lostpeer();
                   1145:                }
                   1146:                (void) getreply(0);
                   1147:                (void) getreply(0);
                   1148:        }
                   1149:        pswitch(!proxy);
                   1150:        if (!cpend && !secndflag) {  /* only if cmd = "RETR" (proxy=1) */
                   1151:                if (command("%s %s", cmd2, local) != PRELIM) {
                   1152:                        pswitch(0);
                   1153:                        switch (oldtype) {
                   1154:                                case 0:
                   1155:                                        break;
                   1156:                                case TYPE_A:
                   1157:                                        setascii();
                   1158:                                        break;
                   1159:                                case TYPE_I:
                   1160:                                        setbinary();
                   1161:                                        break;
                   1162:                                case TYPE_E:
                   1163:                                        setebcdic();
                   1164:                                        break;
                   1165:                                case TYPE_L:
                   1166:                                        settenex();
                   1167:                                        break;
                   1168:                        }
                   1169:                        if (cpend) {
                   1170:                                char msg[2];
                   1171: 
                   1172:                                fprintf(cout,"%c%c",IAC,IP);
                   1173:                                (void) fflush(cout); 
                   1174: #ifdef STUB
                   1175:                                *msg = IAC;
                   1176:                                *(msg+1) = DM;
                   1177:                                if (sendurgent(fileno(cout),msg,2) != 2)
                   1178:                                        perror("abort");
                   1179: #endif
                   1180:                                fprintf(cout,"ABOR\r\n");
                   1181:                                (void) fflush(cout);
                   1182:                                FD_ZERO(mask);
                   1183:                                FD_SET(fileno(cin), mask);
                   1184:                                if ((nfnd = empty(&mask,10)) <= 0) {
                   1185:                                        if (nfnd < 0) {
                   1186:                                                perror("abort");
                   1187:                                        }
                   1188:                                        if (ptabflg)
                   1189:                                                code = -1;
                   1190:                                        lostpeer();
                   1191:                                }
                   1192:                                (void) getreply(0);
                   1193:                                (void) getreply(0);
                   1194:                        }
                   1195:                        pswitch(1);
                   1196:                        if (ptabflg)
                   1197:                                code = -1;
                   1198:                        return;
                   1199:                }
                   1200:        }
                   1201:        if (cpend) {
                   1202:                char msg[2];
                   1203: 
                   1204:                fprintf(cout,"%c%c",IAC,IP);
                   1205:                (void) fflush(cout); 
                   1206: #ifdef STUB
                   1207:                *msg = IAC;
                   1208:                *(msg+1) = DM;
                   1209:                if (sendurgent(fileno(cout),msg,2) != 2)
                   1210:                        perror("abort");
                   1211: #endif
                   1212:                fprintf(cout,"ABOR\r\n");
                   1213:                (void) fflush(cout);
                   1214:                FD_ZERO(mask);
                   1215:                FD_SET(fileno(cin), mask);
                   1216:                if ((nfnd = empty(&mask,10)) <= 0) {
                   1217:                        if (nfnd < 0) {
                   1218:                                perror("abort");
                   1219:                        }
                   1220:                        if (ptabflg)
                   1221:                                code = -1;
                   1222:                        lostpeer();
                   1223:                }
                   1224:                (void) getreply(0);
                   1225:                (void) getreply(0);
                   1226:        }
                   1227:        pswitch(!proxy);
                   1228:        if (cpend) {
                   1229:                FD_ZERO(mask);
                   1230:                FD_SET(fileno(cin), mask);
                   1231:                if ((nfnd = empty(&mask,10)) <= 0) {
                   1232:                        if (nfnd < 0) {
                   1233:                                perror("abort");
                   1234:                        }
                   1235:                        if (ptabflg)
                   1236:                                code = -1;
                   1237:                        lostpeer();
                   1238:                }
                   1239:                (void) getreply(0);
                   1240:                (void) getreply(0);
                   1241:        }
                   1242:        if (proxy)
                   1243:                pswitch(0);
                   1244:        switch (oldtype) {
                   1245:                case 0:
                   1246:                        break;
                   1247:                case TYPE_A:
                   1248:                        setascii();
                   1249:                        break;
                   1250:                case TYPE_I:
                   1251:                        setbinary();
                   1252:                        break;
                   1253:                case TYPE_E:
                   1254:                        setebcdic();
                   1255:                        break;
                   1256:                case TYPE_L:
                   1257:                        settenex();
                   1258:                        break;
                   1259:        }
                   1260:        pswitch(1);
                   1261:        if (ptabflg)
                   1262:                code = -1;
                   1263: }
                   1264: 
                   1265: reset()
                   1266: {
                   1267:        struct fd_set mask;
                   1268:        int nfnd = 1;
                   1269: 
                   1270:        FD_ZERO(mask);
                   1271:        while (nfnd > 0) {
                   1272:                FD_SET(fileno(cin), mask);
                   1273:                if ((nfnd = empty(&mask,0)) < 0) {
                   1274:                        perror("reset");
                   1275:                        code = -1;
                   1276:                        lostpeer();
                   1277:                }
                   1278:                else if (nfnd) {
                   1279:                        (void) getreply(0);
                   1280:                }
                   1281:        }
                   1282: }
                   1283: 
                   1284: char *
                   1285: gunique(local)
                   1286:        char *local;
                   1287: {
                   1288:        static char new[MAXPATHLEN];
                   1289:        char *cp = strrchr(local, '/');
                   1290:        int d, count=0;
                   1291:        char ext = '1';
                   1292: 
                   1293:        if (cp)
                   1294:                *cp = '\0';
                   1295:        d = access(cp ? local : ".", 2);
                   1296:        if (cp)
                   1297:                *cp = '/';
                   1298:        if (d < 0) {
                   1299:                perror(local);
                   1300:                return((char *) 0);
                   1301:        }
                   1302:        (void) strcpy(new, local);
                   1303:        cp = new + strlen(new);
                   1304:        *cp++ = '.';
                   1305:        while (!d) {
                   1306:                if (++count == 100) {
                   1307:                        printf("runique: can't find unique file name.\n");
                   1308:                        return((char *) 0);
                   1309:                }
                   1310:                *cp++ = ext;
                   1311:                *cp = '\0';
                   1312:                if (ext == '9')
                   1313:                        ext = '0';
                   1314:                else
                   1315:                        ext++;
                   1316:                if ((d = access(new, 0)) < 0)
                   1317:                        break;
                   1318:                if (ext != '0')
                   1319:                        cp--;
                   1320:                else if (*(cp - 2) == '.')
                   1321:                        *(cp - 1) = '1';
                   1322:                else {
                   1323:                        *(cp - 2) = *(cp - 2) + 1;
                   1324:                        cp--;
                   1325:                }
                   1326:        }
                   1327:        return(new);
                   1328: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.