From 666b153144eeb160c5b2279d406f8e0b23613857 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Mon, 17 Dec 2018 17:48:34 -0200 Subject: [PATCH 01/21] freebsd: remove syscall files --- CMakeLists.txt | 2 - std/c/freebsd.zig | 39 ++- std/os/freebsd/index.zig | 4 +- std/os/freebsd/syscall.zig | 493 ------------------------------------- std/os/freebsd/x86_64.zig | 136 ---------- 5 files changed, 39 insertions(+), 635 deletions(-) delete mode 100644 std/os/freebsd/syscall.zig delete mode 100644 std/os/freebsd/x86_64.zig diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b64bcca81dc..a9a4d8faa7f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -586,8 +586,6 @@ set(ZIG_STD_FILES "os/linux/arm64.zig" "os/freebsd/errno.zig" "os/freebsd/index.zig" - "os/freebsd/syscall.zig" - "os/freebsd/x86_64.zig" "os/path.zig" "os/time.zig" "os/windows/advapi32.zig" diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index 421e96482799..a97cf52eb949 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -1,5 +1,3 @@ -const timespec = @import("../os/freebsd/index.zig").timespec; - extern "c" fn __error() *c_int; pub const _errno = __error; @@ -31,3 +29,40 @@ pub const pthread_attr_t = extern struct { __size: [56]u8, __align: c_long, }; + +pub const msghdr = extern struct { + msg_name: *u8, + msg_namelen: socklen_t, + msg_iov: *iovec, + msg_iovlen: i32, + __pad1: i32, + msg_control: *u8, + msg_controllen: socklen_t, + __pad2: socklen_t, + msg_flags: i32, +}; + +pub const Stat = extern struct { + dev: u64, + ino: u64, + nlink: usize, + + mode: u32, + uid: u32, + gid: u32, + __pad0: u32, + rdev: u64, + size: i64, + blksize: isize, + blocks: i64, + + atim: timespec, + mtim: timespec, + ctim: timespec, + __unused: [3]isize, +}; + +pub const timespec = extern struct { + tv_sec: isize, + tv_nsec: isize, +}; diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index 34a3414a48fd..975479c1e008 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -742,8 +742,8 @@ pub fn raise(sig: i32) usize { return arch.syscall2(SYS_thr_kill, id, @bitCast(usize, isize(sig))); } -pub const Stat = arch.Stat; -pub const timespec = arch.timespec; +pub const Stat = c.Stat; +pub const timespec = c.timespec; pub fn fstat(fd: i32, stat_buf: *Stat) usize { return arch.syscall2(SYS_fstat, @bitCast(usize, isize(fd)), @ptrToInt(stat_buf)); diff --git a/std/os/freebsd/syscall.zig b/std/os/freebsd/syscall.zig deleted file mode 100644 index 6cdd71de3b71..000000000000 --- a/std/os/freebsd/syscall.zig +++ /dev/null @@ -1,493 +0,0 @@ -pub const SYS_syscall = 0; -pub const SYS_exit = 1; -pub const SYS_fork = 2; -pub const SYS_read = 3; -pub const SYS_write = 4; -pub const SYS_open = 5; -pub const SYS_close = 6; -pub const SYS_wait4 = 7; -// 8 is old creat -pub const SYS_link = 9; -pub const SYS_unlink = 10; -// 11 is obsolete execv -pub const SYS_chdir = 12; -pub const SYS_fchdir = 13; -pub const SYS_freebsd11_mknod = 14; -pub const SYS_chmod = 15; -pub const SYS_chown = 16; -pub const SYS_break = 17; -// 18 is freebsd4 getfsstat -// 19 is old lseek -pub const SYS_getpid = 20; -pub const SYS_mount = 21; -pub const SYS_unmount = 22; -pub const SYS_setuid = 23; -pub const SYS_getuid = 24; -pub const SYS_geteuid = 25; -pub const SYS_ptrace = 26; -pub const SYS_recvmsg = 27; -pub const SYS_sendmsg = 28; -pub const SYS_recvfrom = 29; -pub const SYS_accept = 30; -pub const SYS_getpeername = 31; -pub const SYS_getsockname = 32; -pub const SYS_access = 33; -pub const SYS_chflags = 34; -pub const SYS_fchflags = 35; -pub const SYS_sync = 36; -pub const SYS_kill = 37; -// 38 is old stat -pub const SYS_getppid = 39; -// 40 is old lstat -pub const SYS_dup = 41; -pub const SYS_freebsd10_pipe = 42; -pub const SYS_getegid = 43; -pub const SYS_profil = 44; -pub const SYS_ktrace = 45; -// 46 is old sigaction -pub const SYS_getgid = 47; -// 48 is old sigprocmask -pub const SYS_getlogin = 49; -pub const SYS_setlogin = 50; -pub const SYS_acct = 51; -// 52 is old sigpending -pub const SYS_sigaltstack = 53; -pub const SYS_ioctl = 54; -pub const SYS_reboot = 55; -pub const SYS_revoke = 56; -pub const SYS_symlink = 57; -pub const SYS_readlink = 58; -pub const SYS_execve = 59; -pub const SYS_umask = 60; -pub const SYS_chroot = 61; -// 62 is old fstat -// 63 is old getkerninfo -// 64 is old getpagesize -pub const SYS_msync = 65; -pub const SYS_vfork = 66; -// 67 is obsolete vread -// 68 is obsolete vwrite -// 69 is obsolete sbrk (still present on some platforms) -pub const SYS_sstk = 70; -// 71 is old mmap -pub const SYS_vadvise = 72; -pub const SYS_munmap = 73; -pub const SYS_mprotect = 74; -pub const SYS_madvise = 75; -// 76 is obsolete vhangup -// 77 is obsolete vlimit -pub const SYS_mincore = 78; -pub const SYS_getgroups = 79; -pub const SYS_setgroups = 80; -pub const SYS_getpgrp = 81; -pub const SYS_setpgid = 82; -pub const SYS_setitimer = 83; -// 84 is old wait -pub const SYS_swapon = 85; -pub const SYS_getitimer = 86; -// 87 is old gethostname -// 88 is old sethostname -pub const SYS_getdtablesize = 89; -pub const SYS_dup2 = 90; -pub const SYS_fcntl = 92; -pub const SYS_select = 93; -pub const SYS_fsync = 95; -pub const SYS_setpriority = 96; -pub const SYS_socket = 97; -pub const SYS_connect = 98; -// 99 is old accept -pub const SYS_getpriority = 100; -// 101 is old send -// 102 is old recv -// 103 is old sigreturn -pub const SYS_bind = 104; -pub const SYS_setsockopt = 105; -pub const SYS_listen = 106; -// 107 is obsolete vtimes -// 108 is old sigvec -// 109 is old sigblock -// 110 is old sigsetmask -// 111 is old sigsuspend -// 112 is old sigstack -// 113 is old recvmsg -// 114 is old sendmsg -// 115 is obsolete vtrace -pub const SYS_gettimeofday = 116; -pub const SYS_getrusage = 117; -pub const SYS_getsockopt = 118; -pub const SYS_readv = 120; -pub const SYS_writev = 121; -pub const SYS_settimeofday = 122; -pub const SYS_fchown = 123; -pub const SYS_fchmod = 124; -// 125 is old recvfrom -pub const SYS_setreuid = 126; -pub const SYS_setregid = 127; -pub const SYS_rename = 128; -// 129 is old truncate -// 130 is old ftruncate -pub const SYS_flock = 131; -pub const SYS_mkfifo = 132; -pub const SYS_sendto = 133; -pub const SYS_shutdown = 134; -pub const SYS_socketpair = 135; -pub const SYS_mkdir = 136; -pub const SYS_rmdir = 137; -pub const SYS_utimes = 138; -// 139 is obsolete 4.2 sigreturn -pub const SYS_adjtime = 140; -// 141 is old getpeername -// 142 is old gethostid -// 143 is old sethostid -// 144 is old getrlimit -// 145 is old setrlimit -// 146 is old killpg -pub const SYS_setsid = 147; -pub const SYS_quotactl = 148; -// 149 is old quota -// 150 is old getsockname -pub const SYS_nlm_syscall = 154; -pub const SYS_nfssvc = 155; -// 156 is old getdirentries -// 157 is freebsd4 statfs -// 158 is freebsd4 fstatfs -pub const SYS_lgetfh = 160; -pub const SYS_getfh = 161; -// 162 is freebsd4 getdomainname -// 163 is freebsd4 setdomainname -// 164 is freebsd4 uname -pub const SYS_sysarch = 165; -pub const SYS_rtprio = 166; -pub const SYS_semsys = 169; -pub const SYS_msgsys = 170; -pub const SYS_shmsys = 171; -// 173 is freebsd6 pread -// 174 is freebsd6 pwrite -pub const SYS_setfib = 175; -pub const SYS_ntp_adjtime = 176; -pub const SYS_setgid = 181; -pub const SYS_setegid = 182; -pub const SYS_seteuid = 183; -// 184 is obsolete lfs_bmapv -// 185 is obsolete lfs_markv -// 186 is obsolete lfs_segclean -// 187 is obsolete lfs_segwait -pub const SYS_freebsd11_stat = 188; -pub const SYS_freebsd11_fstat = 189; -pub const SYS_freebsd11_lstat = 190; -pub const SYS_pathconf = 191; -pub const SYS_fpathconf = 192; -pub const SYS_getrlimit = 194; -pub const SYS_setrlimit = 195; -pub const SYS_freebsd11_getdirentries = 196; -// 197 is freebsd6 mmap -pub const SYS___syscall = 198; -// 199 is freebsd6 lseek -// 200 is freebsd6 truncate -// 201 is freebsd6 ftruncate -pub const SYS___sysctl = 202; -pub const SYS_mlock = 203; -pub const SYS_munlock = 204; -pub const SYS_undelete = 205; -pub const SYS_futimes = 206; -pub const SYS_getpgid = 207; -pub const SYS_poll = 209; -pub const SYS_freebsd7___semctl = 220; -pub const SYS_semget = 221; -pub const SYS_semop = 222; -pub const SYS_freebsd7_msgctl = 224; -pub const SYS_msgget = 225; -pub const SYS_msgsnd = 226; -pub const SYS_msgrcv = 227; -pub const SYS_shmat = 228; -pub const SYS_freebsd7_shmctl = 229; -pub const SYS_shmdt = 230; -pub const SYS_shmget = 231; -pub const SYS_clock_gettime = 232; -pub const SYS_clock_settime = 233; -pub const SYS_clock_getres = 234; -pub const SYS_ktimer_create = 235; -pub const SYS_ktimer_delete = 236; -pub const SYS_ktimer_settime = 237; -pub const SYS_ktimer_gettime = 238; -pub const SYS_ktimer_getoverrun = 239; -pub const SYS_nanosleep = 240; -pub const SYS_ffclock_getcounter = 241; -pub const SYS_ffclock_setestimate = 242; -pub const SYS_ffclock_getestimate = 243; -pub const SYS_clock_nanosleep = 244; -pub const SYS_clock_getcpuclockid2 = 247; -pub const SYS_ntp_gettime = 248; -pub const SYS_minherit = 250; -pub const SYS_rfork = 251; -// 252 is obsolete openbsd_poll -pub const SYS_issetugid = 253; -pub const SYS_lchown = 254; -pub const SYS_aio_read = 255; -pub const SYS_aio_write = 256; -pub const SYS_lio_listio = 257; -pub const SYS_freebsd11_getdents = 272; -pub const SYS_lchmod = 274; -// 275 is obsolete netbsd_lchown -pub const SYS_lutimes = 276; -// 277 is obsolete netbsd_msync -pub const SYS_freebsd11_nstat = 278; -pub const SYS_freebsd11_nfstat = 279; -pub const SYS_freebsd11_nlstat = 280; -pub const SYS_preadv = 289; -pub const SYS_pwritev = 290; -// 297 is freebsd4 fhstatfs -pub const SYS_fhopen = 298; -pub const SYS_freebsd11_fhstat = 299; -pub const SYS_modnext = 300; -pub const SYS_modstat = 301; -pub const SYS_modfnext = 302; -pub const SYS_modfind = 303; -pub const SYS_kldload = 304; -pub const SYS_kldunload = 305; -pub const SYS_kldfind = 306; -pub const SYS_kldnext = 307; -pub const SYS_kldstat = 308; -pub const SYS_kldfirstmod = 309; -pub const SYS_getsid = 310; -pub const SYS_setresuid = 311; -pub const SYS_setresgid = 312; -// 313 is obsolete signanosleep -pub const SYS_aio_return = 314; -pub const SYS_aio_suspend = 315; -pub const SYS_aio_cancel = 316; -pub const SYS_aio_error = 317; -// 318 is freebsd6 aio_read -// 319 is freebsd6 aio_write -// 320 is freebsd6 lio_listio -pub const SYS_yield = 321; -// 322 is obsolete thr_sleep -// 323 is obsolete thr_wakeup -pub const SYS_mlockall = 324; -pub const SYS_munlockall = 325; -pub const SYS___getcwd = 326; -pub const SYS_sched_setparam = 327; -pub const SYS_sched_getparam = 328; -pub const SYS_sched_setscheduler = 329; -pub const SYS_sched_getscheduler = 330; -pub const SYS_sched_yield = 331; -pub const SYS_sched_get_priority_max = 332; -pub const SYS_sched_get_priority_min = 333; -pub const SYS_sched_rr_get_interval = 334; -pub const SYS_utrace = 335; -// 336 is freebsd4 sendfile -pub const SYS_kldsym = 337; -pub const SYS_jail = 338; -pub const SYS_nnpfs_syscall = 339; -pub const SYS_sigprocmask = 340; -pub const SYS_sigsuspend = 341; -// 342 is freebsd4 sigaction -pub const SYS_sigpending = 343; -// 344 is freebsd4 sigreturn -pub const SYS_sigtimedwait = 345; -pub const SYS_sigwaitinfo = 346; -pub const SYS___acl_get_file = 347; -pub const SYS___acl_set_file = 348; -pub const SYS___acl_get_fd = 349; -pub const SYS___acl_set_fd = 350; -pub const SYS___acl_delete_file = 351; -pub const SYS___acl_delete_fd = 352; -pub const SYS___acl_aclcheck_file = 353; -pub const SYS___acl_aclcheck_fd = 354; -pub const SYS_extattrctl = 355; -pub const SYS_extattr_set_file = 356; -pub const SYS_extattr_get_file = 357; -pub const SYS_extattr_delete_file = 358; -pub const SYS_aio_waitcomplete = 359; -pub const SYS_getresuid = 360; -pub const SYS_getresgid = 361; -pub const SYS_kqueue = 362; -pub const SYS_freebsd11_kevent = 363; -// 364 is obsolete __cap_get_proc -// 365 is obsolete __cap_set_proc -// 366 is obsolete __cap_get_fd -// 367 is obsolete __cap_get_file -// 368 is obsolete __cap_set_fd -// 369 is obsolete __cap_set_file -pub const SYS_extattr_set_fd = 371; -pub const SYS_extattr_get_fd = 372; -pub const SYS_extattr_delete_fd = 373; -pub const SYS___setugid = 374; -pub const SYS_eaccess = 376; -pub const SYS_afs3_syscall = 377; -pub const SYS_nmount = 378; -// 379 is obsolete kse_exit -// 380 is obsolete kse_wakeup -// 381 is obsolete kse_create -// 382 is obsolete kse_thr_interrupt -// 383 is obsolete kse_release -pub const SYS___mac_get_proc = 384; -pub const SYS___mac_set_proc = 385; -pub const SYS___mac_get_fd = 386; -pub const SYS___mac_get_file = 387; -pub const SYS___mac_set_fd = 388; -pub const SYS___mac_set_file = 389; -pub const SYS_kenv = 390; -pub const SYS_lchflags = 391; -pub const SYS_uuidgen = 392; -pub const SYS_sendfile = 393; -pub const SYS_mac_syscall = 394; -pub const SYS_freebsd11_getfsstat = 395; -pub const SYS_freebsd11_statfs = 396; -pub const SYS_freebsd11_fstatfs = 397; -pub const SYS_freebsd11_fhstatfs = 398; -pub const SYS_ksem_close = 400; -pub const SYS_ksem_post = 401; -pub const SYS_ksem_wait = 402; -pub const SYS_ksem_trywait = 403; -pub const SYS_ksem_init = 404; -pub const SYS_ksem_open = 405; -pub const SYS_ksem_unlink = 406; -pub const SYS_ksem_getvalue = 407; -pub const SYS_ksem_destroy = 408; -pub const SYS___mac_get_pid = 409; -pub const SYS___mac_get_link = 410; -pub const SYS___mac_set_link = 411; -pub const SYS_extattr_set_link = 412; -pub const SYS_extattr_get_link = 413; -pub const SYS_extattr_delete_link = 414; -pub const SYS___mac_execve = 415; -pub const SYS_sigaction = 416; -pub const SYS_sigreturn = 417; -pub const SYS_getcontext = 421; -pub const SYS_setcontext = 422; -pub const SYS_swapcontext = 423; -pub const SYS_swapoff = 424; -pub const SYS___acl_get_link = 425; -pub const SYS___acl_set_link = 426; -pub const SYS___acl_delete_link = 427; -pub const SYS___acl_aclcheck_link = 428; -pub const SYS_sigwait = 429; -pub const SYS_thr_create = 430; -pub const SYS_thr_exit = 431; -pub const SYS_thr_self = 432; -pub const SYS_thr_kill = 433; -pub const SYS_jail_attach = 436; -pub const SYS_extattr_list_fd = 437; -pub const SYS_extattr_list_file = 438; -pub const SYS_extattr_list_link = 439; -// 440 is obsolete kse_switchin -pub const SYS_ksem_timedwait = 441; -pub const SYS_thr_suspend = 442; -pub const SYS_thr_wake = 443; -pub const SYS_kldunloadf = 444; -pub const SYS_audit = 445; -pub const SYS_auditon = 446; -pub const SYS_getauid = 447; -pub const SYS_setauid = 448; -pub const SYS_getaudit = 449; -pub const SYS_setaudit = 450; -pub const SYS_getaudit_addr = 451; -pub const SYS_setaudit_addr = 452; -pub const SYS_auditctl = 453; -pub const SYS__umtx_op = 454; -pub const SYS_thr_new = 455; -pub const SYS_sigqueue = 456; -pub const SYS_kmq_open = 457; -pub const SYS_kmq_setattr = 458; -pub const SYS_kmq_timedreceive = 459; -pub const SYS_kmq_timedsend = 460; -pub const SYS_kmq_notify = 461; -pub const SYS_kmq_unlink = 462; -pub const SYS_abort2 = 463; -pub const SYS_thr_set_name = 464; -pub const SYS_aio_fsync = 465; -pub const SYS_rtprio_thread = 466; -pub const SYS_sctp_peeloff = 471; -pub const SYS_sctp_generic_sendmsg = 472; -pub const SYS_sctp_generic_sendmsg_iov = 473; -pub const SYS_sctp_generic_recvmsg = 474; -pub const SYS_pread = 475; -pub const SYS_pwrite = 476; -pub const SYS_mmap = 477; -pub const SYS_lseek = 478; -pub const SYS_truncate = 479; -pub const SYS_ftruncate = 480; -pub const SYS_thr_kill2 = 481; -pub const SYS_shm_open = 482; -pub const SYS_shm_unlink = 483; -pub const SYS_cpuset = 484; -pub const SYS_cpuset_setid = 485; -pub const SYS_cpuset_getid = 486; -pub const SYS_cpuset_getaffinity = 487; -pub const SYS_cpuset_setaffinity = 488; -pub const SYS_faccessat = 489; -pub const SYS_fchmodat = 490; -pub const SYS_fchownat = 491; -pub const SYS_fexecve = 492; -pub const SYS_freebsd11_fstatat = 493; -pub const SYS_futimesat = 494; -pub const SYS_linkat = 495; -pub const SYS_mkdirat = 496; -pub const SYS_mkfifoat = 497; -pub const SYS_freebsd11_mknodat = 498; -pub const SYS_openat = 499; -pub const SYS_readlinkat = 500; -pub const SYS_renameat = 501; -pub const SYS_symlinkat = 502; -pub const SYS_unlinkat = 503; -pub const SYS_posix_openpt = 504; -pub const SYS_gssd_syscall = 505; -pub const SYS_jail_get = 506; -pub const SYS_jail_set = 507; -pub const SYS_jail_remove = 508; -pub const SYS_closefrom = 509; -pub const SYS___semctl = 510; -pub const SYS_msgctl = 511; -pub const SYS_shmctl = 512; -pub const SYS_lpathconf = 513; -// 514 is obsolete cap_new -pub const SYS___cap_rights_get = 515; -pub const SYS_cap_enter = 516; -pub const SYS_cap_getmode = 517; -pub const SYS_pdfork = 518; -pub const SYS_pdkill = 519; -pub const SYS_pdgetpid = 520; -pub const SYS_pselect = 522; -pub const SYS_getloginclass = 523; -pub const SYS_setloginclass = 524; -pub const SYS_rctl_get_racct = 525; -pub const SYS_rctl_get_rules = 526; -pub const SYS_rctl_get_limits = 527; -pub const SYS_rctl_add_rule = 528; -pub const SYS_rctl_remove_rule = 529; -pub const SYS_posix_fallocate = 530; -pub const SYS_posix_fadvise = 531; -pub const SYS_wait6 = 532; -pub const SYS_cap_rights_limit = 533; -pub const SYS_cap_ioctls_limit = 534; -pub const SYS_cap_ioctls_get = 535; -pub const SYS_cap_fcntls_limit = 536; -pub const SYS_cap_fcntls_get = 537; -pub const SYS_bindat = 538; -pub const SYS_connectat = 539; -pub const SYS_chflagsat = 540; -pub const SYS_accept4 = 541; -pub const SYS_pipe2 = 542; -pub const SYS_aio_mlock = 543; -pub const SYS_procctl = 544; -pub const SYS_ppoll = 545; -pub const SYS_futimens = 546; -pub const SYS_utimensat = 547; -// 548 is obsolete numa_getaffinity -// 549 is obsolete numa_setaffinity -pub const SYS_fdatasync = 550; -pub const SYS_fstat = 551; -pub const SYS_fstatat = 552; -pub const SYS_fhstat = 553; -pub const SYS_getdirentries = 554; -pub const SYS_statfs = 555; -pub const SYS_fstatfs = 556; -pub const SYS_getfsstat = 557; -pub const SYS_fhstatfs = 558; -pub const SYS_mknodat = 559; -pub const SYS_kevent = 560; -pub const SYS_cpuset_getdomain = 561; -pub const SYS_cpuset_setdomain = 562; -pub const SYS_getrandom = 563; -pub const SYS_MAXSYSCALL = 564; diff --git a/std/os/freebsd/x86_64.zig b/std/os/freebsd/x86_64.zig deleted file mode 100644 index 509075386fa2..000000000000 --- a/std/os/freebsd/x86_64.zig +++ /dev/null @@ -1,136 +0,0 @@ -const freebsd = @import("index.zig"); -const socklen_t = freebsd.socklen_t; -const iovec = freebsd.iovec; - -pub const SYS_sbrk = 69; - -pub fn syscall0(number: usize) usize { - return asm volatile ("syscall" - : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number) - : "rcx", "r11" - ); -} - -pub fn syscall1(number: usize, arg1: usize) usize { - return asm volatile ("syscall" - : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), - [arg1] "{rdi}" (arg1) - : "rcx", "r11" - ); -} - -pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize { - return asm volatile ("syscall" - : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), - [arg1] "{rdi}" (arg1), - [arg2] "{rsi}" (arg2) - : "rcx", "r11" - ); -} - -pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize { - return asm volatile ("syscall" - : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), - [arg1] "{rdi}" (arg1), - [arg2] "{rsi}" (arg2), - [arg3] "{rdx}" (arg3) - : "rcx", "r11" - ); -} - -pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize { - return asm volatile ("syscall" - : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), - [arg1] "{rdi}" (arg1), - [arg2] "{rsi}" (arg2), - [arg3] "{rdx}" (arg3), - [arg4] "{r10}" (arg4) - : "rcx", "r11" - ); -} - -pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize { - return asm volatile ("syscall" - : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), - [arg1] "{rdi}" (arg1), - [arg2] "{rsi}" (arg2), - [arg3] "{rdx}" (arg3), - [arg4] "{r10}" (arg4), - [arg5] "{r8}" (arg5) - : "rcx", "r11" - ); -} - -pub fn syscall6( - number: usize, - arg1: usize, - arg2: usize, - arg3: usize, - arg4: usize, - arg5: usize, - arg6: usize, -) usize { - return asm volatile ("syscall" - : [ret] "={rax}" (-> usize) - : [number] "{rax}" (number), - [arg1] "{rdi}" (arg1), - [arg2] "{rsi}" (arg2), - [arg3] "{rdx}" (arg3), - [arg4] "{r10}" (arg4), - [arg5] "{r8}" (arg5), - [arg6] "{r9}" (arg6) - : "rcx", "r11" - ); -} - -pub nakedcc fn restore_rt() void { - asm volatile ("syscall" - : - : [number] "{rax}" (usize(SYS_rt_sigreturn)) - : "rcx", "r11" - ); -} - -pub const msghdr = extern struct { - msg_name: *u8, - msg_namelen: socklen_t, - msg_iov: *iovec, - msg_iovlen: i32, - __pad1: i32, - msg_control: *u8, - msg_controllen: socklen_t, - __pad2: socklen_t, - msg_flags: i32, -}; - -/// Renamed to Stat to not conflict with the stat function. -pub const Stat = extern struct { - dev: u64, - ino: u64, - nlink: usize, - - mode: u32, - uid: u32, - gid: u32, - __pad0: u32, - rdev: u64, - size: i64, - blksize: isize, - blocks: i64, - - atim: timespec, - mtim: timespec, - ctim: timespec, - __unused: [3]isize, -}; - -pub const timespec = extern struct { - tv_sec: isize, - tv_nsec: isize, -}; From 5ea37f6e8c9226ec02fbc95cc5c6d06a8e9ee6f7 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Mon, 17 Dec 2018 22:06:28 -0200 Subject: [PATCH 02/21] freebsd: add getdirentries --- std/c/freebsd.zig | 12 +++++++++ std/os/freebsd/index.zig | 5 ++++ std/os/index.zig | 53 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index a97cf52eb949..fbcd6236f06b 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -13,6 +13,7 @@ pub extern "c" fn kevent( pub extern "c" fn sysctl(name: [*]c_int, namelen: c_uint, oldp: ?*c_void, oldlenp: ?*usize, newp: ?*c_void, newlen: usize) c_int; pub extern "c" fn sysctlbyname(name: [*]const u8, oldp: ?*c_void, oldlenp: ?*usize, newp: ?*c_void, newlen: usize) c_int; pub extern "c" fn sysctlnametomib(name: [*]const u8, mibp: ?*c_int, sizep: ?*usize) c_int; +pub extern "c" fn getdirentries(fd: c_int, buf_ptr: [*]u8, nbytes: usize, basep: *i64) usize; /// Renamed from `kevent` to `Kevent` to avoid conflict with function name. pub const Kevent = extern struct { @@ -66,3 +67,14 @@ pub const timespec = extern struct { tv_sec: isize, tv_nsec: isize, }; + +pub const dirent = extern struct { + d_fileno: usize, + d_off: i64, + d_reclen: u64, + d_type: u8, + d_pad0: u8, + d_namlen: u16, + d_pad1: u16, + d_name: [256]u8, +}; diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index 975479c1e008..880a49b4a856 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -562,6 +562,10 @@ pub fn getdents(fd: i32, dirp: [*]u8, count: usize) usize { return arch.syscall3(SYS_getdents, @bitCast(usize, isize(fd)), @ptrToInt(dirp), count); } +pub fn getdirentries(fd: i32, buf_ptr: [*]u8, buf_len: usize, basep: *i64) usize { + return errnoWrap(@bitCast(isize, c.getdirentries(fd, buf_ptr, buf_len, basep))); +} + pub fn isatty(fd: i32) bool { var wsz: winsize = undefined; return arch.syscall3(SYS_ioctl, @bitCast(usize, isize(fd)), TIOCGWINSZ, @ptrToInt(&wsz)) == 0; @@ -743,6 +747,7 @@ pub fn raise(sig: i32) usize { } pub const Stat = c.Stat; +pub const dirent = c.dirent; pub const timespec = c.timespec; pub fn fstat(fd: i32, stat_buf: *Stat) usize { diff --git a/std/os/index.zig b/std/os/index.zig index be82ad4716de..778ab156b09c 100644 --- a/std/os/index.zig +++ b/std/os/index.zig @@ -1753,8 +1753,57 @@ pub const Dir = struct { } fn nextFreebsd(self: *Dir) !?Entry { - //self.handle.buf = try self.allocator.alloc(u8, page_size); - @compileError("TODO implement dirs for FreeBSD"); + start_over: while (true) { + if (self.handle.index >= self.handle.end_index) { + if (self.handle.buf.len == 0) { + self.handle.buf = try self.allocator.alloc(u8, page_size); + } + + while (true) { + const result = posix.getdirentries(self.handle.fd, self.handle.buf.ptr, self.handle.buf.len, &self.handle.seek); + const err = posix.getErrno(result); + if (err > 0) { + switch (err) { + posix.EBADF, posix.EFAULT, posix.ENOTDIR => unreachable, + posix.EINVAL => { + self.handle.buf = try self.allocator.realloc(u8, self.handle.buf, self.handle.buf.len * 2); + continue; + }, + else => return unexpectedErrorPosix(err), + } + } + if (result == 0) return null; + self.handle.index = 0; + self.handle.end_index = result; + break; + } + } + const freebsd_entry = @ptrCast(*align(1) posix.dirent, &self.handle.buf[self.handle.index]); + const next_index = self.handle.index + freebsd_entry.d_reclen; + self.handle.index = next_index; + + const name = @ptrCast([*]u8, &freebsd_entry.d_name)[0..freebsd_entry.d_namlen]; + + if (mem.eql(u8, name, ".") or mem.eql(u8, name, "..")) { + continue :start_over; + } + + const entry_kind = switch (freebsd_entry.d_type) { + posix.DT_BLK => Entry.Kind.BlockDevice, + posix.DT_CHR => Entry.Kind.CharacterDevice, + posix.DT_DIR => Entry.Kind.Directory, + posix.DT_FIFO => Entry.Kind.NamedPipe, + posix.DT_LNK => Entry.Kind.SymLink, + posix.DT_REG => Entry.Kind.File, + posix.DT_SOCK => Entry.Kind.UnixDomainSocket, + posix.DT_WHT => Entry.Kind.Whiteout, + else => Entry.Kind.Unknown, + }; + return Entry{ + .name = name, + .kind = entry_kind, + }; + } } }; From 0273fbf710f98854f3331c0810cd2f31f20d2fb5 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Mon, 17 Dec 2018 22:07:21 -0200 Subject: [PATCH 03/21] freebsd: add access --- std/os/freebsd/index.zig | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index 880a49b4a856..73573d1d213b 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -95,6 +95,13 @@ pub const SIGLIBRT = 33; pub const SIGRTMIN = 65; pub const SIGRTMAX = 126; +// access function +pub const F_OK = 0; // test for existence of file +pub const X_OK = 1; // test for execute or search permission +pub const W_OK = 2; // test for write permission +pub const R_OK = 4; // test for read permission + + pub const O_RDONLY = 0o0; pub const O_WRONLY = 0o1; pub const O_RDWR = 0o2; @@ -554,6 +561,10 @@ pub fn fork() usize { return arch.syscall0(SYS_fork); } +pub fn access(path: [*]const u8, mode: u32) usize { + return errnoWrap(c.access(path, mode)); +} + pub fn getcwd(buf: [*]u8, size: usize) usize { return arch.syscall2(SYS___getcwd, @ptrToInt(buf), size); } From 1fc56b82ad6f1060ec4b2074c16accfe0327a4b7 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Tue, 18 Dec 2018 00:19:20 -0200 Subject: [PATCH 04/21] freebsd: link against libc Since the stable kernel ABI is through libc #1759 --- src/analyze.cpp | 2 +- src/codegen.cpp | 3 ++- std/special/bootstrap.zig | 15 ++++----------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/analyze.cpp b/src/analyze.cpp index 46686ce7723f..064cf11cc174 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -6366,7 +6366,7 @@ LinkLib *add_link_lib(CodeGen *g, Buf *name) { if (is_libc && g->libc_link_lib != nullptr) return g->libc_link_lib; - if (g->enable_cache && is_libc && g->zig_target.os != OsMacOSX && g->zig_target.os != OsIOS) { + if (g->enable_cache && is_libc && g->zig_target.os != OsMacOSX && g->zig_target.os != OsIOS && g->zig_target.os != OsFreeBSD) { fprintf(stderr, "TODO linking against libc is currently incompatible with `--cache on`.\n" "Zig is not yet capable of determining whether the libc installation has changed on subsequent builds.\n"); exit(1); diff --git a/src/codegen.cpp b/src/codegen.cpp index e37703d5f0f6..e2d23513ff11 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -178,7 +178,8 @@ CodeGen *codegen_create(Buf *root_src_path, const ZigTarget *target, OutType out // On Darwin/MacOS/iOS, we always link libSystem which contains libc. if (g->zig_target.os == OsMacOSX || - g->zig_target.os == OsIOS) + g->zig_target.os == OsIOS || + g->zig_target.os == OsFreeBSD) { g->libc_link_lib = create_link_lib(buf_create_from_str("c")); g->link_libs_list.append(g->libc_link_lib); diff --git a/std/special/bootstrap.zig b/std/special/bootstrap.zig index a15be317ab08..129bde913fd2 100644 --- a/std/special/bootstrap.zig +++ b/std/special/bootstrap.zig @@ -20,17 +20,10 @@ comptime { nakedcc fn _start() noreturn { switch (builtin.arch) { - builtin.Arch.x86_64 => switch (builtin.os) { - builtin.Os.freebsd => { - argc_ptr = asm ("lea (%%rdi), %[argc]" - : [argc] "=r" (-> [*]usize) - ); - }, - else => { - argc_ptr = asm ("lea (%%rsp), %[argc]" - : [argc] "=r" (-> [*]usize) - ); - }, + builtin.Arch.x86_64 => { + argc_ptr = asm ("lea (%%rsp), %[argc]" + : [argc] "=r" (-> [*]usize) + ); }, builtin.Arch.i386 => { argc_ptr = asm ("lea (%%esp), %[argc]" From 6cfcdbde2b902476863cb912190f20ce5e02277c Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Tue, 18 Dec 2018 00:19:52 -0200 Subject: [PATCH 05/21] freebsd: link against libc++ All supported versions of FreeBSD have libc++ in the base system. --- build.zig | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/build.zig b/build.zig index e411ae8b2102..2a51203ff77b 100644 --- a/build.zig +++ b/build.zig @@ -293,11 +293,17 @@ fn configureStage2(b: *Builder, exe: var, ctx: Context) !void { try addCxxKnownPath(b, ctx, exe, "libstdc++.a", \\Unable to determine path to libstdc++.a \\On Fedora, install libstdc++-static and try again. - \\ ); exe.linkSystemLibrary("pthread"); - } else if (exe.target.isDarwin() or exe.target.isFreeBSD()) { + } else if (exe.target.isFreeBSD()) { + try addCxxKnownPath(b, ctx, exe, "libc++.a", null); + exe.linkSystemLibrary("pthread"); + // TODO LLD cannot perform this link. + // See https://github.com/ziglang/zig/issues/1535 + exe.enableSystemLinkerHack(); + } + else if (exe.target.isDarwin()) { if (addCxxKnownPath(b, ctx, exe, "libgcc_eh.a", "")) { // Compiler is GCC. try addCxxKnownPath(b, ctx, exe, "libstdc++.a", null); From 11ced4f99d95ec144d9dbb79ead335b571f714fe Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Tue, 18 Dec 2018 01:32:35 -0200 Subject: [PATCH 06/21] freebsd: use libc interface instead system calls Remove all syscalls references * dup2() * chdir() * execve() * fork() * getcwd() * isatty() * readlink() * mkdir() * mmap() * munmap() * read() * rmdir() * symlink() * pread() * write() * pwrite() * rename() * open() * close() * lseek() * exit() * unlink() * waitpid() * nanosleep() * setreuid() * setregid() * raise() * fstat() * pipe() * added pipe2() extern c fn --- std/c/freebsd.zig | 2 + std/os/freebsd/index.zig | 114 +++++++++++++++++++-------------------- 2 files changed, 57 insertions(+), 59 deletions(-) diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index fbcd6236f06b..32cd48748c4d 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -14,6 +14,8 @@ pub extern "c" fn sysctl(name: [*]c_int, namelen: c_uint, oldp: ?*c_void, oldlen pub extern "c" fn sysctlbyname(name: [*]const u8, oldp: ?*c_void, oldlenp: ?*usize, newp: ?*c_void, newlen: usize) c_int; pub extern "c" fn sysctlnametomib(name: [*]const u8, mibp: ?*c_int, sizep: ?*usize) c_int; pub extern "c" fn getdirentries(fd: c_int, buf_ptr: [*]u8, nbytes: usize, basep: *i64) usize; +pub extern "c" fn pipe2(arg0: *[2]c_int, arg1: u32) c_int; +pub extern "c" fn getrandom(buf: [*]u8, count: usize, flags: u32) c_int; /// Renamed from `kevent` to `Kevent` to avoid conflict with function name. pub const Kevent = extern struct { diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index 73573d1d213b..9191dc3219e6 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -1,14 +1,11 @@ -const assert = @import("../debug.zig").assert; const builtin = @import("builtin"); -const arch = switch (builtin.arch) { - builtin.Arch.x86_64 => @import("x86_64.zig"), - else => @compileError("unsupported arch"), -}; -pub use @import("syscall.zig"); + pub use @import("errno.zig"); const std = @import("../../index.zig"); const c = std.c; + +const assert = std.debug.assert; const maxInt = std.math.maxInt; pub const Kevent = c.Kevent; @@ -546,19 +543,19 @@ pub fn getErrno(r: usize) usize { } pub fn dup2(old: i32, new: i32) usize { - return arch.syscall2(SYS_dup2, @bitCast(usize, isize(old)), @bitCast(usize, isize(new))); + return errnoWrap(c.dup2(old, new)); } pub fn chdir(path: [*]const u8) usize { - return arch.syscall1(SYS_chdir, @ptrToInt(path)); + return errnoWrap(c.chdir(path)); } pub fn execve(path: [*]const u8, argv: [*]const ?[*]const u8, envp: [*]const ?[*]const u8) usize { - return arch.syscall3(SYS_execve, @ptrToInt(path), @ptrToInt(argv), @ptrToInt(envp)); + return errnoWrap(c.execve(path, argv, envp)); } pub fn fork() usize { - return arch.syscall0(SYS_fork); + return errnoWrap(c.fork()); } pub fn access(path: [*]const u8, mode: u32) usize { @@ -566,7 +563,7 @@ pub fn access(path: [*]const u8, mode: u32) usize { } pub fn getcwd(buf: [*]u8, size: usize) usize { - return arch.syscall2(SYS___getcwd, @ptrToInt(buf), size); + return if (c.getcwd(buf, size) == null) @bitCast(usize, -isize(c._errno().*)) else 0; } pub fn getdents(fd: i32, dirp: [*]u8, count: usize) usize { @@ -578,40 +575,48 @@ pub fn getdirentries(fd: i32, buf_ptr: [*]u8, buf_len: usize, basep: *i64) usize } pub fn isatty(fd: i32) bool { - var wsz: winsize = undefined; - return arch.syscall3(SYS_ioctl, @bitCast(usize, isize(fd)), TIOCGWINSZ, @ptrToInt(&wsz)) == 0; + return c.isatty(fd) != 0; } pub fn readlink(noalias path: [*]const u8, noalias buf_ptr: [*]u8, buf_len: usize) usize { - return arch.syscall3(SYS_readlink, @ptrToInt(path), @ptrToInt(buf_ptr), buf_len); + return errnoWrap(c.readlink(path, buf_ptr, buf_len)); } pub fn mkdir(path: [*]const u8, mode: u32) usize { - return arch.syscall2(SYS_mkdir, @ptrToInt(path), mode); + return errnoWrap(c.mkdir(path, mode)); } -pub fn mmap(address: ?*u8, length: usize, prot: usize, flags: usize, fd: i32, offset: isize) usize { - return arch.syscall6(SYS_mmap, @ptrToInt(address), length, prot, flags, @bitCast(usize, isize(fd)), @bitCast(usize, offset)); +pub fn mmap(address: ?[*]u8, length: usize, prot: usize, flags: u32, fd: i32, offset: isize) usize { + const ptr_result = c.mmap( + @ptrCast(*c_void, address), + length, + @bitCast(c_int, @intCast(c_uint, prot)), + @bitCast(c_int, c_uint(flags)), + fd, + offset, + ); + const isize_result = @bitCast(isize, @ptrToInt(ptr_result)); + return errnoWrap(isize_result); } pub fn munmap(address: usize, length: usize) usize { - return arch.syscall2(SYS_munmap, address, length); + return errnoWrap(c.munmap(@intToPtr(*c_void, address), length)); } -pub fn read(fd: i32, buf: [*]u8, count: usize) usize { - return arch.syscall3(SYS_read, @bitCast(usize, isize(fd)), @ptrToInt(buf), count); +pub fn read(fd: i32, buf: [*]u8, nbyte: usize) usize { + return errnoWrap(c.read(fd, @ptrCast(*c_void, buf), nbyte)); } pub fn rmdir(path: [*]const u8) usize { - return arch.syscall1(SYS_rmdir, @ptrToInt(path)); + return errnoWrap(c.rmdir(path)); } pub fn symlink(existing: [*]const u8, new: [*]const u8) usize { - return arch.syscall2(SYS_symlink, @ptrToInt(existing), @ptrToInt(new)); + return errnoWrap(c.symlink(existing, new)); } -pub fn pread(fd: i32, buf: [*]u8, count: usize, offset: usize) usize { - return arch.syscall4(SYS_pread, @bitCast(usize, isize(fd)), @ptrToInt(buf), count, offset); +pub fn pread(fd: i32, buf: [*]u8, nbyte: usize, offset: u64) usize { + return errnoWrap(c.pread(fd, @ptrCast(*c_void, buf), nbyte, offset)); } pub fn preadv(fd: i32, iov: [*]const iovec, count: usize, offset: usize) usize { @@ -622,16 +627,17 @@ pub fn pipe(fd: *[2]i32) usize { return pipe2(fd, 0); } -pub fn pipe2(fd: *[2]i32, flags: usize) usize { - return arch.syscall2(SYS_pipe2, @ptrToInt(fd), flags); +pub fn pipe2(fd: *[2]i32, flags: u32) usize { + comptime assert(i32.bit_count == c_int.bit_count); + return errnoWrap(c.pipe2(@ptrCast(*[2]c_int, fd), flags)); } -pub fn write(fd: i32, buf: [*]const u8, count: usize) usize { - return arch.syscall3(SYS_write, @bitCast(usize, isize(fd)), @ptrToInt(buf), count); +pub fn write(fd: i32, buf: [*]const u8, nbyte: usize) usize { + return errnoWrap(c.write(fd, @ptrCast(*const c_void, buf), nbyte)); } -pub fn pwrite(fd: i32, buf: [*]const u8, count: usize, offset: usize) usize { - return arch.syscall4(SYS_pwrite, @bitCast(usize, isize(fd)), @ptrToInt(buf), count, offset); +pub fn pwrite(fd: i32, buf: [*]const u8, nbyte: usize, offset: u64) usize { + return errnoWrap(c.pwrite(fd, @ptrCast(*const c_void, buf), nbyte, offset)); } pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: usize) usize { @@ -639,11 +645,11 @@ pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: usize) } pub fn rename(old: [*]const u8, new: [*]const u8) usize { - return arch.syscall2(SYS_rename, @ptrToInt(old), @ptrToInt(new)); + return errnoWrap(c.rename(old, new)); } -pub fn open(path: [*]const u8, flags: u32, perm: usize) usize { - return arch.syscall3(SYS_open, @ptrToInt(path), flags, perm); +pub fn open(path: [*]const u8, flags: u32, mode: usize) usize { + return errnoWrap(c.open(path, @bitCast(c_int, flags), mode)); } pub fn create(path: [*]const u8, perm: usize) usize { @@ -655,20 +661,19 @@ pub fn openat(dirfd: i32, path: [*]const u8, flags: usize, mode: usize) usize { } pub fn close(fd: i32) usize { - return arch.syscall1(SYS_close, @bitCast(usize, isize(fd))); + return errnoWrap(c.close(fd)); } -pub fn lseek(fd: i32, offset: isize, ref_pos: usize) usize { - return arch.syscall3(SYS_lseek, @bitCast(usize, isize(fd)), @bitCast(usize, offset), ref_pos); +pub fn lseek(fd: i32, offset: isize, whence: c_int) usize { + return errnoWrap(c.lseek(fd, offset, whence)); } -pub fn exit(status: i32) noreturn { - _ = arch.syscall1(SYS_exit, @bitCast(usize, isize(status))); - unreachable; +pub fn exit(code: i32) noreturn { + c.exit(code); } pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize { - return arch.syscall3(SYS_getrandom, @ptrToInt(buf), count, usize(flags)); + return errnoWrap(c.getrandom(buf, count, flags)); } pub fn kill(pid: i32, sig: i32) usize { @@ -676,15 +681,16 @@ pub fn kill(pid: i32, sig: i32) usize { } pub fn unlink(path: [*]const u8) usize { - return arch.syscall1(SYS_unlink, @ptrToInt(path)); + return errnoWrap(c.unlink(path)); } -pub fn waitpid(pid: i32, status: *i32, options: i32) usize { - return arch.syscall4(SYS_wait4, @bitCast(usize, isize(pid)), @ptrToInt(status), @bitCast(usize, isize(options)), 0); +pub fn waitpid(pid: i32, status: *i32, options: u32) usize { + comptime assert(i32.bit_count == c_int.bit_count); + return errnoWrap(c.waitpid(pid, @ptrCast(*c_int, status), @bitCast(c_int, options))); } pub fn nanosleep(req: *const timespec, rem: ?*timespec) usize { - return arch.syscall2(SYS_nanosleep, @ptrToInt(req), @ptrToInt(rem)); + return errnoWrap(c.nanosleep(req, rem)); } pub fn setuid(uid: u32) usize { @@ -696,11 +702,11 @@ pub fn setgid(gid: u32) usize { } pub fn setreuid(ruid: u32, euid: u32) usize { - return arch.syscall2(SYS_setreuid, ruid, euid); + return errnoWrap(c.setreuid(ruid, euid)); } pub fn setregid(rgid: u32, egid: u32) usize { - return arch.syscall2(SYS_setregid, rgid, egid); + return errnoWrap(c.setregid(rgid, egid)); } const NSIG = 32; @@ -745,26 +751,16 @@ pub const sigset_t = extern struct { }; pub fn raise(sig: i32) usize { - // TODO have a chat with the freebsd folks and make sure there's no bug in - // their libc. musl-libc blocks signals in between these calls because - // if a signal handler runs and forks between the gettid and sending the - // signal, the parent will get 2 signals, one from itself and one from the child - // if the protection does not belong here, then it belongs in abort(), - // like it does in freebsd's libc. - var id: usize = undefined; - const rc = arch.syscall1(SYS_thr_self, @ptrToInt(&id)); - if (getErrno(rc) != 0) return rc; - return arch.syscall2(SYS_thr_kill, id, @bitCast(usize, isize(sig))); + return errnoWrap(c.raise(sig)); } pub const Stat = c.Stat; pub const dirent = c.dirent; pub const timespec = c.timespec; -pub fn fstat(fd: i32, stat_buf: *Stat) usize { - return arch.syscall2(SYS_fstat, @bitCast(usize, isize(fd)), @ptrToInt(stat_buf)); +pub fn fstat(fd: i32, buf: *c.Stat) usize { + return errnoWrap(c.fstat(fd, buf)); } - pub const iovec = extern struct { iov_base: [*]u8, iov_len: usize, From 1811e7e6c96844a8381e6a69017948cae0b8b261 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Tue, 18 Dec 2018 02:42:54 -0200 Subject: [PATCH 07/21] freebsd: remove getrandom dependency from libc The system call getrandom(2) just landed on FreeBSD 12, so if we want to support some earlier version or at least FreeBSD 11, we can't depend on the system call. --- std/c/freebsd.zig | 1 - std/os/freebsd/index.zig | 4 ---- std/os/index.zig | 4 ++-- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index 32cd48748c4d..86213ee1b339 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -15,7 +15,6 @@ pub extern "c" fn sysctlbyname(name: [*]const u8, oldp: ?*c_void, oldlenp: ?*usi pub extern "c" fn sysctlnametomib(name: [*]const u8, mibp: ?*c_int, sizep: ?*usize) c_int; pub extern "c" fn getdirentries(fd: c_int, buf_ptr: [*]u8, nbytes: usize, basep: *i64) usize; pub extern "c" fn pipe2(arg0: *[2]c_int, arg1: u32) c_int; -pub extern "c" fn getrandom(buf: [*]u8, count: usize, flags: u32) c_int; /// Renamed from `kevent` to `Kevent` to avoid conflict with function name. pub const Kevent = extern struct { diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index 9191dc3219e6..9f9f7f9de04b 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -672,10 +672,6 @@ pub fn exit(code: i32) noreturn { c.exit(code); } -pub fn getrandom(buf: [*]u8, count: usize, flags: u32) usize { - return errnoWrap(c.getrandom(buf, count, flags)); -} - pub fn kill(pid: i32, sig: i32) usize { return arch.syscall2(SYS_kill, @bitCast(usize, isize(pid)), @bitCast(usize, isize(sig))); } diff --git a/std/os/index.zig b/std/os/index.zig index 778ab156b09c..b49b46e8e55e 100644 --- a/std/os/index.zig +++ b/std/os/index.zig @@ -103,7 +103,7 @@ const math = std.math; /// library implementation. pub fn getRandomBytes(buf: []u8) !void { switch (builtin.os) { - Os.linux, Os.freebsd => while (true) { + Os.linux => while (true) { // TODO check libc version and potentially call c.getrandom. // See #397 const errno = posix.getErrno(posix.getrandom(buf.ptr, buf.len, 0)); @@ -116,7 +116,7 @@ pub fn getRandomBytes(buf: []u8) !void { else => return unexpectedErrorPosix(errno), } }, - Os.macosx, Os.ios => return getRandomBytesDevURandom(buf), + Os.macosx, Os.ios, Os.freebsd => return getRandomBytesDevURandom(buf), Os.windows => { // Call RtlGenRandom() instead of CryptGetRandom() on Windows // https://github.com/rust-lang-nursery/rand/issues/111 From 9900f94afe5556db048b4b147bbf75ff0e0c9974 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Tue, 18 Dec 2018 16:22:20 -0200 Subject: [PATCH 08/21] freebsd: use sysctl to get the current executable path FreeBSD doesn't mount procfs as default on the base system, so we can't depend on it to get the current path, In this case, we use sysctl(3) to retrieves the system information and get the same information. - CTL_KERN: High kernel limits - KERN_PROC: Return selected information about specific running processes. - KERN_PROC_PATHNAME: The path of the process - Process ID: a process ID of -1 implies the current process. --- std/os/freebsd/index.zig | 6 ++++++ std/os/index.zig | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index 9f9f7f9de04b..47f4e8e267f1 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -9,6 +9,12 @@ const assert = std.debug.assert; const maxInt = std.math.maxInt; pub const Kevent = c.Kevent; +pub const CTL_KERN = 1; +pub const CTL_DEBUG = 5; + +pub const KERN_PROC = 14; // struct: process entries +pub const KERN_PROC_PATHNAME = 12; // path to executable + pub const PATH_MAX = 1024; pub const STDIN_FILENO = 0; diff --git a/std/os/index.zig b/std/os/index.zig index b49b46e8e55e..817f11493c9f 100644 --- a/std/os/index.zig +++ b/std/os/index.zig @@ -2291,7 +2291,20 @@ pub fn selfExePathW(out_buffer: *[windows_util.PATH_MAX_WIDE]u16) ![]u16 { pub fn selfExePath(out_buffer: *[MAX_PATH_BYTES]u8) ![]u8 { switch (builtin.os) { Os.linux => return readLink(out_buffer, "/proc/self/exe"), - Os.freebsd => return readLink(out_buffer, "/proc/curproc/file"), + Os.freebsd => { + var mib = [4]c_int{ posix.CTL_KERN, posix.KERN_PROC, posix.KERN_PROC_PATHNAME, -1}; + var out_len: usize = out_buffer.len; + const err = posix.getErrno(posix.sysctl(&mib, 4, out_buffer, &out_len, null, 0)); + + if (err == 0 ) return mem.toSlice(u8, out_buffer); + + return switch (err) { + posix.EFAULT => error.BadAdress, + posix.EPERM => error.PermissionDenied, + else => unexpectedErrorPosix(err), + }; + + }, Os.windows => { var utf16le_buf: [windows_util.PATH_MAX_WIDE]u16 = undefined; const utf16le_slice = try selfExePathW(&utf16le_buf); From e5b4748101ca40f5dc4082ce2cb46df0c8607417 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Tue, 18 Dec 2018 16:34:51 -0200 Subject: [PATCH 09/21] freebsd: initial stack trace Stack trace is partially working, with only a few symbols missing. Uses the same functions that we use in Linux to get the necessary debug info. --- std/debug/index.zig | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/std/debug/index.zig b/std/debug/index.zig index 73c6ea7b5681..2f0c55cb3d32 100644 --- a/std/debug/index.zig +++ b/std/debug/index.zig @@ -264,7 +264,7 @@ pub fn writeCurrentStackTraceWindows( pub fn printSourceAtAddress(debug_info: *DebugInfo, out_stream: var, address: usize, tty_color: bool) !void { switch (builtin.os) { builtin.Os.macosx => return printSourceAtAddressMacOs(debug_info, out_stream, address, tty_color), - builtin.Os.linux => return printSourceAtAddressLinux(debug_info, out_stream, address, tty_color), + builtin.Os.linux, builtin.Os.freebsd => return printSourceAtAddressLinux(debug_info, out_stream, address, tty_color), builtin.Os.windows => return printSourceAtAddressWindows(debug_info, out_stream, address, tty_color), else => return error.UnsupportedOperatingSystem, } @@ -717,7 +717,7 @@ pub const OpenSelfDebugInfoError = error{ pub fn openSelfDebugInfo(allocator: *mem.Allocator) !DebugInfo { switch (builtin.os) { - builtin.Os.linux => return openSelfDebugInfoLinux(allocator), + builtin.Os.linux, builtin.Os.freebsd => return openSelfDebugInfoLinux(allocator), builtin.Os.macosx, builtin.Os.ios => return openSelfDebugInfoMacOs(allocator), builtin.Os.windows => return openSelfDebugInfoWindows(allocator), else => return error.UnsupportedOperatingSystem, @@ -1141,8 +1141,7 @@ pub const DebugInfo = switch (builtin.os) { sect_contribs: []pdb.SectionContribEntry, modules: []Module, }, - builtin.Os.linux => DwarfInfo, - builtin.Os.freebsd => struct {}, + builtin.Os.linux, builtin.Os.freebsd => DwarfInfo, else => @compileError("Unsupported OS"), }; From 054c7ab18a8c9527414164bf68aa3564c29e8931 Mon Sep 17 00:00:00 2001 From: Greg V Date: Thu, 20 Dec 2018 23:54:09 +0300 Subject: [PATCH 10/21] Fix stat/timespec definitions for FreeBSD --- std/c/freebsd.zig | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index 86213ee1b339..72969fa82612 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -50,18 +50,23 @@ pub const Stat = extern struct { nlink: usize, mode: u32, + __pad0: u16, uid: u32, gid: u32, - __pad0: u32, + __pad1: u32, rdev: u64, - size: i64, - blksize: isize, - blocks: i64, atim: timespec, mtim: timespec, ctim: timespec, - __unused: [3]isize, + birthtim: timespec, + + size: i64, + blocks: i64, + blksize: isize, + flags: u32, + gen: u64, + __spare: [10]u64, }; pub const timespec = extern struct { @@ -72,7 +77,7 @@ pub const timespec = extern struct { pub const dirent = extern struct { d_fileno: usize, d_off: i64, - d_reclen: u64, + d_reclen: u16, d_type: u8, d_pad0: u8, d_namlen: u16, From 76efc462e7ea90be02fd28254f8c452ba994ea8a Mon Sep 17 00:00:00 2001 From: Greg V Date: Thu, 20 Dec 2018 23:55:44 +0300 Subject: [PATCH 11/21] Add preadv/pwritev on FreeBSD --- std/c/freebsd.zig | 2 ++ std/os/freebsd/index.zig | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index 72969fa82612..f30d57da3b45 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -15,6 +15,8 @@ pub extern "c" fn sysctlbyname(name: [*]const u8, oldp: ?*c_void, oldlenp: ?*usi pub extern "c" fn sysctlnametomib(name: [*]const u8, mibp: ?*c_int, sizep: ?*usize) c_int; pub extern "c" fn getdirentries(fd: c_int, buf_ptr: [*]u8, nbytes: usize, basep: *i64) usize; pub extern "c" fn pipe2(arg0: *[2]c_int, arg1: u32) c_int; +pub extern "c" fn preadv(fd: c_int, iov: *const c_void, iovcnt: c_int, offset: usize) isize; +pub extern "c" fn pwritev(fd: c_int, iov: *const c_void, iovcnt: c_int, offset: usize) isize; /// Renamed from `kevent` to `Kevent` to avoid conflict with function name. pub const Kevent = extern struct { diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index 47f4e8e267f1..1e08afe26dc7 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -626,7 +626,7 @@ pub fn pread(fd: i32, buf: [*]u8, nbyte: usize, offset: u64) usize { } pub fn preadv(fd: i32, iov: [*]const iovec, count: usize, offset: usize) usize { - return arch.syscall4(SYS_preadv, @bitCast(usize, isize(fd)), @ptrToInt(iov), count, offset); + return errnoWrap(c.preadv(fd, @ptrCast(*const c_void, iov), @intCast(c_int, count), offset)); } pub fn pipe(fd: *[2]i32) usize { @@ -647,7 +647,7 @@ pub fn pwrite(fd: i32, buf: [*]const u8, nbyte: usize, offset: u64) usize { } pub fn pwritev(fd: i32, iov: [*]const iovec_const, count: usize, offset: usize) usize { - return arch.syscall4(SYS_pwritev, @bitCast(usize, isize(fd)), @ptrToInt(iov), count, offset); + return errnoWrap(c.pwritev(fd, @ptrCast(*const c_void, iov), @intCast(c_int, count), offset)); } pub fn rename(old: [*]const u8, new: [*]const u8) usize { From 46a0f60e4c0c91f840982cb98066d60301624548 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Thu, 20 Dec 2018 20:57:58 -0200 Subject: [PATCH 12/21] freebsd: use realpath() to resolve symbolic links --- std/os/path.zig | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/std/os/path.zig b/std/os/path.zig index af767b0dca67..ff70bc039eb0 100644 --- a/std/os/path.zig +++ b/std/os/path.zig @@ -1161,7 +1161,7 @@ pub fn realC(out_buffer: *[os.MAX_PATH_BYTES]u8, pathname: [*]const u8) RealErro const pathname_w = try windows_util.cStrToPrefixedFileW(pathname); return realW(out_buffer, pathname_w); }, - Os.macosx, Os.ios => { + Os.freebsd, Os.macosx, Os.ios => { // TODO instead of calling the libc function here, port the implementation to Zig const err = posix.getErrno(posix.realpath(pathname, out_buffer)); switch (err) { @@ -1188,15 +1188,6 @@ pub fn realC(out_buffer: *[os.MAX_PATH_BYTES]u8, pathname: [*]const u8) RealErro return os.readLinkC(out_buffer, proc_path.ptr); }, - Os.freebsd => { // XXX requires fdescfs - const fd = try os.posixOpenC(pathname, posix.O_PATH | posix.O_NONBLOCK | posix.O_CLOEXEC, 0); - defer os.close(fd); - - var buf: ["/dev/fd/-2147483648\x00".len]u8 = undefined; - const proc_path = fmt.bufPrint(buf[0..], "/dev/fd/{}\x00", fd) catch unreachable; - - return os.readLinkC(out_buffer, proc_path.ptr); - }, else => @compileError("TODO implement os.path.real for " ++ @tagName(builtin.os)), } } From a6f33e3dc56eab57ee148c2ec7592540470d582c Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Thu, 20 Dec 2018 21:05:31 -0200 Subject: [PATCH 13/21] freebsd: add realpath to freebsd/index.zig --- std/os/freebsd/index.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index 1e08afe26dc7..f1533ec098fc 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -580,6 +580,10 @@ pub fn getdirentries(fd: i32, buf_ptr: [*]u8, buf_len: usize, basep: *i64) usize return errnoWrap(@bitCast(isize, c.getdirentries(fd, buf_ptr, buf_len, basep))); } +pub fn realpath(noalias filename: [*]const u8, noalias resolved_name: [*]u8) usize { + return if (c.realpath(filename, resolved_name) == null) @bitCast(usize, -isize(c._errno().*)) else 0; +} + pub fn isatty(fd: i32) bool { return c.isatty(fd) != 0; } From c156d51d555441b41f512d854529ea28db95dd50 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Thu, 20 Dec 2018 21:44:18 -0200 Subject: [PATCH 14/21] freebsd: remove system linker hack --- build.zig | 3 --- 1 file changed, 3 deletions(-) diff --git a/build.zig b/build.zig index 2a51203ff77b..16185eebf4fd 100644 --- a/build.zig +++ b/build.zig @@ -299,9 +299,6 @@ fn configureStage2(b: *Builder, exe: var, ctx: Context) !void { } else if (exe.target.isFreeBSD()) { try addCxxKnownPath(b, ctx, exe, "libc++.a", null); exe.linkSystemLibrary("pthread"); - // TODO LLD cannot perform this link. - // See https://github.com/ziglang/zig/issues/1535 - exe.enableSystemLinkerHack(); } else if (exe.target.isDarwin()) { if (addCxxKnownPath(b, ctx, exe, "libgcc_eh.a", "")) { From c26f543970771acba5484553e2c10ec90b3c39eb Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Fri, 21 Dec 2018 15:04:55 -0200 Subject: [PATCH 15/21] freebsd: fix Stat mode type --- std/c/freebsd.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index f30d57da3b45..9aa1859988af 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -51,7 +51,7 @@ pub const Stat = extern struct { ino: u64, nlink: usize, - mode: u32, + mode: u16, __pad0: u16, uid: u32, gid: u32, From 682815f6e9df8fa7ec25f0b327b4eab7c3d52f2a Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Sun, 23 Dec 2018 23:30:31 -0200 Subject: [PATCH 16/21] freebsd: remove syscall and use libc Use libc interface for: - getdents - kill - openat - setgid - setuid --- std/c/freebsd.zig | 5 +++++ std/os/freebsd/index.zig | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/std/c/freebsd.zig b/std/c/freebsd.zig index 9aa1859988af..eae5516db3b5 100644 --- a/std/c/freebsd.zig +++ b/std/c/freebsd.zig @@ -14,9 +14,14 @@ pub extern "c" fn sysctl(name: [*]c_int, namelen: c_uint, oldp: ?*c_void, oldlen pub extern "c" fn sysctlbyname(name: [*]const u8, oldp: ?*c_void, oldlenp: ?*usize, newp: ?*c_void, newlen: usize) c_int; pub extern "c" fn sysctlnametomib(name: [*]const u8, mibp: ?*c_int, sizep: ?*usize) c_int; pub extern "c" fn getdirentries(fd: c_int, buf_ptr: [*]u8, nbytes: usize, basep: *i64) usize; +pub extern "c" fn getdents(fd: c_int, buf_ptr: [*]u8, nbytes: usize) usize; pub extern "c" fn pipe2(arg0: *[2]c_int, arg1: u32) c_int; pub extern "c" fn preadv(fd: c_int, iov: *const c_void, iovcnt: c_int, offset: usize) isize; pub extern "c" fn pwritev(fd: c_int, iov: *const c_void, iovcnt: c_int, offset: usize) isize; +pub extern "c" fn openat(fd: c_int, path: ?[*]const u8, flags: c_int) c_int; +pub extern "c" fn setgid(ruid: c_uint, euid: c_uint) c_int; +pub extern "c" fn setuid(uid: c_uint) c_int; +pub extern "c" fn kill(pid: c_int, sig: c_int) c_int; /// Renamed from `kevent` to `Kevent` to avoid conflict with function name. pub const Kevent = extern struct { diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index f1533ec098fc..ebea64fdf6e1 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -573,7 +573,7 @@ pub fn getcwd(buf: [*]u8, size: usize) usize { } pub fn getdents(fd: i32, dirp: [*]u8, count: usize) usize { - return arch.syscall3(SYS_getdents, @bitCast(usize, isize(fd)), @ptrToInt(dirp), count); + return errnoWrap(@bitCast(isize, c.getdents(fd, drip, count))); } pub fn getdirentries(fd: i32, buf_ptr: [*]u8, buf_len: usize, basep: *i64) usize { @@ -667,7 +667,7 @@ pub fn create(path: [*]const u8, perm: usize) usize { } pub fn openat(dirfd: i32, path: [*]const u8, flags: usize, mode: usize) usize { - return arch.syscall4(SYS_openat, @bitCast(usize, isize(dirfd)), @ptrToInt(path), flags, mode); + return errnoWrap(c.openat(@bitCast(usize, isize(dirfd)), @ptrToInt(path), flags, mode)); } pub fn close(fd: i32) usize { @@ -683,7 +683,7 @@ pub fn exit(code: i32) noreturn { } pub fn kill(pid: i32, sig: i32) usize { - return arch.syscall2(SYS_kill, @bitCast(usize, isize(pid)), @bitCast(usize, isize(sig))); + return errnoWrap(c.kill(pid, sig)); } pub fn unlink(path: [*]const u8) usize { @@ -700,11 +700,11 @@ pub fn nanosleep(req: *const timespec, rem: ?*timespec) usize { } pub fn setuid(uid: u32) usize { - return arch.syscall1(SYS_setuid, uid); + return errnoWrap(c.setuid(uid)); } pub fn setgid(gid: u32) usize { - return arch.syscall1(SYS_setgid, gid); + return errnoWrap(c.setgid(gid)); } pub fn setreuid(ruid: u32, euid: u32) usize { From de473d442371c943bff077428b3786885cadec47 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Mon, 24 Dec 2018 10:27:08 -0200 Subject: [PATCH 17/21] freebsd: implement std.os.time.sleep --- std/os/time.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/os/time.zig b/std/os/time.zig index d9fe046a5570..c3588838bc4d 100644 --- a/std/os/time.zig +++ b/std/os/time.zig @@ -13,7 +13,7 @@ pub const epoch = @import("epoch.zig"); /// Sleep for the specified duration pub fn sleep(nanoseconds: u64) void { switch (builtin.os) { - Os.linux, Os.macosx, Os.ios => { + Os.linux, Os.macosx, Os.ios, Os.freebsd => { const s = nanoseconds / ns_per_s; const ns = nanoseconds % ns_per_s; posixSleep(@intCast(u63, s), @intCast(u63, ns)); From 52be7d7404acf2eff53d5c0cfd3ddeb591a5e27c Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Mon, 24 Dec 2018 11:19:09 -0200 Subject: [PATCH 18/21] freebsd: fix flags for opening files Prior to this fix, the compare-outputs test suite was showing a strange behavior, the tests always stopped between tests 6-8 and had a stack track similar to each other. ``` Test 8/68 compare-output multiple files with private function (ReleaseSmall)...OK /usr/home/mgxm/dev/zig/zig-cache/source.zig:7:2: error: invalid token: '&' }&(getStdOut() catch unreachable).outStream().stream; ^ The following command exited with error code 1: ``` With the wrong O_* flags, the source code was being written in append mode which resulted in an invalid file ```zig use @import("foo.zig"); use @import("bar.zig"); pub fn main() void { foo_function(); bar_function(); }&(getStdOut() catch unreachable).outStream().stream; stdout.print("OK 2\n") catch unreachable; } fn privateFunction() void { printText(); } ``` --- std/os/freebsd/index.zig | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/std/os/freebsd/index.zig b/std/os/freebsd/index.zig index ebea64fdf6e1..603265b9563b 100644 --- a/std/os/freebsd/index.zig +++ b/std/os/freebsd/index.zig @@ -105,26 +105,26 @@ pub const W_OK = 2; // test for write permission pub const R_OK = 4; // test for read permission -pub const O_RDONLY = 0o0; -pub const O_WRONLY = 0o1; -pub const O_RDWR = 0o2; -pub const O_ACCMODE = 0o3; - -pub const O_CREAT = 0o100; -pub const O_EXCL = 0o200; -pub const O_NOCTTY = 0o400; -pub const O_TRUNC = 0o1000; -pub const O_APPEND = 0o2000; -pub const O_NONBLOCK = 0o4000; +pub const O_RDONLY = 0x0000; +pub const O_WRONLY = 0x0001; +pub const O_RDWR = 0x0002; +pub const O_ACCMODE = 0x0003; + +pub const O_CREAT = 0x0200; +pub const O_EXCL = 0x0800; +pub const O_NOCTTY = 0x8000; +pub const O_TRUNC = 0x0400; +pub const O_APPEND = 0x0008; +pub const O_NONBLOCK = 0x0004; pub const O_DSYNC = 0o10000; -pub const O_SYNC = 0o4010000; +pub const O_SYNC = 0x0080; pub const O_RSYNC = 0o4010000; pub const O_DIRECTORY = 0o200000; -pub const O_NOFOLLOW = 0o400000; -pub const O_CLOEXEC = 0o2000000; +pub const O_NOFOLLOW = 0x0100; +pub const O_CLOEXEC = 0x00100000; -pub const O_ASYNC = 0o20000; -pub const O_DIRECT = 0o40000; +pub const O_ASYNC = 0x0040; +pub const O_DIRECT = 0x00010000; pub const O_LARGEFILE = 0; pub const O_NOATIME = 0o1000000; pub const O_PATH = 0o10000000; From c29cae76b0fefe4af53d3f4fe72f8e3e95c93809 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Wed, 26 Dec 2018 22:44:13 -0200 Subject: [PATCH 19/21] tests: add FreeBSD to the test matrix --- test/tests.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/tests.zig b/test/tests.zig index 1ca06b4b3452..866955f707d0 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -38,6 +38,11 @@ const test_targets = []TestTarget{ .arch = builtin.Arch.x86_64, .environ = builtin.Environ.unknown, }, + TestTarget{ + .os = builtin.Os.freebsd, + .arch = builtin.Arch.x86_64, + .environ = builtin.Environ.unknown, + }, TestTarget{ .os = builtin.Os.windows, .arch = builtin.Arch.x86_64, From 4ff23b668a339b28dceba3d6bc584009aacd1678 Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Fri, 28 Dec 2018 11:38:58 -0200 Subject: [PATCH 20/21] tests: remove freebsd from the test matrix - Manually add all the native tests to CI manifest. --- .builds/freebsd.yml | 30 ++++++++++++++++++++++++++++++ test/tests.zig | 5 ----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/.builds/freebsd.yml b/.builds/freebsd.yml index db1ddb337ac4..f337bae233d1 100644 --- a/.builds/freebsd.yml +++ b/.builds/freebsd.yml @@ -14,6 +14,36 @@ tasks: - test: | cd zig/build bin/zig test ../test/behavior.zig + bin/zig test ../std/special/compiler_rt/index.zig + bin/zig test ../std/index.zig + + bin/zig test ../test/behavior.zig --library c + bin/zig test ../std/special/compiler_rt/index.zig --library c + bin/zig test ../std/index.zig --library c + + bin/zig test ../test/behavior.zig --release-fast + bin/zig test ../std/special/compiler_rt/index.zig --release-fast + bin/zig test ../std/index.zig --release-fast + + bin/zig test ../test/behavior.zig --release-fast --library c + bin/zig test ../std/special/compiler_rt/index.zig --release-fast --library c + bin/zig test ../std/index.zig --release-fast --library c + + bin/zig test ../test/behavior.zig --release-small --library c + bin/zig test ../std/special/compiler_rt/index.zig --release-small --library c + bin/zig test ../std/index.zig --release-small --library c + + bin/zig test ../test/behavior.zig --release-small + bin/zig test ../std/special/compiler_rt/index.zig --release-small + bin/zig test ../std/index.zig --release-small + + bin/zig test ../test/behavior.zig --release-safe + bin/zig test ../std/special/compiler_rt/index.zig --release-safe + bin/zig test ../std/index.zig --release-safe + + bin/zig test ../test/behavior.zig --release-safe --library c + bin/zig test ../std/special/compiler_rt/index.zig --release-safe --library c + bin/zig test ../std/index.zig --release-safe --library c # TODO enable all tests #bin/zig build --build-file ../build.zig test # TODO integrate with the download page updater and make a diff --git a/test/tests.zig b/test/tests.zig index 866955f707d0..1ca06b4b3452 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -38,11 +38,6 @@ const test_targets = []TestTarget{ .arch = builtin.Arch.x86_64, .environ = builtin.Environ.unknown, }, - TestTarget{ - .os = builtin.Os.freebsd, - .arch = builtin.Arch.x86_64, - .environ = builtin.Environ.unknown, - }, TestTarget{ .os = builtin.Os.windows, .arch = builtin.Arch.x86_64, From 2e08bd6be4a3b472fcaa69f0cb7683b269cdacdd Mon Sep 17 00:00:00 2001 From: Marcio Giaxa Date: Fri, 28 Dec 2018 15:36:43 -0200 Subject: [PATCH 21/21] ci: update freebsd manifest --- .builds/freebsd.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.builds/freebsd.yml b/.builds/freebsd.yml index f337bae233d1..c7d92712b026 100644 --- a/.builds/freebsd.yml +++ b/.builds/freebsd.yml @@ -1,5 +1,4 @@ -arch: x86_64 -image: freebsd +image: freebsd/latest packages: - cmake - ninja @@ -15,35 +14,27 @@ tasks: cd zig/build bin/zig test ../test/behavior.zig bin/zig test ../std/special/compiler_rt/index.zig - bin/zig test ../std/index.zig bin/zig test ../test/behavior.zig --library c bin/zig test ../std/special/compiler_rt/index.zig --library c - bin/zig test ../std/index.zig --library c bin/zig test ../test/behavior.zig --release-fast bin/zig test ../std/special/compiler_rt/index.zig --release-fast - bin/zig test ../std/index.zig --release-fast bin/zig test ../test/behavior.zig --release-fast --library c bin/zig test ../std/special/compiler_rt/index.zig --release-fast --library c - bin/zig test ../std/index.zig --release-fast --library c bin/zig test ../test/behavior.zig --release-small --library c bin/zig test ../std/special/compiler_rt/index.zig --release-small --library c - bin/zig test ../std/index.zig --release-small --library c bin/zig test ../test/behavior.zig --release-small bin/zig test ../std/special/compiler_rt/index.zig --release-small - bin/zig test ../std/index.zig --release-small bin/zig test ../test/behavior.zig --release-safe bin/zig test ../std/special/compiler_rt/index.zig --release-safe - bin/zig test ../std/index.zig --release-safe bin/zig test ../test/behavior.zig --release-safe --library c bin/zig test ../std/special/compiler_rt/index.zig --release-safe --library c - bin/zig test ../std/index.zig --release-safe --library c # TODO enable all tests #bin/zig build --build-file ../build.zig test # TODO integrate with the download page updater and make a