home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / tulp-3.0.3 / part01 / lp.c < prev    next >
C/C++ Source or Header  |  1993-04-15  |  8KB  |  371 lines

  1. /*-------------------------------------------------------------------------
  2.  *  Listserv - Unix Mailing List manager (sub-set of FRECP's
  3.  *             Bitnet Listserv tool.
  4.  *
  5.  *  Copyright (C) 1991,1992  Kimmo Suominen, Christophe Wolfhugel
  6.  *
  7.  *  Please read the files COPYRIGHT and AUTHORS for the extended
  8.  *  copyrights refering to this file.
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 1, or (at your option)
  13.  *  any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  *----------------------------------------------------------------------*/
  24.  
  25. static char rcsid[] = "@(#)$Id: lp.c,v 1.11 92/12/04 09:15:55 wolf Exp $";
  26.  
  27. /*
  28.  * $Log:    lp.c,v $
  29.  * Revision 1.11  92/12/04  09:15:55  wolf
  30.  * Updated some syslog defines
  31.  * 
  32.  * Revision 1.10  92/07/14  15:43:09  wolf
  33.  * Authorized comments in lists; removed third field in file.
  34.  * 
  35.  * Revision 1.9  92/06/12  07:11:21  listserv
  36.  * Initial 2.00 release
  37.  * 
  38.  */
  39.  
  40. #include <stdio.h>
  41. #include <string.h>
  42. #include <stdlib.h>
  43. #include <unistd.h>
  44. #include <sys/param.h>
  45. #include <sys/types.h>
  46. #include <sys/stat.h>
  47. #include <dirent.h>
  48. #include <sys/times.h>
  49. #include "conf.h"
  50. #include "ext.h"
  51. #include "str.h"
  52. #include <limits.h>
  53. #ifdef FAKESYSLOG
  54. # include "fakesyslog.h"
  55. #else
  56. # include <syslog.h>
  57. #endif
  58.  
  59. extern char From[],To[];
  60.  
  61. struct ITEM {
  62.   struct ITEM *next;
  63.   char *value;
  64. };
  65.  
  66. static struct ITEM *commentList=NULL,*commentPtr=NULL;
  67. static struct ITEM *editorList=NULL,*editorPtr=NULL;
  68. static struct ITEM *ownerList=NULL,*ownerPtr=NULL;
  69. static struct ITEM *userList=NULL,*userPtr=NULL;
  70.  
  71. static char review[16],send[16],subscription[16];
  72. static char lname[64],replyto[128],errorsto[128];
  73.  
  74. static char buf2[512];
  75.  
  76. int IsEditor(char *s)
  77. {
  78.    struct ITEM *p;
  79.  
  80.    for (p=editorList; p!=NULL; p=p->next) {
  81.       if (strspacecmp(p->value,s)==0) return(1);
  82.    } /* endfor */
  83.    return(0);
  84. }
  85.  
  86. int IsOwner(char *s)
  87. {
  88.    struct ITEM *p;
  89.  
  90.    for (p=ownerList; p!=NULL; p=p->next) {
  91.       if (strspacecmp(p->value,s)==0) return(1);
  92.    } /* endfor */
  93.    return(0);
  94. }
  95.  
  96. int IsUser(char *s)
  97. {
  98.    struct ITEM *p;
  99.  
  100.    for (p=userList; p!=NULL; p=p->next) {
  101.       if (strspacecmp(p->value,s)==0) return(1);
  102.    } /* endfor */
  103.    return(0);
  104. }
  105.  
  106. void RewindUserList()
  107. {
  108.    userPtr=userList;
  109. }
  110.  
  111. char *GetUser(char *s)
  112. {
  113.    struct ITEM *p;
  114.  
  115.    if (userPtr==NULL) return(NULL);
  116.    p=userPtr; userPtr=userPtr->next;
  117.    if (s!=NULL) strcpy(s,p->value);
  118.    return(p->value);
  119. }
  120.  
  121. void RewindCommentList()
  122. {
  123.    commentPtr=commentList;
  124. }
  125.  
  126. char *GetComment(char *s)
  127. {
  128.    struct ITEM *p;
  129.  
  130.    if (commentPtr==NULL) return(NULL);
  131.    p=commentPtr; commentPtr=commentPtr->next;
  132.    if (s!=NULL) strcpy(s,p->value);
  133.    return(p->value);
  134. }
  135.  
  136. void RewindEditorList()
  137. {
  138.    editorPtr=editorList;
  139. }
  140.  
  141. char *GetEditor(char *s)
  142. {
  143.    struct ITEM *p;
  144.  
  145.    if (editorPtr==NULL) return(NULL);
  146.    p=editorPtr; editorPtr=editorPtr->next;
  147.    if (s!=NULL) strcpy(s,p->value);
  148.    return(p->value);
  149. }
  150.  
  151. void RewindOwnerList()
  152. {
  153.    ownerPtr=ownerList;
  154. }
  155.  
  156. char *GetOwner(char *s)
  157. {
  158.    struct ITEM *p;
  159.  
  160.    if (ownerPtr==NULL) return(NULL);
  161.    p=ownerPtr; ownerPtr=ownerPtr->next;
  162.    if (s!=NULL) strcpy(s,p->value);
  163.    return(p->value);
  164. }
  165.  
  166.  
  167. /*
  168.  * Returns:  0 if new entry, 1 if updated.
  169.  */
  170.  
  171. int  AddItem(struct ITEM **head,char *s)
  172. {
  173.   struct ITEM *p,*q,*r;
  174.  
  175.   q=NULL;
  176.   for (p= *head; p!=NULL; p=p->next) {
  177.     if (p->value[0]=='#') { q=p; continue; }
  178.     if (strspacecmp(s,p->value)==0) {
  179.       p->value=(char *)realloc(p->value,strlen(s)+1);
  180.       strcpy(p->value,s);
  181.       return(1);
  182.     } /* endif */
  183.     if (strspacecmp(s,p->value)<0) {
  184.       r=(struct ITEM *)malloc(sizeof(struct ITEM));
  185.       r->value=(char *)malloc(strlen(s)+1);
  186.       if (q==NULL) *head=r; else q->next=r;
  187.       r->next=p;
  188.       strcpy(r->value,s);
  189.       return(0);
  190.     } /* endif */
  191.     q=p;
  192.   } /* endfor */
  193.   p=(struct ITEM *)malloc(sizeof(struct ITEM));
  194.   p->value=(char *)malloc(strlen(s)+1);
  195.   p->next=NULL;
  196.   strcpy(p->value,s);
  197.   if (q!=NULL) q->next=p; else *head=p;
  198.   return(0);
  199. }
  200.  
  201.  
  202. /*
  203.  * Returns 0 is OK, -1 is key not found
  204.  */
  205.  
  206. int DelItem(struct ITEM **head,char *s)
  207. {
  208.   struct ITEM *p,*q;
  209.  
  210.   q=NULL;
  211.   for (p= *head; p!=NULL; p=p->next) {
  212.     if (strspacecmp(s,p->value)==0) {
  213.       if (q==NULL) *head=p->next; else q->next=p->next;
  214.       free(p->value);
  215.       free(p);
  216.       return(0);
  217.     } /* endif */
  218.     q=p;
  219.   } /* endfor */
  220.   return(-1);
  221. }
  222.  
  223. int  DelUser(char *s)
  224. {
  225.    return(DelItem(&userList,s));
  226. }
  227.  
  228. int  AddUser(char *s)
  229. {
  230.    return(AddItem(&userList,s));
  231. }
  232.  
  233. void AddEditor(char *s)
  234. {
  235.    AddItem(&editorList,s);
  236. }
  237.  
  238. void AddOwner(char *s)
  239. {
  240.    AddItem(&ownerList,s);
  241. }
  242.  
  243. void DelList(struct ITEM **head)
  244. {
  245.   struct ITEM *p;
  246.  
  247.    while (*head!=NULL) {
  248.       p= *head; *head=p->next;
  249.       free(p->value);
  250.       free(p);
  251.    } /* endwhile */
  252.    *head=NULL;
  253. }
  254.  
  255. #define DELIM "# =\r\n\t"
  256.  
  257. void parseComment(char *s)
  258. {
  259.    char *kw;
  260.  
  261.    kw=strtok(buf2,DELIM);
  262.    if (kw==NULL) return;
  263.    if (strcasecmp(kw,"owner")==0) {
  264.       kw=strtok(NULL,DELIM);
  265.       if (kw!=NULL) AddItem(&ownerList,kw);
  266.       return;
  267.    } /* endif */
  268.    if (strcasecmp(kw,"editor")==0) {
  269.       kw=strtok(NULL,DELIM);
  270.       if (kw!=NULL) AddItem(&editorList,kw);
  271.       return;
  272.    } /* endif */
  273.    if (strcasecmp(kw,"review")==0) {
  274.       kw=strtok(NULL,DELIM);
  275.       if (kw!=NULL) strcpy(review,kw);
  276.       return;
  277.    } /* endif */
  278.    if (strcasecmp(kw,"send")==0) {
  279.       kw=strtok(NULL,DELIM);
  280.       if (kw!=NULL) strcpy(send,kw);
  281.       return;
  282.    } /* endif */
  283.    if (strcasecmp(kw,"subscription")==0) {
  284.       kw=strtok(NULL,DELIM);
  285.       if (kw!=NULL) strcpy(subscription,kw);
  286.       return;
  287.    } /* endif */
  288.    if (strcasecmp(kw,"reply-to")==0) {
  289.       kw=strtok(NULL,DELIM);
  290.       if (kw!=NULL) strcpy(replyto,kw);
  291.       return;
  292.    } /* endif */
  293.    if (strcasecmp(kw,"errors-to")==0) {
  294.       kw=strtok(NULL,DELIM);
  295.       if (kw!=NULL) strcpy(errorsto,kw);
  296.       return;
  297.    } /* endif */
  298. }
  299.  
  300.  
  301. /*
  302.  * Returns: 0 on success, -1 is list.u file not found
  303.  */
  304.  
  305. int  ReadUserList(char *s)
  306. {
  307.    FILE *f;
  308.  
  309.    strcpy(review,"all");
  310.    strcpy(send,"all");
  311.    strcpy(subscription,"open");
  312.    strcpy(replyto,"list,respect");
  313.    errorsto[0]=0;
  314.    sprintf(lname,"%s.u",s); f=fopen(lname,"r");
  315.    if (f==NULL) { syslog(LOG_ERR,"can't open %s",lname); return(-1); }
  316.    while (fgets(buf2,256,f)!=NULL) {
  317.       strtok(buf2,"\r\n"); if (buf2[0]==0) continue;
  318.       if (buf2[0]=='#') 
  319.          { AddItem(&commentList,buf2); parseComment(buf2); continue; }
  320.       AddUser(buf2);
  321.    } /* endwhile */
  322.    fclose(f);
  323.    return(0);
  324. }
  325.  
  326. void WriteUserList()
  327. {
  328.    FILE *f;
  329.  
  330.    f=fopen("tmpfile","w");
  331.    RewindCommentList(); RewindUserList();
  332.    while (GetComment(buf2)!=NULL) fprintf(f,"%s\n",buf2);
  333.    while (GetUser(buf2)!=NULL) fprintf(f,"%s\n",buf2);
  334.    fclose(f);
  335.    rename("tmpfile",lname);
  336.    unlink("tmpfile");
  337. }
  338.  
  339. void CloseUserList()
  340. {
  341.    DelList(&userList);
  342.    DelList(&editorList);
  343.    DelList(&ownerList);
  344.    DelList(&commentList);
  345. }
  346.  
  347. char *GetSubscription()
  348. {
  349.    return(subscription);
  350. }
  351.  
  352. char *GetReview()
  353. {
  354.    return(review);
  355. }
  356.  
  357. char *GetSend()
  358. {
  359.    return(send);
  360. }
  361.  
  362. char *GetReplyTo()
  363. {
  364.    return(replyto);
  365. }
  366.  
  367. char *GetErrorsTo()
  368. {
  369.    return(errorsto);
  370. }
  371.