xref: /netbsd-src/lib/librumpuser/rumpuser_port.h (revision 38c95642994ec831bfc211364826ff1141233d0a)
1*38c95642Sozaki-r /*	$NetBSD: rumpuser_port.h,v 1.54 2024/10/16 09:09:07 ozaki-r Exp $	*/
23b3ffd70Spooka 
33b3ffd70Spooka #ifndef _LIB_LIBRUMPUSER_RUMPUSER_PORT_H_
43b3ffd70Spooka #define _LIB_LIBRUMPUSER_RUMPUSER_PORT_H_
53b3ffd70Spooka 
6c62329f7Spooka /*
723dfcd74Spooka  * Define things found by autoconf.  buildrump.sh defines RUMPUSER_CONFIG,
823dfcd74Spooka  * the NetBSD build does not run autoconf during build and supplies the
923dfcd74Spooka  * necessary values here.  To update the NetBSD values, run ./configure
1023dfcd74Spooka  * for an up-to-date NetBSD installation and insert rumpuser_config.h
1123dfcd74Spooka  * in the space below, e.g. with ":r !sed -ne '/^\#/p' rumpuser_config.h"
12c62329f7Spooka  */
1323dfcd74Spooka #if !defined(RUMPUSER_CONFIG)
14a53a2a53Spooka 
15b16a5c9dSnros #define HAVE_ALIGNED_ALLOC 1
1623dfcd74Spooka #define HAVE_ARC4RANDOM_BUF 1
1723dfcd74Spooka #define HAVE_CHFLAGS 1
1823dfcd74Spooka #define HAVE_CLOCKID_T 1
1923dfcd74Spooka #define HAVE_CLOCK_GETTIME 1
20638846d9Spooka #define HAVE_CLOCK_NANOSLEEP 1
2123dfcd74Spooka #define HAVE_DLINFO 1
2223dfcd74Spooka #define HAVE_FSYNC_RANGE 1
2323dfcd74Spooka #define HAVE_GETENV_R 1
2423dfcd74Spooka #define HAVE_GETPROGNAME 1
2523dfcd74Spooka #define HAVE_GETSUBOPT 1
2623dfcd74Spooka #define HAVE_INTTYPES_H 1
2723dfcd74Spooka #define HAVE_KQUEUE 1
2823dfcd74Spooka #define HAVE_MEMORY_H 1
2923dfcd74Spooka #define HAVE_PATHS_H 1
3023dfcd74Spooka #define HAVE_POSIX_MEMALIGN 1
31*38c95642Sozaki-r #define HAVE_PREADV 1
3223dfcd74Spooka #define HAVE_PTHREAD_SETNAME3 1
33*38c95642Sozaki-r #define HAVE_PWRITEV 1
3423dfcd74Spooka #define HAVE_SETPROGNAME 1
3523dfcd74Spooka #define HAVE_STDINT_H 1
3623dfcd74Spooka #define HAVE_STDLIB_H 1
3723dfcd74Spooka #define HAVE_STRINGS_H 1
3823dfcd74Spooka #define HAVE_STRING_H 1
3923dfcd74Spooka #define HAVE_STRSUFTOLL 1
4023dfcd74Spooka #define HAVE_STRUCT_SOCKADDR_IN_SIN_LEN 1
4123dfcd74Spooka #define HAVE_SYS_ATOMIC_H 1
4223dfcd74Spooka #define HAVE_SYS_CDEFS_H 1
4323dfcd74Spooka #define HAVE_SYS_DISKLABEL_H 1
4423dfcd74Spooka #define HAVE_SYS_DISK_H 1
4523dfcd74Spooka #define HAVE_SYS_DKIO_H 1
4623dfcd74Spooka #define HAVE_SYS_PARAM_H 1
4723dfcd74Spooka #define HAVE_SYS_STAT_H 1
4823dfcd74Spooka #define HAVE_SYS_SYSCTL_H 1
4923dfcd74Spooka #define HAVE_SYS_TYPES_H 1
5023dfcd74Spooka #define HAVE_UNISTD_H 1
51f24bc1c7Spooka #define HAVE_UTIMENSAT 1
5264fda0b1Ssevan #define HAVE___QUOTACTL 1
53cfee6e91Slukem #define PACKAGE_BUGREPORT "https://github.com/rumpkernel/"
5423dfcd74Spooka #define PACKAGE_NAME "rumpuser-posix"
5523dfcd74Spooka #define PACKAGE_STRING "rumpuser-posix 999"
5623dfcd74Spooka #define PACKAGE_TARNAME "rumpuser-posix"
5723dfcd74Spooka #define PACKAGE_URL ""
5823dfcd74Spooka #define PACKAGE_VERSION "999"
5923dfcd74Spooka #define STDC_HEADERS 1
6023dfcd74Spooka #ifndef _DARWIN_USE_64_BIT_INODE
6123dfcd74Spooka # define _DARWIN_USE_64_BIT_INODE 1
6295e41b89Sjustin #endif
6395e41b89Sjustin 
6423dfcd74Spooka #else /* RUMPUSER_CONFIG */
6523dfcd74Spooka #include "rumpuser_config.h"
663b3ffd70Spooka #endif
673b3ffd70Spooka 
689ee0427cSpooka #if defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)
693b3ffd70Spooka #define _GNU_SOURCE
703b3ffd70Spooka #endif
713b3ffd70Spooka 
7223dfcd74Spooka #if defined(HAVE_SYS_CDEFS_H)
7323dfcd74Spooka #include <sys/cdefs.h>
7423dfcd74Spooka #endif
75770e02d5Spooka 
76770e02d5Spooka /*
77770e02d5Spooka  * Some versions of FreeBSD (e.g. 9.2) contain C11 stuff without
78770e02d5Spooka  * any obvious way to expose the protos.  Kludge around it.
79770e02d5Spooka  */
80770e02d5Spooka #ifdef __FreeBSD__
81770e02d5Spooka #if __ISO_C_VISIBLE < 2011
82770e02d5Spooka #undef __ISO_C_VISIBLE
83770e02d5Spooka #define __ISO_C_VISIBLE 2011
84770e02d5Spooka #endif
85770e02d5Spooka #endif
86770e02d5Spooka 
8723dfcd74Spooka #if defined(HAVE_SYS_PARAM_H)
8823dfcd74Spooka #include <sys/param.h>
8923dfcd74Spooka #endif
9023dfcd74Spooka 
9123dfcd74Spooka #ifndef MIN
9223dfcd74Spooka #define MIN(a,b)        ((/*CONSTCOND*/(a)<(b))?(a):(b))
9323dfcd74Spooka #endif
9423dfcd74Spooka #ifndef MAX
9523dfcd74Spooka #define MAX(a,b)        ((/*CONSTCOND*/(a)>(b))?(a):(b))
9623dfcd74Spooka #endif
9723dfcd74Spooka 
9823dfcd74Spooka #if !defined(HAVE_GETSUBOPT)
9995e41b89Sjustin static inline int
10095e41b89Sjustin getsubopt(char **optionp, char * const *tokens, char **valuep)
10195e41b89Sjustin {
10295e41b89Sjustin 
10395e41b89Sjustin 	/* TODO make a definition */
10495e41b89Sjustin 	return -1;
10595e41b89Sjustin }
10695e41b89Sjustin #endif
10795e41b89Sjustin 
1080f54d4e5Sjustin #if !defined(HAVE_CLOCKID_T)
1090f54d4e5Sjustin typedef int clockid_t;
1100f54d4e5Sjustin #endif
1110f54d4e5Sjustin 
11223dfcd74Spooka #ifdef __ANDROID__
11323dfcd74Spooka #include <stdint.h>
11423dfcd74Spooka typedef uint16_t in_port_t;
11523dfcd74Spooka #include <sys/select.h>
11623dfcd74Spooka #define atomic_inc_uint(x)  __sync_fetch_and_add(x, 1)
11723dfcd74Spooka #define atomic_dec_uint(x)  __sync_fetch_and_sub(x, 1)
11823dfcd74Spooka #endif
11923dfcd74Spooka 
12023dfcd74Spooka /* sunny magic */
1217415696eSpooka #if defined(__sun__)
1227415696eSpooka #  if defined(RUMPUSER_NO_FILE_OFFSET_BITS)
1237415696eSpooka #    undef _FILE_OFFSET_BITS
12423dfcd74Spooka #    define _FILE_OFFSET_BITS 32
1255ccc76a6Spooka #  endif
1267415696eSpooka #endif
1275ccc76a6Spooka 
12823dfcd74Spooka #if !defined(HAVE_CLOCK_GETTIME)
12923dfcd74Spooka #include <sys/time.h>
13023dfcd74Spooka #define	CLOCK_REALTIME	0
131d60eb8c1Srmind static inline int
132d60eb8c1Srmind clock_gettime(clockid_t clk, struct timespec *ts)
133d60eb8c1Srmind {
134d60eb8c1Srmind 	struct timeval tv;
135d60eb8c1Srmind 
136d60eb8c1Srmind 	if (gettimeofday(&tv, 0) == 0) {
137d60eb8c1Srmind 		ts->tv_sec = tv.tv_sec;
138d60eb8c1Srmind 		ts->tv_nsec = tv.tv_usec * 1000;
139db9c98faSpooka 		return 0;
140d60eb8c1Srmind 	}
141d60eb8c1Srmind 	return -1;
142d60eb8c1Srmind }
14323dfcd74Spooka #endif
144d60eb8c1Srmind 
14523dfcd74Spooka #if defined(__APPLE__)
14623dfcd74Spooka #include <libkern/OSAtomic.h>
14723dfcd74Spooka #define	atomic_inc_uint(x)	OSAtomicIncrement32((volatile int32_t *)(x))
14823dfcd74Spooka #define	atomic_dec_uint(x)	OSAtomicDecrement32((volatile int32_t *)(x))
149d60eb8c1Srmind #endif
150d60eb8c1Srmind 
1513b3ffd70Spooka #include <sys/types.h>
1523b3ffd70Spooka 
15323dfcd74Spooka #if !defined(HAVE_GETENV_R)
154c62329f7Spooka #include <errno.h>
155c62329f7Spooka #include <stdlib.h>
156c62329f7Spooka #include <string.h>
157d60eb8c1Srmind #include <inttypes.h>
158c62329f7Spooka static inline int
159c62329f7Spooka getenv_r(const char *name, char *buf, size_t buflen)
160c62329f7Spooka {
161c62329f7Spooka 	char *tmp;
162c62329f7Spooka 
163c62329f7Spooka 	if ((tmp = getenv(name)) != NULL) {
164c62329f7Spooka 		if (strlen(tmp) >= buflen) {
165c62329f7Spooka 			errno = ERANGE;
166c62329f7Spooka 			return -1;
167c62329f7Spooka 		}
168c62329f7Spooka 		strcpy(buf, tmp);
169c62329f7Spooka 		return 0;
170c62329f7Spooka 	} else {
171c62329f7Spooka 		errno = ENOENT;
172c62329f7Spooka 		return -1;
173c62329f7Spooka 	}
174c62329f7Spooka }
175c62329f7Spooka #endif
176c62329f7Spooka 
177dae2a8e7Spooka #if !defined(HAVE_POSIX_MEMALIGN)
17823dfcd74Spooka #if !defined(HAVE_MEMALIGN)
17923dfcd74Spooka #error method for aligned memory allocation required
18023dfcd74Spooka #endif
18123dfcd74Spooka #include <sys/sysmacros.h>
18265306217Spooka #include <stdlib.h>
18365306217Spooka static inline int
18465306217Spooka posix_memalign(void **ptr, size_t align, size_t size)
18565306217Spooka {
18665306217Spooka 
18765306217Spooka 	*ptr = memalign(align, size);
18865306217Spooka 	if (*ptr == NULL)
18965306217Spooka 		return ENOMEM;
19065306217Spooka 	return 0;
19165306217Spooka }
19223dfcd74Spooka #endif
19323dfcd74Spooka 
19423dfcd74Spooka /*
19523dfcd74Spooka  * For NetBSD, use COHERENCY_UNIT as the lock alignment size.
19623dfcd74Spooka  * On other platforms, just guess it to be 64.
19723dfcd74Spooka  */
19823dfcd74Spooka #ifdef __NetBSD__
19923dfcd74Spooka #define RUMPUSER_LOCKALIGN COHERENCY_UNIT
20023dfcd74Spooka #else
20123dfcd74Spooka #define RUMPUSER_LOCKALIGN 64
20223dfcd74Spooka #endif
20323dfcd74Spooka 
20423dfcd74Spooka #if !defined(HAVE_ALIGNED_ALLOC)
20523dfcd74Spooka #include <stdlib.h>
20623dfcd74Spooka static inline void *
20723dfcd74Spooka aligned_alloc(size_t alignment, size_t size)
20823dfcd74Spooka {
20923dfcd74Spooka 	void *ptr;
21023dfcd74Spooka 	int rv;
21123dfcd74Spooka 
21223dfcd74Spooka 	rv = posix_memalign(&ptr, alignment, size);
21323dfcd74Spooka 	return rv ? NULL : ptr;
21423dfcd74Spooka }
21523dfcd74Spooka #endif
21665306217Spooka 
2173b3ffd70Spooka #ifndef __RCSID
2183b3ffd70Spooka #define __RCSID(a)
2193b3ffd70Spooka #endif
2203b3ffd70Spooka 
221585a07d8Schristos #include <poll.h>
222585a07d8Schristos 
2233b3ffd70Spooka #ifndef INFTIM
2243b3ffd70Spooka #define INFTIM (-1)
2253b3ffd70Spooka #endif
2263b3ffd70Spooka 
2273b3ffd70Spooka #ifndef _DIAGASSERT
2283b3ffd70Spooka #define _DIAGASSERT(_p_)
2293b3ffd70Spooka #endif
2303b3ffd70Spooka 
23123dfcd74Spooka #if !defined(HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
2322f567109Spooka #define SIN_SETLEN(a,b)
23323dfcd74Spooka #else
2342f567109Spooka #define SIN_SETLEN(_sin_, _len_) _sin_.sin_len = _len_
2353b3ffd70Spooka #endif
2363b3ffd70Spooka 
2373b3ffd70Spooka #ifndef __predict_true
2383b3ffd70Spooka #define __predict_true(a) a
2393b3ffd70Spooka #define __predict_false(a) a
2403b3ffd70Spooka #endif
2413b3ffd70Spooka 
2423b3ffd70Spooka #ifndef __dead
2430163bf03Spooka #define __dead __attribute__((__noreturn__))
2443b3ffd70Spooka #endif
2453b3ffd70Spooka 
2463b3ffd70Spooka #ifndef __printflike
247a2867970Spooka #ifdef __GNUC__
248a2867970Spooka #define __printflike(a,b) __attribute__((__format__ (__printf__,a,b)))
249a2867970Spooka #else
2503b3ffd70Spooka #define __printflike(a,b)
2513b3ffd70Spooka #endif
252a2867970Spooka #endif
2533b3ffd70Spooka 
254c62329f7Spooka #ifndef __noinline
255c62329f7Spooka #ifdef __GNUC__
256c62329f7Spooka #define __noinline __attribute__((__noinline__))
257c62329f7Spooka #else
258c62329f7Spooka #define __noinline
259c62329f7Spooka #endif
260c62329f7Spooka #endif
261c62329f7Spooka 
2623b3ffd70Spooka #ifndef __arraycount
2633b3ffd70Spooka #define __arraycount(_ar_) (sizeof(_ar_)/sizeof(_ar_[0]))
2643b3ffd70Spooka #endif
2653b3ffd70Spooka 
2663b3ffd70Spooka #ifndef __UNCONST
2673b3ffd70Spooka #define __UNCONST(_a_) ((void *)(unsigned long)(const void *)(_a_))
2683b3ffd70Spooka #endif
2693b3ffd70Spooka 
27040fd6d6fSpooka #ifndef __CONCAT
27140fd6d6fSpooka #define __CONCAT(x,y)	x ## y
27240fd6d6fSpooka #endif
27340fd6d6fSpooka 
27440fd6d6fSpooka #ifndef __STRING
27540fd6d6fSpooka #define __STRING(x)	#x
27640fd6d6fSpooka #endif
27740fd6d6fSpooka 
278c62329f7Spooka #ifndef __NetBSD_Prereq__
279c62329f7Spooka #define __NetBSD_Prereq__(a,b,c) 0
280c62329f7Spooka #endif
281c62329f7Spooka 
282c62329f7Spooka #include <sys/socket.h>
28365306217Spooka 
28465306217Spooka #if !defined(__CMSG_ALIGN)
285c62329f7Spooka #ifdef CMSG_ALIGN
286c62329f7Spooka #define __CMSG_ALIGN(a) CMSG_ALIGN(a)
287c62329f7Spooka #endif
288c62329f7Spooka #endif
289c62329f7Spooka 
29065306217Spooka #ifndef PF_LOCAL
29165306217Spooka #define PF_LOCAL PF_UNIX
29265306217Spooka #endif
29365306217Spooka #ifndef AF_LOCAL
29465306217Spooka #define AF_LOCAL AF_UNIX
29565306217Spooka #endif
29665306217Spooka 
29765306217Spooka /* pfft, but what are you going to do? */
29865306217Spooka #ifndef MSG_NOSIGNAL
29965306217Spooka #define MSG_NOSIGNAL 0
30065306217Spooka #endif
30165306217Spooka 
3028fab31f4Ssimonb #if defined(__NetBSD__) && defined(__mips_n32)	/* XXX */
3038fab31f4Ssimonb /* The MIPS N32 ABI has 4 byte longs but uses 8 byte registers */
3048fab31f4Ssimonb #define	HAVE_REGISTER_T	1
3058fab31f4Ssimonb #define	RUMP_REGISTER_T uint64_t
3068fab31f4Ssimonb typedef RUMP_REGISTER_T register_t;
3078fab31f4Ssimonb #define	PRIxREGISTER	PRIx64
3088fab31f4Ssimonb #endif /* __NetBSD__ && __mips_n32 */		/* XXX */
30923dfcd74Spooka #if !defined(HAVE_REGISTER_T) && !defined(RUMP_REGISTER_T)
310b65f40a8Spooka #define RUMP_REGISTER_T long
311b65f40a8Spooka typedef RUMP_REGISTER_T register_t;
3123397b20aSmartin #define	PRIxREGISTER	"lx"
313b65f40a8Spooka #endif
314b65f40a8Spooka 
3153fcbbf64Spooka #include <sys/time.h>
3163fcbbf64Spooka 
3173fcbbf64Spooka #ifndef TIMEVAL_TO_TIMESPEC
3183fcbbf64Spooka #define TIMEVAL_TO_TIMESPEC(tv, ts)		\
3193fcbbf64Spooka do {						\
3203fcbbf64Spooka 	(ts)->tv_sec  = (tv)->tv_sec;		\
3213fcbbf64Spooka 	(ts)->tv_nsec = (tv)->tv_usec * 1000;	\
322388550b0Srillig } while (0)
3233fcbbf64Spooka #endif
3243fcbbf64Spooka 
32523dfcd74Spooka #if !defined(HAVE_SETPROGNAME)
32629316c50Spooka #define setprogname(a)
32729316c50Spooka #endif
32829316c50Spooka 
329bc0dc0b2Spooka /* at least GNU Hurd does not specify various common hardcoded constants */
330bc0dc0b2Spooka #include <limits.h>
331bc0dc0b2Spooka #ifndef MAXPATHLEN
332bc0dc0b2Spooka #define MAXPATHLEN	4096
333bc0dc0b2Spooka #endif
334bc0dc0b2Spooka #ifndef PATH_MAX
335bc0dc0b2Spooka #define PATH_MAX	MAXPATHLEN
336bc0dc0b2Spooka #endif
337bc0dc0b2Spooka #ifndef MAXHOSTNAMELEN
338bc0dc0b2Spooka #define MAXHOSTNAMELEN	256
339bc0dc0b2Spooka #endif
340bc0dc0b2Spooka 
3413b3ffd70Spooka #endif /* _LIB_LIBRUMPUSER_RUMPUSER_PORT_H_ */
342