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