blob: 4e00bc5dbbe234cb9b9973e307e63721cc50fa59 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef __OSL_SYSTEM_H__
#define __OSL_SYSTEM_H__
#define PTHREAD_NONE
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <errno.h>
#include <stdarg.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <signal.h>
#include <utime.h>
#include <pwd.h>
#include <netdb.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
/* OS/2 API header */
#define INCL_WINPROGRAMLIST
#define INCL_WINSHELLDATA
#define INCL_BASE
#define INCL_DOSSIGNALS
#define INCL_DOSSEMAPHORES
#define INCL_DOSMODULEMGR
#define INCL_DOSERRORS
#define INCL_DOSSESMGR
#define INCL_DOSPROCESS
#define INCL_DOSNMPIPES
#define INCL_DOSMISC
#include <os2.h>
typedef ULONG HANDLE;
#define _MAX_ENV 2048
#define _MAX_CMD 2048
#ifdef __cplusplus
extern "C"
#endif
int debug_printf(const char *f, ...);
/* Make sockets of type AF_UNIX use underlying FS rights */
#ifdef SOLARIS
# define _XOPEN_SOURCE 500
# include <sys/socket.h>
# undef _XOPEN_SOURCE
#else
# include <sys/socket.h>
#endif
#include <netinet/in.h>
#include <arpa/inet.h>
#define max(a, b) ((a) < (b) ? (b) : (a))
#define min(a, b) ((a) > (b) ? (b) : (a))
#ifndef abs
#define abs(x) ((x) >= 0 ? (x) : -(x))
#endif
#ifdef SYSV
# include <sys/utsname.h>
#endif
#ifdef LINUX
# ifndef __USE_GNU
# define __USE_GNU
# endif
#if GLIBC >= 2
# include <shadow.h>
# if ! (defined(SPARC) || defined(X86_64))
# include <asm/sigcontext.h>
# endif
# include <pthread.h>
# include <sys/file.h>
# include <sys/ioctl.h>
# include <sys/uio.h>
# include <sys/un.h>
# include <netinet/tcp.h>
# include <dlfcn.h>
# include <endian.h>
# include <sys/time.h>
# include <semaphore.h>
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define _LITTLE_ENDIAN
# elif __BYTE_ORDER == __BIG_ENDIAN
# define _BIG_ENDIAN
# elif __BYTE_ORDER == __PDP_ENDIAN
# define _PDP_ENDIAN
# endif
# define PTR_SIZE_T(s) ((size_t *)&(s))
# define IORESOURCE_TRANSFER_BSD
# define IOCHANNEL_TRANSFER_BSD_RENO
# define pthread_testcancel()
# define NO_PTHREAD_PRIORITY
# define PTHREAD_SIGACTION pthread_sigaction
#else
# include <shadow.h>
# include <asm/sigcontext.h>
# include <pthread.h>
# include <sys/file.h>
# include <sys/ioctl.h>
# include <linux/net.h>
# include <sys/un.h>
# include <netinet/tcp.h>
# include <linux/elfcore.h>
# include <dlfcn.h>
# include <endian.h>
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define _LITTLE_ENDIAN
# elif __BYTE_ORDER == __BIG_ENDIAN
# define _BIG_ENDIAN
# elif __BYTE_ORDER == __PDP_ENDIAN
# define _PDP_ENDIAN
# endif
# define IORESOURCE_TRANSFER_BSD
# define IOCHANNEL_TRANSFER_BSD_RENO
# define pthread_testcancel()
# define NO_PTHREAD_RTL
# define NO_PTHREAD_PRIORITY
# define PTHREAD_SIGACTION pthread_sigaction
#endif
#endif
#ifdef NETBSD
# define ETIME ETIMEDOUT
# define _POSIX_THREAD_SYSCALL_SOFT 1
# include <pthread.h>
# include <netdb.h>
# include <sys/sem.h>
# include <sys/exec.h>
# include <sys/filio.h>
# include <sys/ioctl.h>
# include <sys/time.h>
# include <sys/un.h>
# include <netinet/tcp.h>
# include <dlfcn.h>
# include <machine/endian.h>
# if BYTE_ORDER == LITTLE_ENDIAN
# define _LITTLE_ENDIAN_OO
# elif BYTE_ORDER == BIG_ENDIAN
# define _BIG_ENDIAN_OO
# elif BYTE_ORDER == PDP_ENDIAN
# define _PDP_ENDIAN_OO
# endif
# define PTR_SIZE_T(s) ((size_t *)&(s))
# define IORESOURCE_TRANSFER_BSD
# define IOCHANNEL_TRANSFER_BSD_RENO
# define pthread_testcancel()
# define NO_PTHREAD_PRIORITY
# define NO_PTHREAD_SEMAPHORES
# define NO_PTHREAD_RTL
# define PTHREAD_SIGACTION pthread_sigaction
#endif
#ifdef FREEBSD
# define ETIME ETIMEDOUT
# include <pthread.h>
# include <sys/sem.h>
# include <semaphore.h>
# include <dlfcn.h>
# include <sys/filio.h>
# include <sys/ioctl.h>
# include <sys/param.h>
# include <sys/time.h>
# include <sys/uio.h>
# include <sys/exec.h>
# include <vm/vm.h>
# include <vm/vm_param.h>
# include <vm/pmap.h>
# include <vm/swap_pager.h>
# include <sys/un.h>
# include <netinet/tcp.h>
# define IORESOURCE_TRANSFER_BSD
# include <machine/endian.h>
#if __FreeBSD_version < 500000
# if BYTE_ORDER == LITTLE_ENDIAN
# define _LITTLE_ENDIAN
# elif BYTE_ORDER == BIG_ENDIAN
# define _BIG_ENDIAN
# elif BYTE_ORDER == PDP_ENDIAN
# define _PDP_ENDIAN
# endif
#endif
# define NO_PTHREAD_RTL
#endif
#ifdef SCO
# define AF_IPX -1
# include <strings.h>
# include <pthread.h>
# include <shadow.h>
# include <netdb.h>
# include <sys/un.h>
# include <sys/netinet/tcp.h>
# include <sys/types.h>
# include <sys/byteorder.h>
# include <dlfcn.h>
# if BYTE_ORDER == LITTLE_ENDIAN
# define _LITTLE_ENDIAN
# elif BYTE_ORDER == BIG_ENDIAN
# define _BIG_ENDIAN
# elif BYTE_ORDER == PDP_ENDIAN
# define _PDP_ENDIAN
# endif
# define sched_yield() pthread_yield()
# define pthread_testcancel()
# define NO_PTHREAD_RTL
# define NO_PTHREAD_PRIORITY
extern int pthread_cancel(pthread_t);
extern unsigned int nanosleep(unsigned int);
# define SLEEP_TIMESPEC(timespec) (timespec .tv_sec > 0) ? sleep(timespec .tv_sec), nanosleep(timespec .tv_nsec) : nanosleep(timespec .tv_nsec)
# define PATH_MAX _POSIX_PATH_MAX
# define S_ISSOCK S_ISFIFO
# define PTHREAD_SIGACTION pthread_sigaction
# define STAT_PARENT stat
#endif
#ifdef AIX
# define AF_IPX -1
# include <strings.h>
# include <pthread.h>
# include <sys/time.h>
# include <sys/un.h>
# include <netinet/tcp.h>
# include <sys/machine.h>
# if BYTE_ORDER == LITTLE_ENDIAN
# define _LITTLE_ENDIAN
# elif BYTE_ORDER == BIG_ENDIAN
# define _BIG_ENDIAN
# elif BYTE_ORDER == PDP_ENDIAN
# define _PDP_ENDIAN
# endif
# define sched_yield() pthread_yield()
# define SLEEP_TIMESPEC(timespec) nsleep(&timespec, 0)
# define LIBPATH "LIBPATH"
# define PTR_SIZE_T(s) ((size_t *)&(s))
# define NO_PTHREAD_SEMAPHORES
# define NO_DL_FUNCTIONS
#endif
#ifdef HPUX
# define AF_IPX -1
# undef howmany
# undef MAXINT
# include <pthread.h>
# include <sys/un.h>
# include <sys/sched.h>
# include <sys/xti.h>
# include <sys/pstat.h>
# include <shadow.h>
# include <crypt.h>
# include <machine/param.h>
# define LIBPATH "SHLIB_PATH"
# define PTR_SIZE_T(s) ((int *)&(s))
# define PTR_FD_SET(s) ((int *)&(s))
# define PTHREAD_VALUE(t) ((t).field2)
# define PTHREAD_NONE_INIT { 0, -1 }
# define PTHREAD_ATTR_DEFAULT pthread_attr_default
# define PTHREAD_MUTEXATTR_DEFAULT pthread_mutexattr_default
# define PTHREAD_CONDATTR_DEFAULT pthread_condattr_default
# define pthread_detach(t) pthread_detach(&(t))
# define NO_PTHREAD_PRIORITY
# define NO_PTHREAD_SEMAPHORES
# define NO_DL_FUNCTIONS
# undef sigaction
# define PTHREAD_SIGACTION cma_sigaction
#endif
#ifdef SOLARIS
# include <shadow.h>
# include <sys/procfs.h>
# include <sys/un.h>
# include <stropts.h>
# include <pthread.h>
# include <semaphore.h>
# include <netinet/tcp.h>
# include <sys/filio.h>
# include <dlfcn.h>
# include <sys/isa_defs.h>
# define IORESOURCE_TRANSFER_SYSV
# define IOCHANNEL_TRANSFER_BSD
# define LIBPATH "LD_LIBRARY_PATH"
# define PTR_SIZE_T(s) ((int *)&(s))
#endif
#ifdef MACOSX
# define ETIME ETIMEDOUT
# include <pthread.h>
# include <sys/file.h>
# include <sys/ioctl.h>
# include <sys/uio.h>
# include <sys/un.h>
# include <netinet/tcp.h>
# include <machine/endian.h>
# include <sys/time.h>
# include <sys/semaphore.h>
/* fixme are premac and postmac still needed here? */
# include <premac.h>
# include <mach-o/dyld.h>
# include <postmac.h>
# if BYTE_ORDER == LITTLE_ENDIAN
# define _LITTLE_ENDIAN
# elif BYTE_ORDER == BIG_ENDIAN
# define _BIG_ENDIAN
# elif BYTE_ORDER == PDP_ENDIAN
# define _PDP_ENDIAN
# endif
# define IOCHANNEL_TRANSFER_BSD_RENO
# define NO_PTHREAD_RTL
/* for NSGetArgc/Argv/Environ */
# include <crt_externs.h>
char *macxp_tempnam( const char *tmpdir, const char *prefix );
#endif
#ifdef OS2
# include <netinet/tcp.h>
#endif
#if !defined(_WIN32) && !defined(_WIN16) && !defined(OS2) && \
!defined(LINUX) && !defined(NETBSD) && !defined(FREEBSD) && !defined(SCO) && \
!defined(AIX) && !defined(HPUX) && \
!defined(SOLARIS) && !defined(MACOSX)
# error "Target plattform not specified !"
#endif
#if defined(NETBSD)
#if defined _LITTLE_ENDIAN_OO
# define _OSL_BIGENDIAN
#elif defined _BIG_ENDIAN_OO
# define _OSL_LITENDIAN
#else
# error undetermined endianess
#endif
#else
#if defined _LITTLE_ENDIAN
# define _OSL_BIGENDIAN
#elif defined _BIG_ENDIAN
# define _OSL_LITENDIAN
#else
# error undetermined endianess
#endif
#endif
#ifndef PTR_SIZE_T
# define PTR_SIZE_T(s) (&(s))
#endif
#ifndef PTR_FD_SET
# define PTR_FD_SET(s) (&(s))
#endif
#ifndef NORMALIZE_TIMESPEC
# define NORMALIZE_TIMESPEC(timespec) \
timespec . tv_sec += timespec . tv_nsec / 1000000000; \
timespec . tv_nsec %= 1000000000;
#endif
#ifndef SET_TIMESPEC
# define SET_TIMESPEC(timespec, sec, nsec) \
timespec . tv_sec = (sec); \
timespec . tv_nsec = (nsec); \
NORMALIZE_TIMESPEC(timespec);
#endif
#ifndef SLEEP_TIMESPEC
# define SLEEP_TIMESPEC(timespec) nanosleep(&timespec, 0)
#endif
#ifndef INIT_GROUPS
# define INIT_GROUPS(name, gid) ((setgid((gid)) == 0) && (initgroups((name), (gid)) == 0))
#endif
#ifndef PTHREAD_VALUE
# define PTHREAD_VALUE(t) (t)
#endif
#ifndef PTHREAD_NONE
extern pthread_t _pthread_none_;
# define PTHREAD_NONE _pthread_none_
# ifndef PTHREAD_NONE_INIT
# define PTHREAD_NONE_INIT ((pthread_t)-1)
# endif
#endif
#ifndef PTHREAD_ATTR_DEFAULT
# define PTHREAD_ATTR_DEFAULT NULL
#endif
#ifndef PTHREAD_MUTEXATTR_DEFAULT
# define PTHREAD_MUTEXATTR_DEFAULT NULL
#endif
#ifndef PTHREAD_CONDATTR_DEFAULT
# define PTHREAD_CONDATTR_DEFAULT NULL
#endif
#ifndef PTHREAD_SIGACTION
# define PTHREAD_SIGACTION sigaction
#endif
#ifndef STAT_PARENT
# define STAT_PARENT lstat
#endif
/* socket options which might not be defined on all unx flavors */
#ifndef SO_ACCEPTCONN
# define SO_ACCEPTCONN 0
#endif
#ifndef SO_SNDLOWAT
# define SO_SNDLOWAT 0
#endif
#ifndef SO_RCVLOWAT
# define SO_RCVLOWAT 0
#endif
#ifndef SO_SNDTIMEO
# define SO_SNDTIMEO 0
#endif
#ifndef SO_RCVTIMEO
# define SO_RCVTIMEO 0
#endif
#ifndef SO_USELOOPBACK
# define SO_USELOOPBACK 0
#endif
#ifndef MSG_MAXIOVLEN
# define MSG_MAXIOVLEN 0
#endif
/* BEGIN HACK */
/* dummy define and declarations for IPX should be replaced by */
/* original ipx headers when these are available for this platform */
#ifndef SA_FAMILY_DECL
# define SA_FAMILY_DECL short sa_family
#endif
typedef struct sockaddr_ipx {
SA_FAMILY_DECL;
char sa_netnum[4];
char sa_nodenum[6];
unsigned short sa_socket;
} SOCKADDR_IPX;
#define NSPROTO_IPX 1000
#define NSPROTO_SPX 1256
#define NSPROTO_SPXII 1257
/* END HACK */
#ifdef NO_PTHREAD_SEMAPHORES
typedef struct
{
pthread_mutex_t mutex;
pthread_cond_t increased;
int value;
} sem_t;
extern int sem_init(sem_t* sem, int pshared, unsigned int value);
extern int sem_destroy(sem_t* sem);
extern int sem_wait(sem_t* sem);
extern int sem_trywait(sem_t* sem);
extern int sem_post(sem_t* sem);
#endif
#ifdef NO_PTHREAD_RTL
#if !defined FREEBSD || (__FreeBSD_version < 500112)
struct passwd *getpwent_r(struct passwd *pwd, char *buffer, int buflen);
extern struct spwd *getspnam_r(const char *name, struct spwd *result,
char *buffer, int buflen);
struct tm *localtime_r(const time_t *timep, struct tm *buffer);
struct tm *gmtime_r(const time_t *timep, struct tm *buffer);
#endif /* !defined FREEBSD || (__FreeBSD_version < 500112) */
struct hostent *gethostbyname_r(const char *name, struct hostent *result,
char *buffer, int buflen, int *h_errnop);
#endif
#endif /* __OSL_SYSTEM_H__ */