... | ... |
@@ -29,6 +29,8 @@ |
29 | 29 |
#include <pwd.h> |
30 | 30 |
#include <grp.h> |
31 | 31 |
#include <string.h> |
32 |
+#include <signal.h> |
|
33 |
+#include <pthread.h> |
|
32 | 34 |
#ifdef USE_SYSLOG |
33 | 35 |
#include <syslog.h> |
34 | 36 |
#endif |
... | ... |
@@ -48,15 +50,57 @@ |
48 | 48 |
#include "whitelist.h" |
49 | 49 |
|
50 | 50 |
struct smfiDesc descr; |
51 |
+struct optstruct *opts; |
|
52 |
+ |
|
53 |
+static void milter_exit(int sig) { |
|
54 |
+ const struct optstruct *opt; |
|
55 |
+ |
|
56 |
+ logg("*clamav-milter: milter_exit, signal %d\n", sig); |
|
57 |
+ |
|
58 |
+#ifndef _WIN32 |
|
59 |
+ if((opt = optget(opts, "MilterSocket"))) { |
|
60 |
+ if(unlink(opt->strarg) == -1) |
|
61 |
+ logg("!Can't unlink the socket file %s\n", opt->strarg); |
|
62 |
+ else |
|
63 |
+ logg("Socket file removed.\n"); |
|
64 |
+ } |
|
65 |
+#endif |
|
66 |
+ |
|
67 |
+ logg("clamav-milter: stopped\n"); |
|
68 |
+ |
|
69 |
+ optfree(opts); |
|
70 |
+ |
|
71 |
+ logg_close(); |
|
72 |
+ cpool_free(); |
|
73 |
+ localnets_free(); |
|
74 |
+ whitelist_free(); |
|
75 |
+} |
|
51 | 76 |
|
52 | 77 |
int main(int argc, char **argv) { |
53 | 78 |
char *my_socket, *pt; |
54 | 79 |
const struct optstruct *opt; |
55 |
- struct optstruct *opts; |
|
56 | 80 |
time_t currtime; |
57 | 81 |
mode_t umsk; |
58 | 82 |
int ret; |
59 | 83 |
|
84 |
+ sigset_t sigset; |
|
85 |
+ struct sigaction act; |
|
86 |
+ |
|
87 |
+ sigfillset(&sigset); |
|
88 |
+ sigdelset(&sigset, SIGUSR1); |
|
89 |
+ sigdelset(&sigset, SIGFPE); |
|
90 |
+ sigdelset(&sigset, SIGILL); |
|
91 |
+ sigdelset(&sigset, SIGSEGV); |
|
92 |
+#ifdef SIGBUS |
|
93 |
+ sigdelset(&sigset, SIGBUS); |
|
94 |
+#endif |
|
95 |
+ pthread_sigmask(SIG_SETMASK, &sigset, NULL); |
|
96 |
+ memset(&act, 0, sizeof(struct sigaction)); |
|
97 |
+ act.sa_handler = milter_exit; |
|
98 |
+ sigfillset(&(act.sa_mask)); |
|
99 |
+ sigaction(SIGUSR1, &act, NULL); |
|
100 |
+ sigaction(SIGSEGV, &act, NULL); |
|
101 |
+ |
|
60 | 102 |
cl_initialize_crypto(); |
61 | 103 |
|
62 | 104 |
memset(&descr, 0, sizeof(struct smfiDesc)); |
... | ... |
@@ -403,16 +447,7 @@ int main(int argc, char **argv) { |
403 | 403 |
umask(old_umask); |
404 | 404 |
} |
405 | 405 |
|
406 |
- ret = smfi_main(); |
|
407 |
- |
|
408 |
- optfree(opts); |
|
409 |
- |
|
410 |
- logg_close(); |
|
411 |
- cpool_free(); |
|
412 |
- localnets_free(); |
|
413 |
- whitelist_free(); |
|
414 |
- |
|
415 |
- return ret; |
|
406 |
+ return smfi_main(); |
|
416 | 407 |
} |
417 | 408 |
|
418 | 409 |
/* |