19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <auth.h>
49a747e4fSDavid du Colombier
59a747e4fSDavid du Colombier /*
69a747e4fSDavid du Colombier * become the authenticated user
79a747e4fSDavid du Colombier */
89a747e4fSDavid du Colombier int
auth_chuid(AuthInfo * ai,char * ns)99a747e4fSDavid du Colombier auth_chuid(AuthInfo *ai, char *ns)
109a747e4fSDavid du Colombier {
119a747e4fSDavid du Colombier int rv, fd;
129a747e4fSDavid du Colombier
13*e39083ccSDavid du Colombier if(ai == nil || ai->cap == nil || *ai->cap == 0){
149a747e4fSDavid du Colombier werrstr("no capability");
159a747e4fSDavid du Colombier return -1;
169a747e4fSDavid du Colombier }
179a747e4fSDavid du Colombier
189a747e4fSDavid du Colombier /* change uid */
199a747e4fSDavid du Colombier fd = open("#¤/capuse", OWRITE);
209a747e4fSDavid du Colombier if(fd < 0){
219a747e4fSDavid du Colombier werrstr("opening #¤/capuse: %r");
229a747e4fSDavid du Colombier return -1;
239a747e4fSDavid du Colombier }
249a747e4fSDavid du Colombier rv = write(fd, ai->cap, strlen(ai->cap));
259a747e4fSDavid du Colombier close(fd);
269a747e4fSDavid du Colombier if(rv < 0){
279a747e4fSDavid du Colombier werrstr("writing %s to #¤/capuse: %r", ai->cap);
289a747e4fSDavid du Colombier return -1;
299a747e4fSDavid du Colombier }
309a747e4fSDavid du Colombier
319a747e4fSDavid du Colombier /* get a link to factotum as new user */
329a747e4fSDavid du Colombier fd = open("/srv/factotum", ORDWR);
339a747e4fSDavid du Colombier if(fd >= 0)
349a747e4fSDavid du Colombier mount(fd, -1, "/mnt", MREPL, "");
359a747e4fSDavid du Colombier
369a747e4fSDavid du Colombier /* set up new namespace */
379a747e4fSDavid du Colombier return newns(ai->cuid, ns);
389a747e4fSDavid du Colombier }
39