mirror of
https://github.com/Oibaf66/uae-wii.git
synced 2024-06-03 00:58:47 +02:00
201 lines
7.2 KiB
C
201 lines
7.2 KiB
C
/*
|
|
* UAE - The Un*x Amiga Emulator
|
|
*
|
|
* bsdsocket.library emulation
|
|
*
|
|
* Copyright 1997,98 Mathias Ortmann
|
|
*
|
|
*/
|
|
|
|
//#define TRACING_ENABLED
|
|
|
|
#ifdef TRACING_ENABLED
|
|
#define TRACE(x) do { write_log x; } while(0)
|
|
#else
|
|
#define TRACE(x)
|
|
#endif
|
|
|
|
extern int init_socket_layer (void);
|
|
extern void deinit_socket_layer (void);
|
|
|
|
/* inital size of per-process descriptor table (currently fixed) */
|
|
#define DEFAULT_DTABLE_SIZE 64
|
|
|
|
#define SCRATCHBUFSIZE 128
|
|
|
|
#define MAXPENDINGASYNC 512
|
|
|
|
#define MAXADDRLEN 256
|
|
|
|
/* allocated and maintained on a per-task basis */
|
|
struct socketbase {
|
|
struct socketbase *next;
|
|
struct socketbase *nextsig; /* queue for tasks to signal */
|
|
|
|
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 */
|
|
int *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 */
|
|
|
|
/* host-specific fields below */
|
|
#ifdef _WIN32
|
|
unsigned int sockAbort; /* for aborting WinSock2 select() (damn Microsoft) */
|
|
unsigned int sockAsync; /* for aborting WSBAsyncSelect() in window message handler */
|
|
int needAbort; /* abort flag */
|
|
void *hAsyncTask; /* async task handle */
|
|
void *hEvent; /* thread event handle */
|
|
unsigned int *mtable; /* window messages allocated for asynchronous event notification */
|
|
#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
|
|
} *socketbases;
|
|
|
|
|
|
#define LIBRARY_SIZEOF 36
|
|
|
|
struct UAEBSDBase {
|
|
char dummy[LIBRARY_SIZEOF];
|
|
struct socketbase *sb;
|
|
char 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
|
|
|
|
|
|
extern uae_u32 addstr (uae_u32 *, const char *);
|
|
extern uae_u32 addmem (uae_u32 *, const char *, int len);
|
|
|
|
extern char *strncpyah (char *, uae_u32, int);
|
|
extern char *strcpyah (char *, uae_u32);
|
|
extern uae_u32 strcpyha (uae_u32, const char *);
|
|
extern uae_u32 strncpyha (uae_u32, const char *, int);
|
|
|
|
#define SB struct socketbase *sb
|
|
|
|
#ifndef _WIN32
|
|
typedef int SOCKET;
|
|
#define INVALID_SOCKET -1
|
|
#endif
|
|
|
|
extern void bsdsocklib_seterrno (SB, int);
|
|
extern void bsdsocklib_setherrno (SB, int);
|
|
|
|
extern void sockmsg (unsigned int, unsigned long, unsigned long);
|
|
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);
|
|
|
|
#define BOOL int
|
|
extern BOOL checksd(SB, int sd);
|
|
extern void setsd(SB, int ,int );
|
|
extern int getsd (SB, int);
|
|
extern int getsock (SB, int);
|
|
extern void releasesock (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 (int);
|
|
|
|
extern int host_dup2socket (SB, int, int);
|
|
extern int host_socket (SB, int, int, int);
|
|
extern uae_u32 host_bind (SB, uae_u32, uae_u32, uae_u32);
|
|
extern uae_u32 host_listen (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_u32, uae_u32, uae_u32, uae_u32);
|
|
extern void host_recvfrom (TrapContext *, SB, uae_u32, uae_u32, 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 (SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32);
|
|
extern uae_u32 host_getsockname (SB, uae_u32, uae_u32, uae_u32);
|
|
extern uae_u32 host_getpeername (SB, uae_u32, uae_u32, uae_u32);
|
|
extern uae_u32 host_IoctlSocket (SB, uae_u32, uae_u32, uae_u32);
|
|
extern uae_u32 host_shutdown (SB, uae_u32, uae_u32);
|
|
extern int host_CloseSocket (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 *context, SB, uae_u32);
|
|
extern uae_u32 host_inet_addr (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 (uae_u32, uae_u32);
|
|
|
|
|
|
extern void bsdlib_install (void);
|
|
extern void bsdlib_reset (void);
|