blob: 454ecf6b94c4d7702f08be8b8715bad07ca18beb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
/*
* Machine and OS dependend definitions.
* This module implements host OS abstraction layer that helps make
* agent code portable between Linux, Windows, VxWorks and potentially other OSes.
*/
#ifndef D_mdep
#define D_mdep
#ifdef WIN32
/* MS Windows NT/XP */
#define _WIN32_WINNT 0x0400
#pragma warning(disable:4615)
#include <windows.h>
#include <winsock.h>
#include <memory.h>
#include <process.h>
#include <IPHlpApi.h>
#include <time.h>
#include <io.h>
#define FILE_PATH_SIZE MAX_PATH
typedef int socklen_t;
#ifdef __GNUC__
#define _WIN32_IE 0x0500
#else
#define __i386__
typedef unsigned long pid_t;
#endif
typedef unsigned long useconds_t;
typedef struct {
unsigned long ebx, ecx, edx, esi, edi, ebp, eax;
unsigned short ds, __ds, es, __es;
unsigned short fs, __fs, gs, __gs;
unsigned long orig_eax, eip;
unsigned short cs, __cs;
long eflags, esp;
unsigned short ss, __ss;
} REG_SET;
#define get_regs_PC(x) x.eip
#define set_regs_PC(x,y) x.eip = (unsigned long)(y)
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
#define SIGTRAP 5
#define SIGKILL 9
#define SIGSTOP 19
#define ETIMEDOUT 100
#define vsnprintf _vsnprintf
#define CLOCK_REALTIME 1
typedef int clockid_t;
extern int clock_gettime(clockid_t clock_id, struct timespec * tp);
extern void usleep(useconds_t useconds);
/*
* PThreads emulation.
*/
typedef HANDLE pthread_t;
typedef HANDLE pthread_mutex_t;
typedef int pthread_attr_t;
typedef struct {
int waiters_count;
CRITICAL_SECTION waiters_count_lock;
HANDLE sema;
HANDLE waiters_done;
size_t was_broadcast;
} pthread_cond_t;
extern void pthread_mutex_init(pthread_mutex_t * mutex, void * attr);
extern void pthread_cond_init(pthread_cond_t * cond, void * attr);
extern void pthread_cond_signal(pthread_cond_t * cond);
extern void pthread_cond_broadcast(pthread_cond_t *cond);
extern int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex);
extern int pthread_cond_timedwait(pthread_cond_t * cond, pthread_mutex_t * mutex,
struct timespec * timeout);
extern void pthread_mutex_lock(pthread_mutex_t * mutex);
extern void pthread_mutex_unlock(pthread_mutex_t * mutex);
extern pthread_t pthread_self(void);
extern int pthread_create(pthread_t * thread, pthread_attr_t * attr,
void * (*start_routine)(void *), void * arg);
extern int pthread_join(pthread_t thread, void **value_ptr);
/*
* Windows socket functions don't set errno as expected.
* Wrappers are provided to workaround the problem.
* TODO: more socket function wrappers are needed for better error reports on Windows
*/
#define socket(af, type, protocol) wsa_socket(af, type, protocol)
#define bind(socket, addr, addr_size) wsa_bind(socket, addr, addr_size)
extern int wsa_bind(int socket, const struct sockaddr * addr, int addr_size);
extern int wsa_socket(int af, int type, int protocol);
typedef __int64 int64;
typedef unsigned __int64 uns64;
#define lseek _lseeki64
typedef struct _stati64 struct_stat;
#define stat _stati64
#define lstat _stati64
#define fstat _fstati64
extern int truncate(const char * path, int64 size);
extern int ftruncate(int f, int64 size);
#define utimbuf _utimbuf
#define utime _utime
#define futime _futime
#define snprintf _snprintf
struct DIR {
long hdl;
struct _finddatai64_t blk;
char path[FILE_PATH_SIZE];
};
struct dirent {
char d_name[FILE_PATH_SIZE];
int64 d_size;
time_t d_atime;
time_t d_ctime;
time_t d_wtime;
};
typedef struct DIR DIR;
extern DIR * opendir(const char * path);
extern int closedir(DIR * dir);
extern struct dirent * readdir(DIR * dir);
extern char * canonicalize_file_name(const char * path);
#define O_LARGEFILE 0
extern int getuid(void);
extern int geteuid(void);
extern int getgid(void);
extern int getegid(void);
#elif defined(_WRS_KERNEL)
/* VxWork kernel module */
#define INET
#include <vxWorks.h>
#include <regs.h>
#include <pthread.h>
#include <sys/ioctl.h>
#include <netinet/tcp.h>
#include <net/if.h>
#include <wrn/coreip/sockLib.h>
#include <wrn/coreip/hostLib.h>
#define environ taskIdCurrent->ppEnviron
#define get_regs_PC(x) (*(int *)((int)&(x) + PC_OFFSET))
#define set_regs_PC(x,y) *(int *)((int)&(x) + PC_OFFSET) = (int)(y)
#define closesocket close
typedef long long int64;
typedef unsigned long long uns64;
typedef unsigned long useconds_t;
#define FILE_PATH_SIZE PATH_MAX
#define O_BINARY 0
#define O_LARGEFILE 0
#define lstat stat
typedef struct stat struct_stat;
#define ifr_netmask ifr_addr
#define SA_LEN(addr) ((addr)->sa_len)
extern int truncate(char * path, int64 size);
extern char * canonicalize_file_name(const char * path);
extern void usleep(useconds_t useconds);
extern int getuid(void);
extern int geteuid(void);
extern int getgid(void);
extern int getegid(void);
#else
/* Linux or UNIX */
#ifndef _LARGEFILE_SOURCE
#error "Need CC command line option: -D_LARGEFILE_SOURCE"
#endif
#ifndef _GNU_SOURCE
#error "Need CC command line option: -D_GNU_SOURCE"
#endif
#include <unistd.h>
#include <memory.h>
#include <pthread.h>
#include <netdb.h>
#include <sys/user.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <net/if.h>
#define FILE_PATH_SIZE PATH_MAX
#define closesocket close
typedef __int64_t int64;
typedef __uint64_t uns64;
typedef struct user_regs_struct REG_SET;
typedef struct stat struct_stat;
#define O_BINARY 0
#define get_regs_PC(x) x.eip
#define set_regs_PC(x,y) x.eip = (unsigned long)(y)
#ifndef SA_LEN
# ifdef HAVE_SOCKADDR_SA_LEN
# define SA_LEN(addr) ((addr)->sa_len)
# else /* HAVE_SOCKADDR_SA_LEN */
# ifdef HAVE_STRUCT_SOCKADDR_STORAGE
static size_t get_sa_len(const struct sockaddr *addr) {
switch (addr->sa_family) {
# ifdef AF_UNIX
case AF_UNIX: return sizeof(struct sockaddr_un);
# endif
# ifdef AF_INET
case AF_INET: return (sizeof (struct sockaddr_in));
# endif
# ifdef AF_INET6
case AF_INET6: return (sizeof (struct sockaddr_in6));
# endif
default: return (sizeof (struct sockaddr));
}
}
# define SA_LEN(addr) (get_sa_len(addr))
# else /* HAVE_SOCKADDR_STORAGE */
# define SA_LEN(addr) (sizeof (struct sockaddr))
# endif /* HAVE_SOCKADDR_STORAGE */
# endif /* HAVE_SOCKADDR_SA_LEN */
#endif /* SA_LEN */
extern int tkill(pid_t pid, int signal);
#endif
extern pthread_attr_t pthread_create_attr;
extern char * get_os_name(void);
extern char * get_user_home(void);
extern void ini_mdep(void);
#endif