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