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