add new | syntax.
syntax will change.
This commit is contained in:
parent
02f38ca68c
commit
9aa1c92f74
19 changed files with 281 additions and 83 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue