xref: /dflybsd-src/test/testcases/priv/setreuid/setreuid.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /*
286d7f5d3SJohn Marino  * usage:
386d7f5d3SJohn Marino  * $ gcc -W -Wall at.c
486d7f5d3SJohn Marino  * $ su
586d7f5d3SJohn Marino  * # chown root a.out; chmod u+s a.out
686d7f5d3SJohn Marino  * # exit
786d7f5d3SJohn Marino  * $ ./a.out
886d7f5d3SJohn Marino  */
986d7f5d3SJohn Marino #include <err.h>
1086d7f5d3SJohn Marino #include <fcntl.h>
1186d7f5d3SJohn Marino #include <stdio.h>
1286d7f5d3SJohn Marino #include <unistd.h>
1386d7f5d3SJohn Marino 
1486d7f5d3SJohn Marino #define CHECK(expr) \
1586d7f5d3SJohn Marino if ((expr) != 0) \
1686d7f5d3SJohn Marino   err(1, #expr)
1786d7f5d3SJohn Marino 
1886d7f5d3SJohn Marino int
main()1986d7f5d3SJohn Marino main()
2086d7f5d3SJohn Marino {
2186d7f5d3SJohn Marino 	uid_t real_uid, effective_uid;
2286d7f5d3SJohn Marino 	int fd;
2386d7f5d3SJohn Marino 
2486d7f5d3SJohn Marino 	real_uid = getuid();
2586d7f5d3SJohn Marino 	effective_uid = geteuid();
2686d7f5d3SJohn Marino 	CHECK(setreuid(effective_uid, real_uid));
2786d7f5d3SJohn Marino 
2886d7f5d3SJohn Marino 	CHECK(setreuid(real_uid, effective_uid));
2986d7f5d3SJohn Marino 	fd = open("/etc/hosts", O_RDONLY);
3086d7f5d3SJohn Marino 	CHECK(setreuid(effective_uid, real_uid));
3186d7f5d3SJohn Marino 	close(fd), fd = -1;	/* move this above the previous line */
3286d7f5d3SJohn Marino 
3386d7f5d3SJohn Marino 	CHECK(setreuid(real_uid, effective_uid));
3486d7f5d3SJohn Marino 	printf("uid %d, euid %d\n", getuid(), geteuid());
3586d7f5d3SJohn Marino 	CHECK(setreuid(effective_uid, real_uid));
3686d7f5d3SJohn Marino 	return 0;
3786d7f5d3SJohn Marino }
3886d7f5d3SJohn Marino 
39