ratpoison-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RP] [RFC PATCH 1/2] actions.c: make spawn() parse the arguments when ra


From: Ali Gholami Rudi
Subject: [RP] [RFC PATCH 1/2] actions.c: make spawn() parse the arguments when raw is 1
Date: Wed, 19 Nov 2008 11:52:18 +0330
User-agent: Mutt/1.5.18 (2008-05-17)

Currently when raw argument is set, spawn fails if cmd contains
arguments.  This patch parses the arguments but doesn't handle escaped
spaces and quoted strings.
---
 src/actions.c |   36 ++++++++++++++++++++++++++++++++++--
 1 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/actions.c b/src/actions.c
index ab5162e..12eddd3 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -2574,11 +2574,39 @@ cmd_execf (int interactive, struct cmdarg **args)
   return cmdret_new (RET_SUCCESS, NULL);
 }
 
+#define MAXARGCNT      16
+#define MAXARGLEN      64
+
+static char args_cache[MAXARGCNT][MAXARGLEN];
+static char *args_result[MAXARGCNT + 1];
+
+static char **
+mkexecargs(char *str)
+{
+  int i;
+  for (i = 0; i < MAXARGCNT - 1; i++)
+    {
+      char *to = args_cache[i];
+      char *end = args_cache[i] + MAXARGLEN - 1;
+      while (isspace (*str))
+       str++;
+      if (!*str)
+       break;
+      while (*str && to < end && !isspace (*str))
+       *to++ = *str++;
+      *to = '\0';
+      args_result[i] = args_cache[i];
+    }
+  args_result[i] = NULL;
+  return args_result;
+}
+
 int
 spawn(char *cmd, int raw, rp_frame *frame)
 {
   rp_child_info *child;
   int pid;
+  char **execargs;
 
   pid = fork();
   if (pid == 0)
@@ -2596,8 +2624,12 @@ spawn(char *cmd, int raw, rp_frame *frame)
 #endif
       /* raw means don't run it through sh.  */
       if (raw)
-        execl (cmd, cmd, NULL);
-      execl("/bin/sh", "sh", "-c", cmd, NULL);
+       {
+         execargs = mkexecargs (cmd);
+         execvp (execargs[0], execargs);
+       }
+      else
+       execl ("/bin/sh", "sh", "-c", cmd, NULL);
       _exit(EXIT_FAILURE);
     }
 
-- 
1.6.0.2.GIT





reply via email to

[Prev in Thread] Current Thread [Next in Thread]