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.

This commit is contained in:
cinap_lenrek 2011-04-15 05:21:21 +00:00
parent 715570c24e
commit c0662c5330
5 changed files with 196 additions and 126 deletions

4
sys/lib/dist/mkfile vendored
View file

@ -1,7 +1,7 @@
cd:V: /tmp/9front.iso
%.iso: pc/cdproto pc/plan9.ini.cd
%.iso: pc/plan9.ini.cd
bind pc/plan9.ini.cd /n/src9/cfg/plan9.ini
disk/mk9660 -9cj -B 386/9bootiso -p pc/cdproto -s /n/src9 -v 'Plan 9 Front' $target
disk/mk9660 -9cj -B 386/9bootiso -p /n/src9/sys/lib/sysconfig/proto/cdproto -s /n/src9 -v 'Plan 9 Front' $target
unmount /n/src9/cfg/plan9.ini

View file

@ -1,120 +0,0 @@
adm
timezone
*
cfg
+
fd
lib
+
rc
+
mail
box
faxoutqueue
faxqueue
fs
grey
lib
*
queue
tmp
$cputype
+
acme
acid
*
$cputype
*
bin
*
$cputype
*
mail
*
$cputype
*
news
*
wiki
*
mnt
acme
apeselect
apm
cd
cons
cons
consctl
consoles
doc
exportfs
*
keys
lp
netkeys
news
plumb
rdb
temp
term
ums
vmware
web
webcookies
wiki
wrap
wsys
n
sys
games
+
include
+
lib
+
log
cs 666 sys sys /dev/null
dns 666 sys sys /dev/null
mail 666 sys sys /dev/null
smtp 666 sys sys /dev/null
smtpd 666 sys sys /dev/null
listen 666 sys sys /dev/null
ipboot 666 sys sys /dev/null
man
fonts
1pub
*
1
*
2
*
3
*
4
*
5
*
6
*
7
*
8
*
src
+
tmp
usr
glenda
bin
386
+
rc
+
lib
*
tmp
LICENSE
LICENSE.afpl
LICENSE.gpl
NOTICE

View file

@ -0,0 +1,106 @@
skip=.dummy
uid=sys
gid=sys
adm d775 adm adm
uid=adm
gid=adm
timezone d775
*
cfg d775
+
fd d775
lib d775
+
rc d775
+
mail d775 upas upas
uid=upas
gid=upas
box d775
glenda d775 glenda glenda
mbox a662 glenda glenda
faxoutqueue d777
faxqueue d777
fs d555
grey d775
lib d775
*
queue d777
tmp d777
$cputype d775
+
acme d775
+
mnt d775
acme d555
apeselect d555
apm d555
cd d555
cons d555
cons d555
consctl d555
consoles d555
doc d555
exportfs d555
*
keys d555
lp d555
netkeys d555
news d555
plumb d555
rdb d555
temp d555
term d555
ums d555
vmware d555
web d555
webcookies d555
wiki d555
wrap d555
wsys d555
n d775
sys d775
games
+
include
+
lib
+
log
man
fonts
1
*
2
*
3
*
4
*
5
*
6
*
7
*
8
*
src
+
tmp d555
usr d775
glenda d775 glenda glenda
uid=glenda
gid=glenda
bin d775
386 d775
+
rc d775
+
lib d775
*
tmp d775
LICENSE 444
LICENSE.afpl 444
LICENSE.gpl 444
NOTICE 444

View file

@ -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);
@ -291,6 +313,59 @@ setnames(Mkaux *mkaux, File *f)
setname(mkaux, &mkaux->oldfile, mkaux->root, f->new);
}
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)
{
@ -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)