Annotation of 3BSD/cmd/net/netcp.c, revision 1.1.1.1

1.1       root        1: # include "defs.h"
                      2: 
                      3: /* used by parser to parse filenames, e.g. mach:file */
                      4: struct fd {
                      5:        char mach;
                      6:        char *fn;
                      7:        };
                      8: 
                      9: 
                     10: /* netcp - copy with remote machines */
                     11: main(argc,argv)
                     12:   char **argv;
                     13:        {
                     14:        register struct fd *ff, *tf, ffile, tfile;
                     15:        char tomachstr[BUFSIZ], rcmd[BUFSIZ], acmd[BUFSIZ], *sn;
                     16:        argv[argc] = 0;
                     17:        if(argc < 3)goto usage;
                     18:        argv++, argc--;
                     19:        while(argv[0][0] == '-'){
                     20:                switch(argv[0][1]){
                     21:                case 'b':       status.nonotify++; break;
                     22:                case 'f':       status.force++; break;
                     23:                case 'l':       harg(status.login,&argc,&argv); break;
                     24:                case 'n':       status.nowrite++; break;
                     25:                case 'p':       harg(status.mpasswd,&argc,&argv); break;
                     26:                case 'q':       status.quiet++; break;
                     27:                default:        fprintf(stderr,"Unknown option %s\n",argv[0]);
                     28:                                break;
                     29:                }
                     30:                argc--;argv++;
                     31:                }
                     32:        if(argc > 2)goto usage;
                     33:        ff = &ffile;
                     34:        tf = &tfile;
                     35:        sprintf(rcmd,"netcp %s %s",argv[0],argv[1]);
                     36:        analyze(argv[0],ff);
                     37:        analyze(argv[1],tf);
                     38:        if(ff->mach  == 0 || tf->mach  == 0){
                     39:                fprintf(stderr,"Unknown machine\n");
                     40:                exit(1);
                     41:        }
                     42:        if(ff->fn[0] == 0 || tf->fn[0] == 0){
                     43:                fprintf(stderr,"Must specify both file names\n");
                     44:                exit(1);
                     45:        }
                     46:        sprintf(tomachstr,"-m%c",tf->mach);
                     47:        if(ff->mach == local && tf->mach == local){
                     48:                fprintf(stderr,"Error: both files are on this machine\n");
                     49:                exit(1);
                     50:                }
                     51:        else if(ff->mach == local)
                     52:                kexecl(netcmd,"net",tomachstr, "-o",tf->fn,"-s",ff->fn,
                     53:                        "-c",rcmd,CATCMD,0);
                     54:        else if(tf->mach == local){
                     55:                tomachstr[2] = ff->mach;
                     56:                kexecl(netcmd,"net",tomachstr, "-r",tf->fn,"-i",ff->fn,
                     57:                        "-c",rcmd,CATCMD,0);
                     58:                }
                     59:        /* remote for both */
                     60:        else if(tf->mach == ff->mach)
                     61:                kexecl(netcmd,"net",tomachstr,"-c",rcmd,"cp",ff->fn,tf->fn,0);
                     62:        else {
                     63:                /* experimental - still needs debugging */
                     64:                fprintf(stderr,
                     65:                        "Experimental - Machines normally must be the same\n");
                     66: 
                     67:                /* collect info on the "To Machine" */
                     68:                remote = tf->mach;
                     69:                /* get status.login and passwd from .netrc if poss. */
                     70:                commandfile();
                     71:                if(status.login[0] == 0 || status.mpasswd[0] == 0){
                     72:                        sn = SnCurrent();
                     73:                        if(sn == NULL){
                     74:                                fprintf(stderr,"Unknown user\n");
                     75:                                exit(1);
                     76:                        }
                     77:                        strcpy(status.localname,sn);
                     78:                        /* prompt on terminal */
                     79:                        promptlogin(remote);
                     80:                }
                     81:                /* should use -q option */
                     82:                sprintf(acmd,"%s -l %s -p %s %s %s",
                     83:                        NETCPCMD,status.login,status.mpasswd,argv[0],argv[1]);
                     84: 
                     85:                /* send the netcp command to the "From" machine */
                     86:                remote = tomachstr[2] = ff->mach;
                     87:                status.login[0] = status.mpasswd[0] = 0;
                     88:                mexecl(netcmd,"net",tomachstr,"-c",rcmd,acmd,0);
                     89:                }
                     90:        fprintf(stderr,"Network is down\n");
                     91:        exit(1);
                     92: usage:
                     93:        printf("Usage: netcp [-l ...] [-p ...] [-f] [-n] fromfile tofile\n");
                     94:        exit(1);
                     95:        }
                     96: 
                     97: analyze(S,f)
                     98:   char *S;
                     99:   register struct fd *f; {
                    100:        register char *file;
                    101:        char work[FNS], *s, c0,c1,c2,c3,c,colon=0;
                    102:        s = work;
                    103:        strcpy(s,S);
                    104:        f->mach = local;
                    105:        file = s;
                    106:        while(*s){
                    107:                if(*s == '/')break;
                    108:                if(*s == ':'){
                    109:                        colon = 1;
                    110:                        *s++ = 0;
                    111:                        break;
                    112:                }
                    113:                s++;
                    114:        }
                    115:        if(colon){ /* name specified */
                    116:                f->mach = lookup(file);
                    117:                if(f->mach == 0){
                    118:                        return;
                    119:                        }
                    120:                file = s;
                    121:                }
                    122:        else {
                    123:                s  = file;
                    124:                c0 = *s++;
                    125:                c1 = *s++;
                    126:                c2 = *s++;
                    127:                c3 = *s++;
                    128:                if(c0 == '/' && c1 != '/' && islower(c1))
                    129:                        if(c2 == '/')f->mach = 'y';             /* Cory name */
                    130:                        else if(c3 == '/')f->mach = c1;         /* CC name */
                    131:                }
                    132:        f->fn = calloc(strlen(file)+1,1);
                    133:        strcpy(f->fn,file);
                    134:        s = f->fn;
                    135:        /* check for bad chars in file name */
                    136:        while(c = *s++)
                    137:                if(c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\b')
                    138:                        err("Invalid character '%c'\n",c);
                    139:        }

unix.superglobalmegacorp.com

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