home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / tin / part09 / tin.h < prev   
C/C++ Source or Header  |  1992-05-20  |  14KB  |  642 lines

  1. /*
  2.  *  Project   : tin - a threaded Netnews reader
  3.  *  Module    : tin.h
  4.  *  Author    : I.Lea & R.Skrenta
  5.  *  Created   : 01-04-91
  6.  *  Updated   : 10-05-92
  7.  *  Notes     : #include files, #defines & struct's
  8.  *  Copyright : (c) Copyright 1991-92 by Iain Lea & Rich Skrenta
  9.  *              You may  freely  copy or  redistribute  this software,
  10.  *              so  long as there is no profit made from its use, sale
  11.  *              trade or  reproduction.  You may not change this copy-
  12.  *              right notice, and it must be included in any copy made
  13.  */
  14.  
  15. #include    <stdio.h>
  16.  
  17. #include    <signal.h>
  18. #include    <errno.h>
  19. #include    <sys/types.h>
  20. #include    <sys/stat.h>
  21. #include    <pwd.h>
  22. #include    <ctype.h>
  23. #include    <time.h>
  24. #ifndef apollo
  25. #    include    <unistd.h>
  26. #endif
  27.  
  28. #ifdef BSD
  29. #    include    <strings.h>
  30. #    include    <fcntl.h>
  31. #else
  32. /*
  33. #    ifndef apollo
  34. #        include    <stdlib.h>
  35. #    endif
  36. #    include    <string.h>
  37. */
  38. #endif
  39.  
  40. #ifndef MINIX
  41. #    include <sys/ioctl.h>
  42. #endif
  43.  
  44. #ifdef M_XENIX
  45. #    include    <prototypes.h>
  46. #endif
  47.  
  48. #ifdef SVR4
  49. #    include <locale.h>
  50. #endif
  51.  
  52. #if !defined(BSD) && !defined(sinix) && !defined(RS6000)
  53. #    include    <sys/utsname.h>
  54. #endif
  55.  
  56. /*
  57.  * Needed for resizing under an xterm
  58.  */
  59.  
  60. #if defined(SIGWINCH)
  61. #    if !defined(TIOCGWINSZ) && !defined(TIOCGSIZE)
  62. #        if !defined(sinix) && !defined(nsc)
  63. #            include <sys/stream.h>
  64. #            ifdef PTX
  65. #                include <termio.h>
  66. #            else
  67. #                ifndef apollo
  68. #                    include <sys/ptem.h>
  69. #                    include <sys/tty.h>
  70. #                endif
  71. #                if !defined(SCO_UNIX) && !defined(SVR4) && !defined(apollo)
  72. #                    include <sys/pty.h>
  73. #                endif
  74. #            endif
  75. #        endif
  76. #    endif
  77. #endif
  78.  
  79. /*
  80.  * Setup support for reading from CD-ROM
  81.  */
  82.  
  83. #ifdef CDROM_ONLY
  84. #    define CDROM_ABLE
  85. #endif
  86.  
  87. #ifdef CDROM_ABLE
  88. #    define XSPOOLDIR
  89. #    define NNTP_ABLE
  90. #    undef NNTP_ONLY
  91. #    undef NNTP_INEWS
  92. #endif
  93.  
  94. /*
  95.  * Setup support for reading from NNTP
  96.  */
  97.  
  98. #if defined(NNTP_ABLE) || defined(NNTP_ONLY)
  99. #    ifndef NNTP_ABLE
  100. #        define    NNTP_ABLE
  101. #    endif
  102. #    ifndef NNTP_INEWS
  103. #        define    NNTP_INEWS
  104. #    endif
  105. #endif
  106.  
  107. /*
  108.  * Index file daemon version of tin. Will create/update index files from cron
  109.  * on NNTP server machine so clients can retreive index file with NNTP XINDEX
  110.  * command from server. Also can be used on machines that just want one copy
  111.  * of all the index files in one place. In this case the normal tin must have
  112.  * access to the index directory (-I dir option) or be setuid news.
  113.  */
  114.  
  115. #ifdef INDEX_DAEMON
  116. #    undef NNTP_ABLE
  117. #    undef NNTP_ONLY
  118. #    undef NNTP_INEWS
  119. #endif
  120.  
  121. /*
  122.  * Determine signal return type
  123.  */
  124.  
  125. #ifdef __GNUC__
  126. typedef void sigtype_t;
  127. #else    
  128. #    if defined(sony)
  129. typedef int sigtype_t;
  130. #    else
  131. #        if __STDC__ || defined(sinix) || defined(sun) || \
  132.            defined(ultrix) || defined(atthcx) || defined(PTX)
  133. typedef void sigtype_t;
  134. #        else
  135. typedef int sigtype_t;
  136. #        endif
  137. #    endif
  138. #endif
  139.  
  140. /*
  141.  * Specify News spool & control directories
  142.  */
  143.  
  144. #ifndef SPOOLDIR
  145. #    define        SPOOLDIR    "/usr/spool/news"
  146. #endif
  147. #ifndef LIBDIR
  148. #    define        LIBDIR        "/usr/lib/news"
  149. #endif
  150. #ifndef INEWSDIR
  151. #    define        INEWSDIR    LIBDIR
  152. #endif
  153.  
  154. /*
  155.  * Determine machine configuration for external programs & directories
  156.  */
  157.  
  158. #ifdef BSD
  159. #    ifdef _SEQUENT_
  160. #        define        memcmp(s1, s2, n)    bcmp(s2, s1, n)
  161. #    endif
  162. #    define        strchr(str, ch)    index(str, ch)
  163. #    define        DEFAULT_SHELL    "/bin/csh"
  164. #    define        DEFAULT_MAILER    "/bin/mail"
  165. #    define        DEFAULT_EDITOR    "/usr/ucb/vi"
  166. #    define        DEFAULT_PRINTER    "/usr/ucb/lpr"
  167. #    define        DEFAULT_SUM    "sum"
  168. #    ifdef DGUX
  169. #        define        DEFAULT_MAILBOX    "/usr/mail"
  170. #        define        POSIX_JOB_CONTROL
  171. #        define        USE_INVERSE_HACK
  172. #    else
  173. #        define        DEFAULT_MAILBOX    "/usr/spool/mail"
  174. #    endif
  175. #    ifndef USE_LONG_FILENAMES
  176. #        define USE_LONG_FILENAMES
  177. #    endif
  178. #else
  179. #    ifdef M_XENIX
  180. #        define        DEFAULT_EDITOR    "/bin/vi"
  181. #        define        DEFAULT_MAILER    "/usr/bin/mail"
  182. #        define        DEFAULT_MAILBOX    "/usr/spool/mail"
  183. #    endif
  184. #    if defined(NCR) || defined(atthcx) || defined(HPUX)
  185. #        define        DEFAULT_MAILER    "/usr/bin/mailx"
  186. #    endif
  187. #    ifdef PTX
  188. #        define        DEFAULT_MAILER    "/usr/bin/mailx"
  189. #        ifndef USE_LONG_FILENAMES
  190. #            define    USE_LONG_FILENAMES
  191. #        endif
  192. #    endif
  193. #    ifdef RS6000
  194. #        define        DEFAULT_MAILER    "/usr/bin/mail"
  195. #        define        DEFAULT_PRINTER    "/bin/lp"
  196. #    endif
  197. #    ifdef sinix
  198. #        define        DEFAULT_MAILER    "/bin/rmail"
  199. #        define        DEFAULT_PRINTER    "/bin/lpr"
  200. #        ifndef USE_LONG_FILENAMES
  201. #            define USE_LONG_FILENAMES
  202. #        endif
  203. #    endif
  204. #    ifdef SVR4
  205. #        ifndef USE_LONG_FILENAMES
  206. #            define    USE_LONG_FILENAMES
  207. #        endif
  208. #    endif
  209. #    ifdef UNIXPC
  210. #        define        DEFAULT_MAILER    "/bin/rmail"
  211. #    endif
  212. #    ifndef DEFAULT_SHELL
  213. #        define        DEFAULT_SHELL    "/bin/sh"
  214. #    endif
  215. #    ifndef DEFAULT_EDITOR
  216. #        define        DEFAULT_EDITOR    "/usr/bin/vi"
  217. #    endif
  218. #    ifndef DEFAULT_MAILBOX
  219. #        define        DEFAULT_MAILBOX    "/usr/mail"
  220. #    endif
  221. #    ifndef DEFAULT_MAILER
  222. #        define        DEFAULT_MAILER    "/bin/mail"
  223. #    endif
  224. #    ifndef DEFAULT_PRINTER
  225. #        define        DEFAULT_PRINTER    "/usr/bin/lp"
  226. #    endif
  227. #    define        DEFAULT_SUM        "sum -r"
  228. #endif
  229.  
  230. #ifdef USE_LONG_FILENAMES
  231. #    define        LONG_PATH_PART    "part"
  232. #    define        LONG_PATH_PATCH    "patch"
  233. #else
  234. #    define        LONG_PATH_PART    ""
  235. #    define        LONG_PATH_PATCH    "p"
  236. #endif
  237.  
  238. /*
  239.  * Useful for logging user usage
  240.  */
  241.  
  242. #ifdef LOG_USER
  243. #    define        LOG_USER_FILE    "/tmp/.tin_log" 
  244. #endif
  245.  
  246. /*
  247.  * Should active file be rereaf for new news & if so how often
  248.  */
  249.  
  250. #ifndef NO_RESYNC_ACTIVE_FILE
  251. #    ifndef RESYNC_ACTIVE_SECS
  252. #        define    RESYNC_ACTIVE_SECS    300    /* reread active every n secs */
  253. #    endif
  254. #endif
  255.  
  256. /*
  257.  * Initial sizes of internal arrays for small (<4MB) & large memory machines
  258.  */
  259.  
  260. #ifdef SMALL_MEMORY_MACHINE
  261. #    define        DEFAULT_ACTIVE_NUM    1800    
  262. #    define        DEFAULT_ARTICLE_NUM    400    
  263. #    define        DEFAULT_KILL_NUM    10    
  264. #    define        DEFAULT_SAVE_NUM    10    
  265. #else
  266. #    define        DEFAULT_ACTIVE_NUM    1800    
  267. #    define        DEFAULT_ARTICLE_NUM    1200    
  268. #    define        DEFAULT_KILL_NUM    30    
  269. #    define        DEFAULT_SAVE_NUM    30    
  270. #endif
  271.  
  272. #define        RCDIR            ".tin"
  273. #define        RCFILE            "tinrc"
  274. #define        INDEXDIR        ".index"
  275. #define        KILLFILE        "kill"
  276. #define        POSTFILE        "posted"
  277. #define        UNTHREADFILE    "unthread"
  278. #define        DEFAULT_MAILDIR    "Mail"
  279.  
  280. #define BUG_REPORT_ADDRESS    "iain%anl433.uucp@Germany.EU.net"
  281.  
  282. #ifdef TRUE
  283. #    undef TRUE
  284. #endif
  285. #define        TRUE        1
  286.  
  287. #ifdef FALSE
  288. #    undef FALSE
  289. #endif
  290. #define        FALSE        0
  291.  
  292. #define        LEN                1024
  293. #define        PATH_LEN            256
  294. #define        HEADER_LEN            1024
  295. #define        MODULO_COUNT_NUM        5
  296. #define        TABLE_SIZE            1409
  297. #define        MAX_PAGES            1000
  298. #define        ctrl(c)                ((c) & 0x1F)
  299.  
  300. #ifndef DEFAULT_COMMENT
  301. #    define        DEFAULT_COMMENT    ": "    /* used when by follow-ups & replys */
  302. #endif
  303. #ifndef UNREAD_ART_MARK
  304. #    define        UNREAD_ART_MARK    '+'    /* used to show that an art is unread */
  305. #endif
  306. #ifndef RETURN_ART_MARK
  307. #    define        RETURN_ART_MARK    '-'    /* used to show that an art will return */
  308. #endif
  309. #ifndef HOT_ART_MARK
  310. #    define        HOT_ART_MARK    '*'    /* used to show that an art was auto selected */
  311. #endif
  312. #ifndef READ_ART_MARK
  313. #    define        READ_ART_MARK    ' '    /* used to show that an art was not read or seen  */
  314. #endif
  315.  
  316. #ifdef USE_INVERSE_HACK
  317. #    define        SELECT_MISC_COLS    21
  318. #    define        BLANK_GROUP_COLS    2
  319. #    define        BLANK_PAGE_COLS        2
  320. #else
  321. #    define        SELECT_MISC_COLS    21
  322. #    define        BLANK_GROUP_COLS    0
  323. #    define        BLANK_PAGE_COLS        0
  324. #endif
  325.  
  326. #define        SCREEN_READ_UNREAD        6        /* position for "  +" / "   " */
  327. #define        INDEX_TOP                2
  328.  
  329. #ifdef NO_REGEX 
  330. #    define STR_MATCH(s1,s2)    (str_str (s1, s2, strlen (s2)) != 0)
  331. #else        
  332. #    define STR_MATCH(s1,pat)    (wildmat (s1, pat))
  333. #endif
  334.  
  335. #define IGNORE_ART(i)    ((arts[i].thread == ART_EXPIRED) || \
  336.              (arts[i].killed && kill_level > 0))
  337.  
  338. /*
  339.  *  used by get_arrow_key()
  340.  */
  341.  
  342. #define        KEYMAP_UNKNOWN            0
  343. #define        KEYMAP_UP                1
  344. #define        KEYMAP_DOWN                2
  345. #define        KEYMAP_PAGE_UP            3
  346. #define        KEYMAP_PAGE_DOWN        4
  347. #define        KEYMAP_HOME                5
  348. #define        KEYMAP_END                6
  349.  
  350. /*
  351.  *  used by feed.c - feed_articles()
  352.  */
  353.  
  354. #define        SELECT_LEVEL                1
  355. #define        GROUP_LEVEL                2
  356. #define        PAGE_LEVEL                3
  357.  
  358. #define        FEED_MAIL                1
  359. #define        FEED_PIPE                2
  360. #define        FEED_PRINT                3
  361. #define        FEED_SAVE                4
  362. #define        FEED_XPOST                5
  363.  
  364. /*
  365.  *  used in art.c & rcfile.c
  366.  */
  367.  
  368. #define        SORT_BY_NOTHING            0        /* sort types on arts[] array */
  369. #define        SORT_BY_SUBJ_DESCEND    1
  370. #define        SORT_BY_SUBJ_ASCEND        2
  371. #define        SORT_BY_FROM_DESCEND    3
  372. #define        SORT_BY_FROM_ASCEND        4
  373. #define        SORT_BY_DATE_DESCEND    5
  374. #define        SORT_BY_DATE_ASCEND        6
  375.  
  376. #define        SHOW_FROM_NONE            0
  377. #define        SHOW_FROM_ADDR            1
  378. #define        SHOW_FROM_NAME            2
  379. #define        SHOW_FROM_BOTH            3
  380.  
  381. /*
  382.  *  used in help.c
  383.  */
  384.  
  385. #define        HELP_INFO                0
  386. #define        POST_INFO                1
  387.  
  388. /*
  389.  *  used in save.c
  390.  */
  391.  
  392. #define        CHECK_ANY_NEWS            0
  393. #define        START_ANY_NEWS            1
  394. #define        MAIL_ANY_NEWS            2
  395. #define        SAVE_ANY_NEWS            3
  396.  
  397. /*
  398.  *  used in help.c
  399.  */
  400.  
  401. #define        HEADER_TO                0
  402. #define        HEADER_SUBJECT            1
  403.  
  404. /*
  405.  *  used in page.c & post.c
  406.  */
  407.  
  408. #define        POSTED_NONE                0
  409. #define        POSTED_REDRAW            1
  410. #define        POSTED_OK                2
  411.  
  412. /*
  413.  *  Assertion verifier
  414.  */
  415.  
  416. #if __STDC__ && !defined(apollo)
  417. #    define    assert(p)    if(! (p)) asfail(__FILE__, __LINE__, #p); else
  418. #else
  419. #    define    assert(p)    if(! (p)) asfail(__FILE__, __LINE__, "p"); else
  420. #endif
  421.  
  422. #define        ESC        27
  423. #if defined(BSD) || defined(MINIX) || defined(apollo)
  424. #    define        CR        '\r'
  425. #else
  426. #    define        CR        10
  427. #endif
  428.  
  429. /*
  430.  * return codes for change_rcfile ()
  431.  */
  432.  
  433. #define        NO_KILLING        0
  434. #define        KILLING            1
  435.  
  436. /*
  437.  *  art.thread
  438.  */
  439.  
  440. #define        ART_NORMAL        -1
  441. #define        ART_EXPIRED        -2
  442.  
  443. /*
  444.  *  art.unread
  445.  */
  446.  
  447. #define        ART_READ        0
  448. #define        ART_UNREAD        1
  449. #define        ART_WILL_RETURN    2
  450.  
  451. /*
  452.  * used by group_t & my_group[]
  453.  */
  454.  
  455. #define        UNSUBSCRIBED    0x01    /* haven't put in my_group[] yet */
  456. #define        SUBSCRIBED        0x02    /* subscribed to */
  457.  
  458. /*
  459.  * kill_type used in struct kill_t
  460.  */
  461.  
  462. #define KILL_SUBJ    1
  463. #define KILL_FROM    2
  464. #define KILL_BOTH    3
  465.  
  466. /*
  467.  * usedin group.c & page.c
  468.  */
  469.  
  470. #define    ART_UNAVAILABLE    -1
  471.  
  472.  
  473. /*
  474.  * used in feed.c & save.c
  475.  */
  476.  
  477. #define POST_PROC_NONE            0
  478. #define POST_PROC_SHAR            1
  479. #define POST_PROC_UUDECODE        2
  480. #define POST_PROC_UUD_LST_ZOO    3
  481. #define POST_PROC_UUD_EXT_ZOO    4
  482.  
  483. /*
  484.  *  struct article_t - article header
  485.  *
  486.  *  article.artnum:
  487.  *    article number in spool directory for group
  488.  *
  489.  *  article.thread:
  490.  *    -1 initial default
  491.  *    -2 means article has expired (wasn't found in file search
  492.  *    of spool directory for the group)
  493.  *    >=0 points to another arts[] (struct article_t)
  494.  *
  495.  *  article.inthread:
  496.  *    FALSE for the first article in a thread, TRUE for all
  497.  *    following articles in thread
  498.  *
  499.  *  article.unread:
  500.  *    boolean, has this article been read or not
  501.  *
  502.  *  article.killed:
  503.  *    boolean, has this article been killed
  504.  *
  505.  *  article.hot:
  506.  *    boolean, has this article been auto-selected
  507.  *
  508.  *  article.tagged:
  509.  *    count, has this article been tagged for saving (>0) or not (=0)
  510.  *
  511.  *  article.date
  512.  *    date: line used for sorting articles by date order
  513.  *
  514.  *  article.archive:
  515.  *    archive name used in *source* groups
  516.  *
  517.  *  article.part:
  518.  *    part no. of archive
  519.  *
  520.  *  article.patch:
  521.  *    patch no. of archive
  522.  *
  523.  */
  524.  
  525. struct article_t {
  526.     long artnum;
  527.     char *subject;        /* Subject: line from mail header */
  528.     char *from;        /* From: line from mail header (address) */
  529.     char *name;        /* From: line from mail header (full name) */
  530.     int thread;
  531.     int inthread;
  532.     unsigned int unread:2;    /* 0 = read, 1 = unread, 2 = will return */
  533.     unsigned int killed:1;    /* 0 = not killed, 1 = killed */
  534.     unsigned int hot:1;    /* 0 = not hot, 1 = hot */
  535.     int tagged;        /* 0 = not tagged, >0 = tagged */
  536.     char date[16];        /* Date: line from mail header */
  537.     char *archive;        /* Archive-name: line from mail header */
  538.     char *part;        /* part no. of archive */
  539.     char *patch;        /* patch no. of archive */
  540. };
  541.  
  542. /*
  543.  *  struct attribute_t - configurable attributes on a per group basis
  544.  */
  545.  
  546. struct attribute_t {
  547.     char *server;            /* read group locally/via nntp server */
  548.     char *maildir;            /* mail dir if other than ~/Mail */
  549.     char *savedir;            /* save dir if other than ~/News */
  550.     char *sigfile;            /* sig file if other than ~/.Sig */
  551.     unsigned int read:1;        /* marked TRUE if group was entered during session */
  552.     unsigned int showall:1;        /* 0 = only unread, 1 = all */
  553.     unsigned int thread:1;        /* 0 = unthread, 1 = thread */
  554.     unsigned int sortby:4;        /* 0 = none, 1 = , 2 = , 3 = , 4 = , */
  555.     unsigned int author:4;        /* 0 = none, 1 = name, 2 = addr, 3 = both */
  556.     unsigned int autosave:1;    /* 0 = none, 1 = save */
  557.     unsigned int process:4;        /* 0 = none, 1 = shar, 2 = uudecode, 
  558.                          3 = uud & list zoo, 4 = uud & ext zoo*/
  559. };
  560.  
  561. /*
  562.  *  struct group_t - newsgroup info from active file
  563.  */
  564.  
  565. struct group_t {
  566.     char *name;
  567.     long max;
  568.     long min;
  569.     char moderated;
  570.     int next;            /* next active entry in hash chain */
  571.     int flag;
  572.     struct attribute_t attribute;    /* per group attributes */ 
  573. };
  574.  
  575. /*
  576.  *  used in hashstr.c
  577.  */
  578.  
  579. struct hashnode {
  580.     char *s;                        /* the string we're saving */
  581.     struct hashnode *next;            /* chain for spillover */
  582. };
  583.  
  584. /*
  585.  *  used in kill.c
  586.  */
  587.  
  588. struct kill_t {
  589.     unsigned int kill_type:8;
  590.     unsigned int kill_how:8;    /* kill/auto select */
  591.     long kill_group;
  592.     char *kill_subj;
  593.     char *kill_from;
  594. };
  595.  
  596. struct save_t {
  597.     char *subject;
  598.     char *dir;
  599.     char *file;
  600.     char *archive;
  601.     char *part;
  602.     char *patch;
  603.     int index;    
  604.     int saved;    
  605.     int is_mailbox;    
  606. };
  607.  
  608. struct screen_t {
  609.     char *col;
  610. };
  611.  
  612. struct posted_t {
  613.     char date[10];
  614.     char group[80];
  615.     char action;
  616.     char subj[120];
  617. };
  618.  
  619. struct art_stat_t {
  620.     int total;    /* total article count */
  621.     int unread;    /* number of unread articles (does not include seen) arts */
  622.     int seen;    /* number of seen articles (ART_WILL_RETURN) */
  623.     int hot_total;    /* total hot count */
  624.     int hot_unread; /* hot and unread */
  625.     int hot_seen;    /* hot and seen */
  626.     char art_mark;    /* mark to use for this thread - not used for groups */
  627. };
  628.  
  629. struct spooldir_t {
  630.     int state;
  631.     char *name;
  632.     char *comment;
  633. };
  634.  
  635. /*
  636.  *  function prototypes    & extern definitions    
  637.  */ 
  638.  
  639. #include    "patchlev.h"
  640. #include    "extern.h"
  641. #include    "proto.h"
  642.