From 86c5cb6de6644aeea3c480f66bdeb5e685aab86f Mon Sep 17 00:00:00 2001
From: Aurélien Aptel
Date: Tue, 30 Nov 2010 22:55:44 +0100
Subject: change -e behaviour and update man page.

---
 st.1 | 25 ++++++++++++++++---------
 st.c | 16 ++++++++--------
 2 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/st.1 b/st.1
index 29bdda6..f1f41a7 100644
--- a/st.1
+++ b/st.1
@@ -3,23 +3,30 @@
 st \- simple terminal
 .SH SYNOPSIS
 .B st
-.RB [ \-e " <cmd>"]
-.RB [ \-c " <class>"]
-.RB [ \-t " <title>"]
+.RB [ \-c
+.IR class ]
+.RB [ \-t 
+.IR title ]
 .RB [ \-v ]
+.RB [ \-e
+.IR cmd ]
 .SH DESCRIPTION
 .B st
 is a simple terminal emulator.
 .SH OPTIONS
 .TP
-.B \-e <cmd>
-Execute cmd instead of the shell
-.TP
-.B \-t <title>
+.B \-t title
 Overrides the default title (st)
 .TP
-.B \-c <class>
+.B \-c class
 Overrides the default class ($TERM)
 .TP
-.BI \-v
+.B \-v
 Prints version information to standard output, then exits.
+.TP
+.B \-e cmd [arguments]
+Execute cmd instead of the shell. Type your command as you would on your
+shell. If this option is used, it
+.BI "must be the last"
+on the command-line. This is the same behaviour as xterm/rxvt.
+
diff --git a/st.c b/st.c
index d43c30c..2be6772 100644
--- a/st.c
+++ b/st.c
@@ -247,7 +247,7 @@ static CSIEscape escseq;
 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;
 
@@ -547,15 +547,12 @@ void
 execsh(void) {
 	char **args;
 	char *envshell = getenv("SHELL");
-	DEFAULT(envshell, "sh");
 
-	if(opt_cmd)
-		args = (char*[]){"sh", "-c", opt_cmd, NULL};
-	else
-		args = (char*[]){envshell, "-i", NULL};
-	
+	DEFAULT(envshell, "sh");
 	putenv("TERM="TNAME);
+	args = opt_cmd ? opt_cmd : (char*[]){envshell, "-i", NULL};
 	execvp(args[0], args);
+	exit(EXIT_FAILURE);
 }
 
 void 
@@ -1855,12 +1852,15 @@ main(int argc, char *argv[]) {
 			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);
 		}
+		/* -e eats every remaining arguments */
+		if(opt_cmd)
+			break;
 	}
 	setlocale(LC_CTYPE, "");
 	tnew(80, 24);
-- 
cgit v1.2.3