]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/sanitizer_common/sanitizer_openbsd.cc
Merge LLVM libunwind release_80 branch r355677 (effectively, 8.0.0 rc4).
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / sanitizer_common / sanitizer_openbsd.cc
1 //===-- sanitizer_openbsd.cc ----------------------------------------------===//
2 //
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
5 //
6 //===----------------------------------------------------------------------===//
7 //
8 // This file is shared between various sanitizers' runtime libraries and
9 // implements Solaris-specific functions.
10 //===----------------------------------------------------------------------===//
11
12 #include "sanitizer_platform.h"
13 #if SANITIZER_OPENBSD
14
15 #include <stdio.h>
16
17 #include "sanitizer_common.h"
18 #include "sanitizer_flags.h"
19 #include "sanitizer_internal_defs.h"
20 #include "sanitizer_libc.h"
21 #include "sanitizer_placement_new.h"
22 #include "sanitizer_platform_limits_posix.h"
23 #include "sanitizer_procmaps.h"
24
25 #include <errno.h>
26 #include <fcntl.h>
27 #include <limits.h>
28 #include <pthread.h>
29 #include <sched.h>
30 #include <signal.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <sys/mman.h>
34 #include <sys/shm.h>
35 #include <sys/sysctl.h>
36 #include <sys/types.h>
37 #include <unistd.h>
38
39 extern char **environ;
40
41 namespace __sanitizer {
42
43 uptr internal_mmap(void *addr, size_t length, int prot, int flags, int fd,
44                    u64 offset) {
45   return (uptr)mmap(addr, length, prot, flags, fd, offset);
46 }
47
48 uptr internal_munmap(void *addr, uptr length) { return munmap(addr, length); }
49
50 int internal_mprotect(void *addr, uptr length, int prot) {
51   return mprotect(addr, length, prot);
52 }
53
54 int internal_sysctlbyname(const char *sname, void *oldp, uptr *oldlenp,
55                           const void *newp, uptr newlen) {
56   Printf("internal_sysctlbyname not implemented for OpenBSD");
57   Die();
58   return 0;
59 }
60
61 uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) {
62   // On OpenBSD we cannot get the full path
63   struct kinfo_proc kp;
64   uptr kl;
65   const int Mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()};
66   if (internal_sysctl(Mib, ARRAY_SIZE(Mib), &kp, &kl, NULL, 0) != -1)
67     return internal_snprintf(buf,
68                              (KI_MAXCOMLEN < buf_len ? KI_MAXCOMLEN : buf_len),
69                              "%s", kp.p_comm);
70   return (uptr)0;
71 }
72
73 static void GetArgsAndEnv(char ***argv, char ***envp) {
74   uptr nargv;
75   uptr nenv;
76   int argvmib[4] = {CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV};
77   int envmib[4] = {CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ENV};
78   if (internal_sysctl(argvmib, 4, NULL, &nargv, NULL, 0) == -1) {
79     Printf("sysctl KERN_PROC_NARGV failed\n");
80     Die();
81   }
82   if (internal_sysctl(envmib, 4, NULL, &nenv, NULL, 0) == -1) {
83     Printf("sysctl KERN_PROC_NENV failed\n");
84     Die();
85   }
86   if (internal_sysctl(argvmib, 4, &argv, &nargv, NULL, 0) == -1) {
87     Printf("sysctl KERN_PROC_ARGV failed\n");
88     Die();
89   }
90   if (internal_sysctl(envmib, 4, &envp, &nenv, NULL, 0) == -1) {
91     Printf("sysctl KERN_PROC_ENV failed\n");
92     Die();
93   }
94 }
95
96 char **GetArgv() {
97   char **argv, **envp;
98   GetArgsAndEnv(&argv, &envp);
99   return argv;
100 }
101
102 char **GetEnviron() {
103   char **argv, **envp;
104   GetArgsAndEnv(&argv, &envp);
105   return envp;
106 }
107
108 void ReExec() {
109   UNIMPLEMENTED();
110 }
111
112 }  // namespace __sanitizer
113
114 #endif  // SANITIZER_OPENBSD