1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(linux)
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>            /* printf() */
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <unistd.h>           /* syscall() */
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <sys/syscall.h>      /* __NR_capget */
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <sys/types.h>        /* uid_t */
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <linux/capability.h> /* _LINUX_CAPABILITY_VERSION */
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main()
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  struct __user_cap_header_struct h;
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  struct __user_cap_data_struct d;
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  int syscall_result;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov  if (getuid() == 0)
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    fprintf(stderr, "Running as root\n");
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  h.version = _LINUX_CAPABILITY_VERSION;
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  h.pid = 0;
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  syscall_result = syscall(__NR_capget, &h, &d);
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  if (syscall_result >= 0)
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    fprintf(stderr,
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            "capget result:\n"
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            "effective   %#x\n"
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            "permitted   %#x\n"
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            "inheritable %#x\n",
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            d.effective,
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            d.permitted,
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown            d.inheritable);
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  else
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  {
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    perror("capget");
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  }
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main()
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  fprintf(stderr, "This program is Linux-specific\n");
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  return 0;
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif
54