Ian Kent a3ae01
diff -up autofs-5.0.2/modules/lookup_ldap.c.foreground-logging autofs-5.0.2/modules/lookup_ldap.c
Ian Kent a3ae01
--- autofs-5.0.2/modules/lookup_ldap.c.foreground-logging	2007-09-24 14:42:28.000000000 +0800
Ian Kent a3ae01
+++ autofs-5.0.2/modules/lookup_ldap.c	2007-09-24 14:44:18.000000000 +0800
Ian Kent a3ae01
@@ -468,17 +468,17 @@ int parse_ldap_config(struct lookup_cont
Ian Kent a3ae01
 	ctxt->client_princ = client_princ;
Ian Kent a3ae01
 
Ian Kent a3ae01
 	debug(LOGOPT_NONE,
Ian Kent a3ae01
-	      "ldap authentication configured with the following options:\n");
Ian Kent a3ae01
+	      "ldap authentication configured with the following options:");
Ian Kent a3ae01
 	debug(LOGOPT_NONE,
Ian Kent a3ae01
 	      "use_tls: %u, "
Ian Kent a3ae01
 	      "tls_required: %u, "
Ian Kent a3ae01
 	      "auth_required: %u, "
Ian Kent a3ae01
-	      "sasl_mech: %s\n",
Ian Kent a3ae01
+	      "sasl_mech: %s",
Ian Kent a3ae01
 	      use_tls, tls_required, auth_required, authtype);
Ian Kent a3ae01
 	debug(LOGOPT_NONE,
Ian Kent a3ae01
 	      "user: %s, "
Ian Kent a3ae01
 	      "secret: %s, "
Ian Kent a3ae01
-	      "client principal: %s\n",
Ian Kent a3ae01
+	      "client principal: %s",
Ian Kent a3ae01
 	      user, secret ? "specified" : "unspecified",
Ian Kent a3ae01
 	      client_princ);
Ian Kent a3ae01
 
Ian Kent a3ae01
diff -up autofs-5.0.2/modules/cyrus-sasl.c.foreground-logging autofs-5.0.2/modules/cyrus-sasl.c
Ian Kent a3ae01
--- autofs-5.0.2/modules/cyrus-sasl.c.foreground-logging	2007-06-18 15:18:08.000000000 +0800
Ian Kent a3ae01
+++ autofs-5.0.2/modules/cyrus-sasl.c	2007-09-24 14:44:18.000000000 +0800
Ian Kent a3ae01
@@ -197,7 +197,7 @@ get_server_SASL_mechanisms(LDAP *ld)
Ian Kent a3ae01
 	if (mechanisms == NULL) {
Ian Kent a3ae01
 		/* Well, that was a waste of time. */
Ian Kent a3ae01
 		msg("No SASL authentication mechanisms are supported"
Ian Kent a3ae01
-		    " by the LDAP server.\n");
Ian Kent a3ae01
+		    " by the LDAP server.");
Ian Kent a3ae01
 		return NULL;
Ian Kent a3ae01
 	}
Ian Kent a3ae01
 
Ian Kent a3ae01
diff -up autofs-5.0.2/daemon/automount.c.foreground-logging autofs-5.0.2/daemon/automount.c
Ian Kent a3ae01
--- autofs-5.0.2/daemon/automount.c.foreground-logging	2007-09-24 14:42:28.000000000 +0800
Ian Kent a3ae01
+++ autofs-5.0.2/daemon/automount.c	2007-09-24 14:44:18.000000000 +0800
Ian Kent a3ae01
@@ -58,14 +58,13 @@ unsigned int random_selection;	/* use ra
Ian Kent a3ae01
 static int start_pipefd[2];
Ian Kent a3ae01
 static int st_stat = 0;
Ian Kent a3ae01
 static int *pst_stat = &st_stat;
Ian Kent a3ae01
+static pthread_t state_mach_thid;
Ian Kent a3ae01
 
Ian Kent a3ae01
 /* Pre-calculated kernel packet length */
Ian Kent a3ae01
 static size_t kpkt_len;
Ian Kent a3ae01
 
Ian Kent a3ae01
 /* Attribute to create detached thread */
Ian Kent a3ae01
 pthread_attr_t thread_attr;
Ian Kent a3ae01
-/* Attribute to create normal thread */
Ian Kent a3ae01
-pthread_attr_t thread_attr_nodetach;
Ian Kent a3ae01
 
Ian Kent a3ae01
 struct master_readmap_cond mrc = {
Ian Kent a3ae01
 	PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, NULL, 0, 0, 0, 0};
Ian Kent a3ae01
@@ -75,9 +74,6 @@ struct startup_cond suc = {
Ian Kent a3ae01
 
Ian Kent a3ae01
 pthread_key_t key_thread_stdenv_vars;
Ian Kent a3ae01
 
Ian Kent a3ae01
-/* re-entrant syslog default context data */
Ian Kent a3ae01
-#define AUTOFS_SYSLOG_CONTEXT {-1, 0, 0, LOG_PID, (const char *)0, LOG_DAEMON, 0xff};
Ian Kent a3ae01
-
Ian Kent a3ae01
 #define MAX_OPEN_FILES		10240
Ian Kent a3ae01
 
Ian Kent a3ae01
 static int umount_all(struct autofs_point *ap, int force);
Ian Kent a3ae01
@@ -792,7 +788,6 @@ static void become_daemon(unsigned foreg
Ian Kent a3ae01
 {
Ian Kent a3ae01
 	FILE *pidfp;
Ian Kent a3ae01
 	char buf[MAX_ERR_BUF];
Ian Kent a3ae01
-	unsigned to_stderr = 0;
Ian Kent a3ae01
 	pid_t pid;
Ian Kent a3ae01
 
Ian Kent a3ae01
 	/* Don't BUSY any directories unnecessarily */
Ian Kent a3ae01
@@ -809,7 +804,9 @@ static void become_daemon(unsigned foreg
Ian Kent a3ae01
 	}
Ian Kent a3ae01
 
Ian Kent a3ae01
 	/* Detach from foreground process */
Ian Kent a3ae01
-	if (!foreground) {
Ian Kent a3ae01
+	if (foreground)
Ian Kent a3ae01
+		log_to_stderr();
Ian Kent a3ae01
+	else {
Ian Kent a3ae01
 		pid = fork();
Ian Kent a3ae01
 		if (pid > 0) {
Ian Kent a3ae01
 			int r;
Ian Kent a3ae01
@@ -834,13 +831,8 @@ static void become_daemon(unsigned foreg
Ian Kent a3ae01
 			fprintf(stderr, "setsid: %s", estr);
Ian Kent a3ae01
 			exit(1);
Ian Kent a3ae01
 		}
Ian Kent a3ae01
-	}
Ian Kent a3ae01
-
Ian Kent a3ae01
-	/* Setup logging */
Ian Kent a3ae01
-	if (to_stderr)
Ian Kent a3ae01
-		log_to_stderr();
Ian Kent a3ae01
-	else
Ian Kent a3ae01
 		log_to_syslog();
Ian Kent a3ae01
+	}
Ian Kent a3ae01
 
Ian Kent a3ae01
 	/* Write pid file if requested */
Ian Kent a3ae01
 	if (pid_file) {
Ian Kent a3ae01
@@ -929,7 +921,7 @@ static pthread_t do_signals(struct maste
Ian Kent a3ae01
 	if (status)
Ian Kent a3ae01
 		fatal(status);
Ian Kent a3ae01
 
Ian Kent a3ae01
-	status = pthread_create(&thid, &thread_attr_nodetach, do_notify_state, &r_sig);
Ian Kent a3ae01
+	status = pthread_create(&thid, &thread_attr, do_notify_state, &r_sig);
Ian Kent a3ae01
 	if (status) {
Ian Kent a3ae01
 		error(master->default_logging,
Ian Kent a3ae01
 		      "mount state notify thread create failed");
Ian Kent a3ae01
@@ -1043,7 +1035,6 @@ static int do_hup_signal(struct master *
Ian Kent a3ae01
 /* Deal with all the signal-driven events in the state machine */
Ian Kent a3ae01
 static void *statemachine(void *arg)
Ian Kent a3ae01
 {
Ian Kent a3ae01
-	pthread_t thid = 0;
Ian Kent a3ae01
 	sigset_t signalset;
Ian Kent a3ae01
 	int sig;
Ian Kent a3ae01
 
Ian Kent a3ae01
@@ -1056,15 +1047,12 @@ static void *statemachine(void *arg)
Ian Kent a3ae01
 
Ian Kent a3ae01
 		switch (sig) {
Ian Kent a3ae01
 		case SIGTERM:
Ian Kent a3ae01
+		case SIGINT:
Ian Kent a3ae01
 		case SIGUSR2:
Ian Kent a3ae01
+			if (master_list_empty(master_list))
Ian Kent a3ae01
+				return NULL;
Ian Kent a3ae01
 		case SIGUSR1:
Ian Kent a3ae01
-			thid = do_signals(master_list, sig);
Ian Kent a3ae01
-			if (thid) {
Ian Kent a3ae01
-				pthread_join(thid, NULL);
Ian Kent a3ae01
-				if (master_list_empty(master_list))
Ian Kent a3ae01
-					return NULL;
Ian Kent a3ae01
-				thid = 0;
Ian Kent a3ae01
-			}
Ian Kent a3ae01
+			do_signals(master_list, sig);
Ian Kent a3ae01
 			break;
Ian Kent a3ae01
 
Ian Kent a3ae01
 		case SIGHUP:
Ian Kent a3ae01
@@ -1179,6 +1167,10 @@ static void handle_mounts_cleanup(void *
Ian Kent a3ae01
 
Ian Kent a3ae01
 	msg("shut down path %s", path);
Ian Kent a3ae01
 
Ian Kent a3ae01
+	/* If we are the last tell the state machine to shutdown */
Ian Kent a3ae01
+	if (!submount && master_list_empty(master_list))
Ian Kent a3ae01
+		pthread_kill(state_mach_thid, SIGTERM);
Ian Kent a3ae01
+	
Ian Kent a3ae01
 	return;
Ian Kent a3ae01
 }
Ian Kent a3ae01
 
Ian Kent a3ae01
@@ -1357,7 +1349,7 @@ static void usage(void)
Ian Kent a3ae01
 		"	-v --verbose	be verbose\n"
Ian Kent a3ae01
 		"	-d --debug	log debuging info\n"
Ian Kent a3ae01
 		"	-D --define	define global macro variable\n"
Ian Kent a3ae01
-		/*"	-f --foreground do not fork into background\n" */
Ian Kent a3ae01
+		"	-f --foreground do not fork into background\n"
Ian Kent a3ae01
 		"	-r --random-multimount-selection\n"
Ian Kent a3ae01
 		"			use ramdom replicated server selection\n"
Ian Kent a3ae01
 		"	-O --global-options\n"
Ian Kent a3ae01
@@ -1632,14 +1624,6 @@ int main(int argc, char *argv[])
Ian Kent a3ae01
 	}
Ian Kent a3ae01
 #endif
Ian Kent a3ae01
 
Ian Kent a3ae01
-	if (pthread_attr_init(&thread_attr_nodetach)) {
Ian Kent a3ae01
-		crit(LOGOPT_ANY,
Ian Kent a3ae01
-		     "%s: failed to init thread attribute struct!",
Ian Kent a3ae01
-		     program);
Ian Kent a3ae01
-		close(start_pipefd[1]);
Ian Kent a3ae01
-		exit(1);
Ian Kent a3ae01
-	}
Ian Kent a3ae01
-
Ian Kent a3ae01
 	msg("Starting automounter version %s, master map %s",
Ian Kent a3ae01
 		version, master_list->name);
Ian Kent a3ae01
 	msg("using kernel protocol version %d.%02d",
Ian Kent a3ae01
@@ -1684,6 +1668,7 @@ int main(int argc, char *argv[])
Ian Kent a3ae01
 	res = write(start_pipefd[1], pst_stat, sizeof(pst_stat));
Ian Kent a3ae01
 	close(start_pipefd[1]);
Ian Kent a3ae01
 
Ian Kent a3ae01
+	state_mach_thid = pthread_self();
Ian Kent a3ae01
 	statemachine(NULL);
Ian Kent a3ae01
 
Ian Kent a3ae01
 	master_kill(master_list);
Ian Kent a3ae01
diff -up autofs-5.0.2/lib/master.c.foreground-logging autofs-5.0.2/lib/master.c
Ian Kent a3ae01
--- autofs-5.0.2/lib/master.c.foreground-logging	2007-09-24 14:42:28.000000000 +0800
Ian Kent a3ae01
+++ autofs-5.0.2/lib/master.c	2007-09-24 14:44:18.000000000 +0800
Ian Kent a3ae01
@@ -954,6 +954,7 @@ void master_notify_state_change(struct m
Ian Kent a3ae01
 
Ian Kent a3ae01
 		switch (sig) {
Ian Kent a3ae01
 		case SIGTERM:
Ian Kent a3ae01
+		case SIGINT:
Ian Kent a3ae01
 			if (ap->state != ST_SHUTDOWN_PENDING &&
Ian Kent a3ae01
 			    ap->state != ST_SHUTDOWN_FORCE) {
Ian Kent a3ae01
 				next = ST_SHUTDOWN_PENDING;
Ian Kent a3ae01
diff -up autofs-5.0.2/lib/log.c.foreground-logging autofs-5.0.2/lib/log.c
Ian Kent a3ae01
--- autofs-5.0.2/lib/log.c.foreground-logging	2007-06-18 15:18:08.000000000 +0800
Ian Kent a3ae01
+++ autofs-5.0.2/lib/log.c	2007-09-24 14:44:18.000000000 +0800
Ian Kent a3ae01
@@ -27,9 +27,6 @@
Ian Kent a3ae01
 
Ian Kent a3ae01
 #include "automount.h"
Ian Kent a3ae01
 
Ian Kent a3ae01
-/* re-entrant syslog default context data */
Ian Kent a3ae01
-#define AUTOFS_SYSLOG_CONTEXT {-1, 0, 0, LOG_PID, (const char *) 0, LOG_DAEMON, 0xff};
Ian Kent a3ae01
-
Ian Kent a3ae01
 /*
Ian Kent a3ae01
 struct syslog_data syslog_context = AUTOFS_SYSLOG_CONTEXT;
Ian Kent a3ae01
 struct syslog_data *slc = &syslog_context;
Ian Kent a3ae01
@@ -134,30 +131,40 @@ static void syslog_debug(unsigned int lo
Ian Kent a3ae01
 	va_end(ap);
Ian Kent a3ae01
 }
Ian Kent a3ae01
 
Ian Kent a3ae01
+static void to_stderr(unsigned int logopt, const char *msg, ...)
Ian Kent a3ae01
+{
Ian Kent a3ae01
+	va_list ap;
Ian Kent a3ae01
+	va_start(ap, msg);
Ian Kent a3ae01
+	vfprintf(stderr, msg, ap);
Ian Kent a3ae01
+	fputc('\n',stderr);
Ian Kent a3ae01
+	va_end(ap);
Ian Kent a3ae01
+}
Ian Kent a3ae01
+
Ian Kent a3ae01
 void set_mnt_logging(struct autofs_point *ap)
Ian Kent a3ae01
 {
Ian Kent a3ae01
 	unsigned int opt_verbose = ap->logopt & LOGOPT_VERBOSE;
Ian Kent a3ae01
 	unsigned int opt_debug = ap->logopt & LOGOPT_DEBUG;
Ian Kent a3ae01
 
Ian Kent a3ae01
-	if (opt_debug)
Ian Kent a3ae01
-		log_debug = syslog_debug;
Ian Kent a3ae01
+	if (opt_debug) {
Ian Kent a3ae01
+		if (logging_to_syslog)
Ian Kent a3ae01
+			log_debug = syslog_debug;
Ian Kent a3ae01
+		else
Ian Kent a3ae01
+			log_debug = to_stderr;
Ian Kent a3ae01
+	}
Ian Kent a3ae01
 
Ian Kent a3ae01
 	if (opt_verbose || opt_debug) {
Ian Kent a3ae01
-		log_info = syslog_info;
Ian Kent a3ae01
-		log_notice = syslog_notice;
Ian Kent a3ae01
-		log_warn = syslog_warn;
Ian Kent a3ae01
+		if (logging_to_syslog) {
Ian Kent a3ae01
+			log_info = syslog_info;
Ian Kent a3ae01
+			log_notice = syslog_notice;
Ian Kent a3ae01
+			log_warn = syslog_warn;
Ian Kent a3ae01
+		} else {
Ian Kent a3ae01
+			log_info = to_stderr;
Ian Kent a3ae01
+			log_notice = to_stderr;
Ian Kent a3ae01
+			log_warn = to_stderr;
Ian Kent a3ae01
+		}
Ian Kent a3ae01
 	}
Ian Kent a3ae01
 }
Ian Kent a3ae01
 
Ian Kent a3ae01
-static void to_stderr(unsigned int logopt, const char *msg, ...)
Ian Kent a3ae01
-{
Ian Kent a3ae01
-	va_list ap;
Ian Kent a3ae01
-	va_start(ap, msg);
Ian Kent a3ae01
-	vfprintf(stderr, msg, ap);
Ian Kent a3ae01
-	fputc('\n',stderr);
Ian Kent a3ae01
-	va_end(ap);
Ian Kent a3ae01
-}
Ian Kent a3ae01
-
Ian Kent a3ae01
 void log_to_syslog(void)
Ian Kent a3ae01
 {
Ian Kent a3ae01
 	char buf[MAX_ERR_BUF];
Ian Kent a3ae01
diff -up autofs-5.0.2/man/automount.8.foreground-logging autofs-5.0.2/man/automount.8
Ian Kent a3ae01
--- autofs-5.0.2/man/automount.8.foreground-logging	2007-09-24 14:42:28.000000000 +0800
Ian Kent a3ae01
+++ autofs-5.0.2/man/automount.8	2007-09-24 14:44:18.000000000 +0800
Ian Kent a3ae01
@@ -47,6 +47,9 @@ Define a global macro substitution varia
Ian Kent a3ae01
 are over-ridden macro definitions of the same name specified in
Ian Kent a3ae01
 mount entries.
Ian Kent a3ae01
 .TP
Ian Kent a3ae01
+.I "\-f, \-\-foreground"
Ian Kent a3ae01
+Run the daemon in the forground and log to stderr instead of syslog."
Ian Kent a3ae01
+.TP
Ian Kent a3ae01
 .I "\-r, \-\-random-multimount-selection"
Ian Kent a3ae01
 Enables the use of ramdom selection when choosing a host from a
Ian Kent a3ae01
 list of replicated servers.