|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <auth.h> | 
|  |  | 
|  | /* | 
|  | *  become the authenticated user | 
|  | */ | 
|  | int | 
|  | auth_chuid(AuthInfo *ai, char *ns) | 
|  | { | 
|  | int rv, fd; | 
|  |  | 
|  | if(ai == nil || ai->cap == nil){ | 
|  | werrstr("no capability"); | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | /* change uid */ | 
|  | fd = open("#¤/capuse", OWRITE); | 
|  | if(fd < 0){ | 
|  | werrstr("opening #¤/capuse: %r"); | 
|  | return -1; | 
|  | } | 
|  | rv = write(fd, ai->cap, strlen(ai->cap)); | 
|  | close(fd); | 
|  | if(rv < 0){ | 
|  | werrstr("writing %s to #¤/capuse: %r", ai->cap); | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | /* get a link to factotum as new user */ | 
|  | fd = open("/srv/factotum", ORDWR); | 
|  | if(fd >= 0) | 
|  | mount(fd, -1, "/mnt", MREPL, ""); | 
|  |  | 
|  | /* set up new namespace */ | 
|  | return newns(ai->cuid, ns); | 
|  | } |