compat.h revision afb71cb81cb806d8b32238f393c5d2e8e3f4511f
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef __COMPAT_H
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define __COMPAT_H
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#if defined (HAVE_INTTYPES_H) && defined(__osf__)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# include <inttypes.h>
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync/* well, this is obviously wrong since it assumes it's 64bit, but older
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync GCCs don't define it and we really want it. */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef LLONG_MAX
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define LLONG_MAX 9223372036854775807LL
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef __cplusplus
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifdef HAVE__BOOL
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef _Bool bool;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef int bool;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#if defined (HAVE_UOFF_T)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync/* native support */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#elif defined (UOFF_T_INT)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef unsigned int uoff_t;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#elif defined (UOFF_T_LONG)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef unsigned long uoff_t;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#elif defined (UOFF_T_LONG_LONG)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef unsigned long long uoff_t;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# error uoff_t size not set
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_UINTMAX_T
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# if SIZEOF_LONG_LONG > 0
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef unsigned long long uintmax_t;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef unsigned long uintmax_t;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_UINT_FAST32_T
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# if SIZEOF_INT >= 4
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef unsigned int uint_fast32_t;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef unsigned long uint_fast32_t;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_SOCKLEN_T
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsynctypedef int socklen_t;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifdef HAVE_SYS_SYSMACROS_H
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# include <sys/sysmacros.h>
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# ifdef HAVE_SYS_MKDEV_H
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# include <sys/mkdev.h> /* UnixWare */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define CMP_DEV_T(a, b) (major(a) == major(b) && minor(a) == minor(b))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#elif !defined (DEV_T_STRUCT)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define CMP_DEV_T(a, b) ((a) == (b))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# error I do not know how to compare dev_t
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifdef HAVE_STAT_TV_NSEC
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define CMP_ST_MTIME(st1, st2) \
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync ((st1)->st_mtime == (st2)->st_mtime && \
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync (st1)->st_mtim.tv_nsec == (st2)->st_mtim.tv_nsec)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define CMP_ST_CTIME(st1, st2) \
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync ((st1)->st_ctime == (st2)->st_ctime && \
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync (st1)->st_ctim.tv_nsec == (st2)->st_ctim.tv_nsec)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define CMP_ST_MTIME(st1, st2) ((st1)->st_mtime == (st2)->st_mtime)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define CMP_ST_CTIME(st1, st2) ((st1)->st_ctime == (st2)->st_ctime)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync/* strcasecmp(), strncasecmp() */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_STRCASECMP
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# ifdef HAVE_STRICMP
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define strcasecmp stricmp
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define strncasecmp strnicmp
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define strcasecmp my_strcasecmp
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define strncasecmp my_strncasecmp
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncint my_strcasecmp(const char *s1, const char *s2);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncint my_strncasecmp(const char *s1, const char *s2, size_t max_chars);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_INET_ATON
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# include <sys/socket.h>
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# include <netinet/in.h>
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# include <arpa/inet.h>
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define inet_aton my_inet_aton
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncint my_inet_aton(const char *cp, struct in_addr *inp);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_VSYSLOG
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define vsyslog my_vsyslog
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncvoid my_vsyslog(int priority, const char *format, va_list args);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_GETPAGESIZE
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define getpagesize my_getpagesize
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncint my_getpagesize(void);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_FDATASYNC
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define fdatasync fsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncstruct const_iovec {
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync const void *iov_base;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync size_t iov_len;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync};
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_STRUCT_IOVEC
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncstruct iovec {
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync void *iov_base;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync size_t iov_len;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync};
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync/* IOV_MAX should be in limits.h nowadays. Linux still (2005) requires
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync defining _XOPEN_SOURCE to get that value. UIO_MAXIOV works with it though,
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync so use it instead. 16 is the lowest acceptable value for all OSes. */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef IOV_MAX
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# include <sys/uio.h>
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# ifdef UIO_MAXIOV
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define IOV_MAX UIO_MAXIOV
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define IOV_MAX 16
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_WRITEV
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define writev my_writev
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncstruct iovec;
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncssize_t my_writev(int fd, const struct iovec *iov, int iov_len);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#if !defined (HAVE_PREAD) || defined (PREAD_WRAPPERS)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# ifndef IN_COMPAT_C
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define pread my_pread
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define pwrite my_pwrite
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncssize_t my_pread(int fd, void *buf, size_t count, off_t offset);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncssize_t my_pwrite(int fd, const void *buf, size_t count, off_t offset);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_SETEUID
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define seteuid my_seteuid
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncint my_seteuid(uid_t euid);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_SETEGID
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define setegid my_setegid
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncint my_setegid(gid_t egid);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_LIBGEN_H
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define basename my_basename
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncchar *my_basename(char *path);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef HAVE_STRTOULL
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define strtoull my_strtoull
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsyncunsigned long long int my_strtoull(const char *nptr, char **endptr, int base);
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync/* ctype.h isn't safe with signed chars,
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync use our own instead if really needed */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_toupper(x) ((char) toupper((int) (unsigned char) (x)))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_tolower(x) ((char) tolower((int) (unsigned char) (x)))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isalnum(x) isalnum((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isalpha(x) isalpha((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isascii(x) isascii((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isblank(x) isblank((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_iscntrl(x) iscntrl((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isdigit(x) isdigit((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isgraph(x) isgraph((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_islower(x) islower((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isprint(x) isprint((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_ispunct(x) ispunct((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isspace(x) isspace((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isupper(x) isupper((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#define i_isxdigit(x) isxdigit((int) (unsigned char) (x))
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifndef EOVERFLOW
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define EOVERFLOW EINVAL
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifdef EDQUOT
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define ENOSPACE(errno) ((errno) == ENOSPC || (errno) == EDQUOT)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#else
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define ENOSPACE(errno) ((errno) == ENOSPC)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#endif
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync/* EPERM is returned sometimes if device doesn't support such modification */
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#ifdef EROFS
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync# define ENOACCESS(errno) \
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync ((errno) == EACCES || (errno) == EROFS || (errno) == EPERM)
a734c64bff58bda2fa48c2795453e092167b0ff7vboxsync#else
# define ENOACCESS(errno) ((errno) == EACCES || (errno) == EPERM)
#endif
#define ENOTFOUND(errno) \
((errno) == ENOENT || (errno) == ENOTDIR || (errno) == ELOOP)
#define ECANTLINK(errno) \
((errno) == EXDEV || (errno) == EMLINK || (errno) == EPERM)
/* EBUSY is given by some NFS implementations */
#define EDESTDIREXISTS(errno) \
((errno) == EEXIST || (errno) == ENOTEMPTY || (errno) == EBUSY)
#endif