diff options
Diffstat (limited to 'sqwebmail/sqconfig.c')
| -rw-r--r-- | sqwebmail/sqconfig.c | 94 | 
1 files changed, 94 insertions, 0 deletions
| diff --git a/sqwebmail/sqconfig.c b/sqwebmail/sqconfig.c new file mode 100644 index 0000000..910cf08 --- /dev/null +++ b/sqwebmail/sqconfig.c @@ -0,0 +1,94 @@ +/* +** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for +** distribution information. +*/ + + +/* +*/ +#include	"sqwebmail.h" +#include	"sqconfig.h" +#include	<stdio.h> +#include	<stdlib.h> +#include	<string.h> +#if	HAVE_UNISTD_H +#include	<unistd.h> +#endif +#include	<sys/types.h> +#include	<sys/stat.h> +#include	"maildir/maildircreate.h" + +/* Assume all configuration data fits in 256 char buffer. */ + +static char linebuf[256]; + +const char *read_sqconfig(const char *dir, const char *configfile, time_t *mtime) +{ +char *p=malloc(strlen(dir) + strlen(configfile) + 2); +struct stat stat_buf; +FILE	*f; + +	if (!p)	enomem(); +	strcat(strcat(strcpy(p, dir), "/"), configfile); +	f=fopen(p, "r"); +	free(p); +	if (!f)	return (0); +	if (fstat(fileno(f), &stat_buf) != 0 || +		!fgets(linebuf, sizeof(linebuf), f)) +	{ +		fclose(f); +		return (0); +	} +	fclose(f); +	if (mtime)	*mtime=stat_buf.st_mtime; + +	linebuf[sizeof(linebuf)-1]=0; +	if ((p=strchr(linebuf, '\n')) != 0)	*p=0; +	return (linebuf); +} + +void write_sqconfig(const char *dir, const char *configfile, const char *val) +{ +	char *p=malloc(strlen(dir) + strlen(configfile) + 2); + +	struct maildir_tmpcreate_info createInfo; +	FILE *fp; + +	if (!p)	enomem(); + +	strcat(strcat(strcpy(p, dir), "/"), configfile); +	if (!val) +	{ +		unlink(p); +		free(p); +		return; +	} + +	maildir_tmpcreate_init(&createInfo); + +	createInfo.maildir=dir; +	createInfo.uniq="config"; +	createInfo.doordie=1; + +	fp=maildir_tmpcreate_fp(&createInfo); + +	if (!fp) +		enomem(); + + +	free(createInfo.newname); +	createInfo.newname=p; + +	fprintf(fp, "%s\n", val); +	fflush(fp); +	if (ferror(fp))	eio("Error after write:",p); +	fclose(fp); + +	/* Note - umask should already turn off the 077 bits, but +	** just in case someone screwed up previously, I'll fix it +	** myself */ + +	chmod(createInfo.tmpname, 0600); +	rename(createInfo.tmpname, createInfo.newname); +	maildir_tmpcreate_free(&createInfo); +} | 
