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
main()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