Mercurial > masqmail
annotate src/masqmail.c @ 421:f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
Moved the lockdir out of the spool dir. (When /var/lock is a ramdisk
we do well to have the lock files there.) Added the new configure option
--with-lockdir to change that location. Nontheless, if we run_as_user,
then lock files are always stored in the spool dir directly.
Instead of installing the lockdir and piddir at installation time, we
create them on startup time now if they are missing. This is necessary
if lockdir or piddir are a tmpfs.
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Wed, 30 May 2012 09:38:38 +0200 |
parents | d209b4846f2b |
children | a19e47ebbb33 |
rev | line source |
---|---|
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
1 /* |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
2 ** MasqMail |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
3 ** Copyright (C) 1999-2001 Oliver Kurth |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
4 ** Copyright (C) 2010 markus schnalke <meillo@marmaro.de> |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
5 ** |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
6 ** This program is free software; you can redistribute it and/or modify |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
7 ** it under the terms of the GNU General Public License as published by |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
8 ** the Free Software Foundation; either version 2 of the License, or |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
9 ** (at your option) any later version. |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
10 ** |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
11 ** This program is distributed in the hope that it will be useful, |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
12 ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
14 ** GNU General Public License for more details. |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
15 ** |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
16 ** You should have received a copy of the GNU General Public License |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
17 ** along with this program; if not, write to the Free Software |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
18 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
0 | 19 */ |
20 | |
21 #include <stdio.h> | |
22 #include <errno.h> | |
23 #include <stdlib.h> | |
24 #include <string.h> | |
25 #include <unistd.h> | |
26 #include <sys/types.h> | |
27 #include <sys/socket.h> | |
28 #include <sys/time.h> | |
29 #include <netinet/in.h> | |
30 #include <netdb.h> | |
31 #include <syslog.h> | |
32 #include <signal.h> | |
33 | |
34 #include <glib.h> | |
35 | |
36 #include "masqmail.h" | |
37 | |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
38 /* |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
39 ** mutually exclusive modes. Note that there is no 'queue daemon' mode. |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
40 ** It, as well as the distinction beween the two (non exclusive) daemon |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
41 ** (queue and listen) modes, is handled by flags. |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
42 */ |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
43 enum mta_mode { |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
44 MODE_NONE = 0, /* to check if a mode was set */ |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
45 MODE_ACCEPT, /* accept message on stdin (fallback mode) */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
46 MODE_DAEMON, /* run as daemon */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
47 MODE_RUNQUEUE, /* single queue run, online or offline */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
48 MODE_SMTP, /* accept SMTP on stdin */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
49 MODE_LIST, /* list queue */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
50 MODE_MCMD, /* do queue manipulation */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
51 MODE_VERSION, /* show version */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
52 MODE_BI, /* fake ;-) */ |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
53 }; |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
54 enum mta_mode mta_mode = MODE_NONE; |
0 | 55 |
56 char *pidfile = NULL; | |
57 volatile int sigterm_in_progress = 0; | |
58 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
59 static void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
60 sigterm_handler(int sig) |
0 | 61 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
62 if (sigterm_in_progress) |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
63 raise(sig); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
64 sigterm_in_progress = 1; |
0 | 65 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
66 if (pidfile) { |
331
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
67 uid_t uid = geteuid(); |
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
68 if (seteuid(0) != 0) { |
409 | 69 logwrite(LOG_ALERT, "sigterm_handler: could not set " |
70 "euid to %d: %s\n", | |
71 0, strerror(errno)); | |
331
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
72 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
73 if (unlink(pidfile) != 0) |
409 | 74 logwrite(LOG_WARNING, |
75 "could not delete pid file %s: %s\n", | |
76 pidfile, strerror(errno)); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
77 seteuid(uid); /* we exit anyway after this, just to be sure */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
78 } |
0 | 79 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
80 signal(sig, SIG_DFL); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
81 raise(sig); |
0 | 82 } |
83 | |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
84 /* |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
85 ** argv: the original argv |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
86 ** argp: number of arg (may get modified!) |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
87 ** cp: pointing to the char after the option |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
88 ** e.g. `-d 6' `-d6' |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
89 ** ^ ^ |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
90 */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
91 gchar* |
366
41958685480d
Switched to `type *name' style
markus schnalke <meillo@marmaro.de>
parents:
349
diff
changeset
|
92 get_optarg(char *argv[], gint *argp, char *cp) |
0 | 93 { |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
94 if (*cp) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
95 /* this kind: -xval */ |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
96 return cp; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
97 } |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
98 cp = argv[*argp+1]; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
99 if (cp && (*cp != '-')) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
100 /* this kind: -x val */ |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
101 (*argp)++; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
102 return cp; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
103 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
104 return NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
105 } |
0 | 106 |
421
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
107 /* |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
108 ** Create any missing directory in pathname `dir'. (Like `mkdir -p'.) |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
109 ** The code is taken from nmh. |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
110 */ |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
111 gboolean |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
112 makedir_rec(char *dir, int perms) |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
113 { |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
114 char path[PATH_MAX]; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
115 char *cp, *c; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
116 int had_an_error = 0; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
117 |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
118 c = strncpy(path, dir, sizeof(path)); |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
119 |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
120 while (!had_an_error && (c = strchr(c+1, '/'))) { |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
121 *c = '\0'; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
122 /* Create an outer directory. */ |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
123 if (mkdir(path, perms) == -1 && errno != EEXIST) { |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
124 fprintf(stderr, "unable to create `%s': %s\n", |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
125 path, strerror(errno)); |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
126 had_an_error = 1; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
127 } |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
128 *c = '/'; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
129 } |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
130 |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
131 /* |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
132 ** Create the innermost nested subdirectory of the |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
133 ** path we're being asked to create. |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
134 */ |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
135 if (!had_an_error && mkdir(dir, perms)==-1 && errno != EEXIST) { |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
136 fprintf(stderr, "unable to create `%s': %s\n", |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
137 dir, strerror(errno)); |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
138 had_an_error = 1; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
139 } |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
140 |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
141 return (had_an_error) ? 0 : 1; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
142 } |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
143 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
144 gboolean |
366
41958685480d
Switched to `type *name' style
markus schnalke <meillo@marmaro.de>
parents:
349
diff
changeset
|
145 write_pidfile(gchar *name) |
0 | 146 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
147 FILE *fptr; |
0 | 148 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
149 if ((fptr = fopen(name, "wt"))) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
150 fprintf(fptr, "%d\n", getpid()); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
151 fclose(fptr); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
152 pidfile = strdup(name); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
153 return TRUE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
154 } |
409 | 155 logwrite(LOG_WARNING, "could not write pid file: %s\n", |
156 strerror(errno)); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
157 return FALSE; |
0 | 158 } |
159 | |
264
1e5e457dea18
comments and a small refactoring
markus schnalke <meillo@marmaro.de>
parents:
263
diff
changeset
|
160 /* on -bd or if -q has an argument */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
161 static void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
162 mode_daemon(gboolean do_listen, gint queue_interval, char *argv[]) |
0 | 163 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
164 guint pid; |
0 | 165 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
166 /* daemon */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
167 if (!conf.run_as_user) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
168 if ((conf.orig_uid != 0) && (conf.orig_uid != conf.mail_uid)) { |
409 | 169 fprintf(stderr, "must be root or %s for daemon.\n", |
170 DEF_MAIL_USER); | |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
171 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
172 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
173 } |
0 | 174 |
74
0a5b2e96ade3
do not reparent the daemon to init if init is already the parent
meillo@marmaro.de
parents:
73
diff
changeset
|
175 /* reparent to init only if init is not already the parent */ |
0a5b2e96ade3
do not reparent the daemon to init if init is already the parent
meillo@marmaro.de
parents:
73
diff
changeset
|
176 if (getppid() != 1) { |
0a5b2e96ade3
do not reparent the daemon to init if init is already the parent
meillo@marmaro.de
parents:
73
diff
changeset
|
177 if ((pid = fork()) > 0) { |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
178 exit(0); |
74
0a5b2e96ade3
do not reparent the daemon to init if init is already the parent
meillo@marmaro.de
parents:
73
diff
changeset
|
179 } else if (pid < 0) { |
208
3708b655a371
added newlines to the end of log and debug messages where missing
meillo@marmaro.de
parents:
205
diff
changeset
|
180 logwrite(LOG_ALERT, "could not fork!\n"); |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
181 exit(1); |
74
0a5b2e96ade3
do not reparent the daemon to init if init is already the parent
meillo@marmaro.de
parents:
73
diff
changeset
|
182 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
183 } |
0 | 184 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
185 signal(SIGTERM, sigterm_handler); |
421
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
186 makedir_rec(PID_DIR, 0755); |
419
d209b4846f2b
The pid files goes to /var/run/masqmail.pid now. Added --with-piddir.
markus schnalke <meillo@marmaro.de>
parents:
415
diff
changeset
|
187 write_pidfile(PID_DIR "/masqmail.pid"); |
0 | 188 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
189 conf.do_verbose = FALSE; |
0 | 190 |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
191 /* |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
192 ** closing and reopening the log ensures that it is open afterwards |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
193 ** because it is possible that the log is assigned to fd 1 and gets |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
194 ** thus closes by fclose(stdout). Similar for the debugfile. |
72
ad034b57f3b2
fixed Debian bug 536060 (log files are closed after SIGHUP receival)
meillo@marmaro.de
parents:
46
diff
changeset
|
195 */ |
ad034b57f3b2
fixed Debian bug 536060 (log files are closed after SIGHUP receival)
meillo@marmaro.de
parents:
46
diff
changeset
|
196 logclose(); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
197 fclose(stdin); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
198 fclose(stdout); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
199 fclose(stderr); |
72
ad034b57f3b2
fixed Debian bug 536060 (log files are closed after SIGHUP receival)
meillo@marmaro.de
parents:
46
diff
changeset
|
200 logopen(); |
0 | 201 |
208
3708b655a371
added newlines to the end of log and debug messages where missing
meillo@marmaro.de
parents:
205
diff
changeset
|
202 logwrite(LOG_NOTICE, "%s %s daemon starting\n", PACKAGE, VERSION); |
409 | 203 listen_port(do_listen ? conf.listen_addresses : NULL, |
204 queue_interval, argv); | |
0 | 205 } |
206 | |
264
1e5e457dea18
comments and a small refactoring
markus schnalke <meillo@marmaro.de>
parents:
263
diff
changeset
|
207 /* -bs or called as smtpd or in.smtpd */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
208 static void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
209 mode_smtp() |
0 | 210 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
211 /* accept smtp message on stdin */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
212 /* write responses to stderr. */ |
0 | 213 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
214 struct sockaddr_in saddr; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
215 gchar *peername = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
216 int dummy = sizeof(saddr); |
0 | 217 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
218 conf.do_verbose = FALSE; |
0 | 219 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
220 if (!conf.run_as_user) { |
331
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
221 set_euidgid(conf.orig_uid, conf.orig_gid, NULL, NULL); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
222 } |
0 | 223 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
224 DEBUG(5) debugf("accepting smtp message on stdin\n"); |
0 | 225 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
226 if (getpeername(0, (struct sockaddr *) (&saddr), &dummy) == 0) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
227 peername = g_strdup(inet_ntoa(saddr.sin_addr)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
228 } else if (errno != ENOTSOCK) |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
229 exit(1); |
0 | 230 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
231 smtp_in(stdin, stderr, peername, NULL); |
0 | 232 } |
233 | |
264
1e5e457dea18
comments and a small refactoring
markus schnalke <meillo@marmaro.de>
parents:
263
diff
changeset
|
234 /* default mode if address args or -t is specified, or called as rmail */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
235 static void |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
236 mode_accept(address *return_path, gchar *full_sender_name, guint accept_flags, |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
237 char **addresses, int addr_cnt) |
0 | 238 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
239 /* accept message on stdin */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
240 accept_error err; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
241 message *msg = create_message(); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
242 gint i; |
266
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
243 pid_t pid; |
0 | 244 |
83
085d6cd44462
using is_privileged_user() to check here too
meillo@marmaro.de
parents:
76
diff
changeset
|
245 if (return_path && !is_privileged_user(conf.orig_uid)) { |
409 | 246 fprintf(stderr, "must be root, %s or in group %s for " |
247 "setting return path.\n", | |
248 DEF_MAIL_USER, DEF_MAIL_GROUP); | |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
249 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
250 } |
0 | 251 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
252 if (!conf.run_as_user) { |
331
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
253 set_euidgid(conf.orig_uid, conf.orig_gid, NULL, NULL); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
254 } |
0 | 255 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
256 DEBUG(5) debugf("accepting message on stdin\n"); |
0 | 257 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
258 msg->received_prot = PROT_LOCAL; |
276
1abc1faeb45d
for -t cmdline args are now added to the rcpt list instead of substracted
markus schnalke <meillo@marmaro.de>
parents:
268
diff
changeset
|
259 |
1abc1faeb45d
for -t cmdline args are now added to the rcpt list instead of substracted
markus schnalke <meillo@marmaro.de>
parents:
268
diff
changeset
|
260 /* warn if -t option and cmdline addr args */ |
1abc1faeb45d
for -t cmdline args are now added to the rcpt list instead of substracted
markus schnalke <meillo@marmaro.de>
parents:
268
diff
changeset
|
261 if (addr_cnt && (accept_flags & ACC_RCPT_FROM_HEAD)) { |
409 | 262 logwrite(LOG_ALERT, "command line address arguments are " |
263 "now *added* to the mail header\\\n"); | |
264 logwrite(LOG_ALERT, " recipient addresses (instead of " | |
265 "substracted) when -t is given.\\\n"); | |
276
1abc1faeb45d
for -t cmdline args are now added to the rcpt list instead of substracted
markus schnalke <meillo@marmaro.de>
parents:
268
diff
changeset
|
266 logwrite(LOG_ALERT, " this changed with version 0.3.1\n"); |
1abc1faeb45d
for -t cmdline args are now added to the rcpt list instead of substracted
markus schnalke <meillo@marmaro.de>
parents:
268
diff
changeset
|
267 } |
1abc1faeb45d
for -t cmdline args are now added to the rcpt list instead of substracted
markus schnalke <meillo@marmaro.de>
parents:
268
diff
changeset
|
268 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
269 for (i = 0; i < addr_cnt; i++) { |
266
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
270 if (addresses[i][0] == '|') { |
409 | 271 logwrite(LOG_ALERT, "no pipe allowed as recipient " |
272 "address: %s\n", addresses[i]); | |
276
1abc1faeb45d
for -t cmdline args are now added to the rcpt list instead of substracted
markus schnalke <meillo@marmaro.de>
parents:
268
diff
changeset
|
273 /* should we better ignore this one addr? */ |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
274 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
275 } |
409 | 276 msg->rcpt_list = g_list_append(msg->rcpt_list, |
277 create_address_qualified(addresses[i], | |
278 TRUE, conf.host_name)); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
279 } |
0 | 280 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
281 /* -f option */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
282 msg->return_path = return_path; |
0 | 283 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
284 /* -F option */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
285 msg->full_sender_name = full_sender_name; |
0 | 286 |
266
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
287 err = accept_message(stdin, msg, accept_flags); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
288 |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
289 switch (err) { |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
290 case AERR_OK: |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
291 /* to continue; all other cases exit */ |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
292 break; |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
293 case AERR_EOF: |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
294 fprintf(stderr, "unexpected EOF.\n"); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
295 exit(1); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
296 case AERR_NORCPT: |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
297 fprintf(stderr, "no recipients.\n"); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
298 exit(1); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
299 case AERR_SIZE: |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
300 fprintf(stderr, "max message size exceeded.\n"); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
301 exit(1); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
302 default: |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
303 /* should never happen: */ |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
304 fprintf(stderr, "Unknown error (%d)\r\n", err); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
305 exit(1); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
306 } |
0 | 307 |
266
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
308 if (!spool_write(msg, TRUE)) { |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
309 fprintf(stderr, "Could not write spool file\n"); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
310 exit(1); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
311 } |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
312 |
267
8be687c06c20
comments (should we really exit failure in this case?)
markus schnalke <meillo@marmaro.de>
parents:
266
diff
changeset
|
313 /* here the mail is queued and thus in our responsibility */ |
409 | 314 logwrite(LOG_NOTICE, "%s <= %s with %s\n", msg->uid, |
315 addr_string(msg->return_path), prot_names[PROT_LOCAL]); | |
266
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
316 |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
317 if (conf.do_queue) { |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
318 /* we're finished as we only need to queue it */ |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
319 return; |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
320 } |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
321 |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
322 /* deliver at once */ |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
323 if ((pid = fork()) < 0) { |
409 | 324 logwrite(LOG_ALERT, "could not fork for delivery, id = %s\n", |
325 msg->uid); | |
266
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
326 } else if (pid == 0) { |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
327 conf.do_verbose = FALSE; |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
328 fclose(stdin); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
329 fclose(stdout); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
330 fclose(stderr); |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
331 if (deliver(msg)) { |
ab39047ffe44
refactored mode_accept()
markus schnalke <meillo@marmaro.de>
parents:
264
diff
changeset
|
332 exit(0); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
333 } else { |
267
8be687c06c20
comments (should we really exit failure in this case?)
markus schnalke <meillo@marmaro.de>
parents:
266
diff
changeset
|
334 /* |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
335 ** TODO: Should we really fail here? Because the |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
336 ** mail is queued already. If we fail the client |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
337 ** might submit it again. If at-once-delivery |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
338 ** is seen as an additional best-effort service, |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
339 ** then we should still exit successful here. |
267
8be687c06c20
comments (should we really exit failure in this case?)
markus schnalke <meillo@marmaro.de>
parents:
266
diff
changeset
|
340 */ |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
341 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
342 } |
0 | 343 } |
344 } | |
345 | |
250
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
346 /* |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
347 ** if -Mrm is given |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
348 ** |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
349 ** currently only the `rm' command is supported |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
350 ** until this changes, we don't need any facility for further commands |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
351 ** return success if at least one message had been deleted |
250
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
352 */ |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
353 static int |
366
41958685480d
Switched to `type *name' style
markus schnalke <meillo@marmaro.de>
parents:
349
diff
changeset
|
354 manipulate_queue(char *cmd, char *id[]) |
250
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
355 { |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
356 gboolean ok = FALSE; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
357 |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
358 if (strcmp(cmd, "rm") != 0) { |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
359 fprintf(stderr, "unknown command %s\n", cmd); |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
360 return FALSE; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
361 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
362 |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
363 set_euidgid(conf.mail_uid, conf.mail_gid, NULL, NULL); |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
364 |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
365 /* privileged users may delete any mail */ |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
366 if (is_privileged_user(conf.orig_uid)) { |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
367 for (; *id; id++) { |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
368 fprintf(stderr, "id: %s\n", *id); |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
369 if (queue_delete(*id)) { |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
370 ok = TRUE; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
371 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
372 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
373 return ok; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
374 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
375 |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
376 struct passwd *pw = getpwuid(conf.orig_uid); |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
377 if (!pw) { |
409 | 378 fprintf(stderr, "could not find a passwd entry for " |
379 "uid %d: %s\n", | |
380 conf.orig_uid, strerror(errno)); | |
250
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
381 return FALSE; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
382 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
383 |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
384 /* non-privileged users may only delete their own messages */ |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
385 for (; *id; id++) { |
349
b45dc53f2829
Removed unused second arg of msg_spool_read()
markus schnalke <meillo@marmaro.de>
parents:
331
diff
changeset
|
386 message *msg = msg_spool_read(*id); |
250
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
387 |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
388 fprintf(stderr, "id: %s\n", *id); |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
389 |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
390 if (!msg->ident) { |
409 | 391 fprintf(stderr, "message %s does not have an ident\n", |
392 *id); | |
250
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
393 continue; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
394 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
395 if (strcmp(pw->pw_name, msg->ident) != 0) { |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
396 fprintf(stderr, "you do not own message id %s\n", *id); |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
397 continue; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
398 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
399 |
378
5781ba87df95
Removed ident. This had been discussed on the mailing list in Oct 2011.
markus schnalke <meillo@marmaro.de>
parents:
367
diff
changeset
|
400 if (msg->received_host || (msg->received_prot != PROT_LOCAL)) { |
409 | 401 fprintf(stderr, "message %s was not received " |
402 "locally\n", *id); | |
250
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
403 continue; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
404 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
405 |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
406 ok = queue_delete(*id); |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
407 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
408 return ok; |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
409 } |
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
410 |
264
1e5e457dea18
comments and a small refactoring
markus schnalke <meillo@marmaro.de>
parents:
263
diff
changeset
|
411 /* -qo, -q (without argument), or called as runq */ |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
412 static int |
366
41958685480d
Switched to `type *name' style
markus schnalke <meillo@marmaro.de>
parents:
349
diff
changeset
|
413 run_queue(gboolean do_runq, gboolean do_runq_online, char *route_name) |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
414 { |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
415 int ret; |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
416 |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
417 /* queue runs */ |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
418 set_identity(conf.orig_uid, "queue run"); |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
419 |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
420 if (do_runq) { |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
421 ret = queue_run(); |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
422 } |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
423 |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
424 if (do_runq_online) { |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
425 if (route_name) { |
409 | 426 conf.online_query = g_strdup_printf("/bin/echo %s", |
427 route_name); | |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
428 } |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
429 /* |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
430 ** TODO: change behavior of `-qo without argument'? |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
431 ** Because that behavior is included in -q. |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
432 */ |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
433 ret = queue_run_online(); |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
434 } |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
435 return ret; |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
436 } |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
437 |
264
1e5e457dea18
comments and a small refactoring
markus schnalke <meillo@marmaro.de>
parents:
263
diff
changeset
|
438 /* -bV or default mode if neither addr arg nor -t */ |
261
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
439 static void |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
440 mode_version(void) |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
441 { |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
442 gchar *with_resolver = ""; |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
443 gchar *with_auth = ""; |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
444 |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
445 #ifdef ENABLE_RESOLVER |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
446 with_resolver = " +resolver"; |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
447 #endif |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
448 #ifdef ENABLE_AUTH |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
449 with_auth = " +auth"; |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
450 #endif |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
451 |
378
5781ba87df95
Removed ident. This had been discussed on the mailing list in Oct 2011.
markus schnalke <meillo@marmaro.de>
parents:
367
diff
changeset
|
452 printf("%s %s%s%s\n", PACKAGE, VERSION, with_resolver, with_auth); |
261
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
453 } |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
454 |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
455 void |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
456 set_mode(enum mta_mode mode) |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
457 { |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
458 if (mta_mode && mta_mode!=mode) { |
409 | 459 fprintf(stderr, "operation mode was already specified " |
460 "(%d vs. %d)\n", mta_mode, mode); | |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
461 exit(1); |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
462 } |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
463 |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
464 mta_mode = mode; |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
465 return; |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
466 } |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
467 |
0 | 468 int |
469 main(int argc, char *argv[]) | |
470 { | |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
471 gchar *progname; |
366
41958685480d
Switched to `type *name' style
markus schnalke <meillo@marmaro.de>
parents:
349
diff
changeset
|
472 char *opt; |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
473 gint arg; |
0 | 474 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
475 gboolean do_listen = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
476 gboolean do_runq = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
477 gboolean do_runq_online = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
478 gboolean do_queue = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
479 gint queue_interval = 0; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
480 gchar *M_cmd = NULL; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
481 gboolean opt_t = FALSE; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
482 gboolean opt_i = FALSE; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
483 gchar *conf_file = CONF_FILE; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
484 gchar *route_name = NULL; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
485 gchar *f_address = NULL; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
486 address *return_path = NULL; /* may be changed by -f option */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
487 gchar *full_sender_name = NULL; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
488 gboolean do_verbose = FALSE; |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
489 gint debug_level = -1; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
490 |
260
bd3109ec0f0a
substituted get_progname() with a call to strrchr()
markus schnalke <meillo@marmaro.de>
parents:
259
diff
changeset
|
491 /* strip the path part */ |
261
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
492 progname = strrchr(argv[0], '/'); |
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
493 progname = (progname) ? progname+1 : argv[0]; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
494 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
495 if (strcmp(progname, "mailq") == 0) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
496 mta_mode = MODE_LIST; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
497 } else if (strcmp(progname, "mailrm") == 0) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
498 mta_mode = MODE_MCMD; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
499 M_cmd = "rm"; |
284
4869321aa7bf
recognize the program name `newaliases' too
markus schnalke <meillo@marmaro.de>
parents:
282
diff
changeset
|
500 } else if (strcmp(progname, "newaliases") == 0) { |
4869321aa7bf
recognize the program name `newaliases' too
markus schnalke <meillo@marmaro.de>
parents:
282
diff
changeset
|
501 mta_mode = MODE_BI; |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
502 } else if (strcmp(progname, "rmail") == 0) { |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
503 /* |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
504 ** the `rmail' alias should probably be removed now |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
505 ** that we have the rmail script. But let's keep it |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
506 ** for some while for compatibility. 2010-06-19 |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
507 */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
508 mta_mode = MODE_ACCEPT; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
509 opt_i = TRUE; |
284
4869321aa7bf
recognize the program name `newaliases' too
markus schnalke <meillo@marmaro.de>
parents:
282
diff
changeset
|
510 } else if (strcmp(progname, "runq") == 0) { |
4869321aa7bf
recognize the program name `newaliases' too
markus schnalke <meillo@marmaro.de>
parents:
282
diff
changeset
|
511 mta_mode = MODE_RUNQUEUE; |
4869321aa7bf
recognize the program name `newaliases' too
markus schnalke <meillo@marmaro.de>
parents:
282
diff
changeset
|
512 do_runq = TRUE; |
4869321aa7bf
recognize the program name `newaliases' too
markus schnalke <meillo@marmaro.de>
parents:
282
diff
changeset
|
513 } else if (strcmp(progname, "smtpd") == 0 |
4869321aa7bf
recognize the program name `newaliases' too
markus schnalke <meillo@marmaro.de>
parents:
282
diff
changeset
|
514 || strcmp(progname, "in.smtpd") == 0) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
515 mta_mode = MODE_SMTP; |
0 | 516 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
517 |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
518 /* parse cmd line */ |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
519 for (arg=1; arg<argc && argv[arg][0]=='-'; arg++) { |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
520 opt = argv[arg] + 1; /* points to the char after the dash */ |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
521 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
522 if (strcmp(opt, "-") == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
523 /* everything after `--' are address arguments */ |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
524 arg++; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
525 break; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
526 |
278
c35c59a36a2a
added -bm for mode accept (the other MTAs have it too)
markus schnalke <meillo@marmaro.de>
parents:
276
diff
changeset
|
527 } else if (strcmp(opt, "bm") == 0) { |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
528 set_mode(MODE_ACCEPT); |
278
c35c59a36a2a
added -bm for mode accept (the other MTAs have it too)
markus schnalke <meillo@marmaro.de>
parents:
276
diff
changeset
|
529 |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
530 } else if (strcmp(opt, "bd") == 0) { |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
531 set_mode(MODE_DAEMON); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
532 do_listen = TRUE; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
533 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
534 } else if (strcmp(opt, "bi") == 0) { |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
535 set_mode(MODE_BI); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
536 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
537 } else if (strcmp(opt, "bs") == 0) { |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
538 set_mode(MODE_SMTP); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
539 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
540 } else if (strcmp(opt, "bp") == 0) { |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
541 set_mode(MODE_LIST); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
542 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
543 } else if (strcmp(opt, "bV") == 0) { |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
544 set_mode(MODE_VERSION); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
545 |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
546 } else if (strncmp(opt, "B", 1) == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
547 /* we ignore this and throw the argument away */ |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
548 get_optarg(argv, &arg, opt+1); |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
549 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
550 } else if (strncmp(opt, "C", 1) == 0) { |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
551 conf_file = get_optarg(argv, &arg, opt+1); |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
552 if (!conf_file) { |
409 | 553 fprintf(stderr, "-C requires filename arg.\n"); |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
554 exit(1); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
555 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
556 |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
557 } else if (strncmp(opt, "d", 1) == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
558 if (getuid() != 0) { |
409 | 559 fprintf(stderr, "only root may set the " |
560 "debug level.\n"); | |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
561 exit(1); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
562 } |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
563 char *lvl = get_optarg(argv, &arg, opt+1); |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
564 if (!lvl) { |
409 | 565 fprintf(stderr, "-d requires number arg.\n"); |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
566 exit(1); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
567 } |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
568 debug_level = atoi(lvl); |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
569 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
570 } else if (strncmp(opt, "f", 1) == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
571 /* set return path */ |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
572 gchar *address = get_optarg(argv, &arg, opt+1); |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
573 if (!address) { |
409 | 574 fprintf(stderr, "-f requires address arg.\n"); |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
575 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
576 } |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
577 f_address = g_strdup(address); |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
578 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
579 } else if (strncmp(opt, "F", 1) == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
580 full_sender_name = get_optarg(argv, &arg, opt+1); |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
581 if (!full_sender_name) { |
409 | 582 fprintf(stderr, "-F requires name arg.\n"); |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
583 exit(1); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
584 } |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
585 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
586 } else if (strcmp(opt, "i") == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
587 opt_i = TRUE; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
588 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
589 } else if (strcmp(opt, "m") == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
590 /* ignore -m (me too) switch (see man page) */ |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
591 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
592 } else if (strcmp(opt, "Mrm") == 0) { |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
593 set_mode(MODE_MCMD); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
594 M_cmd = "rm"; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
595 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
596 } else if (strcmp(opt, "odq") == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
597 do_queue = TRUE; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
598 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
599 } else if (strcmp(opt, "oi") == 0) { |
257
8cca5305e4f0
fixed -oi to really be the same as -i
markus schnalke <meillo@marmaro.de>
parents:
254
diff
changeset
|
600 opt_i = TRUE; |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
601 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
602 } else if (strncmp(opt, "o", 1) == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
603 /* ignore all other -oXXX options */ |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
604 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
605 } else if (strncmp(opt, "qo", 2) == 0) { |
278
c35c59a36a2a
added -bm for mode accept (the other MTAs have it too)
markus schnalke <meillo@marmaro.de>
parents:
276
diff
changeset
|
606 /* must be before the `q' check */ |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
607 set_mode(MODE_RUNQUEUE); |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
608 do_runq_online = TRUE; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
609 /* can be NULL, then we use online detection method */ |
290
792e0201c1b3
mark -qo (without argument) obsolete
markus schnalke <meillo@marmaro.de>
parents:
288
diff
changeset
|
610 /* TODO: behavior might change if it is NULL */ |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
611 route_name = get_optarg(argv, &arg, opt+2); |
290
792e0201c1b3
mark -qo (without argument) obsolete
markus schnalke <meillo@marmaro.de>
parents:
288
diff
changeset
|
612 if (!route_name) { |
409 | 613 fprintf(stderr, "Please do not use -qo " |
614 "without argument anymore; " | |
615 "use -q instead.\n"); | |
616 fprintf(stderr, "The behavior for -qo without " | |
617 "argument is likely to " | |
618 "change.\n"); | |
290
792e0201c1b3
mark -qo (without argument) obsolete
markus schnalke <meillo@marmaro.de>
parents:
288
diff
changeset
|
619 } |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
620 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
621 } else if (strncmp(opt, "q", 1) == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
622 /* must be after the `qo' check */ |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
623 gchar *optarg; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
624 |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
625 optarg = get_optarg(argv, &arg, opt+1); |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
626 if (optarg) { |
409 | 627 /* do regular queue runs */ |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
628 set_mode(MODE_DAEMON); |
254
82d168dd52fd
removed the obsolete pos argument from time_interval()
markus schnalke <meillo@marmaro.de>
parents:
251
diff
changeset
|
629 queue_interval = time_interval(optarg); |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
630 } else { |
409 | 631 /* do a single queue run */ |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
632 set_mode(MODE_RUNQUEUE); |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
633 do_runq = TRUE; |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
634 } |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
635 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
636 } else if (strcmp(opt, "t") == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
637 opt_t = TRUE; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
638 |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
639 } else if (strcmp(opt, "v") == 0) { |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
640 do_verbose = TRUE; |
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
641 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
642 } else { |
249
f9da5a7caeda
refactored the cmdline argument processing
markus schnalke <meillo@marmaro.de>
parents:
248
diff
changeset
|
643 fprintf(stderr, "unrecognized option `-%s'\n", opt); |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
644 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
645 } |
0 | 646 } |
647 | |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
648 if (!mta_mode && arg==argc && !opt_t) { |
278
c35c59a36a2a
added -bm for mode accept (the other MTAs have it too)
markus schnalke <meillo@marmaro.de>
parents:
276
diff
changeset
|
649 /* |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
650 ** In this case no rcpts can be found, thus no mail |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
651 ** can be sent, thus masqmail will always fail. We |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
652 ** rather do something better instead. This covers |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
653 ** also the case of calling masqmail without args. |
278
c35c59a36a2a
added -bm for mode accept (the other MTAs have it too)
markus schnalke <meillo@marmaro.de>
parents:
276
diff
changeset
|
654 */ |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
655 mode_version(); |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
656 exit(0); |
259
f4117fd5a163
made default mode sensible
markus schnalke <meillo@marmaro.de>
parents:
258
diff
changeset
|
657 } |
f4117fd5a163
made default mode sensible
markus schnalke <meillo@marmaro.de>
parents:
258
diff
changeset
|
658 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
659 if (mta_mode == MODE_VERSION) { |
261
0afe18a9ee03
fixed previous commit and excluded mode_version() from main()
markus schnalke <meillo@marmaro.de>
parents:
260
diff
changeset
|
660 mode_version(); |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
661 exit(0); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
662 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
663 |
281
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
664 if (!mta_mode) { |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
665 mta_mode = MODE_ACCEPT; |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
666 } |
ea5f86e0a81c
modes are now enforced exclusive
markus schnalke <meillo@marmaro.de>
parents:
278
diff
changeset
|
667 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
668 /* initialize random generator */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
669 srand(time(NULL)); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
670 /* ignore SIGPIPE signal */ |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
671 signal(SIGPIPE, SIG_IGN); |
0 | 672 |
73 | 673 /* close all possibly open file descriptors, except std{in,out,err} */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
674 { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
675 int i, max_fd = sysconf(_SC_OPEN_MAX); |
0 | 676 |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
677 if (max_fd <= 0) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
678 max_fd = 64; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
679 } |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
680 for (i=3; i<max_fd; i++) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
681 close(i); |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
682 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
683 } |
0 | 684 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
685 init_conf(); |
0 | 686 |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
687 /* |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
688 ** if we are not privileged, and the config file was changed we |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
689 ** implicetely set the the run_as_user flag and give up all |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
690 ** privileges. |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
691 ** |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
692 ** So it is possible for a user to run his own daemon without |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
693 ** breaking security. |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
694 */ |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
695 if ((strcmp(conf_file, CONF_FILE) != 0) && (conf.orig_uid != 0)) { |
421
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
696 logwrite(LOG_NOTICE, "Changing to run_as_user.\n"); |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
697 conf.run_as_user = TRUE; |
331
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
698 set_euidgid(conf.orig_uid, conf.orig_gid, NULL, NULL); |
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
699 if (setgid(conf.orig_gid)) { |
409 | 700 logwrite(LOG_ALERT, "could not set gid to %d: %s\n", |
701 conf.orig_gid, strerror(errno)); | |
331
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
702 exit(1); |
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
703 } |
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
704 if (setuid(conf.orig_uid)) { |
409 | 705 logwrite(LOG_ALERT, "could not set uid to %d: %s\n", |
706 conf.orig_uid, strerror(errno)); | |
331
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
707 exit(1); |
e507c854a63e
Security fix! Correct handling of seteuid() return value
markus schnalke <meillo@marmaro.de>
parents:
310
diff
changeset
|
708 } |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
709 } |
0 | 710 |
155 | 711 conf.log_dir = LOG_DIR; |
397
cdd16614c1f5
Fixed debugging output during read_conf().
markus schnalke <meillo@marmaro.de>
parents:
378
diff
changeset
|
712 conf.debug_level = debug_level; /* for debuggin during read_conf() */ |
288
84ea0b1fc8f8
FIXME comment: where to log while reading the config file?
markus schnalke <meillo@marmaro.de>
parents:
284
diff
changeset
|
713 /* FIXME: fails if we run as user */ |
155 | 714 logopen(); |
715 if (!read_conf(conf_file)) { | |
409 | 716 logwrite(LOG_ALERT, "SHUTTING DOWN due to problems reading " |
717 "config\n"); | |
155 | 718 exit(5); |
719 } | |
720 logclose(); | |
0 | 721 |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
722 if (do_queue) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
723 conf.do_queue = TRUE; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
724 } |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
725 if (do_verbose) { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
726 conf.do_verbose = TRUE; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
727 } |
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
728 if (debug_level >= 0) { /* if >= 0, it was given by argument */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
729 conf.debug_level = debug_level; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
730 } |
0 | 731 |
367
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
732 /* |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
733 ** It appears that changing to / ensures that we are never in |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
734 ** a directory which we cannot access. This situation could be |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
735 ** possible after changing identity. |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
736 ** Maybe we should only change to / if we not run as user, to |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
737 ** allow relative paths for log files in test setups for |
b27f66555ba8
Reformated multiline comments to have leading asterisks on each line
markus schnalke <meillo@marmaro.de>
parents:
366
diff
changeset
|
738 ** instance. |
46 | 739 */ |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
740 chdir("/"); |
0 | 741 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
742 if (!conf.run_as_user) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
743 if (setgid(0) != 0) { |
409 | 744 fprintf(stderr, "could not set gid to 0. " |
745 "Is the setuid bit set? : %s\n", | |
746 strerror(errno)); | |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
747 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
748 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
749 if (setuid(0) != 0) { |
409 | 750 fprintf(stderr, "could not gain root privileges. " |
751 "Is the setuid bit set? : %s\n", | |
752 strerror(errno)); | |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
753 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
754 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
755 } |
0 | 756 |
421
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
757 if (conf.run_as_user) { |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
758 logwrite(LOG_NOTICE, "Using spool directory `%s' for " |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
759 "lock files.\n", conf.spool_dir); |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
760 conf.lock_dir = conf.spool_dir; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
761 } else { |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
762 int olduid, oldgid; |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
763 |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
764 set_euidgid(conf.mail_uid, conf.mail_gid, &olduid, &oldgid); |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
765 makedir_rec(conf.lock_dir, 0775); |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
766 set_euidgid(olduid, oldgid, NULL, NULL); |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
767 } |
f37384470855
Changed lockdir to /var/lock/masqmail; Create lockdir and piddir on startup.
markus schnalke <meillo@marmaro.de>
parents:
419
diff
changeset
|
768 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
769 if (!logopen()) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
770 fprintf(stderr, "could not open log file\n"); |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
771 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
772 } |
0 | 773 |
415
0430194f7ef8
Debug message cosmetic.
markus schnalke <meillo@marmaro.de>
parents:
409
diff
changeset
|
774 DEBUG(1) debugf("----STARTING---- masqmail %s\n", VERSION); |
0 | 775 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
776 DEBUG(5) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
777 gchar **str = argv; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
778 debugf("args: \n"); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
779 while (*str) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
780 debugf("%s \n", *str); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
781 str++; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
782 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
783 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
784 DEBUG(5) debugf("queue_interval = %d\n", queue_interval); |
0 | 785 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
786 if (f_address) { |
409 | 787 return_path = create_address_qualified(f_address, TRUE, |
788 conf.host_name); | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
789 g_free(f_address); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
790 if (!return_path) { |
409 | 791 fprintf(stderr, "invalid RFC821 address: %s\n", |
792 f_address); | |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
793 exit(1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
794 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
795 } |
0 | 796 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
797 switch (mta_mode) { |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
798 case MODE_DAEMON: |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
799 mode_daemon(do_listen, queue_interval, argv); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
800 break; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
801 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
802 case MODE_RUNQUEUE: |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
803 exit(run_queue(do_runq, do_runq_online, route_name) ? 0 : 1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
804 break; |
0 | 805 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
806 case MODE_SMTP: |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
807 mode_smtp(); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
808 break; |
0 | 809 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
810 case MODE_LIST: |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
811 queue_list(); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
812 break; |
0 | 813 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
814 case MODE_BI: |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
261
diff
changeset
|
815 exit(0); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
816 break; /* well... */ |
0 | 817 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
818 case MODE_MCMD: |
250
a41c013c8458
moved the queue manipulation code to an new function
markus schnalke <meillo@marmaro.de>
parents:
249
diff
changeset
|
819 exit(manipulate_queue(M_cmd, &argv[arg]) ? 0 : 1); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
820 break; |
0 | 821 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
822 case MODE_ACCEPT: |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
823 { |
409 | 824 guint accept_flags = 0; |
825 accept_flags |= (opt_t ? ACC_RCPT_FROM_HEAD : 0); | |
826 accept_flags |= (opt_i ? | |
827 ACC_DOT_IGNORE : ACC_NODOT_RELAX); | |
828 mode_accept(return_path, full_sender_name, | |
829 accept_flags, argv + arg, argc - arg); | |
258
05fa719b7002
fixed -oem by removing it ;-)
markus schnalke <meillo@marmaro.de>
parents:
257
diff
changeset
|
830 exit(0); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
831 } |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
832 break; |
251
2babd21e7c75
moved run_queue to a new function
markus schnalke <meillo@marmaro.de>
parents:
250
diff
changeset
|
833 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
834 default: |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
835 fprintf(stderr, "unknown mode: %d\n", mta_mode); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
836 break; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
837 } |
0 | 838 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
839 logclose(); |
0 | 840 |
263
e9e73505ab2c
removed now obsolete exit_code
markus schnalke <meillo@marmaro.de>
parents:
262
diff
changeset
|
841 exit(0); |
0 | 842 } |