BSD 4_1c_2 release
[unix-history] / usr / src / ucb / berknet / netcp.c
CommitLineData
e804469b 1static char sccsid[] = "@(#)netcp.c 4.1 (Berkeley) 9/12/82";
498d05ad
KM
2
3# include "defs.h"
4/* sccs id variable */
5static char *netcp_sid = "@(#)netcp.c 1.2";
6
7
8/* global variables */
9struct userinfo status;
10
11/* netcp - copy with remote machines */
12main(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);
94usage:
95 printf("Usage: netcp [-l ...] [-p ...] [-f] [-n] fromfile tofile\n");
96 exit(EX_USAGE);
97 }
98
99analfile(sfn,addr)
100char *sfn;
101char *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 }