add new | syntax.

syntax will change.
This commit is contained in:
rsc 2005-01-04 22:41:27 +00:00
parent 02f38ca68c
commit 9aa1c92f74
19 changed files with 281 additions and 83 deletions

View file

@ -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);
}