xref: /original-bsd/old/berknet/netcp.c (revision e59fb703)
1 static char sccsid[] = "@(#)netcp.c	4.1	(Berkeley)	09/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 	}
142