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