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