From 91748de4699f5b1d5d425e490953df6c5e166f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sun, 24 Feb 2019 15:47:06 +0100 Subject: [PATCH] cleanup libc-test for OpenBSD --- libc-test/build.rs | 145 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/libc-test/build.rs b/libc-test/build.rs index 642953e0..e2cbb51d 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -37,6 +37,7 @@ fn do_ctest() { match &target { t if t.contains("apple") => return test_apple(t), + t if t.contains("openbsd") => return test_openbsd(t), t if t.contains("windows") => return test_windows(t), _ => (), } @@ -1028,6 +1029,150 @@ fn test_apple(target: &str) { cfg.generate("../src/lib.rs", "main.rs"); } +fn test_openbsd(target: &str) { + assert!(target.contains("openbsd")); + + let mut cfg = ctest::TestGenerator::new(); + cfg.flag("-Wno-deprecated-declarations"); + + headers! { cfg: + "errno.h", + "fcntl.h", + "limits.h", + "locale.h", + "stddef.h", + "stdint.h", + "stdio.h", + "stdlib.h", + "sys/stat.h", + "sys/types.h", + "time.h", + "wchar.h", + "ctype.h", + "dirent.h", + "sys/socket.h", + "net/if.h", + "net/route.h", + "net/if_arp.h", + "netdb.h", + "netinet/in.h", + "netinet/ip.h", + "netinet/tcp.h", + "netinet/udp.h", + "resolv.h", + "pthread.h", + "dlfcn.h", + "signal.h", + "string.h", + "sys/file.h", + "sys/ioctl.h", + "sys/mman.h", + "sys/resource.h", + "sys/socket.h", + "sys/time.h", + "sys/un.h", + "sys/wait.h", + "unistd.h", + "utime.h", + "pwd.h", + "grp.h", + "sys/utsname.h", + "sys/ptrace.h", + "sys/mount.h", + "sys/uio.h", + "sched.h", + "termios.h", + "poll.h", + "syslog.h", + "semaphore.h", + "sys/statvfs.h", + "sys/times.h", + "glob.h", + "ifaddrs.h", + "langinfo.h", + "sys/sysctl.h", + "utmp.h", + "sys/event.h", + "net/if_dl.h", + "util.h", + "ufs/ufs/quota.h", + "pthread_np.h", + "sys/syscall.h", + } + + cfg.skip_struct(move |ty| { + match ty { + // FIXME: actually a union + "sigval" => true, + + _ => false, + } + }); + + cfg.skip_const(move |name| { + match name { + // Removed in OpenBSD 6.0 + "KERN_USERMOUNT" | "KERN_ARND" => true, + _ => false, + } + }); + + cfg.skip_fn(move |name| { + match name { + "execv" | "execve" | "execvp" | "execvpe" => true, + + // typed 2nd arg + "gettimeofday" => true, + + // Removed in OpenBSD 6.5 + // https://marc.info/?l=openbsd-cvs&m=154723400730318 + "mincore" => true, + + _ => false, + } + }); + + cfg.type_name(move |ty, is_struct, is_union| { + match ty { + // Just pass all these through, no need for a "struct" prefix + "FILE" | "DIR" | "Dl_info" => ty.to_string(), + + // OSX calls this something else + "sighandler_t" => "sig_t".to_string(), + + t if is_union => format!("union {}", t), + t if t.ends_with("_t") => t.to_string(), + t if is_struct => format!("struct {}", t), + t => t.to_string(), + } + }); + + cfg.field_name(move |struct_, field| { + match field { + "st_birthtime" if struct_.starts_with("stat") => { + "__st_birthtime".to_string() + } + "st_birthtime_nsec" if struct_.starts_with("stat") => { + "__st_birthtimensec".to_string() + } + s if s.ends_with("_nsec") && struct_.starts_with("stat") => { + s.replace("e_nsec", ".tv_nsec") + } + "sa_sigaction" if struct_ == "sigaction" => { + "sa_handler".to_string() + } + s => s.to_string(), + } + }); + + cfg.skip_field_type(move |struct_, field| { + // type siginfo_t.si_addr changed from OpenBSD 6.0 to 6.1 + (struct_ == "siginfo_t" && field == "si_addr") + }); + + cfg.generate("../src/lib.rs", "linux_fcntl.rs"); +} + fn test_windows(target: &str) { assert!(target.contains("windows")); let gnu = target.contains("gnu");