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