acme: add $acmeshell to control execution shell

R=rsc
CC=plan9port.codebot
http://codereview.appspot.com/6614056
diff --git a/man/man1/acme.1 b/man/man1/acme.1
index 2d24f33..3dc1f2a 100644
--- a/man/man1/acme.1
+++ b/man/man1/acme.1
@@ -533,6 +533,12 @@
 set to the window's id number
 (see
 .IR acme (4)).
+.PP
+The environment variable
+.B $acmeshell
+determines which shell is used to execute such commands; the
+.IR rc (1)
+shell is used by default. 
 .SS "Mouse button 3
 Pointing at text with button 3 instructs
 .I acme
diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c
index 740f361..75745af 100644
--- a/src/cmd/acme/acme.c
+++ b/src/cmd/acme/acme.c
@@ -133,6 +133,9 @@
 	cputype = getenv("cputype");
 	objtype = getenv("objtype");
 	home = getenv("HOME");
+	acmeshell = getenv("acmeshell");
+	if(acmeshell && *acmeshell == '\0')
+		acmeshell = nil;
 	p = getenv("tabstop");
 	if(p != nil){
 		maxtab = strtoul(p, nil, 0);
diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h
index 0539d1a..72860db 100644
--- a/src/cmd/acme/dat.h
+++ b/src/cmd/acme/dat.h
@@ -535,6 +535,7 @@
 char			*cputype;
 char			*objtype;
 char			*home;
+char			*acmeshell;
 char			*fontnames[2];
 Image		*tagcols[NCOL];
 Image		*textcols[NCOL];
diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c
index 8262be4..81a2fcd 100644
--- a/src/cmd/acme/exec.c
+++ b/src/cmd/acme/exec.c
@@ -1358,6 +1358,7 @@
 	char *rcarg[4];
 	void **argv;
 	CFsys *fs;
+	char *shell;
 
 	threadsetname("runproc");
 
@@ -1467,6 +1468,8 @@
 
 	if(argaddr)
 		putenv("acmeaddr", argaddr);
+	if(acmeshell != nil)
+		goto Hard;
 	if(strlen(t) > sizeof buf-10)	/* may need to print into stack */
 		goto Hard;
 	inarg = FALSE;
@@ -1576,7 +1579,10 @@
 		chdir(dir);	/* ignore error: probably app. window */
 		free(dir);
 	}
-	rcarg[0] = "rc";
+	shell = acmeshell;
+	if(shell == nil)
+		shell = "rc";
+	rcarg[0] = shell;
 	rcarg[1] = "-c";
 	rcarg[2] = t;
 	rcarg[3] = nil;
@@ -1590,7 +1596,7 @@
 			sendul(cpid, ret);
 		threadexits(nil);
 	}
-	warning(nil, "exec rc: %r\n");
+	warning(nil, "exec %s: %r\n", shell);
 
    Fail:
 	/* threadexec hasn't happened, so send a zero */