2 * Copyright (c) 2010 Frank Lahm
3 * All Rights Reserved. See COPYRIGHT.
8 #endif /* HAVE_CONFIG_H */
14 #include <sys/param.h>
16 #include <sys/socket.h>
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>
25 static void sighandler(struct tevent_context *ev,
26 struct tevent_signal *se,
36 LOG(log_error, logtype_default, "shutting down on signal");
41 LOG(log_error, logtype_default, "bad signal" );
47 static void set_signal(struct tevent_context *event_ctx)
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");
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");
59 /* Log SIGBUS/SIGSEGV SBT */
64 memset(&sv, 0, sizeof(struct sigaction));
65 sv.sa_handler = SIG_IGN;
66 sv.sa_flags = SA_RESTART;
67 sigemptyset(&sv.sa_mask);
69 if (sigaction(SIGABRT, &sv, NULL) < 0) {
70 LOG(log_error, logtype_default, "error in sigaction(SIGABRT): %s", strerror(errno));
73 if (sigaction(SIGHUP, &sv, NULL) < 0) {
74 LOG(log_error, logtype_default, "error in sigaction(SIGHUP): %s", strerror(errno));
77 if (sigaction(SIGQUIT, &sv, NULL) < 0) {
78 LOG(log_error, logtype_default, "error in sigaction(SIGQUIT): %s", strerror(errno));
81 if (sigaction(SIGALRM, &sv, NULL) < 0) {
82 LOG(log_error, logtype_default, "error in sigaction(SIGALRM): %s", strerror(errno));
85 if (sigaction(SIGUSR1, &sv, NULL) < 0) {
86 LOG(log_error, logtype_default, "error in sigaction(SIGUSR1): %s", strerror(errno));
89 if (sigaction(SIGUSR2, &sv, NULL) < 0) {
90 LOG(log_error, logtype_default, "error in sigaction(SIGUSR2): %s", strerror(errno));
96 int main(int ac, char **av)
98 struct tevent_context *event_ctx;
102 /* Default log setup: log to syslog */
103 set_processname("netalockd");
104 setuplog("default log_note");
106 /* Check lockfile and daemonize */
107 switch(server_lock("netalockd", _PATH_NETALOCKD_LOCK, 0)) {
112 default: /* server */
116 if ((event_ctx = tevent_context_init(talloc_autofree_context())) == NULL) {
117 LOG(log_error, logtype_default, "Error initializing event lib");
121 /* Setup signal stuff */
122 set_signal(event_ctx);
124 /* Setup listening socket */
125 struct tsocket_address *addr;
126 if (tsocket_address_inet_from_strings(event_ctx,
131 LOG(log_error, logtype_default, "Error initializing socket");
135 ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
140 LOG(log_warning, logtype_default, "Running...");
142 /* wait for events - this is where we sit for most of our life */
143 tevent_loop_wait(event_ctx);
145 talloc_free(event_ctx);