|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 5560 (0x15b8)
Types: TextFile
Names: »main.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/others/idist/main.c«
/* main.c -- driver for the client program */
/*
* $Header: /f/osi/others/idist/RCS/main.c,v 7.0 89/11/23 21:58:37 mrose Rel $
*
* Major changes to this file have been the ripping out of the server
* code. This is entirely the client part now. Also changed are the
* argument parsing stuff and a few bits and pieces.
*
* Julian Onions <jpo@cs.nott.ac.uk>
* Nottingham University Computer Science.
*
*
* $Log: main.c,v $
* Revision 7.0 89/11/23 21:58:37 mrose
* Release 6.0
*
*/
/*
* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1983 Regents of the University of California.\n\
All rights reserved.\n";
#endif
#ifndef lint
static char sccsid[] = "@(#)main.c 5.1 (Berkeley) 6/6/85";
static char *rcsid = "$Header: /f/osi/others/idist/RCS/main.c,v 7.0 89/11/23 21:58:37 mrose Rel $";
#endif
#include "defs.h"
#define NHOSTS 100
/*
* Remote distribution program.
*
* -u option (controlled by "#ifdef UW") to update only (don't install
* the file, assuming the workstation owner doesn't want that file)
*/
char *distfile = NULL;
char utmpfile[] = "/tmp/idistXXXXXX";
char *tmpname = &utmpfile[5];
int debug; /* debugging flag */
int nflag; /* NOP flag, just print commands without executing */
int qflag; /* Quiet. Don't print messages */
int options; /* global options */
int iamremote; /* act as remote server for transfering files */
FILE *fin = NULL; /* input file pointer */
char *host; /* host name */
int nerrs; /* number of errors while sending/receiving */
char user[10]; /* user's name */
char homedir[128]; /* user's home directory */
int userid; /* user's user ID */
int groupid; /* user's group ID */
struct passwd *pw; /* pointer to static area used by getpwent */
struct group *gr; /* pointer to static area used by getgrent */
char *myname = "idist";
main(argc, argv)
int argc;
char *argv[];
{
int cmdargs = 0;
char *dhosts[NHOSTS], **hp = dhosts;
extern int optind;
extern char *optarg;
int opt;
if (myname = rindex (argv[0], '/'))
myname++;
if (myname == NULL || *myname == NULL)
myname = argv[0];
isodetailor (myname, 1);
pw = getpwuid(userid = getuid());
if (pw == NULL)
adios (NULLCP, "Who are you?");
(void) strcpy(user, pw->pw_name);
(void) strcpy(homedir, pw->pw_dir);
groupid = pw->pw_gid;
host = getlocalhost ();
while ((opt = getopt (argc, argv, "f:m:d:DcnqbuRvwyhiQ")) != EOF)
switch (opt) {
case 'f':
distfile = optarg;
if (distfile[0] == '-' && distfile[1] == '\0')
fin = stdin;
break;
case 'm':
if (hp >= &dhosts[NHOSTS-2])
adios (NULLCP, "too many destination hosts");
*hp++ = optarg;
break;
case 'd':
define(optarg);
break;
case 'D':
debug++;
break;
case 'c':
cmdargs++;
break;
case 'n':
if (options & VERIFY) {
advise (NULLCP, "-n overrides -v");
options &= ~VERIFY;
}
nflag++;
break;
case 'q':
qflag++;
break;
case 'b':
options |= COMPARE;
break;
#ifdef UW
case 'u':
options |= NOINSTALL;
break;
#endif UW
case 'R':
options |= REMOVE;
break;
case 'v':
if (nflag) {
advise (NULLCP, "-n overrides -v");
break;
}
options |= VERIFY;
break;
case 'w':
options |= WHOLE;
break;
case 'y':
options |= YOUNGER;
break;
case 'h':
options |= FOLLOW;
break;
case 'i':
options |= IGNLNKS;
break;
case 'Q':
options |= QUERYM;
break;
default:
usage();
break;
}
*hp = NULL;
argc -= optind;
argv += optind;
(void) mktemp(utmpfile);
if (cmdargs)
docmdargs(argc, argv);
else {
if (fin == NULL) {
if(distfile == NULL) {
if((fin = fopen("distfile","r")) == NULL)
fin = fopen("Distfile", "r");
} else
fin = fopen(distfile, "r");
if(fin == NULL) {
adios (distfile, "Can't open file");
}
}
(void) yyparse();
if (nerrs == 0)
docmds(dhosts, argc, argv);
}
exit(nerrs != 0);
}
usage()
{
advise (NULLCP,
"Usage: %s [-nqbhirvwyD] [-f distfile] [-d var=value] [-m host] [file ...]\n",
myname);
adios(NULLCP, "or: %s [-nqbhirvwyD] -c source [...] machine[:dest]\n",
myname);
}
/*
* rcp like interface for distributing files.
*/
docmdargs(nargs, args)
int nargs;
char *args[];
{
register struct namelist *nl, *prev;
register char *cp;
struct namelist *files, *hosts;
struct subcmd *cmds;
char *dest;
static struct namelist tnl = { NULL, NULL };
int i;
if (nargs < 2)
usage();
prev = NULL;
for (i = 0; i < nargs - 1; i++) {
nl = makenl(args[i]);
if (prev == NULL)
files = prev = nl;
else {
prev->n_next = nl;
prev = nl;
}
}
cp = args[i];
if ((dest = index(cp, ':')) != NULL)
*dest++ = '\0';
tnl.n_name = cp;
hosts = expand(&tnl, E_ALL);
if (nerrs)
exit(1);
if (dest == NULL || *dest == '\0')
cmds = NULL;
else {
cmds = makesubcmd(INSTALL);
cmds->sc_options = options;
cmds->sc_name = dest;
}
if (debug) {
printf("docmdargs()\nfiles = ");
prnames(files);
printf("hosts = ");
prnames(hosts);
}
insert((char *)NULL, files, hosts, cmds);
docmds((char **)NULL, 0, (char **)NULL);
}
/*
* Print a list of NAME blocks (mostly for debugging).
*/
prnames(nl)
register struct namelist *nl;
{
printf("( ");
while (nl != NULL) {
printf("%s ", nl->n_name);
nl = nl->n_next;
}
printf(")\n");
}