2004-12-22 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

	* watchquagga.c: Add -b option to circumvent difficulties passing
	  embedded spaces in command-line arguments.  This is an ugly hack,
	  we should probably use a config file instead.
diff --git a/watchquagga/ChangeLog b/watchquagga/ChangeLog
index cc9ac22..d3c4b72 100644
--- a/watchquagga/ChangeLog
+++ b/watchquagga/ChangeLog
@@ -1,5 +1,11 @@
 2004-12-22 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
+	* watchquagga.c: Add -b option to circumvent difficulties passing
+	  embedded spaces in command-line arguments.  This is an ugly hack,
+	  we should probably use a config file instead.
+
+2004-12-22 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
 	* watchquagga.c: Use new config.h define for DAEMON_VTY_DIR.
 
 2004-12-22 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
diff --git a/watchquagga/watchquagga.c b/watchquagga/watchquagga.c
index e16b9c2..6db2f56 100644
--- a/watchquagga/watchquagga.c
+++ b/watchquagga/watchquagga.c
@@ -1,5 +1,5 @@
 /*
-    $Id: watchquagga.c,v 1.3 2004/12/22 15:37:44 ajs Exp $
+    $Id: watchquagga.c,v 1.4 2004/12/22 16:17:16 ajs Exp $
 
     Monitor status of quagga daemons and restart if necessary.
 
@@ -211,6 +211,7 @@
   { "min-restart-interval", required_argument, NULL, 'm'},
   { "max-restart-interval", required_argument, NULL, 'M'},
   { "pid-file", required_argument, NULL, 'p'},
+  { "blank-string", required_argument, NULL, 'b'},
   { "help", no_argument, NULL, 'h'},
   { "version", no_argument, NULL, 'v'},
   { NULL, 0, NULL, 0 }
@@ -324,6 +325,11 @@
 		Requires -r, -s, and -k.\n\
 -p, --pid-file	Set process identifier file name\n\
 		(default is %s).\n\
+-b, --blank-string\n\
+		When the supplied argument string is found in any of the\n\
+		various shell command arguments (-r, -s, -k, or -R), replace\n\
+		it with a space.  This is an ugly hack to circumvent problems\n\
+		passing command-line arguments with embedded spaces.\n\
 -v, --version	Print program version\n\
 -h, --help	Display this help and exit\n\
 ", progname,mode_str[0],progname,mode_str[1],progname,mode_str[2],
@@ -1014,6 +1020,29 @@
   return ((p = strchr(cmd,'%')) != NULL) && (*(p+1) == 's') && !strchr(p+1,'%');
 }
 
+/* This is an ugly hack to circumvent problems with passing command-line
+   arguments that contain spaces.  The fix is to use a configuration file. */
+static char *
+translate_blanks(const char *cmd, const char *blankstr)
+{
+  char *res;
+  char *p;
+  size_t bslen = strlen(blankstr);
+
+  if (!(res = strdup(cmd)))
+    {
+      perror("strdup");
+      exit(1);
+    }
+  while ((p = strstr(res,blankstr)) != NULL)
+    {
+      *p = ' ';
+      if (bslen != 1)
+	 memmove(p+1,p+bslen,strlen(p+bslen)+1);
+    }
+  return res;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -1022,6 +1051,7 @@
   int daemon_mode = 0;
   const char *pidfile = DEFAULT_PIDFILE;
   const char *special = "zebra";
+  const char *blankstr = NULL;
   static struct quagga_signal_t my_signals[] =
   {
     {
@@ -1043,7 +1073,7 @@
   else
     progname = argv[0];
 
-  while ((opt = getopt_long(argc, argv, "aAdek:l:m:M:i:p:r:R:S:s:t:T:zvh",
+  while ((opt = getopt_long(argc, argv, "aAb:dek:l:m:M:i:p:r:R:S:s:t:T:zvh",
 			    longopts, 0)) != EOF)
     {
       switch (opt)
@@ -1066,6 +1096,9 @@
 	    }
 	  gs.mode = MODE_PHASED_ALL_RESTART;
 	  break;
+	case 'b':
+	  blankstr = optarg;
+	  break;
         case 'd':
 	  daemon_mode = 1;
 	  break;
@@ -1253,6 +1286,16 @@
       break;
     }
 
+  if (blankstr)
+    {
+      if (gs.restart_command)
+        gs.restart_command = translate_blanks(gs.restart_command,blankstr);
+      if (gs.start_command)
+        gs.start_command = translate_blanks(gs.start_command,blankstr);
+      if (gs.stop_command)
+        gs.stop_command = translate_blanks(gs.stop_command,blankstr);
+    }
+      
   gs.restart.interval = gs.min_restart_interval;
   master = thread_master_create();
   signal_init (master, Q_SIGC(my_signals), my_signals);