Mercurial > dovecot > core-2.2
annotate src/lib-dict/dict-fail.c @ 22325:e01bc3015b2f
lib-index: Check .log.2 rotation only when syncing
Instead of also whenever appending transactions to .log file. This
shouldn't change the behavior much, and it's needed for the following
change to work correctly.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Tue, 11 Jul 2017 15:33:56 +0300 |
parents | 3daf1ea24cf1 |
children | cb108f786fb4 |
rev | line source |
---|---|
21797
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2017 Dovecot authors, see the included COPYING file */ |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
2 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
4 #include "dict.h" |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
5 #include "dict-private.h" |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
6 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
7 struct dict_iterate_context dict_iter_unsupported = |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
8 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
9 .dict = &dict_driver_fail, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
10 }; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
11 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
12 struct dict_transaction_context dict_transaction_unsupported = |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
13 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
14 .dict = &dict_driver_fail, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
15 }; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
16 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
17 static int dict_fail_init(struct dict *dict_driver ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
18 const char *uri ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
19 const struct dict_settings *set ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
20 struct dict **dict_r ATTR_UNUSED, const char **error_r) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
21 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
22 *error_r = "Unsupported operation (dict does not support this feature)"; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
23 return -1; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
24 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
25 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
26 static void dict_fail_deinit(struct dict *dict ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
27 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
28 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
29 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
30 static int dict_fail_wait(struct dict *dict ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
31 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
32 return -1; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
33 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
34 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
35 static int dict_fail_lookup(struct dict *dict ATTR_UNUSED, pool_t pool ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
36 const char *key ATTR_UNUSED, const char **value_r ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
37 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
38 return -1; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
39 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
40 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
41 static struct dict_iterate_context * |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
42 dict_fail_iterate_init(struct dict *dict ATTR_UNUSED, const char *const *paths ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
43 enum dict_iterate_flags flags ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
44 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
45 return &dict_iter_unsupported; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
46 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
47 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
48 static bool dict_fail_iterate(struct dict_iterate_context *ctx ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
49 const char **key_r ATTR_UNUSED, const char **value_r ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
50 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
51 return FALSE; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
52 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
53 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
54 static int dict_fail_iterate_deinit(struct dict_iterate_context *ctx ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
55 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
56 return -1; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
57 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
58 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
59 static struct dict_transaction_context *dict_fail_transaction_init(struct dict *dict ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
60 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
61 return &dict_transaction_unsupported; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
62 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
63 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
64 static int dict_fail_transaction_commit(struct dict_transaction_context *ctx ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
65 bool async ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
66 dict_transaction_commit_callback_t *callback, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
67 void *context) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
68 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
69 if (callback != NULL) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
70 callback(DICT_COMMIT_RET_FAILED, context); |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
71 return -1; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
72 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
73 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
74 static void dict_fail_transaction_rollback(struct dict_transaction_context *ctx ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
75 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
76 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
77 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
78 static void dict_fail_set(struct dict_transaction_context *ctx ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
79 const char *key ATTR_UNUSED, const char *value ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
80 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
81 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
82 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
83 static void dict_fail_unset(struct dict_transaction_context *ctx ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
84 const char *key ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
85 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
86 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
87 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
88 static void dict_fail_atomic_inc(struct dict_transaction_context *ctx ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
89 const char *key ATTR_UNUSED, long long diff ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
90 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
91 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
92 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
93 static bool dict_fail_switch_ioloop(struct dict *dict ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
94 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
95 return TRUE; |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
96 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
97 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
98 static void dict_fail_set_timestamp(struct dict_transaction_context *ctx ATTR_UNUSED, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
99 const struct timespec *ts ATTR_UNUSED) |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
100 { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
101 } |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
102 |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
103 struct dict dict_driver_fail = { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
104 .name = "fail", |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
105 .v = { |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
106 .init = dict_fail_init, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
107 .deinit = dict_fail_deinit, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
108 .wait = dict_fail_wait, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
109 .lookup = dict_fail_lookup, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
110 .iterate_init = dict_fail_iterate_init, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
111 .iterate = dict_fail_iterate, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
112 .iterate_deinit = dict_fail_iterate_deinit, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
113 .transaction_init = dict_fail_transaction_init, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
114 .transaction_commit = dict_fail_transaction_commit, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
115 .transaction_rollback = dict_fail_transaction_rollback, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
116 .set = dict_fail_set, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
117 .unset = dict_fail_unset, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
118 .atomic_inc = dict_fail_atomic_inc, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
119 .lookup_async = NULL, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
120 .switch_ioloop = dict_fail_switch_ioloop, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
121 .set_timestamp = dict_fail_set_timestamp |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
122 }, |
3daf1ea24cf1
lib-dict: Add dict-fail driver
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
123 }; |