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