summaryrefslogtreecommitdiffstats
path: root/maildir/maildirnewshared.h
diff options
context:
space:
mode:
Diffstat (limited to 'maildir/maildirnewshared.h')
-rw-r--r--maildir/maildirnewshared.h182
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