home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume19 / nn / part13 < prev    next >
Text File  |  1989-06-22  |  51KB  |  2,397 lines

  1. Subject:  v19i074:  NN, a Usenet news reader, Part13/15
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: storm@texas.dk (Kim F. Storm)
  7. Posting-number: Volume 19, Issue 74
  8. Archive-name: nn/part13
  9.  
  10. #!/bin/sh
  11. # this is part 13 of a multipart archive
  12. # do not concatenate these parts, unpack them in order with /bin/sh
  13. # file regexp.c continued
  14. #
  15. CurArch=13
  16. if test ! -r s2_seq_.tmp
  17. then echo "Please unpack part 1 first!"
  18.      exit 1; fi
  19. ( read Scheck
  20.   if test "$Scheck" != $CurArch
  21.   then echo "Please unpack part $Scheck next!"
  22.        exit 1;
  23.   else exit 0; fi
  24. ) < s2_seq_.tmp || exit 1
  25. echo "x - Continuing file regexp.c"
  26. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' >> regexp.c
  27. X */
  28. Xstatic void regoptail(p, val)
  29. Xchar           *p;
  30. Xchar           *val;
  31. X{
  32. X    /* "Operandless" and "op != BRANCH" are synonymous in practice. */
  33. X    if (p == NULL || p == ®dummy || OP(p) != BRANCH)
  34. X    return;
  35. X    regtail(OPERAND(p), val);
  36. X}
  37. X
  38. X/*
  39. X * regexec and friends
  40. X */
  41. X
  42. X/*
  43. X * Global work variables for regexec().
  44. X */
  45. Xstatic char    *reginput;    /* String-input pointer. */
  46. Xstatic char    *regbol;        /* Beginning of input, for ^ check. */
  47. Xstatic char   **regstartp;    /* Pointer to startp array. */
  48. Xstatic char   **regendp;    /* Ditto for endp. */
  49. X
  50. X/*
  51. X * Forwards.
  52. X */
  53. XSTATIC int      regtry();
  54. XSTATIC int      regmatch();
  55. XSTATIC int      regrepeat();
  56. X
  57. X#ifdef DEBUG
  58. Xint             regnarrate = 0;
  59. Xvoid            regdump();
  60. XSTATIC char    *regprop();
  61. X#endif
  62. X
  63. X/*
  64. X - regexec - match a regexp against a string
  65. X */
  66. Xint regexec(prog, string)
  67. Xregister regexp *prog;
  68. Xregister char  *string;
  69. X{
  70. X    register char  *s;
  71. X
  72. X    /* Be paranoid... */
  73. X    if (prog == NULL || string == NULL) {
  74. X    regerror("NULL parameter");
  75. X    return (0);
  76. X    }
  77. X    /* Check validity of program. */
  78. X    if (UCHARAT(prog->program) != MAGIC) {
  79. X    regerror("corrupted program");
  80. X    return (0);
  81. X    }
  82. X    /* If there is a "must appear" string, look for it. */
  83. X    if (prog->regmust != NULL) {
  84. X    s = string;
  85. X    while ((s = strchr(s, prog->regmust[0])) != NULL) {
  86. X        if (strncmp(s, prog->regmust, prog->regmlen) == 0)
  87. X        break;        /* Found it. */
  88. X        s++;
  89. X    }
  90. X    if (s == NULL)        /* Not present. */
  91. X        return (0);
  92. X    }
  93. X    /* Mark beginning of line for ^ . */
  94. X    regbol = string;
  95. X
  96. X    /* Simplest case:  anchored match need be tried only once. */
  97. X    if (prog->reganch)
  98. X    return (regtry(prog, string));
  99. X
  100. X    /* Messy cases:  unanchored match. */
  101. X    s = string;
  102. X    if (prog->regstart != '\0')
  103. X    /* We know what char it must start with. */
  104. X    while ((s = strchr(s, prog->regstart)) != NULL) {
  105. X        if (regtry(prog, s))
  106. X        return (1);
  107. X        s++;
  108. X    }
  109. X    else
  110. X    /* We don't -- general case. */
  111. X    do {
  112. X        if (regtry(prog, s))
  113. X        return (1);
  114. X    } while (*s++ != '\0');
  115. X
  116. X    /* Failure. */
  117. X    return (0);
  118. X}
  119. X
  120. X/*
  121. X - regtry - try match at specific point
  122. X */
  123. X#ifdef __STDC__
  124. X
  125. Xstatic int regtry(regexp *prog, char *string)
  126. X
  127. X#else
  128. X
  129. Xstatic int regtry(prog, string)
  130. Xregexp         *prog;
  131. Xchar           *string;
  132. X
  133. X#endif
  134. X{
  135. X    register int    i;
  136. X    register char **sp;
  137. X    register char **ep;
  138. X
  139. X    reginput = string;
  140. X    regstartp = prog->startp;
  141. X    regendp = prog->endp;
  142. X
  143. X    sp = prog->startp;
  144. X    ep = prog->endp;
  145. X    for (i = NSUBEXP; i > 0; i--) {
  146. X    *sp++ = NULL;
  147. X    *ep++ = NULL;
  148. X    }
  149. X    if (regmatch(prog->program + 1)) {
  150. X    prog->startp[0] = string;
  151. X    prog->endp[0] = reginput;
  152. X    return (1);
  153. X    } else
  154. X    return (0);
  155. X}
  156. X
  157. X/*
  158. X - regmatch - main matching routine
  159. X *
  160. X * Conceptually the strategy is simple:  check to see whether the current
  161. X * node matches, call self recursively to see whether the rest matches,
  162. X * and then act accordingly.  In practice we make some effort to avoid
  163. X * recursion, in particular by going through "ordinary" nodes (that don't
  164. X * need to know whether the rest of the match failed) by a loop instead of
  165. X * by recursion.
  166. X */
  167. X#ifdef __STDC__
  168. X
  169. Xstatic int regmatch(char *prog)
  170. X
  171. X#else
  172. X
  173. Xstatic int regmatch(prog)
  174. Xchar           *prog;
  175. X
  176. X#endif
  177. X{
  178. X    register char  *scan;    /* Current node. */
  179. X    char           *nxt;    /* nxt node. */
  180. X
  181. X    scan = prog;
  182. X#ifdef DEBUG
  183. X    if (scan != NULL && regnarrate)
  184. X    fprintf(stderr, "%s(\n", regprop(scan));
  185. X#endif
  186. X    while (scan != NULL) {
  187. X#ifdef DEBUG
  188. X    if (regnarrate)
  189. X        fprintf(stderr, "%s...\n", regprop(scan));
  190. X#endif
  191. X    nxt = regnext(scan);
  192. X
  193. X    switch (OP(scan)) {
  194. X    case BOL:
  195. X        if (reginput != regbol)
  196. X        return (0);
  197. X        break;
  198. X    case EOL:
  199. X        if (*reginput != '\0')
  200. X        return (0);
  201. X        break;
  202. X    case ANY:
  203. X        if (*reginput == '\0')
  204. X        return (0);
  205. X        reginput++;
  206. X        break;
  207. X    case EXACTLY:{
  208. X        register int    len;
  209. X        register char  *opnd;
  210. X
  211. X        opnd = OPERAND(scan);
  212. X        /* Inline the first character, for speed. */
  213. X        if (*opnd != *reginput)
  214. X            return (0);
  215. X        len = strlen(opnd);
  216. X        if (len > 1 && strncmp(opnd, reginput, len) != 0)
  217. X            return (0);
  218. X        reginput += len;
  219. X        }
  220. X        break;
  221. X    case ANYOF:
  222. X        if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == NULL)
  223. X        return (0);
  224. X        reginput++;
  225. X        break;
  226. X    case ANYBUT:
  227. X        if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != NULL)
  228. X        return (0);
  229. X        reginput++;
  230. X        break;
  231. X    case NOTHING:
  232. X        break;
  233. X    case BACK:
  234. X        break;
  235. X    case OPEN + 1:
  236. X    case OPEN + 2:
  237. X    case OPEN + 3:
  238. X    case OPEN + 4:
  239. X    case OPEN + 5:
  240. X    case OPEN + 6:
  241. X    case OPEN + 7:
  242. X    case OPEN + 8:
  243. X    case OPEN + 9:{
  244. X        register int    no;
  245. X        register char  *save;
  246. X
  247. X        no = OP(scan) - OPEN;
  248. X        save = reginput;
  249. X
  250. X        if (regmatch(nxt)) {
  251. X            /*
  252. X             * Don't set startp if some later invocation of the same
  253. X             * parentheses already has. 
  254. X             */
  255. X            if (regstartp[no] == NULL)
  256. X            regstartp[no] = save;
  257. X            return (1);
  258. X        } else
  259. X            return (0);
  260. X        }
  261. X        break;
  262. X    case CLOSE + 1:
  263. X    case CLOSE + 2:
  264. X    case CLOSE + 3:
  265. X    case CLOSE + 4:
  266. X    case CLOSE + 5:
  267. X    case CLOSE + 6:
  268. X    case CLOSE + 7:
  269. X    case CLOSE + 8:
  270. X    case CLOSE + 9:{
  271. X        register int    no;
  272. X        register char  *save;
  273. X
  274. X        no = OP(scan) - CLOSE;
  275. X        save = reginput;
  276. X
  277. X        if (regmatch(nxt)) {
  278. X            /*
  279. X             * Don't set endp if some later invocation of the same
  280. X             * parentheses already has. 
  281. X             */
  282. X            if (regendp[no] == NULL)
  283. X            regendp[no] = save;
  284. X            return (1);
  285. X        } else
  286. X            return (0);
  287. X        }
  288. X        break;
  289. X    case BRANCH:{
  290. X        register char  *save;
  291. X
  292. X        if (OP(nxt) != BRANCH)    /* No choice. */
  293. X            nxt = OPERAND(scan);    /* Avoid recursion. */
  294. X        else {
  295. X            do {
  296. X            save = reginput;
  297. X            if (regmatch(OPERAND(scan)))
  298. X                return (1);
  299. X            reginput = save;
  300. X            scan = regnext(scan);
  301. X            } while (scan != NULL && OP(scan) == BRANCH);
  302. X            return (0);
  303. X            /* NOTREACHED */
  304. X        }
  305. X        }
  306. X        break;
  307. X    case STAR:{
  308. X        register char   nextch;
  309. X        register int    no;
  310. X        register char  *save;
  311. X        register int    min;
  312. X
  313. X        /*
  314. X         * Lookahead to avoid useless match attempts when we know
  315. X         * what character comes next. 
  316. X         */
  317. X        nextch = '\0';
  318. X        if (OP(nxt) == EXACTLY)
  319. X            nextch = *OPERAND(nxt);
  320. X        min = (OP(scan) == STAR) ? 0 : 1;
  321. X        save = reginput;
  322. X        no = regrepeat(OPERAND(scan));
  323. X        while (no >= min) {
  324. X            /* If it could work, try it. */
  325. X            if (nextch == '\0' || *reginput == nextch)
  326. X            if (regmatch(nxt))
  327. X                return (1);
  328. X            /* Couldn't or didn't -- back up. */
  329. X            no--;
  330. X            reginput = save + no;
  331. X        }
  332. X        return (0);
  333. X        }
  334. X        break;
  335. X    case END:
  336. X        return (1);        /* Success! */
  337. X        break;
  338. X    default:
  339. X        regerror("memory corruption");
  340. X        return (0);
  341. X        break;
  342. X    }
  343. X
  344. X    scan = nxt;
  345. X    }
  346. X
  347. X    /*
  348. X     * We get here only if there's trouble -- normally "case END" is the
  349. X     * terminating point. 
  350. X     */
  351. X    regerror("corrupted pointers");
  352. X    return (0);
  353. X}
  354. X
  355. X/*
  356. X - regrepeat - repeatedly match something simple, report how many
  357. X */
  358. X#ifdef __STDC__
  359. X
  360. Xstatic int regrepeat(char *p)
  361. X
  362. X#else
  363. X
  364. Xstatic int regrepeat(p)
  365. Xchar           *p;
  366. X
  367. X#endif
  368. X{
  369. X    register int    count = 0;
  370. X    register char  *scan;
  371. X    register char  *opnd;
  372. X
  373. X    scan = reginput;
  374. X    opnd = OPERAND(p);
  375. X    switch (OP(p)) {
  376. X    case ANY:
  377. X    count = strlen(scan);
  378. X    scan += count;
  379. X    break;
  380. X    case EXACTLY:
  381. X    while (*opnd == *scan) {
  382. X        count++;
  383. X        scan++;
  384. X    }
  385. X    break;
  386. X    case ANYOF:
  387. X    while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
  388. X        count++;
  389. X        scan++;
  390. X    }
  391. X    break;
  392. X    case ANYBUT:
  393. X    while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
  394. X        count++;
  395. X        scan++;
  396. X    }
  397. X    break;
  398. X    default:            /* Oh dear.  Called inappropriately. */
  399. X    regerror("internal foulup");
  400. X    count = 0;        /* Best compromise. */
  401. X    break;
  402. X    }
  403. X    reginput = scan;
  404. X
  405. X    return (count);
  406. X}
  407. X
  408. X
  409. X/*
  410. X - regnext - dig the "nxt" pointer out of a node
  411. X */
  412. X#ifdef __STDC__
  413. X
  414. Xstatic char *regnext(register char *p)
  415. X
  416. X#else
  417. X
  418. Xstatic char *regnext(p)
  419. Xregister char  *p;
  420. X
  421. X#endif
  422. X{
  423. X    register int    offset;
  424. X
  425. X    if (p == ®dummy)
  426. X    return (NULL);
  427. X
  428. X    offset = NEXT(p);
  429. X    if (offset == 0)
  430. X    return (NULL);
  431. X
  432. X    if (OP(p) == BACK)
  433. X    return (p - offset);
  434. X    else
  435. X    return (p + offset);
  436. X}
  437. X
  438. X#ifdef DEBUG
  439. X
  440. XSTATIC char    *regprop();
  441. X
  442. X/*
  443. X - regdump - dump a regexp onto stdout in vaguely comprehensible form
  444. X */
  445. X#ifdef __STDC__
  446. X
  447. Xvoid regdump(regexp *r)
  448. X
  449. X#else
  450. X
  451. Xvoid regdump(r)
  452. Xregexp         *r;
  453. X
  454. X#endif
  455. X{
  456. X    register char  *s;
  457. X    register char   op = EXACTLY;    /* Arbitrary non-END op. */
  458. X    register char  *nxt;
  459. X    extern char    *strchr();
  460. X
  461. X
  462. X    s = r->program + 1;
  463. X    while (op != END) {        /* While that wasn't END last time... */
  464. X    op = OP(s);
  465. X    printf("%2d%s", s - r->program, regprop(s));    /* Where, what. */
  466. X    nxt = regnext(s);
  467. X    if (nxt == NULL)    /* nxt ptr. */
  468. X        printf("(0)");
  469. X    else
  470. X        printf("(%d)", (s - r->program) + (nxt - s));
  471. X    s += 3;
  472. X    if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
  473. X        /* Literal string, where present. */
  474. X        while (*s != '\0') {
  475. X        putchar(*s);
  476. X        s++;
  477. X        }
  478. X        s++;
  479. X    }
  480. X    putchar('\n');
  481. X    }
  482. X
  483. X    /* Header fields of interest. */
  484. X    if (r->regstart != '\0')
  485. X    printf("start `%c' ", r->regstart);
  486. X    if (r->reganch)
  487. X    printf("anchored ");
  488. X    if (r->regmust != NULL)
  489. X    printf("must have \"%s\"", r->regmust);
  490. X    printf("\n");
  491. X}
  492. X
  493. X/*
  494. X - regprop - printable representation of opcode
  495. X */
  496. X#ifdef __STDC__
  497. X
  498. Xstatic char *regprop(char *op)
  499. X
  500. X#else
  501. X
  502. Xstatic char *regprop(op)
  503. Xchar           *op;
  504. X
  505. X#endif
  506. X{
  507. X    register char  *p;
  508. X    static char     buf[50];
  509. X
  510. X    strcpy(buf, ":");
  511. X
  512. X    switch (OP(op)) {
  513. X    case BOL:
  514. X    p = "BOL";
  515. X    break;
  516. X    case EOL:
  517. X    p = "EOL";
  518. X    break;
  519. X    case ANY:
  520. X    p = "ANY";
  521. X    break;
  522. X    case ANYOF:
  523. X    p = "ANYOF";
  524. X    break;
  525. X    case ANYBUT:
  526. X    p = "ANYBUT";
  527. X    break;
  528. X    case BRANCH:
  529. X    p = "BRANCH";
  530. X    break;
  531. X    case EXACTLY:
  532. X    p = "EXACTLY";
  533. X    break;
  534. X    case NOTHING:
  535. X    p = "NOTHING";
  536. X    break;
  537. X    case BACK:
  538. X    p = "BACK";
  539. X    break;
  540. X    case END:
  541. X    p = "END";
  542. X    break;
  543. X    case OPEN + 1:
  544. X    case OPEN + 2:
  545. X    case OPEN + 3:
  546. X    case OPEN + 4:
  547. X    case OPEN + 5:
  548. X    case OPEN + 6:
  549. X    case OPEN + 7:
  550. X    case OPEN + 8:
  551. X    case OPEN + 9:
  552. X    sprintf(buf + strlen(buf), "OPEN%d", OP(op) - OPEN);
  553. X    p = NULL;
  554. X    break;
  555. X    case CLOSE + 1:
  556. X    case CLOSE + 2:
  557. X    case CLOSE + 3:
  558. X    case CLOSE + 4:
  559. X    case CLOSE + 5:
  560. X    case CLOSE + 6:
  561. X    case CLOSE + 7:
  562. X    case CLOSE + 8:
  563. X    case CLOSE + 9:
  564. X    sprintf(buf + strlen(buf), "CLOSE%d", OP(op) - CLOSE);
  565. X    p = NULL;
  566. X    break;
  567. X    case STAR:
  568. X    p = "STAR";
  569. X    break;
  570. X    default:
  571. X    regerror("corrupted opcode");
  572. X    break;
  573. X    }
  574. X    if (p != NULL)
  575. X    strcat(buf, p);
  576. X    return (buf);
  577. X}
  578. X#endif
  579. X
  580. X/*
  581. X * The following is provided for those people who do not have strcspn() in
  582. X * their C libraries.  They should get off their butts and do something
  583. X * about it; at least one public-domain implementation of those (highly
  584. X * useful) string routines has been published on Usenet.
  585. X */
  586. X#ifdef STRCSPN
  587. X/*
  588. X * strcspn - find length of initial segment of s1 consisting entirely
  589. X * of characters not from s2
  590. X */
  591. X
  592. X#ifdef __STDC__
  593. X
  594. Xstatic int strcspn(char *s1, char *s2)
  595. X
  596. X#else
  597. X
  598. Xstatic int strcspn(s1, s2)
  599. Xchar           *s1;
  600. Xchar           *s2;
  601. X
  602. X#endif
  603. X{
  604. X    register char  *scan1;
  605. X    register char  *scan2;
  606. X    register int    count;
  607. X
  608. X    count = 0;
  609. X    for (scan1 = s1; *scan1 != '\0'; scan1++) {
  610. X    for (scan2 = s2; *scan2 != '\0';)    /* ++ moved down. */
  611. X        if (*scan1 == *scan2++)
  612. X        return (count);
  613. X    count++;
  614. X    }
  615. X    return (count);
  616. X}
  617. X#endif
  618. X
  619. X
  620. X/*
  621. X - regsub - perform substitutions after a regexp match
  622. X */
  623. X#ifdef __STDC__
  624. X
  625. Xvoid regsub(regexp *prog, char *source, char *dest)
  626. X
  627. X#else
  628. X
  629. Xvoid regsub(prog, source, dest)
  630. Xregexp         *prog;
  631. Xchar           *source;
  632. Xchar           *dest;
  633. X
  634. X#endif
  635. X{
  636. X    register char  *src;
  637. X    register char  *dst;
  638. X    register char   c;
  639. X    register int    no;
  640. X    register int    len;
  641. X    extern char    *strncpy();
  642. X
  643. X    if (prog == NULL || source == NULL || dest == NULL) {
  644. X    regerror("NULL parm to regsub");
  645. X    return;
  646. X    }
  647. X    if (UCHARAT(prog->program) != MAGIC) {
  648. X    regerror("damaged regexp fed to regsub");
  649. X    return;
  650. X    }
  651. X    src = source;
  652. X    dst = dest;
  653. X    while ((c = *src++) != '\0') {
  654. X    if (c == '&')
  655. X        no = 0;
  656. X    else if (c == '\\' && '0' <= *src && *src <= '9')
  657. X        no = *src++ - '0';
  658. X    else
  659. X        no = -1;
  660. X
  661. X    if (no < 0) {        /* Ordinary character. */
  662. X        if (c == '\\' && (*src == '\\' || *src == '&'))
  663. X        c = *src++;
  664. X        *dst++ = c;
  665. X    } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
  666. X        len = prog->endp[no] - prog->startp[no];
  667. X        strncpy(dst, prog->startp[no], len);
  668. X        dst += len;
  669. X        if (len != 0 && *(dst - 1) == '\0') {    /* strncpy hit NUL. */
  670. X        regerror("damaged match string");
  671. X        return;
  672. X        }
  673. X    }
  674. X    }
  675. X    *dst++ = '\0';
  676. X}
  677. X
  678. X
  679. X#ifdef __STDC__
  680. X
  681. Xvoid regerror(char *s)
  682. X
  683. X#else
  684. X
  685. Xvoid regerror(s)
  686. Xchar           *s;
  687. X
  688. X#endif
  689. X{
  690. X#ifdef NN
  691. X    msg("REGEXP ERROR: %s", s);
  692. X#else    
  693. X    fprintf(stderr, "regexp(3): %s", s);
  694. X    exit(1);
  695. X#endif
  696. X}
  697. NO_NEWS_IS_GOOD_NEWS
  698. echo "File regexp.c is complete"
  699. chmod 0644 regexp.c || echo "restore of regexp.c fails"
  700. set `wc -c regexp.c`;Sum=$1
  701. if test "$Sum" != "30816"
  702. then echo original size 30816, current size $Sum;fi
  703. echo "x - extracting regexp.h (Text)"
  704. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > regexp.h &&
  705. X/*
  706. X * Definitions etc. for regexp(3) routines.
  707. X *
  708. X * Caveat:  this is V8 regexp(3) [actually, a reimplementation thereof],
  709. X * not the System V one.
  710. X */
  711. X
  712. X#define NSUBEXP  10
  713. Xtypedef struct regexp {
  714. X    char *startp[NSUBEXP];
  715. X    char *endp[NSUBEXP];
  716. X    char regstart;        /* Internal use only. */
  717. X    char reganch;        /* Internal use only. */
  718. X    char *regmust;        /* Internal use only. */
  719. X    int regmlen;        /* Internal use only. */
  720. X    char program[1];    /* Unwarranted chumminess with compiler. */
  721. X} regexp;
  722. X
  723. X
  724. X/*
  725. X * The first byte of the regexp internal "program" is actually this magic
  726. X * number; the start node begins in the second byte.
  727. X */
  728. X#define    MAGIC    0234
  729. X
  730. Xextern regexp *regcomp();
  731. Xextern int regexec();
  732. Xextern void regsub();
  733. Xextern void regerror();
  734. X
  735. NO_NEWS_IS_GOOD_NEWS
  736. chmod 0644 regexp.h || echo "restore of regexp.h fails"
  737. set `wc -c regexp.h`;Sum=$1
  738. if test "$Sum" != "731"
  739. then echo original size 731, current size $Sum;fi
  740. echo "x - extracting reroute.c (Text)"
  741. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > reroute.c &&
  742. X#include "config.h"
  743. X
  744. X#define TRACE
  745. X
  746. X
  747. X#ifdef HAVE_ROUTING
  748. X
  749. Xreroute(route, address)
  750. Xchar *route, *address;
  751. X{
  752. X    char *name, *atpos;
  753. X    register char *sp;
  754. X    register c;
  755. X    
  756. X    if (atpos = strchr(address, '@')) {
  757. X    name = atpos;
  758. X    
  759. X    while (--name >= address)
  760. X        if (isspace(*name) || *name == '<') { 
  761. X        name++;
  762. X        break;
  763. X        }
  764. X    if (name < address) name++;
  765. X    
  766. X    for (sp = atpos; c = *sp; sp++) 
  767. X        if (isspace(c) || c == '>') break;
  768. X
  769. X    *sp = NUL;
  770. X    strcpy(route, name);
  771. X    *sp = c;
  772. X    } else 
  773. X    strcpy(route, address);
  774. X    return 1;
  775. X}
  776. X
  777. X#else
  778. X
  779. X#ifndef HAVE_GETHOSTNAME
  780. X
  781. X#ifdef HAVE_UNAME
  782. X
  783. X#include <sys/utsname.h>
  784. X
  785. Xgethostname(name, length)
  786. Xchar *name;
  787. Xint length;
  788. X{
  789. X    struct utsname utsname;
  790. X    char *host;
  791. X    
  792. X    uname(&utsname);
  793. X    strncpy(name, utsname.nodename, length);
  794. X}
  795. X
  796. X
  797. X#else
  798. X
  799. X#ifdef HOSTNAME
  800. X
  801. Xgethostname(name, length)
  802. Xchar *name;
  803. Xint length;
  804. X{
  805. X    strncpy(name, HOSTNAME, length);
  806. X}
  807. X
  808. X#else
  809. X
  810. XYOU LOOSE ON GETHOSTNAME
  811. X
  812. X#endif /* HOSTNAME */
  813. X
  814. X#endif /* HAVE_UNAME */
  815. X
  816. X#endif /* HAVE_GETHOSTNAME */
  817. X
  818. X
  819. X#ifdef TRACE
  820. XFILE *route_trace = NULL;
  821. X#endif
  822. Xstatic char cmdc;    /* we need this for trace output */
  823. X
  824. Xreroute(route, address)
  825. Xchar *route, *address;
  826. X{
  827. X    char *name, *site, *domain;
  828. X    char *atpos, *dotpos;
  829. X    register char *sp;
  830. X    register c;
  831. X    int found;
  832. X    
  833. X#ifdef TRACE
  834. X    if (route_trace || 
  835. X    (route_trace = open_file(relative(lib_directory, "trace"),
  836. X                OPEN_APPEND | DONT_CREATE)))
  837. X    fprintf(route_trace, "--orig: '%s'\n", address);
  838. X#endif
  839. X
  840. X    found = 0;
  841. X    
  842. X    /* if a sender (or receiver!) is not provided,
  843. X     * we first try the site from the 'Reply-To:'
  844. X     * and 'From:' lines  who@site.domain */
  845. X    
  846. X    if (atpos = strchr(address, '@')) {
  847. X    *atpos = NUL;
  848. X    name = atpos;
  849. X    
  850. X    while (--name >= address)
  851. X        if (isspace(*name) || *name == '<') { 
  852. X        name++;
  853. X        break;
  854. X        }
  855. X    if (name < address) name++;
  856. X    
  857. X    dotpos = atpos;
  858. X    site   = atpos + 1;
  859. X
  860. X     next_dot:
  861. X    *dotpos = NUL;
  862. X    domain = dotpos + 1;
  863. X    for (sp = domain; c = *sp; sp++) {
  864. X        if (isspace(c) || c == '>') break;
  865. X        if (c == '.') {
  866. X        *dotpos = '.';
  867. X        dotpos = sp;
  868. X        goto next_dot;
  869. X        }
  870. X    }
  871. X    *sp = NUL;
  872. X    if (site == domain)
  873. X        domain = NULL;
  874. X    else
  875. X        *atpos = NUL;    /* overwritten when first . is found */
  876. X
  877. X#ifdef TRACE
  878. X    if (route_trace)
  879. X        fprintf(route_trace,
  880. X            "   @-type: name='%s' site='%s' domain='%s'\n",
  881. X            name, site, domain ? domain : "");
  882. X#endif
  883. X    
  884. X    found = find_route(route, name, site, domain, (char *)NULL);
  885. X    
  886. X    if (dotpos) { *dotpos = '.'; *sp = c; }
  887. X    if (atpos) *atpos = '@';
  888. X
  889. X    goto out;
  890. X    }
  891. X
  892. X    /*
  893. X     * not domain address -- look for bang address
  894. X     */
  895. X
  896. X    if (!(name = strrchr(address, '!'))) {
  897. X    /*
  898. X     * neither domain nor bang -- suppose it is a local address
  899. X     */
  900. X    strcpy(route, address);
  901. X    found = 1;
  902. X    goto out;
  903. X    }
  904. X    
  905. X    *name++ = NUL;
  906. X    if (site = strrchr(address, '!'))
  907. X    *site++ = NUL;
  908. X    else {
  909. X    site = address;
  910. X    address = NULL;
  911. X    }
  912. X    
  913. X#ifdef TRACE
  914. X    if (route_trace)
  915. X    fprintf(route_trace,
  916. X        "   !-type: name='%s' site='%s' bang='%s'\n",
  917. X        name, site, address ? address : "NONE");
  918. X#endif
  919. X    
  920. X    found = find_route(route, name, site, (char *)NULL, address);
  921. X    
  922. X    *--name = '!';
  923. X    if (address) *--site = '!';
  924. X
  925. X out:
  926. X
  927. X#ifdef TRACE
  928. X    if (route_trace) {
  929. X    if (found)
  930. X        fprintf(route_trace, "--route='%s'\n\n", route);
  931. X    else
  932. X        fprintf(route_trace, "--NO ROUTE\n\n");
  933. X    fclose(route_trace);
  934. X    route_trace = NULL;
  935. X    }
  936. X#endif    
  937. X    return found;
  938. X}
  939. X
  940. X
  941. Xstatic char *cstreq(string, match)
  942. Xchar *string, *match;
  943. X{
  944. X    register char *s1, *s2;
  945. X    s1 = string;
  946. X    
  947. Xnext_part:
  948. X    s2 = match;
  949. X    
  950. X    while (isspace(*s1) || *s1 == ',') s1++;
  951. X
  952. X    while (*s2) {
  953. X    if (*s1 == NUL || isspace(*s1)) return NULL;
  954. X    if (*s1 == ',') goto next_part;
  955. X    if (toupper(*s1) != toupper(*s2)) break;
  956. X    s1++, s2++;
  957. X    }
  958. X    
  959. X    if (*s2 == NUL && (*s1 == NUL || isspace(*s1) || *s1 == ',')) {
  960. X    if (*s1 == ',') while (*s1 && !isspace(*s1)) s1++;
  961. X#ifdef TRACE        
  962. X    if (route_trace) 
  963. X        fprintf(route_trace, "/%c %s=%s -> %s", cmdc, string, match, s1);
  964. X#endif        
  965. X    return s1;
  966. X    }
  967. X    
  968. X    while (*s1 && !isspace(*s1)) {
  969. X    if (*s1 == ',') goto next_part;
  970. X    s1++;
  971. X    }
  972. X    
  973. X    return NULL;
  974. X}
  975. X
  976. X
  977. Xstatic char *cstrcpy(s1, s2)
  978. Xregister char *s1, *s2;
  979. X{
  980. X    while (*s2 && isspace(*s2)) s2++;
  981. X    while (*s2 && !isspace(*s2) && *s2 != ',') *s1++ = *s2++;
  982. X    *s1 = NUL;
  983. X    return s1;
  984. X}
  985. X
  986. X/*
  987. X * lookup site,domain in routes database
  988. X * if not found and bang is non-empty, use bang default if it exist
  989. X */
  990. X
  991. Xstatic find_route(route, remote_user, remote_host, remote_domain, bang)
  992. Xchar *route, *remote_user, *remote_host, *remote_domain, *bang;
  993. X{
  994. X    char line[512];        /* line from route file */
  995. X    register char *lp;        /* current line position */
  996. X    char *routep;               /* ptr into route */
  997. X    char *pattern;        /* pattern from line */
  998. X    int  dom_ok;        /* in right domain */
  999. X    int  host_ok;        /* right host */
  1000. X    FILE *rf;            /* route file */
  1001. X    char local_host[100];    /* callers host name */
  1002. X    char local_domain[100];    /* this domain */
  1003. X    
  1004. X    if (bang && *bang == NUL) bang = NULL;
  1005. X    if (remote_host == NULL || *remote_host == NUL) return 0;
  1006. X    
  1007. X    if (remote_domain && *remote_domain == NUL) remote_domain = NULL;
  1008. X    
  1009. X    gethostname(local_host, 100);
  1010. X    if (routep = strchr(local_host, '.')) *routep = NUL;
  1011. X    local_domain[0] = NUL;
  1012. X    
  1013. X    rf = open_file(relative(lib_directory, "routes"), OPEN_READ);
  1014. X    if (rf == NULL) {
  1015. X#ifdef TRACE
  1016. X    if (route_trace) fprintf(route_trace, "---No routes file\n");
  1017. X#endif
  1018. X    return 0;
  1019. X    }
  1020. X    
  1021. X    dom_ok = host_ok = 1;
  1022. X    routep = route;
  1023. X    pattern = NULL;
  1024. X    
  1025. X    while (fgets(line, 512, rf) != NULL) {
  1026. X    lp = line;
  1027. X    while (*lp && isspace(*lp)) lp++;
  1028. X    if (*lp == NUL || *lp == '#') continue;
  1029. X    
  1030. X    if (*lp == '/') {
  1031. X        lp++;
  1032. X        cmdc = *lp++;
  1033. X        while (*lp && isspace(*lp)) lp++;
  1034. X        if (*lp == '#') *lp = NUL;
  1035. X        
  1036. X        if (cmdc == 'L') {        /* local (default) domain name(s) */
  1037. X        cstrcpy(local_domain, lp);
  1038. X
  1039. X        if (remote_domain == NULL ||
  1040. X            cstreq(lp, remote_domain) != NULL) {
  1041. X            dom_ok = 1;
  1042. X            if (strcmp(local_host, remote_host) == 0) {
  1043. X            pattern = "%p%n";
  1044. X            break;
  1045. X            }
  1046. X        }
  1047. X        continue;
  1048. X        }
  1049. X        
  1050. X        if (cmdc == 'D') {        /* destination domain */
  1051. X        if (*lp == NUL)
  1052. X            dom_ok = 1;
  1053. X        else
  1054. X            dom_ok = (cstreq(lp, remote_domain) != NULL);
  1055. X        continue;
  1056. X        }
  1057. X
  1058. X        if (!dom_ok) continue;
  1059. X           
  1060. X        if (cmdc == 'H') {        /* local host */
  1061. X        if (*lp == NUL)
  1062. X            host_ok = 1;
  1063. X        else
  1064. X            host_ok = (cstreq(lp, local_host) != NULL);
  1065. X        continue;
  1066. X        }
  1067. X        
  1068. X        if (!host_ok) continue;
  1069. X
  1070. X        switch (cmdc) {
  1071. X
  1072. X         case 'N':    /* neighbouring (uucp) sites */
  1073. X        if (cstreq(lp, remote_host) == NULL) continue;
  1074. X        pattern = "%s!%n";
  1075. X        break;
  1076. X        
  1077. X         case 'P':
  1078. X        if (*lp == '+')
  1079. X            routep = cstrcpy(routep, ++lp);
  1080. X        else
  1081. X            routep = cstrcpy(route, lp);
  1082. X        continue;
  1083. X
  1084. X         case 'G':
  1085. X        pattern = lp;
  1086. X        break;
  1087. X
  1088. X         case 'B':
  1089. X        if (!bang) continue;
  1090. X        pattern = lp;
  1091. X        break;
  1092. X
  1093. X         default:
  1094. X        continue;
  1095. X        }
  1096. X
  1097. X        break;
  1098. X    }
  1099. X    
  1100. X    if (!dom_ok) continue;
  1101. X    if (!host_ok) continue;
  1102. X
  1103. X    if ((pattern = cstreq(lp, remote_host))!=NULL) break;
  1104. X    }
  1105. X    
  1106. X    fclose(rf);
  1107. X    
  1108. X    if (pattern == NULL) return 0;
  1109. X  
  1110. X#ifdef TRACE  
  1111. X    if (route_trace) fprintf(route_trace, "   pattern='%s'\n", pattern);
  1112. X#endif
  1113. X    
  1114. X    for (; *pattern != NL && *pattern != NUL; pattern++) {
  1115. X    if (*pattern == SP || *pattern == TAB) continue;
  1116. X    if (*pattern == '%') {
  1117. X        pattern++;
  1118. X        switch(*pattern) {
  1119. X         case 'n':
  1120. X        routep = cstrcpy(routep, remote_user);
  1121. X        continue;
  1122. X         case 's':
  1123. X        routep = cstrcpy(routep, remote_host);
  1124. X        continue;
  1125. X         case 'd':
  1126. X        routep = cstrcpy(routep, 
  1127. X                 remote_domain ? remote_domain : local_domain);
  1128. X        continue;
  1129. X         case 'b':
  1130. X        routep = cstrcpy(routep, bang);
  1131. X        continue;
  1132. X         case 'p':
  1133. X        routep = route;
  1134. X        continue;
  1135. X         case '%':
  1136. X        break;
  1137. X         default:
  1138. X        continue;
  1139. X        }
  1140. X    }
  1141. X    *routep++ = *pattern;
  1142. X    }
  1143. X    *routep = NUL;
  1144. X    
  1145. X    return 1;
  1146. X}
  1147. X
  1148. X#endif
  1149. NO_NEWS_IS_GOOD_NEWS
  1150. chmod 0644 reroute.c || echo "restore of reroute.c fails"
  1151. set `wc -c reroute.c`;Sum=$1
  1152. if test "$Sum" != "7861"
  1153. then echo original size 7861, current size $Sum;fi
  1154. echo "x - extracting routes.sample (Text)"
  1155. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > routes.sample &&
  1156. X# This file is read from the beginning until a match for a specific
  1157. X# domain/site pair is found.  Initially all lines applies to all
  1158. X# domains and hosts.  (NOTICE: we use domain == top-level domain)
  1159. X#
  1160. X# In the following list of requests, <host name> is the name of the
  1161. X# LOCAL host, <domain> and <site> is the receivers domain and site.
  1162. X#
  1163. X#    /L <domain>    local domain name(s), implies /D <domain> command
  1164. X#    /H <local host>    following lines only applies to specified local host
  1165. X#    /H        following lines applies to all hosts
  1166. X#    /N <site>    site is neighbour to local host (+prefix)
  1167. X#    /D <domain>    following lines applies to specified domain only
  1168. X#    /D        following lines applies to all domains
  1169. X#    /P <prefix>    <prefix> is prefixed to the generated address
  1170. X#    /B <pattern>    address to use for multi-hop bang addresses
  1171. X#    /G <pattern>    default address pattern
  1172. X#    <site> <pattern> address patterns used to reach given site
  1173. X#
  1174. X# The <domain>, <host>, and <site> specifications can be a comma-separated
  1175. X# list of domain, host, or site names (without spaces).
  1176. X#
  1177. X# Address patterns are copied directly to the generated address, except
  1178. X# that the following sequences are substituted:
  1179. X#    %n    name of receiver
  1180. X#    %s    receiver's site (with top-level domain stripped off)
  1181. X#    %d    receiver's top-level domain
  1182. X#    %b    first N-1 sites from N multi-hop bang address
  1183. X#    %p    drop <preix> if one is specified
  1184. X#    %%    a % character
  1185. X#
  1186. X# Default rules:
  1187. X#    %n@local-host.local-domain -> %p%n
  1188. X#    %n@neighbour-host.remote-domain -> %s.%d!%n
  1189. X#
  1190. X# Example configuration (AmbraSoft A/S, September 1987):
  1191. X#
  1192. X# Backbone:              dkuug.dk
  1193. X#                |
  1194. X# In-house:    olamb.dk---- ambush.dk ------ ambra.dk
  1195. X#              /    |   \
  1196. X# Direct:          oldk1.dk oldk2.dk  olgb1.uucp(=olgb1.oliv.co.uk)
  1197. X#
  1198. X# This file can be used unchanged on all in-house systems.
  1199. X
  1200. X/L dk,uucp
  1201. X
  1202. X/H ambra,olamb
  1203. X/N ambush
  1204. X/P         ambush!
  1205. X
  1206. X/H
  1207. X/N dkuug
  1208. X/N ambra,olamb
  1209. X/N oldk1,oldk2
  1210. X
  1211. X/L uucp
  1212. X/N olgb1
  1213. X
  1214. X/D uk
  1215. Xolgb1.oliv.co    olgb1!%n
  1216. X
  1217. X/D
  1218. X
  1219. X/P+        dkuug!
  1220. X
  1221. X/B        %b!%s!%n
  1222. X/G        %s.%d!%n
  1223. NO_NEWS_IS_GOOD_NEWS
  1224. chmod 0644 routes.sample || echo "restore of routes.sample fails"
  1225. set `wc -c routes.sample`;Sum=$1
  1226. if test "$Sum" != "1952"
  1227. then echo original size 1952, current size $Sum;fi
  1228. echo "x - extracting s-bsd4-2.h (Text)"
  1229. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-bsd4-2.h &&
  1230. X/*
  1231. X *    This version is for BSD 4.2 systems
  1232. X */
  1233. X
  1234. X
  1235. X/*
  1236. X *    Include haeder files containing the following definitions:
  1237. X *
  1238. X *         off_t, time_t, struct stat
  1239. X */
  1240. X
  1241. X#include <sys/types.h>
  1242. X#include <sys/stat.h>
  1243. X
  1244. X
  1245. X/*
  1246. X *    Define if your system has system V like ioctls
  1247. X */
  1248. X
  1249. X#undef    HAVE_TERMIO            /* */
  1250. X
  1251. X/*
  1252. X *    Define to use terminfo database.
  1253. X *    Otherwise, termcap is used
  1254. X */
  1255. X
  1256. X#undef    USE_TERMINFO            /* */
  1257. X
  1258. X/*
  1259. X *    Specify the library (or libraries) containing the termcap/terminfo
  1260. X *    routines.
  1261. X *
  1262. X *    Notice:  nn only uses the low-level terminal access routines
  1263. X *    (i.e. it does not use curses).
  1264. X */
  1265. X
  1266. X#define TERMLIB    -ltermlib
  1267. X
  1268. X/*
  1269. X *    Define HAVE_STRCHR if strchr() and strrchr() are available
  1270. X */
  1271. X
  1272. X#include <string.h>
  1273. X
  1274. X#undef HAVE_STRCHR            /* */
  1275. X
  1276. X/*
  1277. X *    Define if a signal handler has type void (see signal.h)
  1278. X */
  1279. X
  1280. X#undef    SIGNAL_HANDLERS_ARE_VOID    /* */
  1281. X
  1282. X/*
  1283. X *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  1284. X */
  1285. X
  1286. X#define MICRO_ALARM()    alarm(1)    /* could use setitimer ... */
  1287. X
  1288. X/*
  1289. X *    Define if your system has BSD like job control (SIGTSTP works)
  1290. X */
  1291. X
  1292. X#define HAVE_JOBCONTROL            /* */
  1293. X
  1294. X/*
  1295. X *    Define if your system provides the "directory(3X)" access routines
  1296. X *
  1297. X *    If true, include the header file(s) required by the package below
  1298. X *    (remember that <sys/types.h> or equivalent is included above)
  1299. X *    Also typedef Direntry to the proper struct type.
  1300. X */
  1301. X
  1302. X#define    HAVE_DIRECTORY            /* */
  1303. X
  1304. X#include <sys/dir.h>            /* BSD */
  1305. X
  1306. Xtypedef struct direct Direntry;        /* BSD */
  1307. X
  1308. X/*
  1309. X *    Define if your system has a mkdir() library routine
  1310. X */
  1311. X
  1312. X#define    HAVE_MKDIR            /* */
  1313. X
  1314. X/*
  1315. X *    Define if your system provides a BSD like gethostname routine.
  1316. X *    Otherwise, define HAVE_UNAME if uname() is avaiable.
  1317. X */
  1318. X
  1319. X#define    HAVE_GETHOSTNAME    /* BSD systems */
  1320. X
  1321. X/*
  1322. X *    Define DETATCH_TERMINAL to be a command sequence which 
  1323. X *    will detatch a process from the control terminal
  1324. X *    Also include system files needed to perform this HERE.
  1325. X *    If not possible, just define it (empty)
  1326. X */
  1327. X
  1328. X#include <sys/file.h>    /* for O_RDONLY */
  1329. X#include <sys/ioctl.h>    /* for TIOCNOTTY */
  1330. X
  1331. X#define    DETATCH_TERMINAL \
  1332. X    { int t = open("/dev/tty", O_RDONLY); \
  1333. X      if (t >= 0) ioctl(t, TIOCNOTTY, (int *)0), close(t); }
  1334. X
  1335. X      
  1336. X/* 
  1337. X *    Specify where the Bourne Shell is.
  1338. X */
  1339. X
  1340. X#define SHELL        "/bin/sh"
  1341. X
  1342. X/*
  1343. X *    Specify the default mailer to be invoked by nnmail
  1344. X */
  1345. X
  1346. X#define    MAILX    "/usr/ucb/Mail"        /* BSD */
  1347. X
  1348. X
  1349. X/*
  1350. X *    Specify the default pager & options.
  1351. X */
  1352. X
  1353. X#define    PAGER        "more"
  1354. X
  1355. X/*
  1356. X *    Specify the default print command and options.
  1357. X */
  1358. X
  1359. X#define    PRINTER        "lpr -p -JNN-print"
  1360. X
  1361. X
  1362. X/*
  1363. X *    Define the maximum length of any pathname that may occur
  1364. X */
  1365. X
  1366. X#define    FILENAME     256
  1367. NO_NEWS_IS_GOOD_NEWS
  1368. chmod 0644 s-bsd4-2.h || echo "restore of s-bsd4-2.h fails"
  1369. set `wc -c s-bsd4-2.h`;Sum=$1
  1370. if test "$Sum" != "2590"
  1371. then echo original size 2590, current size $Sum;fi
  1372. echo "x - extracting s-bsd4-3.h (Text)"
  1373. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-bsd4-3.h &&
  1374. X/*
  1375. X *    This version is for 4.3 systems
  1376. X */
  1377. X
  1378. X
  1379. X/*
  1380. X *    Include haeder files containing the following definitions:
  1381. X *
  1382. X *         off_t, time_t, struct stat
  1383. X */
  1384. X
  1385. X#include <sys/types.h>
  1386. X#include <sys/stat.h>
  1387. X
  1388. X
  1389. X/*
  1390. X *    Define if your system has system V like ioctls
  1391. X */
  1392. X
  1393. X#undef    HAVE_TERMIO            /* */
  1394. X
  1395. X/*
  1396. X *    Define to use terminfo database.
  1397. X *    Otherwise, termcap is used
  1398. X */
  1399. X
  1400. X#undef    USE_TERMINFO            /* */
  1401. X
  1402. X/*
  1403. X *    Specify the library (or libraries) containing the termcap/terminfo
  1404. X *    routines.
  1405. X *
  1406. X *    Notice:  nn only uses the low-level terminal access routines
  1407. X *    (i.e. it does not use curses).
  1408. X */
  1409. X
  1410. X#define TERMLIB    -ltermlib
  1411. X
  1412. X/*
  1413. X *    Define HAVE_STRCHR if strchr() and strrchr() are available
  1414. X */
  1415. X
  1416. X#include <string.h>
  1417. X
  1418. X#undef HAVE_STRCHR            /* */
  1419. X
  1420. X/*
  1421. X *    Define if a signal handler has type void (see signal.h)
  1422. X */
  1423. X
  1424. X#undef    SIGNAL_HANDLERS_ARE_VOID    /* */
  1425. X
  1426. X/*
  1427. X *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  1428. X */
  1429. X
  1430. X#define MICRO_ALARM()    ualarm(100000,0)    /* BSD 4.3 */
  1431. X
  1432. X/*
  1433. X *    Define if your system has BSD like job control (SIGTSTP works)
  1434. X */
  1435. X
  1436. X#define HAVE_JOBCONTROL            /* */
  1437. X
  1438. X/*
  1439. X *    Define if your system has a 4.3BSD like syslog library.
  1440. X */
  1441. X
  1442. X#define HAVE_SYSLOG
  1443. X
  1444. X/*
  1445. X *    Define if your system provides the "directory(3X)" access routines
  1446. X *
  1447. X *    If true, include the header file(s) required by the package below
  1448. X *    (remember that <sys/types.h> or equivalent is included above)
  1449. X *    Also typedef Direntry to the proper struct type.
  1450. X */
  1451. X
  1452. X#define    HAVE_DIRECTORY            /* */
  1453. X
  1454. X#include <sys/dir.h>            /* BSD */
  1455. X
  1456. Xtypedef struct direct Direntry;        /* BSD */
  1457. X
  1458. X/*
  1459. X *    Define if your system has a mkdir() library routine
  1460. X */
  1461. X
  1462. X#define    HAVE_MKDIR            /* */
  1463. X
  1464. X/*
  1465. X *    Define if your system provides a BSD like gethostname routine.
  1466. X *    Otherwise, define HAVE_UNAME if uname() is avaiable.
  1467. X */
  1468. X
  1469. X#define    HAVE_GETHOSTNAME    /* BSD systems */
  1470. X
  1471. X/*
  1472. X *    Define DETATCH_TERMINAL to be a command sequence which 
  1473. X *    will detatch a process from the control terminal
  1474. X *    Also include system files needed to perform this HERE.
  1475. X *    If not possible, just define it (empty)
  1476. X */
  1477. X
  1478. X#include <sys/file.h>    /* for O_RDONLY */
  1479. X#include <sys/ioctl.h>    /* for TIOCNOTTY */
  1480. X
  1481. X#define    DETATCH_TERMINAL \
  1482. X    { int t = open("/dev/tty", O_RDONLY); \
  1483. X      if (t >= 0) ioctl(t, TIOCNOTTY, (int *)0), close(t); }
  1484. X
  1485. X      
  1486. X/* 
  1487. X *    Specify where the Bourne Shell is.
  1488. X */
  1489. X
  1490. X#define SHELL        "/bin/sh"
  1491. X
  1492. X/*
  1493. X *    Specify the default mailer to be invoked by nnmail
  1494. X */
  1495. X
  1496. X#define    MAILX    "/usr/ucb/Mail"        /* BSD */
  1497. X
  1498. X
  1499. X/*
  1500. X *    Specify the default pager & options.
  1501. X */
  1502. X
  1503. X#define    PAGER        "more"
  1504. X
  1505. X/*
  1506. X *    Specify the default print command and options.
  1507. X */
  1508. X
  1509. X#define    PRINTER        "lpr -p -JNN-print"
  1510. X
  1511. X
  1512. X/*
  1513. X *    Define the maximum length of any pathname that may occur
  1514. X */
  1515. X
  1516. X#define    FILENAME     256
  1517. NO_NEWS_IS_GOOD_NEWS
  1518. chmod 0644 s-bsd4-3.h || echo "restore of s-bsd4-3.h fails"
  1519. set `wc -c s-bsd4-3.h`;Sum=$1
  1520. if test "$Sum" != "2666"
  1521. then echo original size 2666, current size $Sum;fi
  1522. echo "x - extracting s-hpux.h (Text)"
  1523. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-hpux.h &&
  1524. X/*
  1525. X *    This version is for Hewlett-Packard HP-UX
  1526. X */
  1527. X
  1528. X
  1529. X/*
  1530. X *    Include header files containing the following definitions:
  1531. X *
  1532. X *         off_t, time_t, struct stat
  1533. X */
  1534. X
  1535. X#include <sys/types.h>
  1536. X#include <sys/stat.h>
  1537. X
  1538. X/*
  1539. X *    Define if your system has system V like ioctls
  1540. X */
  1541. X
  1542. X#define    HAVE_TERMIO            /* */
  1543. X
  1544. X/*
  1545. X *    Define to use terminfo database.
  1546. X *    Otherwise, termcap is used
  1547. X */
  1548. X
  1549. X#define    USE_TERMINFO            /* */
  1550. X
  1551. X/*
  1552. X *    Specify the library containing the termcap/terminfo access routines.
  1553. X *    Notice:  nn does not use curses.
  1554. X *    Notice:  You must also specify whether termcap or terminfo is
  1555. X *         used when you edit config.h (see below).
  1556. X */
  1557. X
  1558. X#define    TERMLIB -lcurses
  1559. X
  1560. X/*
  1561. X *    Define HAVE_STRCHR if strchr() and strrchr() are available
  1562. X */
  1563. X
  1564. X#define HAVE_STRCHR            /* */
  1565. X
  1566. X/*
  1567. X *    Define if a signal handler has type void (see signal.h)
  1568. X */
  1569. X
  1570. X/* #define    SIGNAL_HANDLERS_ARE_VOID    /* */
  1571. X
  1572. X/*
  1573. X *    Define if signals must be set again after they are caught
  1574. X */
  1575. X
  1576. X#define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  1577. X
  1578. X/*
  1579. X *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  1580. X */
  1581. X
  1582. X#define MICRO_ALARM()    alarm(1)    /* System V */
  1583. X
  1584. X/*
  1585. X *    Define if your system has BSD like job control (SIGTSTP works)
  1586. X */
  1587. X
  1588. X/* #define HAVE_JOBCONTROL            /* */
  1589. X
  1590. X/*
  1591. X *    Define if your system provides the "directory(3X)" access routines
  1592. X *
  1593. X *    If true, include the header file(s) required by the package below
  1594. X *    (remember that <sys/types.h> or equivalent is included above)
  1595. X *    Also typedef Direntry to the proper struct type.
  1596. X */
  1597. X
  1598. X#define    HAVE_DIRECTORY            /* */
  1599. X
  1600. X#include <ndir.h>            /* HP-UX */
  1601. X
  1602. Xtypedef struct direct Direntry;        /* HP-UX */
  1603. X
  1604. X/*
  1605. X *    Define if your system has a mkdir() library routine
  1606. X */
  1607. X
  1608. X#define    HAVE_MKDIR            /* */
  1609. X
  1610. X/*
  1611. X *    Define HAVE_GETHOSTNAME if your system provides a BSD like 
  1612. X *    gethostname routine.
  1613. X *    Otherwise, define HAVE_UNAME if uname() is avaiable.
  1614. X *    As a final resort, define HOSTNAME to the name of your system.
  1615. X */
  1616. X
  1617. X#define    HAVE_UNAME            /* System V */
  1618. X
  1619. X/*
  1620. X *    Define DETATCH_TERMINAL to be a command sequence which 
  1621. X *    will detatch a process from the control terminal
  1622. X *    Also include files needed to perform this HERE.
  1623. X *    If not possible, just define it (empty)
  1624. X */
  1625. X
  1626. X#define    DETATCH_TERMINAL setpgrp();    /* System V */
  1627. X
  1628. X/* 
  1629. X *    Specify where the Bourne Shell is.
  1630. X */
  1631. X
  1632. X#define SHELL        "/bin/sh"
  1633. X
  1634. X/*
  1635. X *    Specify the default mailer to be invoked by nnmail
  1636. X */
  1637. X
  1638. X#define    MAILX        "/usr/bin/mailx"    /* SV */
  1639. X
  1640. X/*
  1641. X *    Specify the default pager & options.
  1642. X */
  1643. X
  1644. X#define    PAGER        "less"
  1645. X
  1646. X/*
  1647. X *    Specify the default print command and options.
  1648. X */
  1649. X
  1650. X#define    PRINTER        "lp -s"
  1651. X
  1652. X
  1653. X/*
  1654. X *    Define the maximum length of any pathname that may occur
  1655. X */
  1656. X
  1657. X#define    FILENAME     128
  1658. NO_NEWS_IS_GOOD_NEWS
  1659. chmod 0644 s-hpux.h || echo "restore of s-hpux.h fails"
  1660. set `wc -c s-hpux.h`;Sum=$1
  1661. if test "$Sum" != "2603"
  1662. then echo original size 2603, current size $Sum;fi
  1663. echo "x - extracting s-hpux2-1.h (Text)"
  1664. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-hpux2-1.h &&
  1665. X/*
  1666. X *    This version is for HP-UX 2.1 (on HP9000 Series 800)
  1667. X */
  1668. X/*
  1669. X *    Include header files containing the following definitions:
  1670. X *
  1671. X *         off_t, time_t, struct stat
  1672. X */
  1673. X#include <sys/types.h>
  1674. X#include <sys/stat.h>
  1675. X/*
  1676. X *    Define if your system has system V like ioctls
  1677. X */
  1678. X#define    HAVE_TERMIO            /* */
  1679. X/*
  1680. X *    Define to use terminfo database.
  1681. X *    Otherwise, termcap is used
  1682. X */
  1683. X#define    USE_TERMINFO            /* */
  1684. X/*
  1685. X *    Specify the library (or libraries) containing the termcap/terminfo
  1686. X *    routines.
  1687. X *
  1688. X *    Notice:  nn only uses the low-level terminal access routines
  1689. X *    (i.e. it does not use curses).
  1690. X */
  1691. X#define TERMLIB    -lcurses
  1692. X/*
  1693. X *    Define HAVE_STRCHR if strchr() and strrchr() are available
  1694. X */
  1695. X#define HAVE_STRCHR            /* */
  1696. X/*
  1697. X *    Define if a signal handler has type void (see signal.h)
  1698. X */
  1699. X#undef    SIGNAL_HANDLERS_ARE_VOID    /* */
  1700. X/*
  1701. X *    Define if signals must be set again after they are caught
  1702. X */
  1703. X#define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  1704. X/*
  1705. X *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  1706. X */
  1707. X#define MICRO_ALARM()    not_needed(0.1)  /* only used #ifndef HAVE_TERMIO */
  1708. X/*
  1709. X *    Define if your system has BSD like job control (SIGTSTP works)
  1710. X */
  1711. X#define HAVE_JOBCONTROL            /* */
  1712. X/*
  1713. X *    Define if your system has a 4.3BSD like syslog library.
  1714. X */
  1715. X#define HAVE_SYSLOG
  1716. X/*
  1717. X *    Define if your system provides the "directory(3X)" access routines
  1718. X *
  1719. X *    If true, include the header file(s) required by the package below
  1720. X *    (remember that <sys/types.h> or equivalent is included above)
  1721. X *    Also typedef Direntry to the proper struct type.
  1722. X */
  1723. X#define    HAVE_DIRECTORY            /* */
  1724. X#include <ndir.h>
  1725. Xtypedef struct direct Direntry;
  1726. X/*
  1727. X *    Define if your system has a mkdir() library routine
  1728. X */
  1729. X#define    HAVE_MKDIR            /* */
  1730. X/*
  1731. X *    Define HAVE_GETHOSTNAME if your system provides a BSD like
  1732. X *    gethostname routine.
  1733. X *    Otherwise, define HAVE_UNAME if uname() is avaiable.
  1734. X *    As a final resort, define HOSTNAME to the name of your system
  1735. X *    (in config.h).
  1736. X */
  1737. X#define    HAVE_GETHOSTNAME
  1738. X/*
  1739. X *    Define DETATCH_TERMINAL to be a command sequence which
  1740. X *    will detatch a process from the control terminal
  1741. X *    Also include system files needed to perform this HERE.
  1742. X *    If not possible, just define it (empty)
  1743. X */
  1744. X/* #include "...." */
  1745. X#define    DETATCH_TERMINAL /* setpgrp(); */
  1746. X/*
  1747. X *    Specify where the Bourne Shell is.
  1748. X */
  1749. X#define SHELL        "/bin/sh"
  1750. X/*
  1751. X *    Specify the default mailer to be invoked by nnmail
  1752. X */
  1753. X#define    MAILX        "/usr/bin/mailx"    /* SV */
  1754. X/*
  1755. X *    Specify the default pager & options.
  1756. X */
  1757. X#define    PAGER        "/usr/local/bin/less"
  1758. X/*
  1759. X *    Specify the default print command and options.
  1760. X */
  1761. X#define    PRINTER        "/usr/bin/lp -s"
  1762. X/*
  1763. X *    Define the maximum length of any pathname that may occur
  1764. X */
  1765. X#define    FILENAME     1024
  1766. X/*
  1767. X *    Define standard compiler flags here:
  1768. X */
  1769. X#define COMPILER_FLAGS -O -z
  1770. NO_NEWS_IS_GOOD_NEWS
  1771. chmod 0644 s-hpux2-1.h || echo "restore of s-hpux2-1.h fails"
  1772. set `wc -c s-hpux2-1.h`;Sum=$1
  1773. if test "$Sum" != "3089"
  1774. then echo original size 3089, current size $Sum;fi
  1775. echo "x - extracting s-sunos3.h (Text)"
  1776. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-sunos3.h &&
  1777. X/*
  1778. X *    This version is for SunOS 3.x systems (tested on 3.5)
  1779. X */
  1780. X
  1781. X
  1782. X/*
  1783. X *    Include header files containing the following definitions:
  1784. X *
  1785. X *         off_t, time_t, struct stat
  1786. X */
  1787. X
  1788. X#include <sys/types.h>
  1789. X#include <sys/stat.h>
  1790. X
  1791. X
  1792. X/*
  1793. X *    Define if your system has system V like ioctls
  1794. X */
  1795. X
  1796. X#undef    HAVE_TERMIO            /* */
  1797. X
  1798. X/*
  1799. X *    Define to use terminfo database.
  1800. X *    Otherwise, termcap is used
  1801. X */
  1802. X
  1803. X#undef    USE_TERMINFO            /* */
  1804. X
  1805. X/*
  1806. X *    Specify the library (or libraries) containing the termcap/terminfo
  1807. X *    routines.
  1808. X *
  1809. X *    Notice:  nn only uses the low-level terminal access routines
  1810. X *    (i.e. it does not use curses).
  1811. X */
  1812. X
  1813. X#define TERMLIB    -ltermlib
  1814. X
  1815. X/*
  1816. X *    Define HAVE_STRCHR if strchr() and strrchr() are available
  1817. X */
  1818. X
  1819. X#include <strings.h>
  1820. X
  1821. X#define HAVE_STRCHR            /* */
  1822. X
  1823. X/*
  1824. X *    Define if a signal handler has type void (see signal.h)
  1825. X */
  1826. X
  1827. X#undef    SIGNAL_HANDLERS_ARE_VOID    /* */
  1828. X
  1829. X/*
  1830. X *    Define MICRO_ALARM to timeout after 0.1 seconds if possible
  1831. X */
  1832. X
  1833. X#define MICRO_ALARM()    ualarm(100000,0)    /* BSD 4.3 */
  1834. X
  1835. X/*
  1836. X *    Define if your system has BSD like job control (SIGTSTP works)
  1837. X */
  1838. X
  1839. X#define HAVE_JOBCONTROL            /* */
  1840. X
  1841. X
  1842. X/*
  1843. X *    Define if your system has a 4.3BSD like syslog library.
  1844. X */
  1845. X
  1846. X#undef HAVE_SYSLOG
  1847. X
  1848. X/*
  1849. X *    Define if your system provides the "directory(3X)" access routines
  1850. X *
  1851. X *    If true, include the header file(s) required by the package below
  1852. X *    (remember that <sys/types.h> or equivalent is included above)
  1853. X *    Also typedef Direntry to the proper struct type.
  1854. X */
  1855. X
  1856. X#define    HAVE_DIRECTORY            /* */
  1857. X
  1858. X#include <sys/dir.h>            /* BSD */
  1859. X
  1860. Xtypedef struct direct Direntry;        /* BSD */
  1861. X
  1862. X/*
  1863. X *    Define if your system has a mkdir() library routine
  1864. X */
  1865. X
  1866. X#define    HAVE_MKDIR            /* */
  1867. X
  1868. X/*
  1869. X *    Define if your system provides a BSD like gethostname routine.
  1870. X *    Otherwise, define HAVE_UNAME if uname() is avaiable.
  1871. X */
  1872. X
  1873. X#define    HAVE_GETHOSTNAME    /* BSD systems */
  1874. X
  1875. X/*
  1876. X *    Define DETATCH_TERMINAL to be a command sequence which 
  1877. X *    will detatch a process from the control terminal
  1878. X *    Also include system files needed to perform this HERE.
  1879. X *    If not possible, just define it (empty)
  1880. X */
  1881. X
  1882. X#include <sys/file.h>    /* for O_RDONLY */
  1883. X#include <sys/ioctl.h>    /* for TIOCNOTTY */
  1884. X
  1885. X#define    DETATCH_TERMINAL \
  1886. X    { int t = open("/dev/tty", O_RDONLY); \
  1887. X      if (t >= 0) ioctl(t, TIOCNOTTY, (int *)0), close(t); }
  1888. X
  1889. X      
  1890. X/* 
  1891. X *    Specify where the Bourne Shell is.
  1892. X */
  1893. X
  1894. X#define SHELL        "/bin/sh"
  1895. X
  1896. X/*
  1897. X *    Specify the default mailer to be invoked by nnmail
  1898. X */
  1899. X
  1900. X#define    MAILX    "/usr/ucb/Mail"        /* BSD */
  1901. X
  1902. X
  1903. X/*
  1904. X *    Specify the default pager & options.
  1905. X */
  1906. X
  1907. X#define    PAGER    "more"
  1908. X
  1909. X/*
  1910. X *    Specify the default print command and options.
  1911. X */
  1912. X
  1913. X#define    PRINTER        "lpr -s"
  1914. X
  1915. X/*
  1916. X *    Define the maximum length of any pathname that may occur
  1917. X */
  1918. X
  1919. X#define    FILENAME     256
  1920. NO_NEWS_IS_GOOD_NEWS
  1921. chmod 0644 s-sunos3.h || echo "restore of s-sunos3.h fails"
  1922. set `wc -c s-sunos3.h`;Sum=$1
  1923. if test "$Sum" != "2680"
  1924. then echo original size 2680, current size $Sum;fi
  1925. echo "x - extracting s-sunos4-0.h (Text)"
  1926. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-sunos4-0.h &&
  1927. X/*
  1928. X *    This version is for BSD 4.2 and 4.3 systems
  1929. X */
  1930. X
  1931. X
  1932. X/*
  1933. X *    Include haeder files containing the following definitions:
  1934. X *
  1935. X *         off_t, time_t, struct stat
  1936. X */
  1937. X
  1938. X#include <sys/types.h>
  1939. X#include <sys/stat.h>
  1940. X
  1941. X
  1942. X/*
  1943. X *    Define if your system has system V like ioctls
  1944. X */
  1945. X
  1946. X#undef    HAVE_TERMIO            /* */
  1947. X
  1948. X/*
  1949. X *    Define to use terminfo database.
  1950. X *    Otherwise, termcap is used
  1951. X */
  1952. X
  1953. X#undef    USE_TERMINFO            /* */
  1954. X
  1955. X/*
  1956. X *    Specify the library (or libraries) containing the termcap/terminfo
  1957. X *    routines.
  1958. X *
  1959. X *    Notice:  nn only uses the low-level terminal access routines
  1960. X *    (i.e. it does not use curses).
  1961. X */
  1962. X
  1963. X#define TERMLIB    -ltermlib
  1964. X
  1965. X/*
  1966. X *    Define HAVE_STRCHR if strchr() and strrchr() are available
  1967. X */
  1968. X
  1969. X#include <strings.h>
  1970. X
  1971. X#define HAVE_STRCHR            /* */
  1972. X
  1973. X/*
  1974. X *    Define if a signal handler has type void (see signal.h)
  1975. X */
  1976. X
  1977. X#define    SIGNAL_HANDLERS_ARE_VOID    /* */
  1978. X
  1979. X/*
  1980. X *    Define MICRO_ALARM to timeout after 0.1 seconds if possible
  1981. X */
  1982. X
  1983. X#define MICRO_ALARM()    ualarm(100000,0)    /* BSD 4.3 */
  1984. X
  1985. X/*
  1986. X *    Define if your system has BSD like job control (SIGTSTP works)
  1987. X */
  1988. X
  1989. X#define HAVE_JOBCONTROL            /* */
  1990. X
  1991. X
  1992. X/*
  1993. X *    Define if your system has a 4.3BSD like syslog library.
  1994. X */
  1995. X
  1996. X#define HAVE_SYSLOG
  1997. X
  1998. X/*
  1999. X *    Define if your system provides the "directory(3X)" access routines
  2000. X *
  2001. X *    If true, include the header file(s) required by the package below
  2002. X *    (remember that <sys/types.h> or equivalent is included above)
  2003. X *    Also typedef Direntry to the proper struct type.
  2004. X */
  2005. X
  2006. X#define    HAVE_DIRECTORY            /* */
  2007. X
  2008. X#include <sys/dir.h>            /* BSD */
  2009. X
  2010. Xtypedef struct direct Direntry;        /* BSD */
  2011. X
  2012. X/*
  2013. X *    Define if your system has a mkdir() library routine
  2014. X */
  2015. X
  2016. X#define    HAVE_MKDIR            /* */
  2017. X
  2018. X/*
  2019. X *    Define if your system provides a BSD like gethostname routine.
  2020. X *    Otherwise, define HAVE_UNAME if uname() is avaiable.
  2021. X */
  2022. X
  2023. X#define    HAVE_GETHOSTNAME    /* BSD systems */
  2024. X
  2025. X/*
  2026. X *    Define DETATCH_TERMINAL to be a command sequence which 
  2027. X *    will detatch a process from the control terminal
  2028. X *    Also include system files needed to perform this HERE.
  2029. X *    If not possible, just define it (empty)
  2030. X */
  2031. X
  2032. X#include <sys/file.h>    /* for O_RDONLY */
  2033. X#include <sys/ioctl.h>    /* for TIOCNOTTY */
  2034. X
  2035. X#define    DETATCH_TERMINAL \
  2036. X    { int t = open("/dev/tty", O_RDONLY); \
  2037. X      if (t >= 0) ioctl(t, TIOCNOTTY, (int *)0), close(t); }
  2038. X
  2039. X      
  2040. X/* 
  2041. X *    Specify where the Bourne Shell is.
  2042. X */
  2043. X
  2044. X#define SHELL        "/usr/bin/sh"
  2045. X
  2046. X/*
  2047. X *    Specify the default mailer to be invoked by nnmail
  2048. X */
  2049. X
  2050. X#define    MAILX    "/usr/ucb/Mail"        /* BSD */
  2051. X
  2052. X
  2053. X/*
  2054. X *    Specify the default pager & options.
  2055. X */
  2056. X
  2057. X#define    PAGER    "more"
  2058. X
  2059. X/*
  2060. X *    Specify the default print command and options.
  2061. X */
  2062. X
  2063. X#define    PRINTER        "lpr -p -JNN-print"
  2064. X
  2065. X
  2066. X/*
  2067. X *    Define the maximum length of any pathname that may occur
  2068. X */
  2069. X
  2070. X#define    FILENAME     256
  2071. NO_NEWS_IS_GOOD_NEWS
  2072. chmod 0644 s-sunos4-0.h || echo "restore of s-sunos4-0.h fails"
  2073. set `wc -c s-sunos4-0.h`;Sum=$1
  2074. if test "$Sum" != "2688"
  2075. then echo original size 2688, current size $Sum;fi
  2076. echo "x - extracting s-template.h (Text)"
  2077. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-template.h &&
  2078. X/*
  2079. X *    Use this file as a template for new s- files
  2080. X */
  2081. X
  2082. X
  2083. X/*
  2084. X *    Include header files containing the following definitions:
  2085. X *
  2086. X *         off_t, time_t, struct stat
  2087. X */
  2088. X
  2089. X#include <sys/types.h>
  2090. X#include <sys/stat.h>
  2091. X
  2092. X
  2093. X/*
  2094. X *    Define if your system has system V like ioctls
  2095. X */
  2096. X
  2097. X#define    HAVE_TERMIO            /* */
  2098. X
  2099. X/*
  2100. X *    Define to use terminfo database.
  2101. X *    Otherwise, termcap is used
  2102. X */
  2103. X
  2104. X#define    USE_TERMINFO            /* */
  2105. X
  2106. X/*
  2107. X *    Specify the library (or libraries) containing the termcap/terminfo
  2108. X *    routines.
  2109. X *
  2110. X *    Notice:  nn only uses the low-level terminal access routines
  2111. X *    (i.e. it does not use curses).
  2112. X */
  2113. X
  2114. X#define TERMLIB    -ltermlib
  2115. X
  2116. X/*
  2117. X *    Define HAVE_STRCHR if strchr() and strrchr() are available
  2118. X */
  2119. X
  2120. X#define HAVE_STRCHR            /* */
  2121. X
  2122. X/*
  2123. X *    Define if a signal handler has type void (see signal.h)
  2124. X */
  2125. X
  2126. X#define    SIGNAL_HANDLERS_ARE_VOID    /* */
  2127. X
  2128. X/*
  2129. X *    Define if signals must be set again after they are caught
  2130. X */
  2131. X
  2132. X#define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  2133. X
  2134. X/*
  2135. X *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  2136. X */
  2137. X
  2138. X#define MICRO_ALARM()    alarm(1)    /* System V */
  2139. X/*#define MICRO_ALARM()    ualarm(100000,0)    /* BSD 4.3 */
  2140. X/*
  2141. X *    Define if your system has BSD like job control (SIGTSTP works)
  2142. X */
  2143. X
  2144. X/* #define HAVE_JOBCONTROL            /* */
  2145. X
  2146. X
  2147. X/*
  2148. X *    Define if your system has a 4.3BSD like syslog library.
  2149. X */
  2150. X
  2151. X#undef HAVE_SYSLOG
  2152. X
  2153. X/*
  2154. X *    Define if your system provides the "directory(3X)" access routines
  2155. X *
  2156. X *    If true, include the header file(s) required by the package below
  2157. X *    (remember that <sys/types.h> or equivalent is included above)
  2158. X *    Also typedef Direntry to the proper struct type.
  2159. X */
  2160. X
  2161. X#define    HAVE_DIRECTORY            /* */
  2162. X
  2163. X#include <dirent.h>            /* System V */
  2164. X/* #include <sys/dir.h>                /* BSD */
  2165. X
  2166. Xtypedef struct dirent Direntry;        /* System V */
  2167. X/* typedef struct direct Direntry;        /* BSD */
  2168. X
  2169. X/*
  2170. X *    Define if your system has a mkdir() library routine
  2171. X */
  2172. X
  2173. X#define    HAVE_MKDIR            /* */
  2174. X
  2175. X
  2176. X/*
  2177. X *    Define HAVE_GETHOSTNAME if your system provides a BSD like 
  2178. X *    gethostname routine.
  2179. X *    Otherwise, define HAVE_UNAME if uname() is avaiable.
  2180. X *    As a final resort, define HOSTNAME to the name of your system 
  2181. X *    (in config.h).
  2182. X */
  2183. X
  2184. X/* #define    HAVE_GETHOSTNAME    /* BSD systems */
  2185. X
  2186. X#define    HAVE_UNAME            /* System V */
  2187. X
  2188. X/*
  2189. X *    Define DETATCH_TERMINAL to be a command sequence which 
  2190. X *    will detatch a process from the control terminal
  2191. X *    Also include system files needed to perform this HERE.
  2192. X *    If not possible, just define it (empty)
  2193. X */
  2194. X
  2195. X/* #include "...." */
  2196. X
  2197. X#define    DETATCH_TERMINAL /* setpgrp(); */
  2198. X
  2199. X
  2200. X/* 
  2201. X *    Specify where the Bourne Shell is.
  2202. X */
  2203. X
  2204. X#define SHELL        "/bin/sh"
  2205. X
  2206. X/*
  2207. X *    Specify the default mailer to be invoked by nnmail
  2208. X */
  2209. X
  2210. X#define    MAILX        "/usr/bin/mailx"    /* SV */
  2211. X/* #define    MAILX    "/usr/ucb/Mail"        /* BSD */
  2212. X
  2213. X
  2214. X/*
  2215. X *    Specify the default pager & options.
  2216. X */
  2217. X
  2218. X#define    PAGER        "/usr/bin/pg -n -s"
  2219. X
  2220. X/*
  2221. X *    Specify the default print command and options.
  2222. X */
  2223. X
  2224. X#define    PRINTER        "/usr/bin/lp -s"
  2225. X
  2226. X
  2227. X/*
  2228. X *    Define the maximum length of any pathname that may occur
  2229. X */
  2230. X
  2231. X#define    FILENAME     128
  2232. X
  2233. X
  2234. X/*
  2235. X *    Define standard compiler flags here:
  2236. X */
  2237. X
  2238. X#define COMPILER_FLAGS
  2239. X
  2240. X/*
  2241. X *    If your system requires other libraries when linking nn
  2242. X *    specify them here:
  2243. X */
  2244. X
  2245. X#define EXTRA_LIB
  2246. NO_NEWS_IS_GOOD_NEWS
  2247. chmod 0644 s-template.h || echo "restore of s-template.h fails"
  2248. set `wc -c s-template.h`;Sum=$1
  2249. if test "$Sum" != "3141"
  2250. then echo original size 3141, current size $Sum;fi
  2251. echo "x - extracting s-tower32.h (Text)"
  2252. sed 's/^X//' << 'NO_NEWS_IS_GOOD_NEWS' > s-tower32.h &&
  2253. X/*
  2254. X *    This version is for Tower-32 machines.
  2255. X */
  2256. X
  2257. X
  2258. X/*
  2259. X *    Include header files containing the following definitions:
  2260. X *
  2261. X *         off_t, time_t, struct stat
  2262. X */
  2263. X
  2264. X#include <sys/types.h>
  2265. X#include <sys/stat.h>
  2266. X
  2267. X/*
  2268. X *    Define if your system has system V like ioctls
  2269. X */
  2270. X
  2271. X#define    HAVE_TERMIO            /* */
  2272. X
  2273. X/*
  2274. X *    Define to use terminfo database.
  2275. X *    Otherwise, termcap is used
  2276. X */
  2277. X
  2278. X#define    USE_TERMINFO            /* */
  2279. X
  2280. X/*
  2281. X *    Specify the library containing the termcap/terminfo access routines.
  2282. X *    Notice:  nn does not use curses.
  2283. X *    Notice:  You must also specify whether termcap or terminfo is
  2284. X *         used when you edit config.h (see below).
  2285. X */
  2286. X
  2287. X#define    TERMLIB -lcurses
  2288. X
  2289. X/*
  2290. X *    Define HAVE_STRCHR if strchr() and strrchr() are available
  2291. X */
  2292. X
  2293. X#define HAVE_STRCHR            /* */
  2294. X
  2295. X/*
  2296. X *    Define if a signal handler has type void (see signal.h)
  2297. X */
  2298. X
  2299. X/* #define    SIGNAL_HANDLERS_ARE_VOID    /* */
  2300. X
  2301. X/*
  2302. X *    Define if signals must be set again after they are caught
  2303. X */
  2304. X
  2305. X#define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  2306. X
  2307. X/*
  2308. X *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  2309. X */
  2310. X
  2311. X#define MICRO_ALARM()    alarm(1)    /* System V */
  2312. X
  2313. X/*
  2314. X *    Define if your system has BSD like job control (SIGTSTP works)
  2315. X */
  2316. X
  2317. X/* #define HAVE_JOBCONTROL            /* */
  2318. X
  2319. X/*
  2320. X *    Define if your system provides the "directory(3X)" access routines
  2321. X *
  2322. X *    If true, include the header file(s) required by the package below
  2323. X *    (remember that <sys/types.h> or equivalent is included above)
  2324. X *    Also typedef Direntry to the proper struct type.
  2325. X */
  2326. X
  2327. X/* #define    HAVE_DIRECTORY            /* */
  2328. X
  2329. X/* #include <dirent.h>            /* System V */
  2330. X
  2331. X/* typedef struct dirent Direntry;        /* System V */
  2332. X
  2333. X/*
  2334. X *    Define if your system has a mkdir() library routine
  2335. NO_NEWS_IS_GOOD_NEWS
  2336. echo "End of part 13"
  2337. echo "File s-tower32.h is continued in part 14"
  2338. echo "14" > s2_seq_.tmp
  2339. exit 0
  2340. ---
  2341. Kim F. Storm        storm@texas.dk        Tel +45 429 174 00
  2342. Texas Instruments, Marielundvej 46E, DK-2730 Herlev, Denmark
  2343.       No news is good news, but nn is better!
  2344.  
  2345.