]> arthur.barton.de Git - netatalk.git/blob - etc/netalockd/main.c
Add libevent
[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 #include <atalk/tsocket.h>
24
25 static void sighandler(struct tevent_context *ev,
26                        struct tevent_signal *se,
27                        int signal,
28                        int count,
29                        void *siginfo,
30                        void *private_data)
31 {
32     switch( signal ) {
33
34     case SIGTERM :
35     case SIGINT:
36         LOG(log_error, logtype_default, "shutting down on signal");
37         exit(0);
38         break;
39
40     default :
41         LOG(log_error, logtype_default, "bad signal" );
42     }
43     return;
44 }
45
46
47 static void set_signal(struct tevent_context *event_ctx)
48 {
49     /* catch SIGTERM, SIGINT */
50     if (tevent_add_signal(event_ctx, event_ctx, SIGTERM, 0, sighandler, NULL) == NULL) {
51         LOG(log_error, logtype_default, "failed to setup SIGTERM handler");
52         exit(EXIT_FAILURE);
53     }
54     if (tevent_add_signal(event_ctx, event_ctx, SIGINT, 0, sighandler, NULL) == NULL) {
55         LOG(log_error, logtype_default, "failed to setup SIGINT handler");
56         exit(EXIT_FAILURE);
57     }
58
59     /* Log SIGBUS/SIGSEGV SBT */
60     fault_setup(NULL);
61
62     /* Ignore the rest */
63     struct sigaction sv;
64     memset(&sv, 0, sizeof(struct sigaction));
65     sv.sa_handler = SIG_IGN;
66     sv.sa_flags = SA_RESTART;
67     sigemptyset(&sv.sa_mask);
68
69     if (sigaction(SIGABRT, &sv, NULL) < 0) {
70         LOG(log_error, logtype_default, "error in sigaction(SIGABRT): %s", strerror(errno));
71         exit(EXIT_FAILURE);
72     }        
73     if (sigaction(SIGHUP, &sv, NULL) < 0) {
74         LOG(log_error, logtype_default, "error in sigaction(SIGHUP): %s", strerror(errno));
75         exit(EXIT_FAILURE);
76     }        
77     if (sigaction(SIGQUIT, &sv, NULL) < 0) {
78         LOG(log_error, logtype_default, "error in sigaction(SIGQUIT): %s", strerror(errno));
79         exit(EXIT_FAILURE);
80     }        
81     if (sigaction(SIGALRM, &sv, NULL) < 0) {
82         LOG(log_error, logtype_default, "error in sigaction(SIGALRM): %s", strerror(errno));
83         exit(EXIT_FAILURE);
84     }        
85     if (sigaction(SIGUSR1, &sv, NULL) < 0) {
86         LOG(log_error, logtype_default, "error in sigaction(SIGUSR1): %s", strerror(errno));
87         exit(EXIT_FAILURE);
88     }        
89     if (sigaction(SIGUSR2, &sv, NULL) < 0) {
90         LOG(log_error, logtype_default, "error in sigaction(SIGUSR2): %s", strerror(errno));
91         exit(EXIT_FAILURE);
92     }        
93
94 }
95
96 int main(int ac, char **av)
97 {
98     struct tevent_context *event_ctx;
99     sigset_t sigs;
100     int ret;
101
102     /* Default log setup: log to syslog */
103     set_processname("netalockd");
104     setuplog("default log_note");
105
106     /* Check lockfile and daemonize */
107     switch(server_lock("netalockd", _PATH_NETALOCKD_LOCK, 0)) {
108     case -1: /* error */
109         exit(EXITERR_SYS);
110     case 0: /* child */
111         break;
112     default: /* server */
113         exit(0);
114     }
115
116     if ((event_ctx = tevent_context_init(talloc_autofree_context())) == NULL) {
117         LOG(log_error, logtype_default, "Error initializing event lib");
118         exit(1);
119     }
120
121     /* Setup signal stuff */
122     set_signal(event_ctx);
123
124     /* Setup listening socket */
125     struct tsocket_address *addr;
126     if (tsocket_address_inet_from_strings(event_ctx,
127                                           "ip",
128                                           "localhost",
129                                           4701,
130                                           &addr) != 0) {
131         LOG(log_error, logtype_default, "Error initializing socket");
132         exit(1);
133     }
134 #if 0
135     ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
136                                          struct sockaddr *sa,
137                                          size_t sa_socklen)
138 #endif
139
140     LOG(log_warning, logtype_default, "Running...");
141
142     /* wait for events - this is where we sit for most of our life */
143     tevent_loop_wait(event_ctx);
144
145     talloc_free(event_ctx);
146
147     return 0;
148 }