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