Commit | Line | Data |
---|---|---|
e804469b | 1 | static char sccsid[] = "@(#)netcp.c 4.1 (Berkeley) 9/12/82"; |
498d05ad KM |
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 | } |