home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / tin / part11 / init.c < prev    next >
C/C++ Source or Header  |  1992-05-20  |  14KB  |  522 lines

  1. /*
  2.  *  Project   : tin - a threaded Netnews reader
  3.  *  Module    : init.c
  4.  *  Author    : I.Lea
  5.  *  Created   : 01-04-91
  6.  *  Updated   : 09-05-92
  7.  *  Notes     :
  8.  *  Copyright : (c) Copyright 1991-92 by Iain Lea
  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    "tin.h"
  16.  
  17. char rcdir[PATH_LEN];
  18. char rcfile[PATH_LEN];
  19. char indexdir[PATH_LEN];
  20. char killfile[PATH_LEN];
  21. char postfile[PATH_LEN];
  22. char unthreadfile[PATH_LEN];
  23. char cvers[LEN];
  24. char nntp_server[LEN];
  25. char active_file[PATH_LEN];
  26. char subscriptions_file[PATH_LEN];
  27. char homedir[PATH_LEN];
  28. char userid[LEN];
  29. char delgroups[LEN];
  30. char default_maildir[PATH_LEN];            /* mailbox dir where = saves are stored */
  31. char newsrc[PATH_LEN];
  32. char newnewsrc[PATH_LEN];
  33. char add_addr[LEN];            /* address to add to rR reply to author with mail */
  34. char bug_addr[LEN];            /* address to add send bug reports to */
  35. char txt_help_bug_report[LEN];    /* address to add send bug reports to */
  36. char reply_to[LEN];            /* Reply-To: address */
  37. char my_org[LEN];            /* Organization: */
  38. char my_distribution[LEN];        /* Distribution: */
  39. char default_sigfile[PATH_LEN];
  40. char default_signature[PATH_LEN];
  41. char default_shell_command[LEN];    /* offers user default choice */
  42. char killsubj[LEN];            /* contains Subject:'s not to be shown */
  43. char killfrom[LEN];            /* conatins From:'s not to be shown */
  44. char page_header[LEN];        /* page header of pgm name and version */
  45. char default_savedir[PATH_LEN];            /* directory to save articles to */
  46. char spooldir[PATH_LEN];        /* directory where news is */
  47. char spooldir_alias[PATH_LEN];        /* alias of spooldir being used */
  48. char mail_news_user[LEN];    /* mail new news to this user address */
  49. char mailer[PATH_LEN];            /* mail program */
  50. char mailbox[PATH_LEN];            /* system mailbox for each user */
  51. char printer[LEN];            /* printer program specified from tinrc */
  52. char cmd_line_printer[LEN];    /* printer program specified on cmd line */
  53. char article[PATH_LEN];            /* ~/.article file */
  54. char dead_article[PATH_LEN];    /* ~/dead.article file */
  55. char progname[PATH_LEN];        /* program name */
  56. char redirect_output[LEN];    /* /dev/null or nothing if -D option */
  57.  
  58. int xindex_supported = FALSE;
  59. int xuser_supported = FALSE;
  60. int xspooldir_supported = FALSE;
  61. int NOTESLINES;                        /* set in set_win_size () */
  62. int RIGHT_POS;                        /* set in set_win_size () */
  63. int MORE_POS;                        /* set in set_win_size () */
  64. int confirm_action;
  65. int max_subj = 0;
  66. int max_from = 0;
  67. int max_active;
  68. int num_active;                        /* one past top of active */
  69. int group_top;                        /* one past top of my_group */
  70. int groupname_len = 0;                    /* one past top of my_group */
  71. int catchup = FALSE;                /* mark all arts read in all subscribed groups */
  72. int update_fork = FALSE;            /* update index files by forked tin -u */
  73. int verbose = FALSE;                /* update index files only mode */
  74. int start_line_offset;                /* used by invoke_editor for line no. */
  75. int inn_nntp_server = FALSE;            /* read news via INN NNTP */
  76. int read_news_via_nntp = FALSE;        /* read news locally or via NNTP */
  77. int local_index;                    /* do private indexing? */
  78. int max_art;
  79. int real_gid;
  80. int real_uid;
  81. int real_umask;
  82. int start_editor_offset;
  83. int tin_uid;
  84. int tin_gid;
  85. int top = 0;
  86. int top_base;
  87. int check_any_unread = FALSE;
  88. int notify_new_groups = FALSE;
  89. int start_any_unread = FALSE;
  90.  
  91. int catchup_read_groups;    /* ask if read groups are to be marked read */
  92. int cmd_line;                /* batch / interactive mode */
  93. int created_rcdir;            /* checks if first time tin is started */
  94. int default_printer;        /* set to false if user give a printer with -p switch */
  95. int default_show_author;    /* show_author value from 'M' menu in tinrc */
  96. int draw_arrow_mark;        /* draw -> or highlighted bar */
  97. int full_page_scroll;        /* page half/full screen of articles/groups */
  98. int killed_articles;        /* killed / auto-selected hot articles */
  99. int mark_saved_read;        /* mark saved article/thread as read */
  100. int num_of_hot_arts;
  101. int num_of_killed_arts;
  102. int num_of_tagged_arts;
  103. int process_id;
  104. int pos_first_unread;        /* position cursor at first/last unread article */
  105. int post_proc_type;            /* type of post processing to be performed */
  106. int print_header;            /* print all of mail header or just Subject: & From lines */
  107. int save_archive_name;        /* save thread with name from Archive-name: field */
  108. int mail_news;                /* mail all arts to specified user */
  109. int save_news;                /* save all arts to savedir structure */
  110. int show_author;            /* show Subject & From or only Subject in group menu */
  111. int show_only_unread;        /* show only new/unread arts or all arts */
  112. int spooldir_is_active;            /* set TRUE if current spooldir is active news feed */
  113. int sort_art_type;            /* sort arts[] array by subject,from or date field */
  114. int thread_arts;            /* thread/unthread articles for viewing */
  115.  
  116. #ifdef INDEX_DAEMON
  117. int update = TRUE;                    /* update index files only mode */
  118. #else
  119. int update = FALSE;                    /* update index files only mode */
  120. #endif
  121.  
  122. struct passwd *myentry;
  123.  
  124.  
  125. /*
  126.  * Get users home directory, userid, and a bunch of other stuff!
  127.  */
  128.  
  129. void init_selfinfo ()
  130. {
  131.     extern char *getlogin ();
  132.     extern struct passwd *getpwnam ();
  133.     char nam[LEN];
  134.     char *p;
  135.     FILE *fp;
  136.     struct stat sb;
  137.  
  138.     process_id = getpid ();
  139.     
  140.     tin_uid = geteuid ();
  141.     tin_gid = getegid ();
  142.     real_uid = getuid ();
  143.     real_gid = getgid ();
  144.  
  145.     real_umask = umask (0);
  146.     umask (real_umask);
  147.     
  148. #ifdef SVR4
  149.     setlocale (LC_ALL, "");
  150. #endif
  151.         
  152.     /*
  153.      * we're setuid, so index in /usr/spool/news even if user root
  154.      * This is quite essential if non local index files are 
  155.      * to be updated during the night from crontab by root.
  156.      */
  157.     if (tin_uid != real_uid) {
  158.         local_index = FALSE;
  159.         set_real_uid_gid ();
  160.  
  161.     } else {    /* index in users home directory ~/.tin/.index */
  162.         local_index = TRUE;
  163.     }
  164.  
  165.     myentry = (struct passwd *) 0;
  166.     if ((p = getlogin ()) != (char *) 0) {
  167.         myentry = getpwnam (p);
  168.     } else {
  169.         myentry = getpwuid (getuid ());
  170.     }
  171.  
  172.     strcpy (userid, myentry->pw_name);
  173.  
  174.     if ((p = (char *) getenv ("HOME")) != NULL) {
  175.         strcpy (homedir, p);
  176.     } else {
  177.         strcpy (homedir, myentry->pw_dir);
  178.     }
  179.  
  180.     catchup_read_groups = FALSE;
  181.     confirm_action = TRUE;
  182.     created_rcdir = FALSE;
  183. #ifdef USE_INVERSE_HACK
  184.     inverse_okay = FALSE;
  185.     draw_arrow_mark = TRUE;
  186. #else
  187.     draw_arrow_mark = FALSE;
  188. #endif
  189.     default_move_group = 0;
  190. #ifdef BSD
  191.     default_printer = TRUE;
  192. #else    
  193.     default_printer = FALSE;
  194. #endif
  195.     default_show_author = SHOW_FROM_NAME;
  196.     full_page_scroll = TRUE;
  197.     killed_articles = FALSE;
  198.     mark_saved_read = TRUE;
  199.     num_of_hot_arts = 0;
  200.     num_of_killed_arts = 0;
  201.     num_of_tagged_arts = 0;
  202.     post_proc_type = POST_PROC_NONE;
  203.     pos_first_unread = TRUE;
  204.     print_header = FALSE;
  205.     save_archive_name = TRUE;
  206.     save_news = FALSE;
  207.     show_only_unread = FALSE;
  208.     sort_art_type = SORT_BY_DATE_ASCEND;
  209.     start_editor_offset = TRUE;
  210.     thread_arts = TRUE;
  211.     
  212.     killsubj[0] = '\0';
  213.     killfrom[0] = '\0';
  214.     
  215.     cmd_line_printer[0] = '\0';
  216.     default_author_search[0] = '\0';
  217.     default_goto_group[0] = '\0';
  218.     default_group_search[0] = '\0';
  219.     default_subject_search[0] = '\0';
  220.     default_art_search[0] = '\0';
  221.     default_crosspost_group[0] = '\0';
  222.     default_mail_address[0] = '\0';
  223.     default_pipe_command[0] = '\0';
  224.     default_post_subject[0] = '\0';
  225.     default_regex_pattern[0] = '\0';
  226.     default_save_file[0] = '\0';
  227.     default_shell_command[0] = '\0';
  228.     nntp_server[0] = '\0';
  229.     proc_ch_default = 'n';
  230.  
  231.     /*
  232.      * set start spooldir to active newsfeed
  233.      */
  234.     strcpy (spooldir_alias, "news");
  235.     strcpy (spooldir, SPOOLDIR);
  236.  
  237.     set_tindir ();    
  238.  
  239.     sprintf (active_file, "%s/active", LIBDIR);
  240.     sprintf (article, "%s/.article", homedir);
  241.     sprintf (dead_article, "%s/dead.article", homedir);
  242.     sprintf (delgroups, "%s/.delgroups", homedir);
  243.     sprintf (mailbox, "%s/%s", DEFAULT_MAILBOX, userid);
  244.     sprintf (default_maildir, "%s/%s", homedir, DEFAULT_MAILDIR);
  245.     sprintf (default_savedir, "%s/News", homedir);
  246.     sprintf (default_sigfile, "%s/.Sig", homedir);
  247.     sprintf (default_signature, "%s/.signature", homedir);
  248.     sprintf (subscriptions_file, "%s/subscriptions", LIBDIR);
  249.  
  250.     strcpy (mailer, get_val ("MAILER", DEFAULT_MAILER));
  251.     strcpy (printer, DEFAULT_PRINTER);
  252.     strcpy (spooldir, SPOOLDIR);
  253.     strcpy (bug_addr, BUG_REPORT_ADDRESS);
  254.     strcpy (redirect_output, "> /dev/null 2>&1");
  255.  
  256. #ifdef INDEX_DAEMON
  257.     strcpy (newsrc, active_file);    /* so that all groups are indexed */
  258.     sprintf (indexdir, "%s/.index", spooldir);
  259.  
  260.     if (stat (indexdir, &sb) == -1) {
  261.         mkdir (indexdir, 0777);
  262.     }
  263. #else
  264.     if (stat (rcdir, &sb) == -1) {
  265.         created_rcdir = TRUE;
  266.         mkdir (rcdir, 0755);
  267.     }
  268.     if (tin_uid != real_uid) {
  269.         sprintf (indexdir, "%s/.index", spooldir);
  270.  
  271.         set_tin_uid_gid ();
  272.         if (stat (indexdir, &sb) == -1) {
  273.             mkdir (indexdir, 0777);
  274.         }
  275.         set_real_uid_gid ();
  276.     } else if (stat (indexdir, &sb) == -1) {
  277.         mkdir (indexdir, 0755);
  278.     }
  279.     if (stat (postfile, &sb) == -1) {
  280.         if ((fp = fopen (postfile, "w")) != NULL) {
  281.             fclose (fp);
  282.         }
  283.     }
  284.     if (stat (unthreadfile, &sb) == -1) {
  285.         if ((fp = fopen (unthreadfile, "w")) != NULL) {
  286.             fclose (fp);
  287.         }
  288.     }
  289.  
  290.     read_rcfile ();
  291.  
  292.     show_author = default_show_author;
  293.  
  294. #endif /* INDEX_DAEMON */    
  295.  
  296.     if (stat (active_file, &sb) >= 0)
  297.         goto got_active;
  298.  
  299.     /*
  300.      *  I hate forgetting to define LIBDIR correctly.  Guess a couple
  301.      *  of the likely places if it's not where LIBDIR says it is.
  302.      */
  303.  
  304.     strcpy (active_file, "/usr/lib/news/active");
  305.     if (stat (active_file, &sb) >= 0)
  306.         goto got_active;
  307.  
  308.     strcpy (active_file, "/usr/local/lib/news/active");
  309.     if (stat (active_file, &sb) >= 0)
  310.         goto got_active;
  311.  
  312.     strcpy (active_file, "/usr/public/lib/news/active");
  313.     if (stat (active_file, &sb) >= 0)
  314.         goto got_active;
  315.  
  316.     /*
  317.      *  Oh well. Revert to what LIBDIR says it is to produce a useful
  318.      *  error message when read_active_file () fails later.
  319.      */
  320.  
  321.     sprintf (active_file, "%s/active", LIBDIR);
  322.  
  323. got_active:
  324.  
  325.     /*
  326.      *  check enviroment for ORGANIZATION / NEWSORG
  327.      */
  328.     my_org[0] = '\0';
  329. #ifdef apollo
  330.     if ((p = (char *) getenv ("NEWSORG")) != NULL) {
  331. #else    
  332.     if ((p = (char *) getenv ("ORGANIZATION")) != NULL) {
  333. #endif
  334.         my_strncpy (my_org, p, sizeof (my_org));
  335.         goto got_org;
  336.     }
  337.  
  338.     /*
  339.      *  check ~/.tin/organization for organization
  340.      */
  341.     sprintf (nam, "%s/organization", rcdir);
  342.     fp = fopen (nam, "r");
  343.  
  344.     /*
  345.      *  check LIBDIR/organization for system wide organization
  346.      */
  347.     if (fp == NULL) {
  348.         sprintf (nam, "%s/organization", LIBDIR);
  349.         fp = fopen (nam, "r");
  350.     }
  351.  
  352.     if (fp == NULL) {
  353.         sprintf (nam, "/usr/lib/news/organization");
  354.         fp = fopen (nam, "r");
  355.     }
  356.  
  357.     if (fp == NULL) {
  358.         sprintf (nam, "/usr/local/lib/news/organization");
  359.         fp = fopen (nam, "r");
  360.     }
  361.  
  362.     if (fp == NULL) {
  363.         sprintf (nam, "/usr/public/lib/news/organization");
  364.         fp = fopen (nam, "r");
  365.     }
  366.  
  367.     if (fp == NULL) {
  368.         sprintf (nam, "/etc/organization");
  369.         fp = fopen (nam, "r");
  370.     }
  371.  
  372.     if (fp != NULL) {
  373.         if (fgets (my_org, sizeof (my_org), fp) != NULL) {
  374.             for (p = my_org; *p && *p != '\n'; p++)
  375.                 continue;
  376.             *p = '\0';
  377.         }
  378.         fclose (fp);
  379.     }
  380.  
  381. got_org:;
  382.  
  383.     /*
  384.      *  check enviroment for REPLYTO
  385.      */
  386.     reply_to[0] = '\0';
  387.     if ((p = (char *) getenv ("REPLYTO")) != NULL) {
  388.         my_strncpy (reply_to, p, sizeof (reply_to));
  389.         goto got_reply;
  390.     }
  391.  
  392.     sprintf (nam, "%s/replyto", rcdir);
  393.     if ((fp = fopen (nam, "r")) != NULL) {
  394.         if (fgets (reply_to, sizeof (reply_to), fp) != NULL) {
  395.             reply_to[strlen (reply_to)-1] = '\0';
  396.         }
  397.         fclose (fp);
  398.     }
  399.  
  400. got_reply:;
  401.  
  402.     /*
  403.      *  check enviroment for DISTRIBUTION
  404.      */
  405.     my_distribution[0] = '\0';
  406.     if ((p = (char *) getenv ("DISTRIBUTION")) != NULL) {
  407.         my_strncpy (my_distribution, p, sizeof (my_distribution));
  408.     }
  409.  
  410.     /*
  411.      *  check enviroment for ADD_ADDRESS
  412.       */
  413.     add_addr[0] = '\0';
  414.     if ((p = (char *) getenv ("ADD_ADDRESS")) != NULL) {
  415.         my_strncpy (add_addr, p, sizeof (add_addr));
  416.         goto got_add_addr;
  417.     }
  418.  
  419.     sprintf (nam, "%s/add_address", rcdir);
  420.     if ((fp = fopen (nam, "r")) != NULL) {
  421.         if (fgets (add_addr, sizeof (add_addr), fp) != NULL) {
  422.             add_addr[strlen (add_addr)-1] = '\0';
  423.         }
  424.         fclose (fp);
  425.     }
  426.  
  427. got_add_addr:;
  428.  
  429.     /*
  430.      *  check enviroment for BUG_ADDRESS
  431.      */
  432.     if ((p = (char *) getenv ("BUG_ADDRESS")) != NULL) {
  433.         my_strncpy (bug_addr, p, sizeof (bug_addr));
  434.         goto got_bug_addr;
  435.     }
  436.  
  437.     sprintf (nam, "%s/bug_address", rcdir);
  438.     if ((fp = fopen (nam, "r")) != NULL) {
  439.         if (fgets (bug_addr, sizeof (bug_addr), fp) != NULL) {
  440.             bug_addr[strlen (bug_addr)-1] = '\0';
  441.         }
  442.         fclose (fp);
  443.     }
  444.  
  445. got_bug_addr:;
  446.     sprintf (txt_help_bug_report, txt_help_bug, bug_addr);
  447. }
  448.  
  449. /*
  450.  * Set up ~/.tin directory & support files depending on where the news
  451.  * is being read from (ie. active news / CD-ROM spooldir).  Note that
  452.  * any control files which may be specific to a given spooldir (various
  453.  * CD issues versus live news) should be under the spooldir_alias 
  454.  * subdirectory also.
  455.  */
  456.  
  457. void set_tindir ()
  458. {
  459.     extern int reread_active_file;
  460.     struct stat sb;
  461.     
  462.     if (strcmp (spooldir_alias, "news") != 0) {
  463.         sprintf (rcdir,  "%s/%s", get_val ("TINDIR", homedir), RCDIR);
  464.         /*
  465.          * Create directories
  466.          */
  467.         if (stat (rcdir, &sb) == -1) {
  468.             mkdir (rcdir, 0755);
  469.         }
  470.         sprintf (rcdir, "%s/%s", rcdir, spooldir_alias); 
  471.         if (stat (rcdir, &sb) == -1) {
  472.             created_rcdir = TRUE;
  473.             mkdir (rcdir, 0755);
  474.         }
  475.         /*
  476.          * Use a separate .newsrc file for every spooldir 
  477.          */
  478.         sprintf (newsrc, "%s/.newsrc", rcdir);
  479.         sprintf (newnewsrc, "%s/.newnewsrc", rcdir);
  480.  
  481.         spooldir_is_active = FALSE;
  482.         reread_active_file = FALSE;
  483.         alarm (0);
  484.     } else {
  485.         if (stat (rcdir, &sb) == -1) {
  486.             mkdir (rcdir, 0755);
  487.         }
  488.         sprintf (rcdir,  "%s/%s", get_val ("TINDIR", homedir), RCDIR);
  489.         sprintf (rcfile,   "%s/%s", rcdir, RCFILE);
  490.         sprintf (killfile, "%s/%s", rcdir, KILLFILE);
  491.         sprintf (postfile, "%s/%s", rcdir, POSTFILE);
  492.         sprintf (unthreadfile, "%s/%s", rcdir, UNTHREADFILE);
  493.         sprintf (newsrc, "%s/.newsrc", homedir);
  494.         sprintf (newnewsrc, "%s/.newnewsrc", homedir);
  495.  
  496.         spooldir_is_active = TRUE;
  497.         reread_active_file = TRUE;
  498.     }
  499.     sprintf (indexdir, "%s/%s", rcdir, INDEXDIR);
  500.     if (stat (indexdir, &sb) == -1) {
  501.         mkdir (indexdir, 0755);
  502.     }
  503. }
  504.  
  505.  
  506. int create_mail_save_dirs ()
  507. {
  508.     int created = FALSE;
  509.     struct stat sb;
  510.     
  511.     if (stat (default_maildir, &sb) == -1) {
  512.         mkdir (default_maildir, 0755);
  513.         created = TRUE;
  514.     }
  515.     if (stat (default_savedir, &sb) == -1) {
  516.         mkdir (default_savedir, 0755);
  517.         created = TRUE;
  518.     }
  519.     
  520.     return (created);
  521. }
  522.