Annotation of 43BSDTahoe/old/cpnull.c, revision 1.1.1.1

1.1       root        1: /* @(#)cpnull.c        4.1 82/03/05 */
                      2: 
                      3: #include <stdio.h>
                      4: #include <signal.h>
                      5: #include <sys/types.h>
                      6: #include <stat.h>
                      7: #include <wellknown.h>
                      8: #include <sys/ioctl.h>
                      9: #include <net/in.h>
                     10: /*
                     11:  * cpnull machine blocks
                     12:  */
                     13: int    rem;
                     14: char   *index(), *rindex(), *malloc();
                     15: int    errs;
                     16: int    broken();
                     17: int    lostconn();
                     18: 
                     19: int    errno;
                     20: char   sys_errlist[];
                     21: int    vflag;
                     22: 
                     23: main(argc, argv)
                     24:        int argc;
                     25:        char **argv;
                     26: {
                     27:        char *host, *remotedir;
                     28:        int x, i, f;
                     29:        char buf[BUFSIZ];
                     30:        int blocks;
                     31:        time_t then, now;
                     32: 
                     33:        argc--, argv++;
                     34:        if (argc > 0 && !strcmp(*argv, "-r"))
                     35:                remote();
                     36:        if (argc > 0 && !strcmp(*argv, "-v"))
                     37:                vflag++, argc--, argv++;
                     38:        if (argc < 2) {
                     39:                fprintf(stderr, "usage: cpnull machine blocks\n");
                     40:                exit(1);
                     41:        }
                     42:        signal(SIGPIPE, broken);
                     43:        host = *argv++; argc--;
                     44:        rem = rexec(&host, IPPORT_SHELLSERVER, "cpnull -r", 0, 0);
                     45:        if (rem < 0)
                     46:                exit(1);
                     47:        blocks = atoi(*argv);
                     48:        sprintf(buf, "C%d\n", blocks * BUFSIZ);
                     49:        write(rem, buf, strlen(buf));
                     50:        if (response() < 0)
                     51:                exit(1);
                     52:        printf("sending %d blocks\n", blocks);
                     53:        time(&then);
                     54:        for (i = 0; i < blocks; i++)  {
                     55:                if (vflag && (i % 100 == 0))
                     56:                        printf("%d\n", i);
                     57:                write(rem, buf, BUFSIZ);
                     58:        }
                     59:        (void) response();
                     60:        time(&now);
                     61:        if (then == now)
                     62:                printf("< 1 second to transfer\n");
                     63:        else
                     64:                printf("%d bytes %d seconds %d baud\n",
                     65:                    blocks * BUFSIZ, now - then,
                     66:                    (blocks * BUFSIZ * 8) / (now - then));
                     67:        exit(errs);
                     68: }
                     69: 
                     70: response()
                     71: {
                     72:        char resp, c, rbuf[BUFSIZ], *cp = rbuf;
                     73: 
                     74:        if (read(rem, &resp, 1) != 1) {
                     75:                printf("Response read != 1\n");
                     76:                lostconn();
                     77:        }
                     78:        switch (resp) {
                     79: 
                     80:        case 0:
                     81:                return (0);
                     82: 
                     83:        default:
                     84:                *cp++ = resp;
                     85:                /* fall into... */
                     86:        case 1:
                     87:        case 2:
                     88:                do {
                     89:                        if (read(rem, &c, 1) != 1) {
                     90:                                printf("response loop != 1\n");
                     91:                                write(2, rbuf, cp-rbuf);
                     92:                                write(2, "\n", 1);
                     93:                                lostconn();
                     94:                        }
                     95:                        *cp++ = c;
                     96:                } while (cp < &rbuf[BUFSIZ] && c != '\n');
                     97:                write(2, rbuf, cp - rbuf);
                     98:                if (resp == 1)
                     99:                        return (-1);
                    100:                exit(1);
                    101:        }
                    102: }
                    103: 
                    104: broken()
                    105: {
                    106: 
                    107:        fprintf(stderr, "SIGPIPE.\n");
                    108: }
                    109: 
                    110: lostconn()
                    111: {
                    112: 
                    113:        fprintf(stderr, "Lost connection.\n");
                    114:        exit(1);
                    115: }
                    116: 
                    117: remote()
                    118: {
                    119:        char namebuf[BUFSIZ], buf[BUFSIZ], *name, *cp, c;
                    120:        int i, size;
                    121:        char *whopp;
                    122: #define        SCREWUP(str)    { whopp = str; goto screwup; }
                    123: 
                    124:        cp = namebuf;
                    125:        if (read(0, cp, 1) <= 0)
                    126:                exit(0);
                    127:        if (*cp++ == '\n')
                    128:                SCREWUP("unexpected '\\n'");
                    129:        do
                    130:                if (read(0, cp, 1) != 1)
                    131:                        exit(1);
                    132:        while (*cp++ != '\n');
                    133:        *--cp = 0;
                    134:        cp = namebuf;
                    135:        if (*cp++ != 'C')
                    136:                SCREWUP("expected control record");
                    137:        size = 0;
                    138:        while (*cp >= '0' && *cp <= '9')
                    139:                size = size * 10 + (*cp++ - '0');
                    140:        if (*cp++ != 0)
                    141:                SCREWUP("size not delimited");
                    142:        write(rem, "\0", 1);
                    143:        for (i = 0; i < size; i += BUFSIZ) {
                    144:                int amt = BUFSIZ;
                    145:                char *cp = buf;
                    146: 
                    147:                if (i + amt > size)
                    148:                        amt = size - i;
                    149:                do {
                    150:                        int j = read(0, cp, amt);
                    151: 
                    152:                        if (j <= 0)
                    153:                                exit(1);
                    154:                        amt -= j;
                    155:                        cp += j;
                    156:                } while (amt > 0);
                    157:                amt = BUFSIZ;
                    158:                if (i + amt > size)
                    159:                        amt = size - i;
                    160:        }
                    161:        write(rem, "\0", 1);
                    162:        exit(0);
                    163: perr:
                    164:        sprintf(buf, "\01%s: %s\n", cp, sys_errlist[errno]);
                    165:        write(rem, buf, strlen(buf));
                    166:        exit(1);
                    167: screwup:
                    168:        sprintf(buf, "\02Procotol screwup: %s.\n", whopp);
                    169:        write(rem, buf, strlen(buf));
                    170:        exit(1);
                    171: }

unix.superglobalmegacorp.com

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