Annotation of 40BSD/cmd/berknet/netcp.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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