home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 January
/
usenetsourcesnewsgroupsinfomagicjanuary1994.iso
/
sources
/
unix
/
volume19
/
nn
/
part13
< prev
next >
Wrap
Text File
|
1989-06-22
|
51KB
|
2,397 lines
Subject: v19i074: NN, a Usenet news reader, Part13/15
Newsgroups: comp.sources.unix
Sender: sources
Approved: rsalz@uunet.UU.NET
Submitted-by: storm@texas.dk (Kim F. Storm)
Posting-number: Volume 19, Issue 74
Archive-name: nn/part13
#!/bin/sh
# this is part 13 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file regexp.c continued
#
CurArch=13
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
exit 1; fi
( read Scheck
if test "$Scheck" != $CurArch
then echo "Please unpack part $Scheck next!"
exit 1;
else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file regexp.c"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' >> regexp.c
X */
Xstatic void regoptail(p, val)
Xchar *p;
Xchar *val;
X{
X /* "Operandless" and "op != BRANCH" are synonymous in practice. */
X if (p == NULL || p == ®dummy || OP(p) != BRANCH)
X return;
X regtail(OPERAND(p), val);
X}
X
X/*
X * regexec and friends
X */
X
X/*
X * Global work variables for regexec().
X */
Xstatic char *reginput; /* String-input pointer. */
Xstatic char *regbol; /* Beginning of input, for ^ check. */
Xstatic char **regstartp; /* Pointer to startp array. */
Xstatic char **regendp; /* Ditto for endp. */
X
X/*
X * Forwards.
X */
XSTATIC int regtry();
XSTATIC int regmatch();
XSTATIC int regrepeat();
X
X#ifdef DEBUG
Xint regnarrate = 0;
Xvoid regdump();
XSTATIC char *regprop();
X#endif
X
X/*
X - regexec - match a regexp against a string
X */
Xint regexec(prog, string)
Xregister regexp *prog;
Xregister char *string;
X{
X register char *s;
X
X /* Be paranoid... */
X if (prog == NULL || string == NULL) {
X regerror("NULL parameter");
X return (0);
X }
X /* Check validity of program. */
X if (UCHARAT(prog->program) != MAGIC) {
X regerror("corrupted program");
X return (0);
X }
X /* If there is a "must appear" string, look for it. */
X if (prog->regmust != NULL) {
X s = string;
X while ((s = strchr(s, prog->regmust[0])) != NULL) {
X if (strncmp(s, prog->regmust, prog->regmlen) == 0)
X break; /* Found it. */
X s++;
X }
X if (s == NULL) /* Not present. */
X return (0);
X }
X /* Mark beginning of line for ^ . */
X regbol = string;
X
X /* Simplest case: anchored match need be tried only once. */
X if (prog->reganch)
X return (regtry(prog, string));
X
X /* Messy cases: unanchored match. */
X s = string;
X if (prog->regstart != '\0')
X /* We know what char it must start with. */
X while ((s = strchr(s, prog->regstart)) != NULL) {
X if (regtry(prog, s))
X return (1);
X s++;
X }
X else
X /* We don't -- general case. */
X do {
X if (regtry(prog, s))
X return (1);
X } while (*s++ != '\0');
X
X /* Failure. */
X return (0);
X}
X
X/*
X - regtry - try match at specific point
X */
X#ifdef __STDC__
X
Xstatic int regtry(regexp *prog, char *string)
X
X#else
X
Xstatic int regtry(prog, string)
Xregexp *prog;
Xchar *string;
X
X#endif
X{
X register int i;
X register char **sp;
X register char **ep;
X
X reginput = string;
X regstartp = prog->startp;
X regendp = prog->endp;
X
X sp = prog->startp;
X ep = prog->endp;
X for (i = NSUBEXP; i > 0; i--) {
X *sp++ = NULL;
X *ep++ = NULL;
X }
X if (regmatch(prog->program + 1)) {
X prog->startp[0] = string;
X prog->endp[0] = reginput;
X return (1);
X } else
X return (0);
X}
X
X/*
X - regmatch - main matching routine
X *
X * Conceptually the strategy is simple: check to see whether the current
X * node matches, call self recursively to see whether the rest matches,
X * and then act accordingly. In practice we make some effort to avoid
X * recursion, in particular by going through "ordinary" nodes (that don't
X * need to know whether the rest of the match failed) by a loop instead of
X * by recursion.
X */
X#ifdef __STDC__
X
Xstatic int regmatch(char *prog)
X
X#else
X
Xstatic int regmatch(prog)
Xchar *prog;
X
X#endif
X{
X register char *scan; /* Current node. */
X char *nxt; /* nxt node. */
X
X scan = prog;
X#ifdef DEBUG
X if (scan != NULL && regnarrate)
X fprintf(stderr, "%s(\n", regprop(scan));
X#endif
X while (scan != NULL) {
X#ifdef DEBUG
X if (regnarrate)
X fprintf(stderr, "%s...\n", regprop(scan));
X#endif
X nxt = regnext(scan);
X
X switch (OP(scan)) {
X case BOL:
X if (reginput != regbol)
X return (0);
X break;
X case EOL:
X if (*reginput != '\0')
X return (0);
X break;
X case ANY:
X if (*reginput == '\0')
X return (0);
X reginput++;
X break;
X case EXACTLY:{
X register int len;
X register char *opnd;
X
X opnd = OPERAND(scan);
X /* Inline the first character, for speed. */
X if (*opnd != *reginput)
X return (0);
X len = strlen(opnd);
X if (len > 1 && strncmp(opnd, reginput, len) != 0)
X return (0);
X reginput += len;
X }
X break;
X case ANYOF:
X if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == NULL)
X return (0);
X reginput++;
X break;
X case ANYBUT:
X if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != NULL)
X return (0);
X reginput++;
X break;
X case NOTHING:
X break;
X case BACK:
X break;
X case OPEN + 1:
X case OPEN + 2:
X case OPEN + 3:
X case OPEN + 4:
X case OPEN + 5:
X case OPEN + 6:
X case OPEN + 7:
X case OPEN + 8:
X case OPEN + 9:{
X register int no;
X register char *save;
X
X no = OP(scan) - OPEN;
X save = reginput;
X
X if (regmatch(nxt)) {
X /*
X * Don't set startp if some later invocation of the same
X * parentheses already has.
X */
X if (regstartp[no] == NULL)
X regstartp[no] = save;
X return (1);
X } else
X return (0);
X }
X break;
X case CLOSE + 1:
X case CLOSE + 2:
X case CLOSE + 3:
X case CLOSE + 4:
X case CLOSE + 5:
X case CLOSE + 6:
X case CLOSE + 7:
X case CLOSE + 8:
X case CLOSE + 9:{
X register int no;
X register char *save;
X
X no = OP(scan) - CLOSE;
X save = reginput;
X
X if (regmatch(nxt)) {
X /*
X * Don't set endp if some later invocation of the same
X * parentheses already has.
X */
X if (regendp[no] == NULL)
X regendp[no] = save;
X return (1);
X } else
X return (0);
X }
X break;
X case BRANCH:{
X register char *save;
X
X if (OP(nxt) != BRANCH) /* No choice. */
X nxt = OPERAND(scan); /* Avoid recursion. */
X else {
X do {
X save = reginput;
X if (regmatch(OPERAND(scan)))
X return (1);
X reginput = save;
X scan = regnext(scan);
X } while (scan != NULL && OP(scan) == BRANCH);
X return (0);
X /* NOTREACHED */
X }
X }
X break;
X case STAR:{
X register char nextch;
X register int no;
X register char *save;
X register int min;
X
X /*
X * Lookahead to avoid useless match attempts when we know
X * what character comes next.
X */
X nextch = '\0';
X if (OP(nxt) == EXACTLY)
X nextch = *OPERAND(nxt);
X min = (OP(scan) == STAR) ? 0 : 1;
X save = reginput;
X no = regrepeat(OPERAND(scan));
X while (no >= min) {
X /* If it could work, try it. */
X if (nextch == '\0' || *reginput == nextch)
X if (regmatch(nxt))
X return (1);
X /* Couldn't or didn't -- back up. */
X no--;
X reginput = save + no;
X }
X return (0);
X }
X break;
X case END:
X return (1); /* Success! */
X break;
X default:
X regerror("memory corruption");
X return (0);
X break;
X }
X
X scan = nxt;
X }
X
X /*
X * We get here only if there's trouble -- normally "case END" is the
X * terminating point.
X */
X regerror("corrupted pointers");
X return (0);
X}
X
X/*
X - regrepeat - repeatedly match something simple, report how many
X */
X#ifdef __STDC__
X
Xstatic int regrepeat(char *p)
X
X#else
X
Xstatic int regrepeat(p)
Xchar *p;
X
X#endif
X{
X register int count = 0;
X register char *scan;
X register char *opnd;
X
X scan = reginput;
X opnd = OPERAND(p);
X switch (OP(p)) {
X case ANY:
X count = strlen(scan);
X scan += count;
X break;
X case EXACTLY:
X while (*opnd == *scan) {
X count++;
X scan++;
X }
X break;
X case ANYOF:
X while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
X count++;
X scan++;
X }
X break;
X case ANYBUT:
X while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
X count++;
X scan++;
X }
X break;
X default: /* Oh dear. Called inappropriately. */
X regerror("internal foulup");
X count = 0; /* Best compromise. */
X break;
X }
X reginput = scan;
X
X return (count);
X}
X
X
X/*
X - regnext - dig the "nxt" pointer out of a node
X */
X#ifdef __STDC__
X
Xstatic char *regnext(register char *p)
X
X#else
X
Xstatic char *regnext(p)
Xregister char *p;
X
X#endif
X{
X register int offset;
X
X if (p == ®dummy)
X return (NULL);
X
X offset = NEXT(p);
X if (offset == 0)
X return (NULL);
X
X if (OP(p) == BACK)
X return (p - offset);
X else
X return (p + offset);
X}
X
X#ifdef DEBUG
X
XSTATIC char *regprop();
X
X/*
X - regdump - dump a regexp onto stdout in vaguely comprehensible form
X */
X#ifdef __STDC__
X
Xvoid regdump(regexp *r)
X
X#else
X
Xvoid regdump(r)
Xregexp *r;
X
X#endif
X{
X register char *s;
X register char op = EXACTLY; /* Arbitrary non-END op. */
X register char *nxt;
X extern char *strchr();
X
X
X s = r->program + 1;
X while (op != END) { /* While that wasn't END last time... */
X op = OP(s);
X printf("%2d%s", s - r->program, regprop(s)); /* Where, what. */
X nxt = regnext(s);
X if (nxt == NULL) /* nxt ptr. */
X printf("(0)");
X else
X printf("(%d)", (s - r->program) + (nxt - s));
X s += 3;
X if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
X /* Literal string, where present. */
X while (*s != '\0') {
X putchar(*s);
X s++;
X }
X s++;
X }
X putchar('\n');
X }
X
X /* Header fields of interest. */
X if (r->regstart != '\0')
X printf("start `%c' ", r->regstart);
X if (r->reganch)
X printf("anchored ");
X if (r->regmust != NULL)
X printf("must have \"%s\"", r->regmust);
X printf("\n");
X}
X
X/*
X - regprop - printable representation of opcode
X */
X#ifdef __STDC__
X
Xstatic char *regprop(char *op)
X
X#else
X
Xstatic char *regprop(op)
Xchar *op;
X
X#endif
X{
X register char *p;
X static char buf[50];
X
X strcpy(buf, ":");
X
X switch (OP(op)) {
X case BOL:
X p = "BOL";
X break;
X case EOL:
X p = "EOL";
X break;
X case ANY:
X p = "ANY";
X break;
X case ANYOF:
X p = "ANYOF";
X break;
X case ANYBUT:
X p = "ANYBUT";
X break;
X case BRANCH:
X p = "BRANCH";
X break;
X case EXACTLY:
X p = "EXACTLY";
X break;
X case NOTHING:
X p = "NOTHING";
X break;
X case BACK:
X p = "BACK";
X break;
X case END:
X p = "END";
X break;
X case OPEN + 1:
X case OPEN + 2:
X case OPEN + 3:
X case OPEN + 4:
X case OPEN + 5:
X case OPEN + 6:
X case OPEN + 7:
X case OPEN + 8:
X case OPEN + 9:
X sprintf(buf + strlen(buf), "OPEN%d", OP(op) - OPEN);
X p = NULL;
X break;
X case CLOSE + 1:
X case CLOSE + 2:
X case CLOSE + 3:
X case CLOSE + 4:
X case CLOSE + 5:
X case CLOSE + 6:
X case CLOSE + 7:
X case CLOSE + 8:
X case CLOSE + 9:
X sprintf(buf + strlen(buf), "CLOSE%d", OP(op) - CLOSE);
X p = NULL;
X break;
X case STAR:
X p = "STAR";
X break;
X default:
X regerror("corrupted opcode");
X break;
X }
X if (p != NULL)
X strcat(buf, p);
X return (buf);
X}
X#endif
X
X/*
X * The following is provided for those people who do not have strcspn() in
X * their C libraries. They should get off their butts and do something
X * about it; at least one public-domain implementation of those (highly
X * useful) string routines has been published on Usenet.
X */
X#ifdef STRCSPN
X/*
X * strcspn - find length of initial segment of s1 consisting entirely
X * of characters not from s2
X */
X
X#ifdef __STDC__
X
Xstatic int strcspn(char *s1, char *s2)
X
X#else
X
Xstatic int strcspn(s1, s2)
Xchar *s1;
Xchar *s2;
X
X#endif
X{
X register char *scan1;
X register char *scan2;
X register int count;
X
X count = 0;
X for (scan1 = s1; *scan1 != '\0'; scan1++) {
X for (scan2 = s2; *scan2 != '\0';) /* ++ moved down. */
X if (*scan1 == *scan2++)
X return (count);
X count++;
X }
X return (count);
X}
X#endif
X
X
X/*
X - regsub - perform substitutions after a regexp match
X */
X#ifdef __STDC__
X
Xvoid regsub(regexp *prog, char *source, char *dest)
X
X#else
X
Xvoid regsub(prog, source, dest)
Xregexp *prog;
Xchar *source;
Xchar *dest;
X
X#endif
X{
X register char *src;
X register char *dst;
X register char c;
X register int no;
X register int len;
X extern char *strncpy();
X
X if (prog == NULL || source == NULL || dest == NULL) {
X regerror("NULL parm to regsub");
X return;
X }
X if (UCHARAT(prog->program) != MAGIC) {
X regerror("damaged regexp fed to regsub");
X return;
X }
X src = source;
X dst = dest;
X while ((c = *src++) != '\0') {
X if (c == '&')
X no = 0;
X else if (c == '\\' && '0' <= *src && *src <= '9')
X no = *src++ - '0';
X else
X no = -1;
X
X if (no < 0) { /* Ordinary character. */
X if (c == '\\' && (*src == '\\' || *src == '&'))
X c = *src++;
X *dst++ = c;
X } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
X len = prog->endp[no] - prog->startp[no];
X strncpy(dst, prog->startp[no], len);
X dst += len;
X if (len != 0 && *(dst - 1) == '\0') { /* strncpy hit NUL. */
X regerror("damaged match string");
X return;
X }
X }
X }
X *dst++ = '\0';
X}
X
X
X#ifdef __STDC__
X
Xvoid regerror(char *s)
X
X#else
X
Xvoid regerror(s)
Xchar *s;
X
X#endif
X{
X#ifdef NN
X msg("REGEXP ERROR: %s", s);
X#else
X fprintf(stderr, "regexp(3): %s", s);
X exit(1);
X#endif
X}
NO_NEWS_IS_GOOD_NEWS
echo "File regexp.c is complete"
chmod 0644 regexp.c || echo "restore of regexp.c fails"
set `wc -c regexp.c`;Sum=$1
if test "$Sum" != "30816"
then echo original size 30816, current size $Sum;fi
echo "x - extracting regexp.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > regexp.h &&
X/*
X * Definitions etc. for regexp(3) routines.
X *
X * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof],
X * not the System V one.
X */
X
X#define NSUBEXP 10
Xtypedef struct regexp {
X char *startp[NSUBEXP];
X char *endp[NSUBEXP];
X char regstart; /* Internal use only. */
X char reganch; /* Internal use only. */
X char *regmust; /* Internal use only. */
X int regmlen; /* Internal use only. */
X char program[1]; /* Unwarranted chumminess with compiler. */
X} regexp;
X
X
X/*
X * The first byte of the regexp internal "program" is actually this magic
X * number; the start node begins in the second byte.
X */
X#define MAGIC 0234
X
Xextern regexp *regcomp();
Xextern int regexec();
Xextern void regsub();
Xextern void regerror();
X
NO_NEWS_IS_GOOD_NEWS
chmod 0644 regexp.h || echo "restore of regexp.h fails"
set `wc -c regexp.h`;Sum=$1
if test "$Sum" != "731"
then echo original size 731, current size $Sum;fi
echo "x - extracting reroute.c (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > reroute.c &&
X#include "config.h"
X
X#define TRACE
X
X
X#ifdef HAVE_ROUTING
X
Xreroute(route, address)
Xchar *route, *address;
X{
X char *name, *atpos;
X register char *sp;
X register c;
X
X if (atpos = strchr(address, '@')) {
X name = atpos;
X
X while (--name >= address)
X if (isspace(*name) || *name == '<') {
X name++;
X break;
X }
X if (name < address) name++;
X
X for (sp = atpos; c = *sp; sp++)
X if (isspace(c) || c == '>') break;
X
X *sp = NUL;
X strcpy(route, name);
X *sp = c;
X } else
X strcpy(route, address);
X return 1;
X}
X
X#else
X
X#ifndef HAVE_GETHOSTNAME
X
X#ifdef HAVE_UNAME
X
X#include <sys/utsname.h>
X
Xgethostname(name, length)
Xchar *name;
Xint length;
X{
X struct utsname utsname;
X char *host;
X
X uname(&utsname);
X strncpy(name, utsname.nodename, length);
X}
X
X
X#else
X
X#ifdef HOSTNAME
X
Xgethostname(name, length)
Xchar *name;
Xint length;
X{
X strncpy(name, HOSTNAME, length);
X}
X
X#else
X
XYOU LOOSE ON GETHOSTNAME
X
X#endif /* HOSTNAME */
X
X#endif /* HAVE_UNAME */
X
X#endif /* HAVE_GETHOSTNAME */
X
X
X#ifdef TRACE
XFILE *route_trace = NULL;
X#endif
Xstatic char cmdc; /* we need this for trace output */
X
Xreroute(route, address)
Xchar *route, *address;
X{
X char *name, *site, *domain;
X char *atpos, *dotpos;
X register char *sp;
X register c;
X int found;
X
X#ifdef TRACE
X if (route_trace ||
X (route_trace = open_file(relative(lib_directory, "trace"),
X OPEN_APPEND | DONT_CREATE)))
X fprintf(route_trace, "--orig: '%s'\n", address);
X#endif
X
X found = 0;
X
X /* if a sender (or receiver!) is not provided,
X * we first try the site from the 'Reply-To:'
X * and 'From:' lines who@site.domain */
X
X if (atpos = strchr(address, '@')) {
X *atpos = NUL;
X name = atpos;
X
X while (--name >= address)
X if (isspace(*name) || *name == '<') {
X name++;
X break;
X }
X if (name < address) name++;
X
X dotpos = atpos;
X site = atpos + 1;
X
X next_dot:
X *dotpos = NUL;
X domain = dotpos + 1;
X for (sp = domain; c = *sp; sp++) {
X if (isspace(c) || c == '>') break;
X if (c == '.') {
X *dotpos = '.';
X dotpos = sp;
X goto next_dot;
X }
X }
X *sp = NUL;
X if (site == domain)
X domain = NULL;
X else
X *atpos = NUL; /* overwritten when first . is found */
X
X#ifdef TRACE
X if (route_trace)
X fprintf(route_trace,
X " @-type: name='%s' site='%s' domain='%s'\n",
X name, site, domain ? domain : "");
X#endif
X
X found = find_route(route, name, site, domain, (char *)NULL);
X
X if (dotpos) { *dotpos = '.'; *sp = c; }
X if (atpos) *atpos = '@';
X
X goto out;
X }
X
X /*
X * not domain address -- look for bang address
X */
X
X if (!(name = strrchr(address, '!'))) {
X /*
X * neither domain nor bang -- suppose it is a local address
X */
X strcpy(route, address);
X found = 1;
X goto out;
X }
X
X *name++ = NUL;
X if (site = strrchr(address, '!'))
X *site++ = NUL;
X else {
X site = address;
X address = NULL;
X }
X
X#ifdef TRACE
X if (route_trace)
X fprintf(route_trace,
X " !-type: name='%s' site='%s' bang='%s'\n",
X name, site, address ? address : "NONE");
X#endif
X
X found = find_route(route, name, site, (char *)NULL, address);
X
X *--name = '!';
X if (address) *--site = '!';
X
X out:
X
X#ifdef TRACE
X if (route_trace) {
X if (found)
X fprintf(route_trace, "--route='%s'\n\n", route);
X else
X fprintf(route_trace, "--NO ROUTE\n\n");
X fclose(route_trace);
X route_trace = NULL;
X }
X#endif
X return found;
X}
X
X
Xstatic char *cstreq(string, match)
Xchar *string, *match;
X{
X register char *s1, *s2;
X s1 = string;
X
Xnext_part:
X s2 = match;
X
X while (isspace(*s1) || *s1 == ',') s1++;
X
X while (*s2) {
X if (*s1 == NUL || isspace(*s1)) return NULL;
X if (*s1 == ',') goto next_part;
X if (toupper(*s1) != toupper(*s2)) break;
X s1++, s2++;
X }
X
X if (*s2 == NUL && (*s1 == NUL || isspace(*s1) || *s1 == ',')) {
X if (*s1 == ',') while (*s1 && !isspace(*s1)) s1++;
X#ifdef TRACE
X if (route_trace)
X fprintf(route_trace, "/%c %s=%s -> %s", cmdc, string, match, s1);
X#endif
X return s1;
X }
X
X while (*s1 && !isspace(*s1)) {
X if (*s1 == ',') goto next_part;
X s1++;
X }
X
X return NULL;
X}
X
X
Xstatic char *cstrcpy(s1, s2)
Xregister char *s1, *s2;
X{
X while (*s2 && isspace(*s2)) s2++;
X while (*s2 && !isspace(*s2) && *s2 != ',') *s1++ = *s2++;
X *s1 = NUL;
X return s1;
X}
X
X/*
X * lookup site,domain in routes database
X * if not found and bang is non-empty, use bang default if it exist
X */
X
Xstatic find_route(route, remote_user, remote_host, remote_domain, bang)
Xchar *route, *remote_user, *remote_host, *remote_domain, *bang;
X{
X char line[512]; /* line from route file */
X register char *lp; /* current line position */
X char *routep; /* ptr into route */
X char *pattern; /* pattern from line */
X int dom_ok; /* in right domain */
X int host_ok; /* right host */
X FILE *rf; /* route file */
X char local_host[100]; /* callers host name */
X char local_domain[100]; /* this domain */
X
X if (bang && *bang == NUL) bang = NULL;
X if (remote_host == NULL || *remote_host == NUL) return 0;
X
X if (remote_domain && *remote_domain == NUL) remote_domain = NULL;
X
X gethostname(local_host, 100);
X if (routep = strchr(local_host, '.')) *routep = NUL;
X local_domain[0] = NUL;
X
X rf = open_file(relative(lib_directory, "routes"), OPEN_READ);
X if (rf == NULL) {
X#ifdef TRACE
X if (route_trace) fprintf(route_trace, "---No routes file\n");
X#endif
X return 0;
X }
X
X dom_ok = host_ok = 1;
X routep = route;
X pattern = NULL;
X
X while (fgets(line, 512, rf) != NULL) {
X lp = line;
X while (*lp && isspace(*lp)) lp++;
X if (*lp == NUL || *lp == '#') continue;
X
X if (*lp == '/') {
X lp++;
X cmdc = *lp++;
X while (*lp && isspace(*lp)) lp++;
X if (*lp == '#') *lp = NUL;
X
X if (cmdc == 'L') { /* local (default) domain name(s) */
X cstrcpy(local_domain, lp);
X
X if (remote_domain == NULL ||
X cstreq(lp, remote_domain) != NULL) {
X dom_ok = 1;
X if (strcmp(local_host, remote_host) == 0) {
X pattern = "%p%n";
X break;
X }
X }
X continue;
X }
X
X if (cmdc == 'D') { /* destination domain */
X if (*lp == NUL)
X dom_ok = 1;
X else
X dom_ok = (cstreq(lp, remote_domain) != NULL);
X continue;
X }
X
X if (!dom_ok) continue;
X
X if (cmdc == 'H') { /* local host */
X if (*lp == NUL)
X host_ok = 1;
X else
X host_ok = (cstreq(lp, local_host) != NULL);
X continue;
X }
X
X if (!host_ok) continue;
X
X switch (cmdc) {
X
X case 'N': /* neighbouring (uucp) sites */
X if (cstreq(lp, remote_host) == NULL) continue;
X pattern = "%s!%n";
X break;
X
X case 'P':
X if (*lp == '+')
X routep = cstrcpy(routep, ++lp);
X else
X routep = cstrcpy(route, lp);
X continue;
X
X case 'G':
X pattern = lp;
X break;
X
X case 'B':
X if (!bang) continue;
X pattern = lp;
X break;
X
X default:
X continue;
X }
X
X break;
X }
X
X if (!dom_ok) continue;
X if (!host_ok) continue;
X
X if ((pattern = cstreq(lp, remote_host))!=NULL) break;
X }
X
X fclose(rf);
X
X if (pattern == NULL) return 0;
X
X#ifdef TRACE
X if (route_trace) fprintf(route_trace, " pattern='%s'\n", pattern);
X#endif
X
X for (; *pattern != NL && *pattern != NUL; pattern++) {
X if (*pattern == SP || *pattern == TAB) continue;
X if (*pattern == '%') {
X pattern++;
X switch(*pattern) {
X case 'n':
X routep = cstrcpy(routep, remote_user);
X continue;
X case 's':
X routep = cstrcpy(routep, remote_host);
X continue;
X case 'd':
X routep = cstrcpy(routep,
X remote_domain ? remote_domain : local_domain);
X continue;
X case 'b':
X routep = cstrcpy(routep, bang);
X continue;
X case 'p':
X routep = route;
X continue;
X case '%':
X break;
X default:
X continue;
X }
X }
X *routep++ = *pattern;
X }
X *routep = NUL;
X
X return 1;
X}
X
X#endif
NO_NEWS_IS_GOOD_NEWS
chmod 0644 reroute.c || echo "restore of reroute.c fails"
set `wc -c reroute.c`;Sum=$1
if test "$Sum" != "7861"
then echo original size 7861, current size $Sum;fi
echo "x - extracting routes.sample (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > routes.sample &&
X# This file is read from the beginning until a match for a specific
X# domain/site pair is found. Initially all lines applies to all
X# domains and hosts. (NOTICE: we use domain == top-level domain)
X#
X# In the following list of requests, <host name> is the name of the
X# LOCAL host, <domain> and <site> is the receivers domain and site.
X#
X# /L <domain> local domain name(s), implies /D <domain> command
X# /H <local host> following lines only applies to specified local host
X# /H following lines applies to all hosts
X# /N <site> site is neighbour to local host (+prefix)
X# /D <domain> following lines applies to specified domain only
X# /D following lines applies to all domains
X# /P <prefix> <prefix> is prefixed to the generated address
X# /B <pattern> address to use for multi-hop bang addresses
X# /G <pattern> default address pattern
X# <site> <pattern> address patterns used to reach given site
X#
X# The <domain>, <host>, and <site> specifications can be a comma-separated
X# list of domain, host, or site names (without spaces).
X#
X# Address patterns are copied directly to the generated address, except
X# that the following sequences are substituted:
X# %n name of receiver
X# %s receiver's site (with top-level domain stripped off)
X# %d receiver's top-level domain
X# %b first N-1 sites from N multi-hop bang address
X# %p drop <preix> if one is specified
X# %% a % character
X#
X# Default rules:
X# %n@local-host.local-domain -> %p%n
X# %n@neighbour-host.remote-domain -> %s.%d!%n
X#
X# Example configuration (AmbraSoft A/S, September 1987):
X#
X# Backbone: dkuug.dk
X# |
X# In-house: olamb.dk---- ambush.dk ------ ambra.dk
X# / | \
X# Direct: oldk1.dk oldk2.dk olgb1.uucp(=olgb1.oliv.co.uk)
X#
X# This file can be used unchanged on all in-house systems.
X
X/L dk,uucp
X
X/H ambra,olamb
X/N ambush
X/P ambush!
X
X/H
X/N dkuug
X/N ambra,olamb
X/N oldk1,oldk2
X
X/L uucp
X/N olgb1
X
X/D uk
Xolgb1.oliv.co olgb1!%n
X
X/D
X
X/P+ dkuug!
X
X/B %b!%s!%n
X/G %s.%d!%n
NO_NEWS_IS_GOOD_NEWS
chmod 0644 routes.sample || echo "restore of routes.sample fails"
set `wc -c routes.sample`;Sum=$1
if test "$Sum" != "1952"
then echo original size 1952, current size $Sum;fi
echo "x - extracting s-bsd4-2.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-bsd4-2.h &&
X/*
X * This version is for BSD 4.2 systems
X */
X
X
X/*
X * Include haeder files containing the following definitions:
X *
X * off_t, time_t, struct stat
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X
X/*
X * Define if your system has system V like ioctls
X */
X
X#undef HAVE_TERMIO /* */
X
X/*
X * Define to use terminfo database.
X * Otherwise, termcap is used
X */
X
X#undef USE_TERMINFO /* */
X
X/*
X * Specify the library (or libraries) containing the termcap/terminfo
X * routines.
X *
X * Notice: nn only uses the low-level terminal access routines
X * (i.e. it does not use curses).
X */
X
X#define TERMLIB -ltermlib
X
X/*
X * Define HAVE_STRCHR if strchr() and strrchr() are available
X */
X
X#include <string.h>
X
X#undef HAVE_STRCHR /* */
X
X/*
X * Define if a signal handler has type void (see signal.h)
X */
X
X#undef SIGNAL_HANDLERS_ARE_VOID /* */
X
X/*
X * Define MICRO_ALARM to timeout in 0.1 seconds if possible
X */
X
X#define MICRO_ALARM() alarm(1) /* could use setitimer ... */
X
X/*
X * Define if your system has BSD like job control (SIGTSTP works)
X */
X
X#define HAVE_JOBCONTROL /* */
X
X/*
X * Define if your system provides the "directory(3X)" access routines
X *
X * If true, include the header file(s) required by the package below
X * (remember that <sys/types.h> or equivalent is included above)
X * Also typedef Direntry to the proper struct type.
X */
X
X#define HAVE_DIRECTORY /* */
X
X#include <sys/dir.h> /* BSD */
X
Xtypedef struct direct Direntry; /* BSD */
X
X/*
X * Define if your system has a mkdir() library routine
X */
X
X#define HAVE_MKDIR /* */
X
X/*
X * Define if your system provides a BSD like gethostname routine.
X * Otherwise, define HAVE_UNAME if uname() is avaiable.
X */
X
X#define HAVE_GETHOSTNAME /* BSD systems */
X
X/*
X * Define DETATCH_TERMINAL to be a command sequence which
X * will detatch a process from the control terminal
X * Also include system files needed to perform this HERE.
X * If not possible, just define it (empty)
X */
X
X#include <sys/file.h> /* for O_RDONLY */
X#include <sys/ioctl.h> /* for TIOCNOTTY */
X
X#define DETATCH_TERMINAL \
X { int t = open("/dev/tty", O_RDONLY); \
X if (t >= 0) ioctl(t, TIOCNOTTY, (int *)0), close(t); }
X
X
X/*
X * Specify where the Bourne Shell is.
X */
X
X#define SHELL "/bin/sh"
X
X/*
X * Specify the default mailer to be invoked by nnmail
X */
X
X#define MAILX "/usr/ucb/Mail" /* BSD */
X
X
X/*
X * Specify the default pager & options.
X */
X
X#define PAGER "more"
X
X/*
X * Specify the default print command and options.
X */
X
X#define PRINTER "lpr -p -JNN-print"
X
X
X/*
X * Define the maximum length of any pathname that may occur
X */
X
X#define FILENAME 256
NO_NEWS_IS_GOOD_NEWS
chmod 0644 s-bsd4-2.h || echo "restore of s-bsd4-2.h fails"
set `wc -c s-bsd4-2.h`;Sum=$1
if test "$Sum" != "2590"
then echo original size 2590, current size $Sum;fi
echo "x - extracting s-bsd4-3.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-bsd4-3.h &&
X/*
X * This version is for 4.3 systems
X */
X
X
X/*
X * Include haeder files containing the following definitions:
X *
X * off_t, time_t, struct stat
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X
X/*
X * Define if your system has system V like ioctls
X */
X
X#undef HAVE_TERMIO /* */
X
X/*
X * Define to use terminfo database.
X * Otherwise, termcap is used
X */
X
X#undef USE_TERMINFO /* */
X
X/*
X * Specify the library (or libraries) containing the termcap/terminfo
X * routines.
X *
X * Notice: nn only uses the low-level terminal access routines
X * (i.e. it does not use curses).
X */
X
X#define TERMLIB -ltermlib
X
X/*
X * Define HAVE_STRCHR if strchr() and strrchr() are available
X */
X
X#include <string.h>
X
X#undef HAVE_STRCHR /* */
X
X/*
X * Define if a signal handler has type void (see signal.h)
X */
X
X#undef SIGNAL_HANDLERS_ARE_VOID /* */
X
X/*
X * Define MICRO_ALARM to timeout in 0.1 seconds if possible
X */
X
X#define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
X
X/*
X * Define if your system has BSD like job control (SIGTSTP works)
X */
X
X#define HAVE_JOBCONTROL /* */
X
X/*
X * Define if your system has a 4.3BSD like syslog library.
X */
X
X#define HAVE_SYSLOG
X
X/*
X * Define if your system provides the "directory(3X)" access routines
X *
X * If true, include the header file(s) required by the package below
X * (remember that <sys/types.h> or equivalent is included above)
X * Also typedef Direntry to the proper struct type.
X */
X
X#define HAVE_DIRECTORY /* */
X
X#include <sys/dir.h> /* BSD */
X
Xtypedef struct direct Direntry; /* BSD */
X
X/*
X * Define if your system has a mkdir() library routine
X */
X
X#define HAVE_MKDIR /* */
X
X/*
X * Define if your system provides a BSD like gethostname routine.
X * Otherwise, define HAVE_UNAME if uname() is avaiable.
X */
X
X#define HAVE_GETHOSTNAME /* BSD systems */
X
X/*
X * Define DETATCH_TERMINAL to be a command sequence which
X * will detatch a process from the control terminal
X * Also include system files needed to perform this HERE.
X * If not possible, just define it (empty)
X */
X
X#include <sys/file.h> /* for O_RDONLY */
X#include <sys/ioctl.h> /* for TIOCNOTTY */
X
X#define DETATCH_TERMINAL \
X { int t = open("/dev/tty", O_RDONLY); \
X if (t >= 0) ioctl(t, TIOCNOTTY, (int *)0), close(t); }
X
X
X/*
X * Specify where the Bourne Shell is.
X */
X
X#define SHELL "/bin/sh"
X
X/*
X * Specify the default mailer to be invoked by nnmail
X */
X
X#define MAILX "/usr/ucb/Mail" /* BSD */
X
X
X/*
X * Specify the default pager & options.
X */
X
X#define PAGER "more"
X
X/*
X * Specify the default print command and options.
X */
X
X#define PRINTER "lpr -p -JNN-print"
X
X
X/*
X * Define the maximum length of any pathname that may occur
X */
X
X#define FILENAME 256
NO_NEWS_IS_GOOD_NEWS
chmod 0644 s-bsd4-3.h || echo "restore of s-bsd4-3.h fails"
set `wc -c s-bsd4-3.h`;Sum=$1
if test "$Sum" != "2666"
then echo original size 2666, current size $Sum;fi
echo "x - extracting s-hpux.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-hpux.h &&
X/*
X * This version is for Hewlett-Packard HP-UX
X */
X
X
X/*
X * Include header files containing the following definitions:
X *
X * off_t, time_t, struct stat
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X/*
X * Define if your system has system V like ioctls
X */
X
X#define HAVE_TERMIO /* */
X
X/*
X * Define to use terminfo database.
X * Otherwise, termcap is used
X */
X
X#define USE_TERMINFO /* */
X
X/*
X * Specify the library containing the termcap/terminfo access routines.
X * Notice: nn does not use curses.
X * Notice: You must also specify whether termcap or terminfo is
X * used when you edit config.h (see below).
X */
X
X#define TERMLIB -lcurses
X
X/*
X * Define HAVE_STRCHR if strchr() and strrchr() are available
X */
X
X#define HAVE_STRCHR /* */
X
X/*
X * Define if a signal handler has type void (see signal.h)
X */
X
X/* #define SIGNAL_HANDLERS_ARE_VOID /* */
X
X/*
X * Define if signals must be set again after they are caught
X */
X
X#define RESET_SIGNAL_WHEN_CAUGHT /* */
X
X/*
X * Define MICRO_ALARM to timeout in 0.1 seconds if possible
X */
X
X#define MICRO_ALARM() alarm(1) /* System V */
X
X/*
X * Define if your system has BSD like job control (SIGTSTP works)
X */
X
X/* #define HAVE_JOBCONTROL /* */
X
X/*
X * Define if your system provides the "directory(3X)" access routines
X *
X * If true, include the header file(s) required by the package below
X * (remember that <sys/types.h> or equivalent is included above)
X * Also typedef Direntry to the proper struct type.
X */
X
X#define HAVE_DIRECTORY /* */
X
X#include <ndir.h> /* HP-UX */
X
Xtypedef struct direct Direntry; /* HP-UX */
X
X/*
X * Define if your system has a mkdir() library routine
X */
X
X#define HAVE_MKDIR /* */
X
X/*
X * Define HAVE_GETHOSTNAME if your system provides a BSD like
X * gethostname routine.
X * Otherwise, define HAVE_UNAME if uname() is avaiable.
X * As a final resort, define HOSTNAME to the name of your system.
X */
X
X#define HAVE_UNAME /* System V */
X
X/*
X * Define DETATCH_TERMINAL to be a command sequence which
X * will detatch a process from the control terminal
X * Also include files needed to perform this HERE.
X * If not possible, just define it (empty)
X */
X
X#define DETATCH_TERMINAL setpgrp(); /* System V */
X
X/*
X * Specify where the Bourne Shell is.
X */
X
X#define SHELL "/bin/sh"
X
X/*
X * Specify the default mailer to be invoked by nnmail
X */
X
X#define MAILX "/usr/bin/mailx" /* SV */
X
X/*
X * Specify the default pager & options.
X */
X
X#define PAGER "less"
X
X/*
X * Specify the default print command and options.
X */
X
X#define PRINTER "lp -s"
X
X
X/*
X * Define the maximum length of any pathname that may occur
X */
X
X#define FILENAME 128
NO_NEWS_IS_GOOD_NEWS
chmod 0644 s-hpux.h || echo "restore of s-hpux.h fails"
set `wc -c s-hpux.h`;Sum=$1
if test "$Sum" != "2603"
then echo original size 2603, current size $Sum;fi
echo "x - extracting s-hpux2-1.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-hpux2-1.h &&
X/*
X * This version is for HP-UX 2.1 (on HP9000 Series 800)
X */
X
X
X/*
X * Include header files containing the following definitions:
X *
X * off_t, time_t, struct stat
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X
X/*
X * Define if your system has system V like ioctls
X */
X
X#define HAVE_TERMIO /* */
X
X/*
X * Define to use terminfo database.
X * Otherwise, termcap is used
X */
X
X#define USE_TERMINFO /* */
X
X/*
X * Specify the library (or libraries) containing the termcap/terminfo
X * routines.
X *
X * Notice: nn only uses the low-level terminal access routines
X * (i.e. it does not use curses).
X */
X
X#define TERMLIB -lcurses
X
X/*
X * Define HAVE_STRCHR if strchr() and strrchr() are available
X */
X
X#define HAVE_STRCHR /* */
X
X/*
X * Define if a signal handler has type void (see signal.h)
X */
X
X#undef SIGNAL_HANDLERS_ARE_VOID /* */
X
X/*
X * Define if signals must be set again after they are caught
X */
X
X#define RESET_SIGNAL_WHEN_CAUGHT /* */
X
X/*
X * Define MICRO_ALARM to timeout in 0.1 seconds if possible
X */
X
X#define MICRO_ALARM() not_needed(0.1) /* only used #ifndef HAVE_TERMIO */
X
X/*
X * Define if your system has BSD like job control (SIGTSTP works)
X */
X
X#define HAVE_JOBCONTROL /* */
X
X
X/*
X * Define if your system has a 4.3BSD like syslog library.
X */
X
X#define HAVE_SYSLOG
X
X/*
X * Define if your system provides the "directory(3X)" access routines
X *
X * If true, include the header file(s) required by the package below
X * (remember that <sys/types.h> or equivalent is included above)
X * Also typedef Direntry to the proper struct type.
X */
X
X#define HAVE_DIRECTORY /* */
X
X#include <ndir.h>
X
Xtypedef struct direct Direntry;
X
X/*
X * Define if your system has a mkdir() library routine
X */
X
X#define HAVE_MKDIR /* */
X
X
X/*
X * Define HAVE_GETHOSTNAME if your system provides a BSD like
X * gethostname routine.
X * Otherwise, define HAVE_UNAME if uname() is avaiable.
X * As a final resort, define HOSTNAME to the name of your system
X * (in config.h).
X */
X
X#define HAVE_GETHOSTNAME
X
X/*
X * Define DETATCH_TERMINAL to be a command sequence which
X * will detatch a process from the control terminal
X * Also include system files needed to perform this HERE.
X * If not possible, just define it (empty)
X */
X
X/* #include "...." */
X
X#define DETATCH_TERMINAL /* setpgrp(); */
X
X
X/*
X * Specify where the Bourne Shell is.
X */
X
X#define SHELL "/bin/sh"
X
X/*
X * Specify the default mailer to be invoked by nnmail
X */
X
X#define MAILX "/usr/bin/mailx" /* SV */
X
X
X/*
X * Specify the default pager & options.
X */
X
X#define PAGER "/usr/local/bin/less"
X
X/*
X * Specify the default print command and options.
X */
X
X#define PRINTER "/usr/bin/lp -s"
X
X
X/*
X * Define the maximum length of any pathname that may occur
X */
X
X#define FILENAME 1024
X
X
X/*
X * Define standard compiler flags here:
X */
X
X#define COMPILER_FLAGS -O -z
NO_NEWS_IS_GOOD_NEWS
chmod 0644 s-hpux2-1.h || echo "restore of s-hpux2-1.h fails"
set `wc -c s-hpux2-1.h`;Sum=$1
if test "$Sum" != "3089"
then echo original size 3089, current size $Sum;fi
echo "x - extracting s-sunos3.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-sunos3.h &&
X/*
X * This version is for SunOS 3.x systems (tested on 3.5)
X */
X
X
X/*
X * Include header files containing the following definitions:
X *
X * off_t, time_t, struct stat
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X
X/*
X * Define if your system has system V like ioctls
X */
X
X#undef HAVE_TERMIO /* */
X
X/*
X * Define to use terminfo database.
X * Otherwise, termcap is used
X */
X
X#undef USE_TERMINFO /* */
X
X/*
X * Specify the library (or libraries) containing the termcap/terminfo
X * routines.
X *
X * Notice: nn only uses the low-level terminal access routines
X * (i.e. it does not use curses).
X */
X
X#define TERMLIB -ltermlib
X
X/*
X * Define HAVE_STRCHR if strchr() and strrchr() are available
X */
X
X#include <strings.h>
X
X#define HAVE_STRCHR /* */
X
X/*
X * Define if a signal handler has type void (see signal.h)
X */
X
X#undef SIGNAL_HANDLERS_ARE_VOID /* */
X
X/*
X * Define MICRO_ALARM to timeout after 0.1 seconds if possible
X */
X
X#define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
X
X/*
X * Define if your system has BSD like job control (SIGTSTP works)
X */
X
X#define HAVE_JOBCONTROL /* */
X
X
X/*
X * Define if your system has a 4.3BSD like syslog library.
X */
X
X#undef HAVE_SYSLOG
X
X/*
X * Define if your system provides the "directory(3X)" access routines
X *
X * If true, include the header file(s) required by the package below
X * (remember that <sys/types.h> or equivalent is included above)
X * Also typedef Direntry to the proper struct type.
X */
X
X#define HAVE_DIRECTORY /* */
X
X#include <sys/dir.h> /* BSD */
X
Xtypedef struct direct Direntry; /* BSD */
X
X/*
X * Define if your system has a mkdir() library routine
X */
X
X#define HAVE_MKDIR /* */
X
X/*
X * Define if your system provides a BSD like gethostname routine.
X * Otherwise, define HAVE_UNAME if uname() is avaiable.
X */
X
X#define HAVE_GETHOSTNAME /* BSD systems */
X
X/*
X * Define DETATCH_TERMINAL to be a command sequence which
X * will detatch a process from the control terminal
X * Also include system files needed to perform this HERE.
X * If not possible, just define it (empty)
X */
X
X#include <sys/file.h> /* for O_RDONLY */
X#include <sys/ioctl.h> /* for TIOCNOTTY */
X
X#define DETATCH_TERMINAL \
X { int t = open("/dev/tty", O_RDONLY); \
X if (t >= 0) ioctl(t, TIOCNOTTY, (int *)0), close(t); }
X
X
X/*
X * Specify where the Bourne Shell is.
X */
X
X#define SHELL "/bin/sh"
X
X/*
X * Specify the default mailer to be invoked by nnmail
X */
X
X#define MAILX "/usr/ucb/Mail" /* BSD */
X
X
X/*
X * Specify the default pager & options.
X */
X
X#define PAGER "more"
X
X/*
X * Specify the default print command and options.
X */
X
X#define PRINTER "lpr -s"
X
X/*
X * Define the maximum length of any pathname that may occur
X */
X
X#define FILENAME 256
NO_NEWS_IS_GOOD_NEWS
chmod 0644 s-sunos3.h || echo "restore of s-sunos3.h fails"
set `wc -c s-sunos3.h`;Sum=$1
if test "$Sum" != "2680"
then echo original size 2680, current size $Sum;fi
echo "x - extracting s-sunos4-0.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-sunos4-0.h &&
X/*
X * This version is for BSD 4.2 and 4.3 systems
X */
X
X
X/*
X * Include haeder files containing the following definitions:
X *
X * off_t, time_t, struct stat
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X
X/*
X * Define if your system has system V like ioctls
X */
X
X#undef HAVE_TERMIO /* */
X
X/*
X * Define to use terminfo database.
X * Otherwise, termcap is used
X */
X
X#undef USE_TERMINFO /* */
X
X/*
X * Specify the library (or libraries) containing the termcap/terminfo
X * routines.
X *
X * Notice: nn only uses the low-level terminal access routines
X * (i.e. it does not use curses).
X */
X
X#define TERMLIB -ltermlib
X
X/*
X * Define HAVE_STRCHR if strchr() and strrchr() are available
X */
X
X#include <strings.h>
X
X#define HAVE_STRCHR /* */
X
X/*
X * Define if a signal handler has type void (see signal.h)
X */
X
X#define SIGNAL_HANDLERS_ARE_VOID /* */
X
X/*
X * Define MICRO_ALARM to timeout after 0.1 seconds if possible
X */
X
X#define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
X
X/*
X * Define if your system has BSD like job control (SIGTSTP works)
X */
X
X#define HAVE_JOBCONTROL /* */
X
X
X/*
X * Define if your system has a 4.3BSD like syslog library.
X */
X
X#define HAVE_SYSLOG
X
X/*
X * Define if your system provides the "directory(3X)" access routines
X *
X * If true, include the header file(s) required by the package below
X * (remember that <sys/types.h> or equivalent is included above)
X * Also typedef Direntry to the proper struct type.
X */
X
X#define HAVE_DIRECTORY /* */
X
X#include <sys/dir.h> /* BSD */
X
Xtypedef struct direct Direntry; /* BSD */
X
X/*
X * Define if your system has a mkdir() library routine
X */
X
X#define HAVE_MKDIR /* */
X
X/*
X * Define if your system provides a BSD like gethostname routine.
X * Otherwise, define HAVE_UNAME if uname() is avaiable.
X */
X
X#define HAVE_GETHOSTNAME /* BSD systems */
X
X/*
X * Define DETATCH_TERMINAL to be a command sequence which
X * will detatch a process from the control terminal
X * Also include system files needed to perform this HERE.
X * If not possible, just define it (empty)
X */
X
X#include <sys/file.h> /* for O_RDONLY */
X#include <sys/ioctl.h> /* for TIOCNOTTY */
X
X#define DETATCH_TERMINAL \
X { int t = open("/dev/tty", O_RDONLY); \
X if (t >= 0) ioctl(t, TIOCNOTTY, (int *)0), close(t); }
X
X
X/*
X * Specify where the Bourne Shell is.
X */
X
X#define SHELL "/usr/bin/sh"
X
X/*
X * Specify the default mailer to be invoked by nnmail
X */
X
X#define MAILX "/usr/ucb/Mail" /* BSD */
X
X
X/*
X * Specify the default pager & options.
X */
X
X#define PAGER "more"
X
X/*
X * Specify the default print command and options.
X */
X
X#define PRINTER "lpr -p -JNN-print"
X
X
X/*
X * Define the maximum length of any pathname that may occur
X */
X
X#define FILENAME 256
NO_NEWS_IS_GOOD_NEWS
chmod 0644 s-sunos4-0.h || echo "restore of s-sunos4-0.h fails"
set `wc -c s-sunos4-0.h`;Sum=$1
if test "$Sum" != "2688"
then echo original size 2688, current size $Sum;fi
echo "x - extracting s-template.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-template.h &&
X/*
X * Use this file as a template for new s- files
X */
X
X
X/*
X * Include header files containing the following definitions:
X *
X * off_t, time_t, struct stat
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X
X/*
X * Define if your system has system V like ioctls
X */
X
X#define HAVE_TERMIO /* */
X
X/*
X * Define to use terminfo database.
X * Otherwise, termcap is used
X */
X
X#define USE_TERMINFO /* */
X
X/*
X * Specify the library (or libraries) containing the termcap/terminfo
X * routines.
X *
X * Notice: nn only uses the low-level terminal access routines
X * (i.e. it does not use curses).
X */
X
X#define TERMLIB -ltermlib
X
X/*
X * Define HAVE_STRCHR if strchr() and strrchr() are available
X */
X
X#define HAVE_STRCHR /* */
X
X/*
X * Define if a signal handler has type void (see signal.h)
X */
X
X#define SIGNAL_HANDLERS_ARE_VOID /* */
X
X/*
X * Define if signals must be set again after they are caught
X */
X
X#define RESET_SIGNAL_WHEN_CAUGHT /* */
X
X/*
X * Define MICRO_ALARM to timeout in 0.1 seconds if possible
X */
X
X#define MICRO_ALARM() alarm(1) /* System V */
X/*#define MICRO_ALARM() ualarm(100000,0) /* BSD 4.3 */
X
X/*
X * Define if your system has BSD like job control (SIGTSTP works)
X */
X
X/* #define HAVE_JOBCONTROL /* */
X
X
X/*
X * Define if your system has a 4.3BSD like syslog library.
X */
X
X#undef HAVE_SYSLOG
X
X/*
X * Define if your system provides the "directory(3X)" access routines
X *
X * If true, include the header file(s) required by the package below
X * (remember that <sys/types.h> or equivalent is included above)
X * Also typedef Direntry to the proper struct type.
X */
X
X#define HAVE_DIRECTORY /* */
X
X#include <dirent.h> /* System V */
X/* #include <sys/dir.h> /* BSD */
X
Xtypedef struct dirent Direntry; /* System V */
X/* typedef struct direct Direntry; /* BSD */
X
X/*
X * Define if your system has a mkdir() library routine
X */
X
X#define HAVE_MKDIR /* */
X
X
X/*
X * Define HAVE_GETHOSTNAME if your system provides a BSD like
X * gethostname routine.
X * Otherwise, define HAVE_UNAME if uname() is avaiable.
X * As a final resort, define HOSTNAME to the name of your system
X * (in config.h).
X */
X
X/* #define HAVE_GETHOSTNAME /* BSD systems */
X
X#define HAVE_UNAME /* System V */
X
X/*
X * Define DETATCH_TERMINAL to be a command sequence which
X * will detatch a process from the control terminal
X * Also include system files needed to perform this HERE.
X * If not possible, just define it (empty)
X */
X
X/* #include "...." */
X
X#define DETATCH_TERMINAL /* setpgrp(); */
X
X
X/*
X * Specify where the Bourne Shell is.
X */
X
X#define SHELL "/bin/sh"
X
X/*
X * Specify the default mailer to be invoked by nnmail
X */
X
X#define MAILX "/usr/bin/mailx" /* SV */
X/* #define MAILX "/usr/ucb/Mail" /* BSD */
X
X
X/*
X * Specify the default pager & options.
X */
X
X#define PAGER "/usr/bin/pg -n -s"
X
X/*
X * Specify the default print command and options.
X */
X
X#define PRINTER "/usr/bin/lp -s"
X
X
X/*
X * Define the maximum length of any pathname that may occur
X */
X
X#define FILENAME 128
X
X
X/*
X * Define standard compiler flags here:
X */
X
X#define COMPILER_FLAGS
X
X/*
X * If your system requires other libraries when linking nn
X * specify them here:
X */
X
X#define EXTRA_LIB
NO_NEWS_IS_GOOD_NEWS
chmod 0644 s-template.h || echo "restore of s-template.h fails"
set `wc -c s-template.h`;Sum=$1
if test "$Sum" != "3141"
then echo original size 3141, current size $Sum;fi
echo "x - extracting s-tower32.h (Text)"
sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-tower32.h &&
X/*
X * This version is for Tower-32 machines.
X */
X
X
X/*
X * Include header files containing the following definitions:
X *
X * off_t, time_t, struct stat
X */
X
X#include <sys/types.h>
X#include <sys/stat.h>
X
X/*
X * Define if your system has system V like ioctls
X */
X
X#define HAVE_TERMIO /* */
X
X/*
X * Define to use terminfo database.
X * Otherwise, termcap is used
X */
X
X#define USE_TERMINFO /* */
X
X/*
X * Specify the library containing the termcap/terminfo access routines.
X * Notice: nn does not use curses.
X * Notice: You must also specify whether termcap or terminfo is
X * used when you edit config.h (see below).
X */
X
X#define TERMLIB -lcurses
X
X/*
X * Define HAVE_STRCHR if strchr() and strrchr() are available
X */
X
X#define HAVE_STRCHR /* */
X
X/*
X * Define if a signal handler has type void (see signal.h)
X */
X
X/* #define SIGNAL_HANDLERS_ARE_VOID /* */
X
X/*
X * Define if signals must be set again after they are caught
X */
X
X#define RESET_SIGNAL_WHEN_CAUGHT /* */
X
X/*
X * Define MICRO_ALARM to timeout in 0.1 seconds if possible
X */
X
X#define MICRO_ALARM() alarm(1) /* System V */
X
X/*
X * Define if your system has BSD like job control (SIGTSTP works)
X */
X
X/* #define HAVE_JOBCONTROL /* */
X
X/*
X * Define if your system provides the "directory(3X)" access routines
X *
X * If true, include the header file(s) required by the package below
X * (remember that <sys/types.h> or equivalent is included above)
X * Also typedef Direntry to the proper struct type.
X */
X
X/* #define HAVE_DIRECTORY /* */
X
X/* #include <dirent.h> /* System V */
X
X/* typedef struct dirent Direntry; /* System V */
X
X/*
X * Define if your system has a mkdir() library routine
NO_NEWS_IS_GOOD_NEWS
echo "End of part 13"
echo "File s-tower32.h is continued in part 14"
echo "14" > s2_seq_.tmp
exit 0
---
Kim F. Storm storm@texas.dk Tel +45 429 174 00
Texas Instruments, Marielundvej 46E, DK-2730 Herlev, Denmark
No news is good news, but nn is better!