xref: /haiku/headers/build/BeOSBuildCompatibility.h (revision 5889cb5e7e8e7bfea6072ddfe881f55d364a0cf0)
1 #ifndef BEOS_BUILD_COMPATIBILITY_H
2 #define BEOS_BUILD_COMPATIBILITY_H
3 
4 // DEFFILEMODE is not available on platforms with MUSL
5 #ifndef DEFFILEMODE
6 #define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
7 #endif
8 
9 // There's no ALLPERMS on platforms with MUSL
10 #ifndef ALLPERMS
11 #	define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)
12 #endif
13 
14 #ifndef S_IUMSK
15 #define	S_IUMSK 07777
16 #endif
17 
18 typedef unsigned long	haiku_build_addr_t;
19 #define addr_t			haiku_build_addr_t
20 
21 #if defined(HAIKU_HOST_PLATFORM_MSYS)
22 #define __addr_t_defined
23 #endif
24 
25 #include <Errors.h>
26 
27 #include <fcntl.h>
28 #include <stdio.h>
29 #include <string.h>
30 #include <sys/stat.h>
31 #include <sys/types.h>
32 #include <unistd.h>
33 #include <sys/uio.h>
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 // Is kernel-only under Linux.
40 #ifndef strlcpy
41 extern size_t   strlcpy(char* dest, const char* source, size_t length);
42 #endif
43 #ifndef strlcat
44 extern size_t	strlcat(char* dest, const char* source, size_t length);
45 #endif
46 
47 #if defined(HAIKU_HOST_PLATFORM_FREEBSD) || defined(HAIKU_HOST_PLATFORM_DARWIN)
48 extern size_t	strnlen(const char* string, size_t length);
49 #endif
50 
51 // BeOS only
52 extern ssize_t  read_pos(int fd, off_t pos, void* buffer, size_t count);
53 extern ssize_t  write_pos(int fd, off_t pos, const void* buffer, size_t count);
54 extern ssize_t	readv_pos(int fd, off_t pos, const struct iovec* vec,
55 					size_t count);
56 extern ssize_t	writev_pos(int fd, off_t pos, const struct iovec* vec,
57 					size_t count);
58 
59 
60 // There's no O_NOTRAVERSE under Linux and FreeBSD -- we replace it with a flag
61 // that won't be used by our tools, preferrably a non-portable one; a fixed
62 // constant could always lead to trouble on the host.
63 // We can abuse this flag for our purposes as we filter it in libroot.
64 #ifndef O_NOTRAVERSE
65 #	ifdef O_NOCTTY
66 #		define O_NOTRAVERSE	O_NOCTTY
67 #	elif defined(O_RANDOM)
68 #		define O_NOTRAVERSE O_RANDOM
69 #	else
70 #		error "Search for a proper replacement value for O_NOTRAVERSE"
71 #	endif
72 #endif
73 
74 #ifndef S_IUMSK
75 #	define S_IUMSK ALLPERMS
76 #endif
77 
78 
79 // remap strerror()
80 extern char* _haiku_build_strerror(int errnum);
81 
82 #ifndef BUILDING_HAIKU_ERROR_MAPPER
83 
84 #undef strerror
85 #define strerror(errnum)	_haiku_build_strerror(errnum)
86 
87 #endif	// BUILDING_HAIKU_ERROR_MAPPER
88 
89 
90 // remap file descriptor functions
91 int		_haiku_build_fchmod(int fd, mode_t mode);
92 int		_haiku_build_fchmodat(int fd, const char* path, mode_t mode, int flag);
93 int		_haiku_build_fstat(int fd, struct stat* st);
94 int		_haiku_build_fstatat(int fd, const char* path, struct stat* st,
95 			int flag);
96 int		_haiku_build_mkdirat(int fd, const char* path, mode_t mode);
97 int		_haiku_build_mkfifoat(int fd, const char* path, mode_t mode);
98 int		_haiku_build_utimensat(int fd, const char* path,
99 			const struct timespec times[2], int flag);
100 int		_haiku_build_futimens(int fd, const struct timespec times[2]);
101 int		_haiku_build_faccessat(int fd, const char* path, int accessMode,
102 			int flag);
103 int		_haiku_build_fchdir(int fd);
104 int		_haiku_build_close(int fd);
105 int		_haiku_build_dup(int fd);
106 int		_haiku_build_dup2(int fd1, int fd2);
107 int		_haiku_build_linkat(int toFD, const char* toPath, int pathFD,
108 			const char* path, int flag);
109 int		_haiku_build_unlinkat(int fd, const char* path, int flag);
110 ssize_t	_haiku_build_readlinkat(int fd, const char* path, char* buffer,
111 			size_t bufferSize);
112 int		_haiku_build_symlinkat(const char* toPath, int fd,
113 			const char* symlinkPath);
114 int		_haiku_build_ftruncate(int fd, off_t newSize);
115 int		_haiku_build_fchown(int fd, uid_t owner, gid_t group);
116 int		_haiku_build_fchownat(int fd, const char* path, uid_t owner,
117 			gid_t group, int flag);
118 int		_haiku_build_mknodat(int fd, const char* name, mode_t mode, dev_t dev);
119 int		_haiku_build_creat(const char* path, mode_t mode);
120 #ifndef _HAIKU_BUILD_DONT_REMAP_FD_FUNCTIONS
121 int		_haiku_build_open(const char* path, int openMode, ...);
122 int		_haiku_build_openat(int fd, const char* path, int openMode, ...);
123 int		_haiku_build_fcntl(int fd, int op, ...);
124 #else
125 int		_haiku_build_open(const char* path, int openMode, mode_t permissions);
126 int		_haiku_build_openat(int fd, const char* path, int openMode,
127 			mode_t permissions);
128 int		_haiku_build_fcntl(int fd, int op, int argument);
129 #endif
130 int		_haiku_build_renameat(int fromFD, const char* from, int toFD,
131 			const char* to);
132 
133 #ifndef _HAIKU_BUILD_DONT_REMAP_FD_FUNCTIONS
134 #	define fchmod(fd, mode)				_haiku_build_fchmod(fd, mode)
135 #	define fchmodat(fd, path, mode, flag) \
136 		_haiku_build_fchmodat(fd, path, mode, flag)
137 #	define fstat(fd, st)				_haiku_build_fstat(fd, st)
138 #	define fstatat(fd, path, st, flag)	_haiku_build_fstatat(fd, path, st, flag)
139 #	define mkdirat(fd, path, mode)		_haiku_build_mkdirat(fd, path, mode)
140 #	define mkfifoat(fd, path, mode)		_haiku_build_mkfifoat(fd, path, mode)
141 #	define utimensat(fd, path, times, flag) \
142 		_haiku_build_utimensat(fd, path, times, flag)
143 #	define futimens(fd, times)			_haiku_build_futimens(fd, times)
144 #	define faccessat(fd, path, accessMode, flag) \
145 		_haiku_build_faccessat(fd, path, accessMode, flag)
146 #	define fchdir(fd)					_haiku_build_fchdir(fd)
147 #	define close(fd)					_haiku_build_close(fd)
148 #	define dup(fd)						_haiku_build_dup(fd)
149 #	define dup2(fd1, fd2)				_haiku_build_dup2(fd1, fd2)
150 #	define linkat(toFD, toPath, pathFD, path, flag) \
151 		_haiku_build_linkat(toFD, toPath, pathFD, path, flag)
152 #	define unlinkat(fd, path, flag)		_haiku_build_unlinkat(fd, path, flag)
153 #	define readlinkat(fd, path, buffer, bufferSize) \
154 		_haiku_build_readlinkat(fd, path, buffer, bufferSize)
155 #	define symlinkat(toPath, fd, symlinkPath) \
156 		_haiku_build_symlinkat(toPath, fd, symlinkPath)
157 #	define ftruncate(fd, newSize)		_haiku_build_ftruncate(fd, newSize)
158 #	define fchown(fd, owner, group)		_haiku_build_fchown(fd, owner, group)
159 #	define fchownat(fd, path, owner, group, flag) \
160 		_haiku_build_fchownat(fd, path, owner, group, flag)
161 #	define mknodat(fd, name, mode, dev) \
162 		_haiku_build_mknodat(fd, name, mode, dev)
163 #	define creat(path, mode)			_haiku_build_creat(path, mode)
164 #	define open(path, openMode...)		_haiku_build_open(path, openMode)
165 #	define openat(fd, path, openMode...) \
166 		_haiku_build_openat(fd, path, openMode)
167 #	define fcntl(fd, op...)				_haiku_build_fcntl(fd, op)
168 #	define renameat(fromFD, from, toFD, to) \
169 		_haiku_build_renameat(fromFD, from, toFD, to)
170 
171 #	if defined(HAIKU_HOST_USE_XATTR) && defined(HAIKU_HOST_PLATFORM_HAIKU)
172 #		define fs_read_attr			_haiku_build_fs_read_attr
173 #		define fs_write_attr		_haiku_build_fs_write_attr
174 #		define fs_remove_attr		_haiku_build_fs_remove_attr
175 #		define fs_stat_attr			_haiku_build_fs_stat_attr
176 #		define fs_open_attr			_haiku_build_fs_open_attr
177 #		define fs_fopen_attr		_haiku_build_fs_fopen_attr
178 #		define fs_close_attr		_haiku_build_fs_close_attr
179 #		define fs_open_attr_dir		_haiku_build_fs_open_attr_dir
180 #		define fs_fopen_attr_dir	_haiku_build_fs_fopen_attr_dir
181 #		define fs_close_attr_dir	_haiku_build_fs_close_attr_dir
182 #		define fs_read_attr_dir		_haiku_build_fs_read_attr_dir
183 #		define fs_rewind_attr_dir	_haiku_build_fs_rewind_attr_dir
184 #	endif
185 
186 #endif	// _HAIKU_BUILD_DONT_REMAP_FD_FUNCTIONS
187 
188 
189 #ifdef __cplusplus
190 } // extern "C"
191 #endif
192 
193 #endif	// BEOS_BUILD_COMPATIBILITY_H
194 
195