cwfs: handle DMTMP flag in create

This commit is contained in:
cinap_lenrek 2017-03-06 03:07:03 +01:00
parent 5c6a03f4f4
commit 5fc5c18208
3 changed files with 13 additions and 16 deletions

View file

@ -894,8 +894,8 @@ fs_create(Chan* chan, Fcall* f, Fcall* r)
error = Emode; error = Emode;
goto out; goto out;
} }
if(f->perm & PDIR) if(f->perm & DMDIR)
if((f->mode & OTRUNC) || (f->perm & PAPND) || (fmod & FWRITE)) if((f->mode & OTRUNC) || (f->perm & DMAPPEND) || (fmod & FWRITE))
goto badaccess; goto badaccess;
/* /*
* do it * do it
@ -921,20 +921,22 @@ fs_create(Chan* chan, Fcall* f, Fcall* r)
d1->uid = file->uid; d1->uid = file->uid;
d1->gid = d->gid; d1->gid = d->gid;
f->perm &= d->mode | ~0666; f->perm &= d->mode | ~0666;
if(f->perm & PDIR) if(f->perm & DMDIR)
f->perm &= d->mode | ~0777; f->perm &= d->mode | ~0777;
} }
d1->qid.path = path; d1->qid.path = path;
d1->qid.version = 0; d1->qid.version = 0;
d1->mode = DALLOC | (f->perm & 0777); d1->mode = DALLOC | (f->perm & 0777);
if(f->perm & PDIR) { if(f->perm & DMDIR) {
d1->mode |= DDIR; d1->mode |= DDIR;
d1->qid.path |= QPDIR; d1->qid.path |= QPDIR;
} }
if(f->perm & PAPND) if(f->perm & DMAPPEND)
d1->mode |= DAPND; d1->mode |= DAPND;
if(f->perm & DMTMP)
d1->mode |= DTMP;
t = nil; t = nil;
if(f->perm & PLOCK){ if(f->perm & DMEXCL){
d1->mode |= DLOCK; d1->mode |= DLOCK;
t = tlocked(p1, d1); t = tlocked(p1, d1);
/* if nil, out of tlock structures */ /* if nil, out of tlock structures */

View file

@ -25,13 +25,6 @@ enum {
QPROOT = 1, QPROOT = 1,
QPSUPER = 2, QPSUPER = 2,
/*
* perm argument in 9P create
*/
PDIR = 1L<<31, /* is a directory */
PAPND = 1L<<30, /* is append only */
PLOCK = 1L<<29, /* is locked on open */
FID1 = 1, FID1 = 1,
FID2 = 2, FID2 = 2,

View file

@ -435,11 +435,13 @@ cmd_create(int argc, char *argv[])
if(argc > 5) { if(argc > 5) {
if(strchr(argv[5], 'l')) if(strchr(argv[5], 'l'))
perm |= PLOCK; perm |= DMEXCL;
if(strchr(argv[5], 'a')) if(strchr(argv[5], 'a'))
perm |= PAPND; perm |= DMAPPEND;
if(strchr(argv[5], 'd')) if(strchr(argv[5], 'd'))
perm |= PDIR; perm |= DMDIR;
if(strchr(argv[5], 't'))
perm |= DMTMP;
} }
if(con_create(FID2, elem, uid, gid, perm, 0)) if(con_create(FID2, elem, uid, gid, perm, 0))