diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-04-15 05:21:21 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-04-15 05:21:21 +0000 |
commit | c0662c5330449e43f4a1f10c2d440d9bf60a6f4a (patch) | |
tree | 647e6f1ba5f187fc2cb974a09418c33a6d852c8b /sys/src/libdisk | |
parent | 715570c24e89cea414feb181be3aee65df1ceec5 (diff) |
hacked libdisk/proto to support skipping file names (.dummy) and setting uid/gid recursively (this solves issue #13). moved cdproto to /sys/lib/sysconfig/proto and added glendas mbox.
Diffstat (limited to 'sys/src/libdisk')
-rw-r--r-- | sys/src/libdisk/proto.c | 92 |
1 files changed, 88 insertions, 4 deletions
diff --git a/sys/src/libdisk/proto.c b/sys/src/libdisk/proto.c index e40d68bca..12e7ae9f1 100644 --- a/sys/src/libdisk/proto.c +++ b/sys/src/libdisk/proto.c @@ -29,6 +29,15 @@ struct Name { char *s; }; +typedef struct Opt Opt; +struct Opt { + int level; + char *skip; + char *uid; + char *gid; + Opt *prev; +}; + typedef struct Mkaux Mkaux; struct Mkaux { Mkfserr *warn; @@ -43,6 +52,8 @@ struct Mkaux { int lineno; int indent; + Opt *opt; + void *a; }; @@ -60,6 +71,7 @@ static void mktree(Mkaux*, File*, int); static void setnames(Mkaux*, File*); static void skipdir(Mkaux*); static void warn(Mkaux*, char *, ...); +static void popopt(Mkaux *mkaux); //static void //mprint(char *new, char *old, Dir *d, void*) @@ -86,6 +98,7 @@ rdproto(char *proto, char *root, Mkfsenum *mkenum, Mkfserr *mkerr, void *a) m->proto = proto; m->lineno = 0; m->indent = 0; + m->opt = nil; if((m->b = Bopen(proto, OREAD)) == nil) { werrstr("open '%s': %r", proto); return -1; @@ -102,6 +115,8 @@ rdproto(char *proto, char *root, Mkfsenum *mkenum, Mkfserr *mkerr, void *a) rv = -1; free(m->oldfile.s); free(m->fullname.s); + m->indent = -1; + popopt(m); return rv; } @@ -169,10 +184,12 @@ mktree(Mkaux *mkaux, File *me, int rec) warn(mkaux, "can't open %s: %r", mkaux->oldfile.s); return; } - child = *me; while((n = dirread(fd, &d)) > 0){ for(i = 0; i < n; i++){ + if(mkaux->opt && mkaux->opt->skip) + if(strstr(d[i].name, mkaux->opt->skip)) + continue; child.new = mkpath(mkaux, me->new, d[i].name); if(me->old) child.old = mkpath(mkaux, me->old, d[i].name); @@ -216,13 +233,14 @@ setname(Mkaux *mkaux, Name *name, char *s1, char *s2) name->s = emalloc(mkaux, l+SLOP); name->n = l+SLOP; } - snprint(name->s, name->n, "%s%s%s", s1, s1[0]==0 || s1[strlen(s1)-1]!='/' ? "/" : "", s2); + snprint(name->s, name->n, "%s%s%s", s1, *s1==0 || s1[strlen(s1)-1]!='/' ? "/" : "", s2); } static int copyfile(Mkaux *mkaux, File *f, Dir *d, int permonly) { Dir *nd; + Opt *o; ulong xmode; char *p; @@ -240,10 +258,15 @@ copyfile(Mkaux *mkaux, File *f, Dir *d, int permonly) xmode = (d->mode >> 6) & 7; d->mode |= xmode | (xmode << 3); } + o = mkaux->opt; if(strcmp(f->uid, "-") != 0) d->uid = f->uid; + else if(o && o->uid) + d->uid = o->uid; if(strcmp(f->gid, "-") != 0) d->gid = f->gid; + else if(o && o->gid) + d->gid = o->gid; if(f->mode != ~0){ if(permonly) d->mode = (d->mode & ~0666) | (f->mode & 0666); @@ -257,7 +280,6 @@ copyfile(Mkaux *mkaux, File *f, Dir *d, int permonly) d->name = p+1; else d->name = f->new; - mkaux->mkenum(f->new, mkaux->fullname.s, d, mkaux->a); xmode = d->mode; free(nd); @@ -292,6 +314,59 @@ setnames(Mkaux *mkaux, File *f) } static void +setopt(Mkaux *mkaux, char *key, char *val) +{ + Opt *o; + + o = mkaux->opt; + if(o == nil || mkaux->indent > o->level){ + o = emalloc(mkaux, sizeof(*o)); + if(o == nil) + longjmp(mkaux->jmp, 1); + if(mkaux->opt){ + *o = *mkaux->opt; + if(o->skip) + o->skip = estrdup(mkaux, o->skip); + if(o->uid) + o->uid = estrdup(mkaux, o->uid); + if(o->gid) + o->gid = estrdup(mkaux, o->gid); + }else + memset(o, 0, sizeof(*o)); + o->level = mkaux->indent; + o->prev = mkaux->opt; + mkaux->opt = o; + } else if(mkaux->indent < o->level) + return; + if(strcmp(key, "skip") == 0){ + free(o->skip); + o->skip = *val ? estrdup(mkaux, val) : nil; + } else if(strcmp(key, "uid") == 0){ + free(o->uid); + o->uid = *val ? estrdup(mkaux, val) : nil; + } else if(strcmp(key, "gid") == 0){ + free(o->gid); + o->gid = *val ? estrdup(mkaux, val) : nil; + } +} + +static void +popopt(Mkaux *mkaux) +{ + Opt *o; + + while(o = mkaux->opt){ + if(o->level <= mkaux->indent) + break; + mkaux->opt = o->prev; + free(o->skip); + free(o->uid); + free(o->gid); + free(o); + } +} + +static void freefile(File *f) { if(f->old) @@ -330,6 +405,7 @@ skipdir(Mkaux *mkaux) else break; if(mkaux->indent <= level){ + popopt(mkaux); Bseek(mkaux->b, -Blinelen(mkaux->b), 1); mkaux->lineno--; return; @@ -342,7 +418,7 @@ getfile(Mkaux *mkaux, File *old) { File *f; char *elem; - char *p; + char *p, *s; int c; if(mkaux->indent < 0) @@ -365,6 +441,14 @@ loop: if(c == '\n' || c == '#') goto loop; p--; + popopt(mkaux); + *strchr(p, '\n') = 0; + if(s = strchr(p, '=')){ + *s++ = 0; + setopt(mkaux, p, s); + goto loop; + }else + p[strlen(p)] = '\n'; f = emalloc(mkaux, sizeof *f); p = getname(mkaux, p, &elem); if(p == nil) |