aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/mk/unix.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-04 22:41:27 +0000
committerrsc <devnull@localhost>2005-01-04 22:41:27 +0000
commit9aa1c92f743a7bf2ac0b062b0c075dc610b3e335 (patch)
treee3be39332a1893959b3257aa797a65740fc1c1ec /src/cmd/mk/unix.c
parent02f38ca68ce484b2aad15fad4d59c4d43ef7eb1b (diff)
downloadplan9port-9aa1c92f743a7bf2ac0b062b0c075dc610b3e335.tar.gz
plan9port-9aa1c92f743a7bf2ac0b062b0c075dc610b3e335.tar.bz2
plan9port-9aa1c92f743a7bf2ac0b062b0c075dc610b3e335.zip
add new | syntax.
syntax will change.
Diffstat (limited to 'src/cmd/mk/unix.c')
-rw-r--r--src/cmd/mk/unix.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/src/cmd/mk/unix.c b/src/cmd/mk/unix.c
index 9e4fcea9..97356105 100644
--- a/src/cmd/mk/unix.c
+++ b/src/cmd/mk/unix.c
@@ -51,7 +51,7 @@ readenv(void)
* to exec immediately after this.
*/
void
-exportenv(Envy *e)
+exportenv(Envy *e, Shell *sh)
{
int i;
char **p;
@@ -61,7 +61,7 @@ exportenv(Envy *e)
for(i = 0; e->name; e++, i++) {
p = (char**) Realloc(p, (i+2)*sizeof(char*));
if(e->values)
- snprint(buf, sizeof buf, "%s=%s", e->name, wtos(e->values, IWS));
+ snprint(buf, sizeof buf, "%s=%s", e->name, wtos(e->values, sh->iws));
else
snprint(buf, sizeof buf, "%s=", e->name);
p[i] = strdup(buf);
@@ -102,9 +102,29 @@ expunge(int pid, char *msg)
int mypid;
int
-execsh(char *args, char *cmd, Bufblock *buf, Envy *e)
+shargv(Word *cmd, int extra, char ***pargv)
{
- char *p;
+ char **argv;
+ int i, n;
+ Word *w;
+
+ n = 0;
+ for(w=cmd; w; w=w->next)
+ n++;
+
+ argv = Malloc((n+extra+1)*sizeof(argv[0]));
+ i = 0;
+ for(w=cmd; w; w=w->next)
+ argv[i++] = w->s;
+ argv[n] = 0;
+ *pargv = argv;
+ return n;
+}
+
+int
+execsh(char *args, char *cmd, Bufblock *buf, Envy *e, Shell *sh, Word *shellcmd)
+{
+ char *p, **argv;
int tot, n, pid, in[2], out[2];
if(buf && pipe(out) < 0){
@@ -138,11 +158,11 @@ execsh(char *args, char *cmd, Bufblock *buf, Envy *e)
close(in[0]);
close(in[1]);
if (e)
- exportenv(e);
- if(shflags)
- execl(shell, shellname, shflags, args, 0);
- else
- execl(shell, shellname, args, 0);
+ exportenv(e, sh);
+ n = shargv(shellcmd, 1, &argv);
+ argv[n++] = args;
+ argv[n] = 0;
+ execvp(argv[0], argv);
mkperror(shell);
_exit(1);
}
@@ -180,9 +200,11 @@ execsh(char *args, char *cmd, Bufblock *buf, Envy *e)
}
int
-pipecmd(char *cmd, Envy *e, int *fd)
+pipecmd(char *cmd, Envy *e, int *fd, Shell *sh, Word *shellcmd)
{
int pid, pfd[2];
+ int n;
+ char **argv;
if(DEBUG(D_EXEC))
fprint(1, "pipecmd='%s'\n", cmd);/**/
@@ -203,11 +225,12 @@ pipecmd(char *cmd, Envy *e, int *fd)
close(pfd[1]);
}
if(e)
- exportenv(e);
- if(shflags)
- execl(shell, shellname, shflags, "-c", cmd, 0);
- else
- execl(shell, shellname, "-c", cmd, 0);
+ exportenv(e, sh);
+ n = shargv(shellcmd, 2, &argv);
+ argv[n++] = "-c";
+ argv[n++] = cmd;
+ argv[n] = 0;
+ execvp(argv[0], argv);
mkperror(shell);
_exit(1);
}