Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/imap/main.c @ 8467:03c418eadc8b HEAD
mail_user_*() now handles home directory lookups when necessary.
Namespace owner is now a pointer to struct mail_user rather than a string.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 21 Nov 2008 18:32:02 +0200 |
parents | 9d963e3bbe65 |
children | b9faf4db2a9f |
rev | line source |
---|---|
7086
7ed926ed7aa4
Updated copyright notices to include year 2008.
Timo Sirainen <tss@iki.fi>
parents:
6540
diff
changeset
|
1 /* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "common.h" | |
4 #include "ioloop.h" | |
2873
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
5 #include "network.h" |
1498 | 6 #include "ostream.h" |
1586
898a95426118
Keep capability in string_t so plugins can modify it.
Timo Sirainen <tss@iki.fi>
parents:
1498
diff
changeset
|
7 #include "str.h" |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
8 #include "base64.h" |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
9 #include "istream.h" |
0 | 10 #include "lib-signals.h" |
11 #include "restrict-access.h" | |
727
8dd8ebe6bcac
We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
621
diff
changeset
|
12 #include "fd-close-on-exec.h" |
746
ad4292a30b1d
Set process title for rawlog process.
Timo Sirainen <tss@iki.fi>
parents:
738
diff
changeset
|
13 #include "process-title.h" |
1465
03dd87873a81
Added support for dynamically loadable imap/pop3 modules.
Timo Sirainen <tss@iki.fi>
parents:
1464
diff
changeset
|
14 #include "module-dir.h" |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
8085
diff
changeset
|
15 #include "dict.h" |
1041 | 16 #include "mail-storage.h" |
1464
bd489d13479e
Added command_register() and related functions so we can dynamically
Timo Sirainen <tss@iki.fi>
parents:
1351
diff
changeset
|
17 #include "commands.h" |
5500
4862cb37106c
Moved namespace handling to lib-storage. Beginnings of namespace support for
Timo Sirainen <tss@iki.fi>
parents:
5333
diff
changeset
|
18 #include "mail-namespace.h" |
0 | 19 |
2873
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
20 #include <stdio.h> |
0 | 21 #include <stdlib.h> |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
22 #include <unistd.h> |
0 | 23 #include <syslog.h> |
24 | |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
25 #define IS_STANDALONE() \ |
7928
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
26 (getenv("IMAPLOGINTAG") == NULL) |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
27 |
2316
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
28 struct client_workaround_list { |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
29 const char *name; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
30 enum client_workarounds num; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
31 }; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
32 |
8027
62cf70991cf2
extern/static fixes (from a sparse check by Diego Liziero)
Timo Sirainen <tss@iki.fi>
parents:
7992
diff
changeset
|
33 static struct client_workaround_list client_workaround_list[] = { |
3204
c8fffa286b6a
Renamed oe6-fetch-no-newmail workaround to delay-newmail and changed it to
Timo Sirainen <tss@iki.fi>
parents:
3034
diff
changeset
|
34 { "delay-newmail", WORKAROUND_DELAY_NEWMAIL }, |
6210
da3c8d825f5c
Client is now never disconnected in IDLE because it hasn't sent anything.
Timo Sirainen <tss@iki.fi>
parents:
5980
diff
changeset
|
35 { "outlook-idle", 0 }, /* only for backwards compatibility */ |
2448 | 36 { "netscape-eoh", WORKAROUND_NETSCAPE_EOH }, |
3505
0e05687892dc
Added tb-extra-mailbox-sep IMAP workaround.
Timo Sirainen <tss@iki.fi>
parents:
3259
diff
changeset
|
37 { "tb-extra-mailbox-sep", WORKAROUND_TB_EXTRA_MAILBOX_SEP }, |
2316
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
38 { NULL, 0 } |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
39 }; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
40 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
811
diff
changeset
|
41 struct ioloop *ioloop; |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1586
diff
changeset
|
42 unsigned int imap_max_line_length; |
2316
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
43 enum client_workarounds client_workarounds = 0; |
5980
57b70f64f997
Added imap_logout_format setting with default to bytes=%i/%o
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
44 const char *logout_format; |
7917
ca2ff54ee9b4
Added support for IMAP ID extension.
Timo Sirainen <tss@iki.fi>
parents:
7796
diff
changeset
|
45 const char *imap_id_send, *imap_id_log; |
5980
57b70f64f997
Added imap_logout_format setting with default to bytes=%i/%o
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
46 |
4149
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
47 static struct io *log_io = NULL; |
5148
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
48 static struct module *modules = NULL; |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
49 static char log_prefix[128]; /* syslog() needs this to be permanent */ |
0 | 50 |
1643 | 51 void (*hook_client_created)(struct client **client) = NULL; |
1641
6498f3cb9d2c
Added hook_client_created and hook_mail_storage_created for modules.
Timo Sirainen <tss@iki.fi>
parents:
1622
diff
changeset
|
52 |
1586
898a95426118
Keep capability in string_t so plugins can modify it.
Timo Sirainen <tss@iki.fi>
parents:
1498
diff
changeset
|
53 string_t *capability_string; |
898a95426118
Keep capability in string_t so plugins can modify it.
Timo Sirainen <tss@iki.fi>
parents:
1498
diff
changeset
|
54 |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6353
diff
changeset
|
55 static void sig_die(int signo, void *context ATTR_UNUSED) |
0 | 56 { |
3620
3360cc019737
Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents:
3505
diff
changeset
|
57 /* warn about being killed because of some signal, except SIGINT (^C) |
3360cc019737
Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents:
3505
diff
changeset
|
58 which is too common at least while testing :) */ |
3360cc019737
Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents:
3505
diff
changeset
|
59 if (signo != SIGINT) |
3360cc019737
Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents:
3505
diff
changeset
|
60 i_warning("Killed with signal %d", signo); |
0 | 61 io_loop_stop(ioloop); |
62 } | |
63 | |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6353
diff
changeset
|
64 static void log_error_callback(void *context ATTR_UNUSED) |
4149
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
65 { |
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
66 io_loop_stop(ioloop); |
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
67 } |
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
68 |
2316
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
69 static void parse_workarounds(void) |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
70 { |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
71 struct client_workaround_list *list; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
72 const char *env, *const *str; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
73 |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
74 env = getenv("IMAP_CLIENT_WORKAROUNDS"); |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
75 if (env == NULL) |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
76 return; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
77 |
3788
b412da0eb27c
Clarify that workaround lists are space separated. But allow commas as
Timo Sirainen <tss@iki.fi>
parents:
3724
diff
changeset
|
78 for (str = t_strsplit_spaces(env, " ,"); *str != NULL; str++) { |
2316
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
79 list = client_workaround_list; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
80 for (; list->name != NULL; list++) { |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
81 if (strcasecmp(*str, list->name) == 0) { |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
82 client_workarounds |= list->num; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
83 break; |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
84 } |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
85 } |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
86 if (list->name == NULL) |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
87 i_fatal("Unknown client workaround: %s", *str); |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
88 } |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
89 } |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
90 |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
91 static void open_logfile(void) |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
92 { |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
93 const char *user; |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
94 |
2000
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1967
diff
changeset
|
95 if (getenv("LOG_TO_MASTER") != NULL) { |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1967
diff
changeset
|
96 i_set_failure_internal(); |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1967
diff
changeset
|
97 return; |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1967
diff
changeset
|
98 } |
c7c19f5071c3
Write all logging through master process. Fixes problems with log rotation,
Timo Sirainen <tss@iki.fi>
parents:
1967
diff
changeset
|
99 |
5333
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
100 if (getenv("LOG_PREFIX") != NULL) |
6422
18173a52f721
Renamed strocpy() to i_strocpy().
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
101 i_strocpy(log_prefix, getenv("LOG_PREFIX"), sizeof(log_prefix)); |
5333
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
102 else { |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
103 user = getenv("USER"); |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
104 if (user == NULL) { |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
105 if (IS_STANDALONE()) |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
106 user = getlogin(); |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
107 if (user == NULL) |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
108 user = "??"; |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
109 } |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
110 if (strlen(user) >= sizeof(log_prefix)-6) { |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
111 /* quite a long user name, cut it */ |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
112 user = t_strndup(user, sizeof(log_prefix)-6-2); |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
113 user = t_strconcat(user, "..", NULL); |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
114 } |
55260092b094
Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents:
5249
diff
changeset
|
115 i_snprintf(log_prefix, sizeof(log_prefix), "imap(%s): ", user); |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
116 } |
3724
d22c883021da
Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents:
3689
diff
changeset
|
117 if (getenv("USE_SYSLOG") != NULL) { |
d22c883021da
Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents:
3689
diff
changeset
|
118 const char *env = getenv("SYSLOG_FACILITY"); |
d22c883021da
Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents:
3689
diff
changeset
|
119 i_set_failure_syslog(log_prefix, LOG_NDELAY, |
d22c883021da
Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents:
3689
diff
changeset
|
120 env == NULL ? LOG_MAIL : atoi(env)); |
d22c883021da
Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents:
3689
diff
changeset
|
121 } else { |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
122 /* log to file or stderr */ |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1041
diff
changeset
|
123 i_set_failure_file(getenv("LOGFILE"), log_prefix); |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
124 } |
811
664de3231e33
Added info_log_file setting and i_info() function to write to it. Default is
Timo Sirainen <tss@iki.fi>
parents:
801
diff
changeset
|
125 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1041
diff
changeset
|
126 if (getenv("INFOLOGFILE") != NULL) |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1041
diff
changeset
|
127 i_set_info_file(getenv("INFOLOGFILE")); |
811
664de3231e33
Added info_log_file setting and i_info() function to write to it. Default is
Timo Sirainen <tss@iki.fi>
parents:
801
diff
changeset
|
128 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1041
diff
changeset
|
129 i_set_failure_timestamp_format(getenv("LOGSTAMP")); |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
130 } |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
131 |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
132 static void drop_privileges(void) |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
133 { |
5186
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
134 const char *version; |
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
135 |
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
136 version = getenv("DOVECOT_VERSION"); |
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
137 if (version != NULL && strcmp(version, PACKAGE_VERSION) != 0) { |
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
138 i_fatal("Dovecot version mismatch: " |
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
139 "Master is v%s, imap is v"PACKAGE_VERSION" " |
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
140 "(if you don't care, set version_ignore=yes)", version); |
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
141 } |
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
142 |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
143 /* Log file or syslog opening probably requires roots */ |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
144 open_logfile(); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
145 |
5148
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
146 /* Load the plugins before chrooting. Their init() is called later. */ |
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
147 if (getenv("MAIL_PLUGINS") != NULL) { |
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
148 const char *plugin_dir = getenv("MAIL_PLUGIN_DIR"); |
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
149 |
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
150 if (plugin_dir == NULL) |
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
151 plugin_dir = MODULEDIR"/imap"; |
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
152 modules = module_dir_load(plugin_dir, getenv("MAIL_PLUGINS"), |
5186
a7627141ec7f
Don't compare to PACKAGE_VERSION in lib/ core directly, rather make
Timo Sirainen <tss@iki.fi>
parents:
5148
diff
changeset
|
153 TRUE, version); |
5148
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
154 } |
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
155 |
7109
e6823d781317
Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents:
7091
diff
changeset
|
156 restrict_access_by_env(!IS_STANDALONE()); |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
157 } |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
158 |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
159 static void main_init(void) |
0 | 160 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
811
diff
changeset
|
161 struct client *client; |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
162 struct ostream *output; |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
163 struct mail_user *user; |
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
164 const char *username, *home, *str, *tag; |
550
3a83b05a0be3
--with-rawlog: Build support for logging traffic of user sessions. If
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
165 |
3620
3360cc019737
Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents:
3505
diff
changeset
|
166 lib_signals_init(); |
3360cc019737
Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents:
3505
diff
changeset
|
167 lib_signals_set_handler(SIGINT, TRUE, sig_die, NULL); |
3360cc019737
Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents:
3505
diff
changeset
|
168 lib_signals_set_handler(SIGTERM, TRUE, sig_die, NULL); |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
169 lib_signals_ignore(SIGPIPE, TRUE); |
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
170 lib_signals_ignore(SIGALRM, FALSE); |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
171 |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
172 username = getenv("USER"); |
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
173 if (username == NULL) { |
1194 | 174 if (IS_STANDALONE()) |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
175 username = getlogin(); |
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
176 if (username == NULL) |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
177 i_fatal("USER environment missing"); |
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
178 } |
748
474319868e82
Sanity check to make sure USER environment exists.
Timo Sirainen <tss@iki.fi>
parents:
746
diff
changeset
|
179 |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
180 home = getenv("HOME"); |
3034
de1b904c4df2
Print effective uid/gid when mail_debug is enabled.
Timo Sirainen <tss@iki.fi>
parents:
2873
diff
changeset
|
181 if (getenv("DEBUG") != NULL) { |
5133
cbc8f65d887b
mail_debug=yes: Log also home directory.
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
182 i_info("Effective uid=%s, gid=%s, home=%s", |
cbc8f65d887b
mail_debug=yes: Log also home directory.
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
183 dec2str(geteuid()), dec2str(getegid()), |
cbc8f65d887b
mail_debug=yes: Log also home directory.
Timo Sirainen <tss@iki.fi>
parents:
4903
diff
changeset
|
184 home != NULL ? home : "(none)"); |
3034
de1b904c4df2
Print effective uid/gid when mail_debug is enabled.
Timo Sirainen <tss@iki.fi>
parents:
2873
diff
changeset
|
185 } |
de1b904c4df2
Print effective uid/gid when mail_debug is enabled.
Timo Sirainen <tss@iki.fi>
parents:
2873
diff
changeset
|
186 |
4165
773c4becceae
Added shutdown_clients setting to control if existing imap/pop3 processes
Timo Sirainen <tss@iki.fi>
parents:
4149
diff
changeset
|
187 if (getenv("STDERR_CLOSE_SHUTDOWN") != NULL) { |
4149
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
188 /* If master dies, the log fd gets closed and we'll quit */ |
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
189 log_io = io_add(STDERR_FILENO, IO_ERROR, |
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
190 log_error_callback, NULL); |
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
191 } |
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
192 |
1586
898a95426118
Keep capability in string_t so plugins can modify it.
Timo Sirainen <tss@iki.fi>
parents:
1498
diff
changeset
|
193 capability_string = str_new(default_pool, sizeof(CAPABILITY_STRING)+32); |
898a95426118
Keep capability in string_t so plugins can modify it.
Timo Sirainen <tss@iki.fi>
parents:
1498
diff
changeset
|
194 str_append(capability_string, CAPABILITY_STRING); |
898a95426118
Keep capability in string_t so plugins can modify it.
Timo Sirainen <tss@iki.fi>
parents:
1498
diff
changeset
|
195 |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
8085
diff
changeset
|
196 dict_drivers_register_builtin(); |
8467
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8300
diff
changeset
|
197 mail_users_init(getenv("AUTH_SOCKET_PATH"), getenv("DEBUG") != NULL); |
1138
340dea0150bf
Added client_workarounds setting, with currently one workaround for OE6.
Timo Sirainen <tss@iki.fi>
parents:
1087
diff
changeset
|
198 mail_storage_init(); |
0 | 199 mail_storage_register_all(); |
4808
93bc9770f938
Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
4553
diff
changeset
|
200 mailbox_list_register_all(); |
1465
03dd87873a81
Added support for dynamically loadable imap/pop3 modules.
Timo Sirainen <tss@iki.fi>
parents:
1464
diff
changeset
|
201 clients_init(); |
1464
bd489d13479e
Added command_register() and related functions so we can dynamically
Timo Sirainen <tss@iki.fi>
parents:
1351
diff
changeset
|
202 commands_init(); |
1465
03dd87873a81
Added support for dynamically loadable imap/pop3 modules.
Timo Sirainen <tss@iki.fi>
parents:
1464
diff
changeset
|
203 |
5148
7f2c39d7a2cc
module_dir_load() doesn't call init() functions anymore. Added a new
Timo Sirainen <tss@iki.fi>
parents:
5133
diff
changeset
|
204 module_dir_init(modules); |
0 | 205 |
4197
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
206 if (getenv("DUMP_CAPABILITY") != NULL) { |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
207 printf("%s\n", str_c(capability_string)); |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
208 exit(0); |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
209 } |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
210 |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
211 str = getenv("IMAP_CAPABILITY"); |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
212 if (str != NULL && *str != '\0') { |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
213 /* Overrides all capabilities */ |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
214 str_truncate(capability_string, 0); |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
215 str_append(capability_string, str); |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
216 } |
c3ded5b815aa
If we have plugins set and imap_capability unset, figure out the IMAP
Timo Sirainen <tss@iki.fi>
parents:
4183
diff
changeset
|
217 |
1591
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1586
diff
changeset
|
218 str = getenv("IMAP_MAX_LINE_LENGTH"); |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1586
diff
changeset
|
219 imap_max_line_length = str != NULL ? |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1586
diff
changeset
|
220 (unsigned int)strtoul(str, NULL, 10) : |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1586
diff
changeset
|
221 DEFAULT_IMAP_MAX_LINE_LENGTH; |
6eca99b727a0
IMAP parser memory limits are now enforced by bytes per line rather than
Timo Sirainen <tss@iki.fi>
parents:
1586
diff
changeset
|
222 |
5980
57b70f64f997
Added imap_logout_format setting with default to bytes=%i/%o
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
223 logout_format = getenv("IMAP_LOGOUT_FORMAT"); |
57b70f64f997
Added imap_logout_format setting with default to bytes=%i/%o
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
224 if (logout_format == NULL) |
57b70f64f997
Added imap_logout_format setting with default to bytes=%i/%o
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
225 logout_format = "bytes=%i/%o"; |
57b70f64f997
Added imap_logout_format setting with default to bytes=%i/%o
Timo Sirainen <tss@iki.fi>
parents:
5500
diff
changeset
|
226 |
7917
ca2ff54ee9b4
Added support for IMAP ID extension.
Timo Sirainen <tss@iki.fi>
parents:
7796
diff
changeset
|
227 imap_id_send = getenv("IMAP_ID_SEND"); |
ca2ff54ee9b4
Added support for IMAP ID extension.
Timo Sirainen <tss@iki.fi>
parents:
7796
diff
changeset
|
228 imap_id_log = getenv("IMAP_ID_LOG"); |
ca2ff54ee9b4
Added support for IMAP ID extension.
Timo Sirainen <tss@iki.fi>
parents:
7796
diff
changeset
|
229 |
2316
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
230 parse_workarounds(); |
1c1ed4494aa4
Split client_workarounds to imap_ and pop3_ ones. Added outlook-no-nuls POP3
Timo Sirainen <tss@iki.fi>
parents:
2235
diff
changeset
|
231 |
8467
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8300
diff
changeset
|
232 user = mail_user_init(username); |
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8300
diff
changeset
|
233 mail_user_set_home(user, home); |
8085
bf83aa9c3f4a
Removed pool parameter from mail_namespaces_init*(). Use mail_user's pool intead.
Timo Sirainen <tss@iki.fi>
parents:
8082
diff
changeset
|
234 if (mail_namespaces_init(user) < 0) |
6540
12a779e08a73
If namespace initialization fails, die with a fatal error message instead of
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
235 i_fatal("Namespace initialization failed"); |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
236 client = client_create(0, 1, user); |
0 | 237 |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
238 output = client->output; |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
239 o_stream_ref(output); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
240 o_stream_cork(output); |
7928
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
241 |
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
242 /* IMAPLOGINTAG environment is compatible with mailfront */ |
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
243 tag = getenv("IMAPLOGINTAG"); |
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
244 if (tag == NULL) { |
620
d34ee528aa68
Send PREAUTH if we were started without LOGIN_TAG environment (ie. not
Timo Sirainen <tss@iki.fi>
parents:
597
diff
changeset
|
245 client_send_line(client, t_strconcat( |
4015
4aeb58dc4f18
PREAUTH banner should show the capability from capability_string in case
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
246 "* PREAUTH [CAPABILITY ", |
4aeb58dc4f18
PREAUTH banner should show the capability from capability_string in case
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
247 str_c(capability_string), "] " |
8082
db66611fd195
Added struct mail_user and fixed the code to support multiple users per process.
Timo Sirainen <tss@iki.fi>
parents:
8027
diff
changeset
|
248 "Logged in as ", user->username, NULL)); |
7928
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
249 } else { |
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
250 client_send_line(client, t_strconcat( |
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
251 tag, " OK [CAPABILITY ", |
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
252 str_c(capability_string), "] Logged in", NULL)); |
0 | 253 } |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
254 str = getenv("CLIENT_INPUT"); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
255 if (str != NULL) T_BEGIN { |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
256 buffer_t *buf = t_base64_decode_str(str); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
257 if (buf->used > 0) { |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
258 if (!i_stream_add_data(client->input, buf->data, |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
259 buf->used)) |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
260 i_panic("Couldn't add client input to stream"); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
261 (void)client_handle_input(client); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
262 } |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
263 } T_END; |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
264 o_stream_uncork(output); |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
265 o_stream_unref(&output); |
0 | 266 } |
267 | |
268 static void main_deinit(void) | |
269 { | |
4149
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
270 if (log_io != NULL) |
b10fa8ba01ca
When master dies (by closing log file descriptor), kill ourself also.
Timo Sirainen <tss@iki.fi>
parents:
4074
diff
changeset
|
271 io_remove(&log_io); |
4183
32b5045f8d80
Destroy client connection at deinit before unloading modules.
Timo Sirainen <tss@iki.fi>
parents:
4165
diff
changeset
|
272 clients_deinit(); |
1465
03dd87873a81
Added support for dynamically loadable imap/pop3 modules.
Timo Sirainen <tss@iki.fi>
parents:
1464
diff
changeset
|
273 |
4183
32b5045f8d80
Destroy client connection at deinit before unloading modules.
Timo Sirainen <tss@iki.fi>
parents:
4165
diff
changeset
|
274 module_dir_unload(&modules); |
1465
03dd87873a81
Added support for dynamically loadable imap/pop3 modules.
Timo Sirainen <tss@iki.fi>
parents:
1464
diff
changeset
|
275 commands_deinit(); |
8467
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8300
diff
changeset
|
276 mail_storage_deinit(); |
03c418eadc8b
mail_user_*() now handles home directory lookups when necessary.
Timo Sirainen <tss@iki.fi>
parents:
8300
diff
changeset
|
277 mail_users_deinit(); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
8085
diff
changeset
|
278 dict_drivers_unregister_builtin(); |
0 | 279 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3789
diff
changeset
|
280 str_free(&capability_string); |
1967 | 281 |
3620
3360cc019737
Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents:
3505
diff
changeset
|
282 lib_signals_deinit(); |
0 | 283 closelog(); |
284 } | |
285 | |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6353
diff
changeset
|
286 int main(int argc ATTR_UNUSED, char *argv[], char *envp[]) |
0 | 287 { |
727
8dd8ebe6bcac
We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
621
diff
changeset
|
288 #ifdef DEBUG |
7928
9e226056a208
Send login command OK reply in IMAP/POP3 process.
Timo Sirainen <tss@iki.fi>
parents:
7927
diff
changeset
|
289 if (!IS_STANDALONE() && getenv("GDB") == NULL) |
738
1b0205fc4153
DEBUG: We shouldn't verify the fds when running in pre-auth mode (breaks
Timo Sirainen <tss@iki.fi>
parents:
727
diff
changeset
|
290 fd_debug_verify_leaks(3, 1024); |
727
8dd8ebe6bcac
We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
621
diff
changeset
|
291 #endif |
2873
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
292 if (IS_STANDALONE() && getuid() == 0 && |
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
293 net_getpeername(1, NULL, NULL) == 0) { |
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
294 printf("* BAD [ALERT] imap binary must not be started from " |
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
295 "inetd, use imap-login instead.\n"); |
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
296 return 1; |
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
297 } |
72f28a4b964d
Make sure imap or pop3 processes cannot be started from inetd.
Timo Sirainen <tss@iki.fi>
parents:
2792
diff
changeset
|
298 |
0 | 299 /* NOTE: we start rooted, so keep the code minimal until |
300 restrict_access_by_env() is called */ | |
301 lib_init(); | |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
302 drop_privileges(); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
303 |
746
ad4292a30b1d
Set process title for rawlog process.
Timo Sirainen <tss@iki.fi>
parents:
738
diff
changeset
|
304 process_title_init(argv, envp); |
5249
784dc7224718
Removed pool parameter from io_loop_create()
Timo Sirainen <tss@iki.fi>
parents:
5186
diff
changeset
|
305 ioloop = io_loop_create(); |
0 | 306 |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
307 /* fake that we're running, so we know if client was destroyed |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
308 while initializing */ |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
309 io_loop_set_running(ioloop); |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
310 main_init(); |
7927
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
311 if (io_loop_is_running(ioloop)) |
2351a81ce699
If commands are pipelined after the login command, pass them to the
Timo Sirainen <tss@iki.fi>
parents:
7917
diff
changeset
|
312 io_loop_run(ioloop); |
0 | 313 main_deinit(); |
314 | |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3789
diff
changeset
|
315 io_loop_destroy(&ioloop); |
0 | 316 lib_deinit(); |
317 | |
318 return 0; | |
319 } |