#ifndef maildirmisc_h #define maildirmisc_h /* ** Copyright 2000-2003 Double Precision, Inc. ** See COPYING for distribution information. */ #if HAVE_CONFIG_H #include "config.h" #endif #if HAVE_SYS_STAT_H #include #endif #ifdef __cplusplus extern "C" { #endif static const char maildirmisc_h_rcsid[]="$Id: maildirmisc.h,v 1.18 2006/07/22 02:48:15 mrsam Exp $"; /* ** ** Miscellaneous maildir-related code ** */ /* Some special folders */ #define INBOX "INBOX" #define DRAFTS "Drafts" #define SENT "Sent" #define TRASH "Trash" #define SHARED "shared" #define SHAREDSUBDIR "shared-folders" #define NEWSHAREDSP "#shared" #define NEWSHARED "#shared." #define PUBLIC "public" /* SMAP */ int maildir_make(const char *maildir, int perm, int subdirperm, int folder); int maildir_del(const char *maildir); int maildir_del_content(const char *maildir); char *maildir_name2dir(const char *maildir, /* DIR location */ const char *foldername); /* INBOX.name */ char *maildir_location(const char *homedir, const char *maildir); /* ** Homedir is the account's home directory, "maildir" is where the account's ** default Maildir is configured to be (usually "./Maildir"). Combine the ** two to produce an absolute pathname. */ char *maildir_folderdir(const char *, /* maildir */ const char *); /* folder name */ /* Returns the directory corresponding to foldername (foldername is ** checked to make sure that it's a valid name, else we set errno ** to EINVAL, and return (0). */ char *maildir_filename(const char *, /* maildir */ const char *, /* folder */ const char *); /* filename */ /* ** Builds the filename to this message, suitable for opening. ** If the file doesn't appear to be there, search the maildir to ** see if someone changed the flags, and return the current filename. */ int maildir_safeopen(const char *, /* filename */ int, /* mode */ int); /* perm */ /* ** Same arguments as open(). When we're accessing a shared maildir, ** prevent someone from playing cute and dumping a bunch of symlinks ** in there. This function will open the indicate file only if the ** last component is not a symlink. ** This is implemented by opening the file with O_NONBLOCK (to prevent ** a DOS attack of someone pointing the symlink to a pipe, causing ** the open to hang), clearing O_NONBLOCK, then stat-int the file ** descriptor, lstating the filename, and making sure that dev/ino ** match. */ int maildir_semisafeopen(const char *, /* filename */ int, /* mode */ int); /* perm */ /* ** Same thing, except that we allow ONE level of soft link indirection, ** because we're reading from our own maildir, which points to the ** message in the sharable maildir. */ int maildir_safeopen_stat(const char *path, int mode, int perm, struct stat *stat1); /* Sane as maildir_safeopen(), except that we also initialize a ** struct stat, saving an extra syscall to the caller. */ int maildir_mkdir(const char *); /* directory */ /* ** Create maildir including all subdirectories in the path (like mkdir -p) */ void maildir_purgetmp(const char *); /* maildir */ /* purges old stuff out of tmp */ void maildir_purge(const char *, /* directory */ unsigned); /* time_t to purge */ void maildir_getnew(const char *, /* maildir */ const char *, /* folder */ void (*)(const char *, void *), /* Callback function for ** every moved msg. */ void *arg); /* Passthrough callback arg */ /* move messages from new to cur */ int maildir_deletefolder(const char *, /* maildir */ const char *); /* folder */ /* deletes a folder */ void maildir_list(const char *maildir, void (*func)(const char *, void *), void *voidp); void maildir_list_sharable(const char *, /* maildir */ void (*)(const char *, void *), /* callback function */ void *); /* 2nd arg to callback func */ /* list sharable folders */ int maildir_shared_subscribe(const char *, /* maildir */ const char *); /* folder */ /* subscribe to a shared folder */ void maildir_list_shared(const char *, /* maildir */ void (*)(const char *, void *), /* callback function */ void *); /* 2nd arg to the callback func */ /* list subscribed folders */ int maildir_shared_unsubscribe(const char *, /* maildir */ const char *); /* folder */ /* unsubscribe from a shared folder */ char *maildir_shareddir(const char *, /* maildir */ const char *); /* folder */ /* ** Validate and return a path to a shared folder. folderdir must be ** a name of a valid shared folder. */ void maildir_shared_sync(const char *); /* maildir */ /* "sync" the shared folder */ int maildir_sharedisro(const char *); /* maildir */ /* maildir is a shared read-only folder */ int maildir_unlinksharedmsg(const char *); /* filename */ /* Remove a message from a shared folder */ /* Internal function that reads a symlink */ char *maildir_getlink(const char *); /* Determine whether the maildir filename has a certain flag */ int maildir_hasflag(const char *filename, char); #define MAILDIR_DELETED(f) maildir_hasflag((f), 'T') /* ** Hierarchical maildir rename. */ #define MAILDIR_RENAME_FOLDER 1 #define MAILDIR_RENAME_SUBFOLDERS 2 int maildir_rename(const char *maildir, /* Path to the maildir */ const char *oldname, /* .foldername */ const char *newname, /* .foldername */ int flags, /* See above */ void (*callback_func)(const char *old_path, const char *new_path) ); #ifdef __cplusplus } #endif #endif