static void daemon_exit(int i)
{
- server_unlock(_PATH_CNID_METAD_LOCK);
exit(i);
}
/* ------------------ */
-static void sigterm_handler(int sig)
+static void sig_handler(int sig)
{
switch( sig ) {
- case SIGTERM :
- LOG(log_info, logtype_afpd, "shutting down on signal %d", sig );
+ case SIGTERM:
+ case SIGQUIT:
+ LOG(log_note, logtype_afpd, "shutting down on %s",
+ sig == SIGTERM ? "SIGTERM" : "SIGQUIT");
break;
default :
LOG(log_error, logtype_afpd, "unexpected signal: %d", sig);
EC_INIT;
int status;
struct stat st;
- bstring oldpath, newpath, cmd = NULL;
+ bstring oldpath, newpath;
+ char *cmd_argv[4];
+
+ LOG(log_debug, logtype_cnid, "set_dbdir: volume: %s, db path: %s", vpath, dbdir);
EC_NULL_LOG( oldpath = bformat("%s/%s/", vpath, DBHOME) );
EC_NULL_LOG( newpath = bformat("%s/%s/", dbdir, DBHOME) );
if (lstat(dbdir, &st) < 0 && mkdir(dbdir, 0755) < 0) {
LOG(log_error, logtype_cnid, "set_dbdir: mkdir failed for %s", dbdir);
- return -1;
+ EC_FAIL;
}
if (lstat(bdata(oldpath), &st) == 0 && lstat(bdata(newpath), &st) != 0 && errno == ENOENT) {
/* There's an .AppleDB in the volume root, we move it */
- EC_NULL_LOG( cmd = bformat("mv '%s' '%s'", bdata(oldpath), dbdir) );
- LOG(log_debug, logtype_cnid, "set_dbdir: cmd: %s", bdata(cmd));
- if (WEXITSTATUS(system(bdata(cmd))) != 0) {
+ cmd_argv[0] = "mv";
+ cmd_argv[1] = bdata(oldpath);
+ cmd_argv[2] = (char *)dbdir;
+ cmd_argv[3] = NULL;
+ if (run_cmd("mv", cmd_argv) != 0) {
LOG(log_error, logtype_cnid, "set_dbdir: moving CNID db from \"%s\" to \"%s\" failed",
bdata(oldpath), dbdir);
EC_FAIL;
}
+
}
if (lstat(bdata(newpath), &st) < 0 && mkdir(bdata(newpath), 0755 ) < 0) {
LOG(log_error, logtype_cnid, "set_dbdir: mkdir failed for %s", bdata(newpath));
- return -1;
+ EC_FAIL;
}
EC_CLEANUP:
bdestroy(oldpath);
bdestroy(newpath);
- bdestroy(cmd);
EC_EXIT;
}
daemon_exit(EXITERR_SYS);
}
- /* Catch SIGTERM */
- sv.sa_handler = sigterm_handler;
+ /* Catch SIGTERM and SIGQUIT */
+ sv.sa_handler = sig_handler;
sigfillset(&sv.sa_mask );
if (sigaction(SIGTERM, &sv, NULL ) < 0 ) {
LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
daemon_exit(EXITERR_SYS);
}
+ if (sigaction(SIGQUIT, &sv, NULL ) < 0 ) {
+ LOG(log_error, logtype_afpd, "sigaction: %s", strerror(errno) );
+ daemon_exit(EXITERR_SYS);
+ }
/* Ignore the rest */
sv.sa_handler = SIG_IGN;
/* block everywhere but in pselect */
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
- sigprocmask(SIG_BLOCK, &set, NULL);
+ sigprocmask(SIG_SETMASK, &set, NULL);
}
static int setlimits(void)
}
}
- /* Check for PID lockfile */
- if (check_lockfile("cnid_metad", _PATH_CNID_METAD_LOCK))
- return -1;
-
if (!debug && daemonize(0, 0) != 0)
exit(EXITERR_SYS);
- /* Create PID lockfile */
- if (create_lockfile("cnid_metad", _PATH_CNID_METAD_LOCK))
- return -1;
-
- if (afp_config_parse(&obj) != 0)
+ if (afp_config_parse(&obj, "cnid_metad") != 0)
daemon_exit(1);
- set_processname("cnid_metad");
- setuplog(obj.options.logconfig, obj.options.logfile);
-
if (load_volumes(&obj, NULL) != 0)
daemon_exit(1);
srv[i].tm = 0;
srv[i].count = 0;
}
- else if (WIFSIGNALED(status)) {
+ if (WIFSIGNALED(status)) {
LOG(log_info, logtype_cnid, "cnid_dbd[%i] got signal %i",
pid, WTERMSIG(status));
}