Josh and I were discussing this over IRC. Here's an alternative patch I
came up with. It relies on the shell that executes st to parse the
arguments, so you can't run a command like st -e "touch arst", you have
to run st -e touch arst. This also means you can't have any st arguments
after the -e because they'll all be included in the command to run.
xterm also has this restriction, although for some reason it's "smart"
enough to run xterm -e "touch arst" correctly.
On 11/26/2010 05:57 PM, Josh Rickmar wrote:
> Here's a quick fix to pass the opt_cmd to $SHELL -c, which fixes a
> bug where you couldn't call -e with a command with spaces (arguments
> to that command).
>
> I earlier tried to pass the command directly to execvp() by using
> strsep to set args, but the code turned out to be far too complex
> (I think).
diff -r c4ef5533a330 st.c
--- a/st.c Fri Nov 26 22:12:54 2010 +0100
+++ b/st.c Fri Nov 26 18:33:02 2010 -0500
@@ -247,7 +247,7 @@
static int cmdfd;
static pid_t pid;
static Selection sel;
-static char *opt_cmd = NULL;
+static char **opt_cmd = NULL;
static char *opt_title = NULL;
static char *opt_class = NULL;
@@ -546,12 +546,11 @@
void
execsh(void) {
char *args[] = {getenv("SHELL"), "-i", NULL};
+ putenv("TERM="TNAME);
if(opt_cmd)
- args[0] = opt_cmd, args[1] = NULL;
+ execvp(opt_cmd[0], opt_cmd);
else
- DEFAULT(args[0], SHELL);
- putenv("TERM="TNAME);
- execvp(args[0], args);
+ execvp(args[0], args);
}
void
@@ -1845,12 +1844,13 @@
if(++i < argc) opt_class = argv[i];
break;
case 'e':
- if(++i < argc) opt_cmd = argv[i];
+ if(++i < argc) opt_cmd = &argv[i];
break;
case 'v':
default:
die(USAGE);
}
+ if (opt_cmd) break;
}
setlocale(LC_CTYPE, "");
tnew(80, 24);