/*
- * $Id: cnid_metad.c,v 1.22 2009-11-16 02:04:47 didg Exp $
- *
* Copyright (C) Joerg Lenneis 2003
- * All Rights Reserved. See COPYING.
+ * Copyright (C) Frank Lahm 2009, 2010
*
+ * All Rights Reserved. See COPYING.
*/
/*
Result:
via TCP socket
4. afpd -------> cnid_dbd
+
+ cnid_metad and cnid_dbd have been converted to non-blocking IO in 2010.
*/
#include <errno.h>
#include <string.h>
#include <signal.h>
-#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
-#endif
-#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
-#endif
-#ifdef HAVE_SYS_UIO_H
#include <sys/uio.h>
-#endif
#include <sys/un.h>
#define _XPG4_2 1
#include <sys/socket.h>
/* Default logging config: log to syslog with level log_note */
static char logconfig[MAXPATHLEN + 21 + 1] = "default log_note";
+static void daemon_exit(int i)
+{
+ server_unlock(_PATH_CNID_METAD_LOCK);
+ exit(i);
+}
+
+/* ------------------ */
+static void sigterm_handler(int sig)
+{
+ switch( sig ) {
+ case SIGTERM :
+ LOG(log_info, logtype_afpd, "shutting down on signal %d", sig );
+ break;
+ default :
+ LOG(log_error, logtype_afpd, "unexpected signal: %d", sig);
+ }
+ daemon_exit(0);
+}
+
static struct server *test_usockfn(char *dir)
{
int i;
else {
ret = execlp(dbdpn, dbdpn, dbdir, buf1, buf2, logconfig, NULL);
}
- if (ret < 0) {
- LOG(log_error, logtype_cnid, "Fatal error in exec: %s", strerror(errno));
- exit(0);
- }
+ /* Yikes! We're still here, so exec failed... */
+ LOG(log_error, logtype_cnid, "Fatal error in exec: %s", strerror(errno));
+ daemon_exit(0);
}
/*
* Parent.
struct sigaction sv;
sigset_t set;
- signal(SIGPIPE, SIG_IGN);
+ memset(&sv, 0, sizeof(sv));
+ /* Catch SIGCHLD */
sv.sa_handler = catch_child;
sv.sa_flags = SA_NOCLDSTOP;
sigemptyset(&sv.sa_mask);
if (sigaction(SIGCHLD, &sv, NULL) < 0) {
LOG(log_error, logtype_cnid, "cnid_metad: sigaction: %s", strerror(errno));
- exit(1);
+ daemon_exit(EXITERR_SYS);
+ }
+
+ /* Catch SIGTERM */
+ sv.sa_handler = sigterm_handler;
+ sigfillset(&sv.sa_mask );
+ if (sigaction(SIGTERM, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+
+ /* Ignore the rest */
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGALRM, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGHUP, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGUSR1, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGUSR2, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
}
+ sv.sa_handler = SIG_IGN;
+ sigemptyset(&sv.sa_mask );
+ if (sigaction(SIGPIPE, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
+
/* block everywhere but in pselect */
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
if (err) {
LOG(log_error, logtype_cnid, "main: bad arguments");
- exit(1);
+ daemon_exit(1);
}
/* Check PID lockfile and become a daemon */
switch(server_lock("cnid_metad", _PATH_CNID_METAD_LOCK, 0)) {
case -1: /* error */
- exit(EXITERR_SYS);
+ daemon_exit(EXITERR_SYS);
case 0: /* child */
break;
default: /* server */
}
if ((srvfd = tsockfd_create(host, port, 10)) < 0)
- exit(1);
+ daemon_exit(1);
/* switch uid/gid */
if (uid || gid) {
if (gid) {
if (SWITCH_TO_GID(gid) < 0) {
LOG(log_info, logtype_cnid, "unable to switch to group %d", gid);
- exit(1);
+ daemon_exit(1);
}
}
if (uid) {
if (SWITCH_TO_UID(uid) < 0) {
LOG(log_info, logtype_cnid, "unable to switch to user %d", uid);
- exit(1);
+ daemon_exit(1);
}
}
}
if (rqstfd <= 0)
continue;
- /* TODO: Check out read errors, broken pipe etc. in libatalk. Is
- SIGIPE ignored there? Answer: Ignored for dsi, but not for asp ... */
- ret = read(rqstfd, &len, sizeof(int));
+ ret = readt(rqstfd, &len, sizeof(int), 1, 4);
+
if (!ret) {
/* already close */
goto loop_end;
goto loop_end;
}
- actual_len = read(rqstfd, dbdir, len);
+ actual_len = readt(rqstfd, dbdir, len, 1);
if (actual_len < 0) {
LOG(log_severe, logtype_cnid, "Read(2) error : %s", strerror(errno));
goto loop_end;