Mercurial > dovecot > core-2.2
annotate src/login-common/login-proxy-state.c @ 22310:a28f5bfb15fc
fts: Do not attempt to deinitialize backend if it's not set
If FTS backend initialization fails or does not happen,
flist->backend might end up being NULL, and attempt to
deinitialize NULL won't end well.
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Wed, 17 May 2017 12:26:42 +0300 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2009-2017 Dovecot authors, see the included COPYING file */ |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
4 #include "net.h" |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
5 #include "ioloop.h" |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "hash.h" |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
7 #include "strescape.h" |
11817
65cda5124e99
login proxy: Set notify fd nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
11334
diff
changeset
|
8 #include "fd-set-nonblock.h" |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "login-proxy-state.h" |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
11 #include <unistd.h> |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
12 #include <fcntl.h> |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
13 |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
14 #define NOTIFY_RETRY_REOPEN_MSECS (60*1000) |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
15 |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 struct login_proxy_state { |
14918
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
17 HASH_TABLE(struct login_proxy_record *, |
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
18 struct login_proxy_record *) hash; |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 pool_t pool; |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
20 |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
21 const char *notify_path; |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
22 int notify_fd; |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
23 |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
24 struct timeout *to_reopen; |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 }; |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
27 static int login_proxy_state_notify_open(struct login_proxy_state *state); |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
28 |
14918
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
29 static unsigned int |
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
30 login_proxy_record_hash(const struct login_proxy_record *rec) |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 { |
10087
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
32 return net_ip_hash(&rec->ip) ^ rec->port; |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 } |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
14918
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
35 static int login_proxy_record_cmp(struct login_proxy_record *rec1, |
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
36 struct login_proxy_record *rec2) |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 { |
10087
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
38 if (!net_ip_compare(&rec1->ip, &rec2->ip)) |
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
39 return 1; |
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
40 |
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
41 return (int)rec1->port - (int)rec2->port; |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 } |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
44 struct login_proxy_state *login_proxy_state_init(const char *notify_path) |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 { |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 struct login_proxy_state *state; |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 state = i_new(struct login_proxy_state, 1); |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 state->pool = pool_alloconly_create("login proxy state", 1024); |
14918
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
50 hash_table_create(&state->hash, state->pool, 0, |
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
51 login_proxy_record_hash, login_proxy_record_cmp); |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
52 state->notify_path = p_strdup(state->pool, notify_path); |
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
53 state->notify_fd = -1; |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 return state; |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
57 static void login_proxy_state_close(struct login_proxy_state *state) |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
58 { |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
59 if (state->notify_fd != -1) { |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
60 if (close(state->notify_fd) < 0) |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
61 i_error("close(%s) failed: %m", state->notify_path); |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
62 state->notify_fd = -1; |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
63 } |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
64 } |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
65 |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 void login_proxy_state_deinit(struct login_proxy_state **_state) |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 { |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 struct login_proxy_state *state = *_state; |
19086
c98fbc17fa4e
login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
69 struct hash_iterate_context *iter; |
c98fbc17fa4e
login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
70 struct login_proxy_record *rec; |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 *_state = NULL; |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
73 |
19086
c98fbc17fa4e
login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
74 /* sanity check: */ |
c98fbc17fa4e
login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
75 iter = hash_table_iterate_init(state->hash); |
c98fbc17fa4e
login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
76 while (hash_table_iterate(iter, state->hash, &rec, &rec)) |
c98fbc17fa4e
login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
77 i_assert(rec->num_waiting_connections == 0); |
c98fbc17fa4e
login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
78 hash_table_iterate_deinit(&iter); |
c98fbc17fa4e
login proxy: Added asserts to track that num_waiting_connections are correct.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
79 |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
80 if (state->to_reopen != NULL) |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
81 timeout_remove(&state->to_reopen); |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
82 login_proxy_state_close(state); |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 hash_table_destroy(&state->hash); |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 pool_unref(&state->pool); |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 i_free(state); |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 } |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 struct login_proxy_record * |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 login_proxy_state_get(struct login_proxy_state *state, |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
90 const struct ip_addr *ip, in_port_t port) |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 { |
10087
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
92 struct login_proxy_record *rec, key; |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21322
diff
changeset
|
94 i_zero(&key); |
10087
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
95 key.ip = *ip; |
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
96 key.port = port; |
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
97 |
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
98 rec = hash_table_lookup(state->hash, &key); |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 if (rec == NULL) { |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 rec = p_new(state->pool, struct login_proxy_record, 1); |
10087
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
101 rec->ip = *ip; |
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
102 rec->port = port; |
b3c3675ba466
imap/pop3 proxy: Track "destination down" state separately for IP+ports, not just IPs.
Timo Sirainen <tss@iki.fi>
parents:
9776
diff
changeset
|
103 hash_table_insert(state->hash, rec, rec); |
9776
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 return rec; |
e27785694615
login proxy: And added new files missing from previous commit.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 } |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
107 |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
108 static void login_proxy_state_reopen(struct login_proxy_state *state) |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
109 { |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
110 timeout_remove(&state->to_reopen); |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
111 (void)login_proxy_state_notify_open(state); |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
112 } |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
113 |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
114 static int login_proxy_state_notify_open(struct login_proxy_state *state) |
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
115 { |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
116 if (state->to_reopen != NULL) { |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
117 /* reopen later */ |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
118 return -1; |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
119 } |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
120 |
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
121 state->notify_fd = open(state->notify_path, O_WRONLY); |
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
122 if (state->notify_fd == -1) { |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
123 i_error("open(%s) failed: %m", state->notify_path); |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
124 state->to_reopen = timeout_add(NOTIFY_RETRY_REOPEN_MSECS, |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
125 login_proxy_state_reopen, state); |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
126 return -1; |
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
127 } |
11817
65cda5124e99
login proxy: Set notify fd nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
11334
diff
changeset
|
128 fd_set_nonblock(state->notify_fd, TRUE); |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
129 return 0; |
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
130 } |
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
131 |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
132 static bool login_proxy_state_try_notify(struct login_proxy_state *state, |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
133 const char *user) |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
134 { |
21322
5ab8dc1a4a6f
global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20735
diff
changeset
|
135 size_t len; |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
136 ssize_t ret; |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
137 |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
138 if (state->notify_fd == -1) { |
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
139 if (login_proxy_state_notify_open(state) < 0) |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
140 return TRUE; |
20735
ad61b4f88130
Added asserts to make static analyzer happier.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
141 i_assert(state->notify_fd != -1); |
11328
0877d6920960
login: Don't log an error at startup if proxy-notify fifo hasn't been enabled.
Timo Sirainen <tss@iki.fi>
parents:
11324
diff
changeset
|
142 } |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
143 |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
144 T_BEGIN { |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
145 const char *cmd; |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
146 |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
147 cmd = t_strconcat(str_tabescape(user), "\n", NULL); |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
148 len = strlen(cmd); |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
149 ret = write(state->notify_fd, cmd, len); |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
150 } T_END; |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
151 |
11334 | 152 if (ret != (ssize_t)len) { |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
153 if (ret < 0) |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
154 i_error("write(%s) failed: %m", state->notify_path); |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
155 else { |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
156 i_error("write(%s) wrote partial update", |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
157 state->notify_path); |
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
158 } |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
159 login_proxy_state_close(state); |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
160 /* retry sending */ |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
161 return FALSE; |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
162 } |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
163 return TRUE; |
11324
c872378a8de6
login proxy: If passdb returns proxy_refresh=<secs>, send username to proxy-notify fifo every n secs.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
164 } |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
165 |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
166 void login_proxy_state_notify(struct login_proxy_state *state, |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
167 const char *user) |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
168 { |
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
169 if (!login_proxy_state_try_notify(state, user)) |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14305
diff
changeset
|
170 (void)login_proxy_state_try_notify(state, user); |
14305
94de7605f50f
login proxy: Handle proxy-notify errors better.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
171 } |