1 /* 2 * UAE - The Un*x Amiga Emulator 3 * 4 * bsdsocket.library emulation 5 * 6 * Copyright 1997,98 Mathias Ortmann 7 * 8 */ 9 10 #ifndef UAE_BSDSOCKET_H 11 #define UAE_BSDSOCKET_H 12 13 #include "uae/types.h" 14 #ifdef FSUAE 15 #include "traps.h" 16 #include "threaddep/thread.h" 17 #endif 18 19 #define BSD_TRACING_ENABLED 0 20 21 extern int log_bsd; 22 23 #define ISBSDTRACE (log_bsd || BSD_TRACING_ENABLED) 24 #define BSDTRACE(x) do { if (ISBSDTRACE) { write_log x; } } while(0) 25 26 extern int init_socket_layer (void); 27 extern void deinit_socket_layer (void); 28 29 /* inital size of per-process descriptor table (currently fixed) */ 30 #define DEFAULT_DTABLE_SIZE 64 31 32 #define SCRATCHBUFSIZE 128 33 34 #define MAXPENDINGASYNC 512 35 36 #define MAXADDRLEN 256 37 38 #ifdef _WIN32 39 #define SOCKET_TYPE SOCKET 40 #else 41 #define SOCKET_TYPE int 42 #endif 43 44 /* allocated and maintained on a per-task basis */ 45 struct socketbase { 46 struct socketbase *next; 47 struct socketbase *nextsig; /* queue for tasks to signal */ 48 49 uaecptr sysbase; 50 int dosignal; /* signal flag */ 51 uae_u32 ownertask; /* task that opened the library */ 52 int signal; /* signal allocated for that task */ 53 int sb_errno, sb_herrno; /* errno and herrno variables */ 54 uae_u32 errnoptr, herrnoptr; /* pointers */ 55 uae_u32 errnosize, herrnosize; /* pinter sizes */ 56 int dtablesize; /* current descriptor/flag etc. table size */ 57 SOCKET_TYPE *dtable; /* socket descriptor table */ 58 int *ftable; /* socket flags */ 59 int resultval; 60 uae_u32 hostent; /* pointer to the current hostent structure (Amiga mem) */ 61 uae_u32 hostentsize; 62 uae_u32 protoent; /* pointer to the current protoent structure (Amiga mem) */ 63 uae_u32 protoentsize; 64 uae_u32 servent; /* pointer to the current servent structure (Amiga mem) */ 65 uae_u32 serventsize; 66 uae_u32 sigstosend; 67 uae_u32 eventsigs; /* EVENT sigmask */ 68 uae_u32 eintrsigs; /* EINTR sigmask */ 69 int eintr; /* interrupted by eintrsigs? */ 70 int eventindex; /* current socket looked at by GetSocketEvents() to prevent starvation */ 71 uae_u32 logstat; 72 uae_u32 logptr; 73 uae_u32 logmask; 74 uae_u32 logfacility; 75 uaecptr fdcallback; 76 77 unsigned int *mtable; /* window messages allocated for asynchronous event notification */ 78 /* host-specific fields below */ 79 #ifdef _WIN32 80 SOCKET_TYPE sockAbort; /* for aborting WinSock2 select() (damn Microsoft) */ 81 SOCKET_TYPE sockAsync; /* for aborting WSBAsyncSelect() in window message handler */ 82 int needAbort; /* abort flag */ 83 void *hAsyncTask; /* async task handle */ 84 void *hEvent; /* thread event handle */ 85 #else 86 uae_sem_t sem; /* semaphore to notify the socket thread of work */ 87 uae_thread_id thread; /* socket thread */ 88 int sockabort[2]; /* pipe used to tell the thread to abort a select */ 89 int action; 90 int s; /* for accept */ 91 uae_u32 name; /* For gethostbyname */ 92 uae_u32 a_addr; /* gethostbyaddr, accept */ 93 uae_u32 a_addrlen; /* for gethostbyaddr, accept */ 94 uae_u32 flags; 95 void *buf; 96 uae_u32 len; 97 uae_u32 to, tolen, from, fromlen; 98 int nfds; 99 uae_u32 sets [3]; 100 uae_u32 timeout; 101 uae_u32 sigmp; 102 #endif 103 #ifdef FSUAE 104 TrapContext *context; 105 #endif 106 }; 107 108 #define LIBRARY_SIZEOF 36 109 110 struct UAEBSDBase { 111 uae_u8 dummy[LIBRARY_SIZEOF]; 112 struct socketbase *sb; 113 uae_u8 scratchbuf[SCRATCHBUFSIZE]; 114 }; 115 116 /* socket flags */ 117 /* socket events to report */ 118 #define REP_ACCEPT 0x01 /* there is a connection to accept() */ 119 #define REP_CONNECT 0x02 /* connect() completed */ 120 #define REP_OOB 0x04 /* socket has out-of-band data */ 121 #define REP_READ 0x08 /* socket is readable */ 122 #define REP_WRITE 0x10 /* socket is writeable */ 123 #define REP_ERROR 0x20 /* asynchronous error on socket */ 124 #define REP_CLOSE 0x40 /* connection closed (graceful or not) */ 125 #define REP_ALL 0x7f 126 /* socket events that occurred */ 127 #define SET_ACCEPT 0x0100 /* there is a connection to accept() */ 128 #define SET_CONNECT 0x0200 /* connect() completed */ 129 #define SET_OOB 0x0400 /* socket has out-of-band data */ 130 #define SET_READ 0x0800 /* socket is readable */ 131 #define SET_WRITE 0x1000 /* socket is writeable */ 132 #define SET_ERROR 0x2000 /* asynchronous error on socket */ 133 #define SET_CLOSE 0x4000 /* connection closed (graceful or not) */ 134 #define SET_ALL 0x7f00 135 /* socket properties */ 136 #define SF_BLOCKING 0x80000000 137 #define SF_BLOCKINGINPROGRESS 0x40000000 138 /* STBC_FDCALLBACK */ 139 #define FDCB_FREE 0 140 #define FDCB_ALLOC 1 141 #define FDCB_CHECK 2 142 143 uae_u32 addstr (uae_u32 * dst, const TCHAR *src); 144 uae_u32 addstr_ansi (uae_u32 * dst, const uae_char *src); 145 uae_u32 strncpyha (uae_u32 dst, const uae_char *src, int size); 146 uae_u32 addmem (uae_u32 * dst, const uae_char *src, int len); 147 148 #define SB struct socketbase *sb 149 150 extern void bsdsocklib_seterrno (SB, int); 151 extern void bsdsocklib_setherrno (SB, int); 152 153 extern void sockabort (SB); 154 155 extern void addtosigqueue (SB, int); 156 extern void removefromsigqueue (SB); 157 extern void sigsockettasks (void); 158 extern void locksigqueue (void); 159 extern void unlocksigqueue (void); 160 161 extern bool checksd(TrapContext*, SB, int sd); 162 extern void setsd(TrapContext*, SB, int , SOCKET_TYPE); 163 extern int getsd (TrapContext*, SB, SOCKET_TYPE); 164 extern SOCKET_TYPE getsock (SB, int); 165 extern void releasesock (TrapContext*, SB, int); 166 167 extern void waitsig (TrapContext *context, SB); 168 extern void cancelsig (TrapContext *context, SB); 169 170 extern int host_sbinit (TrapContext*, SB); 171 extern void host_sbcleanup (SB); 172 extern void host_sbreset (void); 173 extern void host_closesocketquick (SOCKET_TYPE); 174 175 extern int host_dup2socket (TrapContext *, SB, int, int); 176 extern int host_socket (TrapContext *, SB, int, int, int); 177 extern uae_u32 host_bind (TrapContext *, SB, uae_u32, uae_u32, uae_u32); 178 extern uae_u32 host_listen (TrapContext *, SB, uae_u32, uae_u32); 179 extern void host_accept (TrapContext *, SB, uae_u32, uae_u32, uae_u32); 180 extern void host_sendto (TrapContext *, SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32); 181 extern void host_recvfrom (TrapContext *, SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32); 182 extern uae_u32 host_shutdown (SB, uae_u32, uae_u32); 183 extern void host_setsockopt (SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32); 184 extern uae_u32 host_getsockopt (SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32); 185 extern uae_u32 host_getsockname (SB, uae_u32, uae_u32, uae_u32); 186 extern uae_u32 host_getpeername (SB, uae_u32, uae_u32, uae_u32); 187 extern uae_u32 host_IoctlSocket (TrapContext *, SB, uae_u32, uae_u32, uae_u32); 188 extern uae_u32 host_shutdown (SB, uae_u32, uae_u32); 189 extern int host_CloseSocket (TrapContext *, SB, int); 190 extern void host_connect (TrapContext *, SB, uae_u32, uae_u32, uae_u32); 191 extern void host_WaitSelect (TrapContext *, SB, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32, uae_u32); 192 extern uae_u32 host_SetSocketSignals (void); 193 extern uae_u32 host_getdtablesize (void); 194 extern uae_u32 host_ObtainSocket (void); 195 extern uae_u32 host_ReleaseSocket (void); 196 extern uae_u32 host_ReleaseCopyOfSocket (void); 197 extern uae_u32 host_Inet_NtoA (TrapContext *context, SB, uae_u32); 198 extern uae_u32 host_inet_addr (uae_u32); 199 extern uae_u32 host_Inet_LnaOf (void); 200 extern uae_u32 host_Inet_NetOf (void); 201 extern uae_u32 host_Inet_MakeAddr (void); 202 extern uae_u32 host_inet_network (void); 203 extern void host_gethostbynameaddr (TrapContext *, SB, uae_u32, uae_u32, long); 204 extern uae_u32 host_getnetbyname (void); 205 extern uae_u32 host_getnetbyaddr (void); 206 extern void host_getservbynameport (TrapContext *, SB, uae_u32, uae_u32, uae_u32); 207 extern void host_getprotobyname (TrapContext *, SB, uae_u32); 208 extern void host_getprotobynumber (TrapContext *, SB, uae_u32); 209 extern uae_u32 host_vsyslog (void); 210 extern uae_u32 host_Dup2Socket (void); 211 extern uae_u32 host_gethostname (uae_u32, uae_u32); 212 extern uae_u32 callfdcallback (TrapContext *context, SB, uae_u32 fd, uae_u32 action); 213 214 extern uaecptr bsdlib_startup (uaecptr); 215 extern void bsdlib_install (void); 216 extern void bsdlib_reset (void); 217 218 void bsdsock_fake_int_handler(void); 219 220 extern int volatile bsd_int_requested; 221 222 #endif /* UAE_BSDSOCKET_H */ 223