home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume31 / tin / part03 < prev    next >
Encoding:
Text File  |  1992-07-07  |  55.2 KB  |  2,501 lines

  1. Newsgroups: comp.sources.misc
  2. From: iain%anl433.uucp@Germany.EU.net (Iain Lea)
  3. Subject:  v31i003:  tin - threaded full screen newsreader v1.1 PL4, Part03/15
  4. Message-ID: <1992Jul7.181334.6547@sparky.imd.sterling.com>
  5. X-Md4-Signature: 02bc86fb5ac6ed23b8584c6c183203a9
  6. Date: Tue, 7 Jul 1992 18:13:34 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: iain%anl433.uucp@Germany.EU.net (Iain Lea)
  10. Posting-number: Volume 31, Issue 3
  11. Archive-name: tin/part03
  12. Environment: BSD, SCO, ISC, SUNOS, SYSVR3, SYSVR4, ULTRIX, XENIX
  13. Supersedes: tin: Volume 30, Issue 1-14
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  20. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  21. # Contents:  MANIFEST misc.c server.patch
  22. # Wrapped by kent@sparky on Mon Jun 29 23:35:09 1992
  23. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 3 (of 15)."'
  26. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  28. else
  29.   echo shar: Extracting \"'MANIFEST'\" \(953 characters\)
  30.   sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  31. XMANIFEST for tin newsreader (Tue Jun 23 07:17:54 MET DST 1992)
  32. X----------------------------------------------------------
  33. X   13853 Makefile
  34. X     122 MANIFEST
  35. X    3338 README
  36. X    8432 CHANGES
  37. X    9003 INSTALL
  38. X    5083 TODO
  39. X   14588 FAQ
  40. X    2568 FTP
  41. X   40703 tin.1
  42. X    2247 wildmat.3
  43. X   50832 tin.nrf
  44. X     489 kill
  45. X   14455 tin.h
  46. X   18278 extern.h
  47. X    4658 nntplib.h
  48. X   28626 proto.h
  49. X     585 patchlev.h
  50. X   10048 active.c
  51. X   22975 art.c
  52. X    8719 curses.c
  53. X    4317 debug.c
  54. X   14656 feed.c
  55. X   11458 getline.c
  56. X   29136 group.c
  57. X    2510 hashstr.c
  58. X    5901 help.c
  59. X    4721 inews.c
  60. X   15082 init.c
  61. X   13051 kill.c
  62. X   24092 lang.c
  63. X   12528 main.c
  64. X    7855 memory.c
  65. X   16344 misc.c
  66. X   20406 newsrc.c
  67. X   14736 nntplib.c
  68. X   14367 open.c
  69. X   22481 page.c
  70. X   28095 post.c
  71. X    3150 prompt.c
  72. X   24690 rcfile.c
  73. X   25838 save.c
  74. X    2916 screen.c
  75. X    7173 search.c
  76. X   24921 select.c
  77. X   10115 signal.c
  78. X   14375 spooldir.c
  79. X   20862 thread.c
  80. X    4798 wildmat.c
  81. X  660176 total
  82. END_OF_FILE
  83.   if test 953 -ne `wc -c <'MANIFEST'`; then
  84.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  85.   fi
  86.   # end of 'MANIFEST'
  87. fi
  88. if test -f 'misc.c' -a "${1}" != "-c" ; then 
  89.   echo shar: Will not clobber existing file \"'misc.c'\"
  90. else
  91.   echo shar: Extracting \"'misc.c'\" \(16344 characters\)
  92.   sed "s/^X//" >'misc.c' <<'END_OF_FILE'
  93. X/*
  94. X *  Project   : tin - a threaded Netnews reader
  95. X *  Module    : misc.c
  96. X *  Author    : I.Lea & R.Skrenta
  97. X *  Created   : 01-04-91
  98. X *  Updated   : 20-06-92
  99. X *  Notes     :
  100. X *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  101. X *              You may  freely  copy or  redistribute  this software,
  102. X *              so  long as there is no profit made from its use, sale
  103. X *              trade or  reproduction.  You may not change this copy-
  104. X *              right notice, and it must be included in any copy made
  105. X */
  106. X
  107. X#include    "tin.h"
  108. X
  109. Xstatic char *mailbox_name = (char *) 0;
  110. Xstatic int  mailbox_size;
  111. X
  112. X
  113. Xvoid asfail (file, line, cond)
  114. X    char    *file;
  115. X    int    line;
  116. X    char    *cond;
  117. X{
  118. X      fprintf (stderr, "%s: assertion failure: %s (%d): %s\n",
  119. X          progname, file, line, cond);
  120. X      fflush (stderr);
  121. X      
  122. X     /*
  123. X      * create a core dump
  124. X      */
  125. X#ifdef SIGABRT    
  126. X    sigdisp(SIGABRT, SIG_DFL);
  127. X     kill (process_id, SIGABRT);
  128. X#else
  129. X#    ifdef SIGILL
  130. X        sigdisp(SIGILL, SIG_DFL);
  131. X         kill (process_id, SIGILL);
  132. X#    else
  133. X#        ifdef SIGIOT
  134. X            sigdisp(SIGIOT, SIG_DFL);
  135. X             kill (process_id, SIGIOT);
  136. X#        endif
  137. X#    endif
  138. X#endif
  139. X    exit(1);
  140. X}
  141. X
  142. X
  143. Xvoid copy_fp (fp_ip, fp_op, prefix)
  144. X    FILE *fp_ip;
  145. X    FILE *fp_op;
  146. X    char *prefix;
  147. X{
  148. X    extern int errno;
  149. X    char buf[8192];
  150. X
  151. X    while (fgets (buf, sizeof (buf), fp_ip) != NULL) {
  152. X        if (fprintf (fp_op, "%s%s", prefix, buf) == EOF) {
  153. X            if (errno == EPIPE) {
  154. X                return;
  155. X            }
  156. X            sprintf (msg, "Error: fprintf() failed in copy_fp(). errno=%d", errno);
  157. X            perror_message (msg, "");
  158. X        }
  159. X    }
  160. X}
  161. X
  162. X
  163. Xchar *get_val (env, def)
  164. X    char *env;        /* Environment variable we're looking for    */
  165. X    char *def;        /* Default value if no environ value found    */
  166. X{
  167. X    char *ptr;
  168. X
  169. X    if ((ptr = (char *) getenv(env)) != NULL)
  170. X        return (ptr);
  171. X    else
  172. X        return (def);
  173. X}
  174. X
  175. X
  176. Xint invoke_editor (nam)
  177. X    char *nam;
  178. X{
  179. X    char buf[LEN];
  180. X    char *my_editor;
  181. X    static char editor[LEN];
  182. X    static int first = TRUE;
  183. X
  184. X    if (first) {
  185. X        my_editor = (char *) getenv ("VISUAL");
  186. X
  187. X        strcpy (editor, my_editor != NULL ? my_editor : get_val ("EDITOR", DEFAULT_EDITOR));
  188. X        first = FALSE;
  189. X    }
  190. X
  191. X    if (start_editor_offset) {
  192. X        sprintf (buf, "%s +%d %s", editor, start_line_offset, nam);
  193. X    } else {
  194. X        sprintf (buf, "%s %s", editor, nam);
  195. X    }
  196. X
  197. X    wait_message (buf);
  198. X
  199. X    return invoke_cmd (buf);
  200. X}
  201. X
  202. X
  203. Xvoid shell_escape ()
  204. X{
  205. X    char shell[LEN];
  206. X    char *p;
  207. X
  208. X#ifdef SIGTSTP
  209. X    sigtype_t (*susp)();
  210. X    susp = (sigtype_t *) 0;
  211. X#endif
  212. X
  213. X    sprintf (msg, txt_shell_escape, default_shell_command);
  214. X    
  215. X    if (! prompt_string (msg, shell))
  216. X        my_strncpy (shell, get_val ("SHELL", DEFAULT_SHELL), sizeof (shell));
  217. X
  218. X    for (p = shell; *p && (*p == ' ' || *p == '\t'); p++)
  219. X        continue;
  220. X
  221. X    if (*p) {
  222. X        my_strncpy (default_shell_command, p, sizeof (default_shell_command));
  223. X    } else {
  224. X        if (default_shell_command[0]) {
  225. X            my_strncpy (shell, default_shell_command, sizeof (shell));
  226. X        } else {
  227. X            my_strncpy (shell, get_val ("SHELL", DEFAULT_SHELL), sizeof (shell));
  228. X        }
  229. X        p = shell;
  230. X    }
  231. X
  232. X    ClearScreen ();
  233. X    sprintf (msg, "Shell Command (%s)", p);
  234. X    center_line (0, TRUE, msg);
  235. X    MoveCursor (INDEX_TOP, 0);
  236. X    
  237. X    EndWin ();
  238. X    Raw (FALSE);
  239. X
  240. X#ifdef SIGTSTP
  241. X    if (do_sigtstp)
  242. X        susp = signal (SIGTSTP, SIG_DFL);
  243. X#endif
  244. X
  245. X    system (p);
  246. X
  247. X#ifdef SIGTSTP
  248. X    if (do_sigtstp)
  249. X        signal (SIGTSTP, susp);
  250. X#endif
  251. X
  252. X    Raw (TRUE);
  253. X    InitWin ();
  254. X
  255. X    mail_setup ();
  256. X
  257. X    continue_prompt ();
  258. X
  259. X    if (draw_arrow_mark) {
  260. X        ClearScreen ();
  261. X    }
  262. X}
  263. X
  264. X
  265. Xvoid tin_done (ret)
  266. X    int ret;
  267. X{
  268. X    extern char index_file[PATH_LEN];
  269. X    char group_path[PATH_LEN], *p;
  270. X    int ask = TRUE;
  271. X    register int i, j;
  272. X    
  273. X    /*
  274. X     * check if any groups were read & ask if they should marked read
  275. X     */
  276. X    if (catchup_read_groups) {
  277. X        for (i = 0 ; i < group_top ; i++) {
  278. X            if (active[my_group[i]].attribute.read) {
  279. X                if (ask) {
  280. X                    if (prompt_yn (LINES, "Catchup all groups entered during this session? (y/n): ", 'n')) {
  281. X                        ask = FALSE;
  282. X                        thread_arts = FALSE;    /* speeds up index loading */
  283. X                    } else {
  284. X                        break;
  285. X                    }
  286. X                }
  287. X                sprintf (msg, "Catchup %s...", active[my_group[i]].name);
  288. X                wait_message (msg);
  289. X                my_strncpy (group_path, active[my_group[i]].name, sizeof (group_path));
  290. X                for (p = group_path ; *p ; p++) {
  291. X                    if (*p == '.') {
  292. X                        *p = '/';
  293. X                    }
  294. X                }
  295. X                index_group (active[my_group[i]].name, group_path);
  296. X                for (j = 0; j < top; j++) {
  297. X                    arts[j].unread = ART_READ;
  298. X                }
  299. X                update_newsrc (active[my_group[i]].name, my_group[i], FALSE);
  300. X            }
  301. X        }
  302. X    }
  303. X    nntp_close ();            /* disconnect from NNTP server */
  304. X    free_all_arrays ();        /* deallocate all arrays */
  305. X    ClearScreen ();
  306. X    EndWin ();
  307. X    Raw (FALSE);
  308. X
  309. X    if (read_news_via_nntp && xindex_supported) {
  310. X        unlink (index_file);
  311. X    }
  312. X
  313. X#ifdef INDEX_DAEMON
  314. X    unlink (LOCK_FILE);
  315. X#endif
  316. X
  317. X    exit (ret);
  318. X}
  319. X
  320. X#ifdef USE_MKDIR
  321. Xmkdir (path, mode)
  322. X    char *path;
  323. X    int mode;
  324. X{
  325. X    char buf[LEN];
  326. X    struct stat sb;
  327. X
  328. X    sprintf(buf, "mkdir %s", path);
  329. X    if (stat (path, &sb) == -1) {
  330. X        system (buf);
  331. X        chmod (path, mode);
  332. X    }
  333. X}
  334. X#endif
  335. X
  336. X/*
  337. X * hash group name for fast lookup later 
  338. X */
  339. X
  340. Xlong hash_groupname (group)
  341. X    char *group;
  342. X{
  343. X    unsigned long hash_value;
  344. X    unsigned char *ptr = (unsigned char *) group;
  345. X
  346. X    hash_value = *ptr++;
  347. X
  348. X    while (*ptr)
  349. X        hash_value = ((hash_value << 1) ^ *ptr++) % TABLE_SIZE;
  350. X
  351. X    return (hash_value);
  352. X}
  353. X
  354. X
  355. Xvoid rename_file (old_filename, new_filename)
  356. X    char *old_filename;
  357. X    char *new_filename;
  358. X{    
  359. X    char buf[1024];
  360. X    FILE *fp_old, *fp_new;
  361. X    
  362. X    unlink (new_filename);
  363. X    
  364. X    if (link (old_filename, new_filename) == -1) {
  365. X        if (errno == EXDEV) {    /* create & copy file across filesystem */
  366. X            if ((fp_old = fopen (old_filename, "r")) == (FILE *) 0) {
  367. X                sprintf (buf, txt_cannot_open, old_filename);
  368. X                perror_message (buf, "ONE");
  369. X                return;
  370. X            }
  371. X            if ((fp_new = fopen (new_filename, "w")) == (FILE *) 0) {
  372. X                sprintf (buf, txt_cannot_open, new_filename);
  373. X                perror_message (buf, "ONE");
  374. X                return;
  375. X            }
  376. X            copy_fp (fp_old, fp_new, "");
  377. X            fclose (fp_new);    
  378. X            fclose (fp_old);    
  379. X            errno = 0;
  380. X        } else {
  381. X            sprintf (buf, txt_rename_error, old_filename, new_filename);
  382. X            perror_message (buf, "THREE");
  383. X            return;
  384. X        }    
  385. X    }
  386. X    if (unlink (old_filename) == -1) {
  387. X        sprintf (buf, txt_rename_error, old_filename, new_filename);
  388. X        perror_message (buf, "TWO");
  389. X        return;
  390. X    }
  391. X}
  392. Xchar *str_dup (str)
  393. X    char *str;
  394. X{
  395. X    char *dup = (char *) 0;
  396. X
  397. X    if (str) {
  398. X        dup = my_malloc (strlen (str)+1);
  399. X        strcpy (dup, str);
  400. X    }
  401. X    return dup;
  402. X}
  403. X
  404. X
  405. Xint invoke_cmd (nam)
  406. X    char *nam;
  407. X{
  408. X    int ret;
  409. X#ifdef SIGTSTP
  410. X    sigtype_t (*susp)();
  411. X    susp = (sigtype_t *) 0;
  412. X#endif
  413. X
  414. X    set_alarm_clock_off ();
  415. X
  416. X    EndWin ();
  417. X    Raw (FALSE);
  418. X
  419. X#ifdef SIGTSTP
  420. X    if (do_sigtstp)
  421. X        susp = signal(SIGTSTP, SIG_DFL);
  422. X#endif
  423. X
  424. X#ifdef SIGCHLD
  425. X    system (nam);
  426. X    ret = system_status;
  427. X#else
  428. X    ret = system (nam);
  429. X#endif
  430. X
  431. X#ifdef SIGTSTP
  432. X    if (do_sigtstp)
  433. X        signal (SIGTSTP, susp);
  434. X#endif
  435. X
  436. X    Raw (TRUE);
  437. X    InitWin ();
  438. X
  439. X    set_alarm_clock_on ();
  440. X    
  441. X    return ret == 0;
  442. X}
  443. X
  444. X
  445. Xvoid draw_percent_mark (cur_num, max_num)
  446. X    int cur_num;
  447. X    int max_num;
  448. X{
  449. X    char buf[32];
  450. X    int percent = 0;
  451. X
  452. X    if (NOTESLINES <= 0) {
  453. X        return;
  454. X    }
  455. X
  456. X    if (cur_num <= 0 && max_num <= 0) {
  457. X        return;
  458. X    }
  459. X        
  460. X    percent = cur_num * 100 / max_num;
  461. X    sprintf (buf, "%s(%d%%) [%d/%d]", txt_more, percent, cur_num, max_num);
  462. X    MoveCursor (LINES, (COLS - (int) strlen (buf))-(1+BLANK_PAGE_COLS));
  463. X    StartInverse ();    
  464. X    fputs (buf, stdout);
  465. X    fflush (stdout);
  466. X    EndInverse ();
  467. X}
  468. X
  469. Xvoid set_real_uid_gid ()
  470. X{
  471. X    if (local_index)
  472. X        return;
  473. X
  474. X    umask (real_umask);
  475. X    
  476. X#ifdef USE_SETREUID
  477. X    if (setreuid (-1, real_uid) == -1) {
  478. X        perror_message ("Error setreuid(real) failed", "");
  479. X    }
  480. X    if (setregid (-1, real_gid) == -1) {
  481. X        perror_message ("Error setregid(real) failed", "");
  482. X    }
  483. X#else    
  484. X#  if defined(BSD) && ! defined(sinix)
  485. X#    ifdef sun
  486. X    if (seteuid (real_uid) == -1) {
  487. X        perror_message ("Error setreuid(real) failed", "");
  488. X    }
  489. X    if (setegid (real_gid) == -1) {
  490. X        perror_message ("Error setregid(real) failed", "");
  491. X    }
  492. X#    else
  493. X    if (setreuid (tin_uid, real_uid) == -1) {
  494. X        perror_message ("Error setreuid(real) failed", "");
  495. X    }
  496. X    if (setregid (tin_gid, real_gid) == -1) {
  497. X        perror_message ("Error setregid(real) failed", "");
  498. X    }
  499. X#    endif    /* sun */    
  500. X#  else
  501. X    if (setuid (real_uid) == -1) {
  502. X        perror_message ("Error setuid(real) failed", "");
  503. X    }
  504. X    if (setgid (real_gid) == -1) {
  505. X        perror_message ("Error setgid(real) failed", "");
  506. X    }
  507. X#  endif
  508. X#endif
  509. X}
  510. X
  511. X
  512. Xvoid set_tin_uid_gid ()
  513. X{
  514. X    if (local_index)
  515. X        return;
  516. X
  517. X    umask (0);
  518. X
  519. X#ifdef USE_SETREUID
  520. X    if (setreuid (-1, tin_uid) == -1) {
  521. X        perror_message ("Error setreuid(tin) failed", "");
  522. X    }
  523. X    if (setregid (-1, tin_gid) == -1) {
  524. X        perror_message ("Error setregid(tin) failed", "");
  525. X    }
  526. X#else    
  527. X#  if defined(BSD) && ! defined(sinix)
  528. X#    ifdef sun
  529. X    if (seteuid (tin_uid) == -1) {
  530. X        perror_message ("Error setreuid(real) failed", "");
  531. X    }
  532. X    if (setegid (tin_gid) == -1) {
  533. X        perror_message ("Error setregid(real) failed", "");
  534. X    }
  535. X#    else
  536. X    if (setreuid (real_uid, tin_uid) == -1) {
  537. X        perror_message ("Error setreuid(tin) failed", "");
  538. X    }
  539. X    if (setregid (real_gid, tin_gid) == -1) {
  540. X        perror_message ("Error setregid(tin) failed", "");
  541. X    }
  542. X#    endif    /* sun */    
  543. X#  else
  544. X    if (setuid (tin_uid) == -1) {
  545. X        perror_message ("Error setuid(tin) failed", "");
  546. X    }
  547. X    if (setgid (tin_gid) == -1) {
  548. X        perror_message ("Error setgid(tin) failed", "");
  549. X    }
  550. X#  endif
  551. X#endif
  552. X}
  553. X
  554. X
  555. Xvoid basename (dirname, program)
  556. X    char *dirname;        /* argv[0] */
  557. X    char *program;        /* progname is returned */
  558. X{
  559. X    int i;
  560. X    
  561. X    strcpy (program, dirname);
  562. X    
  563. X    for (i=(int) strlen (dirname)-1 ; i ; i--) {
  564. X        if (dirname[i] == '/') {
  565. X            strcpy (program, dirname+(i+1));
  566. X            break;
  567. X        }
  568. X    }
  569. X}
  570. X
  571. X
  572. X/*
  573. X *  Record size of mailbox so we can detect if new mail has arrived
  574. X */
  575. X
  576. Xvoid mail_setup ()
  577. X{
  578. X    struct stat buf;
  579. X
  580. X    mailbox_name = get_val ("MAIL", mailbox);
  581. X
  582. X    if (stat (mailbox_name, &buf) >= 0) {
  583. X        mailbox_size = buf.st_size;
  584. X    } else {
  585. X        mailbox_size = 0;
  586. X    }
  587. X}
  588. X
  589. X/*
  590. X *  Return TRUE if new mail has arrived
  591. X */
  592. X
  593. Xint mail_check ()
  594. X{
  595. X    struct stat buf;
  596. X
  597. X    if (mailbox_name != (char *) 0 &&
  598. X        stat (mailbox_name, &buf) >= 0 &&
  599. X        mailbox_size < buf.st_size) {
  600. X        return TRUE;
  601. X    }
  602. X
  603. X    return FALSE;
  604. X}
  605. X
  606. X/*
  607. X *  Parse various From: lines into the component mail addresses and
  608. X *  real names
  609. X */
  610. X
  611. Xvoid parse_from (str, addr, name)
  612. X    char *str;
  613. X    char *addr;
  614. X    char *name;
  615. X{
  616. X    register int c;
  617. X    register char *cp, *ncp;
  618. X    int gotlt, lastsp, level;
  619. X
  620. X    gotlt = 0;
  621. X    lastsp = 0;
  622. X    cp = addr;
  623. X    ncp = name;
  624. X    while (*str == ' ')
  625. X        ++str;
  626. X    while (c = *str++)
  627. X        switch (c) {
  628. X        case '(':
  629. X            ncp = name;
  630. X            level = 1;
  631. X            while (*str != '\0' && level) {
  632. X                switch (c = *str++) {
  633. X                    case '(':
  634. X                        *ncp++ = c;
  635. X                        level++;
  636. X                        break;
  637. X                    case ')':
  638. X                        level--;
  639. X                        if (level > 0)
  640. X                            *ncp++ = c;
  641. X                        break;
  642. X                    default:
  643. X                        if (c != '"') {    /* IL */
  644. X                            *ncp++ = c;
  645. X                        }    
  646. X                        break;
  647. X                }
  648. X            }
  649. X            if (*str)
  650. X                str++;
  651. X            lastsp = 0;
  652. X            break;
  653. X        case ' ':
  654. X            if (str[0] == 'a' && str[1] == 't' && str[2] == ' ')
  655. X                str += 3, *cp++ = '@';
  656. X            else if (str[0] == '@' && str[1] == ' ')
  657. X                str += 2, *cp++ = '@';
  658. X            else
  659. X                lastsp = 1;
  660. X            if (ncp > name)
  661. X                *ncp++ = ' ';
  662. X            break;
  663. X        case '<':
  664. X            cp = addr;
  665. X            gotlt++;
  666. X            lastsp = 0;
  667. X            break;
  668. X        case '>':
  669. X            if (gotlt)
  670. X                goto done;
  671. X            /* FALL THROUGH CASE */
  672. X        default:
  673. X            if (lastsp) {
  674. X                lastsp = 0;
  675. X                *cp++ = ' ';
  676. X            }
  677. X            *cp++ = c;
  678. X            if (! gotlt)
  679. X                *ncp++ = c;
  680. X            break;
  681. X        }
  682. Xdone:
  683. X    *cp = 0;
  684. X    while (ncp>name && ncp[-1]==' ')
  685. X        --ncp;
  686. X    *ncp = 0;
  687. X    if (*addr == '@') {
  688. X        char buf [512];
  689. X
  690. X        strcpy (buf, addr);
  691. X        strcpy (addr, "root");
  692. X        strcat (addr, buf);
  693. X    }
  694. X}
  695. X
  696. X/*
  697. X *  Convert a string to a long, only look at first n characters
  698. X */
  699. X
  700. Xlong my_atol (s, n)
  701. X    char *s;
  702. X    int n;
  703. X{
  704. X    long ret = 0;
  705. X
  706. X    while (*s && n--) {
  707. X        if (*s >= '0' && *s <= '9')
  708. X            ret = ret * 10 + (*s - '0');
  709. X        else
  710. X            return -1;
  711. X        s++;
  712. X    }
  713. X
  714. X    return ret;
  715. X}
  716. X
  717. X/*
  718. X *  strcmp that ignores case
  719. X */
  720. X
  721. X#define FOLD_TO_UPPER(a)    (islower ((int) (a)) ? toupper ((int) (a)) : (a))
  722. X
  723. Xint my_stricmp (p, q)
  724. X    char *p;
  725. X    char *q;
  726. X{
  727. X    for (; FOLD_TO_UPPER (*p) == FOLD_TO_UPPER (*q); ++p, ++q) {
  728. X        if (*p == '\0') {
  729. X            return (0);
  730. X        }
  731. X    }        
  732. X
  733. X    return (FOLD_TO_UPPER (*p) - FOLD_TO_UPPER (*q));
  734. X}
  735. X
  736. X/*
  737. X *  Return a pointer into s eliminating any leading Re:'s.  Example:
  738. X *
  739. X *      Re: Reorganization of misc.jobs
  740. X *      ^   ^
  741. X */
  742. X
  743. Xchar *eat_re (s)
  744. X    char *s;
  745. X{
  746. X
  747. X    while (*s == 'r' || *s == 'R') {
  748. X        if ((*(s+1) == 'e' || *(s+1) == 'E')) {
  749. X            if (*(s+2) == ':')
  750. X                s += 3;
  751. X            else if (*(s+2) == '^' && isdigit(*(s+3)) && *(s+4) == ':')
  752. X                s += 5;            /* hurray nn */
  753. X            else
  754. X                break;
  755. X        } else
  756. X            break;
  757. X        while (*s == ' ')
  758. X            s++;
  759. X    }
  760. X
  761. X    return s;
  762. X}
  763. X
  764. X/*
  765. X *  Hash the subjects (after eating the Re's off) for a quicker
  766. X *  thread search later.  We store the hashes for subjects in the
  767. X *  index file for speed.
  768. X */
  769. X
  770. Xlong hash_s (s)
  771. X    char *s;
  772. X{
  773. X    long h = 0;
  774. X    unsigned char *t = (unsigned char *) s;
  775. X
  776. X    while (*t)
  777. X        h = h * 64 + *t++;
  778. X
  779. X    return h;
  780. X}
  781. X
  782. X/*
  783. X *  strncpy that stops at a newline and null terminates
  784. X */
  785. X
  786. Xvoid my_strncpy (p, q, n)
  787. X    char *p;
  788. X    char *q;
  789. X    int n;
  790. X{
  791. X    while (n--) {
  792. X        if (! *q || *q == '\n')
  793. X            break;
  794. X        *p++ = *q++;
  795. X    }
  796. X    *p = '\0';
  797. X}
  798. X
  799. X
  800. Xint untag_all_articles ()
  801. X{
  802. X    int untagged = FALSE;
  803. X    register int i;
  804. X
  805. X    for (i=0 ; i < top ; i++) {
  806. X        if (arts[i].tagged) {
  807. X            arts[i].tagged = FALSE;
  808. X            untagged = TRUE;
  809. X        }
  810. X    }
  811. X    num_of_tagged_arts = 0;
  812. X
  813. X    return (untagged);
  814. X}
  815. X
  816. X
  817. X/*
  818. X * ANSI C strstr () - Uses Boyer-Moore algorithm.
  819. X */
  820. Xchar *str_str (text, pattern, patlen)
  821. X    char *text;
  822. X    char *pattern;
  823. X    int patlen;
  824. X{
  825. X    register unsigned char *p, *t;
  826. X    register int i, p1, j, *delta;
  827. X    int deltaspace[256];
  828. X    int textlen;
  829. X
  830. X    textlen = strlen (text);
  831. X
  832. X    /* algorithm fails if pattern is empty */
  833. X    if ((p1 = patlen) == 0)
  834. X        return (text);
  835. X
  836. X    /* code below fails (whenever i is unsigned) if pattern too long */
  837. X    if (p1 > textlen)
  838. X        return (NULL);
  839. X
  840. X    /* set up deltas */
  841. X    delta = deltaspace;
  842. X    for (i = 0; i <= 255; i++)
  843. X        delta[i] = p1;
  844. X    for (p = (unsigned char *) pattern, i = p1; --i > 0;)
  845. X        delta[*p++] = i;
  846. X
  847. X    /*
  848. X     * From now on, we want patlen - 1.
  849. X     * In the loop below, p points to the end of the pattern,
  850. X     * t points to the end of the text to be tested against the
  851. X     * pattern, and i counts the amount of text remaining, not
  852. X     * including the part to be tested.
  853. X     */
  854. X    p1--;
  855. X    p = (unsigned char *) pattern + p1;
  856. X    t = (unsigned char *) text + p1;
  857. X    i = textlen - patlen;
  858. X    for (;;) {
  859. X        if (*p == *t && memcmp ((p - p1), (t - p1), p1) == 0)
  860. X            return ((char *)t - p1);
  861. X        j = delta[*t];
  862. X        if (i < j)
  863. X            break;
  864. X        i -= j;
  865. X        t += j;
  866. X    }
  867. X    return (NULL);
  868. X}
  869. X
  870. X
  871. X
  872. Xvoid get_author (thread, respnum, str)
  873. X    int thread;
  874. X    int respnum;
  875. X    char *str;
  876. X{    
  877. X    extern int threaded_on_subject;
  878. X    int author;
  879. X/*
  880. X    int len_from = max_from;
  881. X
  882. X    if (thread) {
  883. X        if (threaded_on_subject) {
  884. X            len_from = max_subj+max_from;
  885. X        } else {
  886. X            len_from = max_from;
  887. X        }
  888. X        author = SHOW_FROM_BOTH;
  889. X    } else {
  890. X        author = show_author;
  891. X    } 
  892. X*/
  893. X    if (thread) {
  894. X        if (threaded_on_subject) {
  895. X            author = SHOW_FROM_BOTH;
  896. X        } else {
  897. X            author = show_author;
  898. X        }
  899. X    } else {
  900. X        author = show_author;
  901. X    } 
  902. X    
  903. X    switch (author) { 
  904. X        case SHOW_FROM_NONE:
  905. X            str[0] = '\0';
  906. X            break;
  907. X        case SHOW_FROM_ADDR:
  908. X            strcpy (str, arts[respnum].from);
  909. X            break;
  910. X        case SHOW_FROM_NAME:
  911. X            strcpy (str, arts[respnum].name);
  912. X            break;
  913. X        case SHOW_FROM_BOTH:
  914. X            if (arts[respnum].name != arts[respnum].from) { 
  915. X                sprintf (str, "%s (%s)", arts[respnum].name, arts[respnum].from);
  916. X            } else { 
  917. X                strcpy (str, arts[respnum].from);
  918. X            }
  919. X            break;
  920. X    }
  921. X}
  922. X
  923. X
  924. Xvoid toggle_inverse_video ()
  925. X{
  926. X    inverse_okay = !inverse_okay;
  927. X    if (inverse_okay) {
  928. X#ifndef USE_INVERSE_HACK    
  929. X        draw_arrow_mark = FALSE;
  930. X#endif        
  931. X        info_message (txt_inverse_on);
  932. X    } else {
  933. X        draw_arrow_mark = TRUE;
  934. X        info_message (txt_inverse_off);
  935. X    }
  936. X}
  937. X
  938. X
  939. Xint get_arrow_key ()
  940. X{
  941. X    int ch;
  942. X    
  943. X    ch = ReadCh ();
  944. X    if (ch == '[' || ch == 'O')
  945. X        ch = ReadCh();
  946. X    switch (ch) {
  947. X        case 'A':
  948. X        case 'D':
  949. X        case 'i':
  950. X            return KEYMAP_UP;
  951. X
  952. X        case 'B':
  953. X        case 'C':
  954. X            return KEYMAP_DOWN;
  955. X
  956. X        case 'I':        /* ansi  PgUp */
  957. X        case 'V':        /* at386 PgUp */
  958. X        case 'S':        /* 97801 PgUp */
  959. X        case 'v':        /* emacs style */
  960. X            return KEYMAP_PAGE_UP;
  961. X
  962. X        case 'G':        /* ansi  PgDn */
  963. X        case 'U':        /* at386 PgDn */
  964. X        case 'T':        /* 97801 PgDn */
  965. X            return KEYMAP_PAGE_DOWN;
  966. X
  967. X        case 'H':        /* at386  Home */
  968. X            return KEYMAP_HOME;
  969. X                    
  970. X        case 'F':        /* ansi   End */
  971. X        case 'Y':        /* at386  End */
  972. X            return KEYMAP_END;
  973. X
  974. X        case '5':        /* vt200 PgUp */
  975. X            ch = ReadCh ();    /* eat the ~  */
  976. X            return KEYMAP_PAGE_UP;
  977. X
  978. X        case '6':        /* vt200 PgUp */
  979. X            ch = ReadCh ();    /* eat the ~  */
  980. X            return KEYMAP_PAGE_DOWN;
  981. X
  982. X        case '1':        /* vt200 PgUp */
  983. X            ch = ReadCh ();    /* eat the ~  */
  984. X            return KEYMAP_HOME;
  985. X                    
  986. X        case '4':        /* vt200 PgUp */
  987. X            ch = ReadCh ();    /* eat the ~  */
  988. X            return KEYMAP_END;
  989. X
  990. X        default:
  991. X            return KEYMAP_UNKNOWN;
  992. X    }
  993. X}
  994. END_OF_FILE
  995.   if test 16344 -ne `wc -c <'misc.c'`; then
  996.     echo shar: \"'misc.c'\" unpacked with wrong size!
  997.   fi
  998.   # end of 'misc.c'
  999. fi
  1000. if test -f 'server.patch' -a "${1}" != "-c" ; then 
  1001.   echo shar: Will not clobber existing file \"'server.patch'\"
  1002. else
  1003.   echo shar: Extracting \"'server.patch'\" \(34102 characters\)
  1004.   sed "s/^X//" >'server.patch' <<'END_OF_FILE'
  1005. Xdiff -rcs server.old/Makefile server/Makefile
  1006. X*** server.old/Makefile    Mon May  4 07:03:54 1992
  1007. X--- server/Makefile    Mon May  4 07:16:35 1992
  1008. X***************
  1009. X*** 6,18 ****
  1010. X      ahbs.o globals.o group.o help.o ihave.o list.o misc.o netaux.o \
  1011. X      newgroups.o newnews.o nextlast.o ngmatch.o post.o parsit.o scandir.o \
  1012. X      slave.o spawn.o strcasecmp.o subnet.o time.o xhdr.o fakesyslog.o \
  1013. X!     batch.o auth.o timer.o ../common/version.o
  1014. X  
  1015. X  SRVRSRC = main.c serve.c access.c access_inet.c access_dnet.c active.c \
  1016. X      ahbs.c globals.c group.c help.c ihave.c list.c misc.c netaux.c \
  1017. X      newgroups.c newnews.c nextlast.c ngmatch.c post.c parsit.c scandir.c \
  1018. X      slave.c spawn.c strcasecmp.c subnet.c time.c xhdr.c fakesyslog.c \
  1019. X!     batch.c auth.c timer.c ../common/version.c
  1020. X  
  1021. X  SRVRINC = common.h ../common/conf.h ../common/nntp.h timer.h
  1022. X  
  1023. X--- 6,18 ----
  1024. X      ahbs.o globals.o group.o help.o ihave.o list.o misc.o netaux.o \
  1025. X      newgroups.o newnews.o nextlast.o ngmatch.o post.o parsit.o scandir.o \
  1026. X      slave.o spawn.o strcasecmp.o subnet.o time.o xhdr.o fakesyslog.o \
  1027. X!     batch.o auth.o timer.o ../common/version.o xuser.o xindex.o
  1028. X  
  1029. X  SRVRSRC = main.c serve.c access.c access_inet.c access_dnet.c active.c \
  1030. X      ahbs.c globals.c group.c help.c ihave.c list.c misc.c netaux.c \
  1031. X      newgroups.c newnews.c nextlast.c ngmatch.c post.c parsit.c scandir.c \
  1032. X      slave.c spawn.c strcasecmp.c subnet.c time.c xhdr.c fakesyslog.c \
  1033. X!     batch.c auth.c timer.c ../common/version.c xuser.c xindex.c
  1034. X  
  1035. X  SRVRINC = common.h ../common/conf.h ../common/nntp.h timer.h
  1036. X  
  1037. XFiles server.old/README and server/README are identical
  1038. XFiles server.old/SYSLOG and server/SYSLOG are identical
  1039. Xdiff -rcs server.old/access.c server/access.c
  1040. X*** server.old/access.c    Mon May  4 07:03:55 1992
  1041. X--- server/access.c    Sat Mar  7 11:46:00 1992
  1042. X***************
  1043. X*** 44,50 ****
  1044. X  
  1045. X  #ifdef AUTH
  1046. X  extern    int Needauth;
  1047. X! #endif AUTH
  1048. X  
  1049. X  host_access(canread, canpost, canxfer, gdlist)
  1050. X      int        *canread, *canpost, *canxfer;
  1051. X--- 44,50 ----
  1052. X  
  1053. X  #ifdef AUTH
  1054. X  extern    int Needauth;
  1055. X! #endif /* AUTH */
  1056. X  
  1057. X  host_access(canread, canpost, canxfer, gdlist)
  1058. X      int        *canread, *canpost, *canxfer;
  1059. X***************
  1060. X*** 230,236 ****
  1061. X      /* do we require a userid and password for this guy? */
  1062. X      if (isupper(readperm[0]) || isupper(postperm[0]))
  1063. X          Needauth = 1;
  1064. X! #endif AUTH
  1065. X  }
  1066. X  
  1067. X  #ifdef DOMAINMATCH
  1068. X--- 230,236 ----
  1069. X      /* do we require a userid and password for this guy? */
  1070. X      if (isupper(readperm[0]) || isupper(postperm[0]))
  1071. X          Needauth = 1;
  1072. X! #endif /* AUTH */
  1073. X  }
  1074. X  
  1075. X  #ifdef DOMAINMATCH
  1076. X***************
  1077. X*** 267,270 ****
  1078. X  
  1079. X      return (0);
  1080. X  }
  1081. X! #endif DOMAINMATCH
  1082. X--- 267,270 ----
  1083. X  
  1084. X      return (0);
  1085. X  }
  1086. X! #endif /* DOMAINMATCH */
  1087. XFiles server.old/access_dnet.c and server/access_dnet.c are identical
  1088. Xdiff -rcs server.old/access_inet.c server/access_inet.c
  1089. X*** server.old/access_inet.c    Mon May  4 07:03:55 1992
  1090. X--- server/access_inet.c    Sat Mar  7 11:46:00 1992
  1091. X***************
  1092. X*** 77,83 ****
  1093. X      }
  1094. X  #else
  1095. X      subnet_name[0] = '\0';
  1096. X! #endif SUBNET
  1097. X  
  1098. X      hp = gethostbyaddr((char *) &sin->sin_addr.s_addr,
  1099. X          sizeof (sin->sin_addr.s_addr), AF_INET);
  1100. X--- 77,83 ----
  1101. X      }
  1102. X  #else
  1103. X      subnet_name[0] = '\0';
  1104. X! #endif /* SUBNET */
  1105. X  
  1106. X      hp = gethostbyaddr((char *) &sin->sin_addr.s_addr,
  1107. X          sizeof (sin->sin_addr.s_addr), AF_INET);
  1108. XFiles server.old/active.c and server/active.c are identical
  1109. XFiles server.old/ahbs.c and server/ahbs.c are identical
  1110. Xdiff -rcs server.old/auth.c server/auth.c
  1111. X*** server.old/auth.c    Mon May  4 07:03:55 1992
  1112. X--- server/auth.c    Sat Mar  7 11:46:00 1992
  1113. X***************
  1114. X*** 149,152 ****
  1115. X      Needauth = 0;
  1116. X  }
  1117. X  
  1118. X! #endif AUTH
  1119. X--- 149,152 ----
  1120. X      Needauth = 0;
  1121. X  }
  1122. X  
  1123. X! #endif /* AUTH */
  1124. Xdiff -rcs server.old/batch.c server/batch.c
  1125. X*** server.old/batch.c    Mon May  4 07:03:55 1992
  1126. X--- server/batch.c    Sat Mar  7 11:46:00 1992
  1127. X***************
  1128. X*** 255,265 ****
  1129. X  #ifdef SYSLOG
  1130. X  #ifdef LOG
  1131. X      syslog(LOG_ERR, "%s transfer_timeout", hostname);
  1132. X! #endif LOG
  1133. X  #endif
  1134. X      (void) unlink(tempfile);
  1135. X      exit(1);
  1136. X! #endif XFER_TIMEOUT
  1137. X  }
  1138. X  
  1139. X  /*
  1140. X--- 255,265 ----
  1141. X  #ifdef SYSLOG
  1142. X  #ifdef LOG
  1143. X      syslog(LOG_ERR, "%s transfer_timeout", hostname);
  1144. X! #endif /* LOG */
  1145. X  #endif
  1146. X      (void) unlink(tempfile);
  1147. X      exit(1);
  1148. X! #endif /* XFER_TIMEOUT */
  1149. X  }
  1150. X  
  1151. X  /*
  1152. Xdiff -rcs server.old/common.h server/common.h
  1153. X*** server.old/common.h    Mon May  4 07:03:55 1992
  1154. X--- server/common.h    Sun Mar  8 11:26:19 1992
  1155. X***************
  1156. X*** 48,53 ****
  1157. X--- 48,56 ----
  1158. X  #endif
  1159. X  #else /* not NDIR */
  1160. X  # include <sys/dir.h>
  1161. X+ # ifdef ISC
  1162. X+ #  include <sys/dirent.h>
  1163. X+ # endif
  1164. X  #endif /* not NDIR */
  1165. X  
  1166. X  #ifdef FCNTL
  1167. X***************
  1168. X*** 157,162 ****
  1169. X--- 160,166 ----
  1170. X  extern    char    spooldir[];
  1171. X  extern    char    activefile[];
  1172. X  extern    char    distributionsfile[];
  1173. X+ extern    char    subscriptionsfile[];
  1174. X  extern    char    newsgroupsfile[];
  1175. X  extern    char    accessfile[];
  1176. X  extern    char    historyfile[];
  1177. XOnly in server: cscope.out
  1178. Xdiff -rcs server.old/fakesyslog.c server/fakesyslog.c
  1179. X*** server.old/fakesyslog.c    Mon May  4 07:03:55 1992
  1180. X--- server/fakesyslog.c    Sat Mar  7 11:46:00 1992
  1181. X***************
  1182. X*** 138,144 ****
  1183. X      (void) strcpy(buf, ctime(&clock)+4);
  1184. X      *(bp = buf + 16) = '\0';
  1185. X  
  1186. X!     (void) sprintf(bp, "localhost %s", ident ? ident : "");
  1187. X      bp += strlen(bp);
  1188. X  
  1189. X      if (opt&LOG_PID) {
  1190. X--- 138,145 ----
  1191. X      (void) strcpy(buf, ctime(&clock)+4);
  1192. X      *(bp = buf + 16) = '\0';
  1193. X  
  1194. X! /*    (void) sprintf(bp, "localhost %s", ident ? ident : ""); */
  1195. X!     (void) sprintf(bp, "local %s", ident ? ident : "");
  1196. X      bp += strlen(bp);
  1197. X  
  1198. X      if (opt&LOG_PID) {
  1199. Xdiff -rcs server.old/fakesyslog.h server/fakesyslog.h
  1200. X*** server.old/fakesyslog.h    Mon May  4 07:03:55 1992
  1201. X--- server/fakesyslog.h    Thu Feb 20 08:27:03 1992
  1202. X***************
  1203. X*** 62,65 ****
  1204. X  #define LOG_NDELAY    0
  1205. X  #define LOG_NOWAIT    0
  1206. X  
  1207. X! #endif FAKESYSLOG
  1208. X--- 62,65 ----
  1209. X  #define LOG_NDELAY    0
  1210. X  #define LOG_NOWAIT    0
  1211. X  
  1212. X! #endif /* FAKESYSLOG */
  1213. Xdiff -rcs server.old/globals.c server/globals.c
  1214. X*** server.old/globals.c    Mon May  4 07:03:56 1992
  1215. X--- server/globals.c    Sun Mar  8 11:25:47 1992
  1216. X***************
  1217. X*** 16,21 ****
  1218. X--- 16,22 ----
  1219. X  char    activefile[] = ACTIVE_FILE;
  1220. X  char    accessfile[] = ACCESS_FILE;
  1221. X  char    distributionsfile[] = DISTRIBUTIONS_FILE;
  1222. X+ char    subscriptionsfile[] = SUBSCRIPTIONS_FILE;
  1223. X  char    newsgroupsfile[] = NEWSGROUPS_FILE;
  1224. X  char    historyfile[] = HISTORY_FILE;
  1225. X  #ifdef ACTIVE_TIMES_FILE
  1226. X***************
  1227. X*** 54,60 ****
  1228. X  #ifdef AUTH
  1229. X  int    Needauth;    /* 1 if we need to do authorization */
  1230. X  char    User[10];    /* username for authentication */
  1231. X! #endif AUTH
  1232. X  
  1233. X  #ifdef LOG
  1234. X  int    arts_acsd;
  1235. X--- 55,61 ----
  1236. X  #ifdef AUTH
  1237. X  int    Needauth;    /* 1 if we need to do authorization */
  1238. X  char    User[10];    /* username for authentication */
  1239. X! #endif /* AUTH */
  1240. X  
  1241. X  #ifdef LOG
  1242. X  int    arts_acsd;
  1243. Xdiff -rcs server.old/group.c server/group.c
  1244. X*** server.old/group.c    Mon May  4 07:03:56 1992
  1245. X--- server/group.c    Sat Mar  7 11:46:00 1992
  1246. X***************
  1247. X*** 49,54 ****
  1248. X--- 49,55 ----
  1249. X          return;
  1250. X      }
  1251. X  
  1252. X+ 
  1253. X      reqlist[0] = argv[1];
  1254. X      reqlist[1] = NULL;
  1255. X  
  1256. X***************
  1257. X*** 70,79 ****
  1258. X      close_crnt();
  1259. X      (void) chdir(spooldir);
  1260. X  
  1261. X- #ifdef LOG
  1262. X-     syslog(LOG_INFO, "%s group %s", hostname, argv[1]);
  1263. X- #endif
  1264. X- 
  1265. X      while ((cp = index(argv[1], '.')) != (char *) NULL)
  1266. X          *cp = '/';
  1267. X  
  1268. X--- 71,76 ----
  1269. X***************
  1270. X*** 96,101 ****
  1271. X--- 93,103 ----
  1272. X      art_ptr = 0;
  1273. X  
  1274. X      ingroup = 1;
  1275. X+     
  1276. X+ #ifdef LOG    
  1277. X+     syslog(LOG_INFO, "%s group=%s  high=%d  low=%d  arts=%d",
  1278. X+          hostname, argv[1], high_msg, low_msg, num_arts);
  1279. X+ #endif
  1280. X  
  1281. X      while ((cp = index(argv[1], '/')) != (char *) NULL)
  1282. X          *cp = '.';
  1283. Xdiff -rcs server.old/help.c server/help.c
  1284. X*** server.old/help.c    Mon May  4 07:03:56 1992
  1285. X--- server/help.c    Tue Mar 10 08:55:29 1992
  1286. X***************
  1287. X*** 21,28 ****
  1288. X      printf("NEXT        POST         QUIT\r\n");
  1289. X      printf("STAT        NEWGROUPS    HELP\r\n");
  1290. X      printf("IHAVE       NEWNEWS      SLAVE\r\n");
  1291. X!     printf("\r\nAdditionally, the following extention is supported:\r\n\r\n");
  1292. X      printf("XHDR        Retrieve a single header line from a range of articles.\r\n");
  1293. X      printf("\r\n");
  1294. X      printf("Bugs to Stan Barber (Internet: nntp@tmc.edu; UUCP: ...!bcm!nntp)\r\n");
  1295. X      printf(".\r\n");
  1296. X--- 21,38 ----
  1297. X      printf("NEXT        POST         QUIT\r\n");
  1298. X      printf("STAT        NEWGROUPS    HELP\r\n");
  1299. X      printf("IHAVE       NEWNEWS      SLAVE\r\n");
  1300. X! #if defined(XHDR) || defined(XUSER) || defined(XINDEX)
  1301. X!     printf("\r\nAdditionally, the following extentions are supported:\r\n\r\n");
  1302. X! #  ifdef XHDR
  1303. X      printf("XHDR        Retrieve a single header line from a range of articles.\r\n");
  1304. X+ #  endif
  1305. X+ #  ifdef XUSER    
  1306. X+     printf("XUSER       Log a clients username to nntp logfile.\r\n");
  1307. X+ #  endif    
  1308. X+ #  ifdef XINDEX
  1309. X+     printf("XINDEX      Retrieve a tin group index file.\r\n");
  1310. X+ #  endif    
  1311. X+ #endif    
  1312. X      printf("\r\n");
  1313. X      printf("Bugs to Stan Barber (Internet: nntp@tmc.edu; UUCP: ...!bcm!nntp)\r\n");
  1314. X      printf(".\r\n");
  1315. Xdiff -rcs server.old/ihave.c server/ihave.c
  1316. X*** server.old/ihave.c    Mon May  4 07:03:56 1992
  1317. X--- server/ihave.c    Sat Mar  7 11:46:00 1992
  1318. X***************
  1319. X*** 8,14 ****
  1320. X  int    ih_accepted;
  1321. X  int    ih_rejected;
  1322. X  int    ih_failed;
  1323. X! #endif LOG
  1324. X  
  1325. X  /*
  1326. X   * IHAVE <messageid>
  1327. X--- 8,14 ----
  1328. X  int    ih_accepted;
  1329. X  int    ih_rejected;
  1330. X  int    ih_failed;
  1331. X! #endif /* LOG */
  1332. X  
  1333. X  /*
  1334. X   * IHAVE <messageid>
  1335. X***************
  1336. X*** 50,57 ****
  1337. X          ih_rejected++;
  1338. X  #ifdef IHAVE_DEBUG
  1339. X          syslog(LOG_DEBUG, "%s ihave %s rejected", hostname, argv[1]);
  1340. X! #endif IHAVE_DEBUG
  1341. X! #endif LOG
  1342. X          return;
  1343. X      }
  1344. X  
  1345. X--- 50,57 ----
  1346. X          ih_rejected++;
  1347. X  #ifdef IHAVE_DEBUG
  1348. X          syslog(LOG_DEBUG, "%s ihave %s rejected", hostname, argv[1]);
  1349. X! #endif /* IHAVE_DEBUG */
  1350. X! #endif /* LOG */
  1351. X          return;
  1352. X      }
  1353. X  
  1354. X***************
  1355. X*** 100,106 ****
  1356. X  #ifdef IHAVE_DEBUG
  1357. X      syslog(LOG_DEBUG, "%s ihave %s accepted %s",
  1358. X          hostname, argv[1], retcode == 1 ? "succeeded" : "failed");
  1359. X! #endif IHAVE_DEBUG
  1360. X! #endif LOG
  1361. X  
  1362. X  }
  1363. X--- 100,106 ----
  1364. X  #ifdef IHAVE_DEBUG
  1365. X      syslog(LOG_DEBUG, "%s ihave %s accepted %s",
  1366. X          hostname, argv[1], retcode == 1 ? "succeeded" : "failed");
  1367. X! #endif /* IHAVE_DEBUG */
  1368. X! #endif /* LOG */
  1369. X  
  1370. X  }
  1371. Xdiff -rcs server.old/list.c server/list.c
  1372. X*** server.old/list.c    Mon May  4 07:03:56 1992
  1373. X--- server/list.c    Sun Mar  8 11:24:24 1992
  1374. X***************
  1375. X*** 7,14 ****
  1376. X  /*
  1377. X   * LIST
  1378. X   *
  1379. X!  * List active newsgroups, newsgroup descriptions, and distributions.
  1380. X   *
  1381. X   */
  1382. X  
  1383. X  list(argc, argv)
  1384. X--- 7,17 ----
  1385. X  /*
  1386. X   * LIST
  1387. X   *
  1388. X!  * List active newsgroups, newsgroup descriptions, distributions
  1389. X!  * and subscriptions.
  1390. X   *
  1391. X+  *
  1392. X+  *
  1393. X   */
  1394. X  
  1395. X  list(argc, argv)
  1396. X***************
  1397. X*** 45,52 ****
  1398. X          filename = newsgroupsfile;
  1399. X          items = "newsgroup descriptions";
  1400. X          format = "Descriptions in form \"group description\".";
  1401. X      } else {
  1402. X!         printf("%d Usage: LIST [ACTIVE|NEWSGROUPS|DISTRIBUTIONS]\r\n",
  1403. X              ERR_CMDSYN);
  1404. X          (void) fflush(stdout);
  1405. X          return;
  1406. X--- 48,59 ----
  1407. X          filename = newsgroupsfile;
  1408. X          items = "newsgroup descriptions";
  1409. X          format = "Descriptions in form \"group description\".";
  1410. X+     } else if (argc == 2 && !strcasecmp(argv[1],"subscriptions")){
  1411. X+         filename = subscriptionsfile;
  1412. X+         items = "automatic group subscriptions";
  1413. X+         format = "Subscriptions in form \"group\".";
  1414. X      } else {
  1415. X!         printf("%d Usage: LIST [ACTIVE|NEWSGROUPS|DISTRIBUTIONS|SUBSCRIPTIONS]\r\n",
  1416. X              ERR_CMDSYN);
  1417. X          (void) fflush(stdout);
  1418. X          return;
  1419. XFiles server.old/main.c and server/main.c are identical
  1420. Xdiff -rcs server.old/misc.c server/misc.c
  1421. X*** server.old/misc.c    Mon May  4 07:03:56 1992
  1422. X--- server/misc.c    Sat Mar  7 11:46:00 1992
  1423. X***************
  1424. X*** 90,98 ****
  1425. X  # ifndef DBM
  1426. X  #  ifndef USGHIST
  1427. X  #   define USGHIST
  1428. X! #  endif not USGHIST
  1429. X! # endif not DBM
  1430. X! #endif not DBM
  1431. X  
  1432. X  char *
  1433. X  gethistent(msg_id, lookup)
  1434. X--- 90,98 ----
  1435. X  # ifndef DBM
  1436. X  #  ifndef USGHIST
  1437. X  #   define USGHIST
  1438. X! #  endif /* not USGHIST */
  1439. X! # endif /* not DBM */
  1440. X! #endif /* not DBM */
  1441. X  
  1442. X  char *
  1443. X  gethistent(msg_id, lookup)
  1444. X***************
  1445. X*** 107,121 ****
  1446. X  #ifdef USGHIST
  1447. X      char        *histfile();
  1448. X      register int    len;
  1449. X! #else not USGHIST
  1450. X  #ifdef DBM
  1451. X      static int    dbopen = 0;
  1452. X      datum        fetch();
  1453. X! #else not DBM
  1454. X      static DBM    *db = NULL;    /* History file, dbm version */
  1455. X! #endif DBM
  1456. X!     datum         key, content;
  1457. X! #endif USGHIST
  1458. X      static FILE    *hfp = NULL;    /* history file, text version */
  1459. X  
  1460. X  #ifdef CNEWS
  1461. X--- 107,121 ----
  1462. X  #ifdef USGHIST
  1463. X      char        *histfile();
  1464. X      register int    len;
  1465. X! #else /* not USGHIST */
  1466. X  #ifdef DBM
  1467. X      static int    dbopen = 0;
  1468. X      datum        fetch();
  1469. X! #else /* not DBM */
  1470. X      static DBM    *db = NULL;    /* History file, dbm version */
  1471. X! #endif /* DBM */
  1472. X!      datum         key, content;
  1473. X! #endif /* USGHIST */
  1474. X      static FILE    *hfp = NULL;    /* history file, text version */
  1475. X  
  1476. X  #ifdef CNEWS
  1477. X***************
  1478. X*** 140,146 ****
  1479. X      if (hfp == NULL) {
  1480. X  #ifdef SYSLOG
  1481. X          syslog(LOG_ERR, "gethistent: histfile: %m");
  1482. X! #endif SYSLOG
  1483. X          return (NULL);
  1484. X      }
  1485. X  
  1486. X--- 140,146 ----
  1487. X      if (hfp == NULL) {
  1488. X  #ifdef SYSLOG
  1489. X          syslog(LOG_ERR, "gethistent: histfile: %m");
  1490. X! #endif /* SYSLOG */
  1491. X          return (NULL);
  1492. X      }
  1493. X  
  1494. X***************
  1495. X*** 153,159 ****
  1496. X          (void) fclose(hfp);
  1497. X          return (NULL);
  1498. X      }
  1499. X! #else not USGHIST
  1500. X  #ifdef DBM
  1501. X      if (!dbopen) {
  1502. X          if (dbminit(historyfile) < 0) {
  1503. X--- 153,159 ----
  1504. X          (void) fclose(hfp);
  1505. X          return (NULL);
  1506. X      }
  1507. X! #else /* not USGHIST */
  1508. X  #ifdef DBM
  1509. X      if (!dbopen) {
  1510. X          if (dbminit(historyfile) < 0) {
  1511. X***************
  1512. X*** 160,166 ****
  1513. X  #ifdef SYSLOG
  1514. X              syslog(LOG_ERR, "openartbyid: dbminit %s: %m",
  1515. X                  historyfile);
  1516. X! #endif SYSLOG
  1517. X              return (NULL);
  1518. X          } else
  1519. X              dbopen = 1;
  1520. X--- 160,166 ----
  1521. X  #ifdef SYSLOG
  1522. X              syslog(LOG_ERR, "openartbyid: dbminit %s: %m",
  1523. X                  historyfile);
  1524. X! #endif /* SYSLOG */
  1525. X              return (NULL);
  1526. X          } else
  1527. X              dbopen = 1;
  1528. X***************
  1529. X*** 172,182 ****
  1530. X  #ifdef SYSLOG
  1531. X              syslog(LOG_ERR, "openartbyid: dbm_open %s: %m",
  1532. X                  historyfile);
  1533. X! #endif SYSLOG
  1534. X              return (NULL);
  1535. X          }
  1536. X      }
  1537. X! #endif DBM
  1538. X  
  1539. X      key.dptr = msg_id;
  1540. X      key.dsize = strlen(msg_id) + 1;
  1541. X--- 172,182 ----
  1542. X  #ifdef SYSLOG
  1543. X              syslog(LOG_ERR, "openartbyid: dbm_open %s: %m",
  1544. X                  historyfile);
  1545. X! #endif /* SYSLOG */
  1546. X              return (NULL);
  1547. X          }
  1548. X      }
  1549. X! #endif /* DBM */
  1550. X  
  1551. X      key.dptr = msg_id;
  1552. X      key.dsize = strlen(msg_id) + 1;
  1553. X***************
  1554. X*** 185,191 ****
  1555. X      content = fetch(key);
  1556. X  #else    /* ndbm */
  1557. X      content = dbm_fetch(db, key);
  1558. X! #endif DBM
  1559. X      if (content.dptr == NULL)
  1560. X          return (NULL);
  1561. X  
  1562. X--- 185,191 ----
  1563. X      content = fetch(key);
  1564. X  #else    /* ndbm */
  1565. X      content = dbm_fetch(db, key);
  1566. X! #endif /* DBM */
  1567. X      if (content.dptr == NULL)
  1568. X          return (NULL);
  1569. X  
  1570. X***************
  1571. X*** 202,208 ****
  1572. X  #ifdef SYSLOG
  1573. X              syslog(LOG_ERR, "message: fopen %s: %m",
  1574. X                  historyfile);
  1575. X! #endif SYSLOG
  1576. X              return (NULL);
  1577. X          }
  1578. X      } else {
  1579. X--- 202,208 ----
  1580. X  #ifdef SYSLOG
  1581. X              syslog(LOG_ERR, "message: fopen %s: %m",
  1582. X                  historyfile);
  1583. X! #endif /* SYSLOG */
  1584. X              return (NULL);
  1585. X          }
  1586. X      } else {
  1587. X***************
  1588. X*** 215,226 ****
  1589. X  #ifdef SYSLOG
  1590. X          syslog(LOG_ERR, "message: %s: fseek to %ld on %d: %m", 
  1591. X                 historyfile, ltmp, hfp);
  1592. X! #endif SYSLOG
  1593. X          return (NULL);
  1594. X      }
  1595. X  
  1596. X      (void) fgets(line, sizeof(line), hfp);
  1597. X! #endif USGHIST
  1598. X  
  1599. X      if ((cp = index(line, '\n')) != NULL)
  1600. X          *cp = '\0';
  1601. X--- 215,226 ----
  1602. X  #ifdef SYSLOG
  1603. X          syslog(LOG_ERR, "message: %s: fseek to %ld on %d: %m", 
  1604. X                 historyfile, ltmp, hfp);
  1605. X! #endif /* SYSLOG */
  1606. X          return (NULL);
  1607. X      }
  1608. X  
  1609. X      (void) fgets(line, sizeof(line), hfp);
  1610. X! #endif /* USGHIST */
  1611. X  
  1612. X      if ((cp = index(line, '\n')) != NULL)
  1613. X          *cp = '\0';
  1614. X***************
  1615. X*** 232,238 ****
  1616. X          syslog(LOG_ERR,
  1617. X          "message: malformed line in history file at %ld bytes, id %s",
  1618. X              ltmp, msg_id);
  1619. X! #endif SYSLOG
  1620. X      if (cp == NULL) return(NULL); /* this article has expired */
  1621. X      tmp = cp+1;
  1622. X  
  1623. X--- 232,238 ----
  1624. X          syslog(LOG_ERR,
  1625. X          "message: malformed line in history file at %ld bytes, id %s",
  1626. X              ltmp, msg_id);
  1627. X! #endif /* SYSLOG */
  1628. X      if (cp == NULL) return(NULL); /* this article has expired */
  1629. X      tmp = cp+1;
  1630. X  
  1631. X***************
  1632. X*** 613,619 ****
  1633. X          chr = '0';
  1634. X      return chr;
  1635. X  }
  1636. X! #endif USGHIST
  1637. X  #ifdef USG
  1638. X  #ifndef GAZETTE
  1639. X  bcopy(s, d, l)
  1640. X--- 613,619 ----
  1641. X          chr = '0';
  1642. X      return chr;
  1643. X  }
  1644. X! #endif /* USGHIST */
  1645. X  #ifdef USG
  1646. X  #ifndef GAZETTE
  1647. X  bcopy(s, d, l)
  1648. X***************
  1649. X*** 775,781 ****
  1650. X  #define blkavail(fs)    ((fs).f_tfree)
  1651. X                  /* USG doesn't reserve blocks for root */
  1652. X  #define filfree(fs)    ((fs).f_tinode)    
  1653. X! #endif USG
  1654. X  
  1655. X  #ifdef CMU_MACH
  1656. X  /* This code supplied by Tom Lane <tgl@cs.cmu.edu> */
  1657. X--- 775,781 ----
  1658. X  #define blkavail(fs)    ((fs).f_tfree)
  1659. X                  /* USG doesn't reserve blocks for root */
  1660. X  #define filfree(fs)    ((fs).f_tinode)    
  1661. X! #endif /* USG */
  1662. X  
  1663. X  #ifdef CMU_MACH
  1664. X  /* This code supplied by Tom Lane <tgl@cs.cmu.edu> */
  1665. X***************
  1666. X*** 799,805 ****
  1667. X  #define bombed(call)    ((call) < 0)
  1668. X  #define blkfree(fs)    ((fs).fsp_free-((fs).fsp_size*(fs).fsp_minfree+99)/100)
  1669. X  #define blkavail(fs)    (-1)
  1670. X! #endif MACH
  1671. X  
  1672. X  dfree(spool,free_space)
  1673. X  char *spool;
  1674. X--- 799,805 ----
  1675. X  #define bombed(call)    ((call) < 0)
  1676. X  #define blkfree(fs)    ((fs).fsp_free-((fs).fsp_size*(fs).fsp_minfree+99)/100)
  1677. X  #define blkavail(fs)    (-1)
  1678. X! #endif /* MACH */
  1679. X  
  1680. X  dfree(spool,free_space)
  1681. X  char *spool;
  1682. X***************
  1683. X*** 825,831 ****
  1684. X      return( DFREE_OK );
  1685. X  }
  1686. X  
  1687. X! #else READ_SUPER
  1688. X  /*
  1689. X   * This code is used if you've got to directly read the superblock
  1690. X   * to determine how much space you've got left.  It's copied from
  1691. X--- 825,831 ----
  1692. X      return( DFREE_OK );
  1693. X  }
  1694. X  
  1695. X! #else /* READ_SUPER */
  1696. X  /*
  1697. X   * This code is used if you've got to directly read the superblock
  1698. X   * to determine how much space you've got left.  It's copied from
  1699. X***************
  1700. X*** 919,925 ****
  1701. X     return( DFREE_OK );
  1702. X  }
  1703. X  
  1704. X! #endif READ_SUPER
  1705. X  
  1706. X  #ifdef LOAD
  1707. X  /*
  1708. X--- 919,925 ----
  1709. X     return( DFREE_OK );
  1710. X  }
  1711. X  
  1712. X! #endif /* READ_SUPER */
  1713. X  
  1714. X  #ifdef LOAD
  1715. X  /*
  1716. X***************
  1717. X*** 987,990 ****
  1718. X  # endif
  1719. X  }
  1720. X  #endif
  1721. X! #endif LOAD
  1722. X--- 987,990 ----
  1723. X  # endif
  1724. X  }
  1725. X  #endif
  1726. X! #endif /* LOAD */
  1727. Xdiff -rcs server.old/netaux.c server/netaux.c
  1728. X*** server.old/netaux.c    Mon May  4 07:03:56 1992
  1729. X--- server/netaux.c    Sat Mar  7 11:46:00 1992
  1730. X***************
  1731. X*** 12,25 ****
  1732. X  #include <netinet/in.h>
  1733. X  #ifndef EXCELAN
  1734. X  #include <netdb.h>
  1735. X! #endif not EXCELAN
  1736. X  #include <sys/ioctl.h>
  1737. X  #include <signal.h>
  1738. X  #ifdef USG
  1739. X  #include <time.h>
  1740. X! #else not USG
  1741. X  #include <sys/time.h>
  1742. X! #endif USG
  1743. X  
  1744. X  #ifdef ALONE
  1745. X  
  1746. X--- 12,25 ----
  1747. X  #include <netinet/in.h>
  1748. X  #ifndef EXCELAN
  1749. X  #include <netdb.h>
  1750. X! #endif /* not EXCELAN */
  1751. X  #include <sys/ioctl.h>
  1752. X  #include <signal.h>
  1753. X  #ifdef USG
  1754. X  #include <time.h>
  1755. X! #else /* not USG */
  1756. X  #include <sys/time.h>
  1757. X! #endif /* USG */
  1758. X  
  1759. X  #ifdef ALONE
  1760. X  
  1761. X***************
  1762. X*** 211,217 ****
  1763. X      if (setitimer(ITIMER_REAL, &new, &old) < 0) {
  1764. X  #ifdef SYSLOG
  1765. X          syslog(LOG_ERR, "set_timer: setitimer: %m\n");
  1766. X! #endif SYSLOG
  1767. X          exit(1);
  1768. X      }
  1769. X  #endif /* not USG */
  1770. X--- 211,217 ----
  1771. X      if (setitimer(ITIMER_REAL, &new, &old) < 0) {
  1772. X  #ifdef SYSLOG
  1773. X          syslog(LOG_ERR, "set_timer: setitimer: %m\n");
  1774. X! #endif /* SYSLOG */
  1775. X          exit(1);
  1776. X      }
  1777. X  #endif /* not USG */
  1778. XFiles server.old/newgroups.c and server/newgroups.c are identical
  1779. Xdiff -rcs server.old/newnews.c server/newnews.c
  1780. X*** server.old/newnews.c    Mon May  4 07:03:57 1992
  1781. X--- server/newnews.c    Sat Mar  7 11:49:07 1992
  1782. X***************
  1783. X*** 39,45 ****
  1784. X      FILE        *tmplst;
  1785. X      int        i;
  1786. X      char        *tmpfile;
  1787. X! #endif USGHIST
  1788. X  
  1789. X      if (argc < 4) {
  1790. X          printf("%d Usage: NEWNEWS newsgroups yymmdd hhmmss [\"GMT\"] [<distributions>].\r\n",
  1791. X--- 39,45 ----
  1792. X      FILE        *tmplst;
  1793. X      int        i;
  1794. X      char        *tmpfile;
  1795. X! #endif /* USGHIST */
  1796. X  
  1797. X      if (argc < 4) {
  1798. X          printf("%d Usage: NEWNEWS newsgroups yymmdd hhmmss [\"GMT\"] [<distributions>].\r\n",
  1799. X***************
  1800. X*** 131,137 ****
  1801. X  
  1802. X      for (i = 0; i < 9; i++) {
  1803. X          sprintf(historyfile, "%s.d/%d", HISTORY_FILE, i);
  1804. X! #endif USGHIST
  1805. X  
  1806. X      fp = fopen(historyfile, "r");
  1807. X      if (fp == NULL) {
  1808. X--- 131,137 ----
  1809. X  
  1810. X      for (i = 0; i < 9; i++) {
  1811. X          sprintf(historyfile, "%s.d/%d", HISTORY_FILE, i);
  1812. X! #endif /* USGHIST */
  1813. X  
  1814. X      fp = fopen(historyfile, "r");
  1815. X      if (fp == NULL) {
  1816. X***************
  1817. X*** 142,167 ****
  1818. X          printf("%d Cannot open history file.\r\n", ERR_FAULT);
  1819. X          (void) fflush(stdout);
  1820. X          return;
  1821. X! #else USGHIST
  1822. X          continue;
  1823. X! #endif USGHIST
  1824. X      }
  1825. X  
  1826. X  #ifndef USGHIST
  1827. X      printf("%d New news by message id follows\r\n", OK_NEWNEWS);
  1828. X! #endif not USGHIST
  1829. X  
  1830. X      if (seekuntil(fp, key, line, sizeof (line)) < 0) {
  1831. X  #ifndef USGHIST
  1832. X          printf(".\r\n");
  1833. X          (void) fflush(stdout);
  1834. X! #endif not USGHIST
  1835. X          (void) fclose(fp);
  1836. X  #ifndef USGHIST
  1837. X          return;
  1838. X! #else USGHIST
  1839. X          continue;
  1840. X! #endif USGHIST
  1841. X      }
  1842. X  
  1843. X  /*
  1844. X--- 142,167 ----
  1845. X          printf("%d Cannot open history file.\r\n", ERR_FAULT);
  1846. X          (void) fflush(stdout);
  1847. X          return;
  1848. X! #else /* USGHIST */
  1849. X          continue;
  1850. X! #endif /* USGHIST */
  1851. X      }
  1852. X  
  1853. X  #ifndef USGHIST
  1854. X      printf("%d New news by message id follows\r\n", OK_NEWNEWS);
  1855. X! #endif /* not USGHIST */
  1856. X  
  1857. X      if (seekuntil(fp, key, line, sizeof (line)) < 0) {
  1858. X  #ifndef USGHIST
  1859. X          printf(".\r\n");
  1860. X          (void) fflush(stdout);
  1861. X! #endif /* not USGHIST */
  1862. X          (void) fclose(fp);
  1863. X  #ifndef USGHIST
  1864. X          return;
  1865. X! #else /* USGHIST */
  1866. X          continue;
  1867. X! #endif /* USGHIST */
  1868. X      }
  1869. X  
  1870. X  /*
  1871. X***************
  1872. X*** 208,216 ****
  1873. X  #ifdef USGHIST
  1874. X          fputs(line, tmplst);
  1875. X          fputc('\n', tmplst);
  1876. X! #else not USGHIST
  1877. X          putline(line);
  1878. X! #endif not USGHIST
  1879. X  #ifdef LOG
  1880. X          nn_told++;
  1881. X  #endif
  1882. X--- 208,216 ----
  1883. X  #ifdef USGHIST
  1884. X          fputs(line, tmplst);
  1885. X          fputc('\n', tmplst);
  1886. X! #else /* not USGHIST */
  1887. X          putline(line);
  1888. X! #endif /* not USGHIST */
  1889. X  #ifdef LOG
  1890. X          nn_told++;
  1891. X  #endif
  1892. X***************
  1893. X*** 235,241 ****
  1894. X      (void) fflush(stdout);
  1895. X      (void) fclose(tmplst);
  1896. X      (void) unlink(tmpfile);
  1897. X! #endif USGHIST
  1898. X  }
  1899. X  
  1900. X  
  1901. X--- 235,241 ----
  1902. X      (void) fflush(stdout);
  1903. X      (void) fclose(tmplst);
  1904. X      (void) unlink(tmpfile);
  1905. X! #endif /* USGHIST */
  1906. X  }
  1907. X  
  1908. X  
  1909. XFiles server.old/nextlast.c and server/nextlast.c are identical
  1910. XFiles server.old/ngmatch.c and server/ngmatch.c are identical
  1911. XFiles server.old/parsit.c and server/parsit.c are identical
  1912. XFiles server.old/post.c and server/post.c are identical
  1913. XFiles server.old/profile.c and server/profile.c are identical
  1914. Xdiff -rcs server.old/scandir.c server/scandir.c
  1915. X*** server.old/scandir.c    Mon May  4 07:03:57 1992
  1916. X--- server/scandir.c    Sat Mar  7 11:46:00 1992
  1917. X***************
  1918. X*** 4,9 ****
  1919. X--- 4,13 ----
  1920. X  
  1921. X  #include "common.h"
  1922. X  
  1923. X+ #ifdef ISC
  1924. X+ #    include <dirent.h>
  1925. X+ #endif
  1926. X+ 
  1927. X  /*
  1928. X   * scan_dir -- scan the current directory for news articles,
  1929. X   *    loading the article numbers into art_array.  Return
  1930. X***************
  1931. X*** 26,32 ****
  1932. X--- 30,40 ----
  1933. X  scan_dir(low_msg, high_msg)
  1934. X  int    low_msg, high_msg;
  1935. X  {
  1936. X+ #ifdef ISC
  1937. X+     register struct dirent    *dirent;
  1938. X+ #else
  1939. X      register struct direct    *dirent;
  1940. X+ #endif
  1941. X      register DIR        *dirp;
  1942. X      int            artnum;
  1943. X  
  1944. X***************
  1945. X*** 34,43 ****
  1946. X  
  1947. X      dirp = opendir(".");
  1948. X  
  1949. X!     if (dirp == NULL)
  1950. X          return (0);
  1951. X  
  1952. X      while ((dirent = readdir(dirp)) != NULL) {
  1953. X          artnum = atoi(dirent->d_name);
  1954. X  #ifdef DYNAMIC_ART_ARRAY
  1955. X          if (artnum == 0 || artnum < low_msg || artnum > high_msg)
  1956. X--- 42,73 ----
  1957. X  
  1958. X      dirp = opendir(".");
  1959. X  
  1960. X!     if (dirp == NULL) {
  1961. X! #ifdef LOG
  1962. X!         syslog(LOG_ERR, "scan_dir(): opendir() failed. Returning num_arts=0");
  1963. X! #endif
  1964. X          return (0);
  1965. X+     }
  1966. X  
  1967. X      while ((dirent = readdir(dirp)) != NULL) {
  1968. X+ 
  1969. X+ #ifdef LOG
  1970. X+ /*
  1971. X+ {
  1972. X+         char pwd[256];
  1973. X+     
  1974. X+         getcwd (pwd, 255);
  1975. X+ #ifdef ISC
  1976. X+         syslog(LOG_INFO, "%s: d->d_name=%s  d->d_ino=%d  d->d_reclen=%d",
  1977. X+             pwd, dirent->d_name, dirent->d_ino, dirent->d_reclen);
  1978. X+ #else        
  1979. X+         syslog(LOG_INFO, "%s: d->d_name=%s  d->d_ino=%d",
  1980. X+             pwd, dirent->d_name, dirent->d_ino);
  1981. X+ #endif
  1982. X+ }
  1983. X+ */            
  1984. X+ #endif
  1985. X+     
  1986. X          artnum = atoi(dirent->d_name);
  1987. X  #ifdef DYNAMIC_ART_ARRAY
  1988. X          if (artnum == 0 || artnum < low_msg || artnum > high_msg)
  1989. X***************
  1990. X*** 70,75 ****
  1991. X--- 100,110 ----
  1992. X          }
  1993. X          art_array[num_arts] = artnum;
  1994. X           ++num_arts;
  1995. X+ 
  1996. X+ #ifdef LOG
  1997. X+         syslog(LOG_INFO, "scan_dir(): artnum=%d  num_arts=%d", artnum, num_arts);
  1998. X+ #endif
  1999. X+ 
  2000. X  #else
  2001. X          if (artnum != 0 && artnum >= low_msg && artnum <= high_msg)
  2002. X              art_array[num_arts++] = artnum;
  2003. Xdiff -rcs server.old/serve.c server/serve.c
  2004. X*** server.old/serve.c    Mon May  4 07:03:57 1992
  2005. X--- server/serve.c    Tue Mar 10 09:32:32 1992
  2006. X***************
  2007. X*** 17,23 ****
  2008. X  #ifdef LOG
  2009. X  # ifndef USG
  2010. X  #  include <sys/resource.h>
  2011. X! # endif not USG
  2012. X  #endif
  2013. X  
  2014. X  #ifdef TIMERS
  2015. X--- 17,23 ----
  2016. X  #ifdef LOG
  2017. X  # ifndef USG
  2018. X  #  include <sys/resource.h>
  2019. X! # endif /* not USG */
  2020. X  #endif
  2021. X  
  2022. X  #ifdef TIMERS
  2023. X***************
  2024. X*** 27,38 ****
  2025. X  extern    int    ahbs(), group(), help(), ihave();
  2026. X  extern    int    list(), newgroups(), newnews(), nextlast(), post();
  2027. X  extern    int    slave(), stat(), xhdr();
  2028. X  
  2029. X  extern int errno;
  2030. X  
  2031. X  #ifdef AUTH
  2032. X  extern    int    doauth();
  2033. X! #endif AUTH
  2034. X  
  2035. X  static struct cmdent {
  2036. X      char    *cmd_name;
  2037. X--- 27,44 ----
  2038. X  extern    int    ahbs(), group(), help(), ihave();
  2039. X  extern    int    list(), newgroups(), newnews(), nextlast(), post();
  2040. X  extern    int    slave(), stat(), xhdr();
  2041. X+ #ifdef XUSER
  2042. X+ extern    int    xuser();
  2043. X+ #endif
  2044. X+ #ifdef XINDEX
  2045. X+ extern    int    xindex();
  2046. X+ #endif
  2047. X  
  2048. X  extern int errno;
  2049. X  
  2050. X  #ifdef AUTH
  2051. X  extern    int    doauth();
  2052. X! #endif /* AUTH */
  2053. X  
  2054. X  static struct cmdent {
  2055. X      char    *cmd_name;
  2056. X***************
  2057. X*** 43,49 ****
  2058. X      "authcap",    0,    doauth,
  2059. X      "authinfo",    0,    doauth,
  2060. X      "authsys",    0,    doauth,
  2061. X! #endif AUTH
  2062. X      "article",    0,    ahbs,
  2063. X      "body",        0,    ahbs,
  2064. X      "group",    0,    group,
  2065. X--- 49,55 ----
  2066. X      "authcap",    0,    doauth,
  2067. X      "authinfo",    0,    doauth,
  2068. X      "authsys",    0,    doauth,
  2069. X! #endif /* AUTH */
  2070. X      "article",    0,    ahbs,
  2071. X      "body",        0,    ahbs,
  2072. X      "group",    0,    group,
  2073. X***************
  2074. X*** 60,66 ****
  2075. X      "stat",        0,    ahbs,
  2076. X  #ifdef XHDR
  2077. X      "xhdr",        0,    xhdr,
  2078. X! #endif XHDR
  2079. X  };
  2080. X  #define NUMCMDS (sizeof(cmdtbl) / sizeof(struct cmdent))
  2081. X  
  2082. X--- 66,78 ----
  2083. X      "stat",        0,    ahbs,
  2084. X  #ifdef XHDR
  2085. X      "xhdr",        0,    xhdr,
  2086. X! #endif /* XHDR */
  2087. X! #ifdef XUSER
  2088. X!     "xuser",    0,    xuser,
  2089. X! #endif /* XUSER */
  2090. X! #ifdef XINDEX
  2091. X!     "xindex",    0,    xindex,
  2092. X! #endif /* XINDEX */
  2093. X  };
  2094. X  #define NUMCMDS (sizeof(cmdtbl) / sizeof(struct cmdent))
  2095. X  
  2096. X***************
  2097. X*** 98,104 ****
  2098. X  #ifdef AUTH
  2099. X  extern int    Needauth;
  2100. X  extern char    User[];
  2101. X! #endif AUTH
  2102. X  
  2103. X  /*
  2104. X   * serve -- given a connection on stdin/stdout, serve
  2105. X--- 110,116 ----
  2106. X  #ifdef AUTH
  2107. X  extern int    Needauth;
  2108. X  extern char    User[];
  2109. X! #endif /* AUTH */
  2110. X  
  2111. X  /*
  2112. X   * serve -- given a connection on stdin/stdout, serve
  2113. X***************
  2114. X*** 152,158 ****
  2115. X  #ifdef ALONE
  2116. X  #ifndef USG
  2117. X      (void) signal(SIGCHLD, SIG_IGN);
  2118. X! #endif not USG
  2119. X  #endif
  2120. X  
  2121. X      /* Ignore SIGPIPE, since we'll see closed connections with read */
  2122. X--- 164,170 ----
  2123. X  #ifdef ALONE
  2124. X  #ifndef USG
  2125. X      (void) signal(SIGCHLD, SIG_IGN);
  2126. X! #endif /* not USG */
  2127. X  #endif
  2128. X  
  2129. X      /* Ignore SIGPIPE, since we'll see closed connections with read */
  2130. X***************
  2131. X*** 163,169 ****
  2132. X  #ifdef AUTH
  2133. X      Needauth = 1;
  2134. X      strcpy(User,"");
  2135. X! #endif AUTH
  2136. X      host_access(&canread, &canpost, &canxfer, gdbuf);
  2137. X  
  2138. X      if (gethostname(host, sizeof(host)) < 0)
  2139. X--- 175,181 ----
  2140. X  #ifdef AUTH
  2141. X      Needauth = 1;
  2142. X      strcpy(User,"");
  2143. X! #endif /* AUTH */
  2144. X      host_access(&canread, &canpost, &canxfer, gdbuf);
  2145. X  
  2146. X      if (gethostname(host, sizeof(host)) < 0)
  2147. X***************
  2148. X*** 302,308 ****
  2149. X                  (void) fflush(stdout);
  2150. X                  continue;
  2151. X                  }
  2152. X! #endif AUTH
  2153. X              (*cmdtbl[i].cmd_fctn)(argnum, argp);
  2154. X          } else {
  2155. X  #ifdef SYSLOG
  2156. X--- 314,320 ----
  2157. X                  (void) fflush(stdout);
  2158. X                  continue;
  2159. X                  }
  2160. X! #endif /* AUTH */
  2161. X              (*cmdtbl[i].cmd_fctn)(argnum, argp);
  2162. X          } else {
  2163. X  #ifdef SYSLOG
  2164. X***************
  2165. X*** 490,493 ****
  2166. X          user, sys, Tfinish - Tstart);
  2167. X      syslog(LOG_INFO, "%s times %s", hostname, buf);
  2168. X  }
  2169. X! #endif LOG
  2170. X--- 502,505 ----
  2171. X          user, sys, Tfinish - Tstart);
  2172. X      syslog(LOG_INFO, "%s times %s", hostname, buf);
  2173. X  }
  2174. X! #endif /* LOG */
  2175. XFiles server.old/slave.c and server/slave.c are identical
  2176. Xdiff -rcs server.old/spawn.c server/spawn.c
  2177. X*** server.old/spawn.c    Mon May  4 07:03:58 1992
  2178. X--- server/spawn.c    Sat Mar  7 11:46:00 1992
  2179. X***************
  2180. X*** 65,73 ****
  2181. X  #endif
  2182. X  #ifdef USG
  2183. X      int        status;
  2184. X! #else not USG
  2185. X      union wait    status;
  2186. X! #endif not USG
  2187. X      register FILE    *fp;
  2188. X  
  2189. X  #ifdef CNEWS
  2190. X--- 65,73 ----
  2191. X  #endif
  2192. X  #ifdef USG
  2193. X      int        status;
  2194. X! #else /* not USG */
  2195. X      union wait    status;
  2196. X! #endif /* not USG */
  2197. X      register FILE    *fp;
  2198. X  
  2199. X  #ifdef CNEWS
  2200. X***************
  2201. X*** 91,97 ****
  2202. X      */
  2203. X      if (cont_code == CONT_POST)
  2204. X          fprintf(fp, "Nntp-Posting-Host: %s\n", hostname);
  2205. X! #endif AUTH
  2206. X  
  2207. X      printf("%d Ok\r\n", cont_code);
  2208. X      (void) fflush(stdout);
  2209. X--- 91,97 ----
  2210. X      */
  2211. X      if (cont_code == CONT_POST)
  2212. X          fprintf(fp, "Nntp-Posting-Host: %s\n", hostname);
  2213. X! #endif /* AUTH */
  2214. X  
  2215. X      printf("%d Ok\r\n", cont_code);
  2216. X      (void) fflush(stdout);
  2217. X***************
  2218. X*** 332,338 ****
  2219. X  
  2220. X  #ifdef LOG
  2221. X      syslog(LOG_ERR, "%s transfer_timeout", hostname);
  2222. X! #endif LOG
  2223. X  
  2224. X      (void) unlink(tempfile);
  2225. X  
  2226. X--- 332,338 ----
  2227. X  
  2228. X  #ifdef LOG
  2229. X      syslog(LOG_ERR, "%s transfer_timeout", hostname);
  2230. X! #endif /* LOG */
  2231. X  
  2232. X      (void) unlink(tempfile);
  2233. X  
  2234. X***************
  2235. X*** 339,343 ****
  2236. X      exit(1);
  2237. X  }
  2238. X  
  2239. X! #endif XFER_TIMEOUT
  2240. X  
  2241. X--- 339,343 ----
  2242. X      exit(1);
  2243. X  }
  2244. X  
  2245. X! #endif /* XFER_TIMEOUT */
  2246. X  
  2247. XFiles server.old/strcasecmp.c and server/strcasecmp.c are identical
  2248. Xdiff -rcs server.old/subnet.c server/subnet.c
  2249. X*** server.old/subnet.c    Mon May  4 07:03:58 1992
  2250. X--- server/subnet.c    Sat Mar  7 11:46:00 1992
  2251. X***************
  2252. X*** 1,5 ****
  2253. X  #ifndef lint
  2254. X! static    char    *sccsid = "@(#)$Header: subnet.c,v 1.8 90/12/12 02:21:38 sob Exp $";
  2255. X  #endif
  2256. X  
  2257. X  #include "../common/conf.h"
  2258. X--- 1,5 ----
  2259. X  #ifndef lint
  2260. X! static    char    *sccsid = "@(#)$Header: subnet.c,v 1.9 91/03/19 03:02:30 sob Exp $";
  2261. X  #endif
  2262. X  
  2263. X  #include "../common/conf.h"
  2264. X***************
  2265. X*** 7,19 ****
  2266. X  #ifdef SUBNET
  2267. X  
  2268. X  #include <sys/types.h>
  2269. X  #include <sys/socket.h>
  2270. X  #include <netinet/in.h>
  2271. X  #ifndef NETMASK
  2272. X  #include <net/if.h>
  2273. X  #endif
  2274. X  #include <sys/ioctl.h>
  2275. X! 
  2276. X  /*
  2277. X   * The following routines provide a general interface for
  2278. X   * subnet support.  Like the library function "inet_netof",
  2279. X--- 7,26 ----
  2280. X  #ifdef SUBNET
  2281. X  
  2282. X  #include <sys/types.h>
  2283. X+ #ifdef LAI_TCP
  2284. X+ #include <sys/bsdtypes.h>
  2285. X+ #include <sys/stream.h>
  2286. X+ #endif
  2287. X  #include <sys/socket.h>
  2288. X  #include <netinet/in.h>
  2289. X  #ifndef NETMASK
  2290. X  #include <net/if.h>
  2291. X  #endif
  2292. X+ #ifdef LAI_TCP
  2293. X+ #include <sys/sioctl.h>
  2294. X+ #else
  2295. X  #include <sys/ioctl.h>
  2296. X! #endif
  2297. X  /*
  2298. X   * The following routines provide a general interface for
  2299. X   * subnet support.  Like the library function "inet_netof",
  2300. Xdiff -rcs server.old/time.c server/time.c
  2301. X*** server.old/time.c    Mon May  4 07:03:58 1992
  2302. X--- server/time.c    Sat Mar  7 11:46:00 1992
  2303. X***************
  2304. X*** 10,18 ****
  2305. X  #include "common.h"
  2306. X  #ifdef USG
  2307. X  #include <time.h>
  2308. X! #else not USG
  2309. X  #include <sys/time.h>
  2310. X! #endif not USG
  2311. X  
  2312. X  /*
  2313. X   * dtol -- convert date to long integer.  This is not implicitly
  2314. X--- 10,18 ----
  2315. X  #include "common.h"
  2316. X  #ifdef USG
  2317. X  #include <time.h>
  2318. X! #else /* not USG */
  2319. X  #include <sys/time.h>
  2320. X! #endif /* not USG */
  2321. X  
  2322. X  /*
  2323. X   * dtol -- convert date to long integer.  This is not implicitly
  2324. XFiles server.old/time.h and server/time.h are identical
  2325. Xdiff -rcs server.old/timer.c server/timer.c
  2326. X*** server.old/timer.c    Mon May  4 07:03:58 1992
  2327. X--- server/timer.c    Sat Mar  7 11:46:00 1992
  2328. X***************
  2329. X*** 6,17 ****
  2330. X  #ifdef TIMERS
  2331. X  #ifndef lint
  2332. X  static char rcsid[] =
  2333. X!     "@(#) $Header: timer.c,v 1.2 90/12/27 22:16:27 sob Exp $ (NNTP with TIMERS)";
  2334. X  #endif
  2335. X  #else
  2336. X  #ifndef lint
  2337. X  static char rcsid[] =
  2338. X!     "@(#) $Header: timer.c,v 1.2 90/12/27 22:16:27 sob Exp $ (NNTP without TIMERS)";
  2339. X  #endif
  2340. X  #endif
  2341. X  
  2342. X--- 6,17 ----
  2343. X  #ifdef TIMERS
  2344. X  #ifndef lint
  2345. X  static char rcsid[] =
  2346. X!     "@(#) $Header: timer.c,v 1.3 91/03/19 03:02:41 sob Exp $ (NNTP with TIMERS)";
  2347. X  #endif
  2348. X  #else
  2349. X  #ifndef lint
  2350. X  static char rcsid[] =
  2351. X!     "@(#) $Header: timer.c,v 1.3 91/03/19 03:02:41 sob Exp $ (NNTP without TIMERS)";
  2352. X  #endif
  2353. X  #endif
  2354. X  
  2355. X***************
  2356. X*** 18,24 ****
  2357. X  #ifdef TIMERS
  2358. X  #include <sys/time.h>
  2359. X  #include "timer.h"
  2360. X! #ifndef USG
  2361. X  #ifndef FD_SETSIZE
  2362. X  /* Forward compatability */
  2363. X  #define FD_SET(n, p)    ((p)->fds_bits[0] |= (1<<(n)))
  2364. X--- 18,29 ----
  2365. X  #ifdef TIMERS
  2366. X  #include <sys/time.h>
  2367. X  #include "timer.h"
  2368. X! #ifdef USG
  2369. X! #ifdef LAI_TCP
  2370. X! #include <sys/bsdtypes.h>
  2371. X! #define BSDSELECT
  2372. X! #endif
  2373. X! #else
  2374. X  #ifndef FD_SETSIZE
  2375. X  /* Forward compatability */
  2376. X  #define FD_SET(n, p)    ((p)->fds_bits[0] |= (1<<(n)))
  2377. X***************
  2378. X*** 25,30 ****
  2379. X--- 30,36 ----
  2380. X  #define FD_CLR(n, p)    ((p)->fds_bits[0] &= ~(1<<(n)))
  2381. X  #define FD_ISSET(n, p)  ((p)->fds_bits[0] & (1<<(n)))
  2382. X  #define FD_ZERO(p)      ((p)->fds_bits[0] = 0)
  2383. X+ #define BSDSELECT
  2384. X  #endif
  2385. X  #endif
  2386. X  /* non-portable */
  2387. X***************
  2388. X*** 69,75 ****
  2389. X      register int i, n;
  2390. X      register struct timer *tp;
  2391. X      register long secs;
  2392. X! #ifdef USG
  2393. X      long timeout;
  2394. X      long readfds;
  2395. X  #else
  2396. X--- 75,81 ----
  2397. X      register int i, n;
  2398. X      register struct timer *tp;
  2399. X      register long secs;
  2400. X! #ifndef BSDSELECT
  2401. X      long timeout;
  2402. X      long readfds;
  2403. X  #else
  2404. X***************
  2405. X*** 83,89 ****
  2406. X          return(1);
  2407. X  
  2408. X      /* Length of next timeout is minimum of all "timers" */
  2409. X! #ifdef USG
  2410. X      timeout = -1;
  2411. X      for (i = ntimer, tp = timers; i > 0; --i, ++tp)
  2412. X          if (tp->left >= 0 &&
  2413. X--- 89,95 ----
  2414. X          return(1);
  2415. X  
  2416. X      /* Length of next timeout is minimum of all "timers" */
  2417. X! #ifndef BSDSELECT
  2418. X      timeout = -1;
  2419. X      for (i = ntimer, tp = timers; i > 0; --i, ++tp)
  2420. X          if (tp->left >= 0 &&
  2421. X***************
  2422. X*** 114,122 ****
  2423. X      /* Do select */
  2424. X      FD_ZERO(&readfds);
  2425. X      FD_SET(fileno(stdin), &readfds);
  2426. X! #endif /* !USG */
  2427. X      errno = 0;
  2428. X! #ifdef EXCELAN
  2429. X      n = select(fileno(stdin) + 1, &readfds, (long*)0, timeout);
  2430. X  #else
  2431. X      n = select(fileno(stdin) + 1,
  2432. X--- 120,128 ----
  2433. X      /* Do select */
  2434. X      FD_ZERO(&readfds);
  2435. X      FD_SET(fileno(stdin), &readfds);
  2436. X! #endif /* BSDSELECT */
  2437. X      errno = 0;
  2438. X! #if defined(EXCELAN) || defined(ULTRIX)
  2439. X      n = select(fileno(stdin) + 1, &readfds, (long*)0, timeout);
  2440. X  #else
  2441. X      n = select(fileno(stdin) + 1,
  2442. XFiles server.old/timer.h and server/timer.h are identical
  2443. Xdiff -rcs server.old/xhdr.c server/xhdr.c
  2444. X*** server.old/xhdr.c    Mon May  4 07:03:58 1992
  2445. X--- server/xhdr.c    Sat Mar  7 11:46:00 1992
  2446. X***************
  2447. X*** 158,164 ****
  2448. X      }
  2449. X  }
  2450. X  
  2451. X! #else not XHDR
  2452. X  
  2453. X  /* Kludge to get around Greenhills C compiler */
  2454. X  
  2455. X--- 158,164 ----
  2456. X      }
  2457. X  }
  2458. X  
  2459. X! #else /* not XHDR */
  2460. X  
  2461. X  /* Kludge to get around Greenhills C compiler */
  2462. X  
  2463. X***************
  2464. X*** 166,169 ****
  2465. X  {
  2466. X  }
  2467. X  
  2468. X! #endif not XHDR
  2469. X--- 166,169 ----
  2470. X  {
  2471. X  }
  2472. X  
  2473. X! #endif /* not XHDR */
  2474. XOnly in server: xindex.c
  2475. XOnly in server: xuser.c
  2476. END_OF_FILE
  2477.   if test 34102 -ne `wc -c <'server.patch'`; then
  2478.     echo shar: \"'server.patch'\" unpacked with wrong size!
  2479.   fi
  2480.   # end of 'server.patch'
  2481. fi
  2482. echo shar: End of archive 3 \(of 15\).
  2483. cp /dev/null ark3isdone
  2484. MISSING=""
  2485. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  2486.     if test ! -f ark${I}isdone ; then
  2487.     MISSING="${MISSING} ${I}"
  2488.     fi
  2489. done
  2490. if test "${MISSING}" = "" ; then
  2491.     echo You have unpacked all 15 archives.
  2492.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2493. else
  2494.     echo You still must unpack the following archives:
  2495.     echo "        " ${MISSING}
  2496. fi
  2497. exit 0
  2498. exit 0 # Just in case...
  2499.