Network Routing in one script
utzoo!decvax!duke!ucf-cs!tim
utzoo!decvax!duke!ucf-cs!tim
Mon Jun 21 04:42:35 AEST 1982
: This shell script will setup nmail a Network Automatic Routing program
echo Creating a directory nmail.srcs
mkdir nmail.srcs
echo Creating Readme file.
cat >nmail.srcs/Readme <<E*O*F
These routines make up an automated routing algorithm for
the USENET. In addition to this file there should be:
nmail.c - the source program for the routing algorithm
nmail.h - the header with changeable defines
runme - the shell script that does all the work for you
sites - the topology file of the network
makenet - an awk program to convert the sites file to the
necessary internal format of the network
The script in runme will prompt for the name of
your site and the full path where the topology
file is to be placed.Example: For my site it was
ucf-cs /usr1/vlsi/tim/net/network
For Mark Horton's site it might be:
cbosgd /usr/local/network
Note: the name can be anything you want, but be sure to
specify the entire path name. The program created is called
nmail which will find the shortest connection path to the
specified site and execute mail passing that path. Example:
>From my site typing
nmail cbosgd!mark dave unc.smb at udel-relay
will execute mail with the paths
duke!chico!harpo!cbosg!cbosgd!mark dave duke!decvax!ucbvax!unc.smb at udel-relay
Note: the first was a USENET path, the second was a local
user, the third was an ARPANET (CSNET) address. This pro-
gram is definitely inferior to the routing program just sub-
mitted to the net by unc!smb but the advantages of this pro-
gram are that it should install in under 5 minutes with no
changes to existing system software. Also the total size of
everything is under 500 lines of commented code verses the
over 2500 lines of smb's. I would recommend installing
smb's version but this will give you a quick and easy sub-
stitute in the mean time. The path generated is definitely
shortest but not necessarily the least cost since no calcu-
lation of baud rates or polling frequencies is made.
Tim Curry
USENET: duke!ucf-cs!tim
ARPANET: ucf-cs.tim at udel-relay
E*O*F
echo Creating makenet file
cat >nmail.srcs/makenet <<E*O*F
cp sites /tmp/site1
cp sites /tmp/site2
awk 'FILENAME == "/tmp/site1" {sites[\$1]=NR; print \$1}
FILENAME == "/tmp/site2" {for(i=2; i <= NF; i++) \\
printf "%s ",sites[\$i];printf "0\n"}
FILENAME == "nmail.h" && \$1 == "#define" && \$2 == "LOCAL" \\
{printf "%d 0\n", sites[\$3]}' \\
/tmp/site1 /tmp/site2 nmail.h >\$1
rm -f /tmp/site1 /tmp/site2
echo The network topology file is installed.
E*O*F
echo Creating nmail.c file
cat >nmail.srcs/nmail.c <<E*O*F
/*
*
* TITLE : nmail
*
* PURPOSE : To pre-process network addresses finding the shortest
* path through the network
*
* PROGRAMMER : Timothy W. Curry at University of Central Florida
*
* DATE : April 7, 1982
*
* ENTRY PTS. : main
*
* PARAMETERS : addresses of the form: name or site!name or name at arpa_site
*
*/
/* include the headers to work with standard I/O; isdigit; nmailer defines */
#include <stdio.h>
#include <ctype.h>
#include "nmail.h"
main(argc,argv)
int argc;
char *argv[];
{ /*
* Variable Usage:
* net - the input file descriptor name for the network topology file
* site_name - a storage buffer to hold the name of a site
* plen,psrc,pdest - pointer variables used to build the list of site
* names. plen holds the length of the site name; psrc holds
* the current character position in the source buffer; pdest
* in the destination buffer
* dest - holds the name of the site we are trying to reach
* addr - holds both the name of the destination site and name of the
* user to receive the message
* i,k,j,l,m,n - integer counters
* ppos - keeps track of the current character position in paths
* ptr - index into the list of site links
* used - an array to hold the sites already visited while finding
* the shortest path
* pstk - the stack onto which the breadth first search places values
*/
FILE *net,*fopen();
char site_name[SITENAMELEN];
char *plen,*psrc,*pdest;
char paths[256],dest[14],addr[30];
int i,j,k,l,m,n,ppos;
short int *ptr,used[MAXSITES],pstk[MAXSITES][2];
if (argc == 1)
{ fprintf(stderr,"nmail: no addresses given.\n");
nmailusage();
}
if ((net = fopen(NETFILE,"r")) == NULL)
{ fprintf(stderr,"nmail: can't open network configuration file.\n");
exit(1);
}
/* the SITES buffer will consist of a byte with the length of
the site name in it followed by the site name */
*SITES = '\0';
pdest = SITES;
for (NUMSITES=1; ; NUMSITES++)
{ if ((pdest-SITES+SITENAMELEN) > SITEBUFSZ)
{ fprintf(stderr,"SITES buffer overflowed\n");
exit(1);
}
fscanf(net,"%s",site_name);
if (isdigit(*site_name)) break;
for (plen=pdest,psrc=site_name; *++pdest = *psrc++; (*plen)++);
}
/* LINKS will be an array of numbers indicating which sites are connected
to which. LINDEX is used to index into the LINKS array. */
LINKS[1] = (short int) atoi(site_name);
LINDEX[1] = &LINKS[1];
for (i=2,j=1; i<=NUMSITES+1 ; i++)
{ while (LINKS[j] != 0)
{ fscanf(net,"%d",&k);
j++;
LINKS[j] = (short int) k;
}
LINDEX[i] = &LINKS[j];
j--;
}
/* the last number was the value for the local site */
Local = LINKS[j];
/* initialize the buffer to mail */
paths[0] = '\0';
ppos = 0;
for (i=1; i<argc ;i++)
{ addr[0] = '\0';
/* if its a local address, then no need to process it */
if (!(index(argv[i],'@')) && !(index(argv[i],'!')))
{ strcat(paths,argv[i]);
strcat(paths," ");
ppos += strlen(argv[i]) + 1;
}
/* otherwise a path must be found ! */
else
{ if (index(argv[i],'@') && !(index(argv[i],'!'))) strcpy(addr,ARPA);
strcat(addr,argv[i]);
strcat(addr," ");
/* set dest = name of destination site */
for (j=0; addr[j] != '!' ;j++)
{ dest[j] = addr[j];
dest[j+1] = '\0';
if (dest[j] == '\0')
{ fprintf(stderr,"nmail: improperly formed address.\n");
nmailusage();
}
}
/* find the numeric index of dest for LINDEX to use */
for (j=0,k=1,m = strlen(dest); k<NUMSITES ;k++)
{ l = SITES[j];
if (l == m)
{ for (j++,l+=j,n=0; j<l ; j++,n++)
if (SITES[j] != dest[n]) break;
if (j == l) break;
j = l;
}
else j += l + 1;
}
if (k == NUMSITES)
{ fprintf(stderr,"nmail: site %s is not in the network.\n",dest);
exit(1);
}
/* do a breadth first search to find a path from source to sink */
if (k != Local)
{ for (j=0,l=1,m=0,used[0] = k; k!=Local ;k=pstk[m++][1])
{ for (ptr=LINDEX[k]; ptr<LINDEX[k+1] ;ptr++)
{ for (n=0; n<l ;n++) if (used[n] == *ptr) break;
if (n==l)
{ used[l] = *ptr;
l++;
pstk[j][0] = k;
pstk[j][1] = *ptr;
j++;
}
}
}
/* convert the numeric site values to thier character names
and place them in the paths buffer */
k = pstk[m-1][0];
while (k != pstk[0][0])
{ for (j=0,l=0; j<k-1 ;j++) l += SITES[l] + 1;
n = SITES[l];
for (j=0,l++; j<n ;j++,l++,ppos++) paths[ppos] = SITES[l];
paths[ppos++] = '!';
for ( ; pstk[m][1] != k ;m--);
k = pstk[m][0];
}
paths[ppos] = '\0';
}
strcat(paths,addr);
ppos += strlen(addr);
}
}
/* when all the paths are resolved, pass control over to mail */
printf("%s\n",paths);
execl("/usr/ucb/mail","mail",paths,0);
}
nmailusage()
{ fprintf(stderr,"usage: nmail addr {addr} \nWhere addr = site!name for ");
fprintf(stderr,"uucp-address or name at site for ARPANET-address.\n");
exit(1);
}
E*O*F
echo Creating nmail.h file
cat >nmail.srcs/nmail.h <<E*O*F
/*
* nmail.h
*
* The header file containing defines you might wish to change.
*
* SITENAMELEN - The maximum length of the name of a site.
*
* MAXSITES - In an attempt to hold down memory usage, a liberal
* upper limit is given. Dynamic calculation is
* not worth the trouble in this case.
*
* AVGLINKS - Some sites have >20 links. Most have 1. Want to
* keep the memory size declarations down so this
* is an average.
* SITEBUFSZ - The size of the buffer to hold the site names.
*
* NETFILE - Where the topology description is kept.
*
* LOCAL - The name of the originating (local) site.
*
* ARPA - The name of the site that will gateway mail to the ARPANET
*
*/
#define SITENAMELEN 15
#define MAXSITES 500
#define AVGLINKS 4
#define SITEBUFSZ SITENAMELEN*MAXSITES
#define NETFILE "/usr1/vlsi/tim/net/network"
#define LOCAL ucf-cs
#define ARPA "ucbvax!"
short int NUMSITES,LINKS[MAXSITES*AVGLINKS],*LINDEX[MAXSITES],Local;
char SITES[SITEBUFSZ];
E*O*F
echo Creating runme file
cat >nmail.srcs/runme <<E*O*F
echo Enter your site name and the full path to the topology file:
read sitename filename
sed -e '/d.*LOCAL/s/\(d.*LOCAL\).*\$/\1 '\$sitename/ \\
-e '/d.*NETFILE/s?\(d.*NETFILE\).*\$?\1 "'\$filename\"? \\
nmail.h >/tmp/nmail.h
mv /tmp/nmail.h nmail.h
echo Header file changed reflecting sitename = \$sitename and
echo the topology file = \$filename
echo Creating the topology file.
chmod +x ./makenet
./makenet \$filename
cc -O -o nmail nmail.c
echo The program can be found in the file "nmail".
E*O*F
echo Creating sites file
cat >nmail.srcs/sites <<E*O*F
adiron duke
alice npois rabbit research
allegra mhtsa psuvax princeton
azure tekmdp
bio reed
brl-bmd duke
bwkna mhuxj mhexa hlexa
cbosg harpo cbosgd rmas70 nscs mhuxt npois
cbosgd cbosg
cca ucb csin ima
cg-d decvax
chico harpo zeppo esquire duke
cires hao
cmcl2 presby nybcb
cornell vax135
csin cca
cwruecmp decvax cwrunix
cwrunix cwruecmp
cubs45 esquire
dadla-a dadla-b
dadla-b tekmdp dadla-a
dcdwestvax sdcsvax
decvax microsoft cwruecmp duke pur-ee wivax sultan ittvax genradbolton yale-comix utzoo watmath cg-d ucbvax
druxj ihnss
duke chico decvax duke34 dukgeri phs unc mcnc tucc adiron brl-bmd reed ucf-cs
duke34 duke
dukgeri duke
eagle rdb mhuxj mitccc mit-vax wheps harpo mhuxt
eiss npois pyuxbb eisx
eisx eiss
esquire chico cubs45
floyd harpo vax135
genradbolton decvax
gi sytek psi
gsp86 intelqa
hao menlo70 cires
harpo utah-cs presby cbosg floyd zeppo chico whuxlb mhtsa rdb npois
hlexa bwkna
ho3e2 houxi
hoasp houxi
hocsb houxi hocsd hocse hocsf hocsg
hocsd hocsb
hocse hocsb
hocsf hocsb
hocsg hocsb
hou5d houxi
houca houxi
houti houxi
hound houxi
houxa houxi
houxb houxi
houxc houxi
houxd houxi
houxe houxi lime
houxf houxi
houxg houxi lime
houxh houxi
houxi ihnss npois hocsb ho3e2 u1100a houca houti hound houxa houxb houxc houxd houxe houxf houxg houxh houxj houxm houxn houxo houxp houxr houxs houxt houxv houxw houxy hoasp hou5d vax135
houxj houxi
houxm houxi
houxn houxi
houxo houxi
houxp houxi
houxr houxi
houxs houxi
houxt houxi
houxv houxi
houxw houxi
houxy houxi
hp-pcd hplabs ogcvax
hpda hplabs
hplabs sri-unix menlo70 hpda hp-pcd
hpuxa mhtsa
ico ima
idis mcnc
ih1ap ihnss
ihima ihnss
ihldt ihnss
ihlpb ihnss
ihnss ihuxf ihuxg ihuxh ihuxi ihuxj ihuxk ihuxl ihuxm ihuxn ihuxo ihuxp ihuxs ihlpb ihldt iwlc8 ihima ih1ap ihps3 cbosg druxj mhtsa houxi ucbvax wheps
ihps3 ihnss stolaf
ihuxf ihnss
ihuxg ihnss
ihuxh ihnss
ihuxi ihnss
ihuxj ihnss
ihuxk ihnss
ihuxl ihnss
ihuxm ihnss
ihuxn ihnss
ihuxo ihnss
ihuxp ihnss
ihuxs ihnss
ikonas mcnc
ima cca ico
intelqa sytek gsp86
ittvax decvax sii qumix tpdcvax
iwlc8 ihnss
lime houxe houxg we13
mcnc duke unc web40 wolfvax tucc idis ikonas
menlo70 hplabs hao sytek nsc
mh3bs mhtsa
mhb5c mhuxj
mhexa bwkna
mhtsa allegra eagle ihnss harpo hpuxa mh3bs wjh12
mhuxa mhuxj
mhuxh mhuxj
mhuxj eagle mhuxa mhuxh mhuxm mhuxv mhb5c pyuxjj bwkna
mhuxm mhuxj
mhuxt eagle cbosg
mhuxv mhuxj
microsoft decvax
minn-ua stolaf
mit-vax eagle
mitccc rabbit mitmath eagle
mitmath mitccc
npois harpo houxi ucbvax alice cbosg eiss u1100s
nscs cbosg
nybca nybcb
nybcb cmcl2 nybca
nsc menlo70
ogcvax teklabs hp-pcd
philabs sdcsvax
phonlab sdcattb
phs duke
presby harpo uofp cmcl2
princeton allegra
psi gi
psuvax allegra
pucc purdue
pur-ee decvax purdue uiucdcs
pur-phy purdue
purdue pur-ee pucc pur-phy
pyuxbb eiss
pyuxjj mhuxj
qumix ittvax
rabbit alice mitccc
rdb harpo eagle
reed duke bio
research alice
rmas70 cbosg rmasvax rvb
rmasvax rmas70
rvb rmas70
scl utah-cs
scs23 slinac
scs40 slinac
sdaaron sdcsvax
sdcarl ucsfcgl sdcattb
sdcatta sdcattb
sdcattb sdcarl phonlab sdcatta sdcsvax
sdcsvax sdcattb sdcsvax sdqmlab sdaaron dcdwestvax philabs
sdqmlab sdcsvax
sii ittvax
slinac utah-cs scs40 scs23
src-unix ucb
sri-unix ucb hplabs
stolaf ihps3 minn-ua
sultan decvax
sytek menlo70 gi intelqa zehntel
tekcad teklabs
tekid teklabs
teklabs tekmdp ucbcad tekcad ogcvax tekid
tekmdp azure teklabs dadla-b
tpdcvax ittvax
trigraph utzoo
tucc duke mcnc unc
u1100a houxi
u1100s npois
ucb ucbarpa uwvax src-unix cca sri-unix
ucbarpa ucbopt ucbonyx ucbcad ucbcory populi ucbvax ucb
ucbcad ucbarpa teklabs
ucbcory ucbarpa
ucbonyx ucbarpa
ucbopt ucbarpa
populi ucbarpa
ucbvax ucbarpa decvax ihnss ucsfcgl
ucf-cs duke
ucsfcgl ucbvax sdcarl
uicsovax uiucdcs
uiucdcs pur-ee uicsovax
unc duke mcnc tucc
uofp presby
utah-cs harpo utah-gr scl slinac
utah-gr utah-cs
utzoo decvax trigraph
uwvax ucb
vax135 houxi cornell floyd
watarts watmath
watcgl watmath
watmath decvax watarts watcgl
we13 lime
web40 mcnc
wheps ihnss zeppo eagle
whuxlb harpo
wivax decvax
wjh12 mhtsa
wolfvax mcnc
yale-comix decvax
zehntel sytek
zeppo harpo chico wheps
E*O*F
chmod +x nmail.srcs/runme
echo You should now change directory to nmail.srcs and read the file "Readme"
echo Then run the shell script in runme.
More information about the Comp.sources.unix
mailing list