home *** CD-ROM | disk | FTP | other *** search
- From: vixie@wrl.dec.com (Paul Vixie)
- Newsgroups: comp.lang.perl,alt.sources
- Subject: Re: uucp map browser in perl?
- Message-ID: <1990Nov6.081214.14486@wrl.dec.com>
- Date: 6 Nov 90 08:12:14 GMT
-
- # Before someone goes and reinvents another wheel... does anyone have
- # any perl scripts for searching or browsing the Uucp maps?
- # --
- # Richard Foulk richard@pegasus.com
-
- Here's what we use here. Complete but not documented. Includes the
- "unpackmaps" unpacker, the IDA "dbm" command, the smail "lcasep" command,
- and probably other junk from other sources. Only the index-builder and
- browser are currently mine.
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of shell archive."
- # Contents: INFO.costs Makefile README.unpackmaps dbm.c get.pl
- # lcasep.c list.pl mailpath.sh makefile.libd.src mkall.pl
- # mkmap.pl.src mkone.pl unpackmaps.sh uuhost.sh uupath.sh uupaths.sh
- # wrl-uumap.pl.src
- # Wrapped by vixie@jove.pa.dec.com on Tue Nov 6 00:09:01 1990
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'INFO.costs' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'INFO.costs'\"
- else
- echo shar: Extracting \"'INFO.costs'\" \(401 characters\)
- sed "s/^X//" >'INFO.costs' <<'END_OF_FILE'
- X LOCAL 25 (local-area network connection)
- X DEDICATED 95 (high speed dedicated link)
- X DIRECT 200 (toll-free call)
- X DEMAND 300 (long-distance call)
- X HOURLY 500 (hourly poll)
- X EVENING 1800 (time restricted call)
- X DAILY 5000 (daily poll, also called POLLED)
- X WEEKLY 30000 (irregular poll)
- END_OF_FILE
- if test 401 -ne `wc -c <'INFO.costs'`; then
- echo shar: \"'INFO.costs'\" unpacked with wrong size!
- fi
- # end of 'INFO.costs'
- fi
- if test -f 'Makefile' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'Makefile'\"
- else
- echo shar: Extracting \"'Makefile'\" \(3058 characters\)
- sed "s/^X//" >'Makefile' <<'END_OF_FILE'
- X# Makefile for uucp map maintainance utilities
- X# originally from @(#)Makefile 1.1 6/15/87 jbuck@epimass.epi.com
- X#
- X# vixie@decwrl.dec.com: BSD-ified, added other utilities from uucpmap package
- X# 21Sep88
- X
- NEWSUSR =news
- LIBD =/wrl/gen/lib/uumap
- MAPD =$(LIBD)/maps
- BIND =/usr/local/bin
- GENBIND =/wrl/gen/bin
- MANL =1
- MAND =/usr/local/man/man$(MANL)
- PERLLIB =/usr/local/lib/perl
- NEWSSPOOL =/usr/spool/news
- BATCH =/usr/spool/news/out.special/maps
- X
- X# pick the empty one if your ndbm routines are in your /lib/libc.a
- X#NDBM=
- X# pick this one if you have a libndbm.a file in /usr/lib or /usr/local/lib
- NDBM= -lndbm
- X
- CFLAGS = -O
- INFO = INFO.costs
- BIN_TARGETS = lcasep dbm
- OTHER_TARGETS = uuhost uupath uupaths makefile.libd mailpath unpackmaps \
- X get list mkall mkone wrl-uumap.pl mkmap.pl
- TARGETS = $(BIN_TARGETS) $(OTHER_TARGETS)
- X
- all: $(TARGETS)
- X
- clean:; rm -f $(TARGETS) *.o *.BAK *.CKP *~ .emacs*
- X
- lcasep: lcasep.o
- X cc -o lcasep lcasep.o
- X
- dbm: dbm.o
- X cc -o dbm dbm.o $(NDBM)
- X
- uupath: uupath.sh Makefile
- X sed -e 's?>BIND<?$(BIND)?g' -e 's?>LIBD<?$(LIBD)?g' $@.sh > $@
- X chmod +x uupath
- X
- uupaths: uupaths.sh Makefile
- X sed -e 's?>LIBD<?$(LIBD)?g' $@.sh > $@
- X chmod +x uupaths
- X
- mailpath: mailpath.sh Makefile
- X sed <$@.sh >$@ \
- X -e 's?>LIBD<?$(LIBD)?g' \
- X -e 's?>BIND<?$(BIND)?g'
- X chmod +x mailpath
- X
- unpackmaps: unpackmaps.sh Makefile
- X sed <$@.sh >$@ \
- X -e 's?>BATCH<?$(BATCH)?g' \
- X -e 's?>NEWSSPOOL<?$(NEWSSPOOL)?g' \
- X -e 's?>MAPDIR<?$(MAPD)?g'
- X chmod +x unpackmaps
- X
- uuhost: uuhost.sh Makefile
- X sed <$@.sh >$@ \
- X -e 's?>LIBD<?$(LIBD)?g'
- X chmod +x uuhost
- X
- get: get.pl
- X cp get.pl get
- X chmod +x get
- X
- list: list.pl
- X cp list.pl list
- X chmod +x list
- X
- mkall: mkall.pl
- X cp mkall.pl mkall
- X chmod +x mkall
- X
- mkone: mkone.pl
- X cp mkone.pl mkone
- X chmod +x mkone
- X
- mkmap.pl: mkmap.pl.src
- X cp mkmap.pl.src mkmap.pl
- X
- makefile.libd: makefile.libd.src Makefile
- X sed <$@.src >$@ \
- X -e 's?>MAPD<?$(MAPD)?g' \
- X -e 's?>LIBD<?$(LIBD)?g' \
- X -e 's?>BIND<?$(BIND)?g' \
- X -e 's?>MAPS<?$(MAPS)?g'
- X
- wrl-uumap.pl: wrl-uumap.pl.src Makefile
- X sed <$@.src >$@ \
- X -e 's?>CODE<?$(LIBD)?g' \
- X -e 's?>DATA<?$(LIBD)?g' \
- X -e 's?>MAPS<?$(MAPD)?g'
- X
- install: $(TARGETS) $(INFO)
- X test -d $(LIBD) || mkdir $(LIBD); \
- X /etc/chown $(NEWSUSR) $(LIBD); \
- X /bin/chgrp $(NEWSUSR) $(LIBD); \
- X /bin/chmod 775 $(LIBD)
- X test -d $(BIND) || mkdir $(BIND)
- X -test -d $(MAND) || mkdir $(MAND)
- X install -c -s -m 555 lcasep $(BIND)/
- X install -c -s -m 555 dbm $(BIND)/
- X install -c -m 555 uuhost $(GENBIND)/
- X install -c -m 555 uupath $(GENBIND)/
- X install -c -m 555 uupaths $(GENBIND)/
- X install -c -m 555 mailpath $(GENBIND)/
- X install -c -m 444 wrl-uumap.pl $(PERLLIB)/
- X install -c -m 444 mkmap.pl $(LIBD)/
- X install -c -m 555 get $(LIBD)/
- X install -c -m 555 list $(LIBD)/
- X install -c -m 555 mkall $(LIBD)/
- X install -c -m 555 mkone $(LIBD)/
- X install -c -m 555 unpackmaps $(LIBD)/
- X install -c -m 444 makefile.libd $(LIBD)/makefile
- X install -c -m 444 INFO.costs $(LIBD)/
- END_OF_FILE
- if test 3058 -ne `wc -c <'Makefile'`; then
- echo shar: \"'Makefile'\" unpacked with wrong size!
- fi
- # end of 'Makefile'
- fi
- if test -f 'README.unpackmaps' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'README.unpackmaps'\"
- else
- echo shar: Extracting \"'README.unpackmaps'\" \(7475 characters\)
- sed "s/^X//" >'README.unpackmaps' <<'END_OF_FILE'
- X UNPACKMAPS V3.0
- X May 14 1990
- X Chris Lewis
- X
- X This README, unpackmaps and uuwhere are Copyright 1990 Chris Lewis,
- X All Rights Reserved.
- X
- X You can do anything you want with it, provided that this copyright
- X notice remains intact, you don't claim you wrote it yourself, and you
- X don't make money selling it directly. You may redistribute this as
- X you wish, but if you modify it, you should clearly indicate in this
- X README file that it has been modified, by whom, and describe what
- X has been changed. Reasonable copying charges are okay.
- X
- X Though I have taken pains to ensure that this program is reasonably
- X reliable and secure, I cannot make any warrantee as to the reliability
- X or security of this software when used on any computer. It is up to
- X the user of this software to determine its suitability for their
- X purposes and take responsibility for its operation.
- X
- This is source for a simple, *secure*, map unpacking facility.
- X
- It is much simpler than uuhosts, has roughly the same functionality,
- is easier to install, probably faster and more efficient (at least
- the versions I've seen w.r.t. compression), and is considerably less
- vulnerable to trojan maps than most map unpackers that other people use.
- X(It has fewer vulnerabilities than uuhosts)
- X
- The intent is that any UNIX/XENIX/BSD system that can run news will
- be able to run this too, so I'm attempting to keep to greatest-common-
- denominator except for pathalias and things that I implement myself.
- X
- This release includes:
- X
- X - map unpacking
- X - pathalias operation plus hooks for path customization.
- X - a mechanism for viewing map entries for arbitrary sites.
- X ("uuwhere")
- X - automatic map article deletion if desired.
- X
- This had been posted to comp.sources.misc about a year ago. The
- prime differences here are that compress is run as a pipeline as stdin to
- pathalias, so you don't need to modify pathalias anymore, and the
- new "uuwhere" tool. There is still no makefile because it wouldn't
- do anything useful.
- X
- Regarding security: as many may remember, there's been a fair bit of
- discussion on security of map unpacking on the net. Rather than play
- around with trying to make a secure *true* unshar, which probably noone would
- trust because it would be so big, I simply made a few simplifying assumptions
- about the map format and use an awk script to unpack a map article into
- a map file. It checks for and refuses to unpack articles which have
- slashes in their names. I sent off some mail to Mel asking whether the
- assumptions I've made about map format are true, but never got any
- response. I believe that this is *pretty* secure, in that it doesn't
- have to be run as root, doesn't use the Bourne shell for unpacking, and
- is careful about the file names it creates. Please let me know if there
- are any holes I didn't think of.
- X
- General operation:
- X - your news is modified to batch incoming map article file names
- X to a specific batch file (analogous to normal news batching).
- X C-news users take note: you may have to utter magic incantations
- X (hint "classes" in C-news Alpha) to get sendbatches to avoid
- X trying to uux these... Another way is to use an explicit batch
- X file name in the sys file that isn't under the usual "out.going"
- X directories and point unpackmaps at it.
- X - unpackmaps wakes up, usually once per day, and extracts the
- X maps specified (if any) in the batch file into the map directory.
- X Maps are extracted using a secure awk script without resort
- X to setuid root or other wierdnesses. If you want the uuwhere
- X facility, unpackmaps will extract site->map file correspondences.
- X - If any maps were extracted, pathalias is fired off, and the
- X resultant file put in the place specified.
- X - If you've specified uuwhere, the where database will be regenerated.
- X - if anything was done, unpackmaps sends you mail telling you
- X what happened.
- X
- Installation:
- X - If you want to compress the stored map files, set the COMPRESS
- X variable to point your compress program. You should be using
- X compress versions 3 or 4. A copy will have come with your
- X news software.
- X
- X - I STRONGLY recommend that you build a special version of compress
- X with 12 bit compression instead of 16 for this. When this
- X is done, compress is considerably smaller (eg: bss of 32K instead
- X of 400K+). The reason for this is obvious - pathalias is enormous
- X when it's running, and so is a 16 bit compress. God help you if
- X it starts to swap.
- X
- X Advantages:
- X - the whole thing runs considerably faster
- X - much less swap/paging
- X - on our machine, 16 bit compress practically hangs
- X everyone else when run at the same time as pathalias.
- X
- X Disadvantages:
- X - the map directory is 10% (really! only 10%!) bigger.
- X
- X What I did was the following:
- X - go to the source directory for compress
- X - remove the binary if it is there.
- X - say:
- X make compress CFLAGS=-DUSERMEM=0
- X - rename this to something like /usr/bin/compress12
- X - make sure that uuwhere and unpackmaps shell scripts
- X have the same name. Eg: /usr/bin/compress12
- X
- X - edit unpackmaps to set the variables at the beginning of
- X the shell script. Note especially the batch file name
- X (see below)
- X - make the directory for the map files, owned by news.
- X - put unpackmaps in a suitable place. Eg: /usr/lib/news
- X - put uuwhere in a suitable place. Eg: /usr/local/bin.
- X - unpackmaps should be run from the userid that owns and runs news.
- X - su to the news userid, and run:
- X unpackmaps -i
- X This will build the initial path file.
- X - insert into your crontab something like:
- X 30 3 * * * /bin/su news -c "<path to unpackmaps>/unpackmaps > /dev/null"
- X - insert into your news sys file something like:
- X
- X (C-news)
- X
- X maps:comp.mail.maps/all:f:/usr/spool/news/out.special/maps
- X
- X (B-news)
- X
- X maps:world,comp.mail.maps:F:/usr/spool/batch/maps
- X
- X - copy uuwhere to an accessible bin directory after modifying
- X the configuration section at the beginning.
- X
- uuwhere "sitename" will give you the map name and line numbers where
- the site is defined (with #N comments). Adding a -v option will
- invoke compress (if necessary) and show you the map entry itself.
- The uuwhere mechanism *only* works using the "#N" entries, and will
- not search for macro reassignments and other namings. One other drawback
- is that uuwhere won't display whole map files directly, but that was
- never particularly useful anyways.
- X
- unpackmaps -i: will extract all map articles into the map spool area - useful
- for the first time you use it.
- X
- unpackmaps -p: runs pathalias even if no map articles were extracted.
- X
- In order to push the paths file into /usr/lib/uucp, I created a file called
- paths in /usr/lib/uucp, with 644 permissions, owned by the userid that runs
- unpackmaps.
- X
- The package will send mail to who you specify indicating which maps were
- unpacked, and any error returns from pathalias.
- X
- The uuwhere database is built from the maps as they are unpacked. After
- installation, it may take a while for the where database to be complete.
- X(same as for path files themselves too). I have implemented a binary
- search routine to make uuwhere go faster, but frankly, the sed's fast
- enough on all but the slowest machine.
- X
- Let me know of any changes you needed to make to get this to work.
- I'm also open to suggestions for new features....
- X----------
- Chris Lewis, Markham, Ontario, Canada
- X{uunet!attcan,utgpu,yunexus,utzoo}!lsuc!{ecicrl|eci386}!clewis
- END_OF_FILE
- if test 7475 -ne `wc -c <'README.unpackmaps'`; then
- echo shar: \"'README.unpackmaps'\" unpacked with wrong size!
- fi
- # end of 'README.unpackmaps'
- fi
- if test -f 'dbm.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'dbm.c'\"
- else
- echo shar: Extracting \"'dbm.c'\" \(10914 characters\)
- sed "s/^X//" >'dbm.c' <<'END_OF_FILE'
- X/*
- X** DBM -- General dbm management tool.
- X** Copyright (c) 1987 Lennart Lovstrand
- X** CIS Dept, Univ of Linkoping, Sweden
- X**
- X** Use it, abuse it, but don't sell it.
- X*/
- X
- X#include <stdio.h>
- X#include <ctype.h>
- X#include <sys/file.h>
- X#ifdef MDBM
- X# include "mdbm_compat.h"
- X#else MDBM
- X# include <ndbm.h>
- X# define DBMFILE DBM
- X#endif MDBM
- X
- X#ifndef lint
- static char SccsId[] = "@(#)dbm.c 2.0 (lel@ida.liu.se) 4/20/87";
- X#endif !lint
- X
- X#define TRUE 1
- X#define FALSE 0
- typedef int bool;
- X
- X#define SAMECASE 0
- X#define LOWERCASE 1
- X#define UPPERCASE 2
- X
- X#define COMMENTCHAR '#'
- X
- X#define streq(s, t) (strcmp(s, t) == 0)
- X#define MAKEDATUM(d, s) {(d).dptr = s; (d).dsize = strlen(s) + 1;}
- X
- void do_clear(), do_delete(), do_dump(), do_fetch(), do_load(), do_make(),
- X do_parse(), do_store();
- X
- struct comtab {
- X char *c_name;
- X void (*c_func)();
- X} CommandTable[] = {
- X {"clear", do_clear},
- X {"delete", do_delete},
- X {"dump", do_dump},
- X {"fetch", do_fetch},
- X {"load", do_load},
- X {"make", do_make},
- X {"parse", do_parse},
- X {"store", do_store}
- X};
- X
- X/* global arguments */
- int Argc;
- char **Argv;
- X
- X/* options */
- int Appending = FALSE;
- int Casing = SAMECASE;
- bool Debug = FALSE;
- char *Outfile = NULL;
- int Mode = 0644;
- char *Progname;
- bool Senteniel = FALSE;
- int Storeflag = DBM_INSERT;
- bool Storewarn = TRUE;
- X
- X/* Dbm globals */
- DBMFILE *Dbm;
- char *Dbmfile = NULL;
- int Dbmaccess;
- datum key, val;
- X
- main(argc, argv)
- X int argc;
- X char **argv;
- X{
- X extern int optind;
- X extern char *optarg;
- X char *scantoken();
- X struct comtab *cmd;
- X int c;
- X
- X Argc = argc;
- X Argv = argv;
- X
- X Progname = Argv[0];
- X
- X while ((c = getopt(Argc, Argv, "ADILRSUd:m:o:")) != EOF)
- X switch (c) {
- X case 'A':
- X Appending = TRUE;
- X break;
- X case 'D':
- X Debug = TRUE;
- X break;
- X case 'I':
- X Storeflag = DBM_INSERT;
- X Storewarn = FALSE;
- X break;
- X case 'L':
- X Casing = LOWERCASE;
- X break;
- X case 'R':
- X Storeflag = DBM_REPLACE;
- X break;
- X case 'S':
- X Senteniel = TRUE;
- X break;
- X case 'U':
- X Casing = UPPERCASE;
- X break;
- X case 'd':
- X Dbmfile = optarg;
- X break;
- X case 'm':
- X if (optarg[0] == '0')
- X (void) sscanf(optarg, "%o", &Mode);
- X else {
- X (void) sscanf(optarg, "%d", &Mode);
- X if (Mode == 0) {
- X (void) fprintf(stderr, "%s: non-numeric mode: %s\n",
- X Progname, optarg);
- X exit(1);
- X }
- X }
- X break;
- X case 'o':
- X Outfile = optarg;
- X break;
- X default:
- X (void) fprintf(stderr,
- X "usage: %s [-ADILNRSU] [-d dbm_file] [-m mode] %s",
- X Progname, "[-o output_file] command [args]\n");
- X exit(1);
- X }
- X
- X Argc -= optind;
- X Argv += optind;
- X
- X if (Argc > 0) {
- X for (cmd = CommandTable; cmd < &CommandTable[sizeof(CommandTable) /
- X sizeof(*CommandTable)];
- X cmd++)
- X if (streq(*Argv, cmd->c_name)) {
- X (*cmd->c_func)();
- X exit(0);
- X }
- X (void) fprintf(stderr, "%s: unknown dbm command %s", Progname, *Argv);
- X } else
- X (void) fprintf(stderr, "%s: missing dbm command", Progname);
- X (void) fprintf(stderr, ", use one of the following:\n");
- X for (cmd = CommandTable; cmd < &CommandTable[sizeof(CommandTable) /
- X sizeof(*CommandTable)]; cmd++)
- X (void) fprintf(stderr, "%s%s", cmd == CommandTable ? "" : "\t",
- X cmd->c_name);
- X (void) fprintf(stderr, "\n");
- X exit(3);
- X}
- X
- opendbm(access)
- X int access;
- X{
- X if (Dbmfile == NULL) {
- X if (Argc > 1) {
- X /* use last argument */
- X Dbmfile = Argv[Argc-1];
- X Argc--;
- X } else {
- X (void) fprintf(stderr, "%s: dbm file not specified\n", Progname);
- X exit(3);
- X }
- X }
- X Dbm = dbm_open(Dbmfile, access, Mode);
- X if (Dbm == NULL) {
- X perror(Dbmfile);
- X exit(4);
- X }
- X Dbmaccess = access;
- X}
- X
- closedbm()
- X{
- X if ((Dbmaccess & O_RDONLY) == 0 && Senteniel) {
- X MAKEDATUM(key, "@@@");
- X if (dbm_store(Dbm, key, key, DBM_REPLACE) != NULL) {
- X (void) fprintf(stderr, "%s: could not store senteniel \"@@@\"\n",
- X Progname);
- X perror(Progname);
- X exit(5);
- X }
- X }
- X
- X dbm_close(Dbm);
- X}
- X
- XFILE *
- openfile(filename, access)
- X char *filename;
- X char *access;
- X{
- X FILE *f;
- X
- X if (streq(filename, "-"))
- X if (streq(access, "r"))
- X return stdin;
- X else
- X return stdout;
- X else {
- X f = fopen(filename, access);
- X if (f == NULL) {
- X perror(filename);
- X exit(4);
- X }
- X return f;
- X }
- X}
- X
- void
- closefile(f)
- X FILE *f;
- X{
- X if (f != stdin && f != stdout)
- X (void) fclose(f);
- X}
- X/*
- X** DO_CLEAR -- Clear out database leaving it emtpy.
- X*/
- X
- void
- do_clear()
- X{
- X if (Dbmfile != NULL) {
- X opendbm(O_RDWR | O_CREAT | O_TRUNC);
- X closedbm();
- X }
- X while (Argc > 1) {
- X opendbm(O_RDWR | O_CREAT | O_TRUNC);
- X closedbm();
- X }
- X}
- X
- X
- X/*
- X** DO_DELETE -- Delete individual entries from the database.
- X*/
- X
- void
- do_delete()
- X{
- X opendbm(O_RDWR | O_CREAT);
- X
- X for (Argc--, Argv++; Argc > 0; Argc--, Argv++) {
- X casify(*Argv, Casing);
- X MAKEDATUM(key, *Argv);
- X if (dbm_delete(Dbm, key) != NULL) {
- X perror(*Argv);
- X exit(5);
- X }
- X }
- X
- X closedbm();
- X}
- X
- X/*
- X** DO_DUMP -- List all entries in the database.
- X*/
- X
- void
- do_dump()
- X{
- X FILE *output;
- X
- X opendbm(O_RDONLY);
- X
- X if (Outfile == NULL)
- X output = stdout;
- X else
- X output = openfile(Outfile, "w");
- X
- X#ifdef MDBM
- X for (key = dbm_firstkey(Dbm); key.dptr != NULL; key = dbm_nextkey(Dbm, key)) {
- X#else MDBM
- X for (key = dbm_firstkey(Dbm); key.dptr != NULL; key = dbm_nextkey(Dbm)) {
- X#endif MDBM
- X val = dbm_fetch(Dbm, key);
- X if (val.dptr == NULL)
- X perror(key.dptr);
- X else
- X (void) fprintf(output, "%s\t%s\n", key.dptr, val.dptr);
- X }
- X}
- X/*
- X** DO_FETCH -- Lookup individual keys in the database.
- X*/
- X
- void
- do_fetch()
- X{
- X opendbm(O_RDONLY);
- X
- X for (Argc--, Argv++; Argc > 0; Argc--, Argv++) {
- X casify(*Argv, Casing);
- X MAKEDATUM(key, *Argv);
- X val = dbm_fetch(Dbm, key);
- X if (val.dptr == NULL)
- X (void) printf("%s\t[NOT FOUND]\n", *Argv);
- X else
- X (void) printf("%s\t%s\n", *Argv, val.dptr);
- X }
- X
- X closedbm();
- X}
- X
- X/*
- X** DO_STORE -- Insert individual entries into the database.
- X*/
- X
- void
- do_store()
- X{
- X /* barf if # of args - 1 is even and no dbm file has been specified */
- X if (Argc & 1 == 1 && Dbmfile == NULL) {
- X (void) fprintf(stderr, "%s: no dbm file specified\n", Progname);
- X exit(3);
- X }
- X
- X opendbm(O_RDWR | O_CREAT);
- X
- X for (Argc--, Argv++; Argc > 1; Argc -= 2, Argv += 2) {
- X casify(Argv[0], Casing);
- X MAKEDATUM(key, Argv[0]);
- X MAKEDATUM(val, Argv[1]);
- X if (dbm_store(Dbm, key, val, Storeflag) != NULL) {
- X extern int errno;
- X
- X if (errno != 0) {
- X perror(Argv[0]);
- X exit(5);
- X } else if (Storewarn)
- X (void) fprintf(stderr,
- X "%s: duplicate key \"%s\" => \"%s\" ignored\n",
- X Progname, Argv[0], Argv[1]);
- X }
- X }
- X if (Argc > 0)
- X (void) fprintf(stderr, "%s: no value for last key \"%s\"--ignored\n",
- X Progname, Argv[0]);
- X
- X closedbm();
- X}
- X
- X/*
- X** DO_PARSE -- Parse a textual database file and produce key-value
- X** pairs separated by a tab (suitable for input to the ``load''
- X** function).
- X*/
- X
- void
- do_parse()
- X{
- X FILE *input, *output;
- X
- X if (Outfile == NULL)
- X output = stdout;
- X else
- X output = openfile(Outfile, "w");
- X
- X if (Argc == 1)
- X parsefile(stdin, output);
- X else
- X for (Argc--, Argv++; Argc > 0; Argc--, Argv++) {
- X input = openfile(*Argv, "r");
- X parsefile(input, output);
- X closefile(input);
- X }
- X}
- X
- X/*
- X** DO_MAKE -- Parse the textual input and load the result into
- X** the database.
- X*/
- X
- void
- do_make()
- X{
- X FILE *input, *pipin, *pipout;
- X int pipes[2];
- X
- X opendbm(O_RDWR | O_CREAT | (Appending ? 0 : O_TRUNC));
- X
- X if (pipe(pipes) != NULL) {
- X perror("pipe");
- X exit(9);
- X }
- X pipin = fdopen(pipes[0], "r");
- X pipout = fdopen(pipes[1], "w");
- X
- X if (fork() == 0) {
- X /* child process */
- X (void) fclose(pipout);
- X
- X loadfile(pipin);
- X } else {
- X /* parent process */
- X (void) fclose(pipin);
- X
- X if (Argc == 1)
- X parsefile(stdin, pipout);
- X else
- X for (Argc--, Argv++; Argc > 0; Argc--, Argv++) {
- X input = openfile(*Argv, "r");
- X parsefile(input, pipout);
- X closefile(input);
- X }
- X }
- X closedbm();
- X}
- X
- X/*
- X** DO_LOAD -- Load the dbm database from a text file. The input should
- X** be key-value pairs separated by a tab, each on a single line.
- X*/
- X
- void
- do_load()
- X{
- X FILE *input;
- X
- X opendbm(O_RDWR | O_CREAT | (Appending ? 0 : O_TRUNC));
- X
- X if (Argc == 1)
- X loadfile(stdin);
- X else
- X for (Argc--, Argv++; Argc > 0; Argc--, Argv++) {
- X input = openfile(*Argv, "r");
- X loadfile(input);
- X closefile(input);
- X }
- X closedbm();
- X}
- X
- X/*
- X** PARSEFILE, LOADFILE
- X*/
- X
- parsefile(input, output)
- X FILE *input, *output;
- X{
- X extern char *index();
- X char buf[BUFSIZ], *key, *val = NULL;
- X register char *p;
- X
- X while (fgets(buf, sizeof(buf), input) != NULL) {
- X if (buf[0] == COMMENTCHAR || buf[0] == '\n' || buf[0] == '\0')
- X continue;
- X if (!isspace(buf[0])) {
- X /* extract value */
- X p = scantoken(buf);
- X if (val != NULL)
- X free(val);
- X val = (char *) malloc(p - buf + 1);
- X (void) strncpy(val, buf, p - buf);
- X val[p - buf] = '\0';
- X }
- X casify(buf, Casing);
- X for (p = buf; *p != '\0';) {
- X while (*p != '\0' && isspace(*p)) p++;
- X if (*p == '\0' || *p == COMMENTCHAR)
- X break;
- X key = p;
- X p = scantoken(p);
- X if (*p == COMMENTCHAR)
- X *p = '\0';
- X else if (*p != '\0')
- X *p++ = '\0';
- X (void) fprintf(output, "%s\t%s\n", key, val);
- X }
- X }
- X}
- X
- loadfile(input)
- X FILE *input;
- X{
- X char buf[BUFSIZ];
- X register char *tab, *nl;
- X extern char *index();
- X
- X while (fgets(buf, sizeof(buf), input) != NULL) {
- X nl = index(buf, '\n');
- X if (nl != NULL)
- X *nl = '\0';
- X
- X tab = index(buf, '\t');
- X if (tab == NULL) {
- X (void) fprintf(stderr, "%s: missing tab in \"%s\"--ignored\n",
- X Progname, buf);
- X continue;
- X }
- X *tab++ = '\0';
- X casify(buf, Casing);
- X MAKEDATUM(key, buf);
- X MAKEDATUM(val, tab);
- X if (dbm_store(Dbm, key, val, Storeflag) != NULL && Storewarn) {
- X extern int errno;
- X
- X if (errno != 0) {
- X perror(buf);
- X exit(5);
- X } else if (Storewarn)
- X (void) fprintf(stderr,
- X "%s: duplicate key \"%s\" => \"%s\" ignored\n",
- X Progname, buf, tab);
- X }
- X }
- X}
- X
- char *
- scantoken(p)
- X register char *p;
- X{
- X register bool quotedchar = FALSE, insidestring = FALSE, insideroute = FALSE;
- X
- X /* hidious address scanner */
- X while (*p != '\0' && (quotedchar || insidestring || insideroute ||
- X (*p != COMMENTCHAR && !isspace(*p)))) {
- X /* special quote character handling */
- X if (quotedchar)
- X quotedchar = FALSE;
- X else {
- X quotedchar = (*p == '\\');
- X if (!insidestring)
- X if (*p == '<')
- X insideroute = TRUE;
- X else if (*p == '>')
- X insideroute = FALSE;
- X if (*p == '"')
- X insidestring = !insidestring;
- X }
- X p++;
- X }
- X
- X return p;
- X}
- X
- casify(p, c)
- X register char *p;
- X int c;
- X{
- X switch (c) {
- X case LOWERCASE:
- X for (; *p != '\0'; p++)
- X if (isupper(*p))
- X *p = tolower(*p);
- X break;
- X case UPPERCASE:
- X for (; *p != '\0'; p++)
- X if (islower(*p))
- X *p = toupper(*p);
- X break;
- X }
- X}
- END_OF_FILE
- if test 10914 -ne `wc -c <'dbm.c'`; then
- echo shar: \"'dbm.c'\" unpacked with wrong size!
- fi
- # end of 'dbm.c'
- fi
- if test -f 'get.pl' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'get.pl'\"
- else
- echo shar: Extracting \"'get.pl'\" \(943 characters\)
- sed "s/^X//" >'get.pl' <<'END_OF_FILE'
- X#! /usr/local/bin/perl
- X
- do "wrl-uumap.pl" || die "can't do wrl-uumap.pl";
- package main;
- X
- dbmopen(mapdb, "$uumap'data/mapdb", 0666) || die "can't open mapdb: $!";
- X
- chdir "$uumap'maps" || die "can't chdir: $!";
- X
- foreach $name (@ARGV) {
- X
- X undef %trail;
- X while ($cname = $mapdb{$name,"alias"}) {
- X if ($trail{$cname}) {
- X print "alias loop for ${cname}\n";
- X last;
- X }
- X $trail{$name} = 1;
- X $name = $cname;
- X }
- X
- X ($map,$pos) = split('@', $mapdb{$name,"map"});
- X if ($map eq "") {
- X printf("%s: no map\n", $name);
- X next;
- X }
- X
- X @aliases = split('@', $mapdb{$name,"aliases"});
- X
- X printf("=== %s ===", $name);
- X if ($#aliases >= $[) {
- X printf(" (also: %s)", join(' ',@aliases));
- X }
- X printf("\n");
- X
- X if (!open(map, $map)) {
- X warn "can't open $map: $!";
- X next;
- X }
- X seek(map, $pos, 0) || warn "can't seek to $pos in $map: $!";
- X $n = 0;
- X while (<map>) {
- X if (/^#[Nn]/) {
- X last if (++$n > 1);
- X }
- X print;
- X }
- X close(map);
- X}
- X
- dbmclose(mapdb);
- X
- exit 0;
- END_OF_FILE
- if test 943 -ne `wc -c <'get.pl'`; then
- echo shar: \"'get.pl'\" unpacked with wrong size!
- fi
- # end of 'get.pl'
- fi
- if test -f 'lcasep.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'lcasep.c'\"
- else
- echo shar: Extracting \"'lcasep.c'\" \(1163 characters\)
- sed "s/^X//" >'lcasep.c' <<'END_OF_FILE'
- X/*
- X** convert the host name on a pathalias line to lower case
- X*/
- X
- X#ifndef lint
- static char *sccsid="@(#)lcasep.c 2.5 (smail) 9/15/87";
- X#endif
- X
- X#include <stdio.h>
- X#include <ctype.h>
- X
- X# define lower(c) ( isupper(c) ? c-'A'+'a' : c )
- X
- void exit(), perror();
- X
- main(argc, argv)
- int argc;
- char *argv[];
- X{
- X FILE *ifp, *ofp;
- X char buf[BUFSIZ];
- X register char *p;
- X int c;
- X
- X extern int optind;
- X extern char *optarg;
- X
- X ifp = stdin;
- X ofp = stdout;
- X
- X while((c = getopt(argc, argv, "f:o:")) != EOF) {
- X switch(c) {
- X case 'f':
- X if((ifp = fopen(optarg, "r")) == NULL) {
- X (void) fprintf(stderr, "%s: can't open %s: ",
- X argv[0], optarg);
- X perror("");
- X exit(1);
- X }
- X break;
- X case 'o':
- X if((ofp = fopen(optarg, "w")) == NULL) {
- X (void) fprintf(stderr, "%s: can't open %s: ",
- X argv[0], optarg);
- X perror("");
- X exit(1);
- X }
- X break;
- X default:
- X (void) fprintf(stderr,
- X "usage: %s [-f file] [-o outfile]\n", argv[0]);
- X exit(1);
- X /* NOTREACHED */
- X break;
- X }
- X }
- X
- X while(fgets(buf, sizeof(buf), ifp) != NULL) {
- X for(p = buf; *p != '\t' && *p != '\0' ; p++) {
- X (void) fputc(lower(*p), ofp);
- X }
- X (void) fputs(p, ofp);
- X }
- X return(0);
- X}
- END_OF_FILE
- if test 1163 -ne `wc -c <'lcasep.c'`; then
- echo shar: \"'lcasep.c'\" unpacked with wrong size!
- fi
- # end of 'lcasep.c'
- fi
- if test -f 'list.pl' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'list.pl'\"
- else
- echo shar: Extracting \"'list.pl'\" \(282 characters\)
- sed "s/^X//" >'list.pl' <<'END_OF_FILE'
- X#! /usr/local/bin/perl
- X
- do "wrl-uumap.pl" || die "can't do wrl-uumap.pl";
- X
- dbmopen(mapdb, "$uumap'data/mapdb", 0666) || die "can't open mapdb: $!";
- X
- while (($key,$val) = each(mapdb)) {
- X ($name,$dtype) = split($;, $key);
- X printf("%-30s %-8s (%s)\n", $name, $dtype, $val);
- X}
- X
- exit 1;
- END_OF_FILE
- if test 282 -ne `wc -c <'list.pl'`; then
- echo shar: \"'list.pl'\" unpacked with wrong size!
- fi
- # end of 'list.pl'
- fi
- if test -f 'mailpath.sh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'mailpath.sh'\"
- else
- echo shar: Extracting \"'mailpath.sh'\" \(396 characters\)
- sed "s/^X//" >'mailpath.sh' <<'END_OF_FILE'
- X#! /bin/sh
- X
- X[ $# -eq 1 ] || {
- X echo "usage: $0 person"
- X echo " or: $0 person@place"
- X exit 1
- X}
- X
- eval `echo $1 | awk -F@ '
- X { if (NF==1) print "place=" $1 "; person=PERSON"
- X else print "place=" $2 "; person=" $1
- X }
- X' `
- X
- set `>BIND</dbm fetch $place >LIBD</paths`
- X[ "$2" = "[NOT" ] && {
- X echo mail path to $place not found
- X exit 1
- X}
- X
- echo $person $2 | awk '{ printf($2,$1); print ""; }'
- X
- exit 0
- END_OF_FILE
- if test 396 -ne `wc -c <'mailpath.sh'`; then
- echo shar: \"'mailpath.sh'\" unpacked with wrong size!
- fi
- # end of 'mailpath.sh'
- fi
- if test -f 'makefile.libd.src' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'makefile.libd.src'\"
- else
- echo shar: Extracting \"'makefile.libd.src'\" \(1199 characters\)
- sed "s/^X//" >'makefile.libd.src' <<'END_OF_FILE'
- X# Makefile - for paths &whatnot
- X# vix 30may90 [got rid of lots of complexity, converted to unpackmaps]
- X# vix 30nov87 [written]
- X#
- X# This should be modified only in the source directory, probably something
- X# like .../uucpmap/makefile.libd. If you change the non-source copy, be
- X# prepared to have your changes blown away by an unthinking machine...
- X
- NEWSUSR = >NEWSUSR<
- X
- PATHALIAS = >BIND</pathalias
- LCASEP = >BIND</lcasep
- DBM = >BIND</dbm
- MAPD = >MAPD<
- X
- STAMP = $(MAPD)/.update_stamp
- MAPFILES = [du].*
- X
- PATHS = >LIBD</paths
- UUMAP = >LIBD</uumap
- LOCAL = >LIBD</path.local >LIBD</glue.local
- X
- all :; @echo "targets are unbatch, paths, and uumap"
- X
- unbatch :; ->LIBD</unpackmaps
- X
- paths : $(PATHS).pag
- X
- uumap : $(UUMAP).pag
- X
- X$(PATHS).pag : $(PATHS)
- X $(DBM) clear newpaths; \
- X $(DBM) -I load $(PATHS) newpaths; \
- X rm -f $(PATHS).dir $(PATHS).pag; \
- X mv newpaths.dir $(PATHS).dir; \
- X mv newpaths.pag $(PATHS).pag
- X
- X$(PATHS) : $(LOCAL) $(STAMP)
- X cd $(MAPD); \
- X $(PATHALIAS) $(LOCAL) $(MAPFILES) \
- X | $(LCASEP) \
- X | sort > >LIBD</newpaths; \
- X mv >LIBD</newpaths $(PATHS)
- X
- X$(UUMAP).pag : $(STAMP)
- X cd >LIBD<; ./mkall
- X
- X$(STAMP) :; touch $(STAMP); chown $(NEWSUSR) $(STAMP)
- END_OF_FILE
- if test 1199 -ne `wc -c <'makefile.libd.src'`; then
- echo shar: \"'makefile.libd.src'\" unpacked with wrong size!
- fi
- # end of 'makefile.libd.src'
- fi
- if test -f 'mkall.pl' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'mkall.pl'\"
- else
- echo shar: Extracting \"'mkall.pl'\" \(399 characters\)
- sed "s/^X//" >'mkall.pl' <<'END_OF_FILE'
- X#! /usr/local/bin/perl
- X
- do "wrl-uumap.pl" || die "can't do wrl-uumap.pl: $!";
- X
- X$| = 1;
- X
- do "mkmap.pl" || die "can't do mkmap, probably a syntax error in it: $!";
- X
- unlink "$uumap'data/mapdb.dir", "$uumap'data/mapdb.pag";
- X
- chop($cwd = `pwd`);
- X
- chdir "$uumap'maps" || die "can't chdir: $!";
- X@maps = <[du].*>;
- chdir $cwd;
- X
- foreach $map (@maps) {
- X print "$map...";
- X &mkmap($map);
- X print "\n";
- X}
- X
- exit 0;
- END_OF_FILE
- if test 399 -ne `wc -c <'mkall.pl'`; then
- echo shar: \"'mkall.pl'\" unpacked with wrong size!
- fi
- # end of 'mkall.pl'
- fi
- if test -f 'mkmap.pl.src' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'mkmap.pl.src'\"
- else
- echo shar: Extracting \"'mkmap.pl.src'\" \(2720 characters\)
- sed "s/^X//" >'mkmap.pl.src' <<'END_OF_FILE'
- X#
- X# $Header:$
- X#
- X
- package mkmap;
- X
- X($between, $within) = (0, 1);
- X
- sub main'mkmap {
- X
- local($map) = @_;
- X
- dbmopen(mapdb, "$uumap'data/mapdb", 0666) || die "can't open unames database";
- if (!open(map,"$uumap'maps/$map")) {
- X warn "mkmap: can't open $map: $!";
- X return;
- X}
- X
- X$input_state = $between;
- line: while (<map>) {
- X #
- X # we're looking for a \n\n#N[ \t], which starts a new map entry
- X #
- X if ($input_state == $between) {
- X if (! /^#[Nn]/) {
- X next;
- X }
- X #
- X # found one. init the things we'll later store in the
- X # database; change input state; parse for names; continue.
- X #
- X $map_position = tell - length($_);
- X $input_state = $within;
- X chop;
- X s/^#N[A-Za-z]*//;
- X s/[ \t]+//g;
- X s/['"]//g;
- X @names = split(/,/);
- X
- X #
- X # find the canonical name (the first one without any dots
- X # will do), defaulting to the first entry on the line.
- X #
- X $cname = $names[$[];
- X foreach $name (@names) {
- X if ($name !~ /\./) {
- X $cname = $name;
- X last;
- X }
- X }
- X
- X #
- X # another pass through to delete $cname from @names
- X # (actually we create @aliases from @names but don't
- X # include the $cname)
- X #
- X undef @aliases;
- X foreach $name (@names) {
- X if ($name ne $cname) {
- X push(@aliases, $name);
- X }
- X }
- X
- X #
- X # store the main data for this map entry
- X #
- X $mapdb{$cname,"map"} = join('@', $map, $map_position);
- X
- X next;
- X }
- X
- X if ($input_state == $within) {
- X if (! /^#[Nn]/) {
- X chop;
- X s/[ \t]+//g;
- X s/['"]//g;
- X if ((! /^#/) && (/=/) && (! /{/) && (/(\w)=(.*)/)) {
- X #
- X # looks like an equate without a {network}
- X #
- X ($n, $a) = split(/=/, $_);
- X if ($n eq $cname) {
- X #
- X # looks like it belongs here
- X #
- X foreach $x (split(/,/, $a)) {
- X push(@aliases, $x);
- X }
- X }
- X }
- X next;
- X }
- X #
- X # end of a map entry
- X #
- X
- X # we delayed writing the aliases stuff until now
- X # because some of the aliases are equates in the
- X # map entry itself.
- X
- X &write_aliases();
- X undef @aliases;
- X
- X $input_state = $between;
- X redo line;
- X }
- X
- X printf("impossible state found: %d\n", $input_state);
- X die;
- X}
- X#
- X# test for premature eof
- X#
- if (defined(@aliases)) {
- X print "(premature EOF)";
- X &write_aliases();
- X undef @aliases;
- X}
- dbmclose(mapdb);
- close(map);
- X
- X} #sub mkmap
- X
- sub write_aliases {
- X## printf("%s: %d@%s (%s)\n",
- X## $cname, $map_position, $map, join(' ',@aliases));
- X
- X #
- X # store an aliases list if there are any aliases
- X #
- X if ($#aliases >= $[) {
- X $mapdb{$cname,"aliases"} = join('@', @aliases);
- X }
- X
- X #
- X # store the aliases. extra fields are probably worthless
- X # but let's leave room for future complexity
- X #
- X foreach $name (@aliases) {
- X # only one field (now) but use join anyway
- X $mapdb{$name,"alias"} = join('@', $cname);
- X }
- X} #sub write_aliases
- END_OF_FILE
- if test 2720 -ne `wc -c <'mkmap.pl.src'`; then
- echo shar: \"'mkmap.pl.src'\" unpacked with wrong size!
- fi
- # end of 'mkmap.pl.src'
- fi
- if test -f 'mkone.pl' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'mkone.pl'\"
- else
- echo shar: Extracting \"'mkone.pl'\" \(213 characters\)
- sed "s/^X//" >'mkone.pl' <<'END_OF_FILE'
- X#! /usr/local/bin/perl
- X
- do "wrl-uumap.pl" || die "can't do wrl-uumap.pl";
- X
- X$| = 1;
- X
- do "mkmap.pl" || die "can't open mkmap.pl: $!";
- X
- foreach $map (@ARGV) {
- X print "$map...";
- X &mkmap($map);
- X print "\n";
- X}
- X
- exit 0;
- END_OF_FILE
- if test 213 -ne `wc -c <'mkone.pl'`; then
- echo shar: \"'mkone.pl'\" unpacked with wrong size!
- fi
- # end of 'mkone.pl'
- fi
- if test -f 'unpackmaps.sh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'unpackmaps.sh'\"
- else
- echo shar: Extracting \"'unpackmaps.sh'\" \(8083 characters\)
- sed "s/^X//" >'unpackmaps.sh' <<'END_OF_FILE'
- X#! /bin/sh
- X
- X# Unpackmaps Copyright 1990, Chris Lewis, All Rights Reserved
- X
- X# patch 1 (done -> fi) applied
- X#
- X# hacked 30may90 by vixie to not run pathalias at all, just unpack maps;
- X# touches MAPDIR/.update_stamp whenever a map file is updated; is config'd
- X# by the makefile now.
- X
- trap "rm -f /tmp/unp?$$; exit" 0 1 2 3 15
- IFS="
- X"
- export IFS
- PATH=/usr/ucb:/bin:/usr/bin
- export PATH
- X
- X# The name of the file that you've caused your news system to
- X# batch the file names of the map articles.
- X# Eg: C-news
- X#BATCH=/usr/lib/news/batch/b.maps/togo
- X#Modern C-news (directory other than /usr/spool/news/out.going)
- X#BATCH=/usr/spool/news/out.special/maps/togo
- X# Eg: B-news
- X#BATCH=/usr/spool/batch/maps
- BATCH=>BATCH<
- X# News spool directory
- X#NEWSSPOOL=/usr/spool/news
- NEWSSPOOL=>NEWSSPOOL<
- X# Where you want the maps to go.
- X# I like using /usr/spool/maps, but on our system, /usr/spool/news
- X# is a separate file system, and /usr runs close to the limit...
- X#MAPDIR=/usr/spool/news/maps
- MAPDIR=>MAPDIR<
- X# Person to send results and error messages to
- X#NOTIFY=clewis
- NOTIFY=usenet
- X# pathalias binary
- X#PATHALIAS=/usr/lbin/pathalias
- X# where you want the path files to go:
- X# A convenient place is /usr/lib/uucp/paths which is the smail
- X# default. If you're going to put this in /usr/lib/uucp, I suggest
- X# (rather than make /usr/lib/uucp writeable by everybody), doing
- X# the following:
- X# su root
- X# cd /usr/lib/uucp
- X# touch paths
- X# chown news paths (or usenet)
- X# chmod 644 paths
- X#PATHFILE=/usr/lib/uucp/paths
- X# Auxiliary options to pathalias. Tune to local tastes....
- X#PATHOPTS="-dwatmath"
- X# If you have a version[s] of your machine's map entry that is different
- X# from what's published, change this variable to point at it/them.
- X# (Eg: I publish the first entry here, and the second one is local tuning
- X# and hidden connections)
- X#PATHLOCAL="/usr2/clewis/maps/path.local /usr2/clewis/maps/path.nonpublic"
- X# If this variable is set to the compress binary, maps will be
- X# compressed.
- X#COMPRESS=/usr2/clewis/maps/compress12
- X# 1 to strip comments from maps - don't do this if you want to use
- X# uuwhere. However, this is a great space saver...
- NOCOMMENTS=0
- X# Define to the name of a file where you want the where database
- X# to be kept. Undef if you don't want uuwhere at all.
- X#WHEREFILE=$MAPDIR/where.db
- X# Uncomment this if you want the map unpacker to remove the
- X# News articles after the maps have been extracted from them.
- X# DO NOT DO THIS IF YOU FORWARD MAP ARTICLES TO OTHER SITES!
- X# This also relies on your awk returning "exit" codes properly.
- X# Yours may not...
- X#UNLINK=1
- X# PS: there is *one* possible edit that you might want to make
- X# below - the maps used to generate wierd domains, but most of that
- X# appears to be gone now (don't ask me, I never particularly understood
- X# it, but since Peter Honeyman recommended it...). If you object
- X# to these wierd domains, uncomment the egrep.
- X
- X# Edit no more....
- X
- umask 022
- X
- if test ! -d $MAPDIR -o ! -w $MAPDIR
- then
- X echo "$MAPDIR missing, unwritable or not a directory" >&2
- X exit 1
- fi
- X
- if test $# = 1
- then
- X case $1 in
- X -p)
- X forcepath=true
- X ;;
- X -P)
- X forcepath=false
- X ;;
- X -i)
- X cd /
- X rm -f $BATCH.work
- X # using find/sort instead of ls just in case there's lots of
- X # articles....
- X find $NEWSSPOOL/comp/mail/maps -type f -print | sort > $BATCH
- X ;;
- X *)
- X echo "usage: unpackmaps [-i] [-p]" >&2
- X exit 1
- X ;;
- X esac
- fi
- X
- cd $MAPDIR
- WHERETMP=/tmp/WHERE$$
- rm -f $WHERETMP
- X
- while test -f $BATCH -o -f $BATCH.work
- do
- X # There is no window of vulnerability here as long as noone else is
- X # creating $BATCH.work.
- X if test ! -f $BATCH.work
- X then
- X mv $BATCH $BATCH.work
- X fi
- X
- X while read i stuff
- X do
- X # Using stuff to capture remaining junk on line.
- X # Eg: C-news article sizes.
- X
- X if test -z "$i"
- X then
- X break
- X fi
- X
- X if test ! -r $i
- X then
- X echo "$i apparently superseded or expired"
- X continue
- X fi
- X
- X # This awk script depends on the following map article format:
- X # <don't cares>
- X # cat << 'something' > filename
- X # map body
- X # something
- X # <don't cares>
- X # "something" doesn't have to be enclosed in quotes in the cat line.
- X # This isn't particularly fast - could be dramatically speeded up
- X # if written in C, but I was trying to ensure that this is as simple
- X # and self-evident as possible.
- X
- X awk '
- X BEGIN {
- X where = "'"$WHEREFILE"'"
- X }
- X $1 == "cat" && collecting == 0 {
- X recno = 1
- X endtoken=$3;
- X if (substr(endtoken, 1, 1) == "'"'"'")
- X endtoken=substr(endtoken, 2, length(endtoken)-2);
- X collecting = 1;
- X foundone = 1;
- X name = $5;
- X if (index(name, "/") != 0) {
- X printf("Security violation attempt in %s!\n", "'$i'");
- X exit 1;
- X } else
- X printf("extracting %s from %s\n", name, "'$i'");
- X next;
- X }
- X
- X {
- X if (!collecting)
- X next;
- X if ($1 == endtoken) {
- X line = "rm -f " name ".Z"
- X print "" | line
- X collecting = 0;
- X next
- X }
- X if ($1 ~ /^#N/ && where) {
- X for (i = 2; i <= NF; i++) {
- X sname = $i
- X if (p = index(sname, ","))
- X sname = substr(sname, 1, p-1)
- X printf "@%s %s %d\n", sname, name, recno >> \
- X "'$WHERETMP'";
- X }
- X }
- X if ("'$NOCOMMENTS'" == 1 && $0 ~ /#/)
- X print substr($0, 1, index($0, "#")) > name
- X else {
- X print $0 > name
- X }
- X recno++
- X }
- X
- X END {
- X if (collecting) {
- X printf("Non-terminated map in %s\n", "'$i'");
- X exit 1;
- X }
- X if (!foundone) {
- X printf("%s does not contain a properly formed map\n", "'$i'");
- X exit 1;
- X }
- X }' $i
- X
- X touch $MAPDIR/.update_stamp
- X
- X if test $? = 0 -a -n "$UNLINK"
- X then
- X rm -f $i
- X fi
- X
- X done < $BATCH.work
- X rm $BATCH.work
- done > /tmp/unpA$$ 2>&1
- X
- if test -n "$COMPRESS"
- then
- X files=`ls ?.* | sed -e '/\.Z$/d'`
- X if test -n "$files"
- X then
- X $COMPRESS -f $files
- X fi
- fi
- X
- if test -n "$PATHALIAS" -a -f "$PATHALIAS" -a "$forcepath" != false
- then
- X if test -s /tmp/unpA$$ -o "$forcepath" = true
- X then
- X cd $MAPDIR
- X
- X (
- X if test -n "$COMPRESS"
- X then
- X $COMPRESS -dc [ud].*.Z | cat - $PATHLOCAL
- X else
- X cat [ud].* $PATHLOCAL
- X fi |
- X
- X $PATHALIAS -f $PATHOPTS |
- X
- X # format of the pathalias -f output is
- X # cost host route
- X #
- X # format of a 'paths' file for smail is
- X # host route first_hop_cost
- X #
- X # move cost field to end of line:
- X
- X sed 's/\(.*\) \(.*\) \(.*\)/\2 \3 \1/' |
- X
- X # convert target domain/host to lower case:
- X
- X #lcasep |
- X
- X # remove some additional wierdnesses (per Peter Honeyman):
- X # You can leave it in or not.
- X
- X # egrep -v '(\.(com|edu|mil|gov|net|org|arpa|[a-z][a-z]) .*!.*!)|(.\.(com|edu|mil|gov|net|org|arpa|[a-z][a-z]) )' |
- X
- X # sort the stream:
- X
- X sort > /tmp/paths ) > /tmp/unpB$$ 2>&1
- X
- X if test ! -s /tmp/paths
- X then
- X echo "Pathalias failed no map file created" >> /tmp/unpB$$
- X else
- X cat /tmp/paths > $PATHFILE 2>> /tmp/unpB$$
- X if test $? != 0
- X then
- X echo "Copy to $PATHFILE failed" >> /tmp/unpB$$
- X else
- X rm /tmp/paths
- X fi
- X echo "Map remade" >> /tmp/unpB$$
- X ls -l $PATHFILE >> /tmp/unpB$$
- X fi
- X
- X if test -s /tmp/unpB$$
- X then
- X echo "Pathalias output:" >> /tmp/unpA$$
- X cat /tmp/unpB$$ >> /tmp/unpA$$
- X fi
- X fi
- fi
- X
- if test -n "$WHEREFILE" -a -s $WHERETMP
- then
- X if test ! -f $WHEREFILE
- X then
- X touch $WHEREFILE
- X fi
- X
- X # First awk: throws away WHERE references in $WHEREFILE that
- X # are now in $WHERETMP
- X # Sort: sort by site name
- X # Second awk: coalesce references to same site/file to one line.
- X awk '
- X BEGIN {
- X mapseen[""] = 1
- X }
- X $1 ~ /^@/ {
- X printf("%s %s %s\n", substr($1, 2), $2, $3);
- X mapseen[$2] = 1
- X next;
- X }
- X {
- X if (mapseen[$2])
- X next
- X printf("%s %s %s\n", $1, $2, $3);
- X }' $WHERETMP $WHEREFILE |
- X sort |
- X awk '
- X {
- X if (site != $1 || map != $2) {
- X if (site)
- X printf("\n");
- X site = $1
- X map = $2
- X printf("%s %s %s", $1, $2, $3);
- X } else
- X printf(",%s", $3);
- X }
- X END {
- X printf("\n");
- X }' > /tmp/TMP2
- X
- X if test -s /tmp/TMP2
- X then
- X cat /tmp/TMP2 > $WHEREFILE
- X fi
- X echo "Where database ($WHEREFILE) rebuilt" >> /tmp/unpA$$
- fi
- rm -f /tmp/TMP2 $WHERETMP
- X
- if test -s /tmp/unpA$$
- then
- X mail $NOTIFY < /tmp/unpA$$
- fi
- END_OF_FILE
- if test 8083 -ne `wc -c <'unpackmaps.sh'`; then
- echo shar: \"'unpackmaps.sh'\" unpacked with wrong size!
- fi
- # end of 'unpackmaps.sh'
- fi
- if test -f 'uuhost.sh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'uuhost.sh'\"
- else
- echo shar: Extracting \"'uuhost.sh'\" \(31 characters\)
- sed "s/^X//" >'uuhost.sh' <<'END_OF_FILE'
- X#! /bin/sh
- X
- exec >LIBD</get $@
- END_OF_FILE
- if test 31 -ne `wc -c <'uuhost.sh'`; then
- echo shar: \"'uuhost.sh'\" unpacked with wrong size!
- fi
- # end of 'uuhost.sh'
- fi
- if test -f 'uupath.sh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'uupath.sh'\"
- else
- echo shar: Extracting \"'uupath.sh'\" \(72 characters\)
- sed "s/^X//" >'uupath.sh' <<'END_OF_FILE'
- X#! /bin/sh
- X
- for host
- do
- X >BIND</dbm fetch $host >LIBD</paths
- done
- X
- exit
- END_OF_FILE
- if test 72 -ne `wc -c <'uupath.sh'`; then
- echo shar: \"'uupath.sh'\" unpacked with wrong size!
- fi
- # end of 'uupath.sh'
- fi
- if test -f 'uupaths.sh' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'uupaths.sh'\"
- else
- echo shar: Extracting \"'uupaths.sh'\" \(63 characters\)
- sed "s/^X//" >'uupaths.sh' <<'END_OF_FILE'
- X#! /bin/sh
- X
- for host
- do
- X look -f $host >LIBD</paths
- done
- X
- exit
- END_OF_FILE
- if test 63 -ne `wc -c <'uupaths.sh'`; then
- echo shar: \"'uupaths.sh'\" unpacked with wrong size!
- fi
- # end of 'uupaths.sh'
- fi
- if test -f 'wrl-uumap.pl.src' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'wrl-uumap.pl.src'\"
- else
- echo shar: Extracting \"'wrl-uumap.pl.src'\" \(148 characters\)
- sed "s/^X//" >'wrl-uumap.pl.src' <<'END_OF_FILE'
- X# configuration constants for uumap
- X
- package uumap;
- X
- X$code = ">CODE<";
- X$data = ">DATA<";
- X$maps = ">MAPS<";
- X
- package main;
- X
- push(@INC, $uumap'code);
- END_OF_FILE
- if test 148 -ne `wc -c <'wrl-uumap.pl.src'`; then
- echo shar: \"'wrl-uumap.pl.src'\" unpacked with wrong size!
- fi
- # end of 'wrl-uumap.pl.src'
- fi
- echo shar: End of shell archive.
- exit 0
- --
- Paul Vixie
- DEC Western Research Lab <vixie@wrl.dec.com>
- Palo Alto, California ...!decwrl!vixie
-