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