Annotation of 43BSDReno/contrib/isode-beta/others/idist/main.c, revision 1.1.1.1

1.1       root        1: /* main.c -- driver for the client program */
                      2: 
                      3: /*
                      4:  * $Header: /f/osi/others/idist/RCS/main.c,v 7.0 89/11/23 21:58:37 mrose Rel $
                      5:  *
                      6:  * Major changes to this file have been the ripping out of the server
                      7:  * code. This is entirely the client part now. Also changed are the
                      8:  * argument parsing stuff and a few bits and pieces.
                      9:  *
                     10:  * Julian Onions <[email protected]>
                     11:  * Nottingham University Computer Science.
                     12:  *
                     13:  *
                     14:  * $Log:       main.c,v $
                     15:  * Revision 7.0  89/11/23  21:58:37  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: 
                     21: /*
                     22:  * Copyright (c) 1983 Regents of the University of California.
                     23:  * All rights reserved.  The Berkeley software License Agreement
                     24:  * specifies the terms and conditions for redistribution.
                     25:  */
                     26: 
                     27: #ifndef lint
                     28: char copyright[] =
                     29: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
                     30:  All rights reserved.\n";
                     31: #endif
                     32: 
                     33: #ifndef lint
                     34: static char sccsid[] = "@(#)main.c     5.1 (Berkeley) 6/6/85";
                     35: static char *rcsid = "$Header: /f/osi/others/idist/RCS/main.c,v 7.0 89/11/23 21:58:37 mrose Rel $";
                     36: #endif
                     37: 
                     38: #include "defs.h"
                     39: 
                     40: #define NHOSTS 100
                     41: 
                     42: /*
                     43:  * Remote distribution program.
                     44:  *
                     45:  * -u option (controlled by "#ifdef UW") to update only (don't install
                     46:  *     the file, assuming the workstation owner doesn't want that file)
                     47:  */
                     48: 
                     49: char   *distfile = NULL;
                     50: char   utmpfile[] = "/tmp/idistXXXXXX";
                     51: char   *tmpname = &utmpfile[5];
                     52: 
                     53: int    debug;          /* debugging flag */
                     54: int    nflag;          /* NOP flag, just print commands without executing */
                     55: int    qflag;          /* Quiet. Don't print messages */
                     56: int    options;        /* global options */
                     57: int    iamremote;      /* act as remote server for transfering files */
                     58: 
                     59: FILE   *fin = NULL;    /* input file pointer */
                     60: char   *host;          /* host name */
                     61: int    nerrs;          /* number of errors while sending/receiving */
                     62: char   user[10];       /* user's name */
                     63: char   homedir[128];   /* user's home directory */
                     64: int    userid;         /* user's user ID */
                     65: int    groupid;        /* user's group ID */
                     66: 
                     67: struct passwd *pw;     /* pointer to static area used by getpwent */
                     68: struct group *gr;      /* pointer to static area used by getgrent */
                     69: char   *myname = "idist";
                     70: 
                     71: main(argc, argv)
                     72:        int argc;
                     73:        char *argv[];
                     74: {
                     75:        int cmdargs = 0;
                     76:        char *dhosts[NHOSTS], **hp = dhosts;
                     77:        extern  int optind;
                     78:        extern  char *optarg;
                     79:        int     opt;
                     80: 
                     81:        if (myname = rindex (argv[0], '/'))
                     82:                myname++;
                     83:        if (myname == NULL || *myname == NULL)
                     84:                myname = argv[0];
                     85: 
                     86:        isodetailor (myname, 1);
                     87: 
                     88:        pw = getpwuid(userid = getuid());
                     89:        if (pw == NULL)
                     90:                adios (NULLCP, "Who are you?");
                     91: 
                     92:        (void) strcpy(user, pw->pw_name);
                     93:        (void) strcpy(homedir, pw->pw_dir);
                     94:        groupid = pw->pw_gid;
                     95:        host = getlocalhost ();
                     96: 
                     97:        while ((opt = getopt (argc, argv, "f:m:d:DcnqbuRvwyhiQ")) != EOF)
                     98:                switch (opt) {
                     99:                    case 'f':
                    100:                        distfile = optarg;
                    101:                        if (distfile[0] == '-' && distfile[1] == '\0')
                    102:                                fin = stdin;
                    103:                        break;
                    104: 
                    105:                    case 'm':
                    106:                        if (hp >= &dhosts[NHOSTS-2])
                    107:                                adios (NULLCP, "too many destination hosts");
                    108:                        *hp++ = optarg;
                    109:                        break;
                    110: 
                    111:                    case 'd':
                    112:                        define(optarg);
                    113:                        break;
                    114: 
                    115:                    case 'D':
                    116:                        debug++;
                    117:                        break;
                    118: 
                    119:                    case 'c':
                    120:                        cmdargs++;
                    121:                        break;
                    122: 
                    123:                    case 'n':
                    124:                        if (options & VERIFY) {
                    125:                                advise (NULLCP, "-n overrides -v");
                    126:                                options &= ~VERIFY;
                    127:                        }
                    128:                        nflag++;
                    129:                        break;
                    130: 
                    131:                    case 'q':
                    132:                        qflag++;
                    133:                        break;
                    134: 
                    135:                    case 'b':
                    136:                        options |= COMPARE;
                    137:                        break;
                    138: #ifdef UW
                    139:                    case 'u':
                    140:                        options |= NOINSTALL;
                    141:                        break;
                    142: #endif UW
                    143:                    case 'R':
                    144:                        options |= REMOVE;
                    145:                        break;
                    146: 
                    147:                    case 'v':
                    148:                        if (nflag) {
                    149:                                advise (NULLCP, "-n overrides -v");
                    150:                                break;
                    151:                        }
                    152:                        options |= VERIFY;
                    153:                        break;
                    154: 
                    155:                    case 'w':
                    156:                        options |= WHOLE;
                    157:                        break;
                    158: 
                    159:                    case 'y':
                    160:                        options |= YOUNGER;
                    161:                        break;
                    162: 
                    163:                    case 'h':
                    164:                        options |= FOLLOW;
                    165:                        break;
                    166: 
                    167:                    case 'i':
                    168:                        options |= IGNLNKS;
                    169:                        break;
                    170: 
                    171:                    case 'Q':
                    172:                        options |= QUERYM;
                    173:                        break;
                    174: 
                    175:                    default:
                    176:                        usage();
                    177:                        break;
                    178:                }
                    179:        *hp = NULL;
                    180:        argc -= optind;
                    181:        argv += optind;
                    182: 
                    183:        (void) mktemp(utmpfile);
                    184: 
                    185:        if (cmdargs)
                    186:                docmdargs(argc, argv);
                    187:        else {
                    188:                if (fin == NULL) {
                    189:                        if(distfile == NULL) {
                    190:                                if((fin = fopen("distfile","r")) == NULL)
                    191:                                        fin = fopen("Distfile", "r");
                    192:                        } else
                    193:                                fin = fopen(distfile, "r");
                    194:                        if(fin == NULL) {
                    195:                                adios (distfile, "Can't open file");
                    196:                        }
                    197:                }
                    198:                (void) yyparse();
                    199:                if (nerrs == 0)
                    200:                        docmds(dhosts, argc, argv);
                    201:        }
                    202: 
                    203:        exit(nerrs != 0);
                    204: }
                    205: 
                    206: usage()
                    207: {
                    208:        advise (NULLCP,
                    209:                "Usage: %s [-nqbhirvwyD] [-f distfile] [-d var=value] [-m host] [file ...]\n",
                    210:                myname);
                    211:        adios(NULLCP, "or: %s [-nqbhirvwyD] -c source [...] machine[:dest]\n",
                    212:              myname);
                    213: }
                    214: 
                    215: /*
                    216:  * rcp like interface for distributing files.
                    217:  */
                    218: docmdargs(nargs, args)
                    219:        int nargs;
                    220:        char *args[];
                    221: {
                    222:        register struct namelist *nl, *prev;
                    223:        register char *cp;
                    224:        struct namelist *files, *hosts;
                    225:        struct subcmd *cmds;
                    226:        char *dest;
                    227:        static struct namelist tnl = { NULL, NULL };
                    228:        int i;
                    229: 
                    230:        if (nargs < 2)
                    231:                usage();
                    232: 
                    233:        prev = NULL;
                    234:        for (i = 0; i < nargs - 1; i++) {
                    235:                nl = makenl(args[i]);
                    236:                if (prev == NULL)
                    237:                        files = prev = nl;
                    238:                else {
                    239:                        prev->n_next = nl;
                    240:                        prev = nl;
                    241:                }
                    242:        }
                    243: 
                    244:        cp = args[i];
                    245:        if ((dest = index(cp, ':')) != NULL)
                    246:                *dest++ = '\0';
                    247:        tnl.n_name = cp;
                    248:        hosts = expand(&tnl, E_ALL);
                    249:        if (nerrs)
                    250:                exit(1);
                    251: 
                    252:        if (dest == NULL || *dest == '\0')
                    253:                cmds = NULL;
                    254:        else {
                    255:                cmds = makesubcmd(INSTALL);
                    256:                cmds->sc_options = options;
                    257:                cmds->sc_name = dest;
                    258:        }
                    259: 
                    260:        if (debug) {
                    261:                printf("docmdargs()\nfiles = ");
                    262:                prnames(files);
                    263:                printf("hosts = ");
                    264:                prnames(hosts);
                    265:        }
                    266:        insert((char *)NULL, files, hosts, cmds);
                    267:        docmds((char **)NULL, 0, (char **)NULL);
                    268: }
                    269: 
                    270: /*
                    271:  * Print a list of NAME blocks (mostly for debugging).
                    272:  */
                    273: prnames(nl)
                    274:        register struct namelist *nl;
                    275: {
                    276:        printf("( ");
                    277:        while (nl != NULL) {
                    278:                printf("%s ", nl->n_name);
                    279:                nl = nl->n_next;
                    280:        }
                    281:        printf(")\n");
                    282: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.