|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.