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
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: 6540
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"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
5a247fb1673c Minor speedup
Timo Sirainen <tss@iki.fi>
parents: 1465
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "lib-signals.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
47ecd950a702 some header file cleanups
Timo Sirainen <tss@iki.fi>
parents: 1035
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #include <syslog.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
f1e4c99cbb2b Added netscape-eoh workaround.
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
1643
ca1c2972b78f hook changes
Timo Sirainen <tss@iki.fi>
parents: 1641
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 io_loop_stop(ioloop);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
Timo Sirainen <tss@iki.fi>
parents: 1193
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 static void main_deinit(void)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1959
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 closelog();
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 /* NOTE: we start rooted, so keep the code minimal until
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 restrict_access_by_env() is called */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 main_deinit();
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 lib_deinit();
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 return 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 }