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
39extern char **environ;
40
41namespace __sanitizer {
42
43uptr 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
48uptr internal_munmap(void *addr, uptr length) { return munmap(addr, length); }
49
50int internal_mprotect(void *addr, uptr length, int prot) {
51  return mprotect(addr, length, prot);
52}
53
54int 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
61uptr 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
73static 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
96char **GetArgv() {
97  char **argv, **envp;
98  GetArgsAndEnv(&argv, &envp);
99  return argv;
100}
101
102void ReExec() {
103  UNIMPLEMENTED();
104}
105
106}  // namespace __sanitizer
107
108#endif  // SANITIZER_OPENBSD
109