Back to index

courier  0.68.2
mailinglist.c
Go to the documentation of this file.
00001 #include "config.h"
00002 
00003 /*
00004 */
00005 
00006 #include      "sqwebmail.h"
00007 #include      "mailinglist.h"
00008 #include      "rfc822/rfc822.h"
00009 #include      <stdio.h>
00010 #include      <string.h>
00011 #include      <ctype.h>
00012 #include      <stdlib.h>
00013 #include      <unistd.h>
00014 #include      <sys/types.h>
00015 #include      <sys/stat.h>
00016 
00017 #define       MAILINGLISTS  "sqwebmail-mailinglists"
00018 #define       MAILINGLISTSTMP      "sqwebmail-mailinglists.tmp"
00019 
00020 char *getmailinglists()
00021 {
00022        FILE *fp=fopen(MAILINGLISTS, "r");
00023        struct stat stat_buf;
00024        char *buf;
00025        int l;
00026 
00027        if (!fp)
00028               return (0);
00029 
00030        if (fstat(fileno(fp), &stat_buf) != 0 ||
00031            (buf=malloc(stat_buf.st_size+1)) == NULL)
00032        {
00033               fclose(fp);
00034               return (0);
00035        }
00036 
00037        l=fread(buf, 1, stat_buf.st_size, fp);
00038        fclose(fp);
00039 
00040        if (l < 0)
00041               l=0;
00042        buf[l]=0;
00043        return (buf);
00044 }
00045 
00046 void savemailinglists(const char *p)
00047 {
00048        FILE *fp;
00049        int lastc;
00050 
00051        if ((fp=fopen(MAILINGLISTSTMP, "w")) == NULL)
00052               return;
00053 
00054        for (lastc='\n'; *p; p++)
00055        {
00056               if (isspace((int)(unsigned char)*p) && *p != '\n')
00057                      continue;
00058 
00059               if (*p == '\n' && lastc == '\n')
00060                      continue;
00061 
00062               putc(*p, fp);
00063               lastc=*p;
00064        }
00065        
00066        fprintf(fp, "%s", p);
00067        fflush(fp);
00068        if (ferror(fp))
00069        {
00070               fclose(fp);
00071               unlink(MAILINGLISTSTMP);
00072               return;
00073        }
00074        fclose(fp);
00075        rename (MAILINGLISTSTMP, MAILINGLISTS);
00076 }
00077