diff options
author | rsc <devnull@localhost> | 2005-01-04 22:41:27 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-01-04 22:41:27 +0000 |
commit | 9aa1c92f743a7bf2ac0b062b0c075dc610b3e335 (patch) | |
tree | e3be39332a1893959b3257aa797a65740fc1c1ec /src/cmd/mk | |
parent | 02f38ca68ce484b2aad15fad4d59c4d43ef7eb1b (diff) | |
download | plan9port-9aa1c92f743a7bf2ac0b062b0c075dc610b3e335.tar.gz plan9port-9aa1c92f743a7bf2ac0b062b0c075dc610b3e335.tar.bz2 plan9port-9aa1c92f743a7bf2ac0b062b0c075dc610b3e335.zip |
add new | syntax.
syntax will change.
Diffstat (limited to 'src/cmd/mk')
-rw-r--r-- | src/cmd/mk/fns.h | 17 | ||||
-rw-r--r-- | src/cmd/mk/graph.c | 2 | ||||
-rw-r--r-- | src/cmd/mk/lex.c | 6 | ||||
-rw-r--r-- | src/cmd/mk/main.c | 1 | ||||
-rw-r--r-- | src/cmd/mk/match.c | 4 | ||||
-rw-r--r-- | src/cmd/mk/mk.c | 6 | ||||
-rw-r--r-- | src/cmd/mk/mk.h | 23 | ||||
-rw-r--r-- | src/cmd/mk/mkfile.test | 15 | ||||
-rw-r--r-- | src/cmd/mk/parse.c | 40 | ||||
-rw-r--r-- | src/cmd/mk/rc.c | 35 | ||||
-rw-r--r-- | src/cmd/mk/rule.c | 7 | ||||
-rw-r--r-- | src/cmd/mk/run.c | 6 | ||||
-rw-r--r-- | src/cmd/mk/sh.c | 41 | ||||
-rw-r--r-- | src/cmd/mk/shell.c | 76 | ||||
-rw-r--r-- | src/cmd/mk/shprint.c | 4 | ||||
-rw-r--r-- | src/cmd/mk/sys.std.h | 22 | ||||
-rw-r--r-- | src/cmd/mk/unix.c | 53 | ||||
-rw-r--r-- | src/cmd/mk/varsub.c | 4 | ||||
-rw-r--r-- | src/cmd/mk/word.c | 2 |
19 files changed, 281 insertions, 83 deletions
diff --git a/src/cmd/mk/fns.h b/src/cmd/mk/fns.h index 0a084a65..8df159e3 100644 --- a/src/cmd/mk/fns.h +++ b/src/cmd/mk/fns.h @@ -11,10 +11,8 @@ void atouch(char*); void bufcpy(Bufblock *, char *, int); Envy *buildenv(Job*, int); void catchnotes(void); -char *charin(char *, char *); int chgtime(char*); void clrmade(Node*); -char *copyq(char*, Rune, Bufblock*); void delete(char*); void delword(Word*); int dorecipe(Node*); @@ -24,24 +22,23 @@ void dumpn(char*, Node*); void dumpr(char*, Rule*); void dumpv(char*); void dumpw(char*, Word*); -int escapetoken(Biobuf*, Bufblock*, int, int); void execinit(void); -int execsh(char*, char*, Bufblock*, Envy*); +int execsh(char*, char*, Bufblock*, Envy*, Shell*, Word*); void Exit(void); -char *expandquote(char*, Rune, Bufblock*); void expunge(int, char*); void freebuf(Bufblock*); void front(char*); Node *graph(char*); void growbuf(Bufblock *); void initenv(void); +void initshell(void); void insert(Bufblock *, int); void ipop(void); void ipush(void); void killchildren(char*); void *Malloc(int); char *maketmp(int*); -int match(char*, char*, char*); +int match(char*, char*, char*, Shell*); char *membername(char*, int, char*); void mk(char*); ulong mkmtime(char*); @@ -56,17 +53,21 @@ void nproc(void); void nrep(void); int outofdate(Node*, Arc*, int); void parse(char*, int, int); -int pipecmd(char*, Envy*, int*); +int pipecmd(char*, Envy*, int*, Shell*, Word*); +void popshell(void); void prusage(void); +void pushshell(void); void rcopy(char**, Resub*, int); void readenv(void); void *Realloc(void*, int); void rinsert(Bufblock *, Rune); char *rulecnt(void); void run(Job*); +char *setshell(Word*); void setvar(char*, void*); +int shargv(Word*, int, char***); char *shname(char*); -void shprint(char*, Envy*, Bufblock*); +void shprint(char*, Envy*, Bufblock*, Shell*); Word *stow(char*); void subst(char*, char*, char*); void symdel(char*, int); diff --git a/src/cmd/mk/graph.c b/src/cmd/mk/graph.c index fdb02881..80721237 100644 --- a/src/cmd/mk/graph.c +++ b/src/cmd/mk/graph.c @@ -84,7 +84,7 @@ applyrules(char *target, char *cnt) if(regexec(r->pat, node->name, rmatch, NREGEXP) == 0) continue; } else { - if(!match(node->name, r->target, stem)) continue; + if(!match(node->name, r->target, stem, r->shellt)) continue; } if(cnt[r->rule] >= nreps) continue; cnt[r->rule]++; diff --git a/src/cmd/mk/lex.c b/src/cmd/mk/lex.c index 3ee244f1..6fd7b5c7 100644 --- a/src/cmd/mk/lex.c +++ b/src/cmd/mk/lex.c @@ -28,7 +28,7 @@ assline(Biobuf *bp, Bufblock *buf) case '\'': case '"': rinsert(buf, c); - if (escapetoken(bp, buf, 1, c) == 0) + if (shellt->escapetoken(bp, buf, 1, c) == 0) Exit(); break; case '`': @@ -87,14 +87,14 @@ bquote(Biobuf *bp, Bufblock *buf) insert(buf,0); buf->current = buf->start+start; execinit(); - execsh(0, buf->current, buf, envy); + execsh(0, buf->current, buf, envy, shellt, shellcmd); return 1; } if(c == '\n') break; if(c == '\'' || c == '"' || c == '\\'){ insert(buf, c); - if(!escapetoken(bp, buf, 1, c)) + if(!shellt->escapetoken(bp, buf, 1, c)) return 0; continue; } diff --git a/src/cmd/mk/main.c b/src/cmd/mk/main.c index fdd94777..645eb7ae 100644 --- a/src/cmd/mk/main.c +++ b/src/cmd/mk/main.c @@ -39,6 +39,7 @@ main(int argc, char **argv) * instead of sharing them */ + initshell(); Binit(&bout, 1, OWRITE); buf = newbuf(); whatif = 0; diff --git a/src/cmd/mk/match.c b/src/cmd/mk/match.c index 2a96394a..270621fb 100644 --- a/src/cmd/mk/match.c +++ b/src/cmd/mk/match.c @@ -1,7 +1,7 @@ #include "mk.h" int -match(char *name, char *template, char *stem) +match(char *name, char *template, char *stem, Shell *sh) { Rune r; int n; @@ -24,7 +24,7 @@ match(char *name, char *template, char *stem) strncpy(stem, name, n); stem[n] = 0; if(*template == '&') - return !charin(stem, "./"); + return !sh->charin(stem, "./"); return 1; } diff --git a/src/cmd/mk/mk.c b/src/cmd/mk/mk.c index 9ab4c538..dbb74992 100644 --- a/src/cmd/mk/mk.c +++ b/src/cmd/mk/mk.c @@ -192,14 +192,14 @@ update(int fake, Node *node) } static int -pcmp(char *prog, char *p, char *q) +pcmp(char *prog, char *p, char *q, Shell *sh, Word *shcmd) { char buf[3*NAMEBLOCK]; int pid; Bflush(&bout); snprint(buf, sizeof buf, "%s '%s' '%s'\n", prog, p, q); - pid = pipecmd(buf, 0, 0); + pid = pipecmd(buf, 0, 0, sh, shcmd); while(waitup(-3, &pid) >= 0) ; return(pid? 2:1); @@ -219,7 +219,7 @@ outofdate(Node *node, Arc *arc, int eval) if(sym == 0 || eval){ if(sym == 0) str = strdup(buf); - ret = pcmp(arc->prog, node->name, arc->n->name); + ret = pcmp(arc->prog, node->name, arc->n->name, arc->r->shellt, arc->r->shellcmd); if(sym) sym->value = (void *)ret; else diff --git a/src/cmd/mk/mk.h b/src/cmd/mk/mk.h index 33402de0..81f9d70c 100644 --- a/src/cmd/mk/mk.h +++ b/src/cmd/mk/mk.h @@ -26,6 +26,18 @@ typedef struct Envy extern Envy *envy; +typedef struct Shell +{ + char *name; + char *termchars; /* used in parse.c to isolate assignment attribute */ + int iws; /* inter-word separator in environment */ + char *(*charin)(char*, char*); /* search for unescaped characters */ + char *(*expandquote)(char*, Rune, Bufblock*); /* extract escaped token */ + int (*escapetoken)(Biobuf*, Bufblock*, int, int); /* input escaped token */ + char *(*copyq)(char*, Rune, Bufblock*); /* check for quoted strings */ + int (*matchname)(char*); /* does name match */ +} Shell; + typedef struct Rule { char *target; /* one target */ @@ -40,6 +52,8 @@ typedef struct Rule char *prog; /* to use in out of date */ struct Rule *chain; /* hashed per target */ struct Rule *next; + Shell *shellt; /* shell to use with this rule */ + Word *shellcmd; } Rule; extern Rule *rules, *metarules, *patrule; @@ -143,11 +157,10 @@ extern int mkinline; extern char *infile; extern int nreps; extern char *explain; -extern char *termchars; -extern int IWS; -extern char *shell; -extern char *shellname; -extern char *shflags; +extern Shell *shellt; +extern Word *shellcmd; + +extern Shell shshell, rcshell; #define SYNERR(l) (fprint(2, "mk: %s:%d: syntax error; ", infile, ((l)>=0)?(l):mkinline)) #define RERR(r) (fprint(2, "mk: %s:%d: rule error; ", (r)->file, (r)->line)) diff --git a/src/cmd/mk/mkfile.test b/src/cmd/mk/mkfile.test index 5c1c0eda..b5bd6dbb 100644 --- a/src/cmd/mk/mkfile.test +++ b/src/cmd/mk/mkfile.test @@ -1,5 +1,12 @@ -a: b - cp b a +|$PLAN9/bin/rc +use-rc:V: + for(i in a b c) + echo $i + +|/bin/sh +use-sh:V: + for i in a b c + do + echo $i + done -c:V: - echo hello world diff --git a/src/cmd/mk/parse.c b/src/cmd/mk/parse.c index b7737ef9..2d1816b9 100644 --- a/src/cmd/mk/parse.c +++ b/src/cmd/mk/parse.c @@ -17,11 +17,13 @@ parse(char *f, int fd, int varoverride) int newfd; Biobuf in; Bufblock *buf; + char *err; if(fd < 0){ fprint(2, "open %s: %r\n", f); Exit(); } + pushshell(); ipush(); infile = strdup(f); mkinline = 1; @@ -52,7 +54,7 @@ parse(char *f, int fd, int varoverride) Exit(); } execinit(); - pid=pipecmd(p, envy, &newfd); + pid=pipecmd(p, envy, &newfd, shellt, shellcmd); if(newfd < 0){ fprint(2, "warning: skipping missing program file %s: %r\n", p); } else @@ -93,6 +95,14 @@ cp = wtos(tail, ' '); print("assign %s to %s\n", head->s, cp); free(cp); if(attr) symlook(head->s, S_NOEXPORT, (void *)""); break; + case 'S': + if((err = setshell(tail)) != nil){ + SYNERR(hline); + fprint(2, "%s\n", err); + Exit(); + break; + } + break; default: SYNERR(hline); fprint(2, "expected one of :<=\n"); @@ -103,6 +113,7 @@ cp = wtos(tail, ' '); print("assign %s to %s\n", head->s, cp); free(cp); close(fd); freebuf(buf); ipop(); + popshell(); } void @@ -114,7 +125,7 @@ addrules(Word *head, Word *tail, char *body, int attr, int hline, char *prog) /* tuck away first non-meta rule as default target*/ if(target1 == 0 && !(attr®EXP)){ for(w = head; w; w = w->next) - if(charin(w->s, "%&")) + if(shellt->charin(w->s, "%&")) break; if(w == 0) target1 = wdup(head); @@ -133,19 +144,24 @@ rhead(char *line, Word **h, Word **t, int *attr, char **prog) int n; Word *w; - p = charin(line,":=<"); - if(p == 0) - return('?'); - sep = *p; - *p++ = 0; - if(sep == '<' && *p == '|'){ - sep = '|'; - p++; + if(*line == '|'){ + sep = 'S'; /* shell */ + p = line+1; + }else{ + p = shellt->charin(line,":=<"); + if(p == 0) + return('?'); + sep = *p; + *p++ = 0; + if(sep == '<' && *p == '|'){ + sep = '|'; + p++; + } } *attr = 0; *prog = 0; if(sep == '='){ - pp = charin(p, termchars); /* termchars is shell-dependent */ + pp = shellt->charin(p, shellt->termchars); /* termchars is shell-dependent */ if (pp && *pp == '=') { while (p != pp) { n = chartorune(&r, p); @@ -219,7 +235,7 @@ rhead(char *line, Word **h, Word **t, int *attr, char **prog) } } *h = w = stow(line); - if(*w->s == 0 && sep != '<' && sep != '|') { + if(*w->s == 0 && sep != '<' && sep != '|' && sep != 'S') { SYNERR(mkinline-1); fprint(2, "no var on left side of assignment/rule\n"); Exit(); diff --git a/src/cmd/mk/rc.c b/src/cmd/mk/rc.c index 657ddf27..53f5d5a5 100644 --- a/src/cmd/mk/rc.c +++ b/src/cmd/mk/rc.c @@ -1,9 +1,5 @@ #include "mk.h" -char *termchars = "'= \t"; /*used in parse.c to isolate assignment attribute*/ -char *shflags = "-I"; /* rc flag to force non-interactive mode */ -int IWS = '\1'; /* inter-word separator in env - not used in plan 9 */ - /* * This file contains functions that depend on rc's syntax. Most * of the routines extract strings observing rc's escape conventions @@ -38,7 +34,7 @@ squote(char *cp) * characters in quotes and variable generators are escaped */ char * -charin(char *cp, char *pat) +rccharin(char *cp, char *pat) { Rune r; int n, vargen; @@ -82,7 +78,7 @@ charin(char *cp, char *pat) * others are just inserted into the receiving buffer. */ char* -expandquote(char *s, Rune r, Bufblock *b) +rcexpandquote(char *s, Rune r, Bufblock *b) { if (r != '\'') { rinsert(b, r); @@ -108,7 +104,7 @@ expandquote(char *s, Rune r, Bufblock *b) * rc; the others are just inserted into the receiving buffer. */ int -escapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc) +rcescapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc) { int c, line; @@ -155,7 +151,7 @@ copysingle(char *s, Bufblock *buf) * s points to char after opening quote, q. */ char * -copyq(char *s, Rune q, Bufblock *buf) +rccopyq(char *s, Rune q, Bufblock *buf) { if(q == '\'') /* copy quoted string */ return copysingle(s, buf); @@ -173,3 +169,26 @@ copyq(char *s, Rune q, Bufblock *buf) } return s; } + +static int +rcmatchname(char *name) +{ + char *p; + + if((p = strchr(name, '/')) != nil) + name = p+1; + if(name[0] == 'r' && name[1] == 'c') + return 1; + return 0; +} + +Shell rcshell = { + "rc", + "'= \t", + '\1', + rccharin, + rcexpandquote, + rcescapetoken, + rccopyq, + rcmatchname, +}; diff --git a/src/cmd/mk/rule.c b/src/cmd/mk/rule.c index 662f067f..d73595d2 100644 --- a/src/cmd/mk/rule.c +++ b/src/cmd/mk/rule.c @@ -23,6 +23,8 @@ addrule(char *head, Word *tail, char *body, Word *ahead, int attr, int hline, ch } if(r == 0) r = (Rule *)Malloc(sizeof(Rule)); + r->shellt = shellt; + r->shellcmd = shellcmd; r->target = head; r->tail = tail; r->recipe = body; @@ -42,7 +44,7 @@ addrule(char *head, Word *tail, char *body, Word *ahead, int attr, int hline, ch } if(!reuse) r->next = 0; - if((attr®EXP) || charin(head, "%&")){ + if((attr®EXP) || shellt->charin(head, "%&")){ r->attr |= META; if(reuse) return; @@ -72,7 +74,8 @@ addrule(char *head, Word *tail, char *body, Word *ahead, int attr, int hline, ch void dumpr(char *s, Rule *r) { - Bprint(&bout, "%s: start=%ld\n", s, r); + Bprint(&bout, "%s: start=%ld shelltype=%s shellcmd=%s\n", + s, r, r->shellt->name, wtos(r->shellcmd, ' ')); for(; r; r = r->next){ Bprint(&bout, "\tRule %ld: %s[%d] attr=%x next=%ld chain=%ld alltarget='%s'", r, r->file, r->line, r->attr, r->next, r->chain, wtos(r->alltargets, ' ')); diff --git a/src/cmd/mk/run.c b/src/cmd/mk/run.c index 3c0c7f3e..439cc0a5 100644 --- a/src/cmd/mk/run.c +++ b/src/cmd/mk/run.c @@ -59,7 +59,7 @@ sched(void) events[slot].job = j; buf = newbuf(); e = buildenv(j, slot); - shprint(j->r->recipe, e, buf); + shprint(j->r->recipe, e, buf, j->r->shellt); if(!tflag && (nflag || !(j->r->attr&QUIET))) Bwrite(&bout, buf->start, (long)strlen(buf->start)); freebuf(buf); @@ -82,7 +82,7 @@ sched(void) flags = 0; else flags = "-e"; - events[slot].pid = execsh(flags, j->r->recipe, 0, e); + events[slot].pid = execsh(flags, j->r->recipe, 0, e, j->r->shellt, j->r->shellcmd); usage(); nrunning++; if(DEBUG(D_EXEC)) @@ -145,7 +145,7 @@ again: /* rogue processes */ if(buf[0]){ e = buildenv(j, slot); bp = newbuf(); - shprint(j->r->recipe, e, bp); + shprint(j->r->recipe, e, bp, j->r->shellt); front(bp->start); fprint(2, "mk: %s: exit status=%s", bp->start, buf); freebuf(bp); diff --git a/src/cmd/mk/sh.c b/src/cmd/mk/sh.c index 524167a5..ba80162b 100644 --- a/src/cmd/mk/sh.c +++ b/src/cmd/mk/sh.c @@ -1,9 +1,5 @@ #include "mk.h" -char *termchars = "\"'= \t"; /*used in parse.c to isolate assignment attribute*/ -char *shflags = 0; -int IWS = ' '; /* inter-word separator in env */ - /* * This file contains functions that depend on the shell's syntax. Most * of the routines extract strings observing the shell's escape conventions. @@ -34,8 +30,8 @@ squote(char *cp, int c) /* * search a string for unescaped characters in a pattern set */ -char * -charin(char *cp, char *pat) +static char * +shcharin(char *cp, char *pat) { Rune r; int n, vargen; @@ -82,8 +78,8 @@ charin(char *cp, char *pat) * extract an escaped token. Possible escape chars are single-quote, * double-quote,and backslash. */ -char* -expandquote(char *s, Rune esc, Bufblock *b) +static char* +shexpandquote(char *s, Rune esc, Bufblock *b) { Rune r; @@ -110,8 +106,8 @@ expandquote(char *s, Rune esc, Bufblock *b) * Input an escaped token. Possible escape chars are single-quote, * double-quote and backslash. */ -int -escapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc) +static int +shescapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc) { int c, line; @@ -168,8 +164,8 @@ copysingle(char *s, Rune q, Bufblock *buf) * check for quoted strings. backquotes are handled here; single quotes above. * s points to char after opening quote, q. */ -char * -copyq(char *s, Rune q, Bufblock *buf) +static char * +shcopyq(char *s, Rune q, Bufblock *buf) { if(q == '\'' || q == '"') /* copy quoted string */ return copysingle(s, q, buf); @@ -187,3 +183,24 @@ copyq(char *s, Rune q, Bufblock *buf) } return s; } + +static int +shmatchname(char *name) +{ + USED(name); + + return 1; +} + + +Shell shshell = { + "sh", + "\"'= \t", /*used in parse.c to isolate assignment attribute*/ + ' ', /* inter-word separator in env */ + shcharin, + shexpandquote, + shescapetoken, + shcopyq, + shmatchname, +}; + diff --git a/src/cmd/mk/shell.c b/src/cmd/mk/shell.c new file mode 100644 index 00000000..a4ac3f93 --- /dev/null +++ b/src/cmd/mk/shell.c @@ -0,0 +1,76 @@ +#include "mk.h" + +static Shell *shells[] = { + &shshell, + &rcshell +}; + +Shell *shellt; +Word *shellcmd; + +typedef struct Shellstack Shellstack; +struct Shellstack +{ + Shell *t; + Word *w; + Shellstack *next; +}; + +Shellstack *shellstack; + +char* +setshell(Word *w) +{ + int i; + + if(w->s == nil) + return "shell name not found on line"; + + for(i=0; i<nelem(shells); i++) + if(shells[i]->matchname(w->s)) + break; + if(i == nelem(shells)) + return "cannot determine shell type"; + shellt = shells[i]; + shellcmd = w; + return nil; +} + +void +initshell(void) +{ + shellcmd = stow(shells[0]->name); + shellt = shells[0]; +} + +void +pushshell(void) +{ + Shellstack *s; + + /* save */ + s = Malloc(sizeof *s); + s->t = shellt; + s->w = shellcmd; + s->next = shellstack; + shellstack = s; + + initshell(); /* reset to defaults */ +} + +void +popshell(void) +{ + Shellstack *s; + + if(shellstack == nil){ + fprint(2, "internal shellstack error\n"); + Exit(); + } + + s = shellstack; + shellstack = s->next; + shellt = s->t; + shellcmd = s->w; + free(s); +} diff --git a/src/cmd/mk/shprint.c b/src/cmd/mk/shprint.c index 7cfa5f4c..eb12fabc 100644 --- a/src/cmd/mk/shprint.c +++ b/src/cmd/mk/shprint.c @@ -40,7 +40,7 @@ getfields(char *str, char **args, int max, int mflag, char *set) } void -shprint(char *s, Envy *env, Bufblock *buf) +shprint(char *s, Envy *env, Bufblock *buf, Shell *sh) { int n; Rune r; @@ -52,7 +52,7 @@ shprint(char *s, Envy *env, Bufblock *buf) else { rinsert(buf, r); s += n; - s = copyq(s, r, buf); /*handle quoted strings*/ + s = sh->copyq(s, r, buf); /*handle quoted strings*/ } } insert(buf, 0); diff --git a/src/cmd/mk/sys.std.h b/src/cmd/mk/sys.std.h new file mode 100644 index 00000000..836d7ad7 --- /dev/null +++ b/src/cmd/mk/sys.std.h @@ -0,0 +1,22 @@ +#include <utf.h> +#include <fmt.h> +#include <bio.h> +#include <regexp9.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <ctype.h> +#include <time.h> + +#define OREAD O_RDONLY +#define OWRITE O_WRONLY +#define ORDWR O_RDWR +#define nil 0 +#define nelem(x) sizeof((x)/sizeof((x)[0])) +#define seek lseek +#define remove unlink +#define exits(x) exit(x && *(char*)x ? 1 : 0) +#define USED(x) if(x){}else +#define create(name, mode, perm) open(name, mode|O_CREAT, perm) +#define ERRMAX 256 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); } diff --git a/src/cmd/mk/varsub.c b/src/cmd/mk/varsub.c index 2a9ad987..5b7c984a 100644 --- a/src/cmd/mk/varsub.c +++ b/src/cmd/mk/varsub.c @@ -103,7 +103,7 @@ expandvar(char **s) return 0; } cp++; - end = charin(cp , "}"); + end = shellt->charin(cp , "}"); if(end == 0){ SYNERR(-1); fprint(2, "missing '}': %s\n", begin); @@ -128,7 +128,7 @@ extractpat(char *s, char **r, char *term, char *end) char *cp; Word *w; - cp = charin(s, term); + cp = shellt->charin(s, term); if(cp){ *r = cp; if(cp == s) diff --git a/src/cmd/mk/word.c b/src/cmd/mk/word.c index ac34c47b..b0e344ea 100644 --- a/src/cmd/mk/word.c +++ b/src/cmd/mk/word.c @@ -114,7 +114,7 @@ nextword(char **s) case '\\': case '\'': case '"': - cp = expandquote(cp, r, b); + cp = shellt->expandquote(cp, r, b); if(cp == 0){ fprint(2, "missing closing quote: %s\n", *s); Exit(); |