yet another path-finding program
Oscar M. Nierstrasz
oscar at utcsrgv.UUCP
Sun Dec 18 10:41:19 AEST 1983
: path.c, abridged mail database, and support programs
# Here is another mail(1) path-finding program.
# It is not as sophisticated as Steve Bellovin's pathalias
# program (it uses # of hops as the only cost data)
# but it works tolerably well.
# The complete mail connection database is monstrously huge
# so I have included a subgraph of just main USENET sites
# (only 500 vs 2000 sites).
# To use the system you must generate a "pathfile" from
# the enclosed graph. (Just follow the instructions in
# the various README files). Once this is done you can throw
# away (or store offline) everything but "path" and "pathfile".
# The only changes you must make are:
# 1. tell src/path.c where you will keep your "pathfile"
# 2. tell map/makefile what your site is called
# If your site isn't in the database you must add it.
echo README
sed 's/^ //' > README << 'Rosebud'
This directory contains the pathfile used by path(1).
See the documentation in the doc directory and in
the file map/README.
Installation requires modifications to src/path.c and map/makefile
to suit your site. Makefiles in both directories will do the rest
of the work for you.
------------------------- FILES -------------------------
doc...............directory of manual pages
map...............directory of site connections
msg...............a mail message
pathfile..........the pathname database
src...............directory containing source code
Rosebud
echo doc/
mkdir doc
echo doc/makefile
sed 's/^ //' > doc/makefile << 'Rosebud'
DOC = path span unpath
MAN = nroff -man $@.? | col > $@
all : $(DOC)
cat $(DOC) > all
clean :
rm -f $(DOC)
path : path.1
$(MAN)
span : span.1
$(MAN)
unpath : unpath.1
$(MAN)
Rosebud
echo doc/path.1
sed 's/^ //' > doc/path.1 << 'Rosebud'
.TH PATH 1
.UC
.SH NAME
path \- pathname generation
.SH SYNOPSIS
.B path
<site> ... [ -l | -f pathfile ]
.br
.B path
-a [ -f pathfile ]
.br
.B path
-p [ -f pathfile ]
.SH DESCRIPTION
.I Path
produces a list of pathnames to a set of sites for sending mail(1)
to users at distant locations.
For example:
.IP
path ucbvax
.PP
yields:
.IP
allegra!ucbvax
.br
decvax!ucbvax
.br
decwrl!ucbvax
.br
floyd!ucbvax
.br
ihnp4!ucbvax
.PP
.I Path
expects to find a pathfile
containing a map of site-to-site connections in the form of a tree
with the host machine as the root of the tree.
A default pathfile is used if none is specified.
A longer pathfile with more sites in it will be used if the "-l"
flag is specified.
The format of the pathfile is:
.IP
.I pathfile
::=
.I branch ...
.IP
.I branch
::=
.I site
[ "{"
.I branch ...
"}" ]
.PP
For example:
.IP
utzoo {
.in +4
decvax
.br
}
.in -4
ihnp4 {
.in +4
eagle {
.in +4
mit-vax
.br
}
.in -4
tektronix
.br
}
.in -4
.PP
might be a pathfile for the host
.I utcsrgv.
(The amount of white space separating site names is irrelevant.
Tabbing is included here for readability only.)
.IP
path mit-vax
.PP
would yield:
.IP
ihnp4!eagle!mit-vax
.IP
path -a
.PP
yields a list of all pathnames to all sites.
.IP
path -p
.PP
"pretty-prints" the pathfile as in the example given above.
.PP
The pathfile needn't be a true tree and may contain
duplicated nodes for the purpose of yielding alternative pathnames.
.PP
.I Path
will complain if it couldn't find any of the sites asked for.
If you do not know the precise name of the site you wish to
mail to, you may use
.IP
path -a | grep <pattern>
.PP
to find the pathname.
.PP
A
.I pathfile
for an arbitrary host may be generated automatically
from a file describing the entire graph of site-to-site connections
by using span(1).
.SH AUTHOR
Oscar Nierstrasz at the University of Toronto.
.SH BUGS
Pathnames are arbitrarily limited to 30 sites and 300 characters in length
(more than adequate).
The pathfile generated by span(1) includes "shortest" paths only.
"Longer" paths that may be faster, cheaper or more reliable are not listed.
.I Path
does not tell you which of the alternatives it gives you is the "best".
.SH FILES
/usr/pub/pathfile
/usr/pub/longpf
.SH SEE ALSO
span(1), unpath(1), mail(1).
Rosebud
echo doc/span.1
sed 's/^ //' > doc/span.1 << 'Rosebud'
.TH SPAN 1
.UC
.SH NAME
span \- pathfile generation
.SH SYNOPSIS
.B span
<host site> <graphfile> [ <pathfile> ] [-a] [-c] [-p] [-t]
.SH DESCRIPTION
.I Span
is program for generating a spanning tree of a graph of
site-to site connections, given the host site to use as
the root of the tree.
It uses a breadth-first search to generate a tree with a
shortest path to all reachable sites.
The output of
.I span
is suitable for use as the
.I pathfile
required by path(1) to generate mail(1) pathnames to sites.
.I Span
generates a single tree, though this tree is, of course,
not necessarily unique.
The "-c" option supresses leading tabs and blanks in the output,
producing a more compact pathfile.
.PP
The
.I graphfile
is stored as a
.I sorted
sequence of adjacency lists:
.IP
.I graph
::=
.I adj-list ...
.IP
.I adj-list
::=
.I site
[ '{'
.I site ...
'}' ]
.PP
For example, if
.IP
decvax { tektronix }
.br
eagle { mit-vax }
.br
ihnp4 { decvax eagle tektronix utcsrgv utzoo }
.br
mit-vax { eagle }
.br
tektronix { decvax }
.br
utcsrgv { utzoo ihnp4 }
.br
utzoo { utcsrgv decvax ihnp4 }
.PP
were the contents of
.I graphfile,
then
.IP
span utcsrgv graphfile
.PP
would generate the tree:
.IP
utzoo {
.in +4
decvax
.br
}
.in -4
ihnp4 {
.in +4
eagle {
.in +4
mit-vax
.br
}
.in -4
tektronix
.br
}
.in -4
.PP
White space may appear anywhere in the
.I graphfile,
but since the file must be sorted according to host name,
it makes sense to put each adjacency list on a single line
so that the file may be piped through sort(1).
(The names within the braces may appear in any order.)
.IP
span host graphfile -p
.PP
will 'pretty-print' the graphfile with any bad entries deleted
(see below).
.IP
span host graphfile -t
.PP
will turn the
.I trace
mode on.
This causes
.I span
to generate diagnostic messages tracing its execution.
(This is probably not too useful outside of debugging.)
.PP
Note that the graphfile describes a
.I directed
graph.
.I Span
uses only
.I out
edges from sites, and does
.I not
assume that if
.I decvax
can talk to
.I utzoo
then
.I utzoo
can also talk to
.I decvax.
If it can, then this information must appear explicitly in the
adjacency list for
.I utzoo.
Alternatively, if
.I decvax
calls
.I utzoo
on demand but not vice versa, then the reverse connection
should be left out of the graph so that
.I span
will use only reliable connections.
Similarly, the connections in the adjacency list should be
listed in decreasing order of reliability, since
.I span
uses the first path it finds.
The '-a' option overrides this, causing span to generate a 'tree'
with duplicate branches whenever there are several paths of the
same 'shortest' length.
All equal length paths will be generated.
The resultant pathfile is, of course, larger.
.PP
.I Span
produces warning messages for the following situations:
.PP
1. extraneous braces
.PP
2. duplicate entries (more than one adjacency list for a
single host site)
.PP
3. missing entries (site appearing in an adjacency list with no
such list of its own -- such sites are ignored)
.PP
4. no entry for the root site (this is a fatal error)
.PP
5. sites that cannot be reached (the graph may be disconnected
or contain sites with out-edges only)
.PP
The
.I graphfile
can be automatically generated from a sorted list of edge connections
by using awk(1).
.SH BUGS
The "shortest" path generated is does not take into account
cost, physical distance or reliability of the connections.
"Longer" paths that are in fact cheaper, faster or more
reliable are not generated.
.SH FILES
/usr/pub/edgefile
.br
/usr/pub/graphfile
.br
/usr/pub/pathfile
.SH AUTHOR
Oscar Nierstrasz at the University of Toronto.
.SH SEE ALSO
path(1), unpath(1), mail(1).
Rosebud
echo doc/unpath.1
sed 's/^ //' > doc/unpath.1 << 'Rosebud'
.TH UNPATH 1
.UC
.SH NAME
unpath \- convert pathnames to site connections
.SH SYNOPSIS
.B unpath
< pathnamefile
.SH DESCRIPTION
.I Unpath
takes a file containing site pathnames and generates a list of edges.
For example:
.IP
allegra!amd70!trsvax!sneaky
.PP
is converted to:
.IP
allegra amd70
.br
amd70 trsvax
.br
trsvax sneaky
.PP
This is useful for generating new edges to be used by
span(1) in maintaining a database of UUCP site connections.
Pathnames can be scavenged from mail and news files.
A shell script using grep(1) and sed(1) can extract the path information
and delete extraneous information.
Use sort(1) to sort to output and remove duplicate entries.
.PP
.I NOTE:
Be sure to remove user logins from pathnames or they will be
interpreted as site names.
.SH DIAGNOSTICS
Reports unexpected characters in the input.
.SH AUTHOR
Oscar Nierstrasz at the University of Toronto.
.SH SEE ALSO
path(1), span(1), mail(1), grep(1), sed(1).
Rosebud
echo src/
mkdir src
echo src/README
sed 's/^ //' > src/README << 'Rosebud'
Change the #define string PATHFILE in path.c to refer to the location
of the pathfile on your system.
Install the programs span and path in some publically accessible
directory. Path must be available to all. Span is used only
to maintain the database and must be accessible to the makefile in
../map/makefile.
Rosebud
echo src/makefile
sed 's/^ //' > src/makefile << 'Rosebud'
PROGS = path span unpath
B = ../bin
SRC = ../src
CMP = cc $@.c -o $@
all : $(PROGS)
clean :
rm -f $(PROGS)
path : path.c
$(CMP)
span : span.c
$(CMP)
unpath : unpath.c
$(CMP)
Rosebud
echo src/path.c
sed 's/^ //' > src/path.c << 'Rosebud'
/* FILE: PATH.C 831004
* AUTHOR: OSCAR NIERSTRASZ
*/
#include <stdio.h>
/* default pathfile should be:
#define PATHFILE "/usr/pub/pathfile"
but is in fact: */
#define PATHFILE "/u3/oscar/net/pathfile"
#define LONGPF "/u3/oscar/net/longpf"
/* modes */
#define PATH 1
#define ALL 2
#define PRETTY 3
#define TRUE 1
#define FALSE 0
#define TAB '\t'
#define BLANK ' '
#define EOL '\n'
#define BANG '!'
#define DOWN '{'
#define UP '}'
#define EOS '\0'
#define SPACEFOUR " "
#define BUFLEN 300
#define MAXLEVELS 30
#define MAXARGS 50
#define charok(x) (('-' <= x) && (x <= 'z'))
#define checkeob() testbuf(pathchar, eobuf)
main(argc, argv)
int argc;
char **argv;
{
int i, lastarg, level, mode, reading, getfile, searching;
char pathname[BUFLEN], *site[MAXLEVELS];
char *pathchar, *lastchar, *eobuf;
char c, *filename, *find[MAXARGS];
int found[MAXARGS], first;
FILE *pathfile;
/* ARGUMENT PROCESSING */
filename = PATHFILE; /* default pathfile */
mode = PATH; /* default -- find pathname */
lastarg = -1; /* index into find[] */
getfile = FALSE; /* use different pathfile */
for(i=1; i<argc; i++){
if(getfile){
filename = argv[i];
getfile = FALSE;
}
else if(argv[i][0] == '-'){
switch(argv[i][1]){
case 'a':
mode = ALL;
break;
case 'p':
mode = PRETTY;
break;
case 'f':
getfile = TRUE;
break;
case 'l':
filename = LONGPF;
break;
default:
usage();
break;
}
}
else {
lastarg++;
if(lastarg == MAXARGS){
fprintf(stderr, "Error: too many arguments\n");
exit(1);
}
find[lastarg] = argv[i];
found[lastarg] = FALSE;
}
}
if((mode == PATH) && (lastarg == -1))
usage();
if((mode != PATH) && (lastarg != -1))
usage();
if(getfile){
fprintf(stderr, "Error: missing argument\n");
usage();
}
/* INITIALIZATION */
pathfile = fopen(filename, "r");
if(pathfile == NULL){
fprintf(stderr, "Error: cannot open %s\n", filename);
exit(1);
}
level = 0;
eobuf = pathname + BUFLEN; /* end of pathname buffer */
pathchar = pathname;
site[level] = pathchar; /* points to level'th site in pathname */
reading = FALSE; /* TRUE if getting site name */
if(mode == PRETTY) first = TRUE;
while((c = fgetc(pathfile)) != EOF){
if(charok(c)){
/* get a site name into the buffer */
reading = TRUE;
*pathchar = c;
pathchar++;
checkeob();
}
else {
if(reading){
/* test site name */
reading = FALSE;
*pathchar = EOS;
lastchar = pathchar;
pathchar = site[level];
switch(mode){
case PATH:
searching = TRUE;
i = 0;
while(searching){
if(strcmp(find[i],site[level]) == 0){
/* found a site */
searching = FALSE;
found[i] = TRUE;
printf("%s\n", pathname);
}
else {
/* keep looking */
i++;
if(i > lastarg)
searching = FALSE;
}
}
break;
case ALL:
printf("%s\n", pathname);
break;
case PRETTY:
if(first)
first = FALSE;
else putchar(EOL);
puttabs(level);
printf("%s", site[level]);
break;
default:
/* this can't happen */
fprintf(stderr, "Error: unknown mode\n");
exit(1);
break;
}
}
switch(c){
/* white space */
case TAB:
case BLANK:
case EOL:
break;
case DOWN:
/* go down the tree */
*lastchar = BANG;
pathchar = lastchar+1;
checkeob();
level++;
if(level > MAXLEVELS){
fprintf(stderr, "Error: path too long\n");
exit(1);
}
site[level] = pathchar;
if(mode == PRETTY){
putchar(BLANK);
putchar(DOWN);
}
break;
case UP:
/* go up the tree */
if(mode == PRETTY){
putchar(EOL);
puttabs(level);
putchar(UP);
}
level--;
if(level < 0){
fprintf(stderr, "Error: unmatched '%c'\n", UP);
exit(1);
}
pathchar = site[level];
break;
default:
fprintf(stderr, "Warning: '%c' bad character\n", c);
break;
}
}
}
if(mode == PRETTY) putchar(EOL);
fclose(pathfile);
for(i=0; i<=lastarg; i++){
if(!found[i])
fprintf(stderr, "Site '%s' not found\n", find[i]);
}
}
usage(){
fprintf(stderr, "Usage: path [ <site> ... | -p[retty] | -a[ll] ] [-l[ong] | -f <pathfile>]\n");
exit(1);
}
puttabs(numtabs)
int numtabs;
{
int i, half, plusfour;
half = numtabs/2;
plusfour = ((numtabs%2) == 1);
for(i=1; i<=half; i++)
putchar(TAB);
if(plusfour)
printf(SPACEFOUR);
}
testbuf(ptr, end)
char *ptr, *end;
{
if(ptr == end){
fprintf(stderr, "Error: buffer overflow\n");
exit(1);
}
}
Rosebud
echo src/span.c
sed 's/^ //' > src/span.c << 'Rosebud'
/* FILE: SPAN.C 831005
* AUTHOR: OSCAR NIERSTRASZ
*/
#include <stdio.h>
#define MAXNODES 1500 /* max nodes in graph */
#define MAXCHARS 10000 /* max chars in site name buffer */
#define MAXCONNS 5000 /* max edges in graph */
#define MAXLEVELS 50 /* max path length */
#define SITELEN 30 /* max site name length */
#define LEVBUFSIZ (MAXNODES + MAXLEVELS)
#define EOLIST -1
#define NOTFOUND -1
#define NOTCHECKED -1
#define TRUE 1
#define FALSE 0
#define TAB '\t'
#define BLANK ' '
#define EOL '\n'
#define DOWN '{'
#define UP '}'
#define EOS '\0'
#define SPACEFOUR " "
#define loop for(;;)
#define charok(x) (('-' <= x) && (x <= 'z'))
#define checkeob() testbuf(namechar, eobuf)
#define checkeofind() testbuf(findptr, eofind)
#define ROOT 1
#define GRAPH 2
#define TREE 3
#define DONE 4
/* GLOBAL VARIABLES */
struct node {
char *sitename; /* pointer into namebuf[] */
int connlist; /* index into connbuf */
int distance; /* distance from root */
int done; /* flag when printed */
} nodelist[MAXNODES];
char namebuf[MAXCHARS]; /* buffer for site names */
int connbuf[MAXCONNS], connidx; /* buffer for adjacency lists */
int lastnode, rootnode, parent; /* indices into nodelist */
int all; /* TRUE with -a option -- for all equal length paths */
int trace; /* TRUE with -t option -- for diagnostic messages */
int compact; /* TRUE with -c option -- inhibits leading white space */
int levelbuf[LEVBUFSIZ], levelptr; /* lists of nodes at a given level */
int stack[MAXLEVELS], level; /* indices into connbuf or levelbuf */
FILE *infile, *outfile;
main(argc, argv)
int argc;
char **argv;
{
char *root;
int i, pretty, argtype;
/* ARGUMENT PROCESSING */
all = FALSE;
trace = FALSE;
pretty = FALSE;
compact = FALSE;
/* arguments are ROOT GRAPH and TREE */
argtype = ROOT;
outfile = stdout; /* by default */
for(i=1; i<argc; i++){
if(argv[i][0] == '-'){
switch(argv[i][1]){
case 'a':
all = TRUE;
break;
case 't':
trace = TRUE;
break;
case 'p':
pretty = TRUE;
break;
case 'c':
compact = TRUE;
break;
default:
usage();
break;
}
}
else {
switch(argtype){
case ROOT:
root = argv[i];
argtype = GRAPH;
break;
case GRAPH:
infile = fopen(argv[i], "r");
if(infile == NULL){
fprintf(stderr, "Error: Can't open %s\n", argv[i]);
exit(1);
}
argtype = TREE;
break;
case TREE:
outfile = fopen(argv[i], "w");
if(outfile == NULL){
fprintf(stderr, "Error: Can't open %s\n", argv[i]);
exit(1);
}
argtype = DONE;
break;
case DONE:
usage();
break;
default:
/* This can't happen */
fprintf(stderr, "Error: unknown argtype\n");
exit(1);
}
}
}
if((argtype != TREE) && (argtype != DONE))
usage();
loadnames(); /* first pass -- load site names */
rewind(infile);
loadconns(); /* second pass -- load adjacency lists */
if(pretty)
prettyprint();
else {
if((rootnode = search(root)) == NOTFOUND){
fprintf(stderr, "Error: no entry for root site '%s'\n", root);
exit(1);
}
if(trace)
fprintf(stderr, "\nmain: root site '%s' is node %d\n\n", root, rootnode);
gentree(); /* generate the spanning tree */
printtree(); /* traverse and print the tree */
orphans(); /* warn of unreachable sites */
}
fclose(outfile);
}
usage(){
fprintf(stderr, "Usage: span <root site> <graph file> [<tree file>] [-a[ll]] [-c[ompact]]\n");
exit(1);
}
puttabs(numtabs) /* use tabs and blanks to tab (4 * numtabs) spaces */
int numtabs;
{
int i, half, plusfour;
if(compact)
return;
half = numtabs/2;
plusfour = ((numtabs%2) == 1);
for(i=1; i<=half; i++)
fputc(TAB, outfile);
if(plusfour)
fprintf(outfile, SPACEFOUR);
}
testbuf(ptr, end)
char *ptr, *end;
{
if(ptr == end){
fprintf(stderr, "Error: buffer overflow\n");
exit(1);
}
}
orphans() /* find nodes not covered by the spanning tree */
{
int currnode;
for(currnode=0; currnode<=lastnode; currnode++)
if(!nodelist[currnode].done)
fprintf(stderr, "Warning: %s could not be reached\n",
nodelist[currnode].sitename);
}
loadnames(){
char c, *namechar, *eobuf;
int reading, freenode, test;
/* reads sitenames into namebuf[] and sets */
/* nodelist[].sitename to point to this name */
namechar = namebuf;
eobuf = namebuf+MAXCHARS;
reading = FALSE;
freenode = 0;
nodelist[freenode].sitename = namechar;
while((c = fgetc(infile)) != EOF){
if(charok(c)){
reading = TRUE;
*namechar = c;
namechar ++;
checkeob();
}
else {
if(reading){
reading = FALSE;
*namechar = EOS;
namechar++;
checkeob();
if(trace)
fprintf(stderr, "loadnames: node %d = %s\n", freenode, nodelist[freenode].sitename);
if(freenode != 0){
if((test = strcmp(nodelist[freenode-1].sitename, nodelist[freenode].sitename)) == 0)
fprintf(stderr, "Warning: duplicate entry for site '%s'\n", nodelist[freenode].sitename);
if(test > 0){
fprintf(stderr, "Error: input not sorted\n");
exit(1);
}
}
freenode++;
if(freenode > MAXNODES){
fprintf(stderr, "Error: too many sites (max = %d)\n", MAXNODES);
exit(1);
}
nodelist[freenode].sitename = namechar;
}
switch(c){
case TAB:
case BLANK:
case EOL:
break;
case DOWN:
/* skip the adjacency lists on the first pass */
while((c = fgetc(infile)) != UP)
if(c == EOF){
fprintf(stderr, "Error: EOF -- missing '%c'\n", UP);
exit(1);
}
break;
case UP:
fprintf(stderr, "Warning: mismatched '%c'\n", UP);
break;
default:
fprintf(stderr, "Warning: '%c' bad character\n", c);
break;
}
}
}
if(freenode == 0){
fprintf(stderr, "Error: empty input file\n");
exit(1);
}
lastnode = freenode - 1;
if(trace){
fprintf(stderr, "\nloadnames: # of sites = %d (max %d)\n", lastnode, MAXNODES);
fprintf(stderr, "loadnames: %d characters used (max = %d)\n\n", (namechar - namebuf), MAXCHARS);
}
}
loadconns()
{
int i, currnode, connect, reading, getconn;
char c, findsite[SITELEN], *findptr, *eofind;
/* reads the adjacency list for each node and stores */
/* the nodelist indices of each adjacent node in connbuf[] */
/* search() is used to convert site names to indices. */
/* nodelist[].connlist points to the beginning of the */
/* adjacency list in connbuf[]. The lists are terminated */
/* with an EOLIST. */
connidx = 0; /* index into connbuf */
reading = FALSE;
findptr = findsite; /* site names are read into this buffer */
eofind = findsite + SITELEN;
getconn = FALSE; /* TRUE within adjacency list */
currnode = -1;
while((c = fgetc(infile)) != EOF){
if(charok(c)){
reading = TRUE;
*findptr = c;
findptr++;
checkeofind();
}
else{
if(reading){
reading = FALSE;
*findptr = EOS;
findptr = findsite;
if(getconn){
if((connect = search(findsite)) == NOTFOUND)
fprintf(stderr, "Warning: no entry for site '%s'\n", findsite);
else{
/* store the adjacency */
connbuf[connidx] = connect;
connidx++;
if(trace)
fprintf(stderr, "loadconns: %s -> %s\n", nodelist[currnode].sitename, nodelist[connect].sitename);
if(connidx == MAXCONNS){
fprintf(stderr, "Error: too many connections\n");
exit(1);
}
}
}
else{
currnode++;
/* check if the host is still the one */
/* you read in loadnames() */
if(strcmp(findsite, nodelist[currnode].sitename) != 0){
/* This can't happen */
fprintf(stderr, "Program error: '%s' ~= '%s'\n", findsite, nodelist[currnode].sitename);
exit(1);
}
/* terminate previous list */
connbuf[connidx] = EOLIST;
connidx++;
if(connidx == MAXCONNS){
fprintf(stderr, "Error: too many connections\n");
exit(1);
}
nodelist[currnode].connlist = connidx;
/* initialize other variables */
nodelist[currnode].distance = NOTCHECKED;
nodelist[currnode].done = FALSE;
}
}
switch(c){
case TAB:
case BLANK:
case EOL:
break;
case DOWN:
if(getconn)
fprintf(stderr, "Warning: extra '%c' ignored\n", DOWN);
/* the next site name is an adjacency */
getconn = TRUE;
break;
case UP:
if(!getconn)
fprintf(stderr, "Warning: extra '%c' ignored\n", UP);
/* the next site name is a host */
getconn = FALSE;
break;
default:
fprintf(stderr, "Warning: '%c' bad character\n", c);
break;
}
}
}
/* terminate the last adjacency list */
connbuf[connidx] = EOLIST;
if(trace){
fprintf(stderr, "\nloadconns: connbuf = ");
for(i=0; i<=connidx; i++)
fprintf(stderr, "%d ", connbuf[i]);
fprintf(stderr, "\nloadconns: graph contains %d connections (max %d)\n\n", (connidx - lastnode), MAXCONNS);
}
}
search(findsite)
char *findsite;
{
int top, bot, mid, test;
/* binary search through nodelist[].sitename */
top = 0;
bot = lastnode;
if((test = strcmp(nodelist[top].sitename, findsite)) == 0)
return(top);
if(test > 0)
return(NOTFOUND);
if((test = strcmp(nodelist[bot].sitename, findsite)) == 0)
return(bot);
if(test < 0)
return(NOTFOUND);
loop{
if(top == bot)
return(NOTFOUND);
mid = (top + bot)/2;
if(mid == top)
return(NOTFOUND);
if((test = strcmp(nodelist[mid].sitename, findsite)) == 0)
return(mid);
if(test < 0)
top = mid;
else bot = mid;
}
}
gentree()
{
int i, notdone, nextsite, parentnode;
/* generate spanning tree by recording the distance */
/* of each site from the root. */
level = 0; /* start at distance = level 0 */
levelptr = 0;
stack[level] = levelptr; /* points to a list of nodes at that level */
levelbuf[levelptr] = rootnode; /* root is at level 0 */
nodelist[rootnode].distance = level;
levelptr++;
notdone = TRUE;
while(notdone){
notdone = FALSE;
checklev(); /* check for buffer overflow */
levelbuf[levelptr] = EOLIST; /* terminate previous list */
level++; /* next level */
if(level == MAXLEVELS){
fprintf(stderr, "Error: path too long (max %d)\n", MAXLEVELS);
exit(1);
}
levelptr++;
checklev();
stack[level] = levelptr;
/* find all the children of nodes at the previous level */
parent = stack[level-1]; /* init for getnode() */
parentnode = levelbuf[parent];
/* connidx points to the first possible child */
connidx = nodelist[parentnode].connlist;
/* record all nodes found at this level */
while((nextsite = getnode()) != EOLIST){
notdone = TRUE;
nodelist[nextsite].distance = level;
levelbuf[levelptr] = nextsite;
levelptr++;
checklev();
if(trace)
fprintf(stderr, "gentree: level %d => %s\n", level, nodelist[nextsite].sitename);
}
/* if no nodes found at this level then */
/* notdone is still FALSE */
}
if(trace){
fprintf(stderr, "gentree: levelbuf = ");
for(i=0; i<levelptr; i++)
fprintf(stderr, "%d ", levelbuf[i]);
fprintf(stderr, "\n");
}
}
getnode()
{
int next, parentnode;
loop{
if((next = connbuf[connidx]) != EOLIST){
connidx++;
/* return if this node has not been checked */
/* if the distance has already been set */
/* then keep looking */
if(nodelist[next].distance == NOTCHECKED)
return(next);
}
else {
/* last child, so get next parent */
parent++;
parentnode = levelbuf[parent];
/* no more parents? */
if(parentnode == EOLIST)
return(EOLIST);
else connidx = nodelist[parentnode].connlist;
}
}
}
checklev(){
if(levelptr > LEVBUFSIZ){
/* This can't happen */
fprintf(stderr, "Error: level buffer overflow\n");
exit(1);
}
}
printtree()
{
int nextsite, previous, started;
/* traverse the tree depth first, printing each node */
level = 0;
previous = 1; /* previous level */
started = FALSE;
while((nextsite = depthfirst()) != EOLIST){
if(previous < level){
fputc(BLANK, outfile);
fputc(DOWN, outfile);
}
else while(previous > level){
fputc(EOL, outfile);
puttabs(previous-1);
fputc(UP, outfile);
previous--;
}
if(started)
fputc(EOL, outfile);
else started = TRUE;
puttabs(level-1);
fprintf(outfile, "%s", nodelist[nextsite].sitename);
previous = level;
}
while(previous > 1){
fputc(EOL, outfile);
puttabs(previous-1);
fputc(UP, outfile);
previous--;
}
if(started)
fputc(EOL, outfile);
}
depthfirst()
{
int next;
if(level < 1){ /* initially */
nodelist[rootnode].done = TRUE;
level = 1;
stack[level] = nodelist[rootnode].connlist;
}
else {
/* try to go down a level (depth first) */
next = connbuf[stack[level]];
level++;
stack[level] = nodelist[next].connlist;
}
loop{
if((next = connbuf[stack[level]]) == EOLIST){
/* leaf node, so go up and right */
level--;
if(level < 1)
return(EOLIST);
stack[level]++; /* step right */
}
else {
if((nodelist[next].distance == level) &&
(all || !nodelist[next].done)){
nodelist[next].done = TRUE;
return(next);
}
/* wrong level or previously handled, step right */
stack[level]++;
}
}
}
prettyprint(){
int currnode, connect;
/* print each adjacency list as read in by loadnames() */
/* and loadconns() */
for(currnode=0; currnode<=lastnode; currnode++){
fprintf(outfile, "%s", nodelist[currnode].sitename);
connidx = nodelist[currnode].connlist;
if(connbuf[connidx] != EOLIST){
fprintf(outfile, " { ");
while((connect = connbuf[connidx]) != EOLIST){
fprintf(outfile, "%s ", nodelist[connect].sitename);
connidx++;
}
fprintf(outfile, "}\n");
}
else fputc(EOL, outfile);
}
}
Rosebud
echo src/unpath.c
sed 's/^ //' > src/unpath.c << 'Rosebud'
/* FILE: UNPATH.C
* AUTHOR: OSCAR NIERSTRASZ
*
* Converts paths into lists of edges. eg:
*
* allegra!amd70!trsvax!sneaky
*
* becomes
*
* allegra amd70
* amd70 trsvax
* trsvax sneaky
*
* This is useful for finding new mail connections from
* such sources as net.news. See edge(1), span(1) and path(1).
*/
#include <stdio.h>
#define MAX 20
#define BAD 1
#define OLD 2
#define NEW 3
#define EOL '\n'
#define EOS '\0'
#define BANG '!'
#define charok(x) (('-' <= x) && (x <= 'z'))
main()
{
char s1[MAX], s2[MAX], *s, *host, *guest;
int sep;
host = s1;
guest = s2;
sep = getsite(host);
while(sep != EOF){
switch(sep){
case BAD:
case MAX:
case NEW:
sep = getsite(host);
break;
case OLD:
sep = getsite(guest);
printf("%s %s\n", host, guest);
s = host;
host = guest;
guest = s;
break;
}
}
}
getsite(s)
char *s;
{
int i=0;
char c;
c = fgetc(stdin);
while((c != EOL) && (c != BANG)){
if(c == EOF)
return(EOF);
if(!charok(c)){
fprintf(stderr, "Bad character: '%c'\n", c);
return(BAD);
}
s[i] = c;
i++;
if(i == MAX){
fprintf(stderr, "Site name too long: '%s'\n", s);
s[i-1] = '\0';
return(MAX);
}
c = fgetc(stdin);
}
s[i] = EOS;
if(c == EOL)
return(NEW);
else return(OLD);
}
Rosebud
echo map/
mkdir map
echo map/README
sed 's/^ //' > map/README << 'Rosebud'
This is a work directory for creating the graphfile used by span(1).
See documentation for span(1), path(1) and unpath(1).
Change the line "host = utcsrgv" in the makefile to your sitename.
If your site has an entry in "graphfile", simply run:
make pathfile
and install the pathfile in whatever location the path program
expects to find it (see ../src/path.c).
If your site is not mentioned in graphfile, you may add it
by editing in the appropriate line (in SORT order), or
you may do it automatically by adding the new edges (see the
examples in "bad" and "oneway"):
To add new edges, place them in "more" and run "make pathfile".
Install the pathfile in the appropriate location. (You may modify
the makefile to do this automatically.) "make clean" will get
rid of the generated files.
------------------------------- FILES -------------------------------
makefile .............. makefile for generating pathfile
edmap ................. a shell script for converting net maps to graph files
graphfile ............. the mail connection database
backup ................ a backup of the previous graphfile
pathfile .............. generated from graphfile
sites ................. generated from graphfile
more .................. new edges to be added to graphfile
bad ................... some connections that don't seem to work
oneway ................ "one-way" connections (various reasons)
ae.awk ................ convert adjacency lists to edge lists
bot.awk ............... select bottom half of edge list
ea.awk ................ convert edge lists to adjacency lists
rev.awk ............... reverse edges
sites.awk ............. print site names only
top.awk ............... select top half of edge list
Rosebud
echo map/ae.awk
sed 's/^ //' > map/ae.awk << 'Rosebud'
BEGIN {
host = 1
site = ""
}
{
for (i=1; i <= NF; i++) {
if ($i == "{") {
if (host)
host = 0
else {
printf "Mismatched braces\n"
exit
}
}
else if ($i == "}") {
if (host) {
printf "Mismatched braces\n"
exit
}
else host = 1
}
else {
if (host)
site = $i
else print site, $i
}
}
}
END {
if (!host) {
printf "Mismatched braces\n"
exit
}
}
Rosebud
echo map/bad
sed 's/^ //' > map/bad << 'Rosebud'
cornell lbl-csam
ctvax uiucdcs
ihnp4 mh3bs
lbl-csam cornell
mh3bs ihnp4
trsvax uiucdcs
uiucdcs uiucsrl
uiucdcs uok
uiucdcs uokvax
Rosebud
echo map/bot.awk
sed 's/^ //' > map/bot.awk << 'Rosebud'
$2 > $1
Rosebud
echo map/dist.awk
sed 's/^ //' > map/dist.awk << 'Rosebud'
BEGIN { FS = "!" }
{ if (NF >= 6) print NF, $0 }
Rosebud
echo map/ea.awk
sed 's/^ //' > map/ea.awk << 'Rosebud'
BEGIN {
host = ""
prev = 0
}
{
if ($1 != host) {
if (prev)
printf " }\n"
else prev = 1
host = $1
linelen = length + 2
printf "%s { %s", $1, $2
}
else {
linelen = linelen + 1 + length($2)
if (linelen > 70) {
printf "\n\t%s", $2
linelen = 8 + length($2)
}
else printf " %s", $2
}
}
END {
if (prev)
printf " }\n"
}
Rosebud
echo map/edmap
sed 's/^ //' > map/edmap << 'Rosebud'
ed - $1 <<!
1,/^Lines/d
g/^echo/d
g/^cat/d
g/^Comments/d
g/^\!Funky/d
g/^Organization/d
g/^Contact/d
g/^Phone/d
g/^Postal/d
g/^Electronic/d
g/^Name/s/$/ {/
g/^Name/i }
g/^Name:/s///
g/^News:/s///
g/^Mail:/s///
g/^ */s///
g/^$/d
w
q
!
echo map $1 finished
Rosebud
echo map/graphfile
sed 's/^ //' > map/graphfile << 'Rosebud'
5941ux { allegra houxf houxm ihnp4 machaids }
abnjh { allegra ihnp4 pyuxll u1100a }
adec23 { hssg40 }
adiron { allegra duke rlgvax }
alberta { allegra auvax ihnp4 sask ubc-vision }
alfalfa { allegra ihnp4 spanky }
alice { allegra cbosg circe cornell floyd ihnp4 ima mhtsa npois npoiv
rabbit research ulysses }
allegra { 5941ux abnjh adiron alberta alfalfa alice aluxz amd70 ariel
arizona astrovax beesvax brunix burl cbosg cbosgd cbrmc cbscc
cbscd5 circe cmcl2 cornell decvax decwrl denelcor druxs duke
eagle eisx esquire floyd fluke fortune garfield gatech genrad
gummo harpo hfhrv hlexa hlhop hocda hocsf hogpc hogpd hou5a
hou5b hou5c hou5d hou5e hou5f houca houem hound houti houxa
houxf houxk houxm houxw houxz hp-dcd hplabs ih1ap iheds ihldt
ihlts ihn5i ihn5l ihnet ihnp1 ihnp3 ihnp4 ihnss ihpad ihtnt
ihtpa ihu1e ihu1f ikonas ima inuxa inuxb inuxc inuxd inuxe
ism780 isrnix ittvax iuvax ixhte ixn5c kcwin kpno laidbak
linus ll1 llkp03 machaids masscomp mb2c mcnc mh3bs mhtsa mhuxa
mhuxd mhuxh mhuxi mhuxj mhuxm mhuxr mhuxt mhuxv mi-cec mit-vax
nbires ncrday npois npoiv nscs nwuxd ogcvax oliveb orion otuxa
parsec pegasus philabs phonlab pitt princeton psuvax pur-ee
purdue pyuxcc pyuxdd pyuxhh pyuxi pyuxjj pyuxk pyuxl pyuxll
pyuxmm pyuxnn pyuxqq pyuxss pyuxvv rabbit rayssd research
rlgvax rna rochester rocksvax sb1 sb6 sbcs scbhq scgvaxd
sdcarl sdcrdcf sdcsvax spanky sri-unix stolaf sun sunrise
teklabs tektronix tpsa tropix u1100a u1100s ucbcad ucbvax
ucsfcgl uf-cgrl ulysses umcp-cs unc uniq uofm-cv ut-ngp
utcsrgv utzoo uvacs uw-beaver uwvax vax135 vortex watcgl
wateng watmath wb2 wbux5 we13 we53 wheps whuxk whuxlb wjh12
zehntel zeppo }
altos86 { amd70 microsoft sun }
aluxz { allegra ihnp4 mhuxi }
amd70 { allegra altos86 burl clyde decwrl eagle floyd fortune ihnp4
ihnss ima megatest nbires packet qubix research rocksvax sco
sri-unix sun tpsa trsvax trw-unix turtlevax twg ucbvax uf-cgrl
uofm-cv varian vortex wjh12 zehntel }
aplvax { brl-bmd umcp-cs }
ariel { allegra hou5f houti ihnp4 maxvax orion vax135 }
arizona { allegra cornell ihnp4 kpno mcnc purdue teklabs ucbvax
utah-cs uw-beaver }
astrovax { allegra burl cbosgd decvax ihnp4 kpno princeton rocky2 }
atd { avsdS dsd hplabs turtlevax ucbvax }
att3 { ll1 }
aus86 { icalqa omsvax ut-ngp }
auvax { alberta }
avsdF { avsdS }
avsdS { atd avsdF avsdT dsd }
avsdT { avsdS }
basservax { mhtsa sdchema }
beesvax { allegra ima ios ism780 oz uf-cgrl utah-cs }
bmcg { felix sdccsu3 sdcrdcf sdcsvax }
bpa { burdvax ll1 sb1 sb6 }
brl-bmd { aplvax decvax denelcor duke esquire hao rlgvax udrelay
umcp-cs unc }
bronze { iddic tekcad tekchips tekecs tekgds teklabs tekmdp tektronix }
brunix { allegra cornell foxvax1 ihnp4 ima linus rayssd uf-cgrl
ulysses yale-comix }
bunker { bunkerb decvax duke ittvax philabs watmath zeppo }
bunkerb { bunker }
burdvax { bpa presby psuvax sdcrdcf }
burl { allegra amd70 astrovax cbosgd clyde duke floyd ihnp4 ittral
kcwin mcnc mgweed mhuxv otuxa sb1 sb6 spanky unm-ivax we13
whuxk whuxlb }
cbosg { alice allegra cbosgd cbscd5 cornell druxs ihnp4 mhuxt npois
nscs osu-dbs pyuxhh teklabs ucbvax }
cbosgd { allegra astrovax burl cbosg cbrap cbrmc cbscc cbscd5 cornell
fortune ihnp4 ima linus mddc mhuxi mhuxj npois nscs osu-dbs
philabs pur-ee rlgvax sdcrdcf ulysses }
cbrap { cbosgd }
cbrmc { allegra cbosgd ihnp4 mork-cb nscs }
cbscc { allegra cbosgd cbscd5 ihnp4 }
cbscd5 { allegra cbosg cbosgd cbscc ihnp4 }
cca { comet csin decvax ima linus security sri-unix }
ccieng5 { rayssd ritcv rlgvax }
ccvaxa { uiucdcs }
cda5d { houxz }
cdi { metheus reed sequel }
cdlncch { laidbak turtlevax }
cfib { foxvax1 ima sii }
cg-d { decvax }
cincy { decvax ncrday }
circe { alice allegra eagle gatech harpo ihnp4 mhuxa mhuxj mhuxt
rabbit research ulysses }
cires { csu-cs hao nbires }
clyde { amd70 burl floyd ihnp4 masscomp }
cmcl1 { cmcl2 }
cmcl2 { allegra cmcl1 cornell esquire floyd harpo ihnp4 lanl-a nybcb
philabs presby rna rocky2 sunrise }
comet { cca regi ukc }
cornell { alice allegra arizona brunix cbosg cbosgd cmcl2 ctvax decvax
eagle esquire floyd harpo ihnp4 ihnss ima lanl-a mcnc megatest
nbires ogcvax psuvax purdue rabbit research sask sii sun tesla
unc utcsrgv uw-beaver vax135 yale-comix zeppo }
crimson { tekmdp }
crystal { uwvax }
csin { cca sri-unix }
csu-cs { cires denelcor hao hp-dcd hplabs lanl-a mit-vax unmvax }
ctvax { cornell nbires parsec trsvax ut-ngp }
cubs45 { esquire }
cvl { rlgvax umcp-cs }
cwruecmp { cwrunix decvax medman teklabs uf-cgrl utzoo }
cwrunix { cwruecmp }
dadla { dadla-a dadla-b dadla-d tekmdp }
dadla-a { dadla }
dadla-b { dadla }
dadla-d { dadla }
dcdwest { ittvax sdcsvax }
dciem { hcr trigraph utcsrgv utzoo }
decvax { allegra astrovax brl-bmd bunker cca cg-d cincy cornell
cwruecmp decwrl duke genrad harpo hcr hei44 idis ihnp4 ittvax
kpno linus masscomp mcnc mcvax microsoft philabs pur-ee
sdchema sii teklabs tektronix trw-unix ucbvax ucf-cs unh
utcsrgv utzoo uw-beaver vortex watmath wivax yale-comix }
decwrl { allegra amd70 decvax flairvax ihnp4 ios purdue qubix sequel
sun turtlevax ucbvax utcsrgv }
denelcor { allegra brl-bmd csu-cs hao nbires }
diku { ibt mcvax }
dri0 { pitt }
druxs { allegra cbosg ihnp4 ixn5c maxvax }
dsd { atd avsdS fortune hplabs }
duke { adiron allegra brl-bmd bunker burl decvax dvamc hplabs ihnp4
ittvax mcnc phs reed tucc ucf-cs unc utzoo }
dutesta { mcvax }
dvamc { duke mcnc phs }
dvlcn { sask }
eagle { allegra amd70 circe cornell eisx harpo ihnp4 masscomp mh3bs
mhtsa mhuxi mhuxj mhuxt mit-vax pur-ee purdue sb1 sb6 spanky
teklabs ucbvax ulysses ut-ngp wb2 wheps }
ecn-ec { ecn-pa pur-ee purdue }
ecn-ed { ecn-pc }
ecn-pa { ecn-ec ecn-pc pur-ee }
ecn-pc { ecn-ed ecn-pa }
ecs { tucc }
edai { edee edmrc }
edcaad { edee edmrc logica mcvax root44 ukc vax135 }
edee { edai edcaad edmiru glasgow }
edmiru { edee edmrc }
edmrc { edai edcaad edmiru glasgow }
eisx { allegra eagle ihnp4 inuxa npois npoiv pyuxjj pyuxll whuxlb }
emory { gatech msdc sb1 sb6 }
esquire { allegra brl-bmd cmcl2 cornell cubs45 ima inmet rna }
fau { ucf-cs }
felix { bmcg trw-unix vortex }
flairvax { decwrl hpda hplabs turtlevax }
floyd { alice allegra amd70 burl clyde cmcl2 cornell fortune harpo
idis ihnp4 ima kpno masscomp philabs pur-ee purdue rabbit
sunrise ucbvax unc utcsrgv utzoo vax135 vortex whuxlb }
fluke { allegra microsoft sb1 sb6 ssc-vax teltone uf-cgrl uw-beaver
uw-vlsi }
fortune { allegra amd70 cbosgd dsd floyd harpo hpda ihnp4 megatest nsc
oliveb sri-unix twg varian vortex wdl1 }
foxvax1 { brunix cfib wjh12 }
garfield { allegra ihnp4 linus munodie utcsrgv }
gatech { allegra circe emory itm msdc rlgvax sb1 sb6 uf-cgrl ulysses
unmvax ut-ngp }
genrad { allegra decvax grkermit linus masscomp mit-eddie security
wjh12 }
glasgow { edee edmrc glhocus }
glhocus { glasgow }
grkermit { genrad masscomp mit-vax }
gummo { allegra harpo ihnp4 whuxlb zeppo }
hao { brl-bmd cires csu-cs denelcor hplabs hplabsb hplabsc kpno
menlo70 nbires seismo ucsfcgl }
harpo { harpo houxf uw-beaver }
hcr { dciem decvax ihnp4 trigraph utcsrgv utzoo watmath }
hei44 { decvax ittvax sii }
hfhrv { allegra mb2c }
hirst1 { ukc }
hlexa { allegra hlhop ihnp4 }
hlhop { allegra hlexa ihnp4 mhuxh }
hocda { allegra houxm houxz idis ihnp4 inuxc machaids spanky }
hocsf { allegra hogpc ihnp4 }
hogpc { allegra hocsf hogpd hou5d houca houti houxm ihnp4 npois
pegasus }
hogpd { allegra hogpc ihnp4 }
hou5a { allegra hou5b hou5c hou5d hou5e hou5f houca houti houxa houxf
houxk houxm houxw houxz ihnp4 }
hou5b { allegra hou5a hou5c hou5d hou5e hou5f houca houti houxa houxf
houxk houxm houxw houxz ihnp4 }
hou5c { allegra hou5a hou5b hou5d hou5e hou5f houca houti houxa houxf
houxk houxm houxw houxz ihnp4 }
hou5d { allegra hogpc hou5a hou5b hou5c hou5e hou5f houca houti houxa
houxf houxk houxm houxw houxz ihnp4 }
hou5e { allegra hou5a hou5b hou5c hou5d hou5f houca houti houxa houxf
houxk houxm houxw houxz ihnp4 }
hou5f { allegra ariel hou5a hou5b hou5c hou5d hou5e houca houti houxa
houxf houxk houxm houxw houxz ihnp4 npoiv orion }
houca { allegra hogpc hou5a hou5b hou5c hou5d hou5e hou5f houti ihnp4
odin orion }
houem { allegra houxm ihnp4 }
hound { allegra houxa houxm ihnp4 }
houti { allegra ariel hogpc hou5a hou5b hou5c hou5d hou5e hou5f houca
ihnp4 pegasus }
houxa { allegra hou5a hou5b hou5c hou5d hou5e hou5f hound houxf houxk
houxm ihnp4 maxvax spanky }
houxf { 5941ux allegra harpo hou5a hou5b hou5c hou5d hou5e hou5f houxa
houxm ihnp4 maxvax spanky }
houxk { allegra hou5a hou5b hou5c hou5d hou5e hou5f houxa houxm houxw
ihnp4 maxvax spanky }
houxm { 5941ux allegra hocda hogpc hou5a hou5b hou5c hou5d hou5e hou5f
houem hound houxa houxf houxk houxw houxz ihnp4 maxvax mhuxa
mhuxi npois pegasus spanky u1100a wbux5 whuxk }
houxw { allegra hou5a hou5b hou5c hou5d hou5e hou5f houxk houxm ihnp4
maxvax spanky }
houxz { allegra cda5d hocda hou5a hou5b hou5c hou5d hou5e hou5f houxm
ihnp4 maxvax npois spanky wb2 wbux5 whuxk }
hp-cvd { hp-pcd hplabs kirk }
hp-dcd { allegra csu-cs hp-pcd hpda hplabs }
hp-pcd { harpo hp-cvd hp-dcd hpda hplabs microsoft ogcvax orstcs }
hpda { flairvax fortune hp-dcd hp-pcd hpdb hpdc hplabs hptabu sun
ucbvax }
hpdb { hpda hpdc hptabu }
hpdc { hpda hpdb hptabu }
hplabs { allegra atd csu-cs dsd duke flairvax hao hp-cvd hp-dcd hp-pcd
hpda hplabsb hplabsc icalqa mcnc menlo70 oliveb omsvax purdue
sdcarl sdcrdcf sri-unix sytek ucbvax utah-cs zehntel }
hplabsb { hao hplabs zehntel }
hplabsc { hao hplabs icalqa zehntel }
hptabu { hpda hpdb hpdc }
hscfvax { n44a }
hscvax { nbires wjh12 }
hssg40 { adec23 sask }
ibt { diku }
icalqa { aus86 hplabs hplabsc omsvax pur-ee rocks34 }
ico { ima }
iddic { bronze tekcad tekchips tekecs tekgds teklabs tektronix }
idis { decvax floyd hocda mcnc mi-cec pitt }
ih1ap { allegra ihnp4 }
ih4ep { ihnp4 }
iheds { allegra ihnp4 ixn5c }
ihhfl { ihnp4 }
ihima { ihnp4 }
ihldt { allegra ihnp4 ihtnt ixn5c }
ihlts { allegra ihnp4 }
ihn5i { allegra ihnp4 }
ihn5l { allegra ihnp4 }
ihnet { allegra ihnp4 }
ihnp1 { allegra ihnp4 }
ihnp3 { allegra ihnp4 }
ihnp4 { 5941ux abnjh alberta alfalfa alice allegra aluxz amd70 ariel
arizona astrovax brunix burl cbosg cbosgd cbrmc cbscc cbscd5
circe clyde cmcl2 cornell decvax decwrl druxs duke eagle eisx
floyd fortune garfield gummo harpo hcr hlexa hlhop hocda hocsf
hogpc hogpd hou5a hou5b hou5c hou5d hou5e hou5f houca houem
hound houti houxa houxf houxk houxm houxw houxz ih1ap ih4ep
iheds ihhfl ihima ihldt ihlts ihn5i ihn5l ihnet ihnp1 ihnp3
ihnss ihpad ihtnt ihtpa ihu1e ihu1f inuxa inuxb inuxc inuxd
inuxe iuvax ixhte ixn5c kcwin kpno laidbak linus ll1 llkp03
machaids masscomp mb2c mcnc mgweed mhtsa mhuxa mhuxd mhuxh
mhuxi mhuxj mhuxm mhuxr mhuxt mhuxv npois npoiv nwuxd odin
orion otuxa parsec pegasus phonlab princeton psuvax pur-ee
purdue pyuxcc pyuxdd pyuxhh pyuxi pyuxjj pyuxk pyuxl pyuxll
pyuxmm pyuxnn pyuxqq pyuxss pyuxvv rabbit research rlgvax sb1
sb6 scbhq sdcarl sdcrdcf sdcsvax seismo spanky stolaf sun
teklabs tektronix tropix tty3b u1100a u1100s ucbvax uiucdcs
ulysses umn-cs uniq uofm-cv ut-ngp utcsrgv utzoo uw-beaver
uwvax vax135 vortex watmath wb2 wbux5 we13 we53 wheps whuxk
whuxlb wjh12 zehntel zeppo zinfandel }
ihnss { allegra amd70 cornell ihnp4 pur-ee sdcrdcf teklabs }
ihpad { allegra ihnp4 }
ihtnt { allegra ihldt ihnp4 }
ihtpa { allegra ihnp4 }
ihu1e { allegra ihnp4 }
ihu1f { allegra ihnp4 }
ikonas { allegra mcnc ncsu }
ima { alice allegra amd70 beesvax brunix cbosgd cca cfib cornell
esquire floyd ico images imd inmet ipa ism750 ism780 n44a
princeton rabbit research vortex wjh12 yale-comix }
images { ima }
imd { ima }
inmet { esquire harpo ima masscomp }
inuxa { allegra eisx ihnp4 inuxc pur-ee purdue }
inuxb { allegra ihnp4 inuxc pur-ee }
inuxc { allegra hocda ihnp4 inuxa inuxb inuxd inuxe ixn5c pur-ee }
inuxd { allegra ihnp4 inuxc pur-ee }
inuxe { allegra ihnp4 inuxc }
ios { beesvax decwrl oliveb qubix uf-cgrl }
ipa { ima }
ism750 { ima }
ism780 { allegra beesvax ima }
isrnix { allegra iuvax pur-ee }
itm { gatech msdc }
ittral { burl ittvax laidbak mcnc ncsu }
ittvax { allegra bunker dcdwest decvax duke hei44 ittral ndcuts psuvax
purdue qubix qumix research sii uf-cgrl wxlvax yale-comix }
iuvax { allegra ihnp4 isrnix pur-ee twg }
ixhte { allegra ihnp4 }
ixn5c { allegra druxs iheds ihldt ihnp4 inuxc }
kcwin { allegra burl ihnp4 we53 }
kirk { hp-cvd }
kobold { masscomp orc }
kpno { allegra arizona astrovax decvax floyd hao ihnp4 sdcarl sdcsvax
seismo unc utastro vortex }
laidbak { allegra cdlncch ihnp4 ittral trsvax }
lanl-a { cmcl2 cornell csu-cs nmtvax purdue unm-ivax utah-cs }
linus { allegra brunix cbosgd cca decvax garfield genrad ihnp4
mit-eddie philabs rayssd security utcsrgv utzoo uw-beaver
vaxine watmath wivax wjh12 yale-comix }
ll1 { allegra att3 bpa ihnp4 ll1b otuxa sb1 sb6 }
ll1b { ll1 sb1 sb6 }
llkp03 { allegra ihnp4 whuxk }
logica { edcaad }
machaids { 5941ux allegra hocda ihnp4 }
masscomp { allegra clyde decvax eagle floyd genrad grkermit harpo
ihnp4 inmet kobold mit-vax orc pur-ee research tektronix
ucbcad zeppo }
maxvax { ariel druxs houxa houxf houxk houxm houxw houxz pegasus sask }
mb2b { uofm-cv }
mb2c { allegra hfhrv ihnp4 sb1 sb6 uofm-cv }
mcnc { allegra arizona burl cornell decvax duke dvamc hplabs idis
ihnp4 ikonas ittral msdc ncsu rlgvax tucc ulysses unc unc-c }
mcpdp34 { mcpdp45 mcvax }
mcpdp45 { mcpdp34 mcvax }
mcvax { decvax diku dutesta edcaad mcpdp34 mcpdp45 nlgvax philabs
philmds sara70 ukc uvapsy vmucnam vu44 vub zti1 }
mddc { cbosgd }
medman { cwruecmp }
megatest { amd70 cornell fortune p500vax sun ubvax }
menlo70 { hao hplabs nsc pur-ee sdcrdcf sri-unix sytek ucbvax ucsfcgl }
metheus { cdi ogcvax uf-cgrl }
mgweed { burl ihnp4 we13 }
mh3bs { allegra eagle mhtsa we53 }
mhtsa { ihnp4 }
mhuxa { allegra circe houxm ihnp4 mhuxd mhuxh mhuxi mhuxj mhuxt mhuxv
ulysses }
mhuxd { allegra ihnp4 mhuxa mhuxh mhuxm mhuxv }
mhuxh { allegra hlhop ihnp4 mhuxa mhuxd mhuxi mhuxj mhuxm mhuxt }
mhuxi { allegra aluxz cbosgd eagle houxm ihnp4 mhuxa mhuxh mhuxj mhuxm
mhuxt mhuxv vax135 wjh12 }
mhuxj { allegra cbosgd circe eagle ihnp4 mhuxa mhuxh mhuxi mhuxm mhuxt
mhuxv pyuxjj }
mhuxm { allegra ihnp4 mhuxd mhuxh mhuxi mhuxj mhuxr mhuxt mhuxv pyuxi
pyuxjj }
mhuxr { allegra ihnp4 mhuxm mhuxt }
mhuxt { allegra cbosg circe eagle ihnp4 mhuxa mhuxh mhuxi mhuxj mhuxm
mhuxr mhuxv pyuxjj rabbit }
mhuxv { allegra burl ihnp4 mhuxa mhuxd mhuxi mhuxj mhuxm mhuxt }
mi-cec { allegra idis }
micomvax { micomz philabs }
micomz { micomvax }
microsoft { altos86 decvax fluke hp-pcd omsvax sco trsvax ubc-vision
uw-beaver }
minn-ua { umn-cs }
mit-eddie { genrad linus mit-vax tektronix }
mit-vax { allegra csu-cs eagle grkermit masscomp mit-eddie research }
moria { uiucdcs }
mork-cb { cbrmc }
mprvaxa { ubc-vision }
msdc { emory gatech itm mcnc ncsu sb1 }
munodie { garfield }
n44a { hscfvax ima rna wjh12 }
nbires { allegra amd70 cires cornell ctvax denelcor hao hscvax opus
princeton ucbvax uofm-cv ut-ngp utah-cs }
ncrday { allegra cincy purdue }
ncsu { ikonas ittral mcnc msdc uvacs }
ndcuts { ittvax }
nlgvax { mcvax }
nmtvax { lanl-a unm-ivax unmvax }
noscvax { sdcsvax }
npois { alice allegra cbosg cbosgd eisx hogpc houxm houxz ihnp4 npoiv
u1100s ucbvax wbux5 }
npoiv { alice allegra eisx hou5f ihnp4 npois }
nsc { fortune menlo70 sequel ucbvax uf-che }
nscs { allegra cbosg cbosgd cbrmc }
nwuxd { allegra ihnp4 otuxa we13 }
nybcb { cmcl2 }
odin { houca ihnp4 orion }
ogcvax { allegra cornell hp-pcd metheus omsvax sbcs sequel teklabs
tektronix }
oliveb { allegra fortune hplabs ios uvacs }
omsvax { aus86 hplabs icalqa microsoft ogcvax }
opus { nbires }
orc { kobold masscomp }
orion { allegra ariel hou5f houca ihnp4 odin }
orstcs { hp-pcd sdcrdcf teklabs }
osu-dbs { cbosg cbosgd }
otuxa { allegra burl ihnp4 ll1 nwuxd tty3b we13 we53 }
oz { beesvax }
p500vax { megatest }
packet { amd70 }
parsec { allegra ctvax ihnp4 uiucdcs unmvax }
pegasus { allegra hogpc houti houxm ihnp4 maxvax }
philabs { allegra bunker cbosgd cmcl2 decvax floyd linus mcvax
micomvax philmds pwa-b rdin sbcs sdcsvax seismo sunrise
uiucdcs vax135 }
philmds { mcvax philabs }
phonlab { allegra ihnp4 pur-ee sdcarl sdcatta sdcattb sdchema sdcrdcf
sdcsla sdcsvax }
phs { duke dvamc }
pitt { allegra dri0 idis }
populi { ucbtopaz ucbvax }
presby { burdvax cmcl2 seismo }
princeton { allegra astrovax ihnp4 ima nbires uf-cgrl ulysses }
psupdp1 { psuvax }
psuvax { allegra burdvax cornell ihnp4 ittvax psupdp1 }
pucc-h { pucc-i pur-phy purdue }
pucc-i { pucc-h }
pur-ee { allegra cbosgd decvax eagle ecn-ec ecn-pa floyd harpo icalqa
ihnp4 ihnss inuxa inuxb inuxc inuxd isrnix iuvax masscomp
menlo70 phonlab pur-phy purdue rocks34 sdcarl sequel sri-unix
teklabs ucbvax ucsfcgl uiucdcs uofm-cv }
pur-phy { pucc-h pur-ee purdue }
purdue { allegra arizona cornell decwrl eagle ecn-ec floyd hplabs
ihnp4 inuxa ittvax lanl-a ncrday pucc-h pur-ee pur-phy
research sb1 sb6 }
pwa-b { philabs utah-gr }
pyuxcc { allegra ihnp4 pyuxi pyuxjj }
pyuxdd { allegra ihnp4 pyuxjj pyuxmm pyuxnn rabbit }
pyuxhh { allegra cbosg ihnp4 pyuxi }
pyuxi { allegra ihnp4 mhuxm pyuxcc pyuxhh pyuxjj pyuxk pyuxl pyuxnn
pyuxqq pyuxss pyuxvv u1100a }
pyuxjj { allegra eisx ihnp4 mhuxj mhuxm mhuxt pyuxcc pyuxdd pyuxi
pyuxk pyuxl pyuxll pyuxqq }
pyuxk { allegra ihnp4 pyuxi pyuxjj pyuxl pyuxss }
pyuxl { allegra ihnp4 pyuxi pyuxjj pyuxk pyuxvv }
pyuxll { abnjh allegra eisx ihnp4 pyuxjj whuxlb }
pyuxmm { allegra ihnp4 pyuxdd pyuxnn rabbit }
pyuxnn { allegra ihnp4 pyuxdd pyuxi pyuxmm rabbit }
pyuxqq { allegra ihnp4 pyuxi pyuxjj }
pyuxss { allegra ihnp4 pyuxi pyuxk }
pyuxvv { allegra ihnp4 pyuxi pyuxl }
qubix { amd70 decwrl ios ittvax qumix }
qumix { ittvax qubix }
rabbit { alice allegra circe cornell floyd ihnp4 ima mhuxt pyuxdd
pyuxmm pyuxnn ulysses unc }
rayssd { allegra brunix ccieng5 linus }
rdin { philabs }
reed { cdi duke tektronix uw-beaver }
regi { comet ukc }
research { alice allegra amd70 circe cornell ihnp4 ima ittvax masscomp
mhtsa mit-vax purdue rlgvax sb1 sb6 sdcrdcf ulysses unmvax
utzoo wheps }
ritcv { ccieng5 ritvp rochester rocks34 rocksvax tropix }
ritvp { ritcv rocksvax }
rlgvax { adiron allegra brl-bmd cbosgd ccieng5 cvl gatech ihnp4 mcnc
research seismo sri-unix uf-cgrl umcp-cs we13 }
rna { allegra cmcl2 esquire n44a }
rochester { allegra ritcv rocksvax seismo }
rocks34 { icalqa pur-ee ritcv rocksvax sequel tropix }
rocksvax { allegra amd70 ritcv ritvp rochester rocks34 sunybcs }
rocky2 { astrovax cmcl2 }
root44 { edcaad ukc west44 }
ru-cc44 { ru-cs44 }
ru-cs44 { ru-cc44 ukc }
sara70 { mcvax vu44 }
sask { alberta cornell dvlcn hssg40 maxvax slinac utah-cs utcsrgv }
sb1 { allegra bpa burl eagle emory fluke gatech harpo ihnp4 ll1 ll1b
mb2c msdc purdue research sb6 scbhq uf-cgrl wbux5 }
sb6 { allegra bpa burl eagle emory fluke gatech harpo ihnp4 ll1 ll1b
mb2c purdue research sb1 scbhq uf-cgrl wbux5 }
sbcs { allegra ogcvax philabs uf-cgrl }
scbhq { allegra ihnp4 sb1 sb6 }
scgvaxd { allegra trw-unix }
sco { amd70 microsoft }
sdcarl { allegra hplabs ihnp4 kpno phonlab pur-ee sdcatta sdcattb
sdccsu3 sdchema sdcrdcf sdcsla sdcsvax ucbvax ucsfcgl }
sdcatta { phonlab sdcarl sdcattb sdccsu3 sdchema sdcsvax }
sdcattb { phonlab sdcarl sdcatta sdccsu3 sdchema sdcsla sdcsvax }
sdccsu3 { bmcg sdcarl sdcatta sdcattb sdchema sdcrdcf sdcsvax }
sdchema { basservax decvax phonlab sdcarl sdcatta sdcattb sdccsu3
sdcsvax }
sdcrdcf { allegra bmcg burdvax cbosgd hplabs ihnp4 ihnss menlo70
orstcs phonlab research sdcarl sdccsu3 sdcsvax sytek trw-unix
trwspf unc }
sdcsla { phonlab sdcarl sdcattb sdcsvax }
sdcsvax { allegra bmcg dcdwest ihnp4 kpno noscvax philabs phonlab
sdcarl sdcatta sdcattb sdccsu3 sdchema sdcrdcf sdcsla ucbvax
uw-beaver }
security { cca genrad linus vaxine }
seismo { hao harpo ihnp4 kpno philabs presby rlgvax rochester uf-cgrl
umcp-cs utah-cs uwvax }
sequel { cdi decwrl nsc ogcvax pur-ee rocks34 vax135 }
sfucmpt { ubc-medgen ubc-vision }
sii { cfib cornell decvax hei44 ittvax we53 }
slinac { sask }
spanky { alfalfa allegra burl eagle hocda houxa houxf houxk houxm
houxw houxz ihnp4 mhtsa tpsa ulysses }
sri-unix { allegra amd70 cca csin fortune hplabs menlo70 pur-ee rlgvax
sun ucbvax vortex }
ssc-vax { fluke teklabs uvicctr uw-beaver }
stolaf { allegra harpo ihnp4 umn-cs }
sun { allegra altos86 amd70 cornell decwrl hpda ihnp4 megatest
sri-unix sunrise ucbvax }
sunrise { allegra cmcl2 floyd philabs sun vax135 }
sunybcs { rocksvax watmath }
sytek { hplabs menlo70 sdcrdcf syteka zehntel }
syteka { sytek }
tekcad { bronze iddic tekchips tekecs tekgds teklabs tektronix }
tekchips { bronze iddic tekcad tekecs tekgds teklabs tektronix }
tekecs { bronze iddic tekcad tekchips tekgds tekid teklabs tekmdp
tektronix }
tekgds { bronze iddic tekcad tekchips tekecs teklabs tektronix }
tekid { tekecs tektronix }
teklabs { allegra arizona bronze cbosg cwruecmp decvax eagle harpo
iddic ihnp4 ihnss ogcvax orstcs pur-ee ssc-vax tekcad tekchips
tekecs tekgds tektronix ucbcad ucbvax unc watcgl watmath
zehntel }
tekmdp { bronze crimson dadla tekecs tektronix }
tektronix { allegra bronze decvax iddic ihnp4 masscomp mit-eddie
ogcvax reed tekcad tekchips tekecs tekgds tekid teklabs tekmdp
ucbcad ucbvax uf-cgrl uw-beaver zehntel }
teltone { fluke uw-beaver }
tesla { cornell }
tpsa { allegra amd70 spanky }
trigraph { dciem hcr utcsrgv utzoo }
tropix { allegra ihnp4 ritcv rocks34 }
trsvax { amd70 ctvax laidbak microsoft }
trw-unix { amd70 decvax felix scgvaxd sdcrdcf trwspf trwspp ucbvax }
trwspf { sdcrdcf trw-unix trwspp }
trwspp { trw-unix trwspf vortex }
tty3b { ihnp4 otuxa we13 }
tucc { duke ecs mcnc unc }
turtlevax { amd70 atd cdlncch decwrl flairvax }
twg { amd70 fortune iuvax }
twin40 { unc-c }
u1100a { abnjh allegra houxm ihnp4 pyuxi u1100s }
u1100s { allegra ihnp4 npois u1100a }
ubc-medgen { sfucmpt ubc-vision }
ubc-vision { alberta microsoft mprvaxa sfucmpt ubc-medgen utcsrgv
uvicctr uw-beaver }
ubvax { megatest }
ucbcad { allegra masscomp teklabs tektronix ucbesvax ucbvax }
ucbesvax { ucbcad }
ucbtopaz { populi ucbvax }
ucbvax { allegra amd70 arizona atd cbosg decvax decwrl eagle floyd
hpda hplabs ihnp4 menlo70 mhtsa nbires npois nsc populi pur-ee
sdcarl sdcsvax sri-unix sun teklabs tektronix trw-unix ucbcad
ucbtopaz ucsfcgl unmvax uwvax vax135 wheps zehntel }
ucf-cs { decvax duke fau uf-cgrl uf-che }
ucsfcgl { allegra hao menlo70 pur-ee sdcarl ucbvax uf-cgrl }
udrelay { brl-bmd }
uf-cgrl { allegra amd70 beesvax brunix cwruecmp fluke gatech ios
ittvax metheus princeton rlgvax sb1 sb6 sbcs seismo tektronix
ucf-cs ucsfcgl uf-che utah-gr uw-beaver wivax wjh12 yale-comix }
uf-che { nsc ucf-cs uf-cgrl }
uicsg { uicsl uiucdcs }
uicsl { uicsg uiucdcs }
uiucdcs { ccvaxa ctvax ihnp4 moria parsec philabs pur-ee trsvax uicsg
uicsl uiucuxc }
uiuceml { uiucuxc }
uiucsrl { uiucdcs uiucuxc }
uiucuxc { harpo uiucdcs uiuceml uiucsrl }
ukc { comet edcaad hirst1 mcvax regi root44 ru-cs44 vax135 west44 }
ulysses { alice allegra brunix cbosgd circe eagle gatech harpo ihnp4
mcnc mhuxa princeton rabbit research spanky unc utah-cs }
umcp-cs { allegra aplvax brl-bmd cvl rlgvax seismo }
umn-cs { ihnp4 minn-ua stolaf }
unc { allegra brl-bmd cornell duke floyd kpno mcnc rabbit sdcrdcf
teklabs tucc ulysses }
unc-c { mcnc twin40 }
unh { decvax }
uniq { allegra ihnp4 we13 }
unm-ivax { burl lanl-a nmtvax unmvax }
unmvax { csu-cs gatech nmtvax parsec research ucbvax unm-ivax }
uofm-cv { allegra amd70 ihnp4 mb2b mb2c nbires pur-ee }
ut-ngp { allegra aus86 ctvax eagle gatech ihnp4 nbires utastro vortex }
utah-cs { arizona beesvax harpo hplabs lanl-a nbires sask seismo
ulysses utah-gr }
utah-gr { pwa-b uf-cgrl utah-cs vax135 }
utastro { kpno ut-ngp }
utcsrgv { allegra cornell dciem decvax decwrl floyd garfield hcr ihnp4
linus mhtsa sask trigraph ubc-vision utcsstat utecfa utzoo
uw-beaver watmath }
utcsstat { utcsrgv utzoo }
utecfa { utcsrgv }
utzoo { allegra cwruecmp dciem decvax duke floyd hcr ihnp4 linus
research trigraph utcsrgv utcsstat watmath }
uvacs { allegra ncsu oliveb }
uvapsy { mcvax }
uvicctr { ssc-vax ubc-vision uw-beaver }
uw-beaver { allegra arizona cornell decvax fluke harpo ihnp4 linus
microsoft reed sdcsvax ssc-vax tektronix teltone ubc-vision
uf-cgrl utcsrgv uvicctr uw-june uw-vlsi uw70 yale-comix }
uw-june { uw-beaver uw-vlsi uw70 }
uw-vlsi { fluke uw-beaver uw-june }
uw70 { uw-beaver uw-june }
uwvax { allegra crystal ihnp4 seismo ucbvax }
varian { amd70 fortune zehntel }
vax135 { allegra ariel cornell edcaad floyd ihnp4 mhuxi philabs sequel
sunrise ucbvax ukc utah-gr }
vaxine { linus security wjh12 }
vmucnam { mcvax }
vortex { allegra amd70 decvax felix floyd fortune ihnp4 ima kpno
sri-unix trwspp ut-ngp }
vu44 { mcvax sara70 }
vub { mcvax }
watarts { watmath }
watcecit { wateng }
watcgl { allegra teklabs wateng watmath }
watdaisy { wateng watmath }
wateng { allegra watcecit watcgl watdaisy watmath }
watmath { allegra bunker decvax hcr ihnp4 linus sunybcs teklabs
utcsrgv utzoo watarts watcgl watdaisy wateng }
wb2 { allegra eagle houxz ihnp4 wbux5 }
wbux5 { allegra houxm houxz ihnp4 npois sb1 sb6 wb2 }
wdl1 { fortune }
we13 { allegra burl ihnp4 mgweed nwuxd otuxa rlgvax tty3b uniq we53 }
we53 { allegra ihnp4 kcwin mh3bs otuxa sii we13 }
west44 { root44 ukc }
wheps { allegra eagle ihnp4 research ucbvax zeppo }
whuxk { allegra burl houxm houxz ihnp4 llkp03 zeppo }
whuxlb { allegra burl eisx floyd gummo ihnp4 pyuxll zeppo }
wivax { decvax linus uf-cgrl }
wjh12 { allegra amd70 foxvax1 genrad hscvax ihnp4 ima linus mhtsa
mhuxi n44a uf-cgrl vaxine }
wxlvax { ittvax }
yale-comix { brunix cornell decvax ima ittvax linus uf-cgrl uw-beaver }
zehntel { allegra amd70 hplabs hplabsb hplabsc ihnp4 sytek teklabs
tektronix ucbvax varian zinfandel zps }
zeppo { allegra bunker cornell gummo harpo ihnp4 masscomp wheps whuxk
whuxlb }
zinfandel { ihnp4 zehntel }
zps { zehntel }
zti1 { mcvax }
Rosebud
echo map/makefile
sed 's/^ //' > map/makefile << 'Rosebud'
# Makefile for creating pathfile used by path(1).
host = utcsrgv
usage :
more README
# Piping pathfile through "fmt" is optional,
# as are the -c and -a options to span.
pathfile : graphfile
span -c -a $(host) graphfile | fmt > pathfile
graphfile : more
awk -f ae.awk graphfile > oldef
mv graphfile backup
sort -u more > tmp; mv tmp more
sort -mu more oldef > newef
-rm more; touch more
awk -f ea.awk newef > graphfile
-rm oldef newef
sites : graphfile
awk -f sites.awk graphfile > sites
clean :
rm -f pathfile sites
Rosebud
echo map/more
sed 's/^ //' > map/more << 'Rosebud'
Rosebud
echo map/oneway
sed 's/^ //' > map/oneway << 'Rosebud'
alice mhtsa
allegra harpo
allegra mhtsa
australia mhtsa
basservax mhtsa
circe harpo
cmcl2 harpo
cornell harpo
cucard harpo
decvax harpo
eagle harpo
eagle mhtsa
floyd harpo
fortune harpo
gummo harpo
harpo harpo
hp-pcd harpo
ihnp4 harpo
ihuxm harpo
inmet harpo
masscomp harpo
mh3bs mhtsa
physics mhtsa
pur-ee harpo
research mhtsa
sb1 harpo
sb6 harpo
seismo harpo
spanky mhtsa
stolaf harpo
teklabs harpo
ucbvax mhtsa
uiucdcs ctvax
uiucdcs trsvax
uiucsrl uiucdcs
uiucuxc harpo
ulysses harpo
utah-cs harpo
utcsrgv mhtsa
wjh12 mhtsa
zeppo harpo
Rosebud
echo map/orphans
sed 's/^ //' > map/orphans << 'Rosebud'
>>> tektinker <<<
>>> ucbernie <<<
Rosebud
echo map/rev.awk
sed 's/^ //' > map/rev.awk << 'Rosebud'
{ print $2, $1 }
Rosebud
echo map/sites.awk
sed 's/^ //' > map/sites.awk << 'Rosebud'
{ if ($2 == "{") print $1 }
Rosebud
echo map/top.awk
sed 's/^ //' > map/top.awk << 'Rosebud'
$1 > $2
Rosebud
touch map/more
--
# UUCP: { allegra cornell decvax decwrl floyd ihnp4 linus
# sask ubc-vision utzoo uw-beaver watmath } !utcsrgv!oscar
More information about the Comp.sources.unix
mailing list