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 /liblock/mail.h | |
| 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 'liblock/mail.h')
| -rw-r--r-- | liblock/mail.h | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/liblock/mail.h b/liblock/mail.h new file mode 100644 index 0000000..8980a0b --- /dev/null +++ b/liblock/mail.h @@ -0,0 +1,108 @@ + +#ifndef liblockmail_h +#define liblockmail_h + +/* +** Copyright 2002 Double Precision, Inc. See COPYING for +** distribution information. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + + /* + ** Functions for mbox mail locks + */ + +struct ll_mail { + char *file; /* File being locked */ + + /* c-client type lock */ + + int cclientfd; + char *cclientfile; + + + /* dotlock */ + + char *dotlock; +}; + +struct ll_mail *ll_mail_alloc(const char *filename); + +/* +** Create a c-client type lock. NOTE: c-clients will ping you with SIGUSR2, +** which must be ignored for this implementation. +** Returns: 0 - ok, < 0 - error. +** +** An error return from ll_mail_lock carries some additional context in +** errno: +** +** errno == EAGAIN: potential race condition. The current lock holder MIGHT +** have just terminated. The caller should sleep for AT LEAST 5 seconds, then +** try again. +** +** errno == EEXIST: another process on this server DEFINITELY has the lock. +** +** Implementations might choose to wait and try again on EEXIST as well. +*/ + +int ll_mail_lock(struct ll_mail *); + +/* +** Open the mail file, read/write (creating a dot-lock). +** Returns: >= 0 - file descriptor, < 0 - error (if EPERM, try ll_open_ro). +** +** errno == EEXIST: another process appears to hold a dot-lock. +** +** errno == EAGAIN: We just blew away a stale dotlock, should try again +** in at least five seconds. Should NOT get two EAGAIN's in a row. +*/ + +int ll_mail_open(struct ll_mail *); + +/* +** Open in read-only mode. +*/ + +int ll_mail_open_ro(struct ll_mail *); + +/* +** Release all locks, deallocate structure. NOTE: file descriptor from +** ll_mail_open(_ro)? is NOT closed, it's your responsibility to do that. +*/ + +void ll_mail_free(struct ll_mail *); + +/* +** As long as we have the logic done already, here's a generic dot-locking +** function. +** +** dotlock - the actual filename of a dotlock file. +** tmpfile - the filename of a temporary file to create first. +** timeout - optional timeout. +** +** Return code: 0: dotlock is created. Just unlink(dotlock) when you're done. +** +** -1 error. Check errno: +** +** EEXIST - dotlock is locked +** +** EAGAIN - dotlock is stale (dotlock created on this machine, and the +** process no longer exists, or dotlock created on another +** machine, and timeout argument was > 0, and the dotlock's +** timestamp was older than timeout seconds. +** +** E????? - something's broken. +** +*/ + +int ll_dotlock(const char *dotlock, const char *tmpfile, + int timeout); + +#ifdef __cplusplus +} +#endif + +#endif |
