Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/imap/main.c @ 1464:bd489d13479e HEAD
Added command_register() and related functions so we can dynamically
register new commands.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 14 May 2003 20:23:11 +0300 |
parents | 6709d9330885 |
children | 03dd87873a81 |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "common.h" | |
4 #include "ioloop.h" | |
5 #include "lib-signals.h" | |
550
3a83b05a0be3
--with-rawlog: Build support for logging traffic of user sessions. If
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
6 #include "rawlog.h" |
0 | 7 #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
|
8 #include "fd-close-on-exec.h" |
746
ad4292a30b1d
Set process title for rawlog process.
Timo Sirainen <tss@iki.fi>
parents:
738
diff
changeset
|
9 #include "process-title.h" |
1041 | 10 #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
|
11 #include "commands.h" |
0 | 12 |
13 #include <stdlib.h> | |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
14 #include <unistd.h> |
0 | 15 #include <syslog.h> |
16 | |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
17 #define IS_STANDALONE() \ |
1316 | 18 (getenv("LOGGED_IN") == NULL && 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
|
19 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
811
diff
changeset
|
20 struct ioloop *ioloop; |
1172 | 21 unsigned int max_custom_flag_length, mailbox_check_interval; |
1168
03f1455664d7
Added setting to limit length of custom flag names.
Timo Sirainen <tss@iki.fi>
parents:
1138
diff
changeset
|
22 |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
23 static char log_prefix[128]; /* syslog() needs this to be permanent */ |
0 | 24 |
25 static void sig_quit(int signo __attr_unused__) | |
26 { | |
27 io_loop_stop(ioloop); | |
28 } | |
29 | |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
30 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
|
31 { |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
32 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
|
33 |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
34 user = getenv("USER"); |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
35 if (user == NULL) { |
1194 | 36 if (IS_STANDALONE()) |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
37 user = getlogin(); |
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
38 if (user == NULL) |
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
39 user = "??"; |
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
40 } |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
41 if (strlen(user) >= sizeof(log_prefix)-6) { |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
42 /* quite a long user name, cut it */ |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
43 user = t_strndup(user, sizeof(log_prefix)-6-2); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
44 user = t_strconcat(user, "..", NULL); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
45 } |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
46 i_snprintf(log_prefix, sizeof(log_prefix), "imap(%s)", user); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
47 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1041
diff
changeset
|
48 if (getenv("USE_SYSLOG") != 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 i_set_failure_syslog(log_prefix, LOG_NDELAY, LOG_MAIL); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
50 else { |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
51 /* 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
|
52 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
|
53 } |
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
|
54 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1041
diff
changeset
|
55 if (getenv("INFOLOGFILE") != NULL) |
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1041
diff
changeset
|
56 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
|
57 |
1055
a72bba3f8a55
Rewrote setting handling. Changed some existing settings also since POP3
Timo Sirainen <tss@iki.fi>
parents:
1041
diff
changeset
|
58 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
|
59 } |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
60 |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
61 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
|
62 { |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
63 /* 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
|
64 open_logfile(); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
65 |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
66 restrict_access_by_env(!IS_STANDALONE()); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
67 } |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
68 |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
69 static void main_init(void) |
0 | 70 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
811
diff
changeset
|
71 struct client *client; |
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
811
diff
changeset
|
72 struct mail_storage *storage; |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
73 const char *user, *mail, *str; |
550
3a83b05a0be3
--with-rawlog: Build support for logging traffic of user sessions. If
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
74 int hin, hout; |
3a83b05a0be3
--with-rawlog: Build support for logging traffic of user sessions. If
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
75 |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
76 lib_init_signals(sig_quit); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
77 |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
78 user = getenv("USER"); |
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
79 if (user == NULL) { |
1194 | 80 if (IS_STANDALONE()) |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
81 user = getlogin(); |
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
82 if (user == NULL) |
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
83 i_fatal("USER environment missing"); |
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
84 } |
748
474319868e82
Sanity check to make sure USER environment exists.
Timo Sirainen <tss@iki.fi>
parents:
746
diff
changeset
|
85 |
550
3a83b05a0be3
--with-rawlog: Build support for logging traffic of user sessions. If
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
86 hin = 0; hout = 1; |
597
99c7e303c92a
Drop root privileges before handling rawlog opening.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
87 rawlog_open(&hin, &hout); |
99c7e303c92a
Drop root privileges before handling rawlog opening.
Timo Sirainen <tss@iki.fi>
parents:
596
diff
changeset
|
88 |
1138
340dea0150bf
Added client_workarounds setting, with currently one workaround for OE6.
Timo Sirainen <tss@iki.fi>
parents:
1087
diff
changeset
|
89 mail_storage_init(); |
0 | 90 mail_storage_register_all(); |
1464
bd489d13479e
Added command_register() and related functions so we can dynamically
Timo Sirainen <tss@iki.fi>
parents:
1351
diff
changeset
|
91 commands_init(); |
0 | 92 clients_init(); |
93 | |
94 mail = getenv("MAIL"); | |
95 if (mail == NULL) { | |
96 /* support also maildir-specific environment */ | |
97 mail = getenv("MAILDIR"); | |
98 if (mail != NULL) | |
99 mail = t_strconcat("maildir:", mail, NULL); | |
100 } | |
101 | |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
102 storage = mail_storage_create_with_data(mail, user); |
0 | 103 if (storage == NULL) { |
104 /* failed */ | |
105 if (mail != NULL && *mail != '\0') | |
106 i_fatal("Failed to create storage with data: %s", mail); | |
107 else { | |
108 const char *home; | |
109 | |
110 home = getenv("HOME"); | |
111 if (home == NULL) home = "not set"; | |
112 | |
113 i_fatal("MAIL environment missing and " | |
114 "autodetection failed (home %s)", home); | |
115 } | |
620
d34ee528aa68
Send PREAUTH if we were started without LOGIN_TAG environment (ie. not
Timo Sirainen <tss@iki.fi>
parents:
597
diff
changeset
|
116 } |
d34ee528aa68
Send PREAUTH if we were started without LOGIN_TAG environment (ie. not
Timo Sirainen <tss@iki.fi>
parents:
597
diff
changeset
|
117 |
1168
03f1455664d7
Added setting to limit length of custom flag names.
Timo Sirainen <tss@iki.fi>
parents:
1138
diff
changeset
|
118 str = getenv("MAIL_MAX_FLAG_LENGTH"); |
03f1455664d7
Added setting to limit length of custom flag names.
Timo Sirainen <tss@iki.fi>
parents:
1138
diff
changeset
|
119 max_custom_flag_length = str != NULL ? |
03f1455664d7
Added setting to limit length of custom flag names.
Timo Sirainen <tss@iki.fi>
parents:
1138
diff
changeset
|
120 (unsigned int)strtoul(str, NULL, 10) : |
03f1455664d7
Added setting to limit length of custom flag names.
Timo Sirainen <tss@iki.fi>
parents:
1138
diff
changeset
|
121 DEFAULT_MAX_CUSTOM_FLAG_LENGTH; |
03f1455664d7
Added setting to limit length of custom flag names.
Timo Sirainen <tss@iki.fi>
parents:
1138
diff
changeset
|
122 |
1172 | 123 str = getenv("MAILBOX_CHECK_INTERVAL"); |
124 mailbox_check_interval = str == NULL ? 0 : | |
125 (unsigned int)strtoul(str, NULL, 10); | |
126 | |
620
d34ee528aa68
Send PREAUTH if we were started without LOGIN_TAG environment (ie. not
Timo Sirainen <tss@iki.fi>
parents:
597
diff
changeset
|
127 client = client_create(hin, hout, storage); |
0 | 128 |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
129 if (IS_STANDALONE()) { |
620
d34ee528aa68
Send PREAUTH if we were started without LOGIN_TAG environment (ie. not
Timo Sirainen <tss@iki.fi>
parents:
597
diff
changeset
|
130 client_send_line(client, t_strconcat( |
621 | 131 "* PREAUTH [CAPABILITY "CAPABILITY_STRING"] " |
1193
206190c8c66f
Use getlogin() alternatively if USER environment isn't found.
Timo Sirainen <tss@iki.fi>
parents:
1172
diff
changeset
|
132 "Logged in as ", user, NULL)); |
1316 | 133 } else if (getenv("IMAPLOGINTAG") != NULL) { |
134 /* Support for mailfront */ | |
135 client_send_line(client, t_strconcat(getenv("IMAPLOGINTAG"), | |
136 " OK Logged in.", NULL)); | |
0 | 137 } |
138 } | |
139 | |
140 static void main_deinit(void) | |
141 { | |
142 /* warn about being killed because of some signal, except SIGINT (^C) | |
143 which is too common at least while testing :) */ | |
144 if (lib_signal_kill != 0 && lib_signal_kill != 2) | |
145 i_warning("Killed with signal %d", lib_signal_kill); | |
146 | |
147 clients_deinit(); | |
1464
bd489d13479e
Added command_register() and related functions so we can dynamically
Timo Sirainen <tss@iki.fi>
parents:
1351
diff
changeset
|
148 commands_deinit(); |
1351
6709d9330885
minor memory leak/cleanup fixes
Timo Sirainen <tss@iki.fi>
parents:
1316
diff
changeset
|
149 mail_storage_deinit(); |
0 | 150 |
151 closelog(); | |
152 } | |
153 | |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
154 int main(int argc __attr_unused__, char *argv[], char *envp[]) |
0 | 155 { |
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
|
156 #ifdef DEBUG |
1067 | 157 if (getenv("LOGGED_IN") != 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
|
158 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
|
159 #endif |
0 | 160 /* NOTE: we start rooted, so keep the code minimal until |
161 restrict_access_by_env() is called */ | |
162 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
|
163 drop_privileges(); |
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
164 |
746
ad4292a30b1d
Set process title for rawlog process.
Timo Sirainen <tss@iki.fi>
parents:
738
diff
changeset
|
165 process_title_init(argv, envp); |
389
60040a9d243f
ioloop_create() takes now pool-parameter. io_buffer_create_mmaped() takes
Timo Sirainen <tss@iki.fi>
parents:
35
diff
changeset
|
166 ioloop = io_loop_create(system_pool); |
0 | 167 |
801
86224ff16bf6
Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
168 main_init(); |
0 | 169 io_loop_run(ioloop); |
170 main_deinit(); | |
171 | |
172 io_loop_destroy(ioloop); | |
173 lib_deinit(); | |
174 | |
175 return 0; | |
176 } |