Mercurial > masqmail-0.2
comparison src/get.c @ 10:26e34ae9a3e3
changed indention and line wrapping to a more consistent style
author | meillo@marmaro.de |
---|---|
date | Mon, 27 Oct 2008 16:23:10 +0100 |
parents | 08114f7dcc23 |
children | f671821d8222 |
comparison
equal
deleted
inserted
replaced
9:31cc8a89cb74 | 10:26e34ae9a3e3 |
---|---|
25 | 25 |
26 #ifdef ENABLE_POP3 | 26 #ifdef ENABLE_POP3 |
27 | 27 |
28 static int volatile sighup_seen = 0; | 28 static int volatile sighup_seen = 0; |
29 | 29 |
30 static | 30 static void |
31 void sighup_handler(int sig) | 31 sighup_handler(int sig) |
32 { | 32 { |
33 sighup_seen = 1; | 33 sighup_seen = 1; |
34 signal(SIGHUP, sighup_handler); | 34 signal(SIGHUP, sighup_handler); |
35 } | 35 } |
36 | 36 |
37 static | 37 static void |
38 void sigchld_handler(int sig) | 38 sigchld_handler(int sig) |
39 { | 39 { |
40 pid_t pid; | 40 pid_t pid; |
41 int status; | 41 int status; |
42 | 42 |
43 pid = waitpid(0, &status, 0); | 43 pid = waitpid(0, &status, 0); |
44 if(pid > 0){ | 44 if (pid > 0) { |
45 if(WEXITSTATUS(status) != EXIT_SUCCESS) | 45 if (WEXITSTATUS(status) != EXIT_SUCCESS) |
46 logwrite(LOG_WARNING, "process %d exited with %d\n", | 46 logwrite(LOG_WARNING, "process %d exited with %d\n", pid, WEXITSTATUS(status)); |
47 pid, WEXITSTATUS(status)); | 47 if (WIFSIGNALED(status)) |
48 if(WIFSIGNALED(status)) | 48 logwrite(LOG_WARNING, "process with pid %d got signal: %d\n", pid, WTERMSIG(status)); |
49 logwrite(LOG_WARNING, | 49 } |
50 "process with pid %d got signal: %d\n", | 50 signal(SIGCHLD, sigchld_handler); |
51 pid, WTERMSIG(status)); | 51 } |
52 } | 52 |
53 signal(SIGCHLD, sigchld_handler); | 53 static int |
54 } | 54 get_lock(get_conf * gc) |
55 | |
56 static | |
57 int get_lock(get_conf *gc) | |
58 { | 55 { |
59 #ifdef USE_DOTLOCK | 56 #ifdef USE_DOTLOCK |
60 gboolean ok = FALSE; | 57 gboolean ok = FALSE; |
61 gchar *hitch_name; | 58 gchar *hitch_name; |
62 gchar *lock_name; | 59 gchar *lock_name; |
63 | 60 |
64 /* the name of the lock is constructed from the user | 61 /* the name of the lock is constructed from the user |
65 and the server name, to prevent more than one connection at the same time | 62 and the server name, to prevent more than one connection at the same time |
66 to the same server and the same user. This way concurrent connections | 63 to the same server and the same user. This way concurrent connections |
67 are possible to different servers or different users */ | 64 are possible to different servers or different users */ |
68 hitch_name = g_strdup_printf("%s/masqmail-get-%s@%s-%d.lock", | 65 hitch_name = g_strdup_printf("%s/masqmail-get-%s@%s-%d.lock", conf.lock_dir, gc->login_user, gc->server_name, getpid()); |
69 conf.lock_dir, gc->login_user, | 66 lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", conf.lock_dir, gc->login_user, gc->server_name); |
70 gc->server_name, getpid()); | 67 |
71 lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", | 68 ok = dot_lock(lock_name, hitch_name); |
72 conf.lock_dir, gc->login_user, gc->server_name); | 69 if (!ok) |
73 | 70 logwrite(LOG_WARNING, "getting mail for %s@%s is locked\n", gc->login_user, gc->server_name); |
74 ok = dot_lock(lock_name, hitch_name); | 71 |
75 if(!ok) logwrite(LOG_WARNING, | 72 g_free(lock_name); |
76 "getting mail for %s@%s is locked\n", | 73 g_free(hitch_name); |
77 gc->login_user, gc->server_name); | 74 |
78 | 75 return ok; |
79 g_free(lock_name); | |
80 g_free(hitch_name); | |
81 | |
82 return ok; | |
83 #else | 76 #else |
84 gchar *lock_name; | 77 gchar *lock_name; |
85 int fd; | 78 int fd; |
86 | 79 |
87 lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", | 80 lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", conf.lock_dir, gc->login_user, gc->server_name); |
88 conf.lock_dir, gc->login_user, gc->server_name); | 81 |
89 | 82 if ((fd = open(lock_name, O_WRONLY | O_NDELAY | O_APPEND | O_CREAT, 0600)) >= 0) { |
90 if((fd = open(lock_name, O_WRONLY|O_NDELAY|O_APPEND|O_CREAT, 0600)) >= 0){ | 83 if (flock(fd, LOCK_EX | LOCK_NB) != 0) { |
91 if(flock(fd, LOCK_EX|LOCK_NB) != 0){ | 84 close(fd); |
92 close(fd); | 85 logwrite(LOG_WARNING, "getting mail for %s@%s is locked\n", gc->login_user, gc->server_name); |
93 logwrite(LOG_WARNING, | 86 fd = -1; |
94 "getting mail for %s@%s is locked\n", | 87 } |
95 gc->login_user, gc->server_name); | 88 } else |
96 fd = -1; | 89 logwrite(LOG_WARNING, "could not open lock %s: %s\n", lock_name, strerror(errno)); |
97 } | 90 |
98 }else | 91 g_free(lock_name); |
99 logwrite(LOG_WARNING, | 92 |
100 "could not open lock %s: %s\n", lock_name, strerror(errno)); | 93 return fd; |
101 | |
102 g_free(lock_name); | |
103 | |
104 return fd; | |
105 #endif | 94 #endif |
106 } | 95 } |
107 | 96 |
108 #ifdef USE_DOTLOCK | 97 #ifdef USE_DOTLOCK |
109 static | 98 static gboolean |
110 gboolean get_unlock(get_conf *gc) | 99 get_unlock(get_conf * gc) |
111 { | 100 { |
112 gchar *lock_name lock_name = | 101 gchar *lock_name lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", conf.lock_dir, gc->login_user, gc->server_name); |
113 g_strdup_printf("%s/masqmail-get-%s@%s.lock", | 102 |
114 conf.lock_dir, gc->login_user, gc->server_name); | 103 dot_unlock(lock_name); |
115 | 104 g_free(lock_name); |
116 dot_unlock(lock_name); | 105 |
117 | 106 return TRUE; |
118 g_free(lock_name); | |
119 | |
120 return TRUE; | |
121 } | 107 } |
122 #else | 108 #else |
123 static void get_unlock(get_conf *gc, int fd) | 109 static void |
124 { | 110 get_unlock(get_conf * gc, int fd) |
125 gchar *lock_name = | 111 { |
126 g_strdup_printf("%s/masqmail-get-%s@%s.lock", | 112 gchar *lock_name = g_strdup_printf("%s/masqmail-get-%s@%s.lock", conf.lock_dir, gc->login_user, gc->server_name); |
127 conf.lock_dir, gc->login_user, gc->server_name); | 113 |
128 | 114 flock(fd, LOCK_UN); |
129 flock(fd, LOCK_UN); | 115 close(fd); |
130 close(fd); | 116 |
131 | 117 unlink(lock_name); |
132 unlink(lock_name); | 118 g_free(lock_name); |
133 g_free(lock_name); | 119 } |
134 } | 120 #endif |
135 #endif | 121 |
136 | 122 gboolean |
137 gboolean get_from_file(gchar *fname) | 123 get_from_file(gchar * fname) |
138 { | 124 { |
139 guint flags = 0; | 125 guint flags = 0; |
140 get_conf *gc = read_get_conf(fname); | 126 get_conf *gc = read_get_conf(fname); |
141 gboolean ok = TRUE; | 127 gboolean ok = TRUE; |
142 int lock; | 128 int lock; |
143 | 129 |
144 if(gc){ | 130 if (gc) { |
145 if(!gc->do_keep) flags |= POP3_FLAG_DELETE; | 131 if (!gc->do_keep) |
146 if(gc->do_uidl) flags |= POP3_FLAG_UIDL; | 132 flags |= POP3_FLAG_DELETE; |
147 if(gc->do_uidl_dele) flags |= POP3_FLAG_UIDL_DELE; | 133 if (gc->do_uidl) |
148 | 134 flags |= POP3_FLAG_UIDL; |
149 if(!(gc->server_name)){ | 135 if (gc->do_uidl_dele) |
150 logwrite(LOG_ALERT, "no server name given in %s\n", fname); return FALSE; | 136 flags |= POP3_FLAG_UIDL_DELE; |
151 } | 137 |
152 if(!(gc->address)){ | 138 if (!(gc->server_name)) { |
153 logwrite(LOG_ALERT, "no address given in %s\n", fname); return FALSE; | 139 logwrite(LOG_ALERT, "no server name given in %s\n", fname); |
154 } | 140 return FALSE; |
155 if(!(gc->login_user)){ | 141 } |
156 logwrite(LOG_ALERT, "no user name given in %s\n", fname); return FALSE; | 142 if (!(gc->address)) { |
157 } | 143 logwrite(LOG_ALERT, "no address given in %s\n", fname); |
158 if(!(gc->login_pass)){ | 144 return FALSE; |
159 logwrite(LOG_ALERT, "no password given in %s\n", fname); return FALSE; | 145 } |
160 } | 146 if (!(gc->login_user)) { |
161 | 147 logwrite(LOG_ALERT, "no user name given in %s\n", fname); |
162 DEBUG(3) debugf("flags = %d\n", flags); | 148 return FALSE; |
163 | 149 } |
164 if((strcmp(gc->protocol, "pop3") == 0) || (strcmp(gc->protocol, "apop") == 0)){ | 150 if (!(gc->login_pass)) { |
165 pop3_base *popb = NULL; | 151 logwrite(LOG_ALERT, "no password given in %s\n", fname); |
166 | 152 return FALSE; |
167 if(strcmp(gc->protocol, "apop") == 0){ | 153 } |
168 flags |= POP3_FLAG_APOP; | 154 |
169 DEBUG(3) debugf("attempting to get mail for user %s at host %s" | 155 DEBUG(3) debugf("flags = %d\n", flags); |
170 " for %s@%s with apop\n", | 156 |
171 gc->login_user, gc->server_name, | 157 if ((strcmp(gc->protocol, "pop3") == 0) || (strcmp(gc->protocol, "apop") == 0)) { |
172 gc->address->local_part, gc->address->domain); | 158 pop3_base *popb = NULL; |
173 }else{ | 159 |
174 DEBUG(3) debugf("attempting to get mail for user %s at host %s" | 160 if (strcmp(gc->protocol, "apop") == 0) { |
175 " for %s@%s with pop3\n", | 161 flags |= POP3_FLAG_APOP; |
176 gc->login_user, gc->server_name, | 162 DEBUG(3) debugf("attempting to get mail for user %s at host %s for %s@%s with apop\n", |
177 gc->address->local_part, gc->address->domain); | 163 gc->login_user, gc->server_name, gc->address->local_part, gc->address->domain); |
178 } | 164 } else { |
165 DEBUG(3) debugf("attempting to get mail for user %s at host %s for %s@%s with pop3\n", | |
166 gc->login_user, gc->server_name, gc->address->local_part, gc->address->domain); | |
167 } | |
179 #ifdef USE_DOTLOCK | 168 #ifdef USE_DOTLOCK |
180 if((lock = get_lock(gc))){ | 169 if ((lock = get_lock(gc))) { |
181 #else | 170 #else |
182 if((lock = get_lock(gc)) >= 0){ | 171 if ((lock = get_lock(gc)) >= 0) { |
183 #endif | 172 #endif |
184 if(gc->wrapper){ | 173 if (gc->wrapper) { |
185 popb = pop3_in_open_child(gc->wrapper, flags); | 174 popb = pop3_in_open_child(gc->wrapper, flags); |
186 /* quick hack */ | 175 /* quick hack */ |
187 popb->remote_host = gc->server_name; | 176 popb->remote_host = gc->server_name; |
188 }else{ | 177 } else { |
189 popb = pop3_in_open(gc->server_name, gc->server_port, | 178 popb = pop3_in_open(gc->server_name, gc->server_port, gc->resolve_list, flags); |
190 gc->resolve_list, flags); | 179 } |
191 } | 180 if (popb) { |
192 if(popb){ | 181 ok = pop3_get(popb, gc->login_user, gc->login_pass, gc->address, gc->return_path, |
193 ok = pop3_get(popb, gc->login_user, gc->login_pass, | 182 gc->max_count, gc->max_size, gc->max_size_delete); |
194 gc->address, gc->return_path, | 183 pop3_in_close(popb); |
195 gc->max_count, gc->max_size, gc->max_size_delete); | 184 } else { |
196 pop3_in_close(popb); | 185 ok = FALSE; |
197 }else{ | 186 logwrite(LOG_ALERT, "failed to connect to host %s\n", gc->server_name); |
198 ok = FALSE; | 187 } |
199 logwrite(LOG_ALERT, "failed to connect to host %s\n", gc->server_name); | |
200 } | |
201 #ifdef USE_DOTLOCK | 188 #ifdef USE_DOTLOCK |
202 get_unlock(gc); | 189 get_unlock(gc); |
203 #else | 190 #else |
204 get_unlock(gc, lock); | 191 get_unlock(gc, lock); |
205 #endif | 192 #endif |
206 } | 193 } |
207 }else{ | 194 } else { |
208 logwrite(LOG_ALERT, "get protocol %s unknown\n", gc->protocol); | 195 logwrite(LOG_ALERT, "get protocol %s unknown\n", gc->protocol); |
209 ok = FALSE; | 196 ok = FALSE; |
210 } | 197 } |
211 | 198 |
212 destroy_get_conf(gc); | 199 destroy_get_conf(gc); |
213 } | 200 } |
214 return ok; | 201 return ok; |
215 } | 202 } |
216 | 203 |
217 gboolean get_from_name(gchar *name) | 204 gboolean |
218 { | 205 get_from_name(gchar * name) |
219 gchar *fname = (gchar *)table_find(conf.get_names, name); | 206 { |
220 if(fname) | 207 gchar *fname = (gchar *) table_find(conf.get_names, name); |
221 return get_from_file(fname); | 208 if (fname) |
222 return FALSE; | 209 return get_from_file(fname); |
223 } | 210 return FALSE; |
224 | 211 } |
225 gboolean get_all() | 212 |
226 { | 213 gboolean |
227 GList *get_table = conf.get_names; | 214 get_all() |
228 GList *get_node; | 215 { |
229 void (*old_signal)(int); | 216 GList *get_table = conf.get_names; |
230 | 217 GList *get_node; |
231 old_signal = signal(SIGCHLD, SIG_DFL); | 218 void (*old_signal) (int); |
232 | 219 |
233 foreach(get_table, get_node){ | 220 old_signal = signal(SIGCHLD, SIG_DFL); |
234 table_pair *pair = (table_pair *)(get_node->data); | 221 |
235 gchar *fname = (gchar *)pair->value; | 222 foreach(get_table, get_node) { |
236 pid_t pid; | 223 table_pair *pair = (table_pair *) (get_node->data); |
237 | 224 gchar *fname = (gchar *) pair->value; |
238 pid = fork(); | 225 pid_t pid; |
239 if(pid == 0){ | 226 |
240 signal(SIGCHLD, old_signal); | 227 pid = fork(); |
241 exit(get_from_file(fname) ? EXIT_SUCCESS : EXIT_FAILURE); | 228 if (pid == 0) { |
242 }else if(pid > 0){ | 229 signal(SIGCHLD, old_signal); |
243 int status; | 230 exit(get_from_file(fname) ? EXIT_SUCCESS : EXIT_FAILURE); |
244 waitpid(pid, &status, 0); | 231 } else if (pid > 0) { |
245 if(WEXITSTATUS(status) != EXIT_SUCCESS) | 232 int status; |
246 logwrite(LOG_WARNING, "child returned %d\n", WEXITSTATUS(status)); | 233 waitpid(pid, &status, 0); |
247 if(WIFSIGNALED(status)) | 234 if (WEXITSTATUS(status) != EXIT_SUCCESS) |
248 logwrite(LOG_WARNING, "child got signal: %d\n", WTERMSIG(status)); | 235 logwrite(LOG_WARNING, "child returned %d\n", WEXITSTATUS(status)); |
249 }else | 236 if (WIFSIGNALED(status)) |
250 logwrite(LOG_WARNING, "forking child failed: %s\n", strerror(errno)); | 237 logwrite(LOG_WARNING, "child got signal: %d\n", WTERMSIG(status)); |
251 } | 238 } else |
252 | 239 logwrite(LOG_WARNING, "forking child failed: %s\n", strerror(errno)); |
253 signal(SIGCHLD, old_signal); | 240 } |
254 | 241 |
255 return TRUE; | 242 signal(SIGCHLD, old_signal); |
256 } | 243 |
257 | 244 return TRUE; |
258 void get_online() | 245 } |
259 { | 246 |
260 GList *gf_list = NULL; | 247 void |
261 gchar *connect_name = detect_online(); | 248 get_online() |
262 | 249 { |
263 if(connect_name != NULL){ | 250 GList *gf_list = NULL; |
264 void (*old_signal)(int); | 251 gchar *connect_name = detect_online(); |
265 | 252 |
266 old_signal = signal(SIGCHLD, SIG_DFL); | 253 if (connect_name != NULL) { |
267 | 254 void (*old_signal) (int); |
268 logwrite(LOG_NOTICE, "detected online configuration %s\n", connect_name); | 255 |
269 /* we are online! */ | 256 old_signal = signal(SIGCHLD, SIG_DFL); |
270 gf_list = (GList *)table_find(conf.online_gets, connect_name); | 257 |
271 if(gf_list != NULL){ | 258 logwrite(LOG_NOTICE, "detected online configuration %s\n", connect_name); |
272 GList *node; | 259 /* we are online! */ |
273 foreach(gf_list, node){ | 260 gf_list = (GList *) table_find(conf.online_gets, connect_name); |
274 gchar *fname = (gchar *)(node->data); | 261 if (gf_list != NULL) { |
275 pid_t pid; | 262 GList *node; |
276 | 263 foreach(gf_list, node) { |
277 if(fname[0] != '/') | 264 gchar *fname = (gchar *) (node->data); |
278 fname = (gchar *)table_find(conf.get_names, fname); | 265 pid_t pid; |
279 | 266 |
280 if(fname != NULL){ | 267 if (fname[0] != '/') |
281 pid = fork(); | 268 fname = (gchar *) table_find(conf.get_names, fname); |
282 if(pid == 0){ | 269 |
283 signal(SIGCHLD, old_signal); | 270 if (fname != NULL) { |
284 exit(get_from_file(fname) ? EXIT_SUCCESS : EXIT_FAILURE); | 271 pid = fork(); |
285 }else if(pid > 0){ | 272 if (pid == 0) { |
286 int status; | 273 signal(SIGCHLD, old_signal); |
287 waitpid(pid, &status, 0); | 274 exit(get_from_file(fname) ? EXIT_SUCCESS : EXIT_FAILURE); |
288 if(WEXITSTATUS(status) != EXIT_SUCCESS) | 275 } else if (pid > 0) { |
289 logwrite(LOG_WARNING, "child returned %d\n", WEXITSTATUS(status)); | 276 int status; |
290 if(WIFSIGNALED(status)) | 277 waitpid(pid, &status, 0); |
291 logwrite(LOG_WARNING, "child got signal: %d\n", WTERMSIG(status)); | 278 if (WEXITSTATUS(status) != EXIT_SUCCESS) |
292 }else | 279 logwrite(LOG_WARNING, "child returned %d\n", WEXITSTATUS(status)); |
293 logwrite(LOG_WARNING, "forking child failed: %s\n", strerror(errno)); | 280 if (WIFSIGNALED(status)) |
294 } | 281 logwrite(LOG_WARNING, "child got signal: %d\n", WTERMSIG(status)); |
295 } | 282 } else |
296 } | 283 logwrite(LOG_WARNING, "forking child failed: %s\n", strerror(errno)); |
297 signal(SIGCHLD, old_signal); | 284 } |
298 } | 285 } |
299 } | 286 } |
300 | 287 signal(SIGCHLD, old_signal); |
301 void get_daemon(gint gival, char *argv[]) | 288 } |
302 { | 289 } |
303 struct timeval tm; | 290 |
304 time_t time_before, time_now; | 291 void |
305 int sel_ret; | 292 get_daemon(gint gival, char *argv[]) |
306 | 293 { |
307 /* setup handler for HUP signal: */ | 294 struct timeval tm; |
308 signal(SIGHUP, sighup_handler); | 295 time_t time_before, time_now; |
309 | 296 int sel_ret; |
310 /* we can give up root privileges */ | 297 |
311 if(!conf.run_as_user){ | 298 /* setup handler for HUP signal: */ |
312 if(setegid(conf.mail_gid) != 0){ | 299 signal(SIGHUP, sighup_handler); |
313 logwrite(LOG_ALERT, "could not change gid to %d: %s\n", | 300 |
314 conf.mail_gid, strerror(errno)); | 301 /* we can give up root privileges */ |
315 exit(EXIT_FAILURE); | 302 if (!conf.run_as_user) { |
316 } | 303 if (setegid(conf.mail_gid) != 0) { |
317 if(seteuid(conf.mail_uid) != 0){ | 304 logwrite(LOG_ALERT, "could not change gid to %d: %s\n", conf.mail_gid, strerror(errno)); |
318 logwrite(LOG_ALERT, "could not change uid to %d: %s\n", | 305 exit(EXIT_FAILURE); |
319 conf.mail_uid, strerror(errno)); | 306 } |
320 exit(EXIT_FAILURE); | 307 if (seteuid(conf.mail_uid) != 0) { |
321 } | 308 logwrite(LOG_ALERT, "could not change uid to %d: %s\n", conf.mail_uid, strerror(errno)); |
322 } | 309 exit(EXIT_FAILURE); |
323 | 310 } |
324 /* sel_ret = 0;*/ | 311 } |
325 time(&time_before); | 312 |
326 time_before -= gival; | 313 /* sel_ret = 0; */ |
327 sel_ret = -1; | 314 time(&time_before); |
328 | 315 time_before -= gival; |
329 while (1){ | 316 sel_ret = -1; |
330 /* see listen_port() in listen.c */ | 317 |
331 if(gival > 0){ | 318 while (1) { |
332 time(&time_now); | 319 /* see listen_port() in listen.c */ |
333 if(sel_ret == 0){ /* we are either just starting or did a queue run */ | 320 if (gival > 0) { |
334 tm.tv_sec = gival; | 321 time(&time_now); |
335 tm.tv_usec = 0; | 322 if (sel_ret == 0) { /* we are either just starting or did a queue run */ |
336 time_before = time_now; | 323 tm.tv_sec = gival; |
337 }else{ | 324 tm.tv_usec = 0; |
338 tm.tv_sec = gival - (time_now - time_before); | 325 time_before = time_now; |
339 tm.tv_usec = 0; | 326 } else { |
340 | 327 tm.tv_sec = gival - (time_now - time_before); |
341 /* race condition, very unlikely (but possible): */ | 328 tm.tv_usec = 0; |
342 if(tm.tv_sec < 0) | 329 |
343 tm.tv_sec = 0; | 330 /* race condition, very unlikely (but possible): */ |
344 } | 331 if (tm.tv_sec < 0) |
345 } | 332 tm.tv_sec = 0; |
346 | 333 } |
347 if ((sel_ret = select(0, NULL, NULL, NULL, &tm)) < 0){ | 334 } |
348 if(errno != EINTR){ | 335 |
349 logwrite(LOG_ALERT, "select: (terminating): %s\n", strerror(errno)); | 336 if ((sel_ret = select(0, NULL, NULL, NULL, &tm)) < 0) { |
350 exit (EXIT_FAILURE); | 337 if (errno != EINTR) { |
351 }else{ | 338 logwrite(LOG_ALERT, "select: (terminating): %s\n", strerror(errno)); |
352 if(sighup_seen){ | 339 exit(EXIT_FAILURE); |
353 logwrite(LOG_NOTICE, "HUP signal received. Restarting daemon\n"); | 340 } else { |
354 | 341 if (sighup_seen) { |
355 if(argv == NULL) exit(EXIT_SUCCESS); | 342 logwrite(LOG_NOTICE, "HUP signal received. Restarting daemon\n"); |
356 | 343 |
357 execv(argv[0], &(argv[0])); | 344 if (argv == NULL) |
358 logwrite(LOG_ALERT, "restarting failed: %s\n", strerror(errno)); | 345 exit(EXIT_SUCCESS); |
359 exit(EXIT_FAILURE); | 346 |
360 | 347 execv(argv[0], &(argv[0])); |
361 } | 348 logwrite(LOG_ALERT, "restarting failed: %s\n", strerror(errno)); |
362 } | 349 exit(EXIT_FAILURE); |
363 }else{ | 350 |
364 /* If select returns 0, the interval time has elapsed. | 351 } |
365 We start a new get process */ | 352 } |
366 int pid; | 353 } else { |
367 signal(SIGCHLD, sigchld_handler); | 354 /* If select returns 0, the interval time has elapsed. |
368 if((pid = fork()) == 0){ | 355 We start a new get process */ |
369 get_online(); | 356 int pid; |
370 | 357 signal(SIGCHLD, sigchld_handler); |
371 _exit(EXIT_SUCCESS); | 358 if ((pid = fork()) == 0) { |
372 } | 359 get_online(); |
373 else if(pid < 0){ | 360 |
374 logwrite(LOG_ALERT, "could not fork for get run"); | 361 _exit(EXIT_SUCCESS); |
375 } | 362 } else if (pid < 0) { |
376 } | 363 logwrite(LOG_ALERT, "could not fork for get run"); |
377 } | 364 } |
378 } | 365 } |
379 | 366 } |
380 gboolean pop_before_smtp(gchar *fname) | 367 } |
381 { | 368 |
382 gboolean ok = FALSE; | 369 gboolean |
383 GList *resolve_list = NULL; | 370 pop_before_smtp(gchar * fname) |
384 get_conf *gc = read_get_conf(fname); | 371 { |
385 guint flags = 0; | 372 gboolean ok = FALSE; |
373 GList *resolve_list = NULL; | |
374 get_conf *gc = read_get_conf(fname); | |
375 guint flags = 0; | |
386 | 376 |
387 #ifdef ENABLE_RESOLVER | 377 #ifdef ENABLE_RESOLVER |
388 resolve_list = g_list_append(resolve_list, resolve_dns_a); | 378 resolve_list = g_list_append(resolve_list, resolve_dns_a); |
389 #endif | 379 #endif |
390 resolve_list = g_list_append(resolve_list, resolve_byname); | 380 resolve_list = g_list_append(resolve_list, resolve_byname); |
391 | 381 |
392 if(strcmp(gc->protocol, "pop3") == 0){ | 382 if (strcmp(gc->protocol, "pop3") == 0) { |
393 DEBUG(3) debugf("attempting to login for user %s, host = %s with pop3\n", | 383 DEBUG(3) debugf("attempting to login for user %s, host = %s with pop3\n", gc->login_user, gc->server_name); |
394 gc->login_user, gc->server_name); | 384 ok = pop3_login(gc->server_name, gc->server_port, resolve_list, gc->login_user, gc->login_pass, flags); |
395 ok = pop3_login(gc->server_name, gc->server_port, resolve_list, | 385 } else if (strcmp(gc->protocol, "apop") == 0) { |
396 gc->login_user, gc->login_pass, | 386 DEBUG(3) debugf ("attempting to login for user %s, host = %s with apop\n", gc->login_user, gc->server_name); |
397 flags); | 387 ok = pop3_login(gc->server_name, gc->server_port, resolve_list, gc->login_user, gc->login_pass, flags | POP3_FLAG_APOP); |
398 }else if(strcmp(gc->protocol, "apop") == 0){ | 388 } else { |
399 DEBUG(3) debugf("attempting to login for user %s, host = %s with apop\n", | 389 logwrite(LOG_ALERT, "get protocol %s unknown\n", gc->protocol); |
400 gc->login_user, gc->server_name); | 390 } |
401 ok = pop3_login(gc->server_name, gc->server_port, resolve_list, | 391 return ok; |
402 gc->login_user, gc->login_pass, | 392 } |
403 flags | POP3_FLAG_APOP); | 393 |
404 }else{ | 394 #endif |
405 logwrite(LOG_ALERT, "get protocol %s unknown\n", gc->protocol); | |
406 } | |
407 return ok; | |
408 } | |
409 | |
410 #endif |