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>
23 #include "event2/event.h"
24 #include "event2/http.h"
25 #include "event2/rpc.h"
27 #include <atalk/lockrpc.gen.h>
29 EVRPC_HEADER(lock_msg, lock_req, lock_rep)
30 EVRPC_GENERATE(lock_msg, lock_req, lock_rep)
32 struct event_base *eventbase;
33 struct evrpc_base *rpcbase;
36 static void sighandler(int signal)
42 LOG(log_error, logtype_default, "shutting down on signal");
47 LOG(log_error, logtype_default, "bad signal" );
53 static void set_signal(void)
55 /* catch SIGTERM, SIGINT */
57 /* Log SIGBUS/SIGSEGV SBT */
62 memset(&sv, 0, sizeof(struct sigaction));
63 sv.sa_handler = SIG_IGN;
64 sv.sa_flags = SA_RESTART;
65 sigemptyset(&sv.sa_mask);
67 if (sigaction(SIGABRT, &sv, NULL) < 0) {
68 LOG(log_error, logtype_default, "error in sigaction(SIGABRT): %s", strerror(errno));
71 if (sigaction(SIGHUP, &sv, NULL) < 0) {
72 LOG(log_error, logtype_default, "error in sigaction(SIGHUP): %s", strerror(errno));
75 if (sigaction(SIGQUIT, &sv, NULL) < 0) {
76 LOG(log_error, logtype_default, "error in sigaction(SIGQUIT): %s", strerror(errno));
79 if (sigaction(SIGALRM, &sv, NULL) < 0) {
80 LOG(log_error, logtype_default, "error in sigaction(SIGALRM): %s", strerror(errno));
83 if (sigaction(SIGUSR1, &sv, NULL) < 0) {
84 LOG(log_error, logtype_default, "error in sigaction(SIGUSR1): %s", strerror(errno));
87 if (sigaction(SIGUSR2, &sv, NULL) < 0) {
88 LOG(log_error, logtype_default, "error in sigaction(SIGUSR2): %s", strerror(errno));
94 static void lock_msg_cb(EVRPC_STRUCT(lock_msg)* rpc, void *arg _U_)
98 struct lock_req *request = rpc->request;
99 struct lock_rep *reply = rpc->reply;
101 if (EVTAG_GET(request, req_filename, &filename) == -1) {
102 LOG(log_error, logtype_default, "lock_msg_cb: no filename");
106 LOG(log_warning, logtype_default, "lock_msg_cb(file: \"%s\")", filename);
108 /* we just want to fill in some non-sense */
109 EVTAG_ASSIGN(reply, result, 0);
111 /* no reply to the RPC */
112 EVRPC_REQUEST_DONE(rpc);
115 static int rpc_setup(const char *addr, uint16_t port)
117 eventbase = event_base_new();
119 if ((http = evhttp_new(eventbase)) == NULL) {
120 LOG(log_error, logtype_default, "rpc_setup: error in evhttp_new: %s", strerror(errno));
124 if (evhttp_bind_socket(http, addr, port) != 0) {
125 LOG(log_error, logtype_default, "rpc_setup: error in evhttp_new: %s", strerror(errno));
129 rpcbase = evrpc_init(http);
131 EVRPC_REGISTER(rpcbase, lock_msg, lock_req, lock_rep, lock_msg_cb, NULL);
136 static void rpc_teardown(struct evrpc_base *rpcbase)
138 EVRPC_UNREGISTER(rpcbase, lock_msg);
142 int main(int ac, char **av)
146 /* Default log setup: log to syslog */
147 set_processname("netalockd");
148 setuplog("default log_note");
150 /* Check lockfile and daemonize */
151 switch(server_lock("netalockd", _PATH_NETALOCKD_LOCK, 0)) {
156 default: /* server */
160 /* Setup signal stuff */
163 /* Start listening */
164 if (rpc_setup("127.0.0.1", 4701) != 0) {
165 LOG(log_error, logtype_default, "main: rpc setup error");
169 LOG(log_warning, logtype_default, "Running...");
171 /* wait for events - this is where we sit for most of our life */
172 event_base_dispatch(eventbase);
175 rpc_teardown(rpcbase);