annotate src/master/login-process.c @ 7086:7ed926ed7aa4 HEAD

Updated copyright notices to include year 2008.
author Timo Sirainen <tss@iki.fi>
date Tue, 01 Jan 2008 22:05:21 +0200
parents 414c9d631a81
children 59ac3628b8d8
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
2097
4e77cb0aff21 Added %l, %r and %P variables and mail_log_prefix setting.
Timo Sirainen <tss@iki.fi>
parents: 2046
diff changeset
51 struct ip_addr local_ip, remote_ip;
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 876
diff changeset
52 };
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
54 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
55 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
56 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
57 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
58
1055
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
59 static struct login_group *login_groups;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
4651
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
61 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
62 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
63 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
64 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
65 static void login_processes_start_missing(void *context);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
67 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
68 {
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
69 struct login_group *group;
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 group = i_new(struct login_group, 1);
4631
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
72 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
73 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
74 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
75 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
76
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
77 group->next = login_groups;
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
78 login_groups = group;
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
79 }
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
80
4631
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
81 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
82 {
4631
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
83 i_assert(group->refcount > 0);
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
84
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
85 if (--group->refcount > 0)
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
86 return;
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
87
1055
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
88 i_free(group);
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
89 }
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
90
2736
0f31778d3c34 Changed dovecot-auth protocol to ASCII based. Should be easier now to write
Timo Sirainen <tss@iki.fi>
parents: 2691
diff changeset
91 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
92 struct login_auth_request *request)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 {
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
94 struct master_login_reply master_reply;
2329
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
95 ssize_t ret;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
4740
0a1fa29ac87f inetd logins kept crashing dovecot master.
Timo Sirainen <tss@iki.fi>
parents: 4734
diff changeset
97 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
98 if (user == NULL)
5846
21e529b8a701 Initial implementation for mail_max_user_connections setting.
Timo Sirainen <tss@iki.fi>
parents: 5843
diff changeset
99 master_reply.status = MASTER_LOGIN_STATUS_INTERNAL_ERROR;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6542
diff changeset
100 else T_FRAME_BEGIN {
1055
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
101 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
102
5846
21e529b8a701 Initial implementation for mail_max_user_connections setting.
Timo Sirainen <tss@iki.fi>
parents: 5843
diff changeset
103 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
104 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
105 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
106 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
107 &request->remote_ip, user, args,
c3ded5b815aa If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents: 4148
diff changeset
108 FALSE);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6542
diff changeset
109 } T_FRAME_END;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 /* 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
112 master_reply.tag = request->login_tag;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
2329
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
114 ret = o_stream_send(request->process->output, &master_reply,
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
115 sizeof(master_reply));
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
116 if (ret != sizeof(master_reply)) {
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
117 if (ret >= 0) {
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
118 i_warning("Login process %s transmit buffer full, "
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
119 "killing..", dec2str(request->process->pid));
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
120 }
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
121 login_process_destroy(request->process);
2329
f34aca0d7c85 Changed default cache fields.
Timo Sirainen <tss@iki.fi>
parents: 2141
diff changeset
122 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
805
5ac361acb316 Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents: 801
diff changeset
124 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
125 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
126 login_process_unref(request->process);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 i_free(request);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
130 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
131 {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
132 if (p->state != LOGIN_STATE_FULL_PRELOGINS)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
133 return;
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->prev_prelogin == NULL)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
136 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
137 else
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
138 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
139
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
140 if (p->next_prelogin == NULL)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
141 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
142 else
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
143 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
144
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
145 p->prev_prelogin = p->next_prelogin = NULL;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
146 }
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 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
149 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
150 {
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
151 if (p->group == NULL)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
152 return;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
153
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
154 if (p->state == LOGIN_STATE_LISTENING)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
155 p->group->listening_processes--;
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 (new_state == LOGIN_STATE_FULL_PRELOGINS) {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
158 /* add to prelogin list */
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
159 i_assert(p->state != new_state);
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
160
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
161 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
162 if (p->group->newest_prelogin_process == NULL)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
163 p->group->oldest_prelogin_process = p;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
164 else
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
165 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
166 p->group->newest_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 process_remove_from_prelogin_lists(p);
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
169 }
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
170 }
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
171
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
172 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
173 {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
174 if (p->group == NULL)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
175 return;
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->state != LOGIN_STATE_LISTENING)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
178 p->group->listening_processes++;
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 process_remove_from_prelogin_lists(p);
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
181 }
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
182
4651
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
183 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
184 {
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
185 p->initialized = TRUE;
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
186
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
187 if (logins_stalled) {
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
188 /* 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
189 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
190
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
191 logins_stalled = FALSE;
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
192 timeout_remove(&to);
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
193 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
194 }
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
195 }
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
196
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
197 static void
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
198 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
199 {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
200 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
201 (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
202 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
203 "(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
204 p->state, state);
4640
f5772851ac91 If login process sends wrong state information, restart it.
Timo Sirainen <tss@iki.fi>
parents: 4632
diff changeset
205 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
206 return;
e60620644af3 login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents: 613
diff changeset
207 }
e60620644af3 login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents: 613
diff changeset
208
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
209 if (state == LOGIN_STATE_LISTENING) {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
210 process_mark_listening(p);
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
211 } else {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
212 process_mark_nonlistening(p, state);
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
213 }
1275
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
214
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
215 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
216 }
614
e60620644af3 login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents: 613
diff changeset
217
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
218 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
219 {
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
220 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
221
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
222 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
223 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
224 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
225 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
226 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
227 }
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
228 }
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
229
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
230 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
231 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
232 {
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
233 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
234
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
235 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
236 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
237
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
238 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
239 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
240 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
241 return group;
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
242 }
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
243
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
244 return NULL;
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
245 }
614
e60620644af3 login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents: 613
diff changeset
246
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
247 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
248 {
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
249 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
250 const char *name, *proto;
5089
18559c7e3a15 Cleanups and minor fixes
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
251 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
252 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
253 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
254 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
255
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
256 /* read length */
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
257 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
258 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
259 len = 0;
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
260 else {
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
261 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
262 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
263 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
264 return FALSE;
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
265 }
614
e60620644af3 login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents: 613
diff changeset
266
1275
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
267 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
268 }
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
269
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
270 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
271 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
272 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
273 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
274 else {
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
275 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
276 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
277 if (proto == NULL) {
3607
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
278 proto = name;
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
279 name = "default";
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
280 } else {
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
281 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
282 }
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
283
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
284 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
285 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
286 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
287 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
288 else {
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
289 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
290 return FALSE;
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
291 }
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
292
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
293 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
294 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
295 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
296 return FALSE;
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
297 }
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
298
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
299 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
300 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
301 }
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
302 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
303 }
e60620644af3 login_process_per_connection = yes scales now better when multiple users are
Timo Sirainen <tss@iki.fi>
parents: 613
diff changeset
304
4649
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
305 static int
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
306 login_read_request(struct login_process *p, struct master_login_request *req,
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
307 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
308 {
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
309 struct stat st;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
310 ssize_t ret;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
311
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
312 *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
313
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
314 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
315 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
316 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
317 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
318 "(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
319 return -1;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
320 }
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
321
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
322 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
323 if (ret == 0) {
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
324 /* 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
325 } 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
326 /* request wasn't fully read */
4734
f032a5d2bc0d Error message fix for 64bit systems.
Timo Sirainen <tss@iki.fi>
parents: 4670
diff changeset
327 i_error("login: fd_read() returned partial %d",
f032a5d2bc0d Error message fix for 64bit systems.
Timo Sirainen <tss@iki.fi>
parents: 4670
diff changeset
328 (int)ret);
4649
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
329 } else {
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
330 if (errno == EAGAIN)
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
331 return 0;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
332
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
333 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
334 }
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
335 return -1;
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
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
338 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
339 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
340 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
341 "a file descriptor");
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
342 return -1;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
343 }
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
344 return 1;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
345 }
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
346
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
347 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
348 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
349 return -1;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
350 }
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
351
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
352 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
353 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
354 return -1;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
355 }
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
356
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
357 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
358 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
359 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
360 return -1;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
361 }
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
362 return 1;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
363 }
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
364
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4740
diff changeset
365 static void login_process_input(struct login_process *p)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 876
diff changeset
367 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
368 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
369 struct master_login_request req;
1275
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
370 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
371 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
372
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
373 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
374 /* 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
375 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
376 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
377 return;
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
378 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379
4649
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
380 ret = login_read_request(p, &req, &client_fd);
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
381 if (ret == 0)
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
382 return;
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
383 if (ret < 0) {
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
384 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
385 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
386 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
387 }
2779
1fd55b4341b9 Added version to login <-> master communication as well.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
388 login_process_destroy(p);
1fd55b4341b9 Added version to login <-> master communication as well.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
389 return;
1fd55b4341b9 Added version to login <-> master communication as well.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
390 }
1fd55b4341b9 Added version to login <-> master communication as well.
Timo Sirainen <tss@iki.fi>
parents: 2736
diff changeset
391
4649
a3d6a3462745 Send inode number in login requests and verify that they match.
Timo Sirainen <tss@iki.fi>
parents: 4640
diff changeset
392 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
393 /* state notification */
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
394 enum master_login_state state = req.tag;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
395
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
396 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
397 /* initialization notify */
4651
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
398 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
399 } else {
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
400 /* change "listening for new connections" status */
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
401 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
402 }
613
1906116a62ce Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents: 596
diff changeset
403 return;
1906116a62ce Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents: 596
diff changeset
404 }
1906116a62ce Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents: 596
diff changeset
405
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
406 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
407 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
408 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
409 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
410 }
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
411
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
412 fd_close_on_exec(client_fd, TRUE);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 /* ask the cookie from the auth process */
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 876
diff changeset
415 authreq = i_new(struct login_auth_request, 1);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 p->refcount++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 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
418 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
419 authreq->login_tag = req.tag;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 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
421 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
422 authreq->remote_ip = req.remote_ip;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423
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
424 auth_process = auth_process_find(req.auth_pid);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 if (auth_process == NULL) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 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
427 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
428 auth_master_callback(NULL, NULL, authreq);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 } 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
430 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
431 req.auth_id, authreq);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434
1055
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
435 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
436 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
437 bool inetd_child)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 {
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 876
diff changeset
439 struct login_process *p;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
441 i_assert(pid != 0);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 876
diff changeset
443 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
444 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
445 p->group = group;
4670
5372b92be174 Reference counter fixes
Timo Sirainen <tss@iki.fi>
parents: 4668
diff changeset
446 p->refcount = 2; /* once for fd close, another for process exit */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 p->pid = pid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 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
449 p->inetd_child = inetd_child;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 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
451 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
452 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
453 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
454 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
455
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
456 p->state = LOGIN_STATE_LISTENING;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
457
1275
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
458 if (p->group != NULL) {
4631
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
459 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
460 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
461 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
462 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 return p;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
466 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
467 {
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
468 if (p->group != NULL)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
469 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
470
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
471 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
472 }
1906116a62ce Finally support for handling each login connection in it's own process.
Timo Sirainen <tss@iki.fi>
parents: 596
diff changeset
473
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 876
diff changeset
474 static void login_process_destroy(struct login_process *p)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 if (p->destroyed)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 p->destroyed = TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479
4651
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
480 if (!p->initialized)
2fe8f6a0bc5b If login process dies before initialization, stall creation of them instead
Timo Sirainen <tss@iki.fi>
parents: 4649
diff changeset
481 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
482
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 747
diff changeset
483 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
484 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
485 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
486 i_error("close(login) failed: %m");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
488 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
489
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
490 if (p->inetd_child)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
491 login_process_exited(p);
4670
5372b92be174 Reference counter fixes
Timo Sirainen <tss@iki.fi>
parents: 4668
diff changeset
492 login_process_unref(p);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 876
diff changeset
495 static void login_process_unref(struct login_process *p)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 {
4670
5372b92be174 Reference counter fixes
Timo Sirainen <tss@iki.fi>
parents: 4668
diff changeset
497 i_assert(p->refcount > 0);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 if (--p->refcount > 0)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 return;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500
4631
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
501 if (p->group != NULL)
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
502 login_group_unref(p->group);
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
503
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
504 o_stream_unref(&p->output);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505 i_free(p);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
506 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
508 static void login_process_init_env(struct login_group *group, pid_t pid)
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
509 {
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
510 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
511
2000
c7c19f5071c3 Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents: 1997
diff changeset
512 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
513
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
514 /* setup access environment - needs to be done after
3692
162ad2307710 Comment update
Timo Sirainen <tss@iki.fi>
parents: 3691
diff changeset
515 clean_child_process() since it clears environment. Don't set user
162ad2307710 Comment update
Timo Sirainen <tss@iki.fi>
parents: 3691
diff changeset
516 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
517 processes. */
e167b71e37e3 Don't call initgroups() at the start of login processes.
Timo Sirainen <tss@iki.fi>
parents: 3607
diff changeset
518 restrict_access_set_env(NULL, set->login_uid,
1724
b3526668de78 Make sure auth process and login process don't share uids.
Timo Sirainen <tss@iki.fi>
parents: 1610
diff changeset
519 set->server->login_gid,
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
520 set->login_chroot ? set->login_dir : NULL,
2141
8690d2000e33 Added mail_extra_groups setting.
Timo Sirainen <tss@iki.fi>
parents: 2097
diff changeset
521 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
522
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
523 env_put("DOVECOT_MASTER=1");
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
524
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
525 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
526 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
527
4388
af61031c746f Settings parser nowadays returns "" instead of NULL when it reads an empty
Timo Sirainen <tss@iki.fi>
parents: 4353
diff changeset
528 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
529 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
530
4388
af61031c746f Settings parser nowadays returns "" instead of NULL when it reads an empty
Timo Sirainen <tss@iki.fi>
parents: 4353
diff changeset
531 if (*set->ssl_ca_file != '\0') {
1907
190f1d315ce6 Added setting ssl_ca_file, patch by Zach Bagnall
Timo Sirainen <tss@iki.fi>
parents: 1897
diff changeset
532 env_put(t_strconcat("SSL_CA_FILE=",
190f1d315ce6 Added setting ssl_ca_file, patch by Zach Bagnall
Timo Sirainen <tss@iki.fi>
parents: 1897
diff changeset
533 set->ssl_ca_file, NULL));
190f1d315ce6 Added setting ssl_ca_file, patch by Zach Bagnall
Timo Sirainen <tss@iki.fi>
parents: 1897
diff changeset
534 }
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
535 env_put(t_strconcat("SSL_CERT_FILE=",
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
536 set->ssl_cert_file, NULL));
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
537 env_put(t_strconcat("SSL_KEY_FILE=",
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
538 set->ssl_key_file, NULL));
3889
c7462001227b Added support for password protected SSL private keys. The password can be
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
539 env_put(t_strconcat("SSL_KEY_PASSWORD=",
c7462001227b Added support for password protected SSL private keys. The password can be
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
540 ssl_key_password, NULL));
3901
0ae5f5b468b7 Put ssl-parameters file into login directory so it still can be accessed
Timo Sirainen <tss@iki.fi>
parents: 3889
diff changeset
541 env_put("SSL_PARAM_FILE="SSL_PARAMETERS_FILENAME);
4388
af61031c746f Settings parser nowadays returns "" instead of NULL when it reads an empty
Timo Sirainen <tss@iki.fi>
parents: 4353
diff changeset
542 if (*set->ssl_cipher_list != '\0') {
1996
d8f06a0c818e Added ssl_cipher_list setting.
Timo Sirainen <tss@iki.fi>
parents: 1907
diff changeset
543 env_put(t_strconcat("SSL_CIPHER_LIST=",
d8f06a0c818e Added ssl_cipher_list setting.
Timo Sirainen <tss@iki.fi>
parents: 1907
diff changeset
544 set->ssl_cipher_list, NULL));
d8f06a0c818e Added ssl_cipher_list setting.
Timo Sirainen <tss@iki.fi>
parents: 1907
diff changeset
545 }
6364
7ad61f00ee55 Added ssl_cert_username_field setting.
Timo Sirainen <tss@iki.fi>
parents: 6313
diff changeset
546 env_put(t_strconcat("SSL_CERT_USERNAME_FIELD=",
7ad61f00ee55 Added ssl_cert_username_field setting.
Timo Sirainen <tss@iki.fi>
parents: 6313
diff changeset
547 set->ssl_cert_username_field, NULL));
1997
1d0985f6bdd9 Added ssl_verify_client_cert setting.
Timo Sirainen <tss@iki.fi>
parents: 1996
diff changeset
548 if (set->ssl_verify_client_cert)
1d0985f6bdd9 Added ssl_verify_client_cert setting.
Timo Sirainen <tss@iki.fi>
parents: 1996
diff changeset
549 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
550 }
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
551
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
552 if (set->disable_plaintext_auth)
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
553 env_put("DISABLE_PLAINTEXT_AUTH=1");
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
554 if (set->verbose_proctitle)
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
555 env_put("VERBOSE_PROCTITLE=1");
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
556 if (set->verbose_ssl)
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
557 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
558 if (set->server->auths->verbose)
46f879c46b45 auth_verbose now affects imap/pop3 login processes too. Every authentication
Timo Sirainen <tss@iki.fi>
parents: 2674
diff changeset
559 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
560
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
561 if (set->login_process_per_connection) {
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
562 env_put("PROCESS_PER_CONNECTION=1");
4668
654aa0e9075b Cleanup
Timo Sirainen <tss@iki.fi>
parents: 4665
diff changeset
563 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
564 } else {
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
565 env_put(t_strdup_printf("MAX_CONNECTIONS=%u",
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
566 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
567 }
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
568
2674
857f5f7b512b Added login_greeting and login_greeting_capability settings.
Timo Sirainen <tss@iki.fi>
parents: 2329
diff changeset
569 env_put(t_strconcat("PROCESS_UID=", dec2str(pid), NULL));
857f5f7b512b Added login_greeting and login_greeting_capability settings.
Timo Sirainen <tss@iki.fi>
parents: 2329
diff changeset
570 env_put(t_strconcat("GREETING=", set->login_greeting, NULL));
3384
3b75956d20c4 Added configurable logging for login process. Added configurable pop3 logout
Timo Sirainen <tss@iki.fi>
parents: 3083
diff changeset
571 env_put(t_strconcat("LOG_FORMAT_ELEMENTS=",
3b75956d20c4 Added configurable logging for login process. Added configurable pop3 logout
Timo Sirainen <tss@iki.fi>
parents: 3083
diff changeset
572 set->login_log_format_elements, NULL));
3b75956d20c4 Added configurable logging for login process. Added configurable pop3 logout
Timo Sirainen <tss@iki.fi>
parents: 3083
diff changeset
573 env_put(t_strconcat("LOG_FORMAT=", set->login_log_format, NULL));
2674
857f5f7b512b Added login_greeting and login_greeting_capability settings.
Timo Sirainen <tss@iki.fi>
parents: 2329
diff changeset
574 if (set->login_greeting_capability)
857f5f7b512b Added login_greeting and login_greeting_capability settings.
Timo Sirainen <tss@iki.fi>
parents: 2329
diff changeset
575 env_put("GREETING_CAPABILITY=1");
4197
c3ded5b815aa If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents: 4148
diff changeset
576
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 5632
diff changeset
577 if (group->mail_process_type == PROCESS_TYPE_IMAP) {
4197
c3ded5b815aa If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents: 4148
diff changeset
578 env_put(t_strconcat("CAPABILITY_STRING=",
c3ded5b815aa If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents: 4148
diff changeset
579 *set->imap_capability != '\0' ?
c3ded5b815aa If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents: 4148
diff changeset
580 set->imap_capability :
c3ded5b815aa If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents: 4148
diff changeset
581 set->imap_generated_capability, NULL));
c3ded5b815aa If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents: 4148
diff changeset
582 }
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
583 }
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
584
1055
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
585 static pid_t create_login_process(struct login_group *group)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 {
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
587 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
588 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
589 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
590 const char *prefix;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 pid_t pid;
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
592 ARRAY_TYPE(dup2) dups;
6396
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
593 unsigned int i, fd_limit, listen_count = 0, ssl_listen_count = 0;
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
594 int fd[2], log_fd, cur_fd, tmp_fd;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
596 if (group->set->login_uid == 0)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 i_fatal("Login process must not run as root");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 /* 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
600 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 i_error("socketpair() failed: %m");
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 return -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604
3083
a20882c4f092 Disable log throttlong for auth process, and for login processes if
Timo Sirainen <tss@iki.fi>
parents: 2886
diff changeset
605 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
606 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
607 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
608 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
609 pid = -1;
c7c19f5071c3 Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents: 1997
diff changeset
610 else {
c7c19f5071c3 Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents: 1997
diff changeset
611 pid = fork();
c7c19f5071c3 Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents: 1997
diff changeset
612 if (pid < 0)
c7c19f5071c3 Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents: 1997
diff changeset
613 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
614 }
c7c19f5071c3 Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents: 1997
diff changeset
615
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616 if (pid < 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
617 (void)close(fd[0]);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 (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
619 (void)close(log_fd);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
620 return -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
622
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
623 if (pid != 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 /* master */
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
625 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
626 process_names[group->mail_process_type]);
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
627 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
628 log_set_pid(log, pid);
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
629
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
630 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
631 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
632 (void)login_process_new(group, pid, fd[0], FALSE);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
633 (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
634 (void)close(log_fd);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
635 return pid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
636 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
638 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
639 process_names[group->mail_process_type]);
2046
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
640 log_set_prefix(log, prefix);
6ae973f60f43 logging cleanups.
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
641
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
642 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
643 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
644 /* 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
645 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
646 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
647 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
648 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
649
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
650 /* redirect listener fds */
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
651 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
652 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
653 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
654 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
655 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
656 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
657
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
658 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
659 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
660 &ssl_listen_count);
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
661 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
662 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
663 }
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
664
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
665 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
666 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
667
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
668 /* 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
669 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
670 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
671
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672 (void)close(fd[0]);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673 (void)close(fd[1]);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
674
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
675 login_process_init_env(group, getpid());
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
676
5887
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
677 env_put(t_strdup_printf("LISTEN_FDS=%u", listen_count));
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
678 env_put(t_strdup_printf("SSL_LISTEN_FDS=%u", ssl_listen_count));
3f2eb1b9c555 Support listening multiple sockets. SIGHUP also doesn't anymore recreate
Timo Sirainen <tss@iki.fi>
parents: 5846
diff changeset
679
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
680 if (!group->set->login_chroot) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681 /* 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
682 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
683 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
684 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
685 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
688 restrict_process_size(group->set->login_process_size, (unsigned int)-1);
6396
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
689 fd_limit = 16 + listen_count + ssl_listen_count +
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
690 2 * (group->set->login_process_per_connection ? 1 :
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
691 group->set->login_max_connections);
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
692 restrict_fd_limit(fd_limit);
722
0438621d25ff Added virtual memory size limits to processes. Default values are pretty
Timo Sirainen <tss@iki.fi>
parents: 699
diff changeset
693
801
86224ff16bf6 Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents: 791
diff changeset
694 /* 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
695 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
696 closelog();
86224ff16bf6 Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents: 791
diff changeset
697
6396
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
698 /* execv() needs at least one file descriptor. we might have all fds
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
699 up to fd_limit used already, so close one we don't care about.
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
700 either it succeeds or fails with EBADF, doesn't matter. */
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
701 i_assert(fd_limit > (unsigned int)cur_fd+1);
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
702 (void)close(cur_fd+1);
1b21dfee7bd7 Calculate needed fd count better. Make sure we have one unused fd available
Timo Sirainen <tss@iki.fi>
parents: 6364
diff changeset
703
2886
634cf6aa34d1 Allow running all executables with parameters.
Timo Sirainen <tss@iki.fi>
parents: 2779
diff changeset
704 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
705 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
706 group->set->login_executable);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707 return -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
708 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 5632
diff changeset
710 static void
5846
21e529b8a701 Initial implementation for mail_max_user_connections setting.
Timo Sirainen <tss@iki.fi>
parents: 5843
diff changeset
711 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
712 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
713 {
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 5632
diff changeset
714 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
715
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
716 i_assert(!p->inetd_child);
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
717
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
718 if (abnormal_exit) {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
719 /* 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
720 the time */
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
721 if (p->group != NULL)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
722 p->group->wanted_processes_count = 0;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
723 }
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
724
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
725 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
726 }
0d852af6842e Master process generates DH/RSA parameters now and stores them into file
Timo Sirainen <tss@iki.fi>
parents: 614
diff changeset
727
4670
5372b92be174 Reference counter fixes
Timo Sirainen <tss@iki.fi>
parents: 4668
diff changeset
728 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
729 {
1897
1e6ed8045f2b Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents: 1724
diff changeset
730 struct hash_iterate_context *iter;
1e6ed8045f2b Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents: 1724
diff changeset
731 void *key, *value;
1e6ed8045f2b Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents: 1724
diff changeset
732
1e6ed8045f2b Changed hash_foreach() to iterator.
Timo Sirainen <tss@iki.fi>
parents: 1724
diff changeset
733 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
734 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
735 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
736
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 5632
diff changeset
737 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
738 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
739 }
6417
047d0d8bbf0a hash_destroy() and hash_iterate_deinit() now take ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
740 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
741
1055
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
742 while (login_groups != NULL) {
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
743 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
744
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
745 login_groups = group->next;
4631
f5d53a684856 SIGHUP caused memory corruption
Timo Sirainen <tss@iki.fi>
parents: 4630
diff changeset
746 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
747 }
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
748 }
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
749
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
750 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
751 {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
752 struct hash_iterate_context *iter;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
753 struct master_login_reply reply;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
754 void *key, *value;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
755
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
756 memset(&reply, 0, sizeof(reply));
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
757
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
758 iter = hash_iterate_init(processes);
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
759 while (hash_iterate(iter, &key, &value)) {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
760 struct login_process *p = value;
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
761
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 5632
diff changeset
762 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
763 (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
764 }
6417
047d0d8bbf0a hash_destroy() and hash_iterate_deinit() now take ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
765 hash_iterate_deinit(&iter);
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
766 }
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
767
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
768 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
769 {
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
770 if (group->set->login_process_per_connection &&
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
771 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
772 group->listening_processes == 0) {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
773 /* destroy the oldest listening process. non-listening
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
774 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
775 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
776 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
777 group->oldest_prelogin_process->initialized)
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
778 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
779 }
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
780
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
781 /* 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
782 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
783 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
784 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
785 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
786 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
787 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
788 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
789 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
790 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
791 } 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
792 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
793 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
794 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
795 group->wanted_processes_count--;
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
796
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
797 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
798 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
799 if (create_login_process(group) < 0)
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
800 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
801 }
1055
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
802
4538
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
803 if (group->listening_processes == 0 &&
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
804 !group->set->login_process_per_connection) {
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
805 /* 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
806 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
807 oldest clients when accepting the next connection */
9d9e72374164 Fixes to login process handling, especially with
Timo Sirainen <tss@iki.fi>
parents: 4388
diff changeset
808 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
809 }
f60d73c96618 If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents: 3901
diff changeset
810 return 0;
635
90a65c017bf0 SIGHUP reloads now settings. Logged in clients are left untouched, but
Timo Sirainen <tss@iki.fi>
parents: 615
diff changeset
811 }
90a65c017bf0 SIGHUP reloads now settings. Logged in clients are left untouched, but
Timo Sirainen <tss@iki.fi>
parents: 615
diff changeset
812
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
813 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
814 {
4665
e4d7d01b0784 Deinit crashfix.
Timo Sirainen <tss@iki.fi>
parents: 4661
diff changeset
815 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
816 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
817
f60d73c96618 If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents: 3901
diff changeset
818 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
819 "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
820 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
821
f60d73c96618 If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents: 3901
diff changeset
822 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
823 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
824 }
f60d73c96618 If master process runs out of file descriptors, try to handle it more nicely
Timo Sirainen <tss@iki.fi>
parents: 3901
diff changeset
825
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 876
diff changeset
826 static void
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6396
diff changeset
827 login_processes_start_missing(void *context ATTR_UNUSED)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
828 {
1055
a72bba3f8a55 Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
829 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
830
5136
86625faa49b5 Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents: 5089
diff changeset
831 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
832 /* 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
833 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
834 return;
86625faa49b5 Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents: 5089
diff changeset
835 }
86625faa49b5 Start auth processes immediately at startup, not after one second delay.
Timo Sirainen <tss@iki.fi>
parents: 5089
diff changeset
836
1610
6850142c4e25 New configuration file code. Some syntax changes, but tries to be somewhat
Timo Sirainen <tss@iki.fi>
parents: 1506
diff changeset
837 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
838 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
839
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
840 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
841 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
842 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
843 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
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 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
846 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
847
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
848 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
849 {
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
850 extern char **environ;
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
851 char **env;
3607
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
852 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
853 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
854
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
855 /* this will clear our environment. luckily we don't need it. */
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
856 login_process_init_env(p->group, p->pid);
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
857
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
858 for (env = environ; *env != NULL; env++) {
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
859 len = strlen(*env);
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
860
3607
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
861 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
862 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
863 ret = -1;
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
864 break;
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
865 }
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
866 }
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
867
3607
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
868 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
869 /* 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
870 where its base directory is */
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
871 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
872 p->group->set->login_dir);
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
873 len = strlen(str);
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
874 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
875 ret = -1;
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
876 }
a2dd3d895e00 Several fixes to make running from inetd working again
Timo Sirainen <tss@iki.fi>
parents: 3384
diff changeset
877
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
878 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
879 ret = -1;
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
880
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
881 env_clean();
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
882 return ret;
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
883 }
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
884
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
885 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
886 {
4740
0a1fa29ac87f inetd logins kept crashing dovecot master.
Timo Sirainen <tss@iki.fi>
parents: 4734
diff changeset
887 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
888 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
889 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
890
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
891 if (login_process_send_env(p) < 0) {
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
892 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
893 return FALSE;
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
894 }
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
895
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
896 return TRUE;
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
897 }
af685269ead0 login: Wait until we're connected to auth process before executing command
Timo Sirainen <tss@iki.fi>
parents: 1273
diff changeset
898
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6396
diff changeset
899 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
900 {
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
901 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
902 int fd;
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 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
905 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
906 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
907 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
908 } else {
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
909 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
910 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
911
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
912 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
913 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
914 }
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
915 }
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
916
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917 void login_processes_init(void)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
918 {
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
919 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
920 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
921 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
922
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 5632
diff changeset
923 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
924 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
925
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
926 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
927 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
928 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
929 } else {
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
930 to = NULL;
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
931 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
932 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
933 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
936 void login_processes_deinit(void)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937 {
1273
2cf2e08a6ee9 Somewhat working code to support loading Dovecot from inetd and such. It
Timo Sirainen <tss@iki.fi>
parents: 1237
diff changeset
938 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
939 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
940 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
941 io_remove(&io_listen);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
942 }