#ifndef sys_h
#define sys_h
/*
* This defines macros that are wrappers around the "system calls" for
* whatever  POSIX-like system we are running on top of.  These macros
* look and act a whole  lot  like  Unix's  libc.a  routines,  but  by
* defining  them as macros, we can easily retarget them for any other
* "extended" library that we come across.
*
* Some of the macros here are pointed at the  d_*()  debug  wrappers;
* you   can   "de-debugify"  things  by  just  wiping  out  the  "d_"
* everywhere.  But you might want to save a copy of this file  first,
* for  when  thing  don't  work  and  you want to reinstate the debug
* wrappers.
*
* In particular, this spproach can be very useful when porting to  NT
* or other poorly-implemented POSIX systems.
*/

#define Alarm(f)	d_alarm(f)
#define Close(f)	d_close(f)
#define Chdir(d)	chdir(d)
#define Connect(s,a,l)	d_connect((int)(s),(SKin*)(a),(int)(l))
#define Dup(f)	d_dup(f)
#define Dup2(f,g)	d_dup2(f,g)
#define Execv(n,av)	d_execv((CP)(n),(CP*)(av))
#define Execve(n,av,ev)	d_execve((CP)(n),(CP*)(av),(CP*)(ev))
#define Execvp(n,av)	d_execvp((CP)(n),(CP*)(av))
#define Exit(s)	exit(s)
#define FRee(p)	d_free((void*)(p),(char*)0)
#define Fclose(f)	d_fclose((FILE*)(f))
#define Fcntl(f,r,a)	d_fcntl((int)(f),(int)(r),(int)(a))
#define Fdopen(f,t)	fdopen((int)(f),(CP)(t))
#define Fflush(f)	(void)fflush((FILE*)(f))
#define Fgets(b,n,f)	d_fgets((CP)(b),(Sizt)(n),(FILE*)(f))
#define Findenv(n)	d_findenv((CP)(n))
#define Fopen(f,t)	d_fopen((CP)(f),(CP)(t))
#define Fork()	d_fork()
#define Fprintf	(void)fprintf
#define Fputc(c,f)	(void)fputc((int)(c),(FILE*)(f))
#define Fputs(s,f)	(void)fputs((CP)(s),(FILE*)(f))
#define Fread(p,s,n,f)	d_fread((CP)(p),(Sizt)(s),(Sizt)(n),(FILE*)(f))
#define FreeM(p,m)	d_free((void*)(p),(char*)(m))
#define Freopen(f,t,s)	freopen((CP)(f),(CP)(t),(FILE*)(s))
#define Fstat(f,s)	d_fstat(f,(STat*)(s))
#define Fwrite(p,s,n,f)	d_fwrite((CP)(p),(Sizt)(s),(Sizt)(n),(FILE*)(f))
#define GMTime(tp)	gmtime((const time_t *)(tp))
#define GetDate(s,l)	get_date((CP)(s),(int)(l))
#define GetUT(t)	d_gettod((TIMV*)(t),(TIMZ*)(0))
#define Getenv(n)	d_getenv((CP)(n))
#define Gethostbya(a,l,t)	d_ghba((CP)(a),(l),(t))
#define Gethostbyaddr(a,l,t)	d_ghba((CP)(a),(l),(t))
#define Gethostbyn(n)	d_ghbn((CP)(n))
#define Gethostbyname(n)	d_ghbn((CP)(n))
#define Gethostname(n,l)	gethostname((CP)(n),(int)(l))
#define Getpid()	getpid()
#define Getservbyn(n,p)	getservbyname((CP)(n),(CP)(p))
#define Getservbyp(n,p)	getservbyport((int)(n),(CP)(p))
#define Gettimeofday(t,z)	d_gettod((TIMV*)(t),(TIMZ*)(z))
#define Ioctl(f,r,a)	d_ioctl((int)(f),(Ulong)(r),(CP)(a))
#define Kill(p,s)	d_kill((int)(p),(int)(s))
#define Link(f,g)	d_link((CP)(f),(CP)(g))
#define Listen(f,g)	d_listen((int)(f),(int)(g))
#define LocalTime(tp)	localtime((const time_t *)(tp))
#define Lseek(f,o,w)	d_seek((int)(f),(Sizt)(o),(int)(w))
#define Lstat(f,s)	d_lstat((CP)(f),(STat*)(s))
#define MAlloc(n,m)	d_malloc((Sizt)(n),(CP)(m))
#define MAllocM(n,m)	d_malloc((Sizt)(n),(CP)(m))
#define Malloc(n)	d_malloc((Sizt)(n),0)
#define MallocM(n,m)	d_malloc((Sizt)(n),(CP)(m))
#define MkDir(n,m)	mkdir((CP)(n),(int)(m))
#define Mknod(n,f,m)	d_mknod((CP)(n),(int)(f),(int)(m))
#define Open(n,f,m)	d_open((CP)(n),(int)(f),(int)(m))
#define Open1(n)	d_open((CP)(n),(int)(0),(-1))
#define Open2(n,f)	d_open((CP)(n),(int)(f),(-1))
#define Open3(n,f,m)	d_open((CP)(n),(int)(f),(int)(m))
#define Pipe(fd)	d_pipe((int*)(fd),CP0)
#define PipeM(fd,m)	d_pipe((int*)(fd),(CP)(m))
#define Printf	(void)printf
#define Putc(c,f)	(void)putc((int)(c),(FILE*)(f))
#define Putchar(c)	(void)putchar((int)(c))
#define Putenv(n)	d_putenv((CP)(n))
#define Read(f,b,n)	d_read((int)(f),(CP)(b),(Sizt)(n))
#define Realloc(p,f,t)	d_realloc((CP)(p),(Sizt)(f),(Sizt)(t),CP0)
#define ReallocM(p,f,t,m)	d_realloc((void*)(p),(Sizt)(f),(Sizt)(t),(CP)(m))
extern void* memBlock();
#define Rename(s,d)	d_rename((CP)(s),(CP)(d))
#define RmDir(n)	rmdir((CP)(n))
#define Seek(f,o,w)	d_seek((int)(f),(Sizt)(o),(int)(w))
#define Signal(s,f)	d_signal((int)(s),(void*)(f),(CP)0)
#define SignalM(s,f,m)	d_signal((int)(s),(void*)(f),(CP)(m))
#define Sleep(n)	if(n)d_sleep(n)
#define Stat(f,s)	d_stat((CP)(f),(STat*)(s))
#define Unlink(f)	d_unlink((CP)(f))
#define Wait(s)	d_wait((union wait*)(s))
#define Write(f,b,n)	d_write((int)(f),(CP)(b),(Sizt)(n))
#define Wwrite(f,b,n)	d_wwrite((int)(f),(CP)(b),(Sizt)(n))
#define WWrite(f,b,n)	d_wwrite((int)(f),(CP)(b),(Sizt)(n))

#ifdef	HAS_wait3
#define Wait3(s,o,u)	d_wait3((union wait*)(s),(int)(o),(struct rusage*)(u))
#endif

#ifndef Mfudge
#define Mfudge	1	/* Extra bytes for Malloc() */
#endif

#if	defined(ULTRIX)	|| defined(BSD)
#define Setpgrp(x,y)	d_setpgrp(x,y)
#elif	defined(SYS5)
#define Setpgrp()	d_setpgrp()
#endif

#if	(defined(HAS_select) && (HAS_select > 0))
#if	(defined(USE_select) && (USE_select > 0))
#define Select(f,r,w,e,t)	d_select(f,(int*)(r),(int*)(w),(int*)(e),(TIMV*)(t))
#endif /*USE_select*/
#endif /*HAS_select*/

#if	defined(HAS_poll) && (HAS_poll > 0)
#if	defined(USE_poll) && (USE_poll > 0)
#define Poll(f,n,t)	d_poll((struct pollfd *)(f),(Sizt)(n),(int)(t))
#endif
#endif

/*
* Here are some wrappers for the Berkeley socket library, which
* pretty much every Unix-like system has these days:
*/
#ifdef	HAS_socket
#define Getpeername(s,n,l) \
	getpeername((int)(s),(SKAD*)(n),(int*)(l))
#define Getsockname(s,n,l) \
	getsockname((int)(s),(SKAD*)(n),(int*)(l))
#define Bind(f,s,l) \
	d_bind(f,(struct sockaddr*)(s),(int)(l))
#define Bindap(f,s,a,p) \
	d_bindap((int)(f),(SKin*)(s),(U32)(a),(int)(p))
#define Accept(s,a,l) \
	d_accept((int)(s),(SKin*)(a),(int*)(l))
#define Recv(s,m,n,f) \
	d_recv(s,(CP)(m),(Sizt)(n),(int)(f))
#define Recvfrom(s,m,n,f,a,l) \
	d_recvfr(s,(CP)(m),(Sizt)(n),(int)(f),(struct sockaddr*)(a),(int*)(l))
#define Socket(af,t,p) \
	d_socket(af,t,p)
#define Send(s,m,l,f) \
	d_send((int)(s),(CP)(m),(Sizt)(l),(int)(f))
#define Sendto(s,m,l,f,t,n) \
	d_sendto((int)(s),(CP)(m),(Sizt)(l),(int)(f),(SKAD*)(t),(int)(n))
#define Setsockopt(s,l,x,v,n) \
	d_setsockopt((int)s,(int)l,(int)x,(int*)(v),(int)(n))
#define Getsockopt(s,l,x,v,n) \
	d_getsockopt((int)s,(int)l,(int)x,(int*)(v),(int*)(n))
#endif

#endif
