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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "login-process.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #include <unistd.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 int refcount;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 pid_t pid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 int fd;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
97 ssize_t ret;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116
2329
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
117 ret = o_stream_send(request->process->output, &master_reply,
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
118 sizeof(master_reply));
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
119 if (ret != sizeof(master_reply)) {
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
120 if (ret >= 0) {
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
121 i_warning("Login process %s transmit buffer full, "
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
122 "killing..", dec2str(request->process->pid));
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
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
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
125 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 i_free(request);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
18559c7e3a15 Cleanups and minor fixes
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 p->refcount++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 if (auth_process == NULL) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
5372b92be174 Reference counter fixes
Timo Sirainen <tss@iki.fi>
parents: 4668
diff changeset
472 p->refcount = 2; /* once for fd close, another for process exit */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 p->pid = pid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 return p;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502 if (p->destroyed)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 p->destroyed = TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
5372b92be174 Reference counter fixes
Timo Sirainen <tss@iki.fi>
parents: 4668
diff changeset
518 login_process_unref(p);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 {
4670
5372b92be174 Reference counter fixes
Timo Sirainen <tss@iki.fi>
parents: 4668
diff changeset
523 i_assert(p->refcount > 0);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 if (--p->refcount > 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 i_free(p);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
162ad2307710 Comment update
Timo Sirainen <tss@iki.fi>
parents: 3691
diff changeset
541 clean_child_process() since it clears environment. Don't set user
162ad2307710 Comment update
Timo Sirainen <tss@iki.fi>
parents: 3691
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616 {
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 i_fatal("Login process must not run as root");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 i_error("socketpair() failed: %m");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
632 return -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
633 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646 if (pid < 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 (void)close(fd[0]);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650 return -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653 if (pid != 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 /* master */
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
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
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
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
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 return pid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
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
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
670 log_set_prefix(log, prefix);
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 (void)close(fd[0]);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703 (void)close(fd[1]);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 return -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
5372b92be174 Reference counter fixes
Timo Sirainen <tss@iki.fi>
parents: 4668
diff changeset
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
e4d7d01b0784 Deinit crashfix.
Timo Sirainen <tss@iki.fi>
parents: 4661
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937 void login_processes_init(void)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
954 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
955
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
956 void login_processes_deinit(void)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
962 }