From 37da2899f40661e3e9631e497da8dc59b971cbd0 Mon Sep 17 00:00:00 2001 From: "Charles.Forsyth" Date: Fri, 22 Dec 2006 17:07:39 +0000 Subject: 20060303a --- liblogfs/open.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 liblogfs/open.c (limited to 'liblogfs/open.c') diff --git a/liblogfs/open.c b/liblogfs/open.c new file mode 100644 index 00000000..688e8822 --- /dev/null +++ b/liblogfs/open.c @@ -0,0 +1,72 @@ +#include "lib9.h" +#include "logfs.h" +#include "local.h" + +char * +logfsserveropen(LogfsServer *server, u32int fid, uchar mode, Qid *qid) +{ + Fid *f; + Entry *e; + ulong modemask; + + if(server->trace > 1) + print("logfsserveropen(%ud, %d)\n", fid, mode); + f = logfsfidmapfindentry(server->fidmap, fid); + if(f == nil) + return logfsebadfid; + if(f->openmode >= 0) + return logfsefidopen; + e = f->entry; + SET(modemask); + switch(mode & 3) { + case OEXEC: + modemask = DMEXEC; + break; + case OREAD: + modemask = DMREAD; + break; + case OWRITE: + modemask = DMWRITE; + break; + case ORDWR: + modemask = DMWRITE | DMREAD; + break; + } + if(e->qid.type & QTDIR) { + if((modemask & DMWRITE) != 0 || (mode & (ORCLOSE | OTRUNC)) != 0) + return Eperm; + } + else { + if(mode & OTRUNC) + modemask |= DMWRITE; + if((mode & ORCLOSE) != 0 && !logfsuserpermcheck(server, e->parent, f, DMWRITE)) + return Eperm; + } + if(!logfsuserpermcheck(server, e, f, modemask)) + return Eperm; + if((e->qid.type & QTDIR) == 0 && (mode & OTRUNC) != 0 && (e->perm & DMAPPEND) == 0 && e->u.file.length != 0) { + LogMessage s; + char *errmsg; + s.type = LogfsLogTtrunc; + s.path = e->qid.path; + s.u.trunc.mtime = logfsnow(); + s.u.trunc.cvers = e->u.file.cvers + 1; + s.u.trunc.muid = logfsisfindidfromname(server->is, f->uname); + errmsg = logfslog(server, 1, &s); + if(errmsg) + return errmsg; + e->muid = s.u.trunc.muid; + e->mtime = s.u.trunc.mtime; + e->qid.vers++; + e->u.file.cvers = s.u.trunc.cvers; + /* + * zap all data and extents + */ + logfsextentlistwalk(e->u.file.extent, logfsunconditionallymarkfreeanddirty, server); + logfsextentlistreset(e->u.file.extent); + e->u.file.length = 0; + } + f->openmode = mode; + *qid = e->qid; + return nil; +} -- cgit v1.2.3