| ... | @@ -478,6 +478,126 @@ pub const CLOCK_BOOTTIME_ALARM = 9; | ... | @@ -478,6 +478,126 @@ pub const CLOCK_BOOTTIME_ALARM = 9; |
| 478 | pub const CLOCK_SGI_CYCLE = 10; | 478 | pub const CLOCK_SGI_CYCLE = 10; |
| 479 | pub const CLOCK_TAI = 11; | 479 | pub const CLOCK_TAI = 11; |
| 480 | | 480 | |
| | 481 | pub const CSIGNAL = 0x000000ff; |
| | 482 | pub const CLONE_VM = 0x00000100; |
| | 483 | pub const CLONE_FS = 0x00000200; |
| | 484 | pub const CLONE_FILES = 0x00000400; |
| | 485 | pub const CLONE_SIGHAND = 0x00000800; |
| | 486 | pub const CLONE_PTRACE = 0x00002000; |
| | 487 | pub const CLONE_VFORK = 0x00004000; |
| | 488 | pub const CLONE_PARENT = 0x00008000; |
| | 489 | pub const CLONE_THREAD = 0x00010000; |
| | 490 | pub const CLONE_NEWNS = 0x00020000; |
| | 491 | pub const CLONE_SYSVSEM = 0x00040000; |
| | 492 | pub const CLONE_SETTLS = 0x00080000; |
| | 493 | pub const CLONE_PARENT_SETTID = 0x00100000; |
| | 494 | pub const CLONE_CHILD_CLEARTID = 0x00200000; |
| | 495 | pub const CLONE_DETACHED = 0x00400000; |
| | 496 | pub const CLONE_UNTRACED = 0x00800000; |
| | 497 | pub const CLONE_CHILD_SETTID = 0x01000000; |
| | 498 | pub const CLONE_NEWCGROUP = 0x02000000; |
| | 499 | pub const CLONE_NEWUTS = 0x04000000; |
| | 500 | pub const CLONE_NEWIPC = 0x08000000; |
| | 501 | pub const CLONE_NEWUSER = 0x10000000; |
| | 502 | pub const CLONE_NEWPID = 0x20000000; |
| | 503 | pub const CLONE_NEWNET = 0x40000000; |
| | 504 | pub const CLONE_IO = 0x80000000; |
| | 505 | |
| | 506 | pub const MS_RDONLY = 1; |
| | 507 | pub const MS_NOSUID = 2; |
| | 508 | pub const MS_NODEV = 4; |
| | 509 | pub const MS_NOEXEC = 8; |
| | 510 | pub const MS_SYNCHRONOUS = 16; |
| | 511 | pub const MS_REMOUNT = 32; |
| | 512 | pub const MS_MANDLOCK = 64; |
| | 513 | pub const MS_DIRSYNC = 128; |
| | 514 | pub const MS_NOATIME = 1024; |
| | 515 | pub const MS_NODIRATIME = 2048; |
| | 516 | pub const MS_BIND = 4096; |
| | 517 | pub const MS_MOVE = 8192; |
| | 518 | pub const MS_REC = 16384; |
| | 519 | pub const MS_SILENT = 32768; |
| | 520 | pub const MS_POSIXACL = (1<<16); |
| | 521 | pub const MS_UNBINDABLE = (1<<17); |
| | 522 | pub const MS_PRIVATE = (1<<18); |
| | 523 | pub const MS_SLAVE = (1<<19); |
| | 524 | pub const MS_SHARED = (1<<20); |
| | 525 | pub const MS_RELATIME = (1<<21); |
| | 526 | pub const MS_KERNMOUNT = (1<<22); |
| | 527 | pub const MS_I_VERSION = (1<<23); |
| | 528 | pub const MS_STRICTATIME = (1<<24); |
| | 529 | pub const MS_LAZYTIME = (1<<25); |
| | 530 | pub const MS_NOREMOTELOCK = (1<<27); |
| | 531 | pub const MS_NOSEC = (1<<28); |
| | 532 | pub const MS_BORN = (1<<29); |
| | 533 | pub const MS_ACTIVE = (1<<30); |
| | 534 | pub const MS_NOUSER = (1<<31); |
| | 535 | |
| | 536 | pub const MS_RMT_MASK = (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION|MS_LAZYTIME); |
| | 537 | |
| | 538 | pub const MS_MGC_VAL = 0xc0ed0000; |
| | 539 | pub const MS_MGC_MSK = 0xffff0000; |
| | 540 | |
| | 541 | pub const MNT_FORCE = 1; |
| | 542 | pub const MNT_DETACH = 2; |
| | 543 | pub const MNT_EXPIRE = 4; |
| | 544 | pub const UMOUNT_NOFOLLOW = 8; |
| | 545 | |
| | 546 | |
| | 547 | pub const S_IFMT = 0o170000; |
| | 548 | |
| | 549 | pub const S_IFDIR = 0o040000; |
| | 550 | pub const S_IFCHR = 0o020000; |
| | 551 | pub const S_IFBLK = 0o060000; |
| | 552 | pub const S_IFREG = 0o100000; |
| | 553 | pub const S_IFIFO = 0o010000; |
| | 554 | pub const S_IFLNK = 0o120000; |
| | 555 | pub const S_IFSOCK = 0o140000; |
| | 556 | |
| | 557 | pub const S_ISUID = 0o4000; |
| | 558 | pub const S_ISGID = 0o2000; |
| | 559 | pub const S_ISVTX = 0o1000; |
| | 560 | pub const S_IRUSR = 0o400; |
| | 561 | pub const S_IWUSR = 0o200; |
| | 562 | pub const S_IXUSR = 0o100; |
| | 563 | pub const S_IRWXU = 0o700; |
| | 564 | pub const S_IRGRP = 0o040; |
| | 565 | pub const S_IWGRP = 0o020; |
| | 566 | pub const S_IXGRP = 0o010; |
| | 567 | pub const S_IRWXG = 0o070; |
| | 568 | pub const S_IROTH = 0o004; |
| | 569 | pub const S_IWOTH = 0o002; |
| | 570 | pub const S_IXOTH = 0o001; |
| | 571 | pub const S_IRWXO = 0o007; |
| | 572 | |
| | 573 | pub fn S_ISREG(m: u32) bool { |
| | 574 | return m & S_IFMT == S_IFREG; |
| | 575 | } |
| | 576 | |
| | 577 | pub fn S_ISDIR(m: u32) bool { |
| | 578 | return m & S_IFMT == S_IFDIR; |
| | 579 | } |
| | 580 | |
| | 581 | pub fn S_ISCHR(m: u32) bool { |
| | 582 | return m & S_IFMT == S_IFCHR; |
| | 583 | } |
| | 584 | |
| | 585 | pub fn S_ISBLK(m: u32) bool { |
| | 586 | return m & S_IFMT == S_IFBLK; |
| | 587 | } |
| | 588 | |
| | 589 | pub fn S_ISFIFO(m: u32) bool { |
| | 590 | return m & S_IFMT == S_IFIFO; |
| | 591 | } |
| | 592 | |
| | 593 | pub fn S_ISLNK(m: u32) bool { |
| | 594 | return m & S_IFMT == S_IFLNK; |
| | 595 | } |
| | 596 | |
| | 597 | pub fn S_ISSOCK(m: u32) bool { |
| | 598 | return m & S_IFMT == S_IFSOCK; |
| | 599 | } |
| | 600 | |
| 481 | pub const TFD_NONBLOCK = O_NONBLOCK; | 601 | pub const TFD_NONBLOCK = O_NONBLOCK; |
| 482 | pub const TFD_CLOEXEC = O_CLOEXEC; | 602 | pub const TFD_CLOEXEC = O_CLOEXEC; |
| 483 | | 603 | |
| ... | @@ -515,6 +635,10 @@ pub fn chdir(path: &const u8) usize { | ... | @@ -515,6 +635,10 @@ pub fn chdir(path: &const u8) usize { |
| 515 | return syscall1(SYS_chdir, @ptrToInt(path)); | 635 | return syscall1(SYS_chdir, @ptrToInt(path)); |
| 516 | } | 636 | } |
| 517 | | 637 | |
| | 638 | pub fn chroot(path: &const u8) usize { |
| | 639 | return syscall1(SYS_chroot, @ptrToInt(path)); |
| | 640 | } |
| | 641 | |
| 518 | pub fn execve(path: &const u8, argv: &const ?&const u8, envp: &const ?&const u8) usize { | 642 | pub fn execve(path: &const u8, argv: &const ?&const u8, envp: &const ?&const u8) usize { |
| 519 | return syscall3(SYS_execve, @ptrToInt(path), @ptrToInt(argv), @ptrToInt(envp)); | 643 | return syscall3(SYS_execve, @ptrToInt(path), @ptrToInt(argv), @ptrToInt(envp)); |
| 520 | } | 644 | } |
| ... | @@ -544,6 +668,18 @@ pub fn mkdir(path: &const u8, mode: u32) usize { | ... | @@ -544,6 +668,18 @@ pub fn mkdir(path: &const u8, mode: u32) usize { |
| 544 | return syscall2(SYS_mkdir, @ptrToInt(path), mode); | 668 | return syscall2(SYS_mkdir, @ptrToInt(path), mode); |
| 545 | } | 669 | } |
| 546 | | 670 | |
| | 671 | pub fn mount(special: &const u8, dir: &const u8, fstype: &const u8, flags: usize, data: usize) usize { |
| | 672 | return syscall5(SYS_mount, @ptrToInt(special), @ptrToInt(dir), @ptrToInt(fstype), flags, data); |
| | 673 | } |
| | 674 | |
| | 675 | pub fn umount(special: &const u8) usize { |
| | 676 | return syscall2(SYS_umount2, @ptrToInt(special), 0); |
| | 677 | } |
| | 678 | |
| | 679 | pub fn umount2(special: &const u8, flags: u32) usize { |
| | 680 | return syscall2(SYS_umount2, @ptrToInt(special), flags); |
| | 681 | } |
| | 682 | |
| 547 | pub fn mmap(address: ?&u8, length: usize, prot: usize, flags: usize, fd: i32, offset: isize) usize { | 683 | pub fn mmap(address: ?&u8, length: usize, prot: usize, flags: usize, fd: i32, offset: isize) usize { |
| 548 | return syscall6(SYS_mmap, @ptrToInt(address), length, prot, flags, usize(fd), | 684 | return syscall6(SYS_mmap, @ptrToInt(address), length, prot, flags, usize(fd), |
| 549 | @bitCast(usize, offset)); | 685 | @bitCast(usize, offset)); |
| ... | @@ -650,6 +786,58 @@ pub fn setregid(rgid: u32, egid: u32) usize { | ... | @@ -650,6 +786,58 @@ pub fn setregid(rgid: u32, egid: u32) usize { |
| 650 | return syscall2(SYS_setregid, rgid, egid); | 786 | return syscall2(SYS_setregid, rgid, egid); |
| 651 | } | 787 | } |
| 652 | | 788 | |
| | 789 | pub fn getuid() u32 { |
| | 790 | return u32(syscall0(SYS_getuid)); |
| | 791 | } |
| | 792 | |
| | 793 | pub fn getgid() u32 { |
| | 794 | return u32(syscall0(SYS_getgid)); |
| | 795 | } |
| | 796 | |
| | 797 | pub fn geteuid() u32 { |
| | 798 | return u32(syscall0(SYS_geteuid)); |
| | 799 | } |
| | 800 | |
| | 801 | pub fn getegid() u32 { |
| | 802 | return u32(syscall0(SYS_getegid)); |
| | 803 | } |
| | 804 | |
| | 805 | pub fn seteuid(euid: u32) usize { |
| | 806 | return syscall1(SYS_seteuid, euid); |
| | 807 | } |
| | 808 | |
| | 809 | pub fn setegid(egid: u32) usize { |
| | 810 | return syscall1(SYS_setegid, egid); |
| | 811 | } |
| | 812 | |
| | 813 | pub fn getresuid(ruid: &u32, euid: &u32, suid: &u32) usize { |
| | 814 | return syscall3(SYS_getresuid, @ptrToInt(ruid), @ptrToInt(euid), @ptrToInt(suid)); |
| | 815 | } |
| | 816 | |
| | 817 | pub fn getresgid(rgid: &u32, egid: &u32, sgid: &u32) usize { |
| | 818 | return syscall3(SYS_getresgid, @ptrToInt(rgid), @ptrToInt(egid), @ptrToInt(sgid)); |
| | 819 | } |
| | 820 | |
| | 821 | pub fn setresuid(ruid: u32, euid: u32, suid: u32) usize { |
| | 822 | return syscall3(SYS_setresuid, ruid, euid, suid); |
| | 823 | } |
| | 824 | |
| | 825 | pub fn setresgid(rgid: u32, egid: u32, sgid: u32) usize { |
| | 826 | return syscall3(SYS_setresgid, rgid, egid, sgid); |
| | 827 | } |
| | 828 | |
| | 829 | pub fn getgroups(size: usize, list: &u32) usize { |
| | 830 | return syscall2(SYS_getgroups, size, @ptrToInt(list)); |
| | 831 | } |
| | 832 | |
| | 833 | pub fn setgroups(size: usize, list: &const u32) usize { |
| | 834 | return syscall2(SYS_setgroups, size, @ptrToInt(list)); |
| | 835 | } |
| | 836 | |
| | 837 | pub fn getpid() i32 { |
| | 838 | return @bitCast(i32, u32(syscall0(SYS_getpid))); |
| | 839 | } |
| | 840 | |
| 653 | pub fn sigprocmask(flags: u32, noalias set: &const sigset_t, noalias oldset: ?&sigset_t) usize { | 841 | pub fn sigprocmask(flags: u32, noalias set: &const sigset_t, noalias oldset: ?&sigset_t) usize { |
| 654 | return syscall4(SYS_rt_sigprocmask, flags, @ptrToInt(set), @ptrToInt(oldset), NSIG/8); | 842 | return syscall4(SYS_rt_sigprocmask, flags, @ptrToInt(set), @ptrToInt(oldset), NSIG/8); |
| 655 | } | 843 | } |
| ... | @@ -833,6 +1021,71 @@ pub fn fstat(fd: i32, stat_buf: &Stat) usize { | ... | @@ -833,6 +1021,71 @@ pub fn fstat(fd: i32, stat_buf: &Stat) usize { |
| 833 | return syscall2(SYS_fstat, usize(fd), @ptrToInt(stat_buf)); | 1021 | return syscall2(SYS_fstat, usize(fd), @ptrToInt(stat_buf)); |
| 834 | } | 1022 | } |
| 835 | | 1023 | |
| | 1024 | pub fn stat(pathname: &const u8, statbuf: &Stat) usize { |
| | 1025 | return syscall2(SYS_stat, @ptrToInt(pathname), @ptrToInt(statbuf)); |
| | 1026 | } |
| | 1027 | |
| | 1028 | pub fn lstat(pathname: &const u8, statbuf: &Stat) usize { |
| | 1029 | return syscall2(SYS_lstat, @ptrToInt(pathname), @ptrToInt(statbuf)); |
| | 1030 | } |
| | 1031 | |
| | 1032 | pub fn listxattr(path: &const u8, list: &u8, size: usize) usize { |
| | 1033 | return syscall3(SYS_listxattr, @ptrToInt(path), @ptrToInt(list), size); |
| | 1034 | } |
| | 1035 | |
| | 1036 | pub fn llistxattr(path: &const u8, list: &u8, size: usize) usize { |
| | 1037 | return syscall3(SYS_llistxattr, @ptrToInt(path), @ptrToInt(list), size); |
| | 1038 | } |
| | 1039 | |
| | 1040 | pub fn flistxattr(fd: usize, list: &u8, size: usize) usize { |
| | 1041 | return syscall3(SYS_flistxattr, fd, @ptrToInt(list), size); |
| | 1042 | } |
| | 1043 | |
| | 1044 | pub fn getxattr(path: &const u8, name: &const u8, value: &void, size: usize) usize { |
| | 1045 | return syscall4(SYS_getxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size); |
| | 1046 | } |
| | 1047 | |
| | 1048 | pub fn lgetxattr(path: &const u8, name: &const u8, value: &void, size: usize) usize { |
| | 1049 | return syscall4(SYS_lgetxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), size); |
| | 1050 | } |
| | 1051 | |
| | 1052 | pub fn fgetxattr(fd: usize, name: &const u8, value: &void, size: usize) usize { |
| | 1053 | return syscall4(SYS_lgetxattr, fd, @ptrToInt(name), @ptrToInt(value), size); |
| | 1054 | } |
| | 1055 | |
| | 1056 | pub fn setxattr(path: &const u8, name: &const u8, value: &const void, |
| | 1057 | size: usize, flags: usize) usize { |
| | 1058 | |
| | 1059 | return syscall5(SYS_setxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), |
| | 1060 | size, flags); |
| | 1061 | } |
| | 1062 | |
| | 1063 | pub fn lsetxattr(path: &const u8, name: &const u8, value: &const void, |
| | 1064 | size: usize, flags: usize) usize { |
| | 1065 | |
| | 1066 | return syscall5(SYS_lsetxattr, @ptrToInt(path), @ptrToInt(name), @ptrToInt(value), |
| | 1067 | size, flags); |
| | 1068 | } |
| | 1069 | |
| | 1070 | pub fn fsetxattr(fd: usize, name: &const u8, value: &const void, |
| | 1071 | size: usize, flags: usize) usize { |
| | 1072 | |
| | 1073 | return syscall5(SYS_fsetxattr, fd, @ptrToInt(name), @ptrToInt(value), |
| | 1074 | size, flags); |
| | 1075 | } |
| | 1076 | |
| | 1077 | pub fn removexattr(path: &const u8, name: &const u8) usize { |
| | 1078 | return syscall2(SYS_removexattr, @ptrToInt(path), @ptrToInt(name)); |
| | 1079 | } |
| | 1080 | |
| | 1081 | pub fn lremovexattr(path: &const u8, name: &const u8) usize { |
| | 1082 | return syscall2(SYS_lremovexattr, @ptrToInt(path), @ptrToInt(name)); |
| | 1083 | } |
| | 1084 | |
| | 1085 | pub fn fremovexattr(fd: usize, name: &const u8) usize { |
| | 1086 | return syscall2(SYS_fremovexattr, fd, @ptrToInt(name)); |
| | 1087 | } |
| | 1088 | |
| 836 | pub const epoll_data = packed union { | 1089 | pub const epoll_data = packed union { |
| 837 | ptr: usize, | 1090 | ptr: usize, |
| 838 | fd: i32, | 1091 | fd: i32, |
| ... | @@ -878,6 +1131,125 @@ pub fn timerfd_settime(fd: i32, flags: u32, new_value: &const itimerspec, old_va | ... | @@ -878,6 +1131,125 @@ pub fn timerfd_settime(fd: i32, flags: u32, new_value: &const itimerspec, old_va |
| 878 | return syscall4(SYS_timerfd_settime, usize(fd), usize(flags), @ptrToInt(new_value), @ptrToInt(old_value)); | 1131 | return syscall4(SYS_timerfd_settime, usize(fd), usize(flags), @ptrToInt(new_value), @ptrToInt(old_value)); |
| 879 | } | 1132 | } |
| 880 | | 1133 | |
| | 1134 | pub const _LINUX_CAPABILITY_VERSION_1 = 0x19980330; |
| | 1135 | pub const _LINUX_CAPABILITY_U32S_1 = 1; |
| | 1136 | |
| | 1137 | pub const _LINUX_CAPABILITY_VERSION_2 = 0x20071026; |
| | 1138 | pub const _LINUX_CAPABILITY_U32S_2 = 2; |
| | 1139 | |
| | 1140 | pub const _LINUX_CAPABILITY_VERSION_3 = 0x20080522; |
| | 1141 | pub const _LINUX_CAPABILITY_U32S_3 = 2; |
| | 1142 | |
| | 1143 | pub const VFS_CAP_REVISION_MASK = 0xFF000000; |
| | 1144 | pub const VFS_CAP_REVISION_SHIFT = 24; |
| | 1145 | pub const VFS_CAP_FLAGS_MASK = ~VFS_CAP_REVISION_MASK; |
| | 1146 | pub const VFS_CAP_FLAGS_EFFECTIVE = 0x000001; |
| | 1147 | |
| | 1148 | pub const VFS_CAP_REVISION_1 = 0x01000000; |
| | 1149 | pub const VFS_CAP_U32_1 = 1; |
| | 1150 | pub const XATTR_CAPS_SZ_1 = @sizeOf(u32)*(1 + 2*VFS_CAP_U32_1); |
| | 1151 | |
| | 1152 | pub const VFS_CAP_REVISION_2 = 0x02000000; |
| | 1153 | pub const VFS_CAP_U32_2 = 2; |
| | 1154 | pub const XATTR_CAPS_SZ_2 = @sizeOf(u32)*(1 + 2*VFS_CAP_U32_2); |
| | 1155 | |
| | 1156 | pub const XATTR_CAPS_SZ = XATTR_CAPS_SZ_2; |
| | 1157 | pub const VFS_CAP_U32 = VFS_CAP_U32_2; |
| | 1158 | pub const VFS_CAP_REVISION = VFS_CAP_REVISION_2; |
| | 1159 | |
| | 1160 | pub const vfs_cap_data = extern struct { |
| | 1161 | //all of these are mandated as little endian |
| | 1162 | //when on disk. |
| | 1163 | const Data = struct { |
| | 1164 | permitted: u32, |
| | 1165 | inheritable: u32, |
| | 1166 | }; |
| | 1167 | |
| | 1168 | magic_etc: u32, |
| | 1169 | data: [VFS_CAP_U32]Data, |
| | 1170 | }; |
| | 1171 | |
| | 1172 | |
| | 1173 | pub const CAP_CHOWN = 0; |
| | 1174 | pub const CAP_DAC_OVERRIDE = 1; |
| | 1175 | pub const CAP_DAC_READ_SEARCH = 2; |
| | 1176 | pub const CAP_FOWNER = 3; |
| | 1177 | pub const CAP_FSETID = 4; |
| | 1178 | pub const CAP_KILL = 5; |
| | 1179 | pub const CAP_SETGID = 6; |
| | 1180 | pub const CAP_SETUID = 7; |
| | 1181 | pub const CAP_SETPCAP = 8; |
| | 1182 | pub const CAP_LINUX_IMMUTABLE = 9; |
| | 1183 | pub const CAP_NET_BIND_SERVICE = 10; |
| | 1184 | pub const CAP_NET_BROADCAST = 11; |
| | 1185 | pub const CAP_NET_ADMIN = 12; |
| | 1186 | pub const CAP_NET_RAW = 13; |
| | 1187 | pub const CAP_IPC_LOCK = 14; |
| | 1188 | pub const CAP_IPC_OWNER = 15; |
| | 1189 | pub const CAP_SYS_MODULE = 16; |
| | 1190 | pub const CAP_SYS_RAWIO = 17; |
| | 1191 | pub const CAP_SYS_CHROOT = 18; |
| | 1192 | pub const CAP_SYS_PTRACE = 19; |
| | 1193 | pub const CAP_SYS_PACCT = 20; |
| | 1194 | pub const CAP_SYS_ADMIN = 21; |
| | 1195 | pub const CAP_SYS_BOOT = 22; |
| | 1196 | pub const CAP_SYS_NICE = 23; |
| | 1197 | pub const CAP_SYS_RESOURCE = 24; |
| | 1198 | pub const CAP_SYS_TIME = 25; |
| | 1199 | pub const CAP_SYS_TTY_CONFIG = 26; |
| | 1200 | pub const CAP_MKNOD = 27; |
| | 1201 | pub const CAP_LEASE = 28; |
| | 1202 | pub const CAP_AUDIT_WRITE = 29; |
| | 1203 | pub const CAP_AUDIT_CONTROL = 30; |
| | 1204 | pub const CAP_SETFCAP = 31; |
| | 1205 | pub const CAP_MAC_OVERRIDE = 32; |
| | 1206 | pub const CAP_MAC_ADMIN = 33; |
| | 1207 | pub const CAP_SYSLOG = 34; |
| | 1208 | pub const CAP_WAKE_ALARM = 35; |
| | 1209 | pub const CAP_BLOCK_SUSPEND = 36; |
| | 1210 | pub const CAP_AUDIT_READ = 37; |
| | 1211 | pub const CAP_LAST_CAP = CAP_AUDIT_READ; |
| | 1212 | |
| | 1213 | pub fn cap_valid(u8: x) bool { |
| | 1214 | return x >= 0 and x <= CAP_LAST_CAP; |
| | 1215 | } |
| | 1216 | |
| | 1217 | pub fn CAP_TO_MASK(cap: u8) u32 { |
| | 1218 | return u32(1) << u5(cap & 31); |
| | 1219 | } |
| | 1220 | |
| | 1221 | pub fn CAP_TO_INDEX(cap: u8) u8 { |
| | 1222 | return cap >> 5; |
| | 1223 | } |
| | 1224 | |
| | 1225 | pub const cap_t = extern struct { |
| | 1226 | hdrp: &cap_user_header_t, |
| | 1227 | datap: &cap_user_data_t, |
| | 1228 | }; |
| | 1229 | |
| | 1230 | pub const cap_user_header_t = extern struct { |
| | 1231 | version: u32, |
| | 1232 | pid: usize, |
| | 1233 | }; |
| | 1234 | |
| | 1235 | pub const cap_user_data_t = extern struct { |
| | 1236 | effective: u32, |
| | 1237 | permitted: u32, |
| | 1238 | inheritable: u32, |
| | 1239 | }; |
| | 1240 | |
| | 1241 | pub fn unshare(flags: usize) usize { |
| | 1242 | return syscall1(SYS_unshare, usize(flags)); |
| | 1243 | } |
| | 1244 | |
| | 1245 | pub fn capget(hdrp: &cap_user_header_t, datap: &cap_user_data_t) usize { |
| | 1246 | return syscall2(SYS_capget, @ptrToInt(hdrp), @ptrToInt(datap)); |
| | 1247 | } |
| | 1248 | |
| | 1249 | pub fn capset(hdrp: &cap_user_header_t, datap: &const cap_user_data_t) usize { |
| | 1250 | return syscall2(SYS_capset, @ptrToInt(hdrp), @ptrToInt(datap)); |
| | 1251 | } |
| | 1252 | |
| 881 | test "import linux test" { | 1253 | test "import linux test" { |
| 882 | // TODO lazy analysis should prevent this test from being compiled on windows, but | 1254 | // TODO lazy analysis should prevent this test from being compiled on windows, but |
| 883 | // it is still compiled on windows | 1255 | // it is still compiled on windows |