xref: /original-bsd/usr.bin/rdist/main.c (revision 95407d66)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 char copyright[] =
10 "@(#) Copyright (c) 1983 Regents of the University of California.\n\
11  All rights reserved.\n";
12 #endif /* not lint */
13 
14 #ifndef lint
15 static char sccsid[] = "@(#)main.c	5.6 (Berkeley) 08/27/90";
16 #endif /* not lint */
17 
18 #include "defs.h"
19 
20 #define NHOSTS 100
21 
22 /*
23  * Remote distribution program.
24  */
25 
26 char	*distfile = NULL;
27 #define _RDIST_TMP	"/rdistXXXXXX"
28 char	tempfile[sizeof _PATH_TMP + sizeof _RDIST_TMP + 1];
29 char	*tempname;
30 
31 int	debug;		/* debugging flag */
32 int	nflag;		/* NOP flag, just print commands without executing */
33 int	qflag;		/* Quiet. Don't print messages */
34 int	options;	/* global options */
35 int	iamremote;	/* act as remote server for transfering files */
36 
37 FILE	*fin = NULL;	/* input file pointer */
38 int	rem = -1;	/* file descriptor to remote source/sink process */
39 char	host[32];	/* host name */
40 int	nerrs;		/* number of errors while sending/receiving */
41 char	user[10];	/* user's name */
42 char	homedir[128];	/* user's home directory */
43 int	userid;		/* user's user ID */
44 int	groupid;	/* user's group ID */
45 
46 struct	passwd *pw;	/* pointer to static area used by getpwent */
47 struct	group *gr;	/* pointer to static area used by getgrent */
48 
49 main(argc, argv)
50 	int argc;
51 	char *argv[];
52 {
53 	register char *arg;
54 	int cmdargs = 0;
55 	char *dhosts[NHOSTS], **hp = dhosts;
56 
57 	pw = getpwuid(userid = getuid());
58 	if (pw == NULL) {
59 		fprintf(stderr, "%s: Who are you?\n", argv[0]);
60 		exit(1);
61 	}
62 	strcpy(user, pw->pw_name);
63 	strcpy(homedir, pw->pw_dir);
64 	groupid = pw->pw_gid;
65 	gethostname(host, sizeof(host));
66 	strcpy(tempfile, _PATH_TMP);
67 	strcat(tempfile, _RDIST_TMP);
68 	if ((tempname = rindex(tempfile, '/')) != 0)
69 		tempname++;
70 	else
71 		tempname = tempfile;
72 
73 	while (--argc > 0) {
74 		if ((arg = *++argv)[0] != '-')
75 			break;
76 		if (!strcmp(arg, "-Server"))
77 			iamremote++;
78 		else while (*++arg)
79 			switch (*arg) {
80 			case 'f':
81 				if (--argc <= 0)
82 					usage();
83 				distfile = *++argv;
84 				if (distfile[0] == '-' && distfile[1] == '\0')
85 					fin = stdin;
86 				break;
87 
88 			case 'm':
89 				if (--argc <= 0)
90 					usage();
91 				if (hp >= &dhosts[NHOSTS-2]) {
92 					fprintf(stderr, "rdist: too many destination hosts\n");
93 					exit(1);
94 				}
95 				*hp++ = *++argv;
96 				break;
97 
98 			case 'd':
99 				if (--argc <= 0)
100 					usage();
101 				define(*++argv);
102 				break;
103 
104 			case 'D':
105 				debug++;
106 				break;
107 
108 			case 'c':
109 				cmdargs++;
110 				break;
111 
112 			case 'n':
113 				if (options & VERIFY) {
114 					printf("rdist: -n overrides -v\n");
115 					options &= ~VERIFY;
116 				}
117 				nflag++;
118 				break;
119 
120 			case 'q':
121 				qflag++;
122 				break;
123 
124 			case 'b':
125 				options |= COMPARE;
126 				break;
127 
128 			case 'R':
129 				options |= REMOVE;
130 				break;
131 
132 			case 'v':
133 				if (nflag) {
134 					printf("rdist: -n overrides -v\n");
135 					break;
136 				}
137 				options |= VERIFY;
138 				break;
139 
140 			case 'w':
141 				options |= WHOLE;
142 				break;
143 
144 			case 'y':
145 				options |= YOUNGER;
146 				break;
147 
148 			case 'h':
149 				options |= FOLLOW;
150 				break;
151 
152 			case 'i':
153 				options |= IGNLNKS;
154 				break;
155 
156 			default:
157 				usage();
158 			}
159 	}
160 	*hp = NULL;
161 
162 	setreuid(0, userid);
163 	mktemp(tempfile);
164 
165 	if (iamremote) {
166 		server();
167 		exit(nerrs != 0);
168 	}
169 
170 	if (cmdargs)
171 		docmdargs(argc, argv);
172 	else {
173 		if (fin == NULL) {
174 			if(distfile == NULL) {
175 				if((fin = fopen("distfile","r")) == NULL)
176 					fin = fopen("Distfile", "r");
177 			} else
178 				fin = fopen(distfile, "r");
179 			if(fin == NULL) {
180 				perror(distfile ? distfile : "distfile");
181 				exit(1);
182 			}
183 		}
184 		yyparse();
185 		if (nerrs == 0)
186 			docmds(dhosts, argc, argv);
187 	}
188 
189 	exit(nerrs != 0);
190 }
191 
192 usage()
193 {
194 	printf("Usage: rdist [-nqbhirvwyD] [-f distfile] [-d var=value] [-m host] [file ...]\n");
195 	printf("or: rdist [-nqbhirvwyD] -c source [...] machine[:dest]\n");
196 	exit(1);
197 }
198 
199 /*
200  * rcp like interface for distributing files.
201  */
202 docmdargs(nargs, args)
203 	int nargs;
204 	char *args[];
205 {
206 	register struct namelist *nl, *prev;
207 	register char *cp;
208 	struct namelist *files, *hosts;
209 	struct subcmd *cmds;
210 	char *dest;
211 	static struct namelist tnl = { NULL, NULL };
212 	int i;
213 
214 	if (nargs < 2)
215 		usage();
216 
217 	prev = NULL;
218 	for (i = 0; i < nargs - 1; i++) {
219 		nl = makenl(args[i]);
220 		if (prev == NULL)
221 			files = prev = nl;
222 		else {
223 			prev->n_next = nl;
224 			prev = nl;
225 		}
226 	}
227 
228 	cp = args[i];
229 	if ((dest = index(cp, ':')) != NULL)
230 		*dest++ = '\0';
231 	tnl.n_name = cp;
232 	hosts = expand(&tnl, E_ALL);
233 	if (nerrs)
234 		exit(1);
235 
236 	if (dest == NULL || *dest == '\0')
237 		cmds = NULL;
238 	else {
239 		cmds = makesubcmd(INSTALL);
240 		cmds->sc_options = options;
241 		cmds->sc_name = dest;
242 	}
243 
244 	if (debug) {
245 		printf("docmdargs()\nfiles = ");
246 		prnames(files);
247 		printf("hosts = ");
248 		prnames(hosts);
249 	}
250 	insert(NULL, files, hosts, cmds);
251 	docmds(NULL, 0, NULL);
252 }
253 
254 /*
255  * Print a list of NAME blocks (mostly for debugging).
256  */
257 prnames(nl)
258 	register struct namelist *nl;
259 {
260 	printf("( ");
261 	while (nl != NULL) {
262 		printf("%s ", nl->n_name);
263 		nl = nl->n_next;
264 	}
265 	printf(")\n");
266 }
267 
268 /*VARARGS*/
269 warn(fmt, a1, a2,a3)
270 	char *fmt;
271 {
272 	extern int yylineno;
273 
274 	fprintf(stderr, "rdist: line %d: Warning: ", yylineno);
275 	fprintf(stderr, fmt, a1, a2, a3);
276 	fputc('\n', stderr);
277 }
278