v22i111: Pathalias, version 10, Part03/03
Rich Salz
rsalz at uunet.uu.net
Fri Jun 8 23:33:22 AEST 1990
Submitted-by: peter honeyman <honey at citi.umich.edu>
Posting-number: Volume 22, Issue 111
Archive-name: pathalias10/part03
#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix at uunet.uu.net if you want that tool.
# Contents: CHANGES Makefile config.h def.h local.c main.c make.honey
# makedb.c
# Wrapped by rsalz at litchi.bbn.com on Fri Jun 8 09:25:22 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
echo If this archive is complete, you will see the following message:
echo ' "shar: End of archive 3 (of 3)."'
if test -f 'CHANGES' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'CHANGES'\"
else
echo shar: Extracting \"'CHANGES'\" \(1202 characters\)
sed "s/^X//" >'CHANGES' <<'END_OF_FILE'
XNets without names.
XAllow negative cost components; prohibit negative costs.
XNew input syntax: adjust {host, ...}; kill -a option.
XNew input syntax: file {filename}.
XNew input syntax: delete {host, host!neighbor}.
XTerminal nets.
XPrevent back links to domains.
X
X-- mod.sources, 10/87 -- version 9
XTerminal edges and domains (<host> syntax and -D option).
XDead hosts and edges in the input stream.
XEmpty private list ends scope of privates.
XFirst hop cost in output (-f option).
XPenalize deprecated hosts (-a option).
X
X-- mod.sources, 4.3bsd, 1/86 -- version 8
XImproved alias treatment.
XRoutes to domain gateways.
XLeading dot in name implies domain.
XLink/host tracing (-t option).
XUse getopt().
X
X-- mod.sources, 8/85 -- version 7
XPrivate hosts documented.
XHomegrown scanner -- it was true what they said about lex.
XMakedb.
XDomains and gateways.
XDEAD back link.
X
X-- net.sources, 1/85 -- version 6
XNo ! in dbm key.
XNetwork character must be one of !@%: -- dot is dead.
XPrivate hosts.
XDiscourage hybrid addresses.
XMagic @ <-> % rule.
X
X-- 1983-1984 -- version 5
XReverse sense of the -c (cost) flag.
XUse cheapest among duplicate links.
XElide network names in output.
X
X-- epoch (smb version) -- versions 1-4
END_OF_FILE
if test 1202 -ne `wc -c <'CHANGES'`; then
echo shar: \"'CHANGES'\" unpacked with wrong size!
fi
# end of 'CHANGES'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(1354 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X#!/bin/make -f
X# pathalias -- by steve bellovin, as told to peter honeyman
X
X### begin configuration section
X###
X# if you can't or don't intend to use dbm files,
X# don't bother with DBM or makedb
XDBM = -ldbm
X# or if you roll your own ...
X# DBM = dbm.o
X###
X# where is getopt (if not in the c library)?
X# GETOPT = getopt.o
X### end of configuration section
X
X
XCC = cc
XCFLAGS = -O
XLDFLAGS = -s $(GETOPT)
XYFLAGS = -d
X
XOBJ = addlink.o addnode.o local.o main.o mapit.o mapaux.o mem.o parse.o printit.o
XHDRS = def.h config.h
XCSRC = addlink.c addnode.c local.c main.c mapit.c mapaux.c mem.c printit.c
XLSRC = $(CSRC) parse.c
XSRC = $(CSRC) parse.y makedb.c arpatxt.c
X
Xpathalias: $(OBJ)
X $(CC) $(OBJ) $(LDFLAGS) -o pathalias
X
Xall: pathalias makedb arpatxt
X
X$(OBJ): $(HDRS)
X
Xparse.c: parse.y $(HDRS)
X $(YACC) $(YFLAGS) parse.y
X mv y.tab.c parse.c
X
Xmakedb: makedb.o
X $(CC) makedb.o $(LDFLAGS) $(DBM) -o makedb
X
Xmakedb.o: config.h
X
Xarpatxt: arpatxt.o
X $(CC) arpatxt.o $(LDFLAGS) -o arpatxt
X
Xclean:
X rm -f *.o y.tab.? parse.c
X
Xclobber: clean
X rm -f pathalias makedb arpatxt
X
Xtags: $(SRC) $(HDRS)
X ctags -w $(HDRS) $(SRC)
X
Xbundle:
X @bundle README CHANGES pathalias.1 Makefile ${HDRS} ${SRC}
X
Xlint: $(LSRC)
X lint $(CFLAGS) $(LSRC)
X lint makedb.c
X lint arpatxt.c
X
Xinstall:
X @echo "install pathalias, makedb, arpatxt, and pathalias.1"
X @echo "according to local conventions"
END_OF_FILE
if test 1354 -ne `wc -c <'Makefile'`; then
echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'config.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'config.h'\"
else
echo shar: Extracting \"'config.h'\" \(2426 characters\)
sed "s/^X//" >'config.h' <<'END_OF_FILE'
X/* pathalias -- by steve bellovin, as told to peter honeyman */
X
X/**************************************************************************
X * +--------------------------------------------------------------------+ *
X * | begin configuration section | *
X * +--------------------------------------------------------------------+ *
X **************************************************************************/
X
X#undef STRCHR /* have strchr -- system v and many others */
X
X#undef UNAME /* have uname() -- probably system v or 8th ed. */
X#undef MEMSET /* have memset() -- probably system v or 8th ed. */
X
X#define GETHOSTNAME /* have gethostname() -- probably bsd */
X#define BZERO /* have bzero() -- probably bsd */
X
X/* default place for dbm output of makedb (or use -o at run-time) */
X#define ALIASDB "/usr/local/lib/palias"
X
X/**************************************************************************
X * +--------------------------------------------------------------------+ *
X * | end of configuration section | *
X * +--------------------------------------------------------------------+ *
X **************************************************************************/
X
X
X
X#ifdef MAIN
X#ifndef lint
Xstatic char *c_sccsid = "@(#)config.h 9.2 89/03/03";
X#endif /*lint*/
X#endif /*MAIN*/
X
X/*
X * malloc/free fine tuned for pathalias.
X *
X * MYMALLOC should work everwhere, so it's not a configuration
X * option (anymore). nonetheless, if you're getting strange
X * core dumps (or panics!), comment out the following manifest,
X * and use the inferior C library malloc/free.
X */
X#define MYMALLOC /**/
X
X#ifdef MYMALLOC
X#define malloc mymalloc
X#define calloc(n, s) malloc ((n)*(s))
X#define free(s)
X#define cfree(s)
Xextern char *memget();
X#else /* !MYMALLOC */
Xextern char *calloc();
X#endif /* MYMALLOC */
X
X#ifdef STRCHR
X#define index strchr
X#define rindex strrchr
X#else
X#define strchr index
X#define strrchr rindex
X#endif
X
X#ifdef BZERO
X#define strclear(s, n) ((void) bzero((s), (n)))
X#else /*!BZERO*/
X
X#ifdef MEMSET
Xextern char *memset();
X#define strclear(s, n) ((void) memset((s), 0, (n)))
X#else /*!MEMSET*/
Xextern void strclear();
X#endif /*MEMSET*/
X
X#endif /*BZERO*/
X
Xextern char *malloc();
Xextern char *strcpy(), *index(), *rindex();
X
X#ifndef STATIC
X
X#ifdef DEBUG
X#define STATIC extern
X#else /*DEBUG*/
X#define STATIC static
X#endif /*DEBUG*/
X
X#endif /*STATIC*/
END_OF_FILE
if test 2426 -ne `wc -c <'config.h'`; then
echo shar: \"'config.h'\" unpacked with wrong size!
fi
# end of 'config.h'
fi
if test -f 'def.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'def.h'\"
else
echo shar: Extracting \"'def.h'\" \(4496 characters\)
sed "s/^X//" >'def.h' <<'END_OF_FILE'
X/* pathalias -- by steve bellovin, as told to peter honeyman */
X
X#ifndef lint
X#ifdef MAIN
Xstatic char *h_sccsid = "@(#)def.h 9.5 88/05/09";
X#endif /*MAIN*/
X#endif /*lint*/
X
X#include <stdio.h>
X#include <ctype.h>
X#include "config.h"
X
Xtypedef long Cost;
Xtypedef struct node node;
Xtypedef struct link link;
X
X#ifdef lint
X#define vprintf fprintf
X#else /*!lint -- this gives null effect warning*/
X/* because it's there ... */
X#define vprintf !Vflag ? 0 : fprintf
X#endif /*lint*/
X
X#define NTRACE 16 /* can trace up to NTRACE hosts/links */
X
X/* flags for n_flag */
X#define ISPRIVATE 0x0001 /* invisible outside its definition file */
X#define NALIAS 0x0002 /* heaped as an alias */
X#define ATSIGN 0x0004 /* seen an at sign? used for magic @/% rules */
X#define MAPPED 0x0008 /* extracted from heap */
X#define NDEAD 0x0010 /* out links are dead */
X#define HASLEFT 0x0020 /* has a left side net character */
X#define HASRIGHT 0x0040 /* route has a right side net character */
X#define NNET 0x0080 /* network pseudo-host */
X#define INDFS 0x0100 /* used when removing net cycles (for -g) */
X#define DUMP 0x0200 /* we have dumped this net's edges (for -g) */
X#define PRINTED 0x0400 /* this host has been printed */
X#define NTERMINAL 0x0800 /* heaped as terminal edge (or alias thereto) */
X#define NREF 0x1000 /* node has an "interesting" reference */
X
X#define ISADOMAIN(n) ((n)->n_name[0] == '.')
X#define ISANET(n) (((n)->n_flag & NNET) || ISADOMAIN(n))
X#define ALTEREGO(n1, n2) ((n1)->n_name == (n2)->n_name)
X#define DEADHOST(n) (((n)->n_flag & (NDEAD | NTERMINAL)) && !ISANET(n))
X#define DEADLINK(l) ((l)->l_flag & LDEAD)
X#define DEADNET(n) (((n)->n_flag & (NNET | NDEAD)) == (NNET | NDEAD))
X#define GATEWAYED(n) (DEADNET(n) || ISADOMAIN(n))
X
X#ifndef DEBUG
X/*
X * save some space in nodes -- there are > 10,000 allocated!
X */
X
X#define n_root un1.nu_root
X#define n_net un1.nu_net
X#define n_copy un1.nu_copy
X
X#define n_private un2.nu_priv
X#define n_parent un2.nu_par
X
X/* WARNING: if > 2^16 nodes, type of n_tloc must change */
Xstruct node {
X char *n_name; /* host name */
X link *n_link; /* adjacency list */
X Cost n_cost; /* cost to this host */
X union {
X node *nu_net; /* others in this network (parsing) */
X node *nu_root; /* root of net cycle (graph dumping) */
X node *nu_copy; /* circular copy list (mapping) */
X } un1;
X union {
X node *nu_priv; /* other privates in this file (parsing) */
X node *nu_par; /* parent in shortest path tree (mapping) */
X } un2;
X unsigned short n_tloc; /* back ptr to heap/hash table */
X unsigned short n_flag; /* see manifests above */
X};
X
X#endif /*DEBUG*/
X
X#define MILLION (1000L * 1000L)
X#define DEFNET '!' /* default network operator */
X#define DEFDIR LLEFT /* host on left is default */
X#define DEFCOST ((Cost) 4000) /* default cost of a link */
X#define INF ((Cost) 100 * MILLION) /* infinitely expensive link */
X#define DEFPENALTY ((Cost) 200) /* default avoidance cost */
X
X/* data structure for adjacency list representation */
X
X/* flags for l_dir */
X
X#define NETDIR(l) ((l)->l_flag & LDIR)
X#define NETCHAR(l) ((l)->l_netop)
X
X#define LDIR 0x0008 /* 0 for left, 1 for right */
X#define LRIGHT 0x0000 /* user at host style */
X#define LLEFT 0x0008 /* host!user style */
X
X#define LDEAD 0x0010 /* this link is dead */
X#define LALIAS 0x0020 /* this link is an alias */
X#define LTREE 0x0040 /* member of shortest path tree */
X#define LGATEWAY 0x0080 /* this link is a gateway */
X#define LTERMINAL 0x0100 /* this link is terminal */
X
X#ifndef DEBUG
X/*
X * borrow a field for link/node tracing. there's a shitload of
X * edges -- every word counts. only so much squishing is possible:
X * alignment dictates that the size be a multiple of four.
X */
X
X#define l_next un.lu_next
X#define l_from un.lu_from
X
Xstruct link {
X node *l_to; /* adjacent node */
X Cost l_cost; /* edge cost */
X union {
X link *lu_next; /* rest of adjacency list (not tracing) */
X node *lu_from; /* source node (tracing) */
X } un;
X short l_flag; /* right/left syntax, flags */
X char l_netop; /* network operator */
X};
X
X#endif /*DEBUG*/
X
X#ifdef DEBUG
X/*
X * flattening out the unions makes it easier
X * to debug (when pi is unavailable).
X */
Xstruct node {
X char *n_name;
X link *n_link;
X Cost n_cost;
X node *n_net;
X node *n_root;
X node *n_copy;
X node *n_private;
X node *n_parent;
X unsigned short n_tloc;
X unsigned short n_flag;
X};
Xstruct link {
X node *l_to;
X Cost l_cost;
X link *l_next;
X node *l_from;
X short l_flag;
X char l_netop;
X};
X#endif /*DEBUG*/
END_OF_FILE
if test 4496 -ne `wc -c <'def.h'`; then
echo shar: \"'def.h'\" unpacked with wrong size!
fi
# end of 'def.h'
fi
if test -f 'local.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'local.c'\"
else
echo shar: Extracting \"'local.c'\" \(1554 characters\)
sed "s/^X//" >'local.c' <<'END_OF_FILE'
X/* pathalias -- by steve bellovin, as told to peter honeyman */
X#ifndef lint
Xstatic char *sccsid = "@(#)local.c 9.2 88/06/10";
X#endif /* lint */
X
X#include <stdio.h>
X#include "config.h"
X
X#ifdef UNAME
X#include <sys/utsname.h>
X
Xchar *
Xlocal()
X{
X static struct utsname utsname;
X extern int uname();
X
X (void) uname(&utsname);
X return(utsname.nodename);
X}
X
X#else /* !UNAME */
X
Xchar *
Xlocal()
X{
X static char lname[64];
X extern int gethostname();
X
X (void) gethostname(lname, (int) sizeof(lname));
X lname[sizeof(lname)] = 0;
X return(lname);
X}
X
X#ifndef GETHOSTNAME
X
XSTATIC int
Xgethostname(name, len)
X char *name;
X int len;
X{ FILE *whoami;
X char *ptr;
X extern int pclose();
X extern FILE *fopen(), *popen();
X
X *name = '\0';
X
X /* try /etc/whoami */
X if ((whoami = fopen("/etc/whoami", "r")) != 0) {
X (void) fgets(name, len, whoami);
X (void) fclose(whoami);
X if ((ptr = index(name, '\n')) != 0)
X *ptr = '\0';
X }
X if (*name)
X return 0;
X
X /* try /usr/include/whoami.h */
X if ((whoami = fopen("/usr/include/whoami.h", "r")) != 0) {
X while (!feof(whoami)) {
X char buf[100];
X
X if (fgets(buf, 100, whoami) == 0)
X break;
X if (sscanf(buf, "#define sysname \"%[^\"]\"", name))
X break;
X }
X (void) fclose(whoami);
X if (*name)
X return 0;
X }
X
X /* ask uucp */
X if ((whoami = popen("uuname -l", "r")) != 0) {
X (void) fgets(name, len, whoami);
X (void) pclose(whoami);
X if ((ptr = index(name, '\n')) != 0)
X *ptr = '\0';
X }
X if (*name)
X return 0;
X
X /* aw hell, i give up! is this really unix? */
X return -1;
X}
X#endif /* GETHOSTNAME */
X#endif /* UNAME */
END_OF_FILE
if test 1554 -ne `wc -c <'local.c'`; then
echo shar: \"'local.c'\" unpacked with wrong size!
fi
# end of 'local.c'
fi
if test -f 'main.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'main.c'\"
else
echo shar: Extracting \"'main.c'\" \(3827 characters\)
sed "s/^X//" >'main.c' <<'END_OF_FILE'
X/* pathalias -- by steve bellovin, as told to peter honeyman */
X#ifndef lint
Xstatic char *sccsid = "@(#)main.c 9.5 88/06/10";
X#endif
X
X#define MAIN /* for sccsid in header files */
X
X#include "def.h"
X
X/* exports */
Xchar *Cfile; /* current input file */
Xchar *Graphout; /* file for dumping edges (-g option) */
Xchar *Linkout; /* file for dumping shortest path tree */
Xchar **Argv; /* external copy of argv (for input files) */
Xnode *Home; /* node for local host */
Xint Cflag; /* print costs (-c option) */
Xint Dflag; /* penalize routes beyond domains (-D option) */
Xint Iflag; /* ignore case (-i option) */
Xint Tflag; /* trace links (-t option) */
Xint Vflag; /* verbose (-v option) */
Xint Fflag; /* print cost of first hop */
Xint Lineno = 1; /* line number within current input file */
Xint Argc; /* external copy of argc (for input files) */
Xextern void die();
Xextern int tracelink();
X
X/* imports */
Xextern char *optarg;
Xextern int optind;
Xextern long Lcount, Ncount;
Xextern long allocation();
Xextern void wasted(), mapit(), hashanalyze(), deadlink();
Xextern char *local();
Xextern node *addnode();
Xextern int getopt(), yyparse();
Xextern void printit();
X
X#define USAGE "usage: %s [-vciDf] [-l localname] [-d deadlink] [-t tracelink] [-g edgeout] [-s treeout] [-a avoid] [files ...]\n"
X
Xmain(argc, argv)
X register int argc;
X register char **argv;
X{ char *locname = 0, *bang;
X register int c;
X int errflg = 0;
X
X setbuf(stderr, (char *) 0);
X (void) allocation(); /* initialize data space monitoring */
X Cfile = "[deadlinks]"; /* for tracing dead links */
X Argv = argv;
X Argc = argc;
X
X while ((c = getopt(argc, argv, "cd:Dfg:il:s:t:v")) != EOF)
X switch(c) {
X case 'c': /* print cost info */
X Cflag++;
X break;
X case 'd': /* dead host or link */
X if ((bang = index(optarg, '!')) != 0) {
X *bang++ = 0;
X deadlink(addnode(optarg), addnode(bang));
X } else
X deadlink(addnode(optarg), (node *) 0);
X break;
X case 'D': /* penalize routes beyond domains */
X Dflag++;
X break;
X case 'f': /* print cost of first hop */
X Cflag++;
X Fflag++;
X break;
X case 'g': /* graph output file */
X Graphout = optarg;
X break;
X case 'i': /* ignore case */
X Iflag++;
X break;
X case 'l': /* local name */
X locname = optarg;
X break;
X case 's': /* show shortest path tree */
X Linkout = optarg;
X break;
X case 't': /* trace this link */
X if (tracelink(optarg) < 0) {
X fprintf(stderr, "%s: can trace only %d links\n", Argv[0], NTRACE);
X exit(1);
X }
X Tflag = 1;
X break;
X case 'v': /* verbose stderr, mixed blessing */
X Vflag++;
X break;
X default:
X errflg++;
X }
X
X if (errflg) {
X fprintf(stderr, USAGE, Argv[0]);
X exit(1);
X }
X argv += optind; /* kludge for yywrap() */
X
X if (*argv)
X freopen("/dev/null", "r", stdin);
X else
X Cfile = "[stdin]";
X
X if (!locname)
X locname = local();
X if (*locname == 0) {
X locname = "lostinspace";
X fprintf(stderr, "%s: using \"%s\" for local name\n",
X Argv[0], locname);
X }
X
X Home = addnode(locname); /* add home node */
X Home->n_cost = 0; /* doesn't cost to get here */
X
X (void) yyparse(); /* read in link info */
X
X if (Vflag > 1)
X hashanalyze();
X vprintf(stderr, "%d nodes, %d links, alloc %ldk\n",
X Ncount, Lcount, allocation());
X
X Cfile = "[backlinks]"; /* for tracing back links */
X Lineno = 0;
X
X /* compute shortest path tree */
X mapit();
X vprintf(stderr, "allocation is %ldk after mapping\n", allocation());
X
X /* traverse tree and print paths */
X printit();
X vprintf(stderr, "allocation is %ldk after printing\n", allocation());
X
X wasted(); /* how much was wasted in memory allocation? */
X
X return 0;
X}
X
Xvoid
Xdie(s)
X char *s;
X{
X#ifdef DEBUG
X extern int abort();
X
X fprintf(stderr, "%s: %s\n", Argv[0], s);
X fflush(stdout);
X fflush(stderr);
X abort();
X#else
X fprintf(stderr, "%s: %s; notify the authorities\n", Argv[0], s);
X exit(-1);
X#endif
X}
END_OF_FILE
if test 3827 -ne `wc -c <'main.c'`; then
echo shar: \"'main.c'\" unpacked with wrong size!
fi
# end of 'main.c'
fi
if test -f 'make.honey' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'make.honey'\"
else
echo shar: Extracting \"'make.honey'\" \(3090 characters\)
sed "s/^X//" >'make.honey' <<'END_OF_FILE'
X#!/bin/make -f
X# pathalias -- by steve bellovin, as told to peter honeyman
X
X### configuration section
X###
X# if you can't or don't intend to use dbm files,
X# don't bother with DBM or makedb
XDBM = -ldbm
X# or if you roll your own ...
X# DBM = dbm.o
X###
X# where is getopt (if not in the c library)?
X# GETOPT = -lgetopt
X### end of configuration section
X
XCC = cc -g
XCFLAGS = -DDEBUG
XLDFLAGS =
XYFLAGS = -dD
XYYDEBUG=0
X
XOBJ = addlink.o addnode.o local.o main.o mapit.o mapaux.o mem.o parse.o printit.o
XOFILES = addlink.O addnode.O local.O main.O mapit.O mapaux.O mem.O parse.O printit.O
XHDRS = def.h config.h
XCSRC = addlink.c addnode.c local.c main.c mapit.c mapaux.c mem.c printit.c
XLSRC = $(CSRC) parse.c
XSRC = $(CSRC) parse.y makedb.c arpatxt.c
X
Xpathalias: & $(OBJ)
X $(CC) $(OBJ) $(LDFLAGS) -o pathalias
X
Xall: pathalias makedb arpatxt
X
X$(OBJ): $(HDRS)
X
Xparse.c: parse.y $(HDRS)
X $(YACC) $(YFLAGS) parse.y
X echo '#define YYDEBUG' > parse.c
X sed -e '/^# line/d' -e 's/yydebug = 0/yydebug = $(YYDEBUG)/' y.tab.c >> parse.c
X
Xmakedb: makedb.o
X $(CC) makedb.o $(LDFLAGS) $(DBM) -o makedb
X
Xmakedb.o: config.h
X
Xarpatxt: arpatxt.o
X $(CC) arpatxt.o $(LDFLAGS) -o arpatxt
X
Xclean:
X rm -f *.o y.tab.? parse.c
X
Xtags: $(SRC) $(HDRS)
X ctags -w $(SRC) $(HDRS)
X
Xbundle: README CHANGES pathalias.8 Makefile ${HDRS} ${SRC} arpa-privates make.honey
X @bundle README CHANGES pathalias.8 Makefile ${HDRS} ${SRC} arpa-privates make.honey
X
Xbundle1: README CHANGES pathalias.8 Makefile ${HDRS}
X @bundle README CHANGES pathalias.8 Makefile ${HDRS}
X
Xbundle2: addlink.c addnode.c local.c main.c
X @bundle addlink.c addnode.c local.c main.c
X
Xbundle3: mapit.c mapaux.c
X @bundle mapit.c mapaux.c
X
Xbundle4: mem.c printit.c parse.y
X @bundle mem.c printit.c parse.y makedb.c
X
Xbundle5: makedb.c arpatxt.c arpa-privates make.honey
X @bundle makedb.c arpatxt.c arpa-privates make.honey
X
Xftp:
X @make -s bundle | compress > /usr/ftp/pub/honey/pathalias.Z
X
Xmake.honey: makefile
X @cp makefile make.honey
X
Xlint: $(LSRC)
X lint -hbu $(CFLAGS) $(LSRC)
X lint makedb.c
X
X
X# the remainder is site specific.
X
XLOCAL = paths/citi paths/internet
XFILES = pp/* $(LOCAL)
X
Xpaths/internet: hosts.txt arpa-privates local.hosts arpatxt
X arpatxt -vfi -g citi -g umix -g mailrus -p arpa-privates local.hosts hosts.txt > paths/internet
X
XAVOID =
X
X# map output (input, really) to lower case; verbose; terminal domains
XARGS = -iD
X
XPARGS=$(ARGS) $(AVOID) $(FILES)
X# desperation debugging -- examine the costs.
Xcosts:
X pathalias -icvvD ${PARGS} 2>error.costs | awk '{printf("%s\t%s\t%s\n", $$2, $$1, $$3)}' | sort -o pa.costs
X
X# make one BIG file. a BIG bad idea.
Xcat:
X for i in $(FILES); do echo "file {$$i}"; cat $$i; echo 'private {}'; done > CAT
X
X# make a pathparse database. -g is undocumented.
Xedges:
X pathalias -g edges $(PARGS) 2>ERRORS > edges.hosts
X# makedb edges pa
X
X# kill bogus domains with mr. grep, then sort
XPOSTPROC = egrep -v '(\.(com|edu|mil|gov|net|org|arpa|[a-z][a-z]) .*!.*!)|(.\.(com|edu|mil|gov|net|org|arpa|[a-z][a-z]) )' | sort
X
X# round up the usual suspects
Xciti dwon umix mailrus: $(LOCAL)
X pathalias -l $@ $(PARGS) | $(POSTPROC) > $@
END_OF_FILE
if test 3090 -ne `wc -c <'make.honey'`; then
echo shar: \"'make.honey'\" unpacked with wrong size!
fi
# end of 'make.honey'
fi
if test -f 'makedb.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'makedb.c'\"
else
echo shar: Extracting \"'makedb.c'\" \(2342 characters\)
sed "s/^X//" >'makedb.c' <<'END_OF_FILE'
X/* pathalias -- by steve bellovin, as told to peter honeyman */
X#ifndef lint
Xstatic char *sccsid = "@(#)makedb.c 9.1 87/10/04";
X#endif /* lint */
X
X#include <stdio.h>
X#include "config.h"
X
Xtypedef struct {
X char *dptr;
X int dsize;
X} datum;
X
Xchar *Ofile = ALIASDB, *ProgName;
X
X#define USAGE "%s [-o dbmname] [-a] [file ...]\n"
X
Xmain(argc, argv)
X char *argv[];
X{ char *ofptr;
X int c, append = 0;
X extern int optind;
X extern char *optarg;
X
X ProgName = argv[0];
X while ((c = getopt(argc, argv, "o:a")) != EOF)
X switch(c) {
X case 'o': /* dbm output file */
X Ofile = optarg;
X break;
X
X case 'a': /* append mode */
X append++;
X break;
X
X default:
X fprintf(stderr, USAGE, ProgName);
X exit(1);
X break;
X }
X
X
X if ((ofptr = rindex(Ofile, '/')) != 0)
X ofptr++;
X else
X ofptr = Ofile;
X if (strlen(ofptr) > 10) {
X ofptr[10] = 0;
X fprintf(stderr, "%s: using %s for dbm output\n", ProgName, Ofile);
X }
X
X if (append == 0 && dbfile(Ofile) != 0) {
X perror_(Ofile);
X exit(1);
X }
X
X if (dbminit(Ofile) < 0) {
X perror_(Ofile);
X exit(1);
X }
X
X if (optind == argc)
X makedb((char *) 0);
X else for ( ; optind < argc; optind++)
X makedb(argv[optind]);
X exit(0);
X}
X
Xdbfile(dbf)
X char *dbf;
X{
X return (dbcreat(dbf, "dir") != 0 || dbcreat(dbf, "pag") != 0);
X}
X
Xdbcreat(dbf, suffix)
X char *dbf, *suffix;
X{ char buf[BUFSIZ];
X int fd;
X
X (void) sprintf(buf, "%s.%s", dbf, suffix);
X if ((fd = creat(buf, 0666)) < 0)
X return(-1);
X (void) close(fd);
X return(0);
X}
X
X
Xmakedb(ifile)
X char *ifile;
X{ char line[BUFSIZ];
X datum key, val;
X
X if (ifile && (freopen(ifile, "r", stdin) == NULL)) {
X perror_(ifile);
X return;
X }
X
X /*
X * keys and values are 0 terminated. this wastes time and (disk) space,
X * but does lend simplicity and backwards compatibility.
X */
X key.dptr = line;
X while (fgets(line, sizeof(line), stdin) != NULL) {
X char *op, *end;
X
X end = line + strlen(line);
X end[-1] = 0; /* kill newline, stuff null terminator */
X op = index(line, '\t');
X if (op != 0) {
X *op++ = 0;
X key.dsize = op - line; /* 0 terminated */
X val.dptr = op;
X val.dsize = end - op; /* 0 terminated */
X } else {
X key.dsize = end - line; /* 0 terminated */
X val.dptr = "\0"; /* why must i do this? */
X val.dsize = 1;
X }
X if (store(key, val) < 0)
X perror_(Ofile);
X }
X}
X
Xperror_(str)
X char *str;
X{
X fprintf(stderr, "%s: ", ProgName);
X perror(str);
X}
END_OF_FILE
if test 2342 -ne `wc -c <'makedb.c'`; then
echo shar: \"'makedb.c'\" unpacked with wrong size!
fi
# end of 'makedb.c'
fi
echo shar: End of archive 3 \(of 3\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 3 archives.
rm -f ark[1-9]isdone
else
echo You still must unpack the following archives:
echo " " ${MISSING}
fi
exit 0
exit 0 # Just in case...
--
Please send comp.sources.unix-related mail to rsalz at uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.
More information about the Comp.sources.unix
mailing list