authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-10 23:27:27-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-10 23:29:24-04:00
log2ec1cec92d018d25f720c43a7586a12eafd2cbeb
treee7c562d9fec4f2ea95d88c5c47123bccf1c277d5
parent64d96ad70360a82ec1a441fc28ddbb3f513995be

add more linux syscalls and constants

Based on #904 by tgshultz

1 files changed, 372 insertions(+), 0 deletions(-)

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