1 /*
2 ** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
3 ** distribution information.
4 */
5
6
7 /*
8 */
9 #include "sqwebmail.h"
10 #include "sqconfig.h"
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #if HAVE_UNISTD_H
15 #include <unistd.h>
16 #endif
17 #include <sys/types.h>
18 #include <sys/stat.h>
19 #include "maildir/maildircreate.h"
20
21 /* Assume all configuration data fits in 256 char buffer. */
22
23 static char linebuf[256];
24
read_sqconfig(const char * dir,const char * configfile,time_t * mtime)25 const char *read_sqconfig(const char *dir, const char *configfile, time_t *mtime)
26 {
27 char *p=malloc(strlen(dir) + strlen(configfile) + 2);
28 struct stat stat_buf;
29 FILE *f;
30
31 if (!p) enomem();
32 strcat(strcat(strcpy(p, dir), "/"), configfile);
33 f=fopen(p, "r");
34 free(p);
35 if (!f) return (0);
36 if (fstat(fileno(f), &stat_buf) != 0 ||
37 !fgets(linebuf, sizeof(linebuf), f))
38 {
39 fclose(f);
40 return (0);
41 }
42 fclose(f);
43 if (mtime) *mtime=stat_buf.st_mtime;
44
45 linebuf[sizeof(linebuf)-1]=0;
46 if ((p=strchr(linebuf, '\n')) != 0) *p=0;
47 return (linebuf);
48 }
49
write_sqconfig(const char * dir,const char * configfile,const char * val)50 void write_sqconfig(const char *dir, const char *configfile, const char *val)
51 {
52 char *p=malloc(strlen(dir) + strlen(configfile) + 2);
53
54 struct maildir_tmpcreate_info createInfo;
55 FILE *fp;
56
57 if (!p) enomem();
58
59 strcat(strcat(strcpy(p, dir), "/"), configfile);
60 if (!val)
61 {
62 unlink(p);
63 free(p);
64 return;
65 }
66
67 maildir_tmpcreate_init(&createInfo);
68
69 createInfo.maildir=dir;
70 createInfo.uniq="config";
71 createInfo.doordie=1;
72
73 fp=maildir_tmpcreate_fp(&createInfo);
74
75 if (!fp)
76 enomem();
77
78
79 free(createInfo.newname);
80 createInfo.newname=p;
81
82 fprintf(fp, "%s\n", val);
83 fflush(fp);
84 if (ferror(fp)) eio("Error after write:",p);
85 fclose(fp);
86
87 /* Note - umask should already turn off the 077 bits, but
88 ** just in case someone screwed up previously, I'll fix it
89 ** myself */
90
91 chmod(createInfo.tmpname, 0600);
92 rename(createInfo.tmpname, createInfo.newname);
93 maildir_tmpcreate_free(&createInfo);
94 }
95