Ian Kent 0ab9b7
diff -u b/lib/master.c b/lib/master.c
Ian Kent 0ab9b7
--- b/lib/master.c
Ian Kent e676fc
+++ b/lib/master.c
Ian Kent 0ab9b7
@@ -802,8 +802,8 @@
Ian Kent 0ab9b7
 
Ian Kent e676fc
 	if (list_empty(&master->mounts)) {
Ian Kent e676fc
 		master_mutex_unlock();
Ian Kent 0ab9b7
-		error(LOGOPT_ANY, "no mounts in table");
Ian Kent e676fc
-		return 0;
Ian Kent 0ab9b7
+		warn(LOGOPT_ANY, "no mounts in table");
Ian Kent e676fc
+		return 1;
Ian Kent e676fc
 	}
Ian Kent e676fc
 
Ian Kent e676fc
 	master_mutex_unlock();
Ian Kent 0ab9b7
--- a/daemon/automount.c
Ian Kent 0ab9b7
+++ b/daemon/automount.c
Ian Kent 0ab9b7
@@ -61,6 +61,8 @@ static size_t kpkt_len;
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
 /* Attribute to create detached thread */
Ian Kent 0ab9b7
 pthread_attr_t thread_attr;
Ian Kent 0ab9b7
+/* Attribute to create normal thread */
Ian Kent 0ab9b7
+pthread_attr_t thread_attr_nodetach;
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
 struct master_readmap_cond mrc = {
Ian Kent 0ab9b7
 	PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, NULL, 0, 0, 0, 0};
Ian Kent 0ab9b7
@@ -914,7 +916,7 @@ static void *do_notify_state(void *arg)
Ian Kent 0ab9b7
 	return NULL;
Ian Kent 0ab9b7
 }
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
-static int do_signals(struct master *master, int sig)
Ian Kent 0ab9b7
+static pthread_t do_signals(struct master *master, int sig)
Ian Kent 0ab9b7
 {
Ian Kent 0ab9b7
 	pthread_t thid;
Ian Kent 0ab9b7
 	int r_sig = sig;
Ian Kent 0ab9b7
@@ -924,7 +926,7 @@ static int do_signals(struct master *master, int sig)
Ian Kent 0ab9b7
 	if (status)
Ian Kent 0ab9b7
 		fatal(status);
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
-	status = pthread_create(&thid, &thread_attr, do_notify_state, &r_sig);
Ian Kent 0ab9b7
+	status = pthread_create(&thid, &thread_attr_nodetach, do_notify_state, &r_sig);
Ian Kent 0ab9b7
 	if (status) {
Ian Kent 0ab9b7
 		error(master->default_logging,
Ian Kent 0ab9b7
 		      "mount state notify thread create failed");
Ian Kent 0ab9b7
@@ -948,7 +950,7 @@ static int do_signals(struct master *master, int sig)
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
 	pthread_cleanup_pop(1);
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
-	return 1;
Ian Kent 0ab9b7
+	return thid;
Ian Kent 0ab9b7
 }
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
 static void *do_read_master(void *arg)
Ian Kent 0ab9b7
@@ -1038,6 +1040,7 @@ static int do_hup_signal(struct master *master, time_t age)
Ian Kent 0ab9b7
 /* Deal with all the signal-driven events in the state machine */
Ian Kent 0ab9b7
 static void *statemachine(void *arg)
Ian Kent 0ab9b7
 {
Ian Kent 0ab9b7
+	pthread_t thid = 0;
Ian Kent 0ab9b7
 	sigset_t signalset;
Ian Kent 0ab9b7
 	int sig;
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
@@ -1048,15 +1051,17 @@ static void *statemachine(void *arg)
Ian Kent 0ab9b7
 	while (1) {
Ian Kent 0ab9b7
 		sigwait(&signalset, &sig);
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
-
Ian Kent 0ab9b7
-		if (master_list_empty(master_list))
Ian Kent 0ab9b7
-			return NULL;
Ian Kent 0ab9b7
-
Ian Kent 0ab9b7
 		switch (sig) {
Ian Kent 0ab9b7
 		case SIGTERM:
Ian Kent 0ab9b7
 		case SIGUSR2:
Ian Kent 0ab9b7
 		case SIGUSR1:
Ian Kent 0ab9b7
-			do_signals(master_list, sig);
Ian Kent 0ab9b7
+			thid = do_signals(master_list, sig);
Ian Kent 0ab9b7
+			if (thid) {
Ian Kent 0ab9b7
+				pthread_join(thid, NULL);
Ian Kent 0ab9b7
+				if (master_list_empty(master_list))
Ian Kent 0ab9b7
+					return NULL;
Ian Kent 0ab9b7
+				thid = 0;
Ian Kent 0ab9b7
+			}
Ian Kent 0ab9b7
 			break;
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
 		case SIGHUP:
Ian Kent 0ab9b7
@@ -1171,10 +1176,6 @@ static void handle_mounts_cleanup(void *arg)
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
 	msg("shut down path %s", path);
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
-	/* If we are the last tell the state machine to shutdown */
Ian Kent 0ab9b7
-	if (!submount && master_list_empty(master_list))
Ian Kent 0ab9b7
-		kill(getpid(), SIGTERM);
Ian Kent 0ab9b7
-
Ian Kent 0ab9b7
 	return;
Ian Kent 0ab9b7
 }
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
@@ -1644,6 +1645,14 @@ int main(int argc, char *argv[])
Ian Kent 0ab9b7
 	}
Ian Kent 0ab9b7
 #endif
Ian Kent 0ab9b7
 
Ian Kent 0ab9b7
+	if (pthread_attr_init(&thread_attr_nodetach)) {
Ian Kent 0ab9b7
+		crit(LOGOPT_ANY,
Ian Kent 0ab9b7
+		     "%s: failed to init thread attribute struct!",
Ian Kent 0ab9b7
+		     program);
Ian Kent 0ab9b7
+		close(start_pipefd[1]);
Ian Kent 0ab9b7
+		exit(1);
Ian Kent 0ab9b7
+	}
Ian Kent 0ab9b7
+
Ian Kent 0ab9b7
 	msg("Starting automounter version %s, master map %s",
Ian Kent 0ab9b7
 		version, master_list->name);
Ian Kent 0ab9b7
 	msg("using kernel protocol version %d.%02d",