diff options
Diffstat (limited to 'src/cmd/mk')
-rw-r--r-- | src/cmd/mk/archive.c | 31 | ||||
-rw-r--r-- | src/cmd/mk/env.c | 2 | ||||
-rw-r--r-- | src/cmd/mk/rule.c | 2 | ||||
-rw-r--r-- | src/cmd/mk/run.c | 2 | ||||
-rw-r--r-- | src/cmd/mk/sh.c | 1 | ||||
-rw-r--r-- | src/cmd/mk/symtab.c | 10 | ||||
-rw-r--r-- | src/cmd/mk/sys.h | 1 | ||||
-rw-r--r-- | src/cmd/mk/unix.c | 24 | ||||
-rw-r--r-- | src/cmd/mk/varsub.c | 8 | ||||
-rw-r--r-- | src/cmd/mk/word.c | 2 |
10 files changed, 49 insertions, 34 deletions
diff --git a/src/cmd/mk/archive.c b/src/cmd/mk/archive.c index 01288908..5b0c1d00 100644 --- a/src/cmd/mk/archive.c +++ b/src/cmd/mk/archive.c @@ -1,6 +1,6 @@ #include "mk.h" #define ARMAG "!<arch>\n" -#define SARMAG 8 +#define SARMAG (sizeof(ARMAG) - sizeof("")) #define ARFMAG "`\n" #define SARNAME 16 @@ -102,7 +102,7 @@ atouch(char *name) LSEEK(fd, SARMAG, 0); while(read(fd, (char *)&h, sizeof(h)) == sizeof(h)){ for(i = SARNAME-1; i > 0 && h.name[i] == ' '; i--) - ; + ; h.name[i+1]=0; if(strcmp(member, h.name) == 0){ t = SARNAME-sizeof(h); /* ughgghh */ @@ -118,6 +118,18 @@ atouch(char *name) close(fd); } +static int +allspaces(char *a, int n) +{ + int i; + + for(i=0; i<n; i++) + if(a[i] != ' ') + return 0; + + return 1; +} + static void atimes(char *ar) { @@ -151,11 +163,14 @@ atimes(char *ar) if(readn(fd, name, namelen) != namelen) break; name[namelen] = 0; - }else if(memcmp(h.name, "// ", 2) == 0){ /* GNU */ + }else if(memcmp(h.name, "// ", 3) == 0){ /* GNU */ /* date, uid, gid, mode all ' ' */ - for(i=2; i<16+12+6+6+8; i++) - if(h.name[i] != ' ') - goto skip; + if(!allspaces(&h.name[3], sizeof(h.name) - 3) || + !allspaces(h.date, sizeof(h.date)) || + !allspaces(h.uid, sizeof(h.uid)) || + !allspaces(h.gid, sizeof(h.gid)) || + !allspaces(h.mode, sizeof(h.mode))) + goto skip; t = atol(h.size); if(t&01) t++; @@ -187,9 +202,9 @@ atimes(char *ar) name[namelen] = 0; namelen = 0; }else{ - strncpy(name, h.name, sizeof(h.name)); + memmove(name, h.name, sizeof(h.name)); for(i = sizeof(h.name)-1; i > 0 && name[i] == ' '; i--) - ; + ; if(name[i] == '/') /* system V bug */ i--; name[i+1]=0; diff --git a/src/cmd/mk/env.c b/src/cmd/mk/env.c index 11df34e3..d7c6481d 100644 --- a/src/cmd/mk/env.c +++ b/src/cmd/mk/env.c @@ -142,7 +142,7 @@ buildenv(Job *j, int slot) for(i = 0; *p; i++, p++){ if((j->r->attr®EXP) && j->match[i]) envupd(*p, newword(j->match[i])); - else + else envupd(*p, newword("")); } return envy; diff --git a/src/cmd/mk/rule.c b/src/cmd/mk/rule.c index 30728197..537d2d75 100644 --- a/src/cmd/mk/rule.c +++ b/src/cmd/mk/rule.c @@ -76,7 +76,7 @@ dumpr(char *s, Rule *r) { if(r == nil) return; - Bprint(&bout, "%s: start=%ld shelltype=%s shellcmd=%s\n", + 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'", diff --git a/src/cmd/mk/run.c b/src/cmd/mk/run.c index dd225c0d..6f60cede 100644 --- a/src/cmd/mk/run.c +++ b/src/cmd/mk/run.c @@ -29,7 +29,7 @@ run(Job *j) for(jj = jobs; jj->next; jj = jj->next) ; jj->next = j; - } else + } else jobs = j; j->next = 0; /* this code also in waitup after parse redirect */ diff --git a/src/cmd/mk/sh.c b/src/cmd/mk/sh.c index e2566514..d8f205c8 100644 --- a/src/cmd/mk/sh.c +++ b/src/cmd/mk/sh.c @@ -203,4 +203,3 @@ Shell shshell = { shcopyq, shmatchname }; - diff --git a/src/cmd/mk/symtab.c b/src/cmd/mk/symtab.c index 17674c43..2bb28ba8 100644 --- a/src/cmd/mk/symtab.c +++ b/src/cmd/mk/symtab.c @@ -1,7 +1,7 @@ #include "mk.h" #define NHASH 4099 -#define HASHMUL 79L /* this is a good value */ +#define HASHMUL 79UL /* this is a good value */ static Symtab *hash[NHASH]; void @@ -21,14 +21,12 @@ syminit(void) Symtab * symlook(char *sym, int space, void *install) { - long h; + ulong h; char *p; Symtab *s; for(p = sym, h = space; *p; h += *p++) h *= HASHMUL; - if(h < 0) - h = ~h; h %= NHASH; for(s = hash[h]; s; s = s->next) if((s->space == space) && (strcmp(s->name, sym) == 0)) @@ -47,7 +45,7 @@ symlook(char *sym, int space, void *install) void symdel(char *sym, int space) { - long h; + ulong h; char *p; Symtab *s, *ls; @@ -55,8 +53,6 @@ symdel(char *sym, int space) for(p = sym, h = space; *p; h += *p++) h *= HASHMUL; - if(h < 0) - h = ~h; h %= NHASH; for(s = hash[h], ls = 0; s; ls = s, s = s->next) if((s->space == space) && (strcmp(s->name, sym) == 0)){ diff --git a/src/cmd/mk/sys.h b/src/cmd/mk/sys.h index 03a9d058..f520b066 100644 --- a/src/cmd/mk/sys.h +++ b/src/cmd/mk/sys.h @@ -2,4 +2,3 @@ #include <libc.h> #include <bio.h> #include <regexp.h> - diff --git a/src/cmd/mk/unix.c b/src/cmd/mk/unix.c index c63d3cef..66bdb1ff 100644 --- a/src/cmd/mk/unix.c +++ b/src/cmd/mk/unix.c @@ -23,7 +23,7 @@ readenv(void) Word *w; for(p = environ; *p; p++){ -/* rsc 5/5/2004 -- This misparses fn#cd={whatever} +/* rsc 5/5/2004 -- This misparses fn#cd={whatever} s = shname(*p); if(*s == '=') { *s = 0; @@ -53,20 +53,26 @@ readenv(void) void exportenv(Envy *e, Shell *sh) { - int i; + int w, n; char **p; + Envy *e1; static char buf[16384]; - p = 0; - for(i = 0; e->name; e++, i++) { - p = (char**) Realloc(p, (i+2)*sizeof(char*)); + n = 0; + for(e1 = e; e1->name; e1++) + n++; + p = Malloc((n+1)*sizeof(char*)); + w = 0; + for(; e->name; e++) { + if(sh == &rcshell && (e->values == 0 || e->values->s == 0 || e->values->s[0] == 0)) + continue; /* do not write empty string for empty list */ if(e->values) 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); + p[w++] = strdup(buf); } - p[i] = 0; + p[w] = 0; environ = p; } @@ -111,7 +117,7 @@ shargv(Word *cmd, int extra, char ***pargv) 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) @@ -119,7 +125,7 @@ shargv(Word *cmd, int extra, char ***pargv) argv[n] = 0; *pargv = argv; return n; -} +} int execsh(char *args, char *cmd, Bufblock *buf, Envy *e, Shell *sh, Word *shellcmd) diff --git a/src/cmd/mk/varsub.c b/src/cmd/mk/varsub.c index f858a92a..b6c0ab0f 100644 --- a/src/cmd/mk/varsub.c +++ b/src/cmd/mk/varsub.c @@ -61,7 +61,7 @@ varmatch(char *name) { Word *w; Symtab *sym; - + sym = symlook(name, S_VAR, 0); if(sym){ /* check for at least one non-NULL value */ @@ -107,7 +107,7 @@ expandvar(char **s) } *end = 0; *s = end+1; - + sym = symlook(buf->start, S_VAR, 0); if(sym == 0 || sym->u.ptr == 0) w = newword(buf->start); @@ -173,7 +173,7 @@ subsub(Word *v, char *s, char *end) while(w->next) w = w->next; } - if(PERCENT(*cp) && nmid > 0){ + if(PERCENT(*cp) && nmid > 0){ if(w){ bufcpy(buf, w->s, strlen(w->s)); bufcpy(buf, enda, nmid); @@ -205,7 +205,7 @@ subsub(Word *v, char *s, char *end) } if(w == 0) h = w = newword(v->s); - + if(head == 0) head = h; else diff --git a/src/cmd/mk/word.c b/src/cmd/mk/word.c index f94c4fd7..e1e52a1c 100644 --- a/src/cmd/mk/word.c +++ b/src/cmd/mk/word.c @@ -29,7 +29,7 @@ stow(char *s) head = w = new; while(w->next) w = w->next; - + } if (!head) head = newword(""); |