]> arthur.barton.de Git - netatalk.git/blob - etc/netalockd/main.c
ef02a319d97ca658b7da6dd2d265a38b2bc6bff7
[netatalk.git] / etc / netalockd / main.c
1 /*
2  * Copyright (c) 2010 Frank Lahm
3  * All Rights Reserved.  See COPYRIGHT.
4  */
5
6 #ifdef HAVE_CONFIG_H
7 #include "config.h"
8 #endif /* HAVE_CONFIG_H */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <signal.h>
14 #include <sys/param.h>
15 #include <sys/time.h>
16 #include <sys/socket.h>
17 #include <errno.h>
18
19 #include <atalk/logger.h>
20 #include <atalk/paths.h>
21 #include <atalk/util.h>
22 #include <atalk/tevent.h>
23
24 static int reloadconfig;
25
26 static void sighandler(int sig)
27 {
28     switch( sig ) {
29
30     case SIGTERM :
31         LOG(log_note, logtype_default, "netalockd shutting down on SIGTERM");
32         exit(0);
33         break;
34
35     case SIGHUP :
36         reloadconfig = 1;
37         break;
38
39     default :
40         LOG(log_error, logtype_default, "bad signal" );
41     }
42     return;
43 }
44
45
46 static void set_signal(void)
47 {
48     struct sigaction sv;
49
50     sv.sa_handler = sighandler;
51     sv.sa_flags = SA_RESTART;
52     sigemptyset(&sv.sa_mask);
53     if (sigaction(SIGTERM, &sv, NULL) < 0) {
54         LOG(log_error, logtype_default, "error in sigaction(SIGTERM): %s", strerror(errno));
55         exit(EXIT_FAILURE);
56     }        
57     if (sigaction(SIGINT, &sv, NULL) < 0) {
58         LOG(log_error, logtype_default, "error in sigaction(SIGINT): %s", strerror(errno));
59         exit(EXIT_FAILURE);
60     }        
61
62     memset(&sv, 0, sizeof(struct sigaction));
63     sv.sa_handler = SIG_IGN;
64     sigemptyset(&sv.sa_mask);
65
66     if (sigaction(SIGABRT, &sv, NULL) < 0) {
67         LOG(log_error, logtype_default, "error in sigaction(SIGABRT): %s", strerror(errno));
68         exit(EXIT_FAILURE);
69     }        
70     if (sigaction(SIGHUP, &sv, NULL) < 0) {
71         LOG(log_error, logtype_default, "error in sigaction(SIGHUP): %s", strerror(errno));
72         exit(EXIT_FAILURE);
73     }        
74     if (sigaction(SIGQUIT, &sv, NULL) < 0) {
75         LOG(log_error, logtype_default, "error in sigaction(SIGQUIT): %s", strerror(errno));
76         exit(EXIT_FAILURE);
77     }        
78     if (sigaction(SIGALRM, &sv, NULL) < 0) {
79         LOG(log_error, logtype_default, "error in sigaction(SIGALRM): %s", strerror(errno));
80         exit(EXIT_FAILURE);
81     }        
82     if (sigaction(SIGUSR1, &sv, NULL) < 0) {
83         LOG(log_error, logtype_default, "error in sigaction(SIGUSR1): %s", strerror(errno));
84         exit(EXIT_FAILURE);
85     }        
86     if (sigaction(SIGUSR2, &sv, NULL) < 0) {
87         LOG(log_error, logtype_default, "error in sigaction(SIGUSR2): %s", strerror(errno));
88         exit(EXIT_FAILURE);
89     }        
90
91 }
92
93 int main(int ac, char **av)
94 {
95     struct tevent_context *event_ctx;
96     sigset_t sigs;
97     int ret;
98
99     /* Default log setup: log to syslog */
100     set_processname("netalockd");
101     setuplog("default log_note");
102
103     /* Check lockfile and daemonize */
104     switch(server_lock("netalockd", _PATH_NETALOCKD_LOCK, 0)) {
105     case -1: /* error */
106         exit(EXITERR_SYS);
107     case 0: /* child */
108         break;
109     default: /* server */
110         exit(0);
111     }
112
113     /* Setup signal stuff */
114     set_signal();
115     /* Log SIGBUS/SIGSEGV SBT */
116     fault_setup(NULL);
117
118     if ((event_ctx = tevent_context_init(talloc_autofree_context())) == NULL) {
119         LOG(log_error, logtype_default, "Error initializing event lib");
120         exit(1);
121     }
122
123     LOG(log_warning, logtype_default, "Running...");
124
125     /* wait for events - this is where we sit for most of our life */
126     tevent_loop_wait(event_ctx);
127
128     talloc_free(event_ctx);
129
130     return 0;
131 }