Annotation of 43BSD/contrib/rn/common.h, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.