| ... | ... | @@ -478,6 +478,126 @@ pub const CLOCK_BOOTTIME_ALARM = 9; |
| 478 | 478 | pub const CLOCK_SGI_CYCLE = 10; |
| 479 | 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 | 601 | pub const TFD_NONBLOCK = O_NONBLOCK; |
| 482 | 602 | pub const TFD_CLOEXEC = O_CLOEXEC; |
| 483 | 603 | |
| ... | ... | @@ -515,6 +635,10 @@ pub fn chdir(path: &const u8) usize { |
| 515 | 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 | 642 | pub fn execve(path: &const u8, argv: &const ?&const u8, envp: &const ?&const u8) usize { |
| 519 | 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 | 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 | 683 | pub fn mmap(address: ?&u8, length: usize, prot: usize, flags: usize, fd: i32, offset: isize) usize { |
| 548 | 684 | return syscall6(SYS_mmap, @ptrToInt(address), length, prot, flags, usize(fd), |
| 549 | 685 | @bitCast(usize, offset)); |
| ... | ... | @@ -650,6 +786,58 @@ pub fn setregid(rgid: u32, egid: u32) usize { |
| 650 | 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 | 841 | pub fn sigprocmask(flags: u32, noalias set: &const sigset_t, noalias oldset: ?&sigset_t) usize { |
| 654 | 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 | 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 | 1089 | pub const epoll_data = packed union { |
| 837 | 1090 | ptr: usize, |
| 838 | 1091 | fd: i32, |
| ... | ... | @@ -878,6 +1131,125 @@ pub fn timerfd_settime(fd: i32, flags: u32, new_value: &const itimerspec, old_va |
| 878 | 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 | 1253 | test "import linux test" { |
| 882 | 1254 | // TODO lazy analysis should prevent this test from being compiled on windows, but |
| 883 | 1255 | // it is still compiled on windows |