Pathalias Memory Faults under SCO Xenix 2.2
Chip Salzenberg
chip at ateng.com
Wed Dec 13 06:32:00 AEST 1989
Once in a while, someone needs to port Pathalias to SCO Xenix/286. Once
upon a time, I did it; here are the patches. Shar and enjoy.
Be forewarned -- this patch uses a hard-coded max number of hosts. Increase
the value of REALSIZE if this becomes a problem. Also, all the tests of
M_XENIX might be better changed to M_I286. But you get the idea.
--
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the "#! /bin/sh" line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# Makefile
# palias9x.patch
# This archive created: Mon Feb 8 14:48:48 1988
export PATH; PATH=/bin:$PATH
:
echo 'shar: extracting "Makefile" (1348 characters) '
if test -f 'Makefile'
then
echo 'shar: will not overwrite existing file "Makefile" '
else
sed 's/^X//' << \SHAR_EOF > 'Makefile'
X#!/bin/make -f
X# pathalias -- by steve bellovin, as told to peter honeyman
X
XSHELL = /bin/sh
X
X### configuration section
X###
X# if you can't or don't intend to use dbm files,
X# don't bother with DBM or makedb
XDBM = -ldbm
X# or if you roll your own ...
X# DBM = dbm.o
X###
X# where is getopt (if not in the c library)?
X# GETOPT = getopt.o
X### end of configuration section
X
X
XCC = cc -M2le
XCFLAGS = -O -DSTATIC=static
XLDFLAGS = $(GETOPT) -F 2000
XYFLAGS = -d
X
XOBJ = addlink.o addnode.o local.o main.o mapit.o mapaux.o mem.o parse.o printit.o
XHDRS = def.h config.h
XCSRC = addlink.c addnode.c local.c main.c mapit.c mapaux.c mem.c printit.c
XLSRC = $(CSRC) parse.c
XSRC = $(CSRC) parse.y makedb.c arpatxt.c
X
Xall: pathalias makedb
X
Xpathalias: $(OBJ)
X $(CC) $(OBJ) $(LDFLAGS) -o pathalias
X
X$(OBJ): $(HDRS)
X
Xparse.c: parse.y $(HDRS)
X $(YACC) $(YFLAGS) parse.y
X mv y.tab.c parse.c
X
Xmakedb: makedb.o
X $(CC) makedb.o $(LDFLAGS) $(DBM) -o makedb
X
Xmakedb.o: config.h
X
Xarpatxt: arpatxt.o
X $(CC) arpatxt.o $(LDFLAGS) -o arpatxt
X
Xclean:
X rm -f *.o y.tab.? parse.c
X
Xclobber: clean
X rm -f pathalias makedb arpatxt
X
Xtags: $(SRC) $(HDRS)
X ctags -w $(HDRS) $(SRC)
X
Xbundle:
X @bundle README CHANGES pathalias.1 Makefile ${HDRS} ${SRC}
X
Xlint: $(LSRC)
X lint $(CFLAGS) $(LSRC)
X lint $(CFLAGS) makedb.c
X lint $(CFLAGS) arpatxt.c
X
Xinstall:
X copy -om pathalias makedb /usr/local/bin
SHAR_EOF
if test 1348 -ne `wc -c < 'Makefile'`
then
echo 'shar: error transmitting "Makefile" (should have been 1348 characters) '
fi
chmod 644 'Makefile'
fi # end of overwriting check
:
echo 'shar: extracting "palias9x.patch" (8266 characters) '
if test -f 'palias9x.patch'
then
echo 'shar: will not overwrite existing file "palias9x.patch" '
else
sed 's/^X//' << \SHAR_EOF > 'palias9x.patch'
XIndex: addlink.c
X*** palias_orig/addlink.c Mon Feb 8 14:34:22 1988
X--- palias/addlink.c Mon Feb 8 09:48:42 1988
X***************
X*** 9,11 ****
X extern link *addlink();
X! extern void deadlink(), atrace();
X extern int tracelink();
X--- 9,11 ----
X extern link *addlink();
X! extern void freelink(), deadlink(), atrace();
X extern int tracelink();
XIndex: addnode.c
X*** palias_orig/addnode.c Mon Feb 8 14:35:01 1988
X--- palias/addnode.c Mon Feb 8 11:10:09 1988
X***************
X*** 7,14 ****
X
X- /* exports */
X- node *addnode(), *addprivate();
X- void alias(), hashanalyze(), fixprivate(), penalize();
X- node **Table; /* hash table ^ priority queue */
X- long Tabsize; /* size of Table */
X-
X /* imports */
X--- 7,8 ----
X***************
X*** 18,20 ****
X extern int Iflag, Tflag, Vflag;
X- extern node **Table;
X extern long Ncount, Tabsize;
X--- 12,13 ----
X***************
X*** 23,24 ****
X--- 16,34 ----
X
X+ /* exports */
X+ node *addnode(), *addprivate();
X+ void alias(), hashanalyze(), fixprivate(), penalize();
X+
X+ #ifdef M_XENIX
X+
X+ #define REALSIZE 21499L /* arbitrary prime number */
X+ node* huge Table[REALSIZE]; /* hash table ^ priority queue */
X+ long Tabsize; /* size of Table */
X+
X+ #else
X+
X+ node **Table; /* hash table ^ priority queue */
X+ long Tabsize; /* size of Table */
X+
X+ #endif
X+
X /* privates */
X***************
X*** 163,164 ****
X--- 173,183 ----
X if (isfull(Ncount)) {
X+ #ifdef M_XENIX
X+ if (Tabsize == 0) {
X+ crcinit();
X+ Tabindex = 0;
X+ Tabsize = REALSIZE;
X+ Tab128 = (HIGHWATER * Tabsize * 128L)/100L;
X+ } else
X+ die("Too many hosts (Table[] is full)");
X+ #else
X if (Tabsize == 0) { /* first time */
X***************
X*** 171,172 ****
X--- 190,192 ----
X rehash(); /* more, more! */
X+ #endif
X }
X***************
X*** 199,200 ****
X--- 219,222 ----
X
X+ #ifndef M_XENIX
X+
X STATIC void
X***************
X*** 229,230 ****
X--- 251,254 ----
X }
X+
X+ #endif /* !M_XENIX */
X
XIndex: config.h
X*** palias_orig/config.h Mon Feb 8 14:34:26 1988
X--- palias/config.h Mon Feb 8 09:26:37 1988
X***************
X*** 2,4 ****
X
X! #undef STRCHR /* have strchr -- system v and many others */
X
X--- 2,4 ----
X
X! #define STRCHR /* have strchr -- system v and many others */
X
X***************
X*** 4,7 ****
X
X! #undef UNAME /* have uname() -- probably system v or 8th ed. */
X! #undef MEMSET /* have memset() -- probably system v or 8th ed. */
X
X--- 4,7 ----
X
X! #define UNAME /* have uname() -- probably system v or 8th ed. */
X! #define MEMSET /* have memset() -- probably system v or 8th ed. */
X
X***************
X*** 7,10 ****
X
X! #define GETHOSTNAME /* have gethostname() -- probably bsd */
X! #define BZERO /* have bzero() -- probably bsd */
X
X--- 7,10 ----
X
X! #undef GETHOSTNAME /* have gethostname() -- probably bsd */
X! #undef BZERO /* have bzero() -- probably bsd */
X
X***************
X*** 11,14 ****
X /* default place for dbm output of makedb (or use -o at run-time) */
X! #define ALIASDB "/usr/local/lib/palias"
X!
X
X--- 11,13 ----
X /* default place for dbm output of makedb (or use -o at run-time) */
X! #define ALIASDB "/usr/lib/uucp/paths"
X
XIndex: def.h
X*** palias_orig/def.h Mon Feb 8 14:34:28 1988
X--- palias/def.h Sat Jan 9 17:50:15 1988
X***************
X*** 77,78 ****
X--- 77,79 ----
X unsigned short n_flag; /* see manifests above */
X+ unsigned short n_filler;
X };
XIndex: local.c
X*** palias_orig/local.c Mon Feb 8 14:34:31 1988
X--- palias/local.c Mon Feb 8 09:48:42 1988
X***************
X*** 14,16 ****
X {
X! static struct utsname utsname;
X
X--- 14,16 ----
X {
X! static struct utsname uts;
X
X***************
X*** 16,19 ****
X
X! uname(&utsname);
X! return(utsname.nodename);
X }
X--- 16,19 ----
X
X! uname(&uts);
X! return(uts.nodename);
X }
XIndex: main.c
X*** palias_orig/main.c Mon Feb 8 14:34:34 1988
X--- palias/main.c Mon Feb 8 09:48:42 1988
X***************
X*** 10,12 ****
X /* exports */
X! extern void die();
X char *Cfile; /* current input file */
X--- 10,12 ----
X /* exports */
X! extern void die(), printit();
X char *Cfile; /* current input file */
XIndex: mapaux.c
X*** palias_orig/mapaux.c Mon Feb 8 14:34:42 1988
X--- palias/mapaux.c Mon Feb 8 10:57:18 1988
X***************
X*** 9,11 ****
X extern long Nheap, Hashpart, Tabsize;
X! extern node **Table, *Home;
X extern char *Graphout, *Linkout, *Netchars, **Argv;
X--- 9,11 ----
X extern long Nheap, Hashpart, Tabsize;
X! extern node *Home;
X extern char *Graphout, *Linkout, *Netchars, **Argv;
X***************
X*** 16,17 ****
X--- 16,23 ----
X extern char *strsave();
X+
X+ #ifdef M_XENIX
X+ extern node* huge Table[];
X+ #else
X+ extern node** Table;
X+ #endif
X
XIndex: mapit.c
X*** palias_orig/mapit.c Mon Feb 8 14:35:28 1988
X--- palias/mapit.c Mon Feb 8 11:52:57 1988
X***************
X*** 19,21 ****
X extern int Tflag, Vflag;
X! extern node **Table, *Home;
X extern char *Linkout, *Graphout;
X--- 19,21 ----
X extern int Tflag, Vflag;
X! extern node *Home;
X extern char *Linkout, *Graphout;
X***************
X*** 22,23 ****
X--- 22,29 ----
X
X+ #ifdef M_XENIX
X+ extern node* huge Table[];
X+ #else
X+ extern node** Table;
X+ #endif
X+
X extern void freelink(), resetnodes(), printit(), dumpgraph();
X***************
X*** 32,33 ****
X--- 38,43 ----
X static long Heaphighwater;
X+
X+ #ifdef M_XENIX
X+ static link* huge* Heap;
X+ #else
X static link **Heap;
X***************
X*** 33,34 ****
X--- 43,45 ----
X static link **Heap;
X+ #endif
X
X***************
X*** 51,52 ****
X--- 62,66 ----
X /* re-use the hash table space for the heap */
X+ #ifdef M_XENIX
X+ Heap = (link * huge *) Table;
X+ #else
X Heap = (link **) Table;
X***************
X*** 52,53 ****
X--- 66,68 ----
X Heap = (link **) Table;
X+ #endif
X Hashpart = pack(0L, Tabsize - 1);
X***************
X*** 369,371 ****
X { link *rval, *lastlink;
X- register link **rheap;
X
X--- 384,385 ----
X***************
X*** 374,377 ****
X
X! rheap = Heap; /* in register -- heavily used */
X! rval = rheap[1]; /* return this one */
X
X--- 388,390 ----
X
X! rval = Heap[1]; /* return this one */
X
X***************
X*** 378,381 ****
X /* move last entry into root and reheap */
X! lastlink = rheap[Nheap];
X! rheap[Nheap] = 0;
X
X--- 391,394 ----
X /* move last entry into root and reheap */
X! lastlink = Heap[Nheap];
X! Heap[Nheap] = 0;
X
X***************
X*** 382,384 ****
X if (--Nheap) {
X! rheap[1] = lastlink;
X lastlink->l_to->n_tloc = 1;
X--- 395,397 ----
X if (--Nheap) {
X! Heap[1] = lastlink;
X lastlink->l_to->n_tloc = 1;
X***************
X*** 401,403 ****
X { register long pindx, cindx;
X- register link **rheap = Heap; /* in register -- heavily used */
X node *child, *rchild, *parent;
X--- 414,415 ----
X***************
X*** 405,407 ****
X pindx = l->l_to->n_tloc;
X! parent = rheap[pindx]->l_to; /* invariant */
X for ( ; (cindx = pindx * 2) <= Nheap; pindx = cindx) {
X--- 417,419 ----
X pindx = l->l_to->n_tloc;
X! parent = Heap[pindx]->l_to; /* invariant */
X for ( ; (cindx = pindx * 2) <= Nheap; pindx = cindx) {
X***************
X*** 408,410 ****
X /* pick lhs or rhs child */
X! child = rheap[cindx]->l_to;
X if (cindx < Nheap) {
X--- 420,422 ----
X /* pick lhs or rhs child */
X! child = Heap[cindx]->l_to;
X if (cindx < Nheap) {
X***************
X*** 411,413 ****
X /* compare with rhs child */
X! rchild = rheap[cindx+1]->l_to;
X /*
X--- 423,425 ----
X /* compare with rhs child */
X! rchild = Heap[cindx+1]->l_to;
X /*
X***************
X*** 450,452 ****
X long i, j;
X! { register link *temp, **rheap;
X
X--- 462,464 ----
X long i, j;
X! { register link *temp;
X
X***************
X*** 452,459 ****
X
X! rheap = Heap; /* heavily used -- put in register */
X! temp = rheap[i];
X! rheap[i] = rheap[j];
X! rheap[j] = temp;
X! rheap[j]->l_to->n_tloc = j;
X! rheap[i]->l_to->n_tloc = i;
X }
X--- 464,470 ----
X
X! temp = Heap[i];
X! Heap[i] = Heap[j];
X! Heap[j] = temp;
X! Heap[j]->l_to->n_tloc = j;
X! Heap[i]->l_to->n_tloc = i;
X }
XIndex: mem.c
X*** palias_orig/mem.c Mon Feb 8 14:34:45 1988
X--- palias/mem.c Mon Feb 8 09:48:42 1988
X***************
X*** 92,94 ****
X #ifdef MYMALLOC
X! addtoheap((char *) t, size * sizeof(node *));
X #else
X--- 92,94 ----
X #ifdef MYMALLOC
X! addtoheap((char *) t, (int)sizeof(node *) * size);
X #else
SHAR_EOF
if test 8266 -ne `wc -c < 'palias9x.patch'`
then
echo 'shar: error transmitting "palias9x.patch" (should have been 8266 characters) '
fi
chmod 444 'palias9x.patch'
fi # end of overwriting check
# End of shell archive
exit 0
--
You may redistribute this article only to those who may freely do likewise.
Chip Salzenberg at A T Engineering; <chip at ateng.com> or <uunet!ateng!chip>
"The Usenet, in a very real sense, does not exist."
More information about the Alt.sources
mailing list