diff options
Diffstat (limited to 'maildir/maildirnewshared.h')
| -rw-r--r-- | maildir/maildirnewshared.h | 182 | 
1 files changed, 182 insertions, 0 deletions
| diff --git a/maildir/maildirnewshared.h b/maildir/maildirnewshared.h new file mode 100644 index 0000000..30de283 --- /dev/null +++ b/maildir/maildirnewshared.h @@ -0,0 +1,182 @@ +#ifndef	maildirnewshared_h +#define	maildirnewshared_h + +/* +** Copyright 2003-2004 Double Precision, Inc. +** See COPYING for distribution information. +*/ + +#if	HAVE_CONFIG_H +#include	"config.h" +#endif + +#include	<sys/types.h> + +#if HAVE_SYS_STAT_H +#include	<sys/stat.h> +#endif + +#ifdef  __cplusplus +extern "C" { +#endif + + +/* +** New-style shared folder support. +*/ + +extern int maildir_newshared_disabled; +	/* +	** Set this to 1 to effectively disable new-style shared folders. +	** The functions below will function normally, but as if there are +	** no shared folders configured (the top level configuration file is +	** empty). +	*/ + +/* +** Read the shared folder index file, which points to everyone else's +** maildirs. +** +** maildir_newshared_enum() invokes the callback function for each listed +** shared folder. +** The callback function receives a structure with the following fields: +** +** Name, home directory, maildir directory, uid/gid of the shared account, the +** pass-through argument. +** +** The maildir directory will get defaulted to "./Maildir", if not +** specified. +** +** A NULL home directory means that the administrator configured a hierarchy +** of shared folders, and the maildir argument points to another shared +** folder hierarchy, whose name is given. +** +** A nonzero return from the callback function terminates the enumeration, +** and maildir_newshared_enum itself returns non-zero.  A zero return +** continues the enumeration.  After the entire list is enumerated +** maildir_newshared_enum returns 0. +** +** maildir_newshared_enum returns -1 if indexfile cannot be opened. +*/ + +struct maildir_newshared_enum_cb { +	off_t startingpos; /* In index file */ +	const char *name; +	const char *homedir; +	const char *maildir; +	uid_t uid; +	gid_t gid; +	void *cb_arg; +	const char *indexfile;	/* Original index file */ +	FILE *fp;		/* INTERNAL USE */ +	size_t linenum;		/* INTERNAL USE */ +}; + +/* +** Open an index file.  Returns 0 on success, -1 on failure. +** Initializes maildir_newshared_enum_cb structure. +*/ + +int maildir_newshared_open(const char *indexfile, +			   struct maildir_newshared_enum_cb *info); + +/* +** Read next record from the index file.  Invokes the callback function, +** and returns the return value from the callback function. +** +** If reached end of index file, sets *eof to non-zero and returns 0. +*/ + +int maildir_newshared_next(struct maildir_newshared_enum_cb *info, +			   int *eof, +			   int (*cb_func)(struct maildir_newshared_enum_cb *), +			   void *cb_arg); + +/* +** Same as maildir_newshared_next, but seeks to the given offset first. +*/ + +int maildir_newshared_nextAt(struct maildir_newshared_enum_cb *info, +			     int *eof, +			     int (*cb_func)(struct maildir_newshared_enum_cb*), +			     void *cb_arg); + +/* Close it */ + +void maildir_newshared_close(struct maildir_newshared_enum_cb *info); + +int maildir_newshared_enum(const char *indexfile, +			   int (*cb_func)(struct maildir_newshared_enum_cb *), +			   void *cb_arg); + + +/**************************************************************** + ** + ** High level access to the shared folder index + ** + ****************************************************************/ + +/* +** Application defines this function that returns the filename of the +** top level shared cache index file: +*/ +extern const char *maildir_shared_index_file(); + +/* +** Anticipate common shared folder index usage patterns, buffer levels +** of index cache files in memory. +** +** An entire shared folder index cache file is loaded into the following +** structure: +*/ + +struct maildir_shindex_cache { +	struct maildir_shindex_cache *next; /* Next level cached, if any */ +	char *hierarchy; /* Always "" for the topmost level, +			 ** then "foo", "bar", etc... */ + +	struct maildir_newshared_enum_cb indexfile; /* Opened index file */ + +	size_t nrecords; /* # of cached records */ +	struct maildir_shindex_record *records; /* The cached array */ +}; + +struct maildir_shindex_record { +	char *name; +	off_t offset; /* Its starting position in indexfile, get rest of data +		      ** there. +		      */ +}; + +/* +** The following function finds a shared index file for the following +** subhierarchy. +** +** The subhierarchy is references by its parent loaded hierarchy, and the +** subhierarchy name. +** +** If parent's next->hierarchy happens to be the same as the name of the +** requested hierarchy, it's already loaded, and nothing needs to be done. +** +*/ + +struct maildir_shindex_cache * +maildir_shared_cache_read(struct maildir_shindex_cache *parent, +			  const char *indexfile, +			  const char *subhierarchy); +/* +** Set all three argument to NULL in order to cache the topmost cache level. +** +** Else set 'parent' to an existing entry, indexfile to the index file +** (obtained from maildir_newshared_next's callback), and subhierarchy +** to the subhierarchy name (same source) to read a subhierarchy. +** +*/ + + +#ifdef  __cplusplus +} +#endif + + +#endif | 
