Mercurial > masqmail
annotate src/online.c @ 305:794071925a22
refactored complex conditions
author | meillo@marmaro.de |
---|---|
date | Sun, 24 Apr 2011 15:10:11 +0200 |
parents | 1aa107c6b1e5 |
children | f10a56dc7481 |
rev | line source |
---|---|
0 | 1 /* MasqMail |
2 Copyright (C) 1999-2001 Oliver Kurth | |
279 | 3 Copyright (C) 2008, 2010 markus schnalke <meillo@marmaro.de> |
0 | 4 |
5 This program is free software; you can redistribute it and/or modify | |
6 it under the terms of the GNU General Public License as published by | |
7 the Free Software Foundation; either version 2 of the License, or | |
8 (at your option) any later version. | |
9 | |
10 This program is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 GNU General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU General Public License | |
16 along with this program; if not, write to the Free Software | |
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
18 */ | |
19 | |
20 #include <sys/stat.h> | |
21 #include <sys/wait.h> | |
15 | 22 |
0 | 23 #include "masqmail.h" |
24 #include "peopen.h" | |
25 | |
26 gchar *connection_name; | |
27 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
28 void |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
29 set_online_name(gchar * name) |
0 | 30 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
31 connection_name = g_strdup(name); |
0 | 32 } |
33 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
34 static gchar* |
279 | 35 detect_online_file(const gchar* file) |
36 { | |
37 struct stat st; | |
38 int err; | |
39 FILE *fptr; | |
40 char buf[256]; | |
41 | |
42 err = stat(conf.online_file, &st); | |
43 | |
44 if (err) { | |
45 if (errno==ENOENT) { | |
46 logwrite(LOG_NOTICE, "not online.\n"); | |
47 return NULL; | |
48 } | |
49 logwrite(LOG_ALERT, "stat of %s failed: %s\n", conf.online_file, strerror(errno)); | |
50 return NULL; | |
51 } | |
52 | |
53 fptr = fopen(conf.online_file, "r"); | |
54 if (!fptr) { | |
55 logwrite(LOG_ALERT, "opening of %s failed: %s\n", conf.online_file, strerror(errno)); | |
56 return NULL; | |
57 } | |
58 if (fgets(buf, 256, fptr) == NULL) { | |
59 logwrite(LOG_ALERT, "empty online file %s\n", conf.online_file); | |
60 fclose(fptr); | |
61 return NULL; | |
62 } | |
63 g_strstrip(buf); /* strip whitespace */ | |
64 fclose(fptr); | |
65 if (strlen(buf) == 0) { | |
66 logwrite(LOG_ALERT, "only whitespace connection name in %s\n", conf.online_file); | |
67 return NULL; | |
68 } | |
69 return g_strdup(buf); | |
70 } | |
71 | |
72 static gchar* | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
73 detect_online_pipe(const gchar * pipe) |
0 | 74 { |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
75 pid_t pid; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
76 void (*old_signal) (int); |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
77 int status; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
78 FILE *in; |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
79 gchar *name = NULL; |
0 | 80 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
81 old_signal = signal(SIGCHLD, SIG_DFL); |
0 | 82 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
83 in = peopen(pipe, "r", environ, &pid); |
33 | 84 if (in == NULL) { |
85 logwrite(LOG_ALERT, "could not open pipe '%s': %s\n", pipe, strerror(errno)); | |
86 signal(SIGCHLD, old_signal); | |
87 return NULL; | |
88 } | |
89 | |
90 gchar output[256]; | |
91 if (fgets(output, 255, in)) { | |
92 g_strchomp(g_strchug(output)); | |
93 if (strlen(output) == 0) { | |
94 logwrite(LOG_ALERT, "only whitespace connection name\n"); | |
95 name = NULL; | |
18
99c09ed776c1
fixed empty or only-whitespace connection names
meillo@marmaro.de
parents:
15
diff
changeset
|
96 } else { |
33 | 97 name = g_strdup(output); |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
98 } |
33 | 99 } else { |
100 logwrite(LOG_ALERT, "nothing read from pipe %s\n", pipe); | |
101 name = NULL; | |
102 } | |
103 fclose(in); | |
104 waitpid(pid, &status, 0); | |
262
fc1c6425c024
s/EXIT_SUCCESS/0/ && s/EXIT_FAILURE/1/
markus schnalke <meillo@marmaro.de>
parents:
208
diff
changeset
|
105 if (WEXITSTATUS(status) != 0) { |
33 | 106 g_free(name); |
107 name = NULL; | |
108 } | |
0 | 109 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
110 signal(SIGCHLD, old_signal); |
0 | 111 |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
112 return name; |
0 | 113 } |
114 | |
10
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
115 gchar* |
26e34ae9a3e3
changed indention and line wrapping to a more consistent style
meillo@marmaro.de
parents:
0
diff
changeset
|
116 detect_online() |
0 | 117 { |
279 | 118 if (!conf.online_detect) { |
33 | 119 return NULL; |
120 } | |
121 | |
122 if (strcmp(conf.online_detect, "file") == 0) { | |
123 DEBUG(3) debugf("online detection method 'file'\n"); | |
279 | 124 if (!conf.online_file) { |
33 | 125 logwrite(LOG_ALERT, "online detection mode is 'file', but online_file is undefined\n"); |
126 return NULL; | |
127 } | |
279 | 128 return detect_online_file(conf.online_file); |
33 | 129 |
130 } else if (strcmp(conf.online_detect, "pipe") == 0) { | |
131 DEBUG(3) debugf("connection method 'pipe'\n"); | |
279 | 132 if (!conf.online_pipe) { |
33 | 133 logwrite(LOG_ALERT, "online detection mode is 'pipe', but online_pipe is undefined\n"); |
134 return NULL; | |
135 } | |
279 | 136 return detect_online_pipe(conf.online_pipe); |
137 | |
33 | 138 } else if (strcmp(conf.online_detect, "argument") == 0) { |
279 | 139 DEBUG(3) debugf("online route literally defined\n"); |
140 /* use the name set with set_online_name() */ | |
33 | 141 return connection_name; |
279 | 142 |
0 | 143 } |
33 | 144 |
279 | 145 DEBUG(3) debugf("unknown online detection method `%s'\n", conf.online_detect); |
0 | 146 return NULL; |
147 } |