xref: /original-bsd/usr.bin/rdist/main.c (revision f66f3413)
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.8 (Berkeley) 07/09/92";
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 static void usage __P((void));
50 static void docmdargs __P((int, char *[]));
51 
52 int
53 main(argc, argv)
54 	int argc;
55 	char *argv[];
56 {
57 	register char *arg;
58 	int cmdargs = 0;
59 	char *dhosts[NHOSTS], **hp = dhosts;
60 
61 	pw = getpwuid(userid = getuid());
62 	if (pw == NULL) {
63 		fprintf(stderr, "%s: Who are you?\n", argv[0]);
64 		exit(1);
65 	}
66 	strcpy(user, pw->pw_name);
67 	strcpy(homedir, pw->pw_dir);
68 	groupid = pw->pw_gid;
69 	gethostname(host, sizeof(host));
70 	strcpy(tempfile, _PATH_TMP);
71 	strcat(tempfile, _RDIST_TMP);
72 	if ((tempname = rindex(tempfile, '/')) != 0)
73 		tempname++;
74 	else
75 		tempname = tempfile;
76 
77 	while (--argc > 0) {
78 		if ((arg = *++argv)[0] != '-')
79 			break;
80 		if (!strcmp(arg, "-Server"))
81 			iamremote++;
82 		else while (*++arg)
83 			switch (*arg) {
84 			case 'f':
85 				if (--argc <= 0)
86 					usage();
87 				distfile = *++argv;
88 				if (distfile[0] == '-' && distfile[1] == '\0')
89 					fin = stdin;
90 				break;
91 
92 			case 'm':
93 				if (--argc <= 0)
94 					usage();
95 				if (hp >= &dhosts[NHOSTS-2]) {
96 					fprintf(stderr, "rdist: too many destination hosts\n");
97 					exit(1);
98 				}
99 				*hp++ = *++argv;
100 				break;
101 
102 			case 'd':
103 				if (--argc <= 0)
104 					usage();
105 				define(*++argv);
106 				break;
107 
108 			case 'D':
109 				debug++;
110 				break;
111 
112 			case 'c':
113 				cmdargs++;
114 				break;
115 
116 			case 'n':
117 				if (options & VERIFY) {
118 					printf("rdist: -n overrides -v\n");
119 					options &= ~VERIFY;
120 				}
121 				nflag++;
122 				break;
123 
124 			case 'q':
125 				qflag++;
126 				break;
127 
128 			case 'b':
129 				options |= COMPARE;
130 				break;
131 
132 			case 'R':
133 				options |= REMOVE;
134 				break;
135 
136 			case 'v':
137 				if (nflag) {
138 					printf("rdist: -n overrides -v\n");
139 					break;
140 				}
141 				options |= VERIFY;
142 				break;
143 
144 			case 'w':
145 				options |= WHOLE;
146 				break;
147 
148 			case 'y':
149 				options |= YOUNGER;
150 				break;
151 
152 			case 'h':
153 				options |= FOLLOW;
154 				break;
155 
156 			case 'i':
157 				options |= IGNLNKS;
158 				break;
159 
160 			default:
161 				usage();
162 			}
163 	}
164 	*hp = NULL;
165 
166 	seteuid(userid);
167 	mktemp(tempfile);
168 
169 	if (iamremote) {
170 		server();
171 		exit(nerrs != 0);
172 	}
173 
174 	if (cmdargs)
175 		docmdargs(argc, argv);
176 	else {
177 		if (fin == NULL) {
178 			if(distfile == NULL) {
179 				if((fin = fopen("distfile","r")) == NULL)
180 					fin = fopen("Distfile", "r");
181 			} else
182 				fin = fopen(distfile, "r");
183 			if(fin == NULL) {
184 				perror(distfile ? distfile : "distfile");
185 				exit(1);
186 			}
187 		}
188 		yyparse();
189 		if (nerrs == 0)
190 			docmds(dhosts, argc, argv);
191 	}
192 
193 	exit(nerrs != 0);
194 }
195 
196 static void
197 usage()
198 {
199 	printf("Usage: rdist [-nqbhirvwyD] [-f distfile] [-d var=value] [-m host] [file ...]\n");
200 	printf("or: rdist [-nqbhirvwyD] -c source [...] machine[:dest]\n");
201 	exit(1);
202 }
203 
204 /*
205  * rcp like interface for distributing files.
206  */
207 static void
208 docmdargs(nargs, args)
209 	int nargs;
210 	char *args[];
211 {
212 	register struct namelist *nl, *prev;
213 	register char *cp;
214 	struct namelist *files, *hosts;
215 	struct subcmd *cmds;
216 	char *dest;
217 	static struct namelist tnl = { NULL, NULL };
218 	int i;
219 
220 	if (nargs < 2)
221 		usage();
222 
223 	prev = NULL;
224 	for (i = 0; i < nargs - 1; i++) {
225 		nl = makenl(args[i]);
226 		if (prev == NULL)
227 			files = prev = nl;
228 		else {
229 			prev->n_next = nl;
230 			prev = nl;
231 		}
232 	}
233 
234 	cp = args[i];
235 	if ((dest = index(cp, ':')) != NULL)
236 		*dest++ = '\0';
237 	tnl.n_name = cp;
238 	hosts = expand(&tnl, E_ALL);
239 	if (nerrs)
240 		exit(1);
241 
242 	if (dest == NULL || *dest == '\0')
243 		cmds = NULL;
244 	else {
245 		cmds = makesubcmd(INSTALL);
246 		cmds->sc_options = options;
247 		cmds->sc_name = dest;
248 	}
249 
250 	if (debug) {
251 		printf("docmdargs()\nfiles = ");
252 		prnames(files);
253 		printf("hosts = ");
254 		prnames(hosts);
255 	}
256 	insert(NULL, files, hosts, cmds);
257 	docmds(NULL, 0, NULL);
258 }
259 
260 /*
261  * Print a list of NAME blocks (mostly for debugging).
262  */
263 void
264 prnames(nl)
265 	register struct namelist *nl;
266 {
267 	printf("( ");
268 	while (nl != NULL) {
269 		printf("%s ", nl->n_name);
270 		nl = nl->n_next;
271 	}
272 	printf(")\n");
273 }
274 
275 #if __STDC__
276 #include <stdarg.h>
277 #else
278 #include <varargs.h>
279 #endif
280 
281 void
282 #if __STDC__
283 warn(const char *fmt, ...)
284 #else
285 warn(fmt, va_alist)
286 	char *fmt;
287         va_dcl
288 #endif
289 {
290 	extern int yylineno;
291 	va_list ap;
292 #if __STDC__
293 	va_start(ap, fmt);
294 #else
295 	va_start(ap);
296 #endif
297 	(void)fprintf(stderr, "rdist: line %d: Warning: ", yylineno);
298 	(void)vfprintf(stderr, fmt, ap);
299 	(void)fprintf(stderr, "\n");
300 	va_end(ap);
301 }
302