Annotation of 41BSD/cmd/uusend.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)uusend.c    4.1 (Berkeley) 10/1/80";
                      2: /*
                      3:  * uusend: primative operation to allow uucp like copy of binary files
                      4:  * but handle indirection over systems.
                      5:  *
                      6:  * usage:  uusend [-m ooo] localfile  sysname1!sysname2!...!destfile
                      7:  *         uusend [-m ooo]     -      sysname1!sysname2!...!destfile
                      8:  *
                      9:  * Author: Mark Horton, May 1980.
                     10:  */
                     11: 
                     12: #include <stdio.h>
                     13: #include <pwd.h>
                     14: #include <sys/types.h>
                     15: #include <sys/stat.h>
                     16: 
                     17: /* #define DEBUG       "/usr/spool/uucp/uusend.log" */
                     18: 
                     19: FILE   *in, *out;
                     20: FILE   *dout;
                     21: 
                     22: FILE   *popen();
                     23: char   *index();
                     24: 
                     25: int    mode = -1;      /* mode to chmod new file to */
                     26: char   nextsys[20];    /* next system in the chain */
                     27: char   dnbuf[200];     /* buffer for result of ~user/file */
                     28: char   cmdbuf[256];    /* buffer to build uux command in */
                     29: 
                     30: struct passwd *user;   /* entry  in /etc/passwd for ~user */
                     31: struct passwd *getpwnam();
                     32: struct stat    stbuf;
                     33: 
                     34: char   *excl;          /* location of first ! in destname */
                     35: char   *sl;            /* location of first / in destname */
                     36: char   *sourcename;    /* argv[1] */
                     37: char   *destname;      /* argv[2] */
                     38: 
                     39: main(argc, argv)
                     40: int    argc;
                     41: char   **argv;
                     42: {
                     43:        register int c;
                     44:        register int count = 0;
                     45: 
                     46: #ifdef DEBUG
                     47:        long t;
                     48:        dout = fopen(DEBUG, "a");
                     49:        if (dout == NULL) {
                     50:                printf("Cannot append to %s\n", DEBUG);
                     51:                exit(1);
                     52:        }
                     53:        freopen(DEBUG, "a", stdout);
                     54:        freopen(DEBUG, "a", stderr);
                     55:        chmod(DEBUG, 0666);
                     56:        fprintf(dout, "\nuusend run: ");
                     57:        for (c=0; c<argc; c++)
                     58:                fprintf(dout, "%s ", argv[c]);
                     59:        time(&t);
                     60:        fprintf(dout, "%s", ctime(&t));
                     61: #endif
                     62:        while (argc > 1 && argv[1][0] == '-' && argv[1][1]) {
                     63:                switch(argv[1][1]) {
                     64:                case 'm':
                     65:                        sscanf(argv[2], "%o", &mode);
                     66:                        argc--; argv++;
                     67:                        break;
                     68:                default:
                     69:                        fprintf(stderr, "Bad flag: %s\n", argv[1]);
                     70:                        break;
                     71:                }
                     72:                argc--; argv++;
                     73:        }
                     74: 
                     75:        if (argc != 3) {
                     76:                fprintf(stderr, "Usage: uusend [-m ooo] -/file sys!sys!..!rfile\n");
                     77:                exit(1);
                     78:        }
                     79: 
                     80:        sourcename = argv[1];
                     81:        destname = argv[2];
                     82: 
                     83:        if (sourcename[0] == '-')
                     84:                in = stdin;
                     85:        else {
                     86:                in = fopen(sourcename, "r");
                     87:                if (in == NULL) {
                     88:                        perror(argv[1]);
                     89:                        exit(2);
                     90:                }
                     91:        }
                     92: 
                     93:        excl = index(destname, '!');
                     94:        if (excl) {
                     95:                /*
                     96:                 * destname is on a remote system.
                     97:                 */
                     98:                strncpy(nextsys, destname, excl-destname);
                     99:                nextsys[excl-destname] = 0;
                    100:                destname = excl+1;
                    101:                if (mode < 0) {
                    102:                        fstat(fileno(in), &stbuf);
                    103:                        mode = stbuf.st_mode & 0777;
                    104:                }
                    105:                sprintf(cmdbuf, "uux - \"%s!uusend -m %o - \(%s\)\"",
                    106:                        nextsys, mode, destname);
                    107: #ifdef DEBUG
                    108:                fprintf(dout, "remote: nextsys='%s', destname='%s', cmd='%s'\n", nextsys, destname, cmdbuf);
                    109: #endif
                    110:                out = popen(cmdbuf, "w");
                    111:        } else {
                    112:                /*
                    113:                 * destname is local.
                    114:                 */
                    115:                if (destname[0] == '~') {
                    116: #ifdef DEBUG
                    117:                        fprintf(dout, "before ~: '%s'\n", destname);
                    118: #endif
                    119:                        sl = index(destname, '/');
                    120:                        if (sl == NULL) {
                    121:                                fprintf(stderr, "Illegal ~user\n");
                    122:                                exit(3);
                    123:                        }
                    124:                        *sl++ = 0;
                    125:                        user = getpwnam(destname+1);
                    126:                        if (user == NULL) {
                    127:                                fprintf(stderr, "No such user as %s\n", destname);
                    128:                                exit(4);
                    129:                        }
                    130:                        strcpy(dnbuf, user->pw_dir);
                    131:                        strcat(dnbuf, "/");
                    132:                        strcat(dnbuf, sl);
                    133:                        destname = dnbuf;
                    134:                }
                    135:                out = fopen(destname, "w");
                    136: #ifdef DEBUG
                    137:                fprintf(dout, "local, file='%s'\n", destname);
                    138: #endif
                    139:                if (out == NULL) {
                    140:                        perror(destname);
                    141:                        exit(5);
                    142:                }
                    143:                if (mode > 0)
                    144:                        chmod(destname, mode);  /* don't bother to check it */
                    145:        }
                    146: 
                    147:        /*
                    148:         * Now, in any case, copy from in to out.
                    149:         */
                    150: 
                    151:        while ((c=getc(in)) != EOF) {
                    152:                putc(c, out);
                    153:                count++;
                    154:        }
                    155: #ifdef DEBUG
                    156:        fprintf(dout, "count %d bytes\n", count);
                    157:        fclose(dout);
                    158: #endif
                    159:        
                    160:        fclose(in);
                    161:        fclose(out);    /* really should pclose in that case */
                    162:        exit(0);
                    163: }
                    164: 
                    165: /*
                    166:  * Return the ptr in sp at which the character c appears;
                    167:  * NULL if not found.  Included so I don't have to fight the
                    168:  * index/strchr battle.
                    169:  */
                    170: 
                    171: #define        NULL    0
                    172: 
                    173: char *
                    174: index(sp, c)
                    175: register char *sp, c;
                    176: {
                    177:        do {
                    178:                if (*sp == c)
                    179:                        return(sp);
                    180:        } while (*sp++);
                    181:        return(NULL);
                    182: }

unix.superglobalmegacorp.com

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