1 /*
2  * usage:
3  * $ gcc -W -Wall at.c
4  * $ su
5  * # chown root a.out; chmod u+s a.out
6  * # exit
7  * $ ./a.out
8  */
9 #include <err.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <unistd.h>
13 
14 #define CHECK(expr) \
15 if ((expr) != 0) \
16   err(1, #expr)
17 
18 int
19 main()
20 {
21 	uid_t real_uid, effective_uid;
22 	int fd;
23 
24 	real_uid = getuid();
25 	effective_uid = geteuid();
26 	CHECK(setreuid(effective_uid, real_uid));
27 
28 	CHECK(setreuid(real_uid, effective_uid));
29 	fd = open("/etc/hosts", O_RDONLY);
30 	CHECK(setreuid(effective_uid, real_uid));
31 	close(fd), fd = -1;	/* move this above the previous line */
32 
33 	CHECK(setreuid(real_uid, effective_uid));
34 	printf("uid %d, euid %d\n", getuid(), geteuid());
35 	CHECK(setreuid(effective_uid, real_uid));
36 	return 0;
37 }
38 
39