Mercurial > dovecot > core-2.2
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 |
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 | 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 | 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 | 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 | 61 static int mbox_lock_dotlock_try(struct mbox_lock_context *ctx, int lock_type, |
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 | 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 | 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 | 329 static int |
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 | 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 | 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 | 366 set.callback = dotlock_callback; |
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 | 378 if ((ENOSPACE(errno) || errno == EACCES) && try) |
379 return 1; | |
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 | 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 | 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 | 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 | 398 { |
399 return mbox_lock_dotlock_int(ctx, lock_type, FALSE); | |
400 } | |
401 | |
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 | 404 { |
405 return mbox_lock_dotlock_int(ctx, lock_type, TRUE); | |
406 } | |
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 | 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 | 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 | 595 static int mbox_update_locking(struct mbox_mailbox *mbox, int lock_type, |
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 | 603 *fcntl_locked_r = FALSE; |
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 | 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 | 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 | 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 | 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 | 692 nfs_flush_attr_cache_fd_locked(mbox->path, |
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 | 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 | 701 } |
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 | 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 | 745 if (mbox_update_locking(mbox, F_RDLCK, |
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 } |