redquark-amiberry-rb/src/include/bsdsocket.h
2020-07-28 00:46:30 +02:00

213 lines
7.9 KiB
C

/*
* UAE - The Un*x Amiga Emulator
*
* bsdsocket.library emulation
*
* Copyright 1997,98 Mathias Ortmann
*
*/
#ifndef UAE_BSDSOCKET_H
#define UAE_BSDSOCKET_H
#include "uae/types.h"
#include "thread.h"
extern int init_socket_layer (void);
extern void deinit_socket_layer (void);
/* initial size of per-process descriptor table (currently fixed) */
#define DEFAULT_DTABLE_SIZE 64
#define SCRATCHBUFSIZE 128
#define MAXPENDINGASYNC 512
#define MAXADDRLEN 256
#ifdef _WIN32
#define SOCKET_TYPE SOCKET
#else
#define SOCKET_TYPE int
#endif
/* allocated and maintained on a per-task basis */
struct socketbase {
struct socketbase *next;
struct socketbase *nextsig; /* queue for tasks to signal */
uaecptr sysbase;
int dosignal; /* signal flag */
uae_u32 ownertask; /* task that opened the library */
int signal; /* signal allocated for that task */
int sb_errno, sb_herrno; /* errno and herrno variables */
uae_u32 errnoptr, herrnoptr; /* pointers */
uae_u32 errnosize, herrnosize; /* pinter sizes */
int dtablesize; /* current descriptor/flag etc. table size */
SOCKET_TYPE *dtable; /* socket descriptor table */
int *ftable; /* socket flags */
int resultval;
uae_u32 hostent; /* pointer to the current hostent structure (Amiga mem) */
uae_u32 hostentsize;
uae_u32 protoent; /* pointer to the current protoent structure (Amiga mem) */
uae_u32 protoentsize;
uae_u32 servent; /* pointer to the current servent structure (Amiga mem) */
uae_u32 serventsize;
uae_u32 sigstosend;
uae_u32 eventsigs; /* EVENT sigmask */
uae_u32 eintrsigs; /* EINTR sigmask */
int eintr; /* interrupted by eintrsigs? */
int eventindex; /* current socket looked at by GetSocketEvents() to prevent starvation */
uae_u32 logstat;
uae_u32 logptr;
uae_u32 logmask;
uae_u32 logfacility;
uaecptr fdcallback;
unsigned int *mtable; /* window messages allocated for asynchronous event notification */
/* host-specific fields below */
#ifdef _WIN32
SOCKET_TYPE sockAbort; /* for aborting WinSock2 select() (damn Microsoft) */
SOCKET_TYPE sockAsync; /* for aborting WSBAsyncSelect() in window message handler */
int needAbort; /* abort flag */
void *hAsyncTask; /* async task handle */
void *hEvent; /* thread event handle */
#else
uae_sem_t sem; /* semaphore to notify the socket thread of work */
uae_thread_id thread; /* socket thread */
int sockabort[2]; /* pipe used to tell the thread to abort a select */
int action;
int s; /* for accept */
uae_u32 name; /* For gethostbyname */
uae_u32 a_addr; /* gethostbyaddr, accept */
uae_u32 a_addrlen; /* for gethostbyaddr, accept */
uae_u32 flags;
void *buf;
uae_u32 len;
uae_u32 to, tolen, from, fromlen;
int nfds;
uae_u32 sets [3];
uae_u32 timeout;
uae_u32 sigmp;
#endif
#ifdef AMIBERRY
TrapContext *context;
#endif
};
#define LIBRARY_SIZEOF 36
struct UAEBSDBase {
uae_u8 dummy[LIBRARY_SIZEOF];
struct socketbase *sb;
uae_u8 scratchbuf[SCRATCHBUFSIZE];
};
/* socket flags */
/* socket events to report */
#define REP_ACCEPT 0x01 /* there is a connection to accept() */
#define REP_CONNECT 0x02 /* connect() completed */
#define REP_OOB 0x04 /* socket has out-of-band data */
#define REP_READ 0x08 /* socket is readable */
#define REP_WRITE 0x10 /* socket is writeable */
#define REP_ERROR 0x20 /* asynchronous error on socket */
#define REP_CLOSE 0x40 /* connection closed (graceful or not) */
#define REP_ALL 0x7f
/* socket events that occurred */
#define SET_ACCEPT 0x0100 /* there is a connection to accept() */
#define SET_CONNECT 0x0200 /* connect() completed */
#define SET_OOB 0x0400 /* socket has out-of-band data */
#define SET_READ 0x0800 /* socket is readable */
#define SET_WRITE 0x1000 /* socket is writeable */
#define SET_ERROR 0x2000 /* asynchronous error on socket */
#define SET_CLOSE 0x4000 /* connection closed (graceful or not) */
#define SET_ALL 0x7f00
/* socket properties */
#define SF_BLOCKING 0x80000000
#define SF_BLOCKINGINPROGRESS 0x40000000
#define SF_DGRAM 0x20000000
/* STBC_FDCALLBACK */
#define FDCB_FREE 0
#define FDCB_ALLOC 1
#define FDCB_CHECK 2
uae_u32 addstr(TrapContext *ctx, uae_u32 * dst, const TCHAR *src);
uae_u32 addstr_ansi(TrapContext *ctx, uae_u32 * dst, const uae_char *src);
uae_u32 strncpyha(TrapContext *ctx, uae_u32 dst, const uae_char *src, int size);
uae_u32 addmem(TrapContext *ctx, uae_u32 * dst, const uae_char *src, int len);
#define SB struct socketbase *sb
extern void bsdsocklib_seterrno(TrapContext*, SB, int);
extern void bsdsocklib_setherrno(TrapContext*, SB, int);
extern void sockabort (SB);
extern void addtosigqueue (SB, int);
extern void removefromsigqueue (SB);
extern void sigsockettasks (void);
extern void locksigqueue (void);
extern void unlocksigqueue (void);
extern bool checksd(TrapContext*, SB, int sd);
extern void setsd(TrapContext*, SB, int , SOCKET_TYPE);
extern int getsd (TrapContext*, SB, SOCKET_TYPE);
extern SOCKET_TYPE getsock (TrapContext*, SB, int);
extern void releasesock (TrapContext*, SB, int);
extern void waitsig (TrapContext *context, SB);
extern void cancelsig (TrapContext *context, SB);
extern int host_sbinit (TrapContext*, SB);
extern void host_sbcleanup (SB);
extern void host_sbreset (void);
extern void host_closesocketquick (SOCKET_TYPE);
extern int host_dup2socket (TrapContext *, SB, int, int);
extern int host_socket (TrapContext *, SB, int, int, int);
extern uae_u32 host_bind (TrapContext *, SB, uae_u32, uae_u32, uae_u32);
extern uae_u32 host_listen (TrapContext *, SB, uae_u32, uae_u32);
extern void host_accept (TrapContext *, SB, uae_u32, uae_u32, uae_u32);
extern void host_sendto (TrapContext *, SB, uae_u32, uae_u32, uae_u8*, uae_u32, uae_u32, uae_u32, uae_u32);
extern void host_recvfrom (TrapContext *, SB, uae_u32, uae_u32, uae_u8*, uae_u32, uae_u32, uae_u32, uae_u32);
extern uae_u32 host_shutdown (SB, uae_u32, uae_u32);
extern void host_setsockopt (SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32);
extern uae_u32 host_getsockopt (TrapContext *, SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32);
extern uae_u32 host_getsockname (TrapContext *, SB, uae_u32, uae_u32, uae_u32);
extern uae_u32 host_getpeername (TrapContext *, SB, uae_u32, uae_u32, uae_u32);
extern uae_u32 host_IoctlSocket (TrapContext *, SB, uae_u32, uae_u32, uae_u32);
extern uae_u32 host_shutdown (SB, uae_u32, uae_u32);
extern int host_CloseSocket (TrapContext *, SB, int);
extern void host_connect (TrapContext *, SB, uae_u32, uae_u32, uae_u32);
extern void host_WaitSelect (TrapContext *, SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32);
extern uae_u32 host_SetSocketSignals (void);
extern uae_u32 host_getdtablesize (void);
extern uae_u32 host_ObtainSocket (void);
extern uae_u32 host_ReleaseSocket (void);
extern uae_u32 host_ReleaseCopyOfSocket (void);
extern uae_u32 host_Inet_NtoA(TrapContext *ctx, SB, uae_u32);
extern uae_u32 host_inet_addr(TrapContext *ctx, uae_u32);
extern uae_u32 host_Inet_LnaOf (void);
extern uae_u32 host_Inet_NetOf (void);
extern uae_u32 host_Inet_MakeAddr (void);
extern uae_u32 host_inet_network (void);
extern void host_gethostbynameaddr (TrapContext *, SB, uae_u32, uae_u32, long);
extern uae_u32 host_getnetbyname (void);
extern uae_u32 host_getnetbyaddr (void);
extern void host_getservbynameport (TrapContext *, SB, uae_u32, uae_u32, uae_u32);
extern void host_getprotobyname (TrapContext *, SB, uae_u32);
extern void host_getprotobynumber (TrapContext *, SB, uae_u32);
extern uae_u32 host_vsyslog (void);
extern uae_u32 host_Dup2Socket (void);
extern uae_u32 host_gethostname(TrapContext *ctx, uae_u32, uae_u32);
extern uae_u32 callfdcallback(TrapContext *context, SB, uae_u32 fd, uae_u32 action);
extern uaecptr bsdlib_startup (TrapContext*, uaecptr);
extern void bsdlib_install (void);
extern void bsdlib_reset (void);
void bsdsock_fake_int_handler(void);
extern int volatile bsd_int_requested;
#endif /* UAE_BSDSOCKET_H */