Ian Kent e232a5
autofs-5.0.6 - remove empty command line arguments
Ian Kent e232a5
Ian Kent e232a5
From: Ian Kent <raven@themaw.net>
Ian Kent e232a5
Ian Kent e232a5
When invoking the automount daemon from a systemd unit file a macro
Ian Kent e232a5
that evaluates to the empty string is passed as an empty argument
Ian Kent e232a5
unlike the shell environment within which unquoted arguments are
Ian Kent e232a5
seen as white space and are not passed at all.
Ian Kent e232a5
Ian Kent e232a5
These empty arguments confuse getopt(3) and cause the program
Ian Kent e232a5
parameters to be misread so we need to remove them before calling
Ian Kent e232a5
getopt(3).
Ian Kent e232a5
---
Ian Kent e232a5
Ian Kent e232a5
 CHANGELOG          |    1 +
Ian Kent e232a5
 daemon/automount.c |   39 +++++++++++++++++++++++++++++++++++----
Ian Kent e232a5
 2 files changed, 36 insertions(+), 4 deletions(-)
Ian Kent e232a5
Ian Kent e232a5
Ian Kent 5ec16e
--- autofs-5.0.6.orig/CHANGELOG
Ian Kent 5ec16e
+++ autofs-5.0.6/CHANGELOG
Ian Kent 5ec16e
@@ -18,6 +18,7 @@
Ian Kent e232a5
 - fix ipv6 configure check.
Ian Kent e232a5
 - add piddir to configure.
Ian Kent e232a5
 - add systemd unit support.
Ian Kent e232a5
+- remove empty command line arguments (passed by systemd).
Ian Kent e232a5
 
Ian Kent e232a5
 28/06/2011 autofs-5.0.6
Ian Kent e232a5
 -----------------------
Ian Kent 5ec16e
--- autofs-5.0.6.orig/daemon/automount.c
Ian Kent 5ec16e
+++ autofs-5.0.6/daemon/automount.c
Ian Kent 5ec16e
@@ -1865,6 +1865,34 @@ static int convert_log_priority(char *pr
Ian Kent e232a5
 	return -1;
Ian Kent e232a5
 }
Ian Kent e232a5
 
Ian Kent e232a5
+static void remove_empty_args(char **argv, int *argc)
Ian Kent e232a5
+{
Ian Kent e232a5
+	int next_to_last = *argc - 1;
Ian Kent e232a5
+	int i, j;
Ian Kent e232a5
+
Ian Kent e232a5
+	for (i = j = 1; i < *argc; i++) {
Ian Kent e232a5
+		if (*argv[i]) {
Ian Kent e232a5
+			j++;
Ian Kent e232a5
+			continue;
Ian Kent e232a5
+		}
Ian Kent e232a5
+
Ian Kent e232a5
+		while (i < *argc && argv[i] && !*argv[i]) i++;
Ian Kent e232a5
+
Ian Kent e232a5
+		if (i == *argc)
Ian Kent e232a5
+			break;
Ian Kent e232a5
+
Ian Kent e232a5
+		if (i == next_to_last) {
Ian Kent e232a5
+			if (*argv[i])
Ian Kent e232a5
+				argv[j++] = argv[i];
Ian Kent e232a5
+			break;
Ian Kent e232a5
+		} else {
Ian Kent e232a5
+			argv[j++] = argv[i];
Ian Kent e232a5
+			argv[i--] = "";
Ian Kent e232a5
+		}
Ian Kent e232a5
+	}
Ian Kent e232a5
+	*argc = j;
Ian Kent e232a5
+}
Ian Kent e232a5
+
Ian Kent e232a5
 int main(int argc, char *argv[])
Ian Kent e232a5
 {
Ian Kent e232a5
 	int res, opt, status;
Ian Kent e232a5
@@ -1874,6 +1902,7 @@ int main(int argc, char *argv[])
Ian Kent e232a5
 	time_t timeout;
Ian Kent e232a5
 	time_t age = time(NULL);
Ian Kent e232a5
 	struct rlimit rlim;
Ian Kent e232a5
+	const char *options = "+hp:t:vmdD:fVrO:l:n:CF";
Ian Kent e232a5
 	static const struct option long_options[] = {
Ian Kent e232a5
 		{"help", 0, 0, 'h'},
Ian Kent e232a5
 		{"pid-file", 1, 0, 'p'},
Ian Kent e232a5
@@ -1918,8 +1947,10 @@ int main(int argc, char *argv[])
Ian Kent e232a5
 	dumpmaps = 0;
Ian Kent e232a5
 	daemon_check = 1;
Ian Kent e232a5
 
Ian Kent e232a5
+	remove_empty_args(argv, &argc);
Ian Kent e232a5
+
Ian Kent e232a5
 	opterr = 0;
Ian Kent e232a5
-	while ((opt = getopt_long(argc, argv, "+hp:t:vmdD:fVrO:l:n:CF", long_options, NULL)) != EOF) {
Ian Kent e232a5
+	while ((opt = getopt_long(argc, argv, options, long_options, NULL)) != EOF) {
Ian Kent e232a5
 		switch (opt) {
Ian Kent e232a5
 		case 'h':
Ian Kent e232a5
 			usage();
Ian Kent e232a5
@@ -2066,7 +2097,7 @@ int main(int argc, char *argv[])
Ian Kent e232a5
 	res = setrlimit(RLIMIT_NOFILE, &rlim);
Ian Kent e232a5
 	if (res)
Ian Kent e232a5
 		printf("%s: can't increase open file limit - continuing",
Ian Kent e232a5
-			argv[0]);
Ian Kent e232a5
+			program);
Ian Kent e232a5
 
Ian Kent e232a5
 #if ENABLE_CORES
Ian Kent e232a5
 	rlim.rlim_cur = RLIM_INFINITY;
Ian Kent e232a5
@@ -2074,7 +2105,7 @@ int main(int argc, char *argv[])
Ian Kent e232a5
 	res = setrlimit(RLIMIT_CORE, &rlim);
Ian Kent e232a5
 	if (res)
Ian Kent e232a5
 		printf("%s: can't increase core file limit - continuing",
Ian Kent e232a5
-			argv[0]);
Ian Kent e232a5
+			program);
Ian Kent e232a5
 #endif
Ian Kent e232a5
 
Ian Kent e232a5
 	if (argc == 0)
Ian Kent e232a5
@@ -2097,7 +2128,7 @@ int main(int argc, char *argv[])
Ian Kent e232a5
 		nc = cache_init_null_cache(master_list);
Ian Kent e232a5
 		if (!nc) {
Ian Kent e232a5
 			printf("%s: failed to init null map cache for %s",
Ian Kent e232a5
-				master_list->name, argv[0]);
Ian Kent e232a5
+				program, master_list->name);
Ian Kent e232a5
 			exit(1);
Ian Kent e232a5
 		}
Ian Kent e232a5
 		master_list->nc = nc;