#include <9pm/u.h> #include <9pm/libc.h> #include <9pm/authsrv.h> #include "dat.h" #include "fns.h" char *eve; char hostdomain[DOMLEN]; /* * return true if current user is eve */ int iseve(void) { return strcmp(eve, up->user) == 0; } long sysfversion(ulong *arg) { char *vers; uint arglen, m, msize; Chan *c; msize = arg[1]; vers = (char*)arg[2]; arglen = arg[3]; /* check there's a NUL in the version string */ if(arglen==0 || memchr(vers, 0, arglen)==0) error(Ebadarg); c = fdtochan(arg[0], ORDWR, 0, 1); if(waserror()){ cclose(c); nexterror(); } m = mntversion(c, vers, msize, arglen); cclose(c); poperror(); return m; } long sys_fsession(ulong *arg) { /* deprecated; backwards compatibility only */ if(arg[2] == 0) error(Ebadarg); ((uchar*)arg[1])[0] = '\0'; return 0; } long sysfauth(ulong *arg) { Chan *c, *ac; char *aname; int fd; aname = (char*)arg[1]; validname(aname, 0); c = fdtochan(arg[0], ORDWR, 0, 1); if(waserror()){ cclose(c); nexterror(); } ac = mntauth(c, aname); if(waserror()){ cclose(ac); nexterror(); } fd = newfd(ac); if(fd < 0) error(Enofd); poperror(); /* ac */ poperror(); /* c */ /* always mark it close on exec */ ac->flag |= CCEXEC; return fd; } /* * called by devcons() for user device * * anyone can become none */ long userwrite(char *a, int n) { if(strcmp(a, "none") != 0) error(Eperm); kstrdup(&up->user, "none"); up->basepri = PriNormal; return n; } /* * called by devcons() for host owner/domain * * writing hostowner also sets user */ long hostownerwrite(char *a, int n) { char buf[128]; if(!iseve()) error(Eperm); if(n >= sizeof buf) error(Ebadarg); strncpy(buf, a, n+1); if(buf[0] == '\0') error(Ebadarg); renameuser(eve, buf); kstrdup(&eve, buf); kstrdup(&up->user, buf); up->basepri = PriNormal; return n; } long hostdomainwrite(char *a, int n) { char buf[DOMLEN]; if(!iseve()) error(Eperm); if(n >= DOMLEN) error(Ebadarg); memset(buf, 0, DOMLEN); strncpy(buf, a, n); if(buf[0] == 0) error(Ebadarg); memmove(hostdomain, buf, DOMLEN); return n; }