home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / trn / part06 / common.h < prev    next >
C/C++ Source or Header  |  1991-08-22  |  28KB  |  984 lines

  1. /* $Header: common.h,v 4.3.3.3 91/01/16 02:00:32 davison Trn $
  2.  * 
  3.  * $Log:    common.h,v $
  4.  * Revision 4.3.3.3  91/01/16  16:28:32  davison
  5.  * integrated rn patches 48-54 and tweaked defines a bit.
  6.  * 
  7.  * Revision 4.3.3.2  90/08/20  16:28:32  davison
  8.  * Tweaked a couple rn's into trn's.
  9.  * 
  10.  * Revision 4.3.3.1  90/07/21  20:15:23  davison
  11.  * Initial Trn Release
  12.  * 
  13.  * Revision 4.3.2.23  90/12/30  23:58:59  sob
  14.  * Fixed CANCELHEADER.
  15.  * 
  16.  * Revision 4.3.2.22  90/12/04  02:51:59  sob
  17.  * removed _SYS_TYPE.H label
  18.  * 
  19.  * Revision 4.3.2.21  90/11/23  10:39:49  sob
  20.  * cleaned up more cruft.
  21.  * 
  22.  * Revision 4.3.2.20  90/11/22  13:18:28  sob
  23.  * Conditionalized TRUE and FALSE to compensate for AIX which has its own
  24.  * definitions.
  25.  * 
  26.  * Revision 4.3.2.19  90/11/09  23:15:12  sob
  27.  * Added sys/stream.h since sys/ptem.h depends on it.
  28.  * 
  29.  * Revision 4.3.2.18  90/11/06  00:11:04  sob
  30.  * Attempt to deal with USG C compilers that can't cope with mutiple
  31.  * includes of the same include file.
  32.  * 
  33.  * Revision 4.3.2.17  90/11/05  23:29:37  sob
  34.  * Added the include of /usr/include/sys/ptem.h if defined in config.h.
  35.  * 
  36.  * Revision 4.3.2.16  90/11/04  03:34:32  sob
  37.  * Changed and moved GETWD to Configure.
  38.  * 
  39.  * Revision 4.3.2.15  90/10/01  02:07:36  sob
  40.  * Increased LBUFLEN from 512 to 1024 per request of ken@csis.dit.csiro.au.
  41.  * 
  42.  * Revision 4.3.2.14  90/10/01  01:56:06  sob
  43.  * Fixed problem with the call to MBOXSAVER reported by news@twwells.com.
  44.  * 
  45.  * Revision 4.3.2.13  90/05/08  22:05:37  sob
  46.  * Added quick startup (-q) flag.
  47.  * 
  48.  * Revision 4.3.2.12  90/04/23  00:32:04  sob
  49.  * More cleanup.
  50.  * 
  51.  * Revision 4.3.2.11  90/04/14  19:37:07  sob
  52.  * Added better support for the NeXT.
  53.  * 
  54.  * Revision 4.3.2.10  90/04/06  20:54:12  sob
  55.  * Corrected forward definition of fseek()
  56.  * 
  57.  * Revision 4.3.2.9  90/03/17  21:19:04  sob
  58.  * Removed the incorrect forward definition of sprintf().
  59.  * 
  60.  * Revision 4.3.2.8  89/12/20  20:40:03  sob
  61.  * Changed ACT_POS from short to long per suggestion from eps@cd.SFSU.EDU.
  62.  * 
  63.  * Revision 4.3.2.7  89/12/08  22:43:12  sob
  64.  * Corrected typo pointed out by weening@gang-of-four.stanford.edu
  65.  * 
  66.  * Revision 4.3.2.6  89/11/28  01:57:31  sob
  67.  * Added initlines_specified variable for use with SIGWINCH support.
  68.  * 
  69.  * Revision 4.3.2.5  89/11/28  00:30:56  sob
  70.  * Reversed the CANCELHEADER definitions.
  71.  * 
  72.  * Revision 4.3.2.4  89/11/27  01:29:23  sob
  73.  * Altered NNTP code per ideas suggested by Bela Lubkin
  74.  * <filbo@gorn.santa-cruz.ca.us>
  75.  * 
  76.  * Revision 4.3.2.3  89/11/26  19:32:06  sob
  77.  * Increased the size of MAXRCLINE from 1000 to 1500
  78.  * Increated HASHSIZ from 1103 to 1693
  79.  * 
  80.  * Revision 4.3.2.2  89/11/07  23:18:49  sob
  81.  * Repaired NEWSHEADER and CANCEL to work correctly with NNTP and INTERNET.
  82.  * 
  83.  * Revision 4.3.2.1  89/11/06  00:12:33  sob
  84.  * Added RRN support from NNTP 1.5
  85.  * 
  86.  * Revision 4.3.1.4  86/10/31  15:46:09  lwall
  87.  * Expanded maximum number of .newsrc lines for net reorganization.
  88.  * 
  89.  * Revision 4.3.1.3  85/05/23  17:19:32  lwall
  90.  * Now allows 'r' and 'f' on null articles.
  91.  * 
  92.  * Revision 4.3.1.2  85/05/13  09:30:39  lwall
  93.  * Added CUSTOMLINES option.
  94.  * 
  95.  * Revision 4.3.1.1  85/05/10  11:32:04  lwall
  96.  * Branch for patches.
  97.  * 
  98.  * Revision 4.3  85/05/01  11:37:11  lwall
  99.  * Baseline for release with 4.3bsd.
  100.  * 
  101.  */
  102.  
  103. #include <stdio.h>
  104. #include <sys/types.h>
  105. #include <sys/stat.h>
  106. #include <ctype.h>
  107. #include "config.h"    /* generated by installation script */
  108. #ifdef WHOAMI
  109. #    include <whoami.h>
  110. #endif
  111. #ifndef isalnum
  112. #   define isalnum(c) (isalpha(c) || isdigit(c))
  113. #endif
  114.  
  115. #include <errno.h>
  116. #include <signal.h>
  117. #ifdef IOCTL
  118. #include <sys/ioctl.h>
  119. #endif
  120.  
  121. #ifdef FCNTL
  122. #   include <fcntl.h>
  123. #endif
  124.  
  125. #ifdef TERMIO
  126. #   include <termio.h>
  127. #else
  128. #   include <sgtty.h>
  129. #endif
  130.  
  131. #ifdef GETPWENT
  132. #   include <pwd.h>
  133. #endif
  134.  
  135. #ifdef PTEM
  136. #include <sys/stream.h>
  137. #include <sys/ptem.h>
  138. #endif
  139.  
  140. #define BITSPERBYTE 8
  141. #ifdef pdp11
  142. #define LBUFLEN 512    /* line buffer length */
  143. #else
  144. #define LBUFLEN 1024    /* line buffer length */
  145. #endif
  146.             /* (don't worry, .newsrc lines can exceed this) */
  147. #ifdef pdp11
  148. #   define CBUFLEN 256    /* command buffer length */
  149. #   define PUSHSIZE 128
  150. #else
  151. #   define CBUFLEN 512    /* command buffer length */
  152. #   define PUSHSIZE 256
  153. #endif
  154. #ifdef pdp11
  155. #   define MAXFILENAME 128
  156. #else
  157. #   define MAXFILENAME 512
  158. #endif
  159. #define LONGKEY 15    /* longest keyword: currently "posting-version" */
  160. #define FINISHCMD 0177
  161.  
  162. /* some handy defs */
  163.  
  164. #define bool char
  165. #ifndef TRUE
  166. #define TRUE (1)
  167. #endif
  168. #ifndef FALSE
  169. #define FALSE (0)
  170. #endif
  171. #define Null(t) ((t)0)
  172. #define Nullch Null(char *)
  173. #define Nullfp Null(FILE *)
  174.  
  175. #define Ctl(ch) (ch & 037)
  176.  
  177. #define strNE(s1,s2) (strcmp(s1,s2))
  178. #define strEQ(s1,s2) (!strcmp(s1,s2))
  179. #define strnNE(s1,s2,l) (strncmp(s1,s2,l))
  180. #define strnEQ(s1,s2,l) (!strncmp(s1,s2,l))
  181.  
  182. /* Things we can figure out ourselves */
  183.  
  184. #ifdef SIGTSTP
  185. #   define BERKELEY     /* include job control signals? */
  186. #endif
  187.  
  188. #ifdef FIONREAD
  189. #   define PENDING
  190. #else
  191. #   ifdef O_NDELAY
  192. #    define PENDING
  193. #   endif
  194. #endif
  195.  
  196. #ifdef EUNICE
  197. #   define LINKART        /* add 1 level of possible indirection */
  198. #   define UNLINK(victim) while (!unlink(victim))
  199. #else
  200. #   define UNLINK(victim) unlink(victim)
  201. #endif
  202.  
  203. /* Valid substitutions for strings marked with % comment are:
  204.  *    %a    Current article number
  205.  *    %A    Full name of current article (%P/%c/%a)
  206.  *        (if LINKART defined, is the name of the real article)
  207.  *    %b    Destination of a save command, a mailbox or command
  208.  *    %B    The byte offset to the beginning of the article for saves
  209.  *        with or without the header
  210.  *    %c    Current newsgroup, directory form
  211.  *    %C    Current newsgroup, dot form
  212.  *    %d    %P/%c
  213.  *    %D    Old Distribution: line
  214.  *    %f    Old From: line or Reply-To: line
  215.  *    %F    Newsgroups to followup to from Newsgroups: and Followup-To:
  216.  *    %h    Name of header file to pass to mail or news poster
  217.  *    %H    Host name (yours)
  218.  *    %i    Old Message-I.D.: line, with <>
  219.  *    %I    Inclusion indicator
  220.  *    %l    News administrator login name
  221.  *    %L    Login name (yours)
  222.  *    %M    Number of articles markd with M
  223.  *    %n    Newsgroups from source article
  224.  *    %N    Full name (yours)
  225.  *    %o    Organization (yours)
  226.  *    %O    Original working directory (where you ran rn from)
  227.  *    %p    Your private news directory (-d switch)
  228.  *    %P    Public news spool directory (SPOOLDIR)
  229.  *    %r    Last reference (parent article id)
  230.  *    %R    New references list
  231.  *    %s    Subject, with all Re's and (nf)'s stripped off
  232.  *    %S    Subject, with one Re stripped off
  233.  *    %t    New To: line derived from From: and Reply-To (Internet always)
  234.  *    %T    New To: line derived from Path:
  235.  *    %u    Number of unread articles
  236.  *    %U    Number of unread articles disregarding current article
  237.  *    %x    News library directory, usually /usr/lib/news
  238.  *    %X    Rn library directory, usually %x/rn
  239.  *    %z    Size of current article in bytes.
  240.  *    %~    Home directory
  241.  *    %.    Directory containing . files
  242.  *    %$    current process number
  243.  *    %{name} Environment variable "name".  %{name-default} form allowed.
  244.  *    %[name]    Header line beginning with "Name: ", without "Name: " 
  245.  *    %"prompt"
  246.  *        Print prompt and insert what is typed.
  247.  *    %`command`
  248.  *        Insert output of command.
  249.  *    %(test_text=pattern?if_text:else_text)
  250.  *        Substitute if_text if test_text matches pattern, otherwise
  251.  *        substitute else_text.  Use != for negated match.
  252.  *        % substitutions are done on test_text, if_text, and else_text.
  253.  *        (Note: %() only works if CONDSUB defined.)
  254.  *    %digit    Substitute the text matched by the nth bracket in the last
  255.  *        pattern that had brackets.  %0 matches the last bracket
  256.  *        matched, in case you had alternatives.
  257.  *
  258.  *    Put ^ in the middle to capitalize the first letter: %^C = Net.jokes
  259.  *    Put _ in the middle to capitalize last component: %_c = net/Jokes
  260.  *
  261.  *    ~ interpretation in filename expansion happens after % expansion, so
  262.  *    you could put ~%{NEWSLOGNAME-news} and it will expand correctly.
  263.  */
  264.  
  265. /* *** System Dependent Stuff *** */
  266.  
  267. /* NOTE: many of these are defined in the config.h file */
  268.  
  269. /* name of organization */
  270. #ifndef ORGNAME
  271. #   define ORGNAME "ACME Widget Company, Widget Falls, Southern North Dakota"
  272. #endif
  273.  
  274. #ifndef MBOXCHAR
  275. #   define MBOXCHAR 'F'    /* how to recognize a mailbox by 1st char */
  276. #endif
  277.  
  278. #ifndef ROOTID
  279. #   define ROOTID 0        /* uid of superuser */
  280. #endif
  281.  
  282. #ifdef NORMSIG
  283. #   define sigset signal
  284. #   define sigignore(sig) signal(sig,SIG_IGN)
  285. #endif
  286.  
  287. #ifndef LOGDIRFIELD
  288. #   define LOGDIRFIELD 6        /* Which field (origin 1) is the */
  289.                     /* login directory in /etc/passwd? */
  290.                     /* (If it is not kept in passwd, */
  291.                     /* but getpwnam() returns it, */
  292.                     /* define the symbol GETPWENT) */
  293. #endif
  294. #ifndef GCOSFIELD
  295. #   define GCOSFIELD 5
  296. #endif
  297.  
  298. #ifndef NEGCHAR
  299. #   define NEGCHAR '!'
  300. #endif
  301.  
  302. /* Space conservation section */
  303.  
  304. /* To save D space, cut down size of MAXRCLINE, NGMAX, VARYSIZE. */
  305. #define MAXRCLINE 1500    /* number of lines allowed in .newsrc */
  306.             /* several parallel arrays affected. */
  307.             /* (You can have more lines in the active file, */
  308.             /* just not in the .newsrc) */
  309. #define HASHSIZ 1693    /* should be prime, and at least MAXRCLINE + 10% */
  310. #define NGMAX 100    /* number of newsgroups allowed on command line */
  311.             /* undefine ONLY symbol to disable "only" feature */
  312. #define VARYSIZE 256    /* this makes a block 1024 bytes long in DECville */
  313.             /* (used by virtual array routines) */
  314.  
  315. /* Undefine any of the following features to save both I and D space */
  316. /* In general, earlier ones are easier to get along without */
  317. /* Pdp11's without split I and D may have to undefine them all */
  318. #define DEBUGGING    /* include debugging code */
  319. #define USETHREADS    /* Add article-thread following */
  320. #define CUSTOMLINES    /* include code for HIDELINE and PAGESTOP */
  321. #define PUSHBACK    /* macros and keymaps using pushback buffer */
  322. #define SPEEDOVERMEM    /* use more memory to run faster */
  323. #define WORDERASE    /* enable ^W to erase a word */
  324. #define MAILCALL    /* check periodically for mail */
  325. #define CLEAREOL    /* use clear to end-of-line instead of clear screen */
  326. #define NOFIREWORKS    /* keep whole screen from flashing on certain */
  327.             /* terminals such as older Televideos */
  328. #define VERIFY        /* echo the command they just typed */
  329. #define HASHNG        /* hash newsgroup lines for fast lookup-- */
  330.             /* linear search used if not defined */
  331. #define CONDSUB        /* allow %(cond?text:text) */
  332. #define BACKTICK    /* allow %`command` */
  333. #define PROMPTTTY    /* allow %"prompt" */
  334. #define ULSMARTS    /* catch _^H in text and do underlining */
  335. #define TERMMOD        /* allow terminal type modifier on switches */
  336. #define BAUDMOD        /* allow baudrate modifier on switches */
  337. #define GETLOGIN    /* use getlogin() routine as backup to environment */
  338.             /* variables USER or LOGNAME */
  339. #define ORGFILE        /* if organization begins with /, look up in file */
  340. #define TILDENAME    /* allow ~logname expansion */
  341. #define SETENV        /* allow command line environment variable setting */
  342. #define MAKEDIR        /* use our makedir() instead of shell script */
  343. #define MEMHELP        /* keep help messages in memory */
  344. #define VERBOSE        /* compile in more informative messages */
  345. #define TERSE        /* compile in shorter messages */
  346.             /* (Note: both VERBOSE and TERSE can be defined; -t
  347.              * sets terse mode.  One or the other MUST be defined.
  348.              */
  349. #ifndef pdp11
  350. #   define CACHESUBJ    /* cache subject lines in memory */
  351.             /* without this ^N still works but runs really slow */
  352.             /* but you save lots and lots of D space */
  353. #   define CACHEFIRST    /* keep absolute first article numbers in memory */
  354.             /* cost: about 2k */
  355. #endif
  356. #define ROTATION    /* enable x, X and ^X commands to work */
  357. #define DELBOGUS    /* ask if bogus newsgroups should be deleted */
  358. #define RELOCATE    /* allow newsgroup rearranging */
  359. #define ESCSUBS        /* escape substitutions in multi-character commands */
  360. #define DELAYMARK    /* allow articles to be temporarily marked as read */
  361.             /* until exit from current newsgroup or Y command */
  362. #define MCHASE        /* unmark xrefed articles on m or M */
  363. #define MUNGHEADER    /* allow alternate header formatting via */
  364.             /* environment variable ALTHEADER (not impl) */
  365. #define ASYNC_PARSE    /* allow parsing headers asyncronously to reading */
  366.             /* used by MCHASE and MUNGHEADER */
  367. #define FINDNEWNG    /* check for new newsgroups on startup */
  368. #define FASTNEW        /* do optimizations on FINDNEWNG for faster startup */
  369.             /* (this optimization can make occasional mistakes */
  370.             /* if a group is removed and another group of the */
  371.             /* same length is added, and if no softpointers are */
  372.             /* affected by said change.) */
  373. #define INNERSEARCH    /* search command 'g' with article */
  374. #define CATCHUP        /* catchup command at newsgroup level */
  375. #define NGSEARCH    /* newsgroup pattern matching */
  376. #define ONLY        /* newsgroup restrictions by pattern */
  377. #define KILLFILES    /* automatic article killer files */
  378. #define ARTSEARCH    /* pattern searches among articles */
  379.             /* /, ?, ^N, ^P, k, K */
  380.  
  381. /* some dependencies among options */
  382.  
  383. #ifndef ARTSEARCH
  384. #   undef KILLFILES
  385. #   undef INNERSEARCH
  386. #   undef CACHESUBJ
  387. #endif
  388.  
  389. #ifndef DELAYMARK
  390. #   ifndef MCHASE
  391. #    ifndef MUNGHEADER
  392. #        undef ASYNC_PARSE
  393. #    endif
  394. #   endif
  395. #endif
  396.  
  397. #ifndef SETUIDGID
  398. #   define eaccess access
  399. #endif
  400.  
  401. #ifdef ONLY                /* idiot lint doesn't grok #if */
  402. #   define NGSORONLY
  403. #else
  404. #   ifdef NGSEARCH
  405. #    define NGSORONLY
  406. #   endif
  407. #endif
  408.  
  409. #ifdef VERBOSE
  410. #   ifdef TERSE
  411. #    define IF(c) if (c)
  412. #    define ELSE else
  413. #   else
  414. #    define IF(c)
  415. #    define ELSE
  416. #   endif
  417. #else /* !VERBOSE */
  418. #   ifndef TERSE
  419. #    define TERSE
  420. #   endif
  421. #   define IF(c) "IF" outside of VERBOSE???
  422. #   define ELSE "ELSE" outside of VERBOSE???
  423. #endif
  424.  
  425. #ifdef DEBUGGING
  426. #   define assert(ex) {if (!(ex)){fprintf(stderr,"Assertion failed: file %s, line %d\n", __FILE__, __LINE__);sig_catcher(0);}}
  427. #else
  428. #   define assert(ex) ;
  429. #endif
  430.  
  431. #ifdef SPEEDOVERMEM
  432. #   define OFFSET(x) (x)
  433. #else
  434. #   define OFFSET(x) ((x)-absfirst)
  435. #endif
  436.  
  437. /* If you're strapped for space use the help messages in shell scripts */
  438. /* if {NG,ART,PAGER,SUBS}HELP is undefined, help messages are in memory */
  439. #ifdef MEMHELP  /* undef MEMHELP above to get them all as sh scripts */
  440. #   undef NGHELP
  441. #   undef ARTHELP
  442. #   undef PAGERHELP
  443. #   undef SUBSHELP
  444. #else
  445. #   ifndef NGHELP            /* % and ~ */
  446. #    define NGHELP "%X/ng.help"
  447. #   endif
  448. #   ifndef ARTHELP            /* % and ~ */
  449. #    define ARTHELP "%X/art.help"
  450. #   endif
  451. #   ifndef PAGERHELP        /* % and ~ */
  452. #    define PAGERHELP "%X/pager.help"
  453. #   endif
  454. #   ifndef SUBSHELP        /* % and ~ */
  455. #    define SUBSHELP "%X/subs.help"
  456. #   endif
  457. #endif
  458.  
  459. #ifdef CLEAREOL
  460. #   define TCSIZE 512    /* capacity for termcap strings */
  461. #else
  462. #   ifdef pdp11
  463. #    define TCSIZE 256    /* capacity for termcap strings */
  464. #   else
  465. #    define TCSIZE 512    /* capacity for termcap srings */
  466. #   endif
  467. #endif
  468.  
  469. /* Additional ideas:
  470.  *    Make the do_newsgroup() routine a separate process.
  471.  *    Keep .newsrc on disk instead of in memory.
  472.  *    Overlays, if you have them.
  473.  *    Get a bigger machine.
  474.  */
  475.  
  476. /* End of Space Conservation Section */
  477.  
  478. /* More System Dependencies */
  479.  
  480. /* news library */
  481. #ifndef LIB        /* ~ and %l only ("~%l" is permissable) */
  482. #   define LIB "/usr/lib/news"
  483. #endif
  484.  
  485. /* path to private executables */
  486. #ifndef RNLIB        /* ~, %x and %l only */
  487. #   define RNLIB "%x/trn"
  488. #endif
  489.  
  490. /* system-wide RNINIT switches */
  491. #ifndef GLOBINIT
  492. #   define GLOBINIT "%X/INIT"
  493. #endif
  494.  
  495. /* where to find news files */
  496. #ifndef SPOOL            /* % and ~ */
  497. #   define SPOOL "/usr/spool/news"
  498. #endif
  499.  
  500. #ifdef USETHREADS
  501. # ifdef THREAD_DIR
  502. #   ifdef LONG_THREAD_NAMES
  503. #    undef SUFFIX
  504. #   else
  505. #     ifndef SUFFIX
  506. #    define SUFFIX ".th"
  507. #     endif
  508. #   endif
  509. # else
  510. #   define THREAD_DIR    SPOOL
  511. #   ifndef SUFFIX
  512. #     define SUFFIX    "/.thread"
  513. #   endif
  514. #   undef LONG_THREAD_NAMES
  515. # endif
  516. # ifndef NEW_THREAD
  517. #   define NEW_THREAD ".new"
  518. # endif
  519. #endif
  520.  
  521. /* default characters to use in the selection menu */
  522. #ifndef SELECTCHARS
  523. #   define SELECTCHARS "abcdefgijlorstuvwxz1234567890"
  524. #endif
  525.  
  526. /* file containing list of active newsgroups and max article numbers */
  527. #ifndef ACTIVE            /* % and ~ */
  528. #   define ACTIVE "%x/active"
  529. #endif
  530. #ifdef SERVER
  531. #   ifndef ACTIVE1
  532. #    define ACTIVE1 "%X/active1"
  533. #   endif
  534. #endif
  535. #ifndef ACTIVE2
  536. #   define ACTIVE2 "%X/active2"
  537. #endif
  538.  
  539. /* location of history file */
  540. #ifndef ARTFILE            /* % and ~ */
  541. #    define ARTFILE "%x/history"
  542. #endif
  543.  
  544. /* command to setup a new .newsrc */
  545. #ifndef NEWSETUP        /* % and ~ */
  546. #   define NEWSETUP "newsetup"
  547. #endif
  548.  
  549. /* command to display a list of un-subscribed-to newsgroups */
  550. #ifndef NEWSGROUPS        /* % and ~ */
  551. #   define NEWSGROUPS "newsgroups"
  552. #endif
  553.  
  554. /* preferred shell for use in doshell routine */
  555. /*  ksh or sh would be okay here */
  556. #ifndef PREFSHELL
  557. #   define PREFSHELL "/bin/csh"
  558. #endif
  559.  
  560. /* path to fastest starting shell */
  561. #ifndef SH
  562. #   define SH "/bin/sh"
  563. #endif
  564.  
  565. /* default unshar'ing program */
  566. #ifndef UNSHAR
  567. #   define UNSHAR "/bin/sh"
  568. #endif
  569.  
  570. /* path to default editor */
  571. #ifndef DEFEDITOR
  572. #   define DEFEDITOR "/usr/ucb/vi"
  573. #endif
  574.  
  575. /* location of macro file */
  576. #ifndef RNMACRO
  577. #   ifdef PUSHBACK
  578. #    define RNMACRO "%./.rnmac"
  579. #   endif
  580. #endif
  581.  
  582. /* location of full name */
  583. #ifndef FULLNAMEFILE
  584. #   ifndef PASSNAMES
  585. #    define FULLNAMEFILE "%./.fullname"
  586. #   endif
  587. #endif
  588.  
  589. /* virtual array file name template */
  590. #ifndef VARYNAME        /* % and ~ */
  591. #   define VARYNAME "/tmp/rnvary.%$"
  592. #endif
  593.  
  594. /* where to compile a new newsgroup list */
  595. #ifndef RNEWNAME
  596. #   define RNEWNAME "/tmp/rnew.%$"
  597. #endif
  598.  
  599. /* file to pass header to followup article poster */
  600. #ifndef HEADNAME        /* % and ~ */
  601. #   define HEADNAME "%./.rnhead"
  602. /* or alternately #define HEADNAME "/tmp/rnhead.%$" */
  603. #endif
  604.  
  605. #ifndef MAKEDIR
  606. /* shell script to make n-deep subdirectories */
  607. #   ifndef DIRMAKER        /* % and ~ */
  608. #    define DIRMAKER "%X/makedir"
  609. #   endif
  610. #endif
  611.  
  612. /* location of newsrc file */
  613. #ifndef RCNAME        /* % and ~ */
  614. #   define RCNAME "%./.newsrc"
  615. #endif
  616.  
  617. /* temporary newsrc file in case we crash while writing out */
  618. #ifndef RCTNAME        /* % and ~ */
  619. #   define RCTNAME "%./.newnewsrc"
  620. #endif
  621.  
  622. /* newsrc file at the beginning of this session */
  623. #ifndef RCBNAME        /* % and ~ */
  624. #   define RCBNAME "%./.oldnewsrc"
  625. #endif
  626.  
  627. /* if existent, contains process number of current or crashed rn */
  628. #ifndef LOCKNAME        /* % and ~ */
  629. #   define LOCKNAME "%./.rnlock"
  630. #endif
  631.  
  632. /* information from last invocation of rn */
  633. #ifndef LASTNAME        /* % and ~ */
  634. #   define LASTNAME "%./.rnlast"
  635. #endif
  636.  
  637. /* file with soft pointers into the active file */
  638. #ifndef SOFTNAME        /* % and ~ */
  639. #   define SOFTNAME "%./.rnsoft"
  640. #endif
  641.  
  642. /* list of article numbers to mark as unread later (see M and Y cmmands) */
  643. #ifndef RNDELNAME        /* % and ~ */
  644. #   define RNDELNAME "%./.rndelay"
  645. #endif
  646.  
  647. /* a motd-like file for rn */
  648. #ifndef NEWSNEWSNAME        /* % and ~ */
  649. #   define NEWSNEWSNAME "%X/newsnews"
  650. #endif
  651.  
  652. /* command to send a reply */
  653. #ifndef MAILPOSTER        /* % and ~ */
  654. #   define MAILPOSTER "Rnmail -h %h"
  655. #endif
  656.  
  657. #ifdef INTERNET
  658. #   ifndef MAILHEADER        /* % */
  659. #    ifdef CONDSUB
  660. #        define MAILHEADER "To: %t\nSubject: Re: %S\nNewsgroups: %n\nIn-Reply-To: %i\n%(%[references]!=^$?References\\: %[references]\n)Organization: %o\nCc: \nBcc: \n\n"
  661. #    else
  662. #        define MAILHEADER "To: %t\nSubject: Re: %S\nNewsgroups: %n\nIn-Reply-To: %i\nReferences: %[references]\nCc: \nBcc: \n\n"
  663. #    endif
  664. #   endif
  665. #else
  666. #   ifndef MAILHEADER        /* % */
  667. #    ifdef CONDSUB
  668. #        define MAILHEADER "To: %T\nSubject: %(%i=^$?:Re: %S\nNewsgroups: %n\nIn-Reply-To: %i)\n%(%[references]!=^$?References\\: %[references]\n)Organization: %o\nCc: \nBcc: \n\n"
  669. #    else
  670. #        define MAILHEADER "To: %T\nSubject: Re: %S\nNewsgroups: %n\nIn-Reply-To: %i\nReferences: %[references]\nCc: \nBcc: \n\n"
  671. #    endif
  672. #   endif
  673. #endif
  674.  
  675. #ifndef YOUSAID            /* % */
  676. #   define YOUSAID "In article %i you write:"
  677. #endif
  678.  
  679. /* command to submit a followup article */
  680. #ifndef NEWSPOSTER        /* % and ~ */
  681. #   define NEWSPOSTER "Pnews -h %h"
  682. #endif
  683.  
  684. #ifndef NEWSHEADER        /* % */
  685. #   ifdef CONDSUB
  686. #ifdef INTERNET
  687. #    define NEWSHEADER "Newsgroups: %(%F=^$?%C:%F)\nSubject: %(%S=^$?%\"\n\nSubject: \":Re: %S)\nSummary: \nExpires: \n%(%R=^$?:References: %R\n)Sender: \nFollowup-To: \nDistribution: %(%i=^$?%\"Distribution: \":%D)\nOrganization: %o\nKeywords: %[keywords]\n\n"
  688. #else
  689. #    define NEWSHEADER "Newsgroups: %(%F=^$?%C:%F)\nSubject: %(%S=^$?%\"\n\nSubject: \":Re: %S)\nSummary: \nExpires: \n%(%R=^$?:References: %R\n)Sender: \nFollowup-To: \nDistribution: %(%i=^$?%\"Distribution: \":%D)\nOrganization: %o\nKeywords: %[keywords]\n\n"
  690. #endif
  691. #   else
  692. #    ifdef INTERNET
  693. #        define NEWSHEADER "Newsgroups: %F\nSubject: Re: %S\nSummary: \nExpires: \nReferences: %R\nSender: \nFollowup-To: \nDistribution: %D\nOrganization: %o\nKeywords: %[keywords]\n\n"
  694. #    else
  695. #        define NEWSHEADER "Newsgroups: %F\nSubject: Re: %S\nSummary: \nExpires: \nReferences: %R\nSender: \nFollowup-To: \nDistribution: %D\nOrganization: %o\nKeywords: %[keywords]\n\n"
  696. #    endif
  697. #   endif
  698. #endif
  699.  
  700. #ifndef ATTRIBUTION        /* % */
  701. #   define ATTRIBUTION "In article %i %f writes:"
  702. #endif
  703.  
  704. #ifndef PIPESAVER        /* % */
  705. #   ifdef CONDSUB
  706. #       ifdef SERVER
  707. #               define PIPESAVER "%(%B=^0$?<%P/rrn%a.%$:tail +%Bc %P/rrn%a.%$ |) %b"
  708. #       else
  709. #        define PIPESAVER "%(%B=^0$?<%A:tail +%Bc %A |) %b"
  710. #    endif
  711. #   else
  712. #       ifdef SERVER
  713. #               define PIPESAVER "tail +%Bc %P/rrn%a.%$ | %b"
  714. #       else
  715. #        define PIPESAVER "tail +%Bc %A | %b"
  716. #    endif
  717. #   endif
  718. #endif
  719.  
  720. #ifndef EXSAVER
  721. #    ifdef SERVER
  722. #    define EXSAVER "tail +%Bc %P/rrn%a.%$ | %e"
  723. #    else
  724. #    define EXSAVER "tail +%Bc %A | %e"
  725. #    endif
  726. #endif
  727.  
  728. #ifndef NORMSAVER        /* % and ~ */
  729. #    ifdef SERVER
  730. #    define NORMSAVER "%X/norm.saver %P/rrn%a.%$ %P %c %a %B %C \"%b\""
  731. #    else
  732. #       define NORMSAVER "%X/norm.saver %A %P %c %a %B %C \"%b\""
  733. #    endif
  734. #endif
  735.  
  736. #ifndef MBOXSAVER        /* % and ~ */
  737. #   ifdef MININACT        /* 2.10.2 site? */
  738. #       ifdef SERVER
  739. #           define MBOXSAVER "%X/mbox.saver %P/rrn%a.%$ %P %c %a %B %C \"%b\" \"From %T %`date`\""
  740. #       else
  741. #        define MBOXSAVER "%X/mbox.saver %A %P %c %a %B %C \"%b\" \"From %T %`date`\""
  742. #    endif
  743. #   else
  744. #    ifdef CONDSUB
  745. #           ifdef SERVER
  746. #               define MBOXSAVER "%X/mbox.saver %P/rrn%a.%$ %P %c %a %B %C \"%b\" \"From %T %(%[date]=^\\(\\w*\\), \\(\\w*\\)-\\(\\w*\\)-\\(\\w*\\) \\([^ ]*\\)?%1 %3 %(%2=..?%2: %2) %5 19%4)\""
  747. #           else
  748. #            define MBOXSAVER "%X/mbox.saver %A %P %c %a %B %C \"%b\" \"From %T %(%[date]=^\\(\\w*\\), \\(\\w*\\)-\\(\\w*\\)-\\(\\w*\\) \\([^ ]*\\)?%1 %3 %(%2=..?%2: %2) %5 19%4)\""
  749. #        endif
  750.                     /* header munging with a vengeance */
  751. #    else
  752. #           ifdef SERVER
  753. #               define MBOXSAVER "%X/mbox.saver %P/rrn%a.%$ %P %c %a %B %C \"%b\" \"From %T %[posted]\""
  754. #           else
  755. #            define MBOXSAVER "%X/mbox.saver %A %P %c %a %B %C \"%b\" \"From %T %[posted]\""
  756. #        endif
  757. #    endif
  758. #   endif
  759. #endif
  760.  
  761. #ifdef MKDIRS
  762.  
  763. #   ifndef SAVEDIR            /* % and ~ */
  764. #    define SAVEDIR "%p/%c"
  765. #   endif
  766. #   ifndef SAVENAME        /* % */
  767. #    define SAVENAME "%a"
  768. #   endif
  769.  
  770. #else
  771.  
  772. #   ifndef SAVEDIR            /* % and ~ */
  773. #    define SAVEDIR "%p"
  774. #   endif
  775. #   ifndef SAVENAME        /* % */
  776. #    define SAVENAME "%^C"
  777. #   endif
  778.  
  779. #endif
  780.  
  781. #ifndef KILLGLOBAL        /* % and ~ */
  782. #   define KILLGLOBAL "%p/KILL"
  783. #endif
  784.  
  785. #ifndef KILLLOCAL        /* % and ~ */
  786. #   define KILLLOCAL "%p/%c/KILL"
  787. #endif
  788.  
  789. /* how to cancel an article */
  790. #ifndef CANCEL
  791. #   ifdef MININACT            /* 2.10.2 ? */
  792. #    define CANCEL "%x/inews -h < %h"
  793. #   else
  794. #    define CANCEL "inews -h < %h"
  795. #   endif
  796. #endif
  797.  
  798. /* how to cancel an article, continued */
  799. #ifndef CANCELHEADER
  800. #ifdef INTERNET
  801. #   define CANCELHEADER "From: %L@%H (%N)\nNewsgroups: %n\nSubject: cmsg cancel %i\nReferences: %R\nDistribution: %D\nOrganization: %o\n\nThis message was cancelled from within trn.\n"
  802. #else
  803. #   define CANCELHEADER "From:%L@%H.UUCP (%N)\nNewsgroups: %n\nSubject: cmsg cancel %i\nReferences: %R\nDistribution: %D\nOrganization: %o\n"
  804. #endif
  805. #endif
  806.  
  807. /* where to find the mail file */
  808. #ifndef MAILFILE
  809. #   define MAILFILE "/usr/spool/mail/%L"
  810. #endif
  811.  
  812. /* how to open binary format files */
  813. #ifndef FOPEN_RB
  814. #   define FOPEN_RB "r"
  815. #endif
  816. #ifndef FOPEN_WB
  817. #   define FOPEN_WB "w"
  818. #endif
  819.  
  820. /* what to do with ansi prototypes -- '()' == ignore, 'x' == use */
  821. #ifndef ANSI
  822. #   define ANSI(x) ()
  823. #endif
  824.  
  825. /* how many characters is a newline in a text file? */
  826. #ifndef NL_SIZE
  827. #   define NL_SIZE 1
  828. #endif
  829.  
  830. /* some important types */
  831.  
  832. typedef int        NG_NUM;        /* newsgroup number */
  833. typedef long        ART_NUM;    /* article number */
  834. #ifdef pdp11
  835.     typedef short    ART_UNREAD;    /* ordinarily this should be long */
  836.                     /* like ART_NUM, but assuming that */
  837.                     /* we stay less than 32767 articles */
  838.                     /* behind saves a lot of space. */
  839.                     /* NOTE: do not make unsigned. */
  840. #else
  841.     typedef long    ART_UNREAD;
  842. #endif
  843. #ifdef SERVER
  844. typedef int        ART_PART;    /* for passing to nntpopen() */
  845. #endif
  846. typedef long        ART_POS;    /* char position in article file */
  847. typedef int        ART_LINE;    /* line position in article file */
  848. typedef long        ACT_POS;    /* char position in active file */
  849. typedef unsigned int    MEM_SIZE;    /* for passing to malloc */
  850.  
  851.  
  852. /* *** end of the machine dependent stuff *** */
  853.  
  854. /* GLOBAL THINGS */
  855.  
  856. /* file statistics area */
  857.  
  858. EXT struct stat filestat;
  859.  
  860. /* various things of type char */
  861.  
  862. char    *index();
  863. char    *rindex();
  864. char    *getenv();
  865. char    *strcat();
  866. char    *strcpy();
  867.  
  868. EXT char buf[LBUFLEN+1];    /* general purpose line buffer */
  869. EXT char cmd_buf[CBUFLEN];    /* buffer for formatting system commands */
  870.  
  871. EXT char *indstr INIT(">");    /* indent for old article embedded in followup */
  872.  
  873. EXT char *cwd INIT(Nullch);        /* current working directory */
  874. EXT char *dfltcmd INIT(Nullch);    /* 1st char is default command */
  875.  
  876. /* switches */
  877.  
  878. #ifdef DEBUGGING
  879.     EXT int debug INIT(0);                /* -D */
  880. #   define DEB_INNERSRCH 32 
  881. #   define DEB_FILEXP 64 
  882. #   define DEB_HASH 128
  883. #   define DEB_XREF_MARKER 256
  884. #   define DEB_CTLAREA_BITMAP 512
  885. #   define DEB_SOFT_POINTERS 1024
  886. #   define DEB_NEWSRC_LINE 2048
  887. #   define DEB_SEARCH_AHEAD 4096
  888. #   define DEB_CHECKPOINTING 8192
  889. #   define DEB_FEED_XREF 16384
  890. #endif
  891.  
  892. #ifdef ARTSEARCH
  893.     EXT int scanon INIT(0);                /* -S */
  894. #endif
  895.  
  896. #ifdef USETHREADS
  897.     EXT bool use_threads INIT(THREAD_INIT);        /* -x */
  898.     EXT int max_tree_lines INIT(6);
  899.     EXT char select_order[4] INIT("lsm");
  900.     EXT int select_on INIT(SELECT_INIT);        /* -X */
  901.     EXT char end_select INIT('Z');
  902.     EXT char page_select INIT('>');
  903. #endif
  904.  
  905. EXT bool mbox_always INIT(FALSE);            /* -M */
  906. EXT bool norm_always INIT(FALSE);            /* -N */
  907. EXT bool checkflag INIT(FALSE);            /* -c */
  908. EXT bool suppress_cn INIT(FALSE);            /* -s */
  909. EXT int countdown INIT(5);    /* how many lines to list before invoking -s */
  910. EXT bool muck_up_clear INIT(FALSE);            /* -loco */
  911. EXT bool erase_screen INIT(FALSE);            /* -e */
  912. #if defined(CLEAREOL) || defined(USETHREADS)
  913. EXT bool can_home INIT(FALSE);
  914. #endif
  915. #ifdef CLEAREOL
  916. EXT bool can_home_clear INIT(FALSE);        /* fancy -e */
  917. #endif
  918. EXT bool findlast INIT(FALSE);            /* -r */
  919. EXT bool typeahead INIT(FALSE);            /* -T */
  920. #ifdef VERBOSE
  921. #   ifdef TERSE
  922.     EXT bool verbose INIT(TRUE);            /* +t */
  923. #   endif
  924. #endif
  925. #ifdef VERIFY
  926.     EXT bool verify INIT(FALSE);            /* -v */
  927. #endif
  928.     EXT bool quickstart INIT(FALSE);            /* -q */
  929.  
  930. #define NOMARKING 0
  931. #define STANDOUT 1
  932. #define UNDERLINE 2
  933. EXT int marking INIT(NOMARKING);            /* -m */
  934.  
  935. EXT ART_LINE initlines INIT(0);        /* -i */
  936. EXT bool initlines_specified INIT(FALSE);
  937.  
  938. /* miscellania */
  939.  
  940. int fseek();
  941. long atol(), ftell();
  942. EXT bool in_ng INIT(FALSE);        /* current state of rn */
  943. EXT char mode INIT('i');        /* current state of rn */
  944.  
  945. EXT FILE *tmpfp INIT(Nullfp);    /* scratch fp used for .rnlock, .rnlast, etc. */
  946.  
  947. EXT NG_NUM nextrcline INIT(0);    /* 1st unused slot in rcline array */
  948.             /* startup to avoid checking twice in a row */
  949.  
  950. extern errno;
  951.  
  952. /* Factored strings */
  953.  
  954. EXT char nullstr[] INIT("");
  955. EXT char sh[] INIT(SH);
  956. EXT char defeditor[] INIT(DEFEDITOR);
  957. EXT char hforhelp[] INIT("Type h for help.\n");
  958. #ifdef STRICTCR
  959. EXT char badcr[] INIT("\nUnnecessary CR ignored.\n");
  960. #endif
  961. EXT char readerr[] INIT("rn read error");
  962. EXT char unsubto[] INIT("\n\nUnsubscribed to newsgroup %s\n");
  963. EXT char cantopen[] INIT("Can't open %s\n");
  964. EXT char cantcreate[] INIT("Can't create %s\n");
  965.  
  966. #ifdef VERBOSE
  967.     EXT char nocd[] INIT("Can't chdir to directory %s\n");
  968. #else
  969.     EXT char nocd[] INIT("Can't find %s\n");
  970. #endif
  971.  
  972. #ifdef NOLINEBUF
  973. #define FLUSH ,fflush(stdout)
  974. #else
  975. #define FLUSH
  976. #endif
  977.  
  978. #ifdef lint
  979. #undef FLUSH
  980. #define FLUSH
  981. #undef putchar
  982. #define putchar(c)
  983. #endif
  984.