Annotation of 43BSD/contrib/rn/common.h, revision 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.