xref: /plan9-contrib/sys/src/libauth/auth_chuid.c (revision e39083cc2b94316a877eb6a2dde56dcdba5497ab)
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