add support for mode override in libdisk/proto, fix some perms and add logfiles to cdproto

This commit is contained in:
cinap_lenrek 2011-06-08 00:49:45 +00:00
parent 6feb869371
commit 4626ebdbd8
3 changed files with 142 additions and 33 deletions

0
sys/lib/dist/empty vendored Normal file
View file

View file

@ -1,15 +1,15 @@
mode=ug+rw
mode=o-w
uid=sys uid=sys
gid=sys gid=sys
adm d775 adm adm adm d775 adm adm
uid=adm uid=adm
gid=adm gid=adm
keys.who 665
timezone d775 timezone d775
* *
cfg d775 cfg d775
+ +
cron d777 sys sys cron d775
bootes 664 bootes bootes
fd d775 fd d775
lib d775 lib d775
+ +
@ -20,17 +20,17 @@ mail d775 upas upas
gid=upas gid=upas
box d775 box d775
bootes d775 bootes bootes bootes d775 bootes bootes
mbox a662 bootes bootes mbox a662 bootes bootes /sys/lib/dist/empty
glenda d775 glenda glenda glenda d775 glenda glenda
mbox a662 glenda glenda mbox a662 glenda glenda /sys/lib/dist/empty
faxoutqueue d777 faxoutqueue d775
faxqueue d777 faxqueue d775
fs d555 fs d555
grey d775 grey d775
lib d775 lib d775
* *
queue d777 queue d775
tmp d777 tmp d775
386 d775 386 d775
+ +
@ -54,7 +54,6 @@ sparc64 d775
+ +
mips d775 mips d775
+ +
acme d775 acme d775
+ +
mnt d775 mnt d775
@ -93,8 +92,30 @@ sys d775
lib d775 lib d775
skip=\.(pyo|pyc)$ skip=\.(pyo|pyc)$
+ +
log d777 sys sys log d775
cron a664 bootes bootes auth a662 sys sys /sys/lib/dist/empty
cpu a662 sys sys /sys/lib/dist/empty
cron a662 sys sys /sys/lib/dist/empty
cs a662 sys sys /sys/lib/dist/empty
dns a662 sys sys /sys/lib/dist/empty
cifsd a662 sys sys /sys/lib/dist/empty
ftp a662 sys sys /sys/lib/dist/empty
httpd a662 sys sys /sys/lib/dist/empty
imap4d a662 sys sys /sys/lib/dist/empty
ipboot a662 sys sys /sys/lib/dist/empty
listen a662 sys sys /sys/lib/dist/empty
mail a662 sys sys /sys/lib/dist/empty
smtp a662 sys sys /sys/lib/dist/empty
smtp.fail a662 sys sys /sys/lib/dist/empty
smtpd a662 sys sys /sys/lib/dist/empty
smtpd.mx a662 sys sys /sys/lib/dist/empty
runq a662 sys sys /sys/lib/dist/empty
secstore a662 sys sys /sys/lib/dist/empty
timesync a662 sys sys /sys/lib/dist/empty
man d775 man d775
+ +
src d775 src d775
@ -106,34 +127,34 @@ usr d775
bootes d775 bootes bootes bootes d775 bootes bootes
uid=bootes uid=bootes
gid=bootes gid=bootes
bin d775 bin d775
386 d775 386 d775
+ +
rc d775 rc d775
+ +
lib d775 lib d775
* *
tmp d775 tmp d775
glenda d775 glenda glenda glenda d775 glenda glenda
uid=glenda uid=glenda
gid=glenda gid=glenda
bin d775 bin d775
386 d775 386 d775
+ +
rc d775 rc d775
+ +
lib d775 lib d775
* *
tmp d775 tmp d775
dist d775 dist d775
plan9front d775 plan9front d775
uid=glenda uid=glenda
.hgignore 664 .hgignore 664
.hg d775 .hg d775
+ +
NOTICE 444
LICENSE 444 LICENSE 444
LICENSE.afpl 444 LICENSE.afpl 444
LICENSE.gpl 444 LICENSE.gpl 444
NOTICE 444

View file

@ -33,6 +33,8 @@ struct Name {
typedef struct Opt Opt; typedef struct Opt Opt;
struct Opt { struct Opt {
int level; int level;
long mode;
long mask;
Reprog *skip; Reprog *skip;
char *uid; char *uid;
char *gid; char *gid;
@ -275,12 +277,6 @@ copyfile(Mkaux *mkaux, File *f, Dir *d, int permonly)
d = nd; d = nd;
d->name = f->elem; d->name = f->elem;
if(d->type != 'M'){
d->uid = "sys";
d->gid = "sys";
xmode = (d->mode >> 6) & 7;
d->mode |= xmode | (xmode << 3);
}
o = mkaux->opt; o = mkaux->opt;
if(strcmp(f->uid, "-") != 0) if(strcmp(f->uid, "-") != 0)
d->uid = f->uid; d->uid = f->uid;
@ -297,7 +293,8 @@ copyfile(Mkaux *mkaux, File *f, Dir *d, int permonly)
warn(mkaux, "inconsistent mode for %s", f->new); warn(mkaux, "inconsistent mode for %s", f->new);
else else
d->mode = f->mode; d->mode = f->mode;
} } else if(o && o->mask)
d->mode = (d->mode & ~o->mask) | (o->mode & o->mask);
if(p = strrchr(f->new, '/')) if(p = strrchr(f->new, '/'))
d->name = p+1; d->name = p+1;
@ -323,6 +320,92 @@ mkpath(Mkaux *mkaux, char *prefix, char *elem)
return p; return p;
} }
static int
parsemode(char *spec, long *pmask, long *pmode)
{
char op, set, *s;
long mode;
long mask;
s = spec;
op = set = 0;
mode = 0;
mask = DMAPPEND | DMEXCL | DMTMP;
if(*s >= '0' && *s <= '7'){
mask = 0666;
mode = strtoul(s, 0, 8);
op = '=';
s = "!";
}
for(; *s && op == 0; s++){
switch(*s){
case 'a':
mask |= 0666;
break;
case 'u':
mask |= 0600;
break;
case 'g':
mask |= 060;
break;
case 'o':
mask |= 06;
break;
case '-':
case '+':
case '=':
op = *s;
break;
default:
return 0;
}
}
if(s == spec)
mask |= 0666;
for(; *s; s++){
switch(*s){
case 'r':
mode |= 0444;
break;
case 'w':
mode |= 0222;
break;
case 'x':
mode |= 0111;
break;
case 'a':
mode |= DMAPPEND;
break;
case 'l':
mode |= DMEXCL;
break;
case 't':
mode |= DMTMP;
break;
case '!':
set = 1;
break;
default:
return 0;
}
}
if(op == '+' || op == '-')
mask &= mode;
if(op == '-')
mode = ~mode;
if(set)
*pmask = 0;
*pmask |= mask;
*pmode = (*pmode & ~mask) | (mode & mask);
return 1;
}
static void static void
setopt(Mkaux *mkaux, char *key, char *val) setopt(Mkaux *mkaux, char *key, char *val)
{ {
@ -354,6 +437,11 @@ setopt(Mkaux *mkaux, char *key, char *val)
} else if(strcmp(key, "gid") == 0){ } else if(strcmp(key, "gid") == 0){
free(o->gid); free(o->gid);
o->gid = *val ? estrdup(mkaux, val) : nil; o->gid = *val ? estrdup(mkaux, val) : nil;
} else if(strcmp(key, "mode") == 0){
if(!parsemode(val, &o->mask, &o->mode))
warn(mkaux, "bad mode specification %s", val);
} else {
warn(mkaux, "bad option %s=%s", key, val);
} }
} }