Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/master/login-process.c @ 7927:2351a81ce699 HEAD
If commands are pipelined after the login command, pass them to the
IMAP/POP3 process so it can process the command instead of discarding it.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 21 Jun 2008 12:23:08 +0300 |
parents | 4b4d2a4423ec |
children | 9e226056a208 |
rev | line source |
---|---|
7086
7ed926ed7aa4
Updated copyright notices to include year 2008.
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
1 /* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "common.h" | |
5887
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
4 #include "array.h" |
532
3b53dd1280c6
I/O buffers now use real blocking instead of setting up a sub-ioloop to
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
5 #include "ioloop.h" |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
6 #include "hash.h" |
0 | 7 #include "network.h" |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
747
diff
changeset
|
8 #include "ostream.h" |
0 | 9 #include "fdpass.h" |
727
8dd8ebe6bcac
We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
722
diff
changeset
|
10 #include "fd-close-on-exec.h" |
697
7814b29d0862
Created env_put() and env_clean() for a bit easier handling of environment
Timo Sirainen <tss@iki.fi>
parents:
666
diff
changeset
|
11 #include "env-util.h" |
0 | 12 #include "restrict-access.h" |
722
0438621d25ff
Added virtual memory size limits to processes. Default values are pretty
Timo Sirainen <tss@iki.fi>
parents:
699
diff
changeset
|
13 #include "restrict-process-size.h" |
5887
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
14 #include "dup2-array.h" |
0 | 15 #include "login-process.h" |
16 #include "auth-process.h" | |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
17 #include "mail-process.h" |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
18 #include "master-login-interface.h" |
2000
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
19 #include "log.h" |
3901
0ae5f5b468b7
Put ssl-parameters file into login directory so it still can be accessed
Timo Sirainen <tss@iki.fi>
parents:
3889
diff
changeset
|
20 #include "ssl-init.h" |
0 | 21 |
22 #include <unistd.h> | |
23 #include <syslog.h> | |
4649
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
24 #include <sys/stat.h> |
0 | 25 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
26 struct login_process { |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
27 struct child_process process; |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
28 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
29 struct login_group *group; |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
30 struct login_process *prev_prelogin, *next_prelogin; |
0 | 31 int refcount; |
32 | |
33 pid_t pid; | |
34 int fd; | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
35 struct io *io; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
36 struct ostream *output; |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
37 enum master_login_state state; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
38 |
925
2e649dec0f09
Auth and login processes send an "we're ok" reply at the end of
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
39 unsigned int initialized:1; |
0 | 40 unsigned int destroyed:1; |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
41 unsigned int inetd_child:1; |
613
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
42 }; |
0 | 43 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
44 struct login_auth_request { |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
45 struct login_process *process; |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
46 unsigned int tag; |
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
47 |
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
48 unsigned int login_tag; |
0 | 49 int fd; |
50 | |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
51 unsigned int data_size; |
2097
4e77cb0aff21
Added %l, %r and %P variables and mail_log_prefix setting.
Timo Sirainen <tss@iki.fi>
parents:
2046
diff
changeset
|
52 struct ip_addr local_ip, remote_ip; |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
53 unsigned char data[]; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
54 }; |
0 | 55 |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
56 static unsigned int auth_id_counter, login_pid_counter; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
57 static struct timeout *to; |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
58 static struct io *io_listen; |
4148
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
59 static bool logins_stalled = FALSE; |
613
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
60 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
61 static struct login_group *login_groups; |
0 | 62 |
4651
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
63 static void login_processes_stall(void); |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
64 static void login_process_destroy(struct login_process *p); |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
65 static void login_process_unref(struct login_process *p); |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3692
diff
changeset
|
66 static bool login_process_init_group(struct login_process *p); |
4148
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
67 static void login_processes_start_missing(void *context); |
0 | 68 |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
69 static void login_group_create(struct settings *set) |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
70 { |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
71 struct login_group *group; |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
72 |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
73 group = i_new(struct login_group, 1); |
4631
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
74 group->refcount = 1; |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
75 group->set = set; |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
76 group->mail_process_type = set->protocol == MAIL_PROTOCOL_IMAP ? |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
77 PROCESS_TYPE_IMAP : PROCESS_TYPE_POP3; |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
78 |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
79 group->next = login_groups; |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
80 login_groups = group; |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
81 } |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
82 |
4631
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
83 static void login_group_unref(struct login_group *group) |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
84 { |
4631
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
85 i_assert(group->refcount > 0); |
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
86 |
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
87 if (--group->refcount > 0) |
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
88 return; |
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
89 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
90 i_free(group); |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
91 } |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
92 |
2736
0f31778d3c34
Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents:
2691
diff
changeset
|
93 void auth_master_callback(const char *user, const char *const *args, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4740
diff
changeset
|
94 struct login_auth_request *request) |
0 | 95 { |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
96 struct master_login_reply master_reply; |
2329 | 97 ssize_t ret; |
0 | 98 |
4740
0a1fa29ac87f
inetd logins kept crashing dovecot master.
Timo Sirainen <tss@iki.fi>
parents:
4734
diff
changeset
|
99 memset(&master_reply, 0, sizeof(master_reply)); |
2736
0f31778d3c34
Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents:
2691
diff
changeset
|
100 if (user == NULL) |
5846
21e529b8a701
Initial implementation for mail_max_user_connections setting.
Timo Sirainen <tss@iki.fi>
parents:
5843
diff
changeset
|
101 master_reply.status = MASTER_LOGIN_STATUS_INTERNAL_ERROR; |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7109
diff
changeset
|
102 else T_BEGIN { |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
103 struct login_group *group = request->process->group; |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
104 |
5846
21e529b8a701
Initial implementation for mail_max_user_connections setting.
Timo Sirainen <tss@iki.fi>
parents:
5843
diff
changeset
|
105 master_reply.status = |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
106 create_mail_process(group->mail_process_type, |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
107 group->set, |
4197
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4148
diff
changeset
|
108 request->fd, &request->local_ip, |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4148
diff
changeset
|
109 &request->remote_ip, user, args, |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
110 request->data_size, request->data, |
4197
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4148
diff
changeset
|
111 FALSE); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7109
diff
changeset
|
112 } T_END; |
0 | 113 |
114 /* reply to login */ | |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
115 master_reply.tag = request->login_tag; |
0 | 116 |
2329 | 117 ret = o_stream_send(request->process->output, &master_reply, |
118 sizeof(master_reply)); | |
119 if (ret != sizeof(master_reply)) { | |
120 if (ret >= 0) { | |
121 i_warning("Login process %s transmit buffer full, " | |
122 "killing..", dec2str(request->process->pid)); | |
123 } | |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
124 login_process_destroy(request->process); |
2329 | 125 } |
0 | 126 |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
801
diff
changeset
|
127 if (close(request->fd) < 0) |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
128 i_error("close(mail client) failed: %m"); |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
129 login_process_unref(request->process); |
0 | 130 i_free(request); |
131 } | |
132 | |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
133 static void process_remove_from_prelogin_lists(struct login_process *p) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
134 { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
135 if (p->state != LOGIN_STATE_FULL_PRELOGINS) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
136 return; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
137 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
138 if (p->prev_prelogin == NULL) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
139 p->group->oldest_prelogin_process = p->next_prelogin; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
140 else |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
141 p->prev_prelogin->next_prelogin = p->next_prelogin; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
142 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
143 if (p->next_prelogin == NULL) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
144 p->group->newest_prelogin_process = p->prev_prelogin; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
145 else |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
146 p->next_prelogin->prev_prelogin = p->prev_prelogin; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
147 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
148 p->prev_prelogin = p->next_prelogin = NULL; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
149 } |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
150 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
151 static void process_mark_nonlistening(struct login_process *p, |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
152 enum master_login_state new_state) |
614
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
153 { |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
154 if (p->group == NULL) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
155 return; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
156 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
157 if (p->state == LOGIN_STATE_LISTENING) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
158 p->group->listening_processes--; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
159 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
160 if (new_state == LOGIN_STATE_FULL_PRELOGINS) { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
161 /* add to prelogin list */ |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
162 i_assert(p->state != new_state); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
163 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
164 p->prev_prelogin = p->group->newest_prelogin_process; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
165 if (p->group->newest_prelogin_process == NULL) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
166 p->group->oldest_prelogin_process = p; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
167 else |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
168 p->group->newest_prelogin_process->next_prelogin = p; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
169 p->group->newest_prelogin_process = p; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
170 } else { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
171 process_remove_from_prelogin_lists(p); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
172 } |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
173 } |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
174 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
175 static void process_mark_listening(struct login_process *p) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
176 { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
177 if (p->group == NULL) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
178 return; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
179 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
180 if (p->state != LOGIN_STATE_LISTENING) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
181 p->group->listening_processes++; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
182 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
183 process_remove_from_prelogin_lists(p); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
184 } |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
185 |
4651
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
186 static void login_process_set_initialized(struct login_process *p) |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
187 { |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
188 p->initialized = TRUE; |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
189 |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
190 if (logins_stalled) { |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
191 /* processes were created successfully */ |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
192 i_info("Created login processes successfully, unstalling"); |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
193 |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
194 logins_stalled = FALSE; |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
195 timeout_remove(&to); |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
196 to = timeout_add(1000, login_processes_start_missing, NULL); |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
197 } |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
198 } |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
199 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
200 static void |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
201 login_process_set_state(struct login_process *p, enum master_login_state state) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
202 { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
203 if (state == p->state || state > LOGIN_STATE_COUNT || |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
204 (state < p->state && p->group->set->login_process_per_connection)) { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
205 i_error("login: tried to change state %d -> %d " |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
206 "(if you can't login at all, see src/lib/fdpass.c)", |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
207 p->state, state); |
4640
f5772851ac91
If login process sends wrong state information, restart it.
Timo Sirainen <tss@iki.fi>
parents:
4632
diff
changeset
|
208 login_process_destroy(p); |
614
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
209 return; |
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
210 } |
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
211 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
212 if (state == LOGIN_STATE_LISTENING) { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
213 process_mark_listening(p); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
214 } else { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
215 process_mark_nonlistening(p, state); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
216 } |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
217 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
218 p->state = state; |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
219 } |
614
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
220 |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
221 static void login_process_groups_create(void) |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
222 { |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
223 struct server_settings *server; |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
224 |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
225 for (server = settings_root; server != NULL; server = server->next) { |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
226 if (server->imap != NULL) |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
227 login_group_create(server->imap); |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
228 if (server->pop3 != NULL) |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
229 login_group_create(server->pop3); |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
230 } |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
231 } |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
232 |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
233 static struct login_group * |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
234 login_group_process_find(const char *name, enum mail_protocol protocol) |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
235 { |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
236 struct login_group *group; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
237 |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
238 if (login_groups == NULL) |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
239 login_process_groups_create(); |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
240 |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
241 for (group = login_groups; group != NULL; group = group->next) { |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
242 if (strcmp(group->set->server->name, name) == 0 && |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
243 group->set->protocol == protocol) |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
244 return group; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
245 } |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
246 |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
247 return NULL; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
248 } |
614
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
249 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3692
diff
changeset
|
250 static bool login_process_read_group(struct login_process *p) |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
251 { |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
252 struct login_group *group; |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
253 const char *name, *proto; |
5089 | 254 unsigned char buf[256]; |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
255 enum mail_protocol protocol; |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
256 unsigned int len; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
257 ssize_t ret; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
258 |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
259 /* read length */ |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
260 ret = read(p->fd, buf, 1); |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
261 if (ret != 1) |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
262 len = 0; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
263 else { |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
264 len = buf[0]; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
265 if (len >= sizeof(buf)) { |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
266 i_error("login: Server name length too large"); |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
267 return FALSE; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
268 } |
614
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
269 |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
270 ret = read(p->fd, buf, len); |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
271 } |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
272 |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
273 if (ret < 0) |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
274 i_error("login: read() failed: %m"); |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
275 else if (len == 0 || (size_t)ret != len) |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
276 i_error("login: Server name wasn't sent"); |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
277 else { |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
278 name = t_strndup(buf, len); |
3607
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
279 proto = strchr(name, '/'); |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
280 if (proto == NULL) { |
3607
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
281 proto = name; |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
282 name = "default"; |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
283 } else { |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
284 name = t_strdup_until(name, proto++); |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
285 } |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
286 |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
287 if (strcmp(proto, "imap") == 0) |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
288 protocol = MAIL_PROTOCOL_IMAP; |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
289 else if (strcmp(proto, "pop3") == 0) |
4353
3e542f308cb5
Starting pop3 processes from inetd started actually imap processes after
Timo Sirainen <tss@iki.fi>
parents:
4197
diff
changeset
|
290 protocol = MAIL_PROTOCOL_POP3; |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
291 else { |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
292 i_error("login: Unknown protocol '%s'", proto); |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
293 return FALSE; |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
294 } |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
295 |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
296 group = login_group_process_find(name, protocol); |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
297 if (group == NULL) { |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
298 i_error("login: Unknown server name '%s'", name); |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
299 return FALSE; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
300 } |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
301 |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
302 p->group = group; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
303 return login_process_init_group(p); |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
304 } |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
305 return FALSE; |
614
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
306 } |
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
307 |
4649
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
308 static int |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
309 login_read_request(struct login_process *p, struct master_login_request *req, |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
310 unsigned char data[MASTER_LOGIN_MAX_DATA_SIZE], |
4649
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
311 int *client_fd_r) |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
312 { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
313 struct stat st; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
314 ssize_t ret; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
315 |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
316 *client_fd_r = -1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
317 |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
318 ret = fd_read(p->fd, req, sizeof(*req), client_fd_r); |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
319 if (ret >= (ssize_t)sizeof(req->version) && |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
320 req->version != MASTER_LOGIN_PROTOCOL_VERSION) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
321 i_error("login: Protocol version mismatch " |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
322 "(mixed old and new binaries?)"); |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
323 return -1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
324 } |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
325 |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
326 if (ret != sizeof(*req)) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
327 if (ret == 0) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
328 /* disconnected, ie. the login process died */ |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
329 } else if (ret > 0) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
330 /* request wasn't fully read */ |
4734
f032a5d2bc0d
Error message fix for 64bit systems.
Timo Sirainen <tss@iki.fi>
parents:
4670
diff
changeset
|
331 i_error("login: fd_read() returned partial %d", |
f032a5d2bc0d
Error message fix for 64bit systems.
Timo Sirainen <tss@iki.fi>
parents:
4670
diff
changeset
|
332 (int)ret); |
4649
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
333 } else { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
334 if (errno == EAGAIN) |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
335 return 0; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
336 |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
337 i_error("login: fd_read() failed: %m"); |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
338 } |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
339 return -1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
340 } |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
341 |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
342 if (req->ino == (ino_t)-1) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
343 if (*client_fd_r != -1) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
344 i_error("login: Notification request sent " |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
345 "a file descriptor"); |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
346 return -1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
347 } |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
348 return 1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
349 } |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
350 if (req->data_size != 0) { |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
351 if (req->data_size > MASTER_LOGIN_MAX_DATA_SIZE) { |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
352 i_error("login: Too large data_size sent"); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
353 return -1; |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
354 } |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
355 /* @UNSAFE */ |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
356 ret = read(p->fd, data, req->data_size); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
357 if (ret != req->data_size) { |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
358 if (ret == 0) { |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
359 /* disconnected */ |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
360 } else if (ret > 0) { |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
361 /* request wasn't fully read */ |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
362 i_error("login: Data read partially %d/%u", |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
363 (int)ret, req->data_size); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
364 } else { |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
365 i_error("login: read(data) failed: %m"); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
366 } |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
367 return -1; |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
368 } |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
369 } |
4649
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
370 |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
371 if (*client_fd_r == -1) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
372 i_error("login: Login request missing a file descriptor"); |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
373 return -1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
374 } |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
375 |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
376 if (fstat(*client_fd_r, &st) < 0) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
377 i_error("login: fstat(mail client) failed: %m"); |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
378 return -1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
379 } |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
380 if (st.st_ino != req->ino) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
381 i_error("login: Login request inode mismatch: %s != %s", |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
382 dec2str(st.st_ino), dec2str(req->ino)); |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
383 return -1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
384 } |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
385 return 1; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
386 } |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
387 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4740
diff
changeset
|
388 static void login_process_input(struct login_process *p) |
0 | 389 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
390 struct auth_process *auth_process; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
391 struct login_auth_request *authreq; |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
392 struct master_login_request req; |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
393 unsigned char data[MASTER_LOGIN_MAX_DATA_SIZE]; |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
394 int client_fd; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
395 ssize_t ret; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
396 |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
397 if (p->group == NULL) { |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
398 /* we want to read the group */ |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
399 if (!login_process_read_group(p)) |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
400 login_process_destroy(p); |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
401 return; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
402 } |
0 | 403 |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
404 ret = login_read_request(p, &req, data, &client_fd); |
4649
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
405 if (ret == 0) |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
406 return; |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
407 if (ret < 0) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
408 if (client_fd != -1) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
409 if (close(client_fd) < 0) |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
410 i_error("login: close(mail client) failed: %m"); |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
411 } |
2779
1fd55b4341b9
Added version to login <-> master communication as well.
Timo Sirainen <tss@iki.fi>
parents:
2736
diff
changeset
|
412 login_process_destroy(p); |
1fd55b4341b9
Added version to login <-> master communication as well.
Timo Sirainen <tss@iki.fi>
parents:
2736
diff
changeset
|
413 return; |
1fd55b4341b9
Added version to login <-> master communication as well.
Timo Sirainen <tss@iki.fi>
parents:
2736
diff
changeset
|
414 } |
1fd55b4341b9
Added version to login <-> master communication as well.
Timo Sirainen <tss@iki.fi>
parents:
2736
diff
changeset
|
415 |
4649
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
416 if (req.ino == (ino_t)-1) { |
a3d6a3462745
Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents:
4640
diff
changeset
|
417 /* state notification */ |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
418 enum master_login_state state = req.tag; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
419 |
925
2e649dec0f09
Auth and login processes send an "we're ok" reply at the end of
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
420 if (!p->initialized) { |
2e649dec0f09
Auth and login processes send an "we're ok" reply at the end of
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
421 /* initialization notify */ |
4651
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
422 login_process_set_initialized(p); |
925
2e649dec0f09
Auth and login processes send an "we're ok" reply at the end of
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
423 } else { |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
424 /* change "listening for new connections" status */ |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
425 login_process_set_state(p, state); |
925
2e649dec0f09
Auth and login processes send an "we're ok" reply at the end of
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
426 } |
613
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
427 return; |
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
428 } |
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
429 |
4661
885bef091d1a
Make sure we don't kill login processes that haven't yet even sent their
Timo Sirainen <tss@iki.fi>
parents:
4651
diff
changeset
|
430 if (!p->initialized) { |
885bef091d1a
Make sure we don't kill login processes that haven't yet even sent their
Timo Sirainen <tss@iki.fi>
parents:
4651
diff
changeset
|
431 i_error("login: trying to log in before initialization"); |
885bef091d1a
Make sure we don't kill login processes that haven't yet even sent their
Timo Sirainen <tss@iki.fi>
parents:
4651
diff
changeset
|
432 login_process_destroy(p); |
885bef091d1a
Make sure we don't kill login processes that haven't yet even sent their
Timo Sirainen <tss@iki.fi>
parents:
4651
diff
changeset
|
433 return; |
885bef091d1a
Make sure we don't kill login processes that haven't yet even sent their
Timo Sirainen <tss@iki.fi>
parents:
4651
diff
changeset
|
434 } |
885bef091d1a
Make sure we don't kill login processes that haven't yet even sent their
Timo Sirainen <tss@iki.fi>
parents:
4651
diff
changeset
|
435 |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
436 fd_close_on_exec(client_fd, TRUE); |
0 | 437 |
438 /* ask the cookie from the auth process */ | |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
439 authreq = i_malloc(sizeof(*authreq) + req.data_size); |
0 | 440 p->refcount++; |
441 authreq->process = p; | |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
442 authreq->tag = ++auth_id_counter; |
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
443 authreq->login_tag = req.tag; |
0 | 444 authreq->fd = client_fd; |
2097
4e77cb0aff21
Added %l, %r and %P variables and mail_log_prefix setting.
Timo Sirainen <tss@iki.fi>
parents:
2046
diff
changeset
|
445 authreq->local_ip = req.local_ip; |
4e77cb0aff21
Added %l, %r and %P variables and mail_log_prefix setting.
Timo Sirainen <tss@iki.fi>
parents:
2046
diff
changeset
|
446 authreq->remote_ip = req.remote_ip; |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
447 authreq->data_size = req.data_size; |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7922
diff
changeset
|
448 memcpy(authreq->data, data, req.data_size); |
0 | 449 |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
450 auth_process = auth_process_find(req.auth_pid); |
0 | 451 if (auth_process == NULL) { |
452 i_error("login: Authentication process %u doesn't exist", | |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
453 req.auth_pid); |
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
454 auth_master_callback(NULL, NULL, authreq); |
0 | 455 } else { |
1035
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
456 auth_process_request(auth_process, p->pid, |
fe49ece0f3ea
We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents:
1000
diff
changeset
|
457 req.auth_id, authreq); |
0 | 458 } |
459 } | |
460 | |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
461 static struct login_process * |
6519
66e5f514355e
Login processes started by inetd aren't ours, don't treat them as such.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
462 login_process_new(struct login_group *group, pid_t pid, int fd, |
66e5f514355e
Login processes started by inetd aren't ours, don't treat them as such.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
463 bool inetd_child) |
0 | 464 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
465 struct login_process *p; |
0 | 466 |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
467 i_assert(pid != 0); |
0 | 468 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
469 p = i_new(struct login_process, 1); |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
470 p->process.type = PROCESS_TYPE_LOGIN; |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
471 p->group = group; |
4670 | 472 p->refcount = 2; /* once for fd close, another for process exit */ |
0 | 473 p->pid = pid; |
474 p->fd = fd; | |
6519
66e5f514355e
Login processes started by inetd aren't ours, don't treat them as such.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
475 p->inetd_child = inetd_child; |
0 | 476 p->io = io_add(fd, IO_READ, login_process_input, p); |
6161
c62f7ee79446
Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
477 p->output = o_stream_create_fd(fd, sizeof(struct master_login_reply)*10, |
c62f7ee79446
Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
478 FALSE); |
6519
66e5f514355e
Login processes started by inetd aren't ours, don't treat them as such.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
479 if (!inetd_child) |
66e5f514355e
Login processes started by inetd aren't ours, don't treat them as such.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
480 child_process_add(pid, &p->process); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
481 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
482 p->state = LOGIN_STATE_LISTENING; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
483 |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
484 if (p->group != NULL) { |
4631
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
485 p->group->refcount++; |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
486 p->group->processes++; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
487 p->group->listening_processes++; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
488 } |
0 | 489 return p; |
490 } | |
491 | |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
492 static void login_process_exited(struct login_process *p) |
613
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
493 { |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
494 if (p->group != NULL) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
495 p->group->processes--; |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
496 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
497 login_process_unref(p); |
613
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
498 } |
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
499 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
500 static void login_process_destroy(struct login_process *p) |
0 | 501 { |
502 if (p->destroyed) | |
503 return; | |
504 p->destroyed = TRUE; | |
505 | |
4651
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
506 if (!p->initialized) |
2fe8f6a0bc5b
If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents:
4649
diff
changeset
|
507 login_processes_stall(); |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
508 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
747
diff
changeset
|
509 o_stream_close(p->output); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
510 io_remove(&p->io); |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
801
diff
changeset
|
511 if (close(p->fd) < 0) |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
801
diff
changeset
|
512 i_error("close(login) failed: %m"); |
0 | 513 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
514 process_mark_nonlistening(p, LOGIN_STATE_FULL_LOGINS); |
613
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
515 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
516 if (p->inetd_child) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
517 login_process_exited(p); |
4670 | 518 login_process_unref(p); |
0 | 519 } |
520 | |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
521 static void login_process_unref(struct login_process *p) |
0 | 522 { |
4670 | 523 i_assert(p->refcount > 0); |
0 | 524 if (--p->refcount > 0) |
525 return; | |
526 | |
4631
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
527 if (p->group != NULL) |
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
528 login_group_unref(p->group); |
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
529 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
530 o_stream_unref(&p->output); |
0 | 531 i_free(p); |
532 } | |
533 | |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
534 static void login_process_init_env(struct login_group *group, pid_t pid) |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
535 { |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
536 struct settings *set = group->set; |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
537 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
538 child_process_init_env(); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
539 |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
540 /* setup access environment - needs to be done after |
3692 | 541 clean_child_process() since it clears environment. Don't set user |
542 parameter since we don't want to call initgroups() for login | |
3691
e167b71e37e3
Don't call initgroups() at the start of login processes.
Timo Sirainen <tss@iki.fi>
parents:
3607
diff
changeset
|
543 processes. */ |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
544 restrict_access_set_env(NULL, set->login_uid, |
7341
af998ae4254b
Replaced mail_extra_groups setting with mail_privileged_group and
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
545 set->server->login_gid, (gid_t)-1, |
1506
e7c627bacaaf
Allow first_valid_gid to be 0. Drop any supplementary groups not in valid
Timo Sirainen <tss@iki.fi>
parents:
1499
diff
changeset
|
546 set->login_chroot ? set->login_dir : NULL, |
2141
8690d2000e33
Added mail_extra_groups setting.
Timo Sirainen <tss@iki.fi>
parents:
2097
diff
changeset
|
547 0, 0, NULL); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
548 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
549 env_put("DOVECOT_MASTER=1"); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
550 |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
551 if (!set->ssl_disable) { |
4388
af61031c746f
Settings parser nowadays returns "" instead of NULL when it reads an empty
Timo Sirainen <tss@iki.fi>
parents:
4353
diff
changeset
|
552 const char *ssl_key_password; |
3889
c7462001227b
Added support for password protected SSL private keys. The password can be
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
553 |
4388
af61031c746f
Settings parser nowadays returns "" instead of NULL when it reads an empty
Timo Sirainen <tss@iki.fi>
parents:
4353
diff
changeset
|
554 ssl_key_password = *set->ssl_key_password != '\0' ? |
3889
c7462001227b
Added support for password protected SSL private keys. The password can be
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
555 set->ssl_key_password : ssl_manual_key_password; |
c7462001227b
Added support for password protected SSL private keys. The password can be
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
556 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
557 if (*set->ssl_ca_file != '\0') { |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
558 env_put(t_strconcat("SSL_CA_FILE=", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
559 set->ssl_ca_file, NULL)); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
560 } |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
561 env_put(t_strconcat("SSL_CERT_FILE=", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
562 set->ssl_cert_file, NULL)); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
563 env_put(t_strconcat("SSL_KEY_FILE=", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
564 set->ssl_key_file, NULL)); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
565 env_put(t_strconcat("SSL_KEY_PASSWORD=", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
566 ssl_key_password, NULL)); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
567 env_put("SSL_PARAM_FILE="SSL_PARAMETERS_FILENAME); |
7091
59ac3628b8d8
Build environment using envarr and pass it to execve(). This is faster than
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
568 if (*set->ssl_cipher_list != '\0') { |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
569 env_put(t_strconcat("SSL_CIPHER_LIST=", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
570 set->ssl_cipher_list, NULL)); |
1907
190f1d315ce6
Added setting ssl_ca_file, patch by Zach Bagnall
Timo Sirainen <tss@iki.fi>
parents:
1897
diff
changeset
|
571 } |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
572 env_put(t_strconcat("SSL_CERT_USERNAME_FIELD=", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
573 set->ssl_cert_username_field, NULL)); |
1997
1d0985f6bdd9
Added ssl_verify_client_cert setting.
Timo Sirainen <tss@iki.fi>
parents:
1996
diff
changeset
|
574 if (set->ssl_verify_client_cert) |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
575 env_put("SSL_VERIFY_CLIENT_CERT=1"); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
576 } |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
577 |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
578 if (set->disable_plaintext_auth) |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
579 env_put("DISABLE_PLAINTEXT_AUTH=1"); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
580 if (set->verbose_proctitle) |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
581 env_put("VERBOSE_PROCTITLE=1"); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
582 if (set->verbose_ssl) |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
583 env_put("VERBOSE_SSL=1"); |
2691
46f879c46b45
auth_verbose now affects imap/pop3 login processes too. Every authentication
Timo Sirainen <tss@iki.fi>
parents:
2674
diff
changeset
|
584 if (set->server->auths->verbose) |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
585 env_put("VERBOSE_AUTH=1"); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
586 |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
587 if (set->login_process_per_connection) { |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
588 env_put("PROCESS_PER_CONNECTION=1"); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
589 env_put("MAX_CONNECTIONS=1"); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
590 } else { |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
591 env_put(t_strdup_printf("MAX_CONNECTIONS=%u", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
592 set->login_max_connections)); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
593 } |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
594 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
595 env_put(t_strconcat("PROCESS_UID=", dec2str(pid), NULL)); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
596 env_put(t_strconcat("GREETING=", set->login_greeting, NULL)); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
597 env_put(t_strconcat("LOG_FORMAT_ELEMENTS=", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
598 set->login_log_format_elements, NULL)); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
599 env_put(t_strconcat("LOG_FORMAT=", set->login_log_format, NULL)); |
7917
ca2ff54ee9b4
Added support for IMAP ID extension.
Timo Sirainen <tss@iki.fi>
parents:
7852
diff
changeset
|
600 env_put(t_strconcat("IMAP_ID_SEND=", set->imap_id_send, NULL)); |
ca2ff54ee9b4
Added support for IMAP ID extension.
Timo Sirainen <tss@iki.fi>
parents:
7852
diff
changeset
|
601 env_put(t_strconcat("IMAP_ID_LOG=", set->imap_id_log, NULL)); |
4197
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4148
diff
changeset
|
602 |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
603 if (group->mail_process_type == PROCESS_TYPE_IMAP) { |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
604 env_put(t_strconcat("CAPABILITY_STRING=", |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
605 *set->imap_capability != '\0' ? |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
606 set->imap_capability : |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
607 set->imap_generated_capability, NULL)); |
4197
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4148
diff
changeset
|
608 } |
7920
3644883cf44e
Support transferring original IPs and ports through IMAP proxies.
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
609 if (*set->login_trusted_networks != '\0') { |
3644883cf44e
Support transferring original IPs and ports through IMAP proxies.
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
610 env_put(t_strconcat("TRUSTED_NETWORKS=", |
3644883cf44e
Support transferring original IPs and ports through IMAP proxies.
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
611 set->login_trusted_networks, NULL)); |
3644883cf44e
Support transferring original IPs and ports through IMAP proxies.
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
612 } |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
613 } |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
614 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
615 static pid_t create_login_process(struct login_group *group) |
0 | 616 { |
2046 | 617 struct log_io *log; |
5887
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
618 const struct listener *listens; |
3083
a20882c4f092
Disable log throttlong for auth process, and for login processes if
Timo Sirainen <tss@iki.fi>
parents:
2886
diff
changeset
|
619 unsigned int max_log_lines_per_sec; |
2000
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
620 const char *prefix; |
0 | 621 pid_t pid; |
5887
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
622 ARRAY_TYPE(dup2) dups; |
7852
53604857c7d2
Change fd limit in login process after it's execed. This fixes OSes which
Timo Sirainen <tss@iki.fi>
parents:
7851
diff
changeset
|
623 unsigned int i, listen_count = 0, ssl_listen_count = 0; |
6396
1b21dfee7bd7
Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents:
6364
diff
changeset
|
624 int fd[2], log_fd, cur_fd, tmp_fd; |
0 | 625 |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
626 if (group->set->login_uid == 0) |
0 | 627 i_fatal("Login process must not run as root"); |
628 | |
629 /* create communication to process with a socket pair */ | |
2000
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
630 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0) { |
0 | 631 i_error("socketpair() failed: %m"); |
632 return -1; | |
633 } | |
634 | |
3083
a20882c4f092
Disable log throttlong for auth process, and for login processes if
Timo Sirainen <tss@iki.fi>
parents:
2886
diff
changeset
|
635 max_log_lines_per_sec = |
a20882c4f092
Disable log throttlong for auth process, and for login processes if
Timo Sirainen <tss@iki.fi>
parents:
2886
diff
changeset
|
636 group->set->login_process_per_connection ? 10 : 0; |
5632
2ed5abe3aaef
Moved SSL listen fd to 4. stdout is now redirected to log.
Timo Sirainen <tss@iki.fi>
parents:
5358
diff
changeset
|
637 log_fd = log_create_pipe(&log, /*max_log_lines_per_sec*/0); |
2000
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
638 if (log_fd < 0) |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
639 pid = -1; |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
640 else { |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
641 pid = fork(); |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
642 if (pid < 0) |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
643 i_error("fork() failed: %m"); |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
644 } |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
645 |
0 | 646 if (pid < 0) { |
647 (void)close(fd[0]); | |
648 (void)close(fd[1]); | |
2000
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
649 (void)close(log_fd); |
0 | 650 return -1; |
651 } | |
652 | |
653 if (pid != 0) { | |
654 /* master */ | |
2046 | 655 prefix = t_strdup_printf("%s-login: ", |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
656 process_names[group->mail_process_type]); |
2046 | 657 log_set_prefix(log, prefix); |
6542
402d14b5ef8b
If child process logged a fatal failure, don't show "returned error 89"
Timo Sirainen <tss@iki.fi>
parents:
6519
diff
changeset
|
658 log_set_pid(log, pid); |
2046 | 659 |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
660 net_set_nonblock(fd[0], TRUE); |
727
8dd8ebe6bcac
We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
722
diff
changeset
|
661 fd_close_on_exec(fd[0], TRUE); |
6519
66e5f514355e
Login processes started by inetd aren't ours, don't treat them as such.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
662 (void)login_process_new(group, pid, fd[0], FALSE); |
0 | 663 (void)close(fd[1]); |
2000
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
664 (void)close(log_fd); |
0 | 665 return pid; |
666 } | |
667 | |
2046 | 668 prefix = t_strdup_printf("master-%s-login: ", |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
669 process_names[group->mail_process_type]); |
2046 | 670 log_set_prefix(log, prefix); |
671 | |
5887
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
672 t_array_init(&dups, 16); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
673 dup2_append(&dups, null_fd, STDIN_FILENO); |
5632
2ed5abe3aaef
Moved SSL listen fd to 4. stdout is now redirected to log.
Timo Sirainen <tss@iki.fi>
parents:
5358
diff
changeset
|
674 /* redirect writes to stdout also to error log. For example OpenSSL |
2ed5abe3aaef
Moved SSL listen fd to 4. stdout is now redirected to log.
Timo Sirainen <tss@iki.fi>
parents:
5358
diff
changeset
|
675 can be made to log its debug messages to stdout. */ |
5887
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
676 dup2_append(&dups, log_fd, STDOUT_FILENO); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
677 dup2_append(&dups, log_fd, STDERR_FILENO); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
678 dup2_append(&dups, fd[1], LOGIN_MASTER_SOCKET_FD); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
679 |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
680 /* redirect listener fds */ |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
681 cur_fd = LOGIN_MASTER_SOCKET_FD + 1; |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
682 if (array_is_created(&group->set->listens)) { |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
683 listens = array_get(&group->set->listens, &listen_count); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
684 for (i = 0; i < listen_count; i++, cur_fd++) |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
685 dup2_append(&dups, listens[i].fd, cur_fd); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
686 } |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
687 |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
688 if (array_is_created(&group->set->ssl_listens)) { |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
689 listens = array_get(&group->set->ssl_listens, |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
690 &ssl_listen_count); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
691 for (i = 0; i < ssl_listen_count; i++, cur_fd++) |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
692 dup2_append(&dups, listens[i].fd, cur_fd); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
693 } |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
694 |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
695 if (dup2_array(&dups) < 0) |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
696 i_fatal("Failed to dup2() fds"); |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
697 |
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
698 /* don't close any of these */ |
6396
1b21dfee7bd7
Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents:
6364
diff
changeset
|
699 for (tmp_fd = 0; tmp_fd <= cur_fd; tmp_fd++) |
1b21dfee7bd7
Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents:
6364
diff
changeset
|
700 fd_close_on_exec(tmp_fd, FALSE); |
2000
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1997
diff
changeset
|
701 |
0 | 702 (void)close(fd[0]); |
703 (void)close(fd[1]); | |
704 | |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
705 login_process_init_env(group, getpid()); |
0 | 706 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
707 env_put(t_strdup_printf("LISTEN_FDS=%u", listen_count)); |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
708 env_put(t_strdup_printf("SSL_LISTEN_FDS=%u", ssl_listen_count)); |
5887
3f2eb1b9c555
Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents:
5846
diff
changeset
|
709 |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
710 if (!group->set->login_chroot) { |
0 | 711 /* no chrooting, but still change to the directory */ |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
712 if (chdir(group->set->login_dir) < 0) { |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
713 i_fatal("chdir(%s) failed: %m", |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
714 group->set->login_dir); |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
715 } |
0 | 716 } |
717 | |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
718 restrict_process_size(group->set->login_process_size, (unsigned int)-1); |
722
0438621d25ff
Added virtual memory size limits to processes. Default values are pretty
Timo Sirainen <tss@iki.fi>
parents:
699
diff
changeset
|
719 |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
791
diff
changeset
|
720 /* make sure we don't leak syslog fd, but do it last so that |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
791
diff
changeset
|
721 any errors above will be logged */ |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
791
diff
changeset
|
722 closelog(); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
791
diff
changeset
|
723 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
724 client_process_exec(group->set->login_executable, ""); |
1441
a83ce8395316
If exec() fails, show the full path rather than argv[0]
Timo Sirainen <tss@iki.fi>
parents:
1398
diff
changeset
|
725 i_fatal_status(FATAL_EXEC, "execv(%s) failed: %m", |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
726 group->set->login_executable); |
0 | 727 return -1; |
728 } | |
729 | |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
730 static void |
5846
21e529b8a701
Initial implementation for mail_max_user_connections setting.
Timo Sirainen <tss@iki.fi>
parents:
5843
diff
changeset
|
731 login_process_destroyed(struct child_process *process, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6396
diff
changeset
|
732 pid_t pid ATTR_UNUSED, bool abnormal_exit) |
615
0d852af6842e
Master process generates DH/RSA parameters now and stores them into file
Timo Sirainen <tss@iki.fi>
parents:
614
diff
changeset
|
733 { |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
734 struct login_process *p = (struct login_process *)process; |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
735 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
736 i_assert(!p->inetd_child); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
737 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
738 if (abnormal_exit) { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
739 /* don't start raising the process count if they're dying all |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
740 the time */ |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
741 if (p->group != NULL) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
742 p->group->wanted_processes_count = 0; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
743 } |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
744 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
745 login_process_exited(p); |
615
0d852af6842e
Master process generates DH/RSA parameters now and stores them into file
Timo Sirainen <tss@iki.fi>
parents:
614
diff
changeset
|
746 } |
0d852af6842e
Master process generates DH/RSA parameters now and stores them into file
Timo Sirainen <tss@iki.fi>
parents:
614
diff
changeset
|
747 |
4670 | 748 void login_processes_destroy_all(void) |
635
90a65c017bf0
SIGHUP reloads now settings. Logged in clients are left untouched, but
Timo Sirainen <tss@iki.fi>
parents:
615
diff
changeset
|
749 { |
1897
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1724
diff
changeset
|
750 struct hash_iterate_context *iter; |
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1724
diff
changeset
|
751 void *key, *value; |
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1724
diff
changeset
|
752 |
1e6ed8045f2b
Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents:
1724
diff
changeset
|
753 iter = hash_iterate_init(processes); |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
754 while (hash_iterate(iter, &key, &value)) { |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
755 struct login_process *p = value; |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
756 |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
757 if (p->process.type == PROCESS_TYPE_LOGIN) |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
758 login_process_destroy(p); |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
759 } |
6417
047d0d8bbf0a
hash_destroy() and hash_iterate_deinit() now take ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
760 hash_iterate_deinit(&iter); |
635
90a65c017bf0
SIGHUP reloads now settings. Logged in clients are left untouched, but
Timo Sirainen <tss@iki.fi>
parents:
615
diff
changeset
|
761 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
762 while (login_groups != NULL) { |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
763 struct login_group *group = login_groups; |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
764 |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
765 login_groups = group->next; |
4631
f5d53a684856
SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents:
4630
diff
changeset
|
766 login_group_unref(group); |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
767 } |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
768 } |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
769 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
770 static void login_processes_notify_group(struct login_group *group) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
771 { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
772 struct hash_iterate_context *iter; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
773 struct master_login_reply reply; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
774 void *key, *value; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
775 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
776 memset(&reply, 0, sizeof(reply)); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
777 |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
778 iter = hash_iterate_init(processes); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
779 while (hash_iterate(iter, &key, &value)) { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
780 struct login_process *p = value; |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
781 |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
782 if (p->process.type == PROCESS_TYPE_LOGIN && p->group == group) |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
783 (void)o_stream_send(p->output, &reply, sizeof(reply)); |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
784 } |
6417
047d0d8bbf0a
hash_destroy() and hash_iterate_deinit() now take ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
785 hash_iterate_deinit(&iter); |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
786 } |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
787 |
4148
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
788 static int login_group_start_missings(struct login_group *group) |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
789 { |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
790 if (group->set->login_process_per_connection && |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
791 group->processes >= group->set->login_max_processes_count && |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
792 group->listening_processes == 0) { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
793 /* destroy the oldest listening process. non-listening |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
794 processes are logged in users who we don't want to kick out |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
795 because someone's started flooding */ |
4661
885bef091d1a
Make sure we don't kill login processes that haven't yet even sent their
Timo Sirainen <tss@iki.fi>
parents:
4651
diff
changeset
|
796 if (group->oldest_prelogin_process != NULL && |
885bef091d1a
Make sure we don't kill login processes that haven't yet even sent their
Timo Sirainen <tss@iki.fi>
parents:
4651
diff
changeset
|
797 group->oldest_prelogin_process->initialized) |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
798 login_process_destroy(group->oldest_prelogin_process); |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
799 } |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
800 |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
801 /* we want to respond fast when multiple clients are connecting |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
802 at once, but we also want to prevent fork-bombing. use the |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
803 same method as apache: check once a second if we need new |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
804 processes. if yes and we've used all the existing processes, |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
805 double their amount (unless we've hit the high limit). |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
806 Then for each second that didn't use all existing processes, |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
807 drop the max. process count by one. */ |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
808 if (group->wanted_processes_count < group->set->login_processes_count) { |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
809 group->wanted_processes_count = |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
810 group->set->login_processes_count; |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
811 } else if (group->listening_processes == 0) |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
812 group->wanted_processes_count *= 2; |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
813 else if (group->wanted_processes_count > |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
814 group->set->login_processes_count) |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
815 group->wanted_processes_count--; |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
816 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
817 while (group->listening_processes < group->wanted_processes_count && |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
818 group->processes < group->set->login_max_processes_count) { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
819 if (create_login_process(group) < 0) |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
820 return -1; |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
821 } |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
822 |
4538
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
823 if (group->listening_processes == 0 && |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
824 !group->set->login_process_per_connection) { |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
825 /* we've reached our limit. notify the processes to start |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
826 listening again which makes them kill some of their |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
827 oldest clients when accepting the next connection */ |
9d9e72374164
Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents:
4388
diff
changeset
|
828 login_processes_notify_group(group); |
4148
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
829 } |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
830 return 0; |
635
90a65c017bf0
SIGHUP reloads now settings. Logged in clients are left untouched, but
Timo Sirainen <tss@iki.fi>
parents:
615
diff
changeset
|
831 } |
90a65c017bf0
SIGHUP reloads now settings. Logged in clients are left untouched, but
Timo Sirainen <tss@iki.fi>
parents:
615
diff
changeset
|
832 |
4148
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
833 static void login_processes_stall(void) |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
834 { |
4665 | 835 if (logins_stalled || IS_INETD()) |
4148
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
836 return; |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
837 |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
838 i_error("Temporary failure in creating login processes, " |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
839 "slowing down for now"); |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
840 logins_stalled = TRUE; |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
841 |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
842 timeout_remove(&to); |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
843 to = timeout_add(60*1000, login_processes_start_missing, NULL); |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
844 } |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
845 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
876
diff
changeset
|
846 static void |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6396
diff
changeset
|
847 login_processes_start_missing(void *context ATTR_UNUSED) |
0 | 848 { |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
849 struct login_group *group; |
614
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
850 |
5136
86625faa49b5
Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
851 if (!have_initialized_auth_processes) { |
86625faa49b5
Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
852 /* don't create login processes before at least one auth |
86625faa49b5
Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
853 process has finished initializing */ |
86625faa49b5
Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
854 return; |
86625faa49b5
Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
855 } |
86625faa49b5
Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents:
5089
diff
changeset
|
856 |
1610
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
857 if (login_groups == NULL) |
6850142c4e25
New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents:
1506
diff
changeset
|
858 login_process_groups_create(); |
614
e60620644af3
login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents:
613
diff
changeset
|
859 |
4148
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
860 for (group = login_groups; group != NULL; group = group->next) { |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
861 if (login_group_start_missings(group) < 0) { |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
862 login_processes_stall(); |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
863 return; |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
864 } |
f60d73c96618
If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents:
3901
diff
changeset
|
865 } |
0 | 866 } |
867 | |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
868 static int login_process_send_env(struct login_process *p) |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
869 { |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
870 extern char **environ; |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
871 char **env; |
3607
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
872 ssize_t len; |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
873 int ret = 0; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
874 |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
875 /* this will clear our environment. luckily we don't need it. */ |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
876 login_process_init_env(p->group, p->pid); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
877 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
878 for (env = environ; *env != NULL; env++) { |
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
879 len = strlen(*env); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
880 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
881 if (o_stream_send(p->output, *env, len) != len || |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
882 o_stream_send(p->output, "\n", 1) != 1) { |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
883 ret = -1; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
884 break; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
885 } |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
886 } |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
887 |
3607
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
888 if (!p->group->set->login_chroot) { |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
889 /* if we're not chrooting, we need to tell login process |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
890 where its base directory is */ |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
891 const char *str = t_strdup_printf("LOGIN_DIR=%s\n", |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
892 p->group->set->login_dir); |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
893 len = strlen(str); |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
894 if (o_stream_send(p->output, str, len) != len) |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
895 ret = -1; |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
896 } |
a2dd3d895e00
Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents:
3384
diff
changeset
|
897 |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
898 if (ret == 0 && o_stream_send(p->output, "\n", 1) != 1) |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
899 ret = -1; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
900 |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
901 env_clean(); |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
902 return ret; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
903 } |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
904 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3692
diff
changeset
|
905 static bool login_process_init_group(struct login_process *p) |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
906 { |
4740
0a1fa29ac87f
inetd logins kept crashing dovecot master.
Timo Sirainen <tss@iki.fi>
parents:
4734
diff
changeset
|
907 p->group->refcount++; |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
908 p->group->processes++; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
909 p->group->listening_processes++; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
910 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
911 if (login_process_send_env(p) < 0) { |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
912 i_error("login: Couldn't send environment"); |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
913 return FALSE; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
914 } |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
915 |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
916 return TRUE; |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
917 } |
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
918 |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6396
diff
changeset
|
919 static void inetd_login_accept(void *context ATTR_UNUSED) |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
920 { |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
921 struct login_process *p; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
922 int fd; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
923 |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
924 fd = net_accept(inetd_login_fd, NULL, NULL); |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
925 if (fd < 0) { |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
926 if (fd < -1) |
5358
a977ad033903
net_listen_unix() API changed a bit. -1 is now returned for errors that can
Timo Sirainen <tss@iki.fi>
parents:
5136
diff
changeset
|
927 i_error("accept(inetd_login_fd) failed: %m"); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
928 } else { |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
929 net_set_nonblock(fd, TRUE); |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
930 fd_close_on_exec(fd, TRUE); |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
931 |
6519
66e5f514355e
Login processes started by inetd aren't ours, don't treat them as such.
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
932 p = login_process_new(NULL, ++login_pid_counter, fd, TRUE); |
1275
af685269ead0
login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents:
1273
diff
changeset
|
933 p->initialized = TRUE; |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
934 } |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
935 } |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
936 |
0 | 937 void login_processes_init(void) |
938 { | |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
939 auth_id_counter = 0; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
940 login_pid_counter = 0; |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
941 login_groups = NULL; |
613
1906116a62ce
Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
942 |
5843
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
943 child_process_set_destroy_callback(PROCESS_TYPE_LOGIN, |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
944 login_process_destroyed); |
f655c4d4a419
Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents:
5632
diff
changeset
|
945 |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
946 if (!IS_INETD()) { |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
947 to = timeout_add(1000, login_processes_start_missing, NULL); |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
948 io_listen = NULL; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
949 } else { |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
950 to = NULL; |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
951 io_listen = io_add(inetd_login_fd, IO_READ, |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
952 inetd_login_accept, NULL); |
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
953 } |
0 | 954 } |
955 | |
956 void login_processes_deinit(void) | |
957 { | |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
958 if (to != NULL) |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
959 timeout_remove(&to); |
1273
2cf2e08a6ee9
Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents:
1237
diff
changeset
|
960 if (io_listen != NULL) |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
961 io_remove(&io_listen); |
0 | 962 } |