diff options
| author | Sam Varshavchik | 2013-08-19 16:39:41 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2013-08-25 14:43:51 -0400 | 
| commit | 9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch) | |
| tree | 7a81a04cb51efb078ee350859a64be2ebc6b8813 /maildir/maildirgetnew.c | |
| parent | a9520698b770168d1f33d6301463bb70a19655ec (diff) | |
| download | courier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2 | |
Initial checkin
Imported from subversion report, converted to git. Updated all paths in
scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'maildir/maildirgetnew.c')
| -rw-r--r-- | maildir/maildirgetnew.c | 153 | 
1 files changed, 153 insertions, 0 deletions
| diff --git a/maildir/maildirgetnew.c b/maildir/maildirgetnew.c new file mode 100644 index 0000000..0ef75db --- /dev/null +++ b/maildir/maildirgetnew.c @@ -0,0 +1,153 @@ +/* +** Copyright 2000-2004 Double Precision, Inc. +** See COPYING for distribution information. +*/ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <sys/types.h> +#if HAVE_DIRENT_H +#include <dirent.h> +#define NAMLEN(dirent) strlen((dirent)->d_name) +#else +#define dirent direct +#define NAMLEN(dirent) (dirent)->d_namlen +#if HAVE_SYS_NDIR_H +#include <sys/ndir.h> +#endif +#if HAVE_SYS_DIR_H +#include <sys/dir.h> +#endif +#if HAVE_NDIR_H +#include <ndir.h> +#endif +#endif +#include	<sys/types.h> +#include	<sys/stat.h> +#include	<stdio.h> +#include	<string.h> +#include	<stdlib.h> +#include	<time.h> +#include	<errno.h> +#if	HAVE_UNISTD_H +#include	<unistd.h> +#endif + +#include	"maildirmisc.h" + + +static void do_maildir_getnew(const char *, const char *, +			      void (*)(const char *, void *), +			      void *); + +void maildir_getnew(const char *maildir, const char *folder, +		    void (*callback_func)(const char *, void *), +		    void *callback_arg) +{ +char	*dir=maildir_folderdir(maildir, folder); +char	*newd, *curd; + +	if (!dir)	return; + +	newd=malloc(strlen(dir)+sizeof("/new")); +	curd=malloc(strlen(dir)+sizeof("/cur")); + +	if (newd && curd) +	{ +		strcat(strcpy(newd, dir), "/new"); +		strcat(strcpy(curd, dir), "/cur"); +		do_maildir_getnew(newd, curd, callback_func, callback_arg); +	} + +	if (newd)	free(newd); +	if (curd)	free(curd); +	free(dir); +} + +static void do_maildir_getnew(const char *newd, const char *curd, +			      void (*callback_func)(const char *, void *), +			      void *callback_arg) +{ +	DIR	*dirp; +	struct dirent *de; +	int keepgoing; +	int n; +	char *new_buf[20]; +	char *cur_buf[20]; + +	do +	{ +		keepgoing=0; +		n=0; + +		dirp=opendir(newd); +		while (dirp && (de=readdir(dirp)) != 0) +		{ +			char	*np, *cp; + +			if (de->d_name[0] == '.')	continue; + +			if ((np=malloc(strlen(newd)+strlen(de->d_name)+2)) +			    != 0) +			{ +				if ((cp=malloc(strlen(curd)+strlen(de->d_name) +					       + sizeof("/" MDIRSEP "2,"))) +				    != 0) +				{ +					char *a; + +					strcat(strcat(strcpy(np, newd), "/"), +					       de->d_name); +					strcat(strcat(strcpy(cp, curd), "/"), +					       de->d_name); +					a=strchr(cp+strlen(curd), MDIRSEP[0]); +					if (a && strncmp(a, MDIRSEP "2,", 3)) +					{ +						*a=0; +						a=0; +					} +					if (!a)	strcat(cp, MDIRSEP "2,"); +					new_buf[n]=np; +					cur_buf[n]=cp; + +					if (++n >= sizeof(cur_buf)/ +					    sizeof(cur_buf[0])) +					{ +						keepgoing=1; +						break; +					} +				} +				else +					free(np); +			} +		} +		if (dirp)	closedir(dirp); + +		while (n) +		{ +			char *np, *cp; + +			--n; + +			np=new_buf[n]; +			cp=cur_buf[n]; + +			if (rename(np, cp)) +			{ +				fprintf(stderr, +					"ERR: rename(%s,%s) failed:" +					" %s\n", np, cp, strerror(errno)); +				keepgoing=0; +				/* otherwise we could have infinite loop */ +			} + +			if (callback_func) +				(*callback_func)(strrchr(cp, '/')+1, +						 callback_arg); +			free(np); +			free(cp); +		} +	} while (keepgoing); +} | 
