DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T m

⟦ad7b1f12f⟧ TextFile

    Length: 3963 (0xf7b)
    Types: TextFile
    Names: »main.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec8/pathalias/main.c« 

TextFile

/* pathalias -- by steve bellovin, as told to peter honeyman */
#ifndef lint
static char	*sccsid = "@(#)main.c	8.6 (down!honey) 86/09/16";
#endif

#define MAIN	/* for sccsid in header files */

#include "def.h"

/* exports */
extern void die();
char *ProgName;	/* for error diagnostics */
char *Cfile;	/* current input file */
char *Graphout;	/* file for dumping edges (-g option) */
char *Linkout;	/* file for dumping shortest path tree */
char **Ifiles;	/* argv for vector of input files */
node *Home;	/* node for local host */
int Cflag;	/* print costs (-c option) */
int Dflag;	/* allow routes beyond domains (-D option) */
int Iflag;	/* ignore case (-i option) */
int Tflag;	/* trace links (-t option) */
int Vflag;	/* verbose (-v option) */
int Lineno = 1;	/* line number within current input file */

/* imports */
extern long allocation();
extern void wasted(), mapit(), penalize(), hashanalyze(), deadlink();
extern char *local();
extern node *addnode();
extern char *optarg;
extern int optind;
extern long Lcount, Ncount;

#define USAGE "usage: %s [-vci] [-l localname] [-d deadlink] [-t tracelink] [-g edgeout] [-s treeout] [-a avoid] [files ...]\n"

main(argc, argv) 
register int	argc; 
register char	**argv;
{
	char	*locname = 0, buf[32];
	register int	c;
	int	errflg = 0;

	ProgName = argv[0];
	(void) allocation();	/* initialize data space monitoring */
	Cfile = "[deadlinks]";	/* for tracing dead links */
	while ((c = getopt(argc, argv, "a:cd:Dg:il:s:t:v")) != EOF)
		switch(c) {
		case 'a':	/* adjust cost out of arg */
			penalize(optarg, DEFPENALTY);
			break;
		case 'c':	/* print cost info */
			Cflag++;
			break;
		case 'd':	/* dead host or link */
			deadlink(optarg);
			break;
		case 'D':	/* allow routes beyond domains */
			Dflag++;
			break;
		case 'g':	/* graph output file */
			Graphout = optarg;
			break;
		case 'i':	/* ignore case */
			Iflag++;
			break;
		case 'l':	/* local name */
			locname = optarg;
			break;
		case 's':	/* show shortest path tree */
			Linkout = optarg;
			break;
		case 't':	/* trace this link */
			if (tracelink(optarg) < 0) {
				fprintf(stderr, "%s: can trace only %d links\n", ProgName, NTRACE);
				exit(1);
			}
			Tflag = 1;
			break;
		case 'v':	/* verbose stderr, mixed blessing */
			Vflag++;
			if (Vflag == 1) {
				/* v8 pi snarf, benign EBADF elsewhere */
				sprintf(buf, "/proc/%05d\n", getpid());
				write(3, buf, strlen(buf));
			}
			break;
		default:
			errflg++;
		}

	if (errflg) {
		fprintf(stderr, USAGE, ProgName);
		exit(1);
	}
	argv += optind;		/* kludge for yywrap() */

	if (*argv) {
		Ifiles = argv;
		freopen("/dev/null", "r", stdin);
	} else
		Cfile = "[stdin]";

	if (!locname) 
		locname = local();
	if (*locname == 0) {
		locname = "lostinspace";
		fprintf(stderr, "%s: using \"%s\" for local name\n",
				ProgName, locname);
	}

	Home = addnode(locname);	/* add home node */
	Home->n_cost = 0;		/* doesn't cost to get here */

	yyparse();			/* read in link info */

	if (Vflag > 1)
		hashanalyze();
	vprintf(stderr, "%d vertices, %d edges\n", Ncount, Lcount);
	vprintf(stderr, "allocation is %ldk after parsing\n", allocation());

	Cfile = "[backlinks]";	/* for tracing back links */
	Lineno = 0;

	/*
	 * compute shortest path tree.
	 *
	 * unless -D is asserted on the command line, we avoid routes through
	 * domains.  we do this in two passes:
	 * 	map to domain members (domains are cheap)
	 *	map around domains (domains are expensive)
	 *
	 * in the first phase, only domains, their members, and their
	 * aliases are printed.  in the second phase, everything
	 * else is printed.
	 *
	 * otherwise (-D option), we treat domains like any other network and
	 * skip the second phase.
	 */
	mapit(DOMAINS);
	if (!Dflag)
		mapit(NODOMAINS);

	wasted();	/* how much was wasted in memory allocation? */

	exit(0);
}

void
die(s)
char	*s;
{
	fprintf(stderr, "%s: %s; notify the authorities\n", ProgName, s);
#ifdef DEBUG
		abort();
#else
		exit(-1);
#endif
}