annotate src/lib-storage/index/mbox/mbox-lock.c @ 9002:9d0037a997f4 HEAD

Initial commit for config rewrite.
author Timo Sirainen <tss@iki.fi>
date Tue, 27 Jan 2009 18:21:53 -0500
parents a9dd29e7dc4f
children 21d4363a3cf7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8529
diff changeset
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
4 #include "restrict-access.h"
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
5 #include "nfs-workarounds.h"
3500
98cf57713f0a added extra assert for checking deadlocks
Timo Sirainen <tss@iki.fi>
parents: 3280
diff changeset
6 #include "mail-index-private.h"
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "mbox-storage.h"
8529
e7b0a099c33d mbox: Don't cache mbox state after it has been unlocked.
Timo Sirainen <tss@iki.fi>
parents: 8502
diff changeset
8 #include "istream-raw-mbox.h"
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mbox-file.h"
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "mbox-lock.h"
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <time.h>
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <stdlib.h>
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <unistd.h>
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <fcntl.h>
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include <sys/stat.h>
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #ifdef HAVE_FLOCK
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 # include <sys/file.h>
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #endif
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 /* 0.1 .. 0.2msec */
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #define LOCK_RANDOM_USLEEP_TIME (100000 + (unsigned int)rand() % 100000)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
25 enum mbox_lock_type {
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
26 MBOX_LOCK_DOTLOCK,
6178
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
27 MBOX_LOCK_DOTLOCK_TRY,
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
28 MBOX_LOCK_FCNTL,
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
29 MBOX_LOCK_FLOCK,
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
30 MBOX_LOCK_LOCKF,
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
31
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
32 MBOX_LOCK_COUNT
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
33 };
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
34
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
35 enum mbox_dotlock_op {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
36 MBOX_DOTLOCK_OP_LOCK,
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
37 MBOX_DOTLOCK_OP_UNLOCK,
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
38 MBOX_DOTLOCK_OP_TOUCH
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
39 };
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
40
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
41 struct mbox_lock_context {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
42 struct mbox_mailbox *mbox;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
43 int lock_status[MBOX_LOCK_COUNT];
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3680
diff changeset
44 bool checked_file;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
45
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
46 int lock_type;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3680
diff changeset
47 bool dotlock_last_stale;
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
48 bool fcntl_locked;
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
49 bool using_privileges;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
50 };
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
51
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
52 struct mbox_lock_data {
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
53 enum mbox_lock_type type;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
54 const char *name;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
55 int (*func)(struct mbox_lock_context *ctx, int lock_type,
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
56 time_t max_wait_time);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
57 };
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
58
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
59 static int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
60 time_t max_wait_time);
6178
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
61 static int mbox_lock_dotlock_try(struct mbox_lock_context *ctx, int lock_type,
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
62 time_t max_wait_time);
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
63 static int mbox_lock_fcntl(struct mbox_lock_context *ctx, int lock_type,
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
64 time_t max_wait_time);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
65 #ifdef HAVE_FLOCK
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
66 static int mbox_lock_flock(struct mbox_lock_context *ctx, int lock_type,
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
67 time_t max_wait_time);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
68 #else
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
69 # define mbox_lock_flock NULL
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
70 #endif
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
71 #ifdef HAVE_LOCKF
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
72 static int mbox_lock_lockf(struct mbox_lock_context *ctx, int lock_type,
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
73 time_t max_wait_time);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
74 #else
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
75 # define mbox_lock_lockf NULL
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
76 #endif
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
77
8027
62cf70991cf2 extern/static fixes (from a sparse check by Diego Liziero)
Timo Sirainen <tss@iki.fi>
parents: 7472
diff changeset
78 static struct mbox_lock_data lock_data[] = {
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
79 { MBOX_LOCK_DOTLOCK, "dotlock", mbox_lock_dotlock },
6178
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
80 { MBOX_LOCK_DOTLOCK_TRY, "dotlock_try", mbox_lock_dotlock_try },
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
81 { MBOX_LOCK_FCNTL, "fcntl", mbox_lock_fcntl },
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
82 { MBOX_LOCK_FLOCK, "flock", mbox_lock_flock },
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
83 { MBOX_LOCK_LOCKF, "lockf", mbox_lock_lockf },
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
84 { 0, NULL, NULL }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
85 };
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
86
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
87 static int mbox_lock_list(struct mbox_lock_context *ctx, int lock_type,
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
88 time_t max_wait_time, int idx);
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
89 static int mbox_unlock_files(struct mbox_lock_context *ctx);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
91 static void mbox_read_lock_methods(const char *str, const char *env,
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
92 enum mbox_lock_type *locks)
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
93 {
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
94 enum mbox_lock_type type;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
95 const char *const *lock;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
96 int i, dest;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
97
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
98 for (lock = t_strsplit(str, " "), dest = 0; *lock != NULL; lock++) {
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
99 for (type = 0; lock_data[type].name != NULL; type++) {
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
100 if (strcasecmp(*lock, lock_data[type].name) == 0) {
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
101 type = lock_data[type].type;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
102 break;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
103 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
104 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
105 if (lock_data[type].name == NULL)
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
106 i_fatal("%s: Invalid value %s", env, *lock);
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
107 if (lock_data[type].func == NULL) {
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
108 i_fatal("%s: Support for lock type %s "
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
109 "not compiled into binary", env, *lock);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
110 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
111
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
112 for (i = 0; i < dest; i++) {
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
113 if (locks[i] == type)
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
114 i_fatal("%s: Duplicated value %s", env, *lock);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
115 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
116
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
117 /* @UNSAFE */
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
118 locks[dest++] = type;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
119 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
120 locks[dest] = (enum mbox_lock_type)-1;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
121 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
122
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
123 static void mbox_init_lock_settings(struct mbox_storage *storage)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 {
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
125 enum mbox_lock_type read_locks[MBOX_LOCK_COUNT+1];
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
126 enum mbox_lock_type write_locks[MBOX_LOCK_COUNT+1];
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
127 int r, w;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
129 mbox_read_lock_methods(storage->set->mbox_read_locks,
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
130 "mbox_read_locks", read_locks);
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
131 mbox_read_lock_methods(storage->set->mbox_write_locks,
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
132 "mbox_write_locks", write_locks);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
134 /* check that read/write list orders match. write_locks must contain
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
135 at least read_locks and possibly more. */
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
136 for (r = w = 0; write_locks[w] != (enum mbox_lock_type)-1; w++) {
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
137 if (read_locks[r] == (enum mbox_lock_type)-1)
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
138 break;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
139 if (read_locks[r] == write_locks[w])
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
140 r++;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
141 }
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
142 if (read_locks[r] != (enum mbox_lock_type)-1) {
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
143 i_fatal("mbox read/write lock list settings are invalid. "
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
144 "Lock ordering must be the same with both, "
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
145 "and write locks must contain all read locks "
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
146 "(and possibly more)");
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
147 }
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
148
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
149 storage->read_locks = p_new(storage->storage.pool,
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
150 enum mbox_lock_type, MBOX_LOCK_COUNT+1);
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
151 memcpy(storage->read_locks, read_locks,
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
152 sizeof(*storage->read_locks) * (MBOX_LOCK_COUNT+1));
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
154 storage->write_locks = p_new(storage->storage.pool,
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
155 enum mbox_lock_type, MBOX_LOCK_COUNT+1);
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
156 memcpy(storage->write_locks, write_locks,
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
157 sizeof(*storage->write_locks) * (MBOX_LOCK_COUNT+1));
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
159 storage->lock_settings_initialized = TRUE;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
162 static int mbox_file_open_latest(struct mbox_lock_context *ctx, int lock_type)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
163 {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
164 struct mbox_mailbox *mbox = ctx->mbox;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
165 struct stat st;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
166
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
167 if (ctx->checked_file || lock_type == F_UNLCK)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
168 return 0;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
169
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
170 if (mbox->mbox_fd != -1) {
7316
258477a3f1e7 Don't try to flush NFS file handle cache for mbox files.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
171 /* we could flush NFS file handle cache here if we wanted to
258477a3f1e7 Don't try to flush NFS file handle cache for mbox files.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
172 be sure that the file is latest, but mbox files get rarely
258477a3f1e7 Don't try to flush NFS file handle cache for mbox files.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
173 deleted and the flushing might cause errors (e.g. EBUSY for
258477a3f1e7 Don't try to flush NFS file handle cache for mbox files.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
174 trying to flush a /var/mail mountpoint) */
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
175 if (nfs_safe_stat(mbox->path, &st) < 0) {
8502
570927dfc769 mbox: If mailbox is deleted under us, try to avoid logging errors.
Timo Sirainen <tss@iki.fi>
parents: 8371
diff changeset
176 if (errno == ENOENT)
570927dfc769 mbox: If mailbox is deleted under us, try to avoid logging errors.
Timo Sirainen <tss@iki.fi>
parents: 8371
diff changeset
177 mailbox_set_deleted(&mbox->ibox.box);
570927dfc769 mbox: If mailbox is deleted under us, try to avoid logging errors.
Timo Sirainen <tss@iki.fi>
parents: 8371
diff changeset
178 else
570927dfc769 mbox: If mailbox is deleted under us, try to avoid logging errors.
Timo Sirainen <tss@iki.fi>
parents: 8371
diff changeset
179 mbox_set_syscall_error(mbox, "stat()");
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
180 return -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
181 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
182
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
183 if (st.st_ino != mbox->mbox_ino ||
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
184 !CMP_DEV_T(st.st_dev, mbox->mbox_dev))
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
185 mbox_file_close(mbox);
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
186 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
187
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
188 if (mbox->mbox_fd == -1) {
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
189 if (mbox_file_open(mbox) < 0)
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
190 return -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
191 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
192
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
193 ctx->checked_file = TRUE;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
194 return 0;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
195 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
196
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3680
diff changeset
197 static bool dotlock_callback(unsigned int secs_left, bool stale, void *context)
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
198 {
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
199 struct mbox_lock_context *ctx = context;
3009
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
200 enum mbox_lock_type *lock_types;
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
201 int i;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
202
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
203 if (ctx->using_privileges)
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
204 restrict_access_drop_priv_gid();
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
205
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
206 if (stale && !ctx->dotlock_last_stale) {
3009
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
207 /* get next index we wish to try locking. it's the one after
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
208 dotlocking. */
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
209 lock_types = ctx->lock_type == F_WRLCK ||
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
210 (ctx->lock_type == F_UNLCK &&
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
211 ctx->mbox->mbox_lock_type == F_WRLCK) ?
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
212 ctx->mbox->storage->write_locks :
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
213 ctx->mbox->storage->read_locks;
3009
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
214
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
215 for (i = 0; lock_types[i] != (enum mbox_lock_type)-1; i++) {
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
216 if (lock_types[i] == MBOX_LOCK_DOTLOCK)
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
217 break;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
218 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
219
3009
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
220 if (lock_types[i] != (enum mbox_lock_type)-1 &&
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
221 lock_types[i+1] != (enum mbox_lock_type)-1) {
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
222 i++;
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
223 if (mbox_lock_list(ctx, ctx->lock_type, 0, i) <= 0) {
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
224 /* we couldn't get fd lock -
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
225 it's really locked */
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
226 ctx->dotlock_last_stale = TRUE;
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
227 return FALSE;
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
228 }
2ec32b88c123 Fix crashes when handling stale dotlocks.
Timo Sirainen <tss@iki.fi>
parents: 2713
diff changeset
229 (void)mbox_lock_list(ctx, F_UNLCK, 0, i);
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
230 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
231 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
232 ctx->dotlock_last_stale = stale;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
233
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
234 index_storage_lock_notify(&ctx->mbox->ibox, stale ?
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
235 MAILBOX_LOCK_NOTIFY_MAILBOX_OVERRIDE :
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
236 MAILBOX_LOCK_NOTIFY_MAILBOX_ABORT,
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
237 secs_left);
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
238 if (ctx->using_privileges) {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
239 if (restrict_access_use_priv_gid() < 0) {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
240 /* shouldn't get here */
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
241 return FALSE;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
242 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
243 }
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
244 return TRUE;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
245 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
246
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
247 static int mbox_dotlock_privileged_op(struct mbox_mailbox *mbox,
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
248 struct dotlock_settings *set,
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
249 enum mbox_dotlock_op op)
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
250 {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
251 const char *dir, *fname;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
252 int ret = -1, orig_dir_fd;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
253
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
254 orig_dir_fd = open(".", O_RDONLY);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
255 if (orig_dir_fd == -1) {
8371
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
256 mail_storage_set_critical(&mbox->storage->storage,
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
257 "open(.) failed: %m");
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
258 return -1;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
259 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
260
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
261 /* allow dotlocks to be created only for files we can read while we're
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
262 unprivileged. to make sure there are no race conditions we first
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
263 have to chdir to the mbox file's directory and then use relative
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
264 paths. unless this is done, users could:
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
265 - create *.lock files to any directory writable by the
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
266 privileged group
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
267 - DoS other users by dotlocking their mailboxes infinitely
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
268 */
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
269 fname = strrchr(mbox->path, '/');
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
270 if (fname == NULL) {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
271 /* already relative */
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
272 fname = mbox->path;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
273 } else {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
274 dir = t_strdup_until(mbox->path, fname);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
275 if (chdir(dir) < 0) {
8371
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
276 mail_storage_set_critical(&mbox->storage->storage,
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
277 "chdir(%s) failed: %m", dir);
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
278 (void)close(orig_dir_fd);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
279 return -1;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
280 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
281 fname++;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
282 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
283 if (op == MBOX_DOTLOCK_OP_LOCK) {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
284 if (access(fname, R_OK) < 0) {
8371
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
285 mail_storage_set_critical(&mbox->storage->storage,
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
286 "access(%s) failed: %m", mbox->path);
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
287 return -1;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
288 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
289 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
290
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
291 if (restrict_access_use_priv_gid() < 0) {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
292 (void)close(orig_dir_fd);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
293 return -1;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
294 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
295
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
296 switch (op) {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
297 case MBOX_DOTLOCK_OP_LOCK:
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
298 /* we're now privileged - avoid doing as much as possible */
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
299 ret = file_dotlock_create(set, fname, 0, &mbox->mbox_dotlock);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
300 if (ret > 0)
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
301 mbox->mbox_used_privileges = TRUE;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
302 break;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
303 case MBOX_DOTLOCK_OP_UNLOCK:
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
304 /* we're now privileged - avoid doing as much as possible */
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
305 ret = file_dotlock_delete(&mbox->mbox_dotlock);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
306 mbox->mbox_used_privileges = FALSE;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
307 break;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
308 case MBOX_DOTLOCK_OP_TOUCH:
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
309 if (!file_dotlock_is_locked(mbox->mbox_dotlock)) {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
310 file_dotlock_delete(&mbox->mbox_dotlock);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
311 mbox->mbox_used_privileges = TRUE;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
312 ret = -1;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
313 } else {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
314 ret = file_dotlock_touch(mbox->mbox_dotlock);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
315 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
316 break;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
317 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
318
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
319 restrict_access_drop_priv_gid();
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
320
8371
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
321 if (fchdir(orig_dir_fd) < 0) {
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
322 mail_storage_set_critical(&mbox->storage->storage,
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
323 "fchdir() failed: %m");
b46cf0979768 Use mail_storage_set_critical() instead of i_error() directly.
Timo Sirainen <tss@iki.fi>
parents: 8027
diff changeset
324 }
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
325 (void)close(orig_dir_fd);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
326 return ret;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
327 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
328
6178
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
329 static int
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
330 mbox_lock_dotlock_int(struct mbox_lock_context *ctx, int lock_type, bool try)
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
331 {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
332 struct mbox_mailbox *mbox = ctx->mbox;
3106
9c4aa309dbac Changed dotlocking API.
Timo Sirainen <tss@iki.fi>
parents: 3009
diff changeset
333 struct dotlock_settings set;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
334 int ret;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
335
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
336 if (lock_type == F_UNLCK) {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
337 if (!mbox->mbox_dotlocked)
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
338 return 1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
339
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
340 if (!mbox->mbox_used_privileges)
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
341 ret = file_dotlock_delete(&mbox->mbox_dotlock);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
342 else {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
343 ctx->using_privileges = TRUE;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
344 ret = mbox_dotlock_privileged_op(mbox, NULL,
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
345 MBOX_DOTLOCK_OP_UNLOCK);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
346 ctx->using_privileges = FALSE;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
347 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
348 if (ret <= 0) {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
349 mbox_set_syscall_error(mbox, "file_dotlock_delete()");
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
350 ret = -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
351 }
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
352 mbox->mbox_dotlocked = FALSE;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
353 return 1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
354 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
355
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
356 if (mbox->mbox_dotlocked)
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
357 return 1;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
358
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
359 ctx->dotlock_last_stale = -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
360
3106
9c4aa309dbac Changed dotlocking API.
Timo Sirainen <tss@iki.fi>
parents: 3009
diff changeset
361 memset(&set, 0, sizeof(set));
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
362 set.use_excl_lock = mbox->storage->storage.set->dotlock_use_excl;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
363 set.nfs_flush = mbox->storage->storage.set->mail_nfs_storage;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
364 set.timeout = mbox->storage->set->mbox_lock_timeout;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
365 set.stale_timeout = mbox->storage->set->mbox_dotlock_change_timeout;
3106
9c4aa309dbac Changed dotlocking API.
Timo Sirainen <tss@iki.fi>
parents: 3009
diff changeset
366 set.callback = dotlock_callback;
9c4aa309dbac Changed dotlocking API.
Timo Sirainen <tss@iki.fi>
parents: 3009
diff changeset
367 set.context = ctx;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
368
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
369 ret = file_dotlock_create(&set, mbox->path, 0, &mbox->mbox_dotlock);
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
370 if (ret < 0 && errno == EACCES && restrict_access_have_priv_gid() &&
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
371 mbox->mbox_privileged_locking) {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
372 /* try again, this time with extra privileges */
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
373 ret = mbox_dotlock_privileged_op(mbox, &set,
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
374 MBOX_DOTLOCK_OP_LOCK);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
375 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
376
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
377 if (ret < 0) {
6178
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
378 if ((ENOSPACE(errno) || errno == EACCES) && try)
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
379 return 1;
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
380
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
381 mbox_set_syscall_error(mbox, "file_lock_dotlock()");
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
382 return -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
383 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
384 if (ret == 0) {
5459
78eaf595359c Removed struct index_storage abstraction. It's pointless.
Timo Sirainen <tss@iki.fi>
parents: 5032
diff changeset
385 mail_storage_set_error(&mbox->storage->storage,
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5459
diff changeset
386 MAIL_ERROR_TEMP, MAIL_ERRSTR_LOCK_TIMEOUT);
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
387 return 0;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
388 }
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
389 mbox->mbox_dotlocked = TRUE;
3106
9c4aa309dbac Changed dotlocking API.
Timo Sirainen <tss@iki.fi>
parents: 3009
diff changeset
390
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
391 if (mbox_file_open_latest(ctx, lock_type) < 0)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
392 return -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
393 return 1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
394 }
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
395
6178
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
396 static int mbox_lock_dotlock(struct mbox_lock_context *ctx, int lock_type,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6178
diff changeset
397 time_t max_wait_time ATTR_UNUSED)
6178
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
398 {
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
399 return mbox_lock_dotlock_int(ctx, lock_type, FALSE);
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
400 }
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
401
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
402 static int mbox_lock_dotlock_try(struct mbox_lock_context *ctx, int lock_type,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6178
diff changeset
403 time_t max_wait_time ATTR_UNUSED)
6178
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
404 {
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
405 return mbox_lock_dotlock_int(ctx, lock_type, TRUE);
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
406 }
66971adb55e5 Added dotlock_try mbox lock.
Timo Sirainen <tss@iki.fi>
parents: 5974
diff changeset
407
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 #ifdef HAVE_FLOCK
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
409 static int mbox_lock_flock(struct mbox_lock_context *ctx, int lock_type,
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 time_t max_wait_time)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 time_t now, last_notify;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
414 if (mbox_file_open_latest(ctx, lock_type) < 0)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
415 return -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
416
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
417 if (lock_type == F_UNLCK && ctx->mbox->mbox_fd == -1)
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
418 return 1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
419
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 if (lock_type == F_WRLCK)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 lock_type = LOCK_EX;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 else if (lock_type == F_RDLCK)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 lock_type = LOCK_SH;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 else
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 lock_type = LOCK_UN;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 last_notify = 0;
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
428 while (flock(ctx->mbox->mbox_fd, lock_type | LOCK_NB) < 0) {
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 if (errno != EWOULDBLOCK) {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
430 mbox_set_syscall_error(ctx->mbox, "flock()");
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 return -1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 now = time(NULL);
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 if (now >= max_wait_time)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 return 0;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 if (now != last_notify) {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
439 index_storage_lock_notify(&ctx->mbox->ibox,
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 MAILBOX_LOCK_NOTIFY_MAILBOX_ABORT,
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 max_wait_time - now);
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 usleep(LOCK_RANDOM_USLEEP_TIME);
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 return 1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 #endif
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
451 #ifdef HAVE_LOCKF
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
452 static int mbox_lock_lockf(struct mbox_lock_context *ctx, int lock_type,
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
453 time_t max_wait_time)
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
454 {
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
455 time_t now, last_notify;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
456
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
457 if (mbox_file_open_latest(ctx, lock_type) < 0)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
458 return -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
459
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
460 if (lock_type == F_UNLCK && ctx->mbox->mbox_fd == -1)
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
461 return 1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
462
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
463 if (lock_type != F_UNLCK)
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
464 lock_type = F_TLOCK;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
465 else
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
466 lock_type = F_ULOCK;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
467
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
468 last_notify = 0;
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
469 while (lockf(ctx->mbox->mbox_fd, lock_type, 0) < 0) {
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
470 if (errno != EAGAIN) {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
471 mbox_set_syscall_error(ctx->mbox, "lockf()");
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
472 return -1;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
473 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
474
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
475 now = time(NULL);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
476 if (now >= max_wait_time)
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
477 return 0;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
478
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
479 if (now != last_notify) {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
480 index_storage_lock_notify(&ctx->mbox->ibox,
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
481 MAILBOX_LOCK_NOTIFY_MAILBOX_ABORT,
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
482 max_wait_time - now);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
483 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
484
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
485 usleep(LOCK_RANDOM_USLEEP_TIME);
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
486 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
487
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
488 return 1;
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
489 }
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
490 #endif
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
491
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
492 static int mbox_lock_fcntl(struct mbox_lock_context *ctx, int lock_type,
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 time_t max_wait_time)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495 struct flock fl;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 time_t now;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
497 unsigned int next_alarm;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 int wait_type;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
500 if (mbox_file_open_latest(ctx, lock_type) < 0)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
501 return -1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
502
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
503 if (lock_type == F_UNLCK && ctx->mbox->mbox_fd == -1)
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
504 return 1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
505
2129
Timo Sirainen <tss@iki.fi>
parents: 2128
diff changeset
506 memset(&fl, 0, sizeof(fl));
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 fl.l_type = lock_type;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
508 fl.l_whence = SEEK_SET;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509 fl.l_start = 0;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 fl.l_len = 0;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511
3628
571336db01f4 Added MAILBOX_OPEN_NO_INDEX_FILES flag and made streamed mboxes by default
Timo Sirainen <tss@iki.fi>
parents: 3585
diff changeset
512 if (max_wait_time == 0) {
3680
475c1fe28dad Having "dotlock fcntl" locking assert-crashes if dotlock file already
Timo Sirainen <tss@iki.fi>
parents: 3628
diff changeset
513 /* usually we're waiting here, but if we came from
475c1fe28dad Having "dotlock fcntl" locking assert-crashes if dotlock file already
Timo Sirainen <tss@iki.fi>
parents: 3628
diff changeset
514 mbox_lock_dotlock(), we just want to try locking */
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
515 wait_type = F_SETLK;
3628
571336db01f4 Added MAILBOX_OPEN_NO_INDEX_FILES flag and made streamed mboxes by default
Timo Sirainen <tss@iki.fi>
parents: 3585
diff changeset
516 } else {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
517 wait_type = F_SETLKW;
3628
571336db01f4 Added MAILBOX_OPEN_NO_INDEX_FILES flag and made streamed mboxes by default
Timo Sirainen <tss@iki.fi>
parents: 3585
diff changeset
518 now = time(NULL);
571336db01f4 Added MAILBOX_OPEN_NO_INDEX_FILES flag and made streamed mboxes by default
Timo Sirainen <tss@iki.fi>
parents: 3585
diff changeset
519 if (now >= max_wait_time)
571336db01f4 Added MAILBOX_OPEN_NO_INDEX_FILES flag and made streamed mboxes by default
Timo Sirainen <tss@iki.fi>
parents: 3585
diff changeset
520 alarm(1);
571336db01f4 Added MAILBOX_OPEN_NO_INDEX_FILES flag and made streamed mboxes by default
Timo Sirainen <tss@iki.fi>
parents: 3585
diff changeset
521 else
571336db01f4 Added MAILBOX_OPEN_NO_INDEX_FILES flag and made streamed mboxes by default
Timo Sirainen <tss@iki.fi>
parents: 3585
diff changeset
522 alarm(I_MIN(max_wait_time - now, 5));
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
523 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
524
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
525 while (fcntl(ctx->mbox->mbox_fd, wait_type, &fl) < 0) {
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 if (errno != EINTR) {
4154
7a4c7a12da9e fcntl locking: Don't print error if we're only trying to lock (instead of
Timo Sirainen <tss@iki.fi>
parents: 4115
diff changeset
527 if ((errno == EACCES || errno == EAGAIN) &&
7a4c7a12da9e fcntl locking: Don't print error if we're only trying to lock (instead of
Timo Sirainen <tss@iki.fi>
parents: 4115
diff changeset
528 wait_type == F_SETLK) {
7a4c7a12da9e fcntl locking: Don't print error if we're only trying to lock (instead of
Timo Sirainen <tss@iki.fi>
parents: 4115
diff changeset
529 /* non-blocking lock trying failed */
7a4c7a12da9e fcntl locking: Don't print error if we're only trying to lock (instead of
Timo Sirainen <tss@iki.fi>
parents: 4115
diff changeset
530 return 0;
7a4c7a12da9e fcntl locking: Don't print error if we're only trying to lock (instead of
Timo Sirainen <tss@iki.fi>
parents: 4115
diff changeset
531 }
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
532 alarm(0);
7472
aa41caaf8e0b If fcntl() fails with EACCES, give a more understandable error message since
Timo Sirainen <tss@iki.fi>
parents: 7341
diff changeset
533 if (errno != EACCES) {
aa41caaf8e0b If fcntl() fails with EACCES, give a more understandable error message since
Timo Sirainen <tss@iki.fi>
parents: 7341
diff changeset
534 mbox_set_syscall_error(ctx->mbox, "fcntl()");
aa41caaf8e0b If fcntl() fails with EACCES, give a more understandable error message since
Timo Sirainen <tss@iki.fi>
parents: 7341
diff changeset
535 return -1;
aa41caaf8e0b If fcntl() fails with EACCES, give a more understandable error message since
Timo Sirainen <tss@iki.fi>
parents: 7341
diff changeset
536 }
aa41caaf8e0b If fcntl() fails with EACCES, give a more understandable error message since
Timo Sirainen <tss@iki.fi>
parents: 7341
diff changeset
537 mail_storage_set_critical(&ctx->mbox->storage->storage,
aa41caaf8e0b If fcntl() fails with EACCES, give a more understandable error message since
Timo Sirainen <tss@iki.fi>
parents: 7341
diff changeset
538 "fcntl() failed with mbox file %s: "
aa41caaf8e0b If fcntl() fails with EACCES, give a more understandable error message since
Timo Sirainen <tss@iki.fi>
parents: 7341
diff changeset
539 "File is locked by another process (EACCES)",
aa41caaf8e0b If fcntl() fails with EACCES, give a more understandable error message since
Timo Sirainen <tss@iki.fi>
parents: 7341
diff changeset
540 ctx->mbox->path);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 return -1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 now = time(NULL);
3628
571336db01f4 Added MAILBOX_OPEN_NO_INDEX_FILES flag and made streamed mboxes by default
Timo Sirainen <tss@iki.fi>
parents: 3585
diff changeset
545 if (now >= max_wait_time) {
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
546 alarm(0);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 return 0;
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
548 }
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
549
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
550 /* notify locks once every 5 seconds.
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
551 try to use rounded values. */
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
552 next_alarm = (max_wait_time - now) % 5;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
553 if (next_alarm == 0)
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
554 next_alarm = 5;
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
555 alarm(next_alarm);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
557 index_storage_lock_notify(&ctx->mbox->ibox,
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 MAILBOX_LOCK_NOTIFY_MAILBOX_ABORT,
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 max_wait_time - now);
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2206
diff changeset
562 alarm(0);
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
563 ctx->fcntl_locked = TRUE;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 return 1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
567 static int mbox_lock_list(struct mbox_lock_context *ctx, int lock_type,
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
568 time_t max_wait_time, int idx)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 {
2103
879b0b9ed5d4 Separate mbox_locks/mbox_read_dotlock to mbox_read_locks and
Timo Sirainen <tss@iki.fi>
parents: 1983
diff changeset
570 enum mbox_lock_type *lock_types;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
571 enum mbox_lock_type type;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
572 int i, ret = 0, lock_status;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
574 ctx->lock_type = lock_type;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
576 lock_types = lock_type == F_WRLCK ||
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
577 (lock_type == F_UNLCK && ctx->mbox->mbox_lock_type == F_WRLCK) ?
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
578 ctx->mbox->storage->write_locks :
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
579 ctx->mbox->storage->read_locks;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
580 for (i = idx; lock_types[i] != (enum mbox_lock_type)-1; i++) {
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
581 type = lock_types[i];
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
582 lock_status = lock_type != F_UNLCK;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
584 if (ctx->lock_status[type] == lock_status)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
585 continue;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
586 ctx->lock_status[type] = lock_status;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
588 ret = lock_data[type].func(ctx, lock_type, max_wait_time);
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
589 if (ret <= 0)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
590 break;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 }
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
592 return ret;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
595 static int mbox_update_locking(struct mbox_mailbox *mbox, int lock_type,
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
596 bool *fcntl_locked_r)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 {
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
598 struct mbox_lock_context ctx;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 time_t max_wait_time;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3680
diff changeset
600 int ret, i;
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3680
diff changeset
601 bool drop_locks;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
603 *fcntl_locked_r = FALSE;
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
604
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
605 index_storage_lock_notify_reset(&mbox->ibox);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
607 if (!mbox->storage->lock_settings_initialized)
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
608 mbox_init_lock_settings(mbox->storage);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
610 if (mbox->mbox_fd == -1 && mbox->mbox_file_stream != NULL) {
3245
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3106
diff changeset
611 /* read-only mbox stream. no need to lock. */
8626
a9dd29e7dc4f Cleaned up read-only mailbox handling. Fixes a bug with Maildir syncing.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
612 i_assert(mbox->ibox.backend_readonly);
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
613 mbox->mbox_lock_type = lock_type;
3585
1eb7b2ad1ac0 Don't hide error message if fcntl() fails with EAGAIN/EACCES
Timo Sirainen <tss@iki.fi>
parents: 3500
diff changeset
614 return 1;
3245
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3106
diff changeset
615 }
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3106
diff changeset
616
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
617 max_wait_time = time(NULL) + mbox->storage->set->mbox_lock_timeout;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
619 memset(&ctx, 0, sizeof(ctx));
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
620 ctx.mbox = mbox;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
622 if (mbox->mbox_lock_type == F_WRLCK) {
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
623 /* dropping to shared lock. first drop those that we
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
624 don't remove completely. */
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
625 const enum mbox_lock_type *read_locks =
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
626 mbox->storage->read_locks;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
627
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
628 for (i = 0; i < MBOX_LOCK_COUNT; i++)
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
629 ctx.lock_status[i] = 1;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
630 for (i = 0; read_locks[i] != (enum mbox_lock_type)-1; i++)
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
631 ctx.lock_status[read_locks[i]] = 0;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
632 drop_locks = TRUE;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
633 } else {
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
634 drop_locks = FALSE;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
635 }
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
636
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
637 mbox->mbox_lock_type = lock_type;
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
638 ret = mbox_lock_list(&ctx, lock_type, max_wait_time, 0);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
639 if (ret <= 0) {
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
640 if (!drop_locks)
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
641 (void)mbox_unlock_files(&ctx);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 if (ret == 0) {
5459
78eaf595359c Removed struct index_storage abstraction. It's pointless.
Timo Sirainen <tss@iki.fi>
parents: 5032
diff changeset
643 mail_storage_set_error(&mbox->storage->storage,
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5459
diff changeset
644 MAIL_ERROR_TEMP, MAIL_ERRSTR_LOCK_TIMEOUT);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646 return ret;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
649 if (drop_locks) {
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
650 /* dropping to shared lock: drop the locks that are only
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
651 in write list */
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
652 const enum mbox_lock_type *read_locks =
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
653 mbox->storage->read_locks;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
654 const enum mbox_lock_type *write_locks =
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
655 mbox->storage->write_locks;
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
656
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
657 memset(ctx.lock_status, 0, sizeof(ctx.lock_status));
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
658 for (i = 0; write_locks[i] != (enum mbox_lock_type)-1; i++)
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
659 ctx.lock_status[write_locks[i]] = 1;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
660 for (i = 0; read_locks[i] != (enum mbox_lock_type)-1; i++)
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
661 ctx.lock_status[read_locks[i]] = 0;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
662
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
663 mbox->mbox_lock_type = F_WRLCK;
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
664 (void)mbox_lock_list(&ctx, F_UNLCK, 0, 0);
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
665 mbox->mbox_lock_type = F_RDLCK;
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
666 }
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
667
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
668 *fcntl_locked_r = ctx.fcntl_locked;
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
669 return 1;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
670 }
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
671
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
672 int mbox_lock(struct mbox_mailbox *mbox, int lock_type,
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
673 unsigned int *lock_id_r)
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
674 {
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
675 bool fcntl_locked;
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
676 int ret;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
677
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
678 /* allow only unlock -> shared/exclusive or exclusive -> shared */
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
679 i_assert(lock_type == F_RDLCK || lock_type == F_WRLCK);
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
680 i_assert(lock_type == F_RDLCK || mbox->mbox_lock_type != F_RDLCK);
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
681
3500
98cf57713f0a added extra assert for checking deadlocks
Timo Sirainen <tss@iki.fi>
parents: 3280
diff changeset
682 /* mbox must be locked before index */
98cf57713f0a added extra assert for checking deadlocks
Timo Sirainen <tss@iki.fi>
parents: 3280
diff changeset
683 i_assert(mbox->ibox.index->lock_type != F_WRLCK);
98cf57713f0a added extra assert for checking deadlocks
Timo Sirainen <tss@iki.fi>
parents: 3280
diff changeset
684
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
685 if (mbox->mbox_lock_type == F_UNLCK) {
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
686 ret = mbox_update_locking(mbox, lock_type, &fcntl_locked);
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
687 if (ret <= 0)
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
688 return ret;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
689
9002
9d0037a997f4 Initial commit for config rewrite.
Timo Sirainen <tss@iki.fi>
parents: 8626
diff changeset
690 if (mbox->storage->storage.set->mail_nfs_storage) {
6829
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
691 if (fcntl_locked) {
6857
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
692 nfs_flush_attr_cache_fd_locked(mbox->path,
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
693 mbox->mbox_fd);
6829
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
694 nfs_flush_read_cache_locked(mbox->path,
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
695 mbox->mbox_fd);
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
696 } else {
6857
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
697 nfs_flush_attr_cache_unlocked(mbox->path);
6829
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
698 nfs_flush_read_cache_unlocked(mbox->path,
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
699 mbox->mbox_fd);
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
700 }
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
701 }
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
702
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
703 mbox->mbox_lock_id += 2;
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
704 }
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
705
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
706 if (lock_type == F_RDLCK) {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
707 mbox->mbox_shared_locks++;
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
708 *lock_id_r = mbox->mbox_lock_id;
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
709 } else {
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
710 mbox->mbox_excl_locks++;
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
711 *lock_id_r = mbox->mbox_lock_id + 1;
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
712 }
8529
e7b0a099c33d mbox: Don't cache mbox state after it has been unlocked.
Timo Sirainen <tss@iki.fi>
parents: 8502
diff changeset
713 if (mbox->mbox_stream != NULL)
e7b0a099c33d mbox: Don't cache mbox state after it has been unlocked.
Timo Sirainen <tss@iki.fi>
parents: 8502
diff changeset
714 istream_raw_mbox_set_locked(mbox->mbox_stream);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715 return 1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
718 static int mbox_unlock_files(struct mbox_lock_context *ctx)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720 int ret = 0;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
722 if (mbox_lock_list(ctx, F_UNLCK, 0, 0) < 0)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
723 ret = -1;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
725 ctx->mbox->mbox_lock_id += 2;
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
726 ctx->mbox->mbox_lock_type = F_UNLCK;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 return ret;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
730 int mbox_unlock(struct mbox_mailbox *mbox, unsigned int lock_id)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 {
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
732 struct mbox_lock_context ctx;
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
733 bool fcntl_locked;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
734 int i;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
735
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
736 i_assert(mbox->mbox_lock_id == (lock_id & ~1));
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
737
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
738 if (lock_id & 1) {
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
739 /* dropping exclusive lock */
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
740 i_assert(mbox->mbox_excl_locks > 0);
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
741 if (--mbox->mbox_excl_locks > 0)
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
742 return 0;
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
743 if (mbox->mbox_shared_locks > 0) {
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
744 /* drop to shared lock */
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
745 if (mbox_update_locking(mbox, F_RDLCK,
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5613
diff changeset
746 &fcntl_locked) < 0)
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
747 return -1;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
748 return 0;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
749 }
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
750 } else {
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
751 /* dropping shared lock */
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
752 i_assert(mbox->mbox_shared_locks > 0);
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
753 if (--mbox->mbox_shared_locks > 0)
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
754 return 0;
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
755 if (mbox->mbox_excl_locks > 0)
2206
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
756 return 0;
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
757 }
2157c6aab530 Allow dropping exclusive mbox locks to shared locks.
Timo Sirainen <tss@iki.fi>
parents: 2205
diff changeset
758 /* all locks gone */
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759
8529
e7b0a099c33d mbox: Don't cache mbox state after it has been unlocked.
Timo Sirainen <tss@iki.fi>
parents: 8502
diff changeset
760 /* make sure we don't read the stream while unlocked */
e7b0a099c33d mbox: Don't cache mbox state after it has been unlocked.
Timo Sirainen <tss@iki.fi>
parents: 8502
diff changeset
761 if (mbox->mbox_stream != NULL)
e7b0a099c33d mbox: Don't cache mbox state after it has been unlocked.
Timo Sirainen <tss@iki.fi>
parents: 8502
diff changeset
762 istream_raw_mbox_set_unlocked(mbox->mbox_stream);
e7b0a099c33d mbox: Don't cache mbox state after it has been unlocked.
Timo Sirainen <tss@iki.fi>
parents: 8502
diff changeset
763
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
764 memset(&ctx, 0, sizeof(ctx));
3279
b698ae839a18 Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
765 ctx.mbox = mbox;
2205
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
766
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
767 for (i = 0; i < MBOX_LOCK_COUNT; i++)
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
768 ctx.lock_status[i] = 1;
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
769
821fbe3e892b Don't require dotlocking to be first in locking list.
Timo Sirainen <tss@iki.fi>
parents: 2190
diff changeset
770 return mbox_unlock_files(&ctx);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
771 }
7341
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
772
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
773 void mbox_dotlock_touch(struct mbox_mailbox *mbox)
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
774 {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
775 if (mbox->mbox_dotlock == NULL)
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
776 return;
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
777
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
778 if (!mbox->mbox_used_privileges)
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
779 (void)file_dotlock_touch(mbox->mbox_dotlock);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
780 else {
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
781 (void)mbox_dotlock_privileged_op(mbox, NULL,
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
782 MBOX_DOTLOCK_OP_TOUCH);
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
783 }
af998ae4254b Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents: 7316
diff changeset
784 }