diff options
Diffstat (limited to 'maildir/maildirmkdir.c')
| -rw-r--r-- | maildir/maildirmkdir.c | 77 | 
1 files changed, 77 insertions, 0 deletions
| diff --git a/maildir/maildirmkdir.c b/maildir/maildirmkdir.c new file mode 100644 index 0000000..28a3ac2 --- /dev/null +++ b/maildir/maildirmkdir.c @@ -0,0 +1,77 @@ +/* +** Copyright 2000 Double Precision, Inc. +** See COPYING for distribution information. +*/ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include	<sys/types.h> +#include	<sys/stat.h> +#include	<string.h> +#include	<stdlib.h> +#if	HAVE_UNISTD_H +#include	<unistd.h> +#endif +#include	<errno.h> + +#include	"maildirmisc.h" + + +int maildir_mkdir(const char *dir) +{ +char	*buf, *p; +size_t	l; + +	if (dir == 0 || dir[0] == 0) +	{ +		errno = EINVAL; +		return (-1); +	} +	l = strlen(dir); +	if ((buf = malloc(l + sizeof("/tmp"))) == 0) +	{ +		errno = ENOMEM; +		return (-1); +	} +	strcpy(buf, dir); +	strcpy(buf+l, "/cur"); + +	/* We do mkdir -p here */ + +	p = buf+1; +	while ((p = strchr(p, '/')) != 0) +	{ +		*p = '\0'; +		if (mkdir(buf, 0700) < 0 && errno != EEXIST) +		{ +			free(buf); +			return (-1); +		} +		*p++ = '/'; +	} + +	if (mkdir(buf, 0700) < 0 && errno != EEXIST) { +		free(buf); +		return (-1); +	} +	strcpy(buf+l, "/new"); +	if (mkdir(buf, 0700) < 0 && errno != EEXIST) { +		free(buf); +		return (-1); +	} +	/* +	 *  make /tmp last because this is the one we open first - +	 *  the existence of this directory implies the whole +	 *  Maildir structure is complete +	 */ +	strcpy(buf+l, "/tmp"); +	if (mkdir(buf, 0700) < 0 && errno != EEXIST) { +		free(buf); +		return (-1); +	} +	free(buf); +	return (0); +} + | 
