char * logfsisgroupsetleader(LogfsIdentityStore *is, char *groupname, char *leadername) { Group *g, *lg; groupname = logfsisustadd(is, groupname); if(groupname == nil) return Enomem; g = findgroupfromuname(is, groupname); if(g == nil) return Enonexist; if(leadername && leadername[0]) { leadername = logfsisustadd(is, leadername); if(leadername == nil) return Enomem; lg = findgroupfromuname(is, leadername); if(lg == nil) return Enonexist; if(!logfsgroupsetismember(g->members, lg)) return "not a member of the group"; g->leader = lg; } else g->leader = nil; return nil; }
char * logfsisgroupcreate(LogfsIdentityStore *is, char *groupname, char *groupid) { Group *group; Uname *uname; if(strcmp(groupname, logfsisgroupnonename) == 0 || groupname[0] == '(') return "group name reserved"; groupname = logfsisustadd(is, groupname); groupid = logfsisustadd(is, groupid); if(groupname == nil || groupid == nil) return Enomem; return logfsgroupmapnewentry(is->groupmap, is->unamemap, groupid, groupname, &group, &uname); }
char * logfsisgrouprename(LogfsIdentityStore *is, char *oldgroupname, char *newgroupname) { Group *og, *ng; oldgroupname = logfsisustadd(is, oldgroupname); if(oldgroupname == nil) return Enomem; og =findgroupfromuname(is, oldgroupname); if(og == nil) return Enonexist; newgroupname = logfsisustadd(is, newgroupname); if(newgroupname == nil) return Enomem; ng = findgroupfromuname(is, newgroupname); if(ng != nil) return Eexist; og->uname = newgroupname; return nil; }
static mkdirentry(LogfsServer *server, Entry *e, int inuse, ulong path, Entry *parent, char *name, char *uid, char *gid, ulong mtime, char *muid, ulong perm) { //print("mkdirentry 0x%.8lux\n", e); e->inuse = inuse; e->qid.path = path; e->qid.vers = 0; e->qid.type = QTDIR; e->parent = parent; e->name = name; e->uid = logfsisustadd(server->is, uid); e->gid = logfsisustadd(server->is, gid); e->mtime = mtime; e->muid = logfsisustadd(server->is, muid); e->perm = perm | DMDIR; e->next = nil; return e->uid != nil && e->muid != nil && e->name != nil; }
char * logfsisgroupaddmember(LogfsIdentityStore *is, char *groupname, char *membername) { Group *g, *mg; groupname = logfsisustadd(is, groupname); if(groupname == nil) return Enomem; g =findgroupfromuname(is, groupname); if(g == nil) return Enonexist; membername = logfsisustadd(is, membername); if(membername == nil) return Enomem; mg = findgroupfromuname(is, membername); if(mg == nil) return Enonexist; if(!logfsgroupsetadd(g->members, mg)) return Enomem; return nil; }
char * logfsentrynew(LogfsServer *server, int inuse, u32int path, Entry *parent, char *name, char *uid, char *gid, u32int mtime, char *muid, u32int perm, ulong cvers, ulong length, Entry **ep) { Entry *e; char *errmsg; e = logfsrealloc(nil, sizeof(*e)); if(e == nil) return Enomem; e->inuse = inuse; e->qid.path = path; e->qid.vers = 0; e->qid.type = perm >> 24; e->parent = parent; e->name = logfsstrdup(name); e->uid = logfsisustadd(server->is, uid); e->gid = logfsisustadd(server->is, gid); e->muid = logfsisustadd(server->is, muid); if(e->uid == nil || e->gid == nil || e->muid == nil || e->name == nil) { logfsentryfree(e); return Enomem; } e->mtime = mtime; if(perm & DMDIR) e->perm = perm & (~0777 | (parent->perm & 0777)); else { e->perm = perm & (~0666 | (parent->perm & 0666)); e->u.file.cvers = cvers; e->u.file.length = length; errmsg = logfsextentlistnew(&e->u.file.extent); if(errmsg) { logfsentryfree(e); return errmsg; } } //print("e 0x%.8lux perm 0%.uo\n", e, e->perm); *ep = e; return nil; }
char * logfsisgroupremovemember(LogfsIdentityStore *is, char *groupname, char *nonmembername) { Group *g, *nonmg; groupname = logfsisustadd(is, groupname); if(groupname == nil) return Enomem; g =findgroupfromuname(is, groupname); if(g == nil) return Enonexist; nonmembername = logfsisustadd(is, nonmembername); if(nonmembername == nil) return Enomem; nonmg = findgroupfromuname(is, nonmembername); if(nonmg == nil) return Enonexist; if(!logfsgroupsetremove(g->members, nonmg)) return Enonexist; if(g->leader == nonmg) g->leader = nil; return nil; }
char * logfsserverattach(LogfsServer *server, u32int fid, char *uname, Qid *qid) { char *errmsg; Fid *f; if(server->trace > 1) print("logfsserverattach(%ud, %s)\n", fid, uname); errmsg = logfsfidmapnewentry(server->fidmap, fid, &f); if(errmsg) return errmsg; f->uname = logfsisustadd(server->is, uname); if(f->uname == nil) { logfsfidmapclunk(server->fidmap, fid); return Enomem; } f->entry = &server->root; f->entry->inuse++; *qid = f->entry->qid; return nil; }