106 uid_t chown_uid, gid_t chown_gid,
107 int lock_style,
const char *def_dsn,
110 struct stat local_statbuf;
140 && (
stat(path, st) < 0 || S_ISREG(st->st_mode))) {
143 }
else if (errno == EEXIST) {
163 if ((fp =
safe_open(path, flags | O_NONBLOCK, mode, st,
164 chown_uid, chown_gid, why->
reason)) == 0) {
166 if (locked & MBOX_DOT_LOCK)
178 #define HUNKY_DORY(lock_mask, myflock_style) ((lock_style & (lock_mask)) == 0 \
179 || deliver_flock(vstream_fileno(fp), (myflock_style), why->reason) == 0)
181 if (S_ISREG(st->st_mode)) {
184 locked |= lock_style;
187 if (locked & MBOX_DOT_LOCK)
205 if (S_ISREG(st->st_mode)
209 msg_warn(
"%s: file status changed unexpectedly", path);
210 if (locked & MBOX_DOT_LOCK)
245 #define TRY_AGAIN_ERROR(e) \
246 (e == EAGAIN || e == ESTALE)
247 #define SYSTEM_FULL_ERROR(e) \
249 #define MBOX_FULL_ERROR(e) \
250 (e == EDQUOT || e == EFBIG)
const char * mbox_dsn(int err, const char *def_dsn)
char * mystrdup(const char *str)
#define MBOX_DOT_LOCK_MAY_FAIL
#define TRY_AGAIN_ERROR(e)
void dot_unlockfile(const char *path)
#define HUNKY_DORY(lock_mask, myflock_style)
#define MBOX_FULL_ERROR(e)
int dot_lockfile(const char *path, VSTRING *why)
int vstream_fclose(VSTREAM *stream)
void msg_warn(const char *fmt,...)
void mbox_release(MBOX *mp)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
DSN_BUF * dsb_status(DSN_BUF *dsb, const char *status)
VSTREAM * safe_open(const char *path, int flags, mode_t mode, struct stat *st, uid_t user, gid_t group, VSTRING *why)
#define MYFLOCK_STYLE_FLOCK
#define vstream_fileno(vp)
MBOX * mbox_open(const char *path, int flags, mode_t mode, struct stat *st, uid_t chown_uid, gid_t chown_gid, int lock_style, const char *def_dsn, DSN_BUF *why)
#define MYFLOCK_STYLE_FCNTL
int close_on_exec(int fd, int on)
#define SYSTEM_FULL_ERROR(e)
void * mymalloc(ssize_t len)