Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/master/dict-process.c @ 9348:3eacb6bbd227 HEAD
Added pop3_save_uidl setting.
When UIDLs are sent to client, save them to dovecot-uidlist. This allows
changing pop3_uidl_format without messages getting re-downloaded. It's also
useful with virtual POP3 INBOX when UIDLs are based on IMAP UIDs that may
not be as stable as in non-virtual INBOX.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 31 Aug 2009 18:53:17 -0400 |
parents | 366a327b028b |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8219
diff
changeset
|
1 /* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */ |
3855 | 2 |
3 #include "common.h" | |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
4 #include "array.h" |
3855 | 5 #include "ioloop.h" |
6 #include "network.h" | |
7 #include "fd-close-on-exec.h" | |
8 #include "env-util.h" | |
9 #include "log.h" | |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
10 #include "child-process.h" |
3855 | 11 #include "dict-process.h" |
12 | |
13 #include <syslog.h> | |
14 #include <unistd.h> | |
15 #include <sys/stat.h> | |
16 | |
3885
b624b687fe13
Create dict-server socket to base_dir.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
17 #define DICT_SERVER_SOCKET_NAME "dict-server" |
3855 | 18 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
19 struct dict_listener { |
3885
b624b687fe13
Create dict-server socket to base_dir.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
20 char *path; |
3855 | 21 int fd; |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
22 struct io *io; |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
23 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
24 struct dict_process *processes; |
8937
5f96ac54de4d
dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents:
8887
diff
changeset
|
25 unsigned int destroyed:1; |
3855 | 26 }; |
27 | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
28 struct dict_process { |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
29 struct child_process process; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
30 struct dict_process *next; |
3855 | 31 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
32 struct dict_listener *listener; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
33 struct log_io *log; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
34 }; |
3855 | 35 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
36 static struct dict_listener *dict_listener; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
37 |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
38 static int dict_process_create(struct dict_listener *listener) |
3855 | 39 { |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
40 struct dict_process *process; |
3855 | 41 struct log_io *log; |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
42 const char *executable, *const *dicts; |
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
43 unsigned int i, count; |
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
44 int log_fd; |
3855 | 45 pid_t pid; |
46 | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
47 process = i_new(struct dict_process, 1); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
48 process->process.type = PROCESS_TYPE_DICT; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
49 process->listener = listener; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
50 |
3855 | 51 log_fd = log_create_pipe(&log, 0); |
52 if (log_fd < 0) | |
53 pid = -1; | |
54 else { | |
55 pid = fork(); | |
56 if (pid < 0) | |
57 i_error("fork() failed: %m"); | |
58 } | |
59 | |
60 if (pid < 0) { | |
61 (void)close(log_fd); | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
62 i_free(process); |
3855 | 63 return -1; |
64 } | |
65 | |
66 if (pid != 0) { | |
67 /* master */ | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
68 process->next = process->listener->processes; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
69 process->listener->processes = process; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
70 |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
71 child_process_add(pid, &process->process); |
3855 | 72 log_set_prefix(log, "dict: "); |
6542
402d14b5ef8b
If child process logged a fatal failure, don't show "returned error 89"
Timo Sirainen <tss@iki.fi>
parents:
6477
diff
changeset
|
73 log_set_pid(log, pid); |
3855 | 74 (void)close(log_fd); |
75 | |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
76 process->log = log; |
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
77 log_ref(process->log); |
3855 | 78 return 0; |
79 } | |
80 log_set_prefix(log, "master-dict: "); | |
81 | |
8881
774b0e8138bd
Call closelog() before dup2()ing fds.
Timo Sirainen <tss@iki.fi>
parents:
8686
diff
changeset
|
82 /* make sure we don't leak syslog fd. try to do it as late as possible, |
774b0e8138bd
Call closelog() before dup2()ing fds.
Timo Sirainen <tss@iki.fi>
parents:
8686
diff
changeset
|
83 but also before dup2()s in case syslog fd is one of them. */ |
774b0e8138bd
Call closelog() before dup2()ing fds.
Timo Sirainen <tss@iki.fi>
parents:
8686
diff
changeset
|
84 closelog(); |
774b0e8138bd
Call closelog() before dup2()ing fds.
Timo Sirainen <tss@iki.fi>
parents:
8686
diff
changeset
|
85 |
3855 | 86 /* set stdin and stdout to /dev/null, so anything written into it |
87 gets ignored. */ | |
88 if (dup2(null_fd, 0) < 0) | |
89 i_fatal("dup2(stdin) failed: %m"); | |
90 if (dup2(null_fd, 1) < 0) | |
91 i_fatal("dup2(stdout) failed: %m"); | |
92 | |
93 /* stderr = log, 3 = listener */ | |
94 if (dup2(log_fd, 2) < 0) | |
95 i_fatal("dup2(stderr) failed: %m"); | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
96 if (dup2(process->listener->fd, 3) < 0) |
3855 | 97 i_fatal("dup2(3) failed: %m"); |
98 | |
99 for (i = 0; i <= 3; i++) | |
100 fd_close_on_exec(i, FALSE); | |
101 | |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
102 child_process_init_env(); |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
103 env_put(t_strconcat("DICT_LISTEN_FROM_FD=", |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
104 process->listener->path, NULL)); |
3855 | 105 |
9174
eed86bcc33aa
dict proxy: Use base_dir as the default dict-server location.
Timo Sirainen <tss@iki.fi>
parents:
9030
diff
changeset
|
106 env_put(t_strconcat("BASE_DIR=", settings_root->defaults->base_dir, |
eed86bcc33aa
dict proxy: Use base_dir as the default dict-server location.
Timo Sirainen <tss@iki.fi>
parents:
9030
diff
changeset
|
107 NULL)); |
7481
768231eb84cf
Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents:
7109
diff
changeset
|
108 if (settings_root->defaults->dict_db_config != NULL) { |
768231eb84cf
Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents:
7109
diff
changeset
|
109 env_put(t_strconcat("DB_CONFIG=", |
768231eb84cf
Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents:
7109
diff
changeset
|
110 settings_root->defaults->dict_db_config, |
768231eb84cf
Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents:
7109
diff
changeset
|
111 NULL)); |
768231eb84cf
Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents:
7109
diff
changeset
|
112 } |
768231eb84cf
Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents:
7109
diff
changeset
|
113 |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
114 dicts = array_get(&settings_root->dicts, &count); |
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
115 i_assert((count % 2) == 0); |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
116 for (i = 0; i < count; i += 2) |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
117 env_put(t_strdup_printf("DICT_%s=%s", dicts[i], dicts[i+1])); |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
118 |
3855 | 119 executable = PKG_LIBEXECDIR"/dict"; |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
120 client_process_exec(executable, ""); |
3855 | 121 return -1; |
122 } | |
123 | |
8686
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
124 static void dict_listener_unref(struct dict_listener *listener) |
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
125 { |
8937
5f96ac54de4d
dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents:
8887
diff
changeset
|
126 if (listener->processes == NULL && listener->destroyed) |
8686
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
127 i_free(listener); |
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
128 } |
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
129 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
130 static void dict_process_deinit(struct dict_process *process) |
3855 | 131 { |
8686
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
132 struct dict_listener *listener = process->listener; |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
133 struct dict_process **p; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
134 |
8686
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
135 for (p = &listener->processes; *p != NULL; p = &(*p)->next) { |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
136 if (*p == process) { |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
137 *p = process->next; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
138 break; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
139 } |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
140 } |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
141 |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
142 if (process->log != NULL) |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
143 log_unref(process->log); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
144 i_free(process); |
8686
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
145 |
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
146 dict_listener_unref(listener); |
3855 | 147 } |
148 | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
149 static void dict_listener_input(struct dict_listener *listener) |
3855 | 150 { |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
151 unsigned int i; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
152 int fd; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
153 |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
154 i_assert(listener->processes == NULL); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
155 |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
156 for (i = 0; i < settings_root->defaults->dict_process_count; i++) { |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
157 if (dict_process_create(listener) < 0) |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
158 break; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
159 } |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
160 if (i > 0) |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
161 io_remove(&listener->io); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
162 else { |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
163 /* failed to create dict process, so just reject this |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
164 connection and try again later */ |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
165 fd = net_accept(listener->fd, NULL, NULL); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
166 if (fd >= 0) |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
167 (void)close(fd); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
168 } |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
169 } |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
170 |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
171 static struct dict_listener *dict_listener_init(const char *path) |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
172 { |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
173 struct dict_listener *listener; |
3855 | 174 mode_t old_umask; |
175 | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
176 listener = i_new(struct dict_listener, 1); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
177 listener->path = i_strdup(path); |
8219
ec83f6dcb585
Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
7561
diff
changeset
|
178 old_umask = umask(0); |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
179 listener->fd = net_listen_unix_unlink_stale(path, 128); |
8219
ec83f6dcb585
Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
7561
diff
changeset
|
180 umask(old_umask); |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
181 if (listener->fd == -1) { |
8219
ec83f6dcb585
Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
7561
diff
changeset
|
182 if (errno == EADDRINUSE) |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
183 i_fatal("Socket already exists: %s", path); |
8219
ec83f6dcb585
Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
7561
diff
changeset
|
184 else |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
185 i_fatal("net_listen_unix(%s) failed: %m", path); |
3855 | 186 } |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
187 fd_close_on_exec(listener->fd, TRUE); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
188 listener->io = io_add(listener->fd, IO_READ, |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
189 dict_listener_input, listener); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
190 return listener; |
3855 | 191 } |
192 | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
193 static void dict_listener_deinit(struct dict_listener *listener) |
3855 | 194 { |
8937
5f96ac54de4d
dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents:
8887
diff
changeset
|
195 listener->destroyed = TRUE; |
5f96ac54de4d
dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents:
8887
diff
changeset
|
196 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
197 if (listener->io != NULL) |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
198 io_remove(&listener->io); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
199 if (close(listener->fd) < 0) |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
200 i_error("close(dict listener) failed: %m"); |
8887
7ddf32656d8c
When shutting down, don't try to restart dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8881
diff
changeset
|
201 listener->fd = -1; |
3855 | 202 |
8686
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
203 /* don't try to free the dict processes here, |
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
204 let dict_process_destroyed() do it to avoid "unknown child exited" |
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
205 errors. */ |
0e9b885bd29e
master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents:
8682
diff
changeset
|
206 dict_listener_unref(listener); |
3855 | 207 } |
208 | |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
209 static void |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
210 dict_process_destroyed(struct child_process *_process, |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
211 pid_t pid ATTR_UNUSED, bool abnormal_exit ATTR_UNUSED) |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
212 { |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
213 struct dict_process *process = (struct dict_process *)_process; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
214 struct dict_listener *listener = process->listener; |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
215 |
8887
7ddf32656d8c
When shutting down, don't try to restart dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8881
diff
changeset
|
216 if (listener->processes == NULL && listener->fd != -1) { |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
217 /* last listener died, create new ones */ |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
218 listener->io = io_add(listener->fd, IO_READ, |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
219 dict_listener_input, listener); |
6869
5f97bba6df15
Don't crash when dict process exists and we receive SIGHUP.
Timo Sirainen <tss@iki.fi>
parents:
6542
diff
changeset
|
220 } |
8937
5f96ac54de4d
dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents:
8887
diff
changeset
|
221 dict_process_deinit(process); |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
222 } |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
223 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
224 void dict_processes_init(void) |
3855 | 225 { |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
226 const char *path; |
7561
1a58b18652a6
Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents:
7481
diff
changeset
|
227 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
228 path = t_strconcat(settings_root->defaults->base_dir, |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
229 "/"DICT_SERVER_SOCKET_NAME, NULL); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
230 dict_listener = dict_listener_init(path); |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
231 |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
232 child_process_set_destroy_callback(PROCESS_TYPE_DICT, |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
233 dict_process_destroyed); |
3855 | 234 } |
235 | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
236 void dict_processes_deinit(void) |
3855 | 237 { |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
238 dict_listener_deinit(dict_listener); |
3855 | 239 } |
240 | |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
241 void dict_processes_kill(void) |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
242 { |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
243 struct dict_process *process; |
7561
1a58b18652a6
Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents:
7481
diff
changeset
|
244 |
8649
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
245 process = dict_listener->processes; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
246 for (; process != NULL; process = process->next) { |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
247 if (process->log != NULL) { |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
248 log_unref(process->log); |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
249 process->log = NULL; |
67c08c386702
Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents:
8593
diff
changeset
|
250 } |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
251 } |
9030
125862a5b52f
dict process wasn't restarted after SIGHUP was sent to master.
Timo Sirainen <tss@iki.fi>
parents:
8937
diff
changeset
|
252 if (dict_listener->io == NULL) { |
125862a5b52f
dict process wasn't restarted after SIGHUP was sent to master.
Timo Sirainen <tss@iki.fi>
parents:
8937
diff
changeset
|
253 dict_listener->io = io_add(dict_listener->fd, IO_READ, |
125862a5b52f
dict process wasn't restarted after SIGHUP was sent to master.
Timo Sirainen <tss@iki.fi>
parents:
8937
diff
changeset
|
254 dict_listener_input, dict_listener); |
125862a5b52f
dict process wasn't restarted after SIGHUP was sent to master.
Timo Sirainen <tss@iki.fi>
parents:
8937
diff
changeset
|
255 } |
4393
9928ebb54719
Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents:
3975
diff
changeset
|
256 } |