#include "mmsystem.h"
#include "win32.h"
-static HWND hSockWnd;
-static LRESULT CALLBACK SocketWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
+static int hWndSelector = 0; /* Set this to zero to get hSockWnd */
+
+#define MAX_SELECT_THREADS 64
+#define MAX_GET_THREADS 64
+
+struct selt {
+ HANDLE hThreads[MAX_SELECT_THREADS];
+ struct threadargsw *threadargsw[MAX_SELECT_THREADS];
+ HANDLE hEvents[MAX_SELECT_THREADS];
+};
+
+struct gett {
+ HANDLE hGetThreads[MAX_GET_THREADS];
+ struct threadargs *threadGetargs[MAX_GET_THREADS];
+ int threadGetargs_inuse[MAX_GET_THREADS];
+ HANDLE hGetEvents[MAX_GET_THREADS];
+};
+
+struct pendingasync {
+ struct socketbase *asyncsb[MAXPENDINGASYNC];
+ SOCKET asyncsock[MAXPENDINGASYNC];
+ uae_u32 asyncsd[MAXPENDINGASYNC];
+ int asyncindex;
+};
+
+struct bsdsockdata {
+ HWND hSockWnd;
+ HANDLE hSockThread;
+ HANDLE hSockReq;
+ HANDLE hSockReqHandled;
+ CRITICAL_SECTION csSigQueueLock;
+ CRITICAL_SECTION SockThreadCS;
+ DWORD threadid;
+ WSADATA wsbData;
+
+ struct selt *st;
+ struct gett *gt;
+ struct pendingasync *as;
+};
+
+static struct bsdsockdata *bsd;
+
+static unsigned int __stdcall sock_thread(void *);
+
extern HWND hAmigaWnd;
-static int hWndSelector = 0; /* Set this to zero to get hSockWnd */
-static CRITICAL_SECTION csSigQueueLock;
-static DWORD threadid;
-#define THREAD(func,arg) (HANDLE)_beginthreadex(NULL, 0, func, arg, 0, &threadid)
+#define THREAD(func,arg) (HANDLE)_beginthreadex(NULL, 0, func, arg, 0, &bsd->threadid)
#define THREADEND(result) _endthreadex(result)
#define SETERRNO bsdsocklib_seterrno(sb, WSAGetLastError() - WSABASEERR)
#define FIOSETOWN _IOW('f', 124, long) /* set owner (struct Task *) */
#define FIOGETOWN _IOR('f', 123, long) /* get owner (struct Task *) */
-#define BEGINBLOCKING if (sb->ftable[sd-1] & SF_BLOCKING) sb->ftable[sd - 1] |= SF_BLOCKINGINPROGRESS
-#define ENDBLOCKING sb->ftable[sd-1] &= ~SF_BLOCKINGINPROGRESS
+#define BEGINBLOCKING if (sb->ftable[sd - 1] & SF_BLOCKING) sb->ftable[sd - 1] |= SF_BLOCKINGINPROGRESS
+#define ENDBLOCKING sb->ftable[sd - 1] &= ~SF_BLOCKINGINPROGRESS
-static WSADATA wsbData;
+static LRESULT CALLBACK SocketWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
static int PASCAL WSAEventSelect(SOCKET,HANDLE,long);
-#define MAX_SELECT_THREADS 64
-static HANDLE hThreads[MAX_SELECT_THREADS];
-static struct threadargsw *threadargsw[MAX_SELECT_THREADS];
-static HANDLE hEvents[MAX_SELECT_THREADS];
-
-#define MAX_GET_THREADS 64
-static HANDLE hGetThreads[MAX_GET_THREADS];
-
struct threadargs {
struct socketbase *sb;
uae_u32 args1;
uae_u32 timeout;
};
-static struct threadargs *threadGetargs[MAX_GET_THREADS];
-static int threadGetargs_inuse[MAX_GET_THREADS];
-static HANDLE hGetEvents[MAX_GET_THREADS];
-
-static HANDLE hSockThread;
-static HANDLE hSockReq, hSockReqHandled;
-static unsigned int __stdcall sock_thread(void *);
-
-static CRITICAL_SECTION SockThreadCS;
-#define PREPARE_THREAD EnterCriticalSection(&SockThreadCS)
-#define TRIGGER_THREAD { SetEvent(hSockReq); WaitForSingleObject(hSockReqHandled, INFINITE); LeaveCriticalSection(&SockThreadCS); }
+#define PREPARE_THREAD EnterCriticalSection(&bsd->SockThreadCS)
+#define TRIGGER_THREAD { SetEvent(bsd->hSockReq); WaitForSingleObject(bsd->hSockReqHandled, INFINITE); LeaveCriticalSection(&bsd->SockThreadCS); }
#define SOCKVER_MAJOR 2
#define SOCKVER_MINOR 2
SOCKET dummy;
DWORD lasterror;
- if (WSAStartup(MAKEWORD(SOCKVER_MAJOR, SOCKVER_MINOR), &wsbData)) {
+ if (!bsd) {
+ bsd = calloc (sizeof (struct bsdsockdata), 1);
+ bsd->st = calloc (sizeof (struct selt), 1);
+ bsd->gt = calloc (sizeof (struct gett), 1);
+ bsd->as = calloc (sizeof (struct pendingasync), 1);
+ }
+ if (WSAStartup(MAKEWORD(SOCKVER_MAJOR, SOCKVER_MINOR), &bsd->wsbData)) {
lasterror = WSAGetLastError();
-
if(lasterror == WSAVERNOTSUPPORTED) {
char szMessage[MAX_DPATH];
WIN32GUI_LoadUIString(IDS_WSOCK2NEEDED, szMessage, MAX_DPATH);
return 0;
}
- if (LOBYTE (wsbData.wVersion) != SOCKVER_MAJOR || HIBYTE (wsbData.wVersion) != SOCKVER_MINOR) {
+ if (LOBYTE (bsd->wsbData.wVersion) != SOCKVER_MAJOR || HIBYTE (bsd->wsbData.wVersion) != SOCKVER_MINOR) {
char szMessage[MAX_DPATH];
WIN32GUI_LoadUIString(IDS_WSOCK2NEEDED, szMessage, MAX_DPATH);
gui_message(szMessage);
return 0;
} else {
- write_log("BSDSOCK: using %s\n", wsbData.szDescription);
+ write_log("BSDSOCK: using %s\n", bsd->wsbData.szDescription);
// make sure WSP/NSPStartup gets called from within the regular stack
// (Windows 95/98 need this)
if((dummy = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) != INVALID_SOCKET) {
if (currprefs.socket_emu) {
if((result = mySockStartup())) {
- InitializeCriticalSection(&csSigQueueLock);
+ InitializeCriticalSection(&bsd->csSigQueueLock);
- if(hSockThread == NULL) {
+ if(bsd->hSockThread == NULL) {
WNDCLASS wc; // Set up an invisible window and dummy wndproc
- InitializeCriticalSection(&SockThreadCS);
- hSockReq = CreateEvent(NULL, FALSE, FALSE, NULL);
- hSockReqHandled = CreateEvent(NULL, FALSE, FALSE, NULL);
+ InitializeCriticalSection(&bsd->SockThreadCS);
+ bsd->hSockReq = CreateEvent(NULL, FALSE, FALSE, NULL);
+ bsd->hSockReqHandled = CreateEvent(NULL, FALSE, FALSE, NULL);
wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW;
wc.lpfnWndProc = SocketWindowProc;
wc.lpszMenuName = 0;
wc.lpszClassName = "SocketFun";
if(RegisterClass(&wc)) {
- hSockWnd = CreateWindowEx (0,
+ bsd->hSockWnd = CreateWindowEx (0,
"SocketFun", "WinUAE Socket Window",
WS_POPUP,
0, 0,
1, 1,
NULL, NULL, 0, NULL);
- hSockThread = THREAD(sock_thread, NULL);
+ bsd->hSockThread = THREAD(sock_thread, NULL);
}
}
}
if (currprefs.socket_emu) {
WSACleanup();
if(socket_layer_initialized) {
- DeleteCriticalSection(&csSigQueueLock);
- if(hSockThread) {
- DeleteCriticalSection(&SockThreadCS);
- CloseHandle(hSockReq);
- hSockReq = NULL;
- CloseHandle(hSockReqHandled);
- WaitForSingleObject(hSockThread, INFINITE);
- CloseHandle(hSockThread);
+ DeleteCriticalSection(&bsd->csSigQueueLock);
+ if(bsd->hSockThread) {
+ DeleteCriticalSection(&bsd->SockThreadCS);
+ CloseHandle(bsd->hSockReq);
+ bsd->hSockReq = NULL;
+ CloseHandle(bsd->hSockReqHandled);
+ WaitForSingleObject(bsd->hSockThread, INFINITE);
+ CloseHandle(bsd->hSockThread);
}
for (i = 0; i < MAX_SELECT_THREADS; i++) {
- if (hThreads[i]) {
- CloseHandle(hThreads[i]);
- hThreads[i] = NULL;
+ if (bsd->st->hThreads[i]) {
+ CloseHandle(bsd->st->hThreads[i]);
+ bsd->st->hThreads[i] = NULL;
}
}
}
void locksigqueue(void)
{
- EnterCriticalSection(&csSigQueueLock);
+ EnterCriticalSection(&bsd->csSigQueueLock);
}
void unlocksigqueue(void)
{
- LeaveCriticalSection(&csSigQueueLock);
+ LeaveCriticalSection(&bsd->csSigQueueLock);
}
// Asynchronous completion notification
// Blocking sockets with asynchronous event notification are currently not safe to use.
-static struct socketbase *asyncsb[MAXPENDINGASYNC];
-static SOCKET asyncsock[MAXPENDINGASYNC];
-static uae_u32 asyncsd[MAXPENDINGASYNC];
-static int asyncindex;
-
int host_sbinit(TrapContext *context, SB)
{
sb->sockAbort = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
{
int i;
- for (i = 0; i < MAXPENDINGASYNC; i++) if (asyncsb[i] == sb) asyncsb[i] = NULL;
+ for (i = 0; i < MAXPENDINGASYNC; i++) {
+ if (bsd->as->asyncsb[i] == sb)
+ bsd->as->asyncsb[i] = NULL;
+ }
- if (sb->hEvent != NULL) CloseHandle(sb->hEvent);
+ if (sb->hEvent != NULL)
+ CloseHandle(sb->hEvent);
for (i = sb->dtablesize; i--; ) {
- if (sb->dtable[i] != INVALID_SOCKET) host_closesocketquick(sb->dtable[i]);
+ if (sb->dtable[i] != INVALID_SOCKET)
+ host_closesocketquick(sb->dtable[i]);
- if (sb->mtable[i]) asyncsb[(sb->mtable[i] - 0xb000) / 2] = NULL;
+ if (sb->mtable[i])
+ bsd->as->asyncsb[(sb->mtable[i] - 0xb000) / 2] = NULL;
}
shutdown(sb->sockAbort,1);
void host_sbreset(void)
{
- memset(asyncsb, 0, sizeof asyncsb);
- memset(asyncsock, 0, sizeof asyncsock);
- memset(asyncsd, 0, sizeof asyncsd);
- memset(threadargsw, 0, sizeof threadargsw);
+ int i;
+ for (i = 0; i < MAXPENDINGASYNC; i++) {
+ bsd->as->asyncsb[i] = 0;
+ bsd->as->asyncsock[i] = 0;
+ bsd->as->asyncsd[i] = 0;
+ }
+ for (i = 0; i < MAX_GET_THREADS; i++) {
+ bsd->st->threadargsw[i] = 0;
+ }
}
void sockmsg(unsigned int msg, WPARAM wParam, LPARAM lParam)
int sdi;
index = (msg-0xb000)/2;
- sb = asyncsb[index];
+ sb = bsd->as->asyncsb[index];
if (!(msg & 1))
{
// is this one really for us?
- if ((SOCKET)wParam != asyncsock[index])
+ if ((SOCKET)wParam != bsd->as->asyncsock[index])
{
// cancel socket event
- WSAAsyncSelect((SOCKET)wParam, hWndSelector ? hAmigaWnd : hSockWnd, 0, 0);
+ WSAAsyncSelect((SOCKET)wParam, hWndSelector ? hAmigaWnd : bsd->hSockWnd, 0, 0);
return;
}
- sdi = asyncsd[index] - 1;
+ sdi = bsd->as->asyncsd[index] - 1;
// asynchronous socket event?
if (sb && !(sb->ftable[sdi] & SF_BLOCKINGINPROGRESS) && sb->mtable[sdi])
{
- asyncsb[index] = NULL;
+ bsd->as->asyncsb[index] = NULL;
if (WSAGETASYNCERROR(lParam))
{
int i;
locksigqueue();
- for (i = asyncindex+1; i != asyncindex; i++) {
+ for (i = bsd->as->asyncindex+1; i != bsd->as->asyncindex; i++) {
if (i == MAXPENDINGASYNC)
i = 0;
- if (!asyncsb[i]) {
- asyncsb[i] = sb;
- if (++asyncindex == MAXPENDINGASYNC) asyncindex = 0;
+ if (!bsd->as->asyncsb[i]) {
+ bsd->as->asyncsb[i] = sb;
+ if (++bsd->as->asyncindex == MAXPENDINGASYNC)
+ bsd->as->asyncindex = 0;
unlocksigqueue();
if (s == INVALID_SOCKET) {
- return i*2+0xb001;
+ return i * 2 + 0xb001;
} else {
- asyncsd[i] = sd;
- asyncsock[i] = s;
- return i * 2+0xb000;
+ bsd->as->asyncsd[i] = sd;
+ bsd->as->asyncsock[i] = s;
+ return i * 2 + 0xb000;
}
}
}
wMsg = (wMsg-0xb000)/2;
- sb = asyncsb[wMsg];
+ sb = bsd->as->asyncsb[wMsg];
if (sb != NULL) {
- asyncsb[wMsg] = NULL;
+ bsd->as->asyncsb[wMsg] = NULL;
CANCELSIGNAL;
}
}
wsbevents |= FD_CLOSE;
wsbevents |= lEvent;
i = (sb->mtable[sd-1]-0xb000)/2;
- asyncsb[i] = sb;
- asyncsd[i] = sd;
- asyncsock[i] = s;
- WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : hSockWnd,sb->mtable[sd-1],wsbevents);
+ bsd->as->asyncsb[i] = sb;
+ bsd->as->asyncsd[i] = sd;
+ bsd->as->asyncsock[i] = s;
+ WSAAsyncSelect(s, hWndSelector ? hAmigaWnd : bsd->hSockWnd, sb->mtable[sd-1], wsbevents);
unlocksigqueue();
}
if (s2 == INVALID_SOCKET) {
SETERRNO;
- if (sb->ftable[sd-1] & SF_BLOCKING && sb->sb_errno == WSAEWOULDBLOCK-WSABASEERR) {
+ if (sb->ftable[sd-1] & SF_BLOCKING && sb->sb_errno == WSAEWOULDBLOCK - WSABASEERR) {
if (sb->mtable[sd-1] || (wMsg = allocasyncmsg(sb,sd,s)) != 0) {
if (sb->mtable[sd-1] == 0) {
- WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : hSockWnd,wMsg,FD_ACCEPT);
+ WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : bsd->hSockWnd, wMsg, FD_ACCEPT);
} else {
setWSAAsyncSelect(sb,sd,s,FD_ACCEPT);
}
BOOL quit = FALSE;
SB = NULL;
BOOL handled = TRUE;
- if (hSockReq) {
+ if (bsd->hSockReq) {
// 100ms sleepiness might need some tuning...
//if(WaitForSingleObject( hSockReq, 100 ) == WAIT_OBJECT_0 )
{
SETERRNO;
}
}
- SetEvent( hSockReqHandled );
+ SetEvent(bsd->hSockReqHandled);
}
} else {
quit = TRUE;
HANDLE WaitHandle;
MSG msg;
- if(hSockWnd) {
+ if(bsd->hSockWnd) {
// Make sure we're outrunning the wolves
int pri = THREAD_PRIORITY_ABOVE_NORMAL;
if (!os_winnt) {
SetThreadPriority(GetCurrentThread(), pri);
while(TRUE) {
- if(hSockReq) {
+ if(bsd->hSockReq) {
DWORD wait;
- WaitHandle = hSockReq;
+ WaitHandle = bsd->hSockReq;
wait = MsgWaitForMultipleObjects (1, &WaitHandle, FALSE,INFINITE, QS_POSTMESSAGE);
if (wait == WAIT_OBJECT_0) {
if(HandleStuff()) // See if its time to quit...
}
if (wait == WAIT_OBJECT_0 +1) {
Sleep(10);
- while( PeekMessage(&msg, NULL, WM_USER, 0xB000+MAXPENDINGASYNC*2, PM_REMOVE) > 0) {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
+ while(PeekMessage(&msg, NULL, WM_USER, 0xB000 + MAXPENDINGASYNC * 2, PM_REMOVE) > 0) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
}
}
}
if (namelen <= MAXADDRLEN) {
if (sb->mtable[sd-1] || (wMsg = allocasyncmsg(sb,sd,s)) != 0) {
if (sb->mtable[sd-1] == 0) {
- WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : hSockWnd,wMsg,FD_CONNECT);
+ WSAAsyncSelect(s, hWndSelector ? hAmigaWnd : bsd->hSockWnd, wMsg, FD_CONNECT);
} else {
- setWSAAsyncSelect(sb,sd,s,FD_CONNECT);
+ setWSAAsyncSelect(sb, sd, s, FD_CONNECT);
}
BEGINBLOCKING;
if (sb->mtable[sd-1] || (wMsg = allocasyncmsg(sb,sd,s)) != 0) {
if (sb->mtable[sd-1] == 0) {
- WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : hSockWnd,wMsg,FD_WRITE);
+ WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : bsd->hSockWnd,wMsg,FD_WRITE);
} else {
setWSAAsyncSelect(sb,sd,s,FD_WRITE);
}
{
if (sb->mtable[sd-1] || (wMsg = allocasyncmsg(sb,sd,s)) != 0) {
if (sb->mtable[sd-1] == 0) {
- WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : hSockWnd,wMsg,FD_READ|FD_CLOSE);
+ WSAAsyncSelect(s, hWndSelector ? hAmigaWnd : bsd->hSockWnd, wMsg, FD_READ|FD_CLOSE);
} else {
- setWSAAsyncSelect(sb,sd,s,FD_READ|FD_CLOSE);
+ setWSAAsyncSelect(sb, sd, s, FD_READ|FD_CLOSE);
}
WAITSIGNAL;
if (sb->mtable[sd-1] == 0) {
cancelasyncmsg(context, wMsg);
} else {
- setWSAAsyncSelect(sb,sd,s,0);
+ setWSAAsyncSelect(sb, sd, s, 0);
}
if (sb->eintr) {
wsbevents |= FD_CLOSE;
if (sb->mtable[sd-1] || (sb->mtable[sd-1] = allocasyncmsg(sb,sd,s))) {
- WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : hSockWnd,sb->mtable[sd-1],wsbevents);
+ WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : bsd->hSockWnd,sb->mtable[sd-1],wsbevents);
sb->resultval = 0;
} else
sb->resultval = -1;
TRACE(("[FIOASYNC] -> enabled\n"));
if (sb->mtable[sd-1] || (sb->mtable[sd-1] = allocasyncmsg(sb,sd,s))) {
- WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : hSockWnd,sb->mtable[sd-1],FD_ACCEPT | FD_CONNECT | FD_OOB | FD_READ | FD_WRITE | FD_CLOSE);
+ WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : bsd-> hSockWnd, sb->mtable[sd-1],
+ FD_ACCEPT | FD_CONNECT | FD_OOB | FD_READ | FD_WRITE | FD_CLOSE);
success = 0;
break;
}
if (s != INVALID_SOCKET) {
if (sb->mtable[sd-1]) {
- asyncsb[(sb->mtable[sd-1]-0xb000)/2] = NULL;
+ bsd->as->asyncsb[(sb->mtable[sd-1]-0xb000)/2] = NULL;
sb->mtable[sd-1] = 0;
}
break;
if ((wMsg = allocasyncmsg(sb,sd,s)) != 0) {
- WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : hSockWnd,wMsg,FD_CLOSE);
+ WSAAsyncSelect(s,hWndSelector ? hAmigaWnd : bsd->hSockWnd,wMsg,FD_CLOSE);
WAITSIGNAL;
SB;
for (;;) {
- WaitForSingleObject(hEvents[index],INFINITE);
+ WaitForSingleObject(bsd->st->hEvents[index],INFINITE);
- if ((args = threadargsw[index]) != NULL) {
+ if ((args = bsd->st->threadargsw[index]) != NULL) {
sb = args->sb;
nfds = args->nfds;
readfds = args->readfds;
SETSIGNAL;
- threadargsw[index] = NULL;
+ bsd->st->threadargsw[index] = NULL;
SetEvent(sb->hEvent);
}
}
sb->needAbort = 1;
for (i = 0; i < MAX_SELECT_THREADS; i++) {
- if (hThreads[i] && !threadargsw[i])
+ if (bsd->st->hThreads[i] && !bsd->st->threadargsw[i])
break;
}
if (i >= MAX_SELECT_THREADS) {
for (i = 0; i < MAX_SELECT_THREADS; i++) {
- if (!hThreads[i]) {
- hEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
- hThreads[i] = THREAD(thread_WaitSelect,&i);
- if (hEvents[i] == NULL || hThreads[i] == NULL) {
- hThreads[i] = 0;
+ if (!bsd->st->hThreads[i]) {
+ bsd->st->hEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
+ bsd->st->hThreads[i] = THREAD(thread_WaitSelect,&i);
+ if (bsd->st->hEvents[i] == NULL || bsd->st->hThreads[i] == NULL) {
+ bsd->st->hThreads[i] = 0;
write_log("BSDSOCK: ERROR - Thread/Event creation failed - error code: %d\n",
GetLastError());
bsdsocklib_seterrno(sb,12); // ENOMEM
return;
}
// this should improve responsiveness
- SetThreadPriority(hThreads[i],THREAD_PRIORITY_TIME_CRITICAL);
+ SetThreadPriority(bsd->st->hThreads[i], THREAD_PRIORITY_TIME_CRITICAL);
break;
}
}
taw.exceptfds = exceptfds;
taw.timeout = timeout;
- threadargsw[i] = &taw;
+ bsd->st->threadargsw[i] = &taw;
- SetEvent(hEvents[i]);
+ SetEvent(bsd->st->hEvents[i]);
m68k_dreg(&context->regs,0) = (((uae_u32)1)<<sb->signal)|sb->eintrsigs|wssigs;
sigs = CallLib(context, get_long(4),-0x13e); // Wait()
SB;
for (;;) {
- WaitForSingleObject(hGetEvents[index], INFINITE);
- if (threadGetargs_inuse[index] == -1) {
- threadGetargs_inuse[index] = 0;
- threadGetargs[index] = NULL;
+ WaitForSingleObject(bsd->gt->hGetEvents[index], INFINITE);
+ if (bsd->gt->threadGetargs_inuse[index] == -1) {
+ bsd->gt->threadGetargs_inuse[index] = 0;
+ bsd->gt->threadGetargs[index] = NULL;
}
- if ((args = threadGetargs[index]) != NULL) {
+ if ((args = bsd->gt->threadGetargs[index]) != NULL) {
sb = args->sb;
if (args->args1 == 0) {
// gethostbyname or gethostbyaddr
} else {
host = gethostbyaddr(name_rp,namelen,addrtype);
}
- if (threadGetargs_inuse[index] != -1) {
+ if (bsd->gt->threadGetargs_inuse[index] != -1) {
// No CTRL-C Signal
if (host == 0) {
// Error occured
buf = args->args5;
name_rp = get_real_address(name);
proto = getprotobyname (name_rp);
- if (threadGetargs_inuse[index] != -1) { // No CTRL-C Signal
+ if (bsd->gt->threadGetargs_inuse[index] != -1) { // No CTRL-C Signal
if (proto == 0) {
// Error occured
SETERRNO;
name_rp = get_real_address(nameport);
serv = getservbyname(name_rp,proto_rp);
}
- if (threadGetargs_inuse[index] != -1) {
+ if (bsd->gt->threadGetargs_inuse[index] != -1) {
// No CTRL-C Signal
if (serv == 0) {
// Error occured
TRACE(("-> "));
- if (threadGetargs_inuse[index] != -1)
+ if (bsd->gt->threadGetargs_inuse[index] != -1)
SETSIGNAL;
- threadGetargs_inuse[index] = 0;
- threadGetargs[index] = NULL;
+ bsd->gt->threadGetargs_inuse[index] = 0;
+ bsd->gt->threadGetargs[index] = NULL;
}
}
args.args5 = buf;
for (i = 0; i < MAX_GET_THREADS; i++) {
- if (threadGetargs_inuse[i] == -1) {
- threadGetargs_inuse[i] = 0;
- threadGetargs[i] = NULL;
+ if (bsd->gt->threadGetargs_inuse[i] == -1) {
+ bsd->gt->threadGetargs_inuse[i] = 0;
+ bsd->gt->threadGetargs[i] = NULL;
}
- if (hGetThreads[i] && !threadGetargs_inuse[i]) break;
+ if (bsd->gt->hGetThreads[i] && !bsd->gt->threadGetargs_inuse[i]) break;
}
if (i >= MAX_GET_THREADS) {
for (i = 0; i < MAX_GET_THREADS; i++) {
- if (hGetThreads[i] == NULL) {
- hGetEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
- hGetThreads[i] = THREAD(thread_get, &i);
- if (hGetEvents[i] == NULL || hGetThreads[i] == NULL) {
- hGetThreads[i] = NULL;
+ if (bsd->gt->hGetThreads[i] == NULL) {
+ bsd->gt->hGetEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
+ bsd->gt->hGetThreads[i] = THREAD(thread_get, &i);
+ if (bsd->gt->hGetEvents[i] == NULL || bsd->gt->hGetThreads[i] == NULL) {
+ bsd->gt->hGetThreads[i] = NULL;
write_log("BSDSOCK: ERROR - Thread/Event creation failed - error code: %d\n",
GetLastError());
- bsdsocklib_seterrno(sb,12); // ENOMEM
+ bsdsocklib_seterrno(sb, 12); // ENOMEM
sb->resultval = -1;
return;
}
if (i >= MAX_GET_THREADS)
write_log("BSDSOCK: ERROR - Too many gethostbyname()s\n");
else {
- bsdsetpriority (hGetThreads[i]);
- threadGetargs[i] = &args;
- threadGetargs_inuse[i] = 1;
+ bsdsetpriority (bsd->gt->hGetThreads[i]);
+ bsd->gt->threadGetargs[i] = &args;
+ bsd->gt->threadGetargs_inuse[i] = 1;
- SetEvent(hGetEvents[i]);
+ SetEvent(bsd->gt->hGetEvents[i]);
}
sb->eintr = 0;
- while ( threadGetargs_inuse[i] != 0 && sb->eintr == 0) {
+ while (bsd->gt->threadGetargs_inuse[i] != 0 && sb->eintr == 0) {
WAITSIGNAL;
if (sb->eintr == 1)
- threadGetargs_inuse[i] = -1;
+ bsd->gt->threadGetargs_inuse[i] = -1;
}
CANCELSIGNAL;
args.args5 = buf;
for (i = 0; i < MAX_GET_THREADS; i++) {
- if (threadGetargs_inuse[i] == -1) {
- threadGetargs_inuse[i] = 0;
- threadGetargs[i] = NULL;
+ if (bsd->gt->threadGetargs_inuse[i] == -1) {
+ bsd->gt->threadGetargs_inuse[i] = 0;
+ bsd->gt->threadGetargs[i] = NULL;
}
- if (hGetThreads[i] && !threadGetargs_inuse[i]) break;
+ if (bsd->gt->hGetThreads[i] && !bsd->gt->threadGetargs_inuse[i]) break;
}
if (i >= MAX_GET_THREADS) {
for (i = 0; i < MAX_GET_THREADS; i++) {
- if (!hGetThreads[i]) {
- hEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
- hGetThreads[i] = THREAD(thread_get,&i);
- if (hGetEvents[i] == NULL || hGetThreads[i] == NULL) {
- hGetThreads[i] = 0;
- write_log("BSDSOCK: ERROR - Thread/Event creation failed - error code: %d\n",GetLastError());
- bsdsocklib_seterrno(sb,12); // ENOMEM
+ if (!bsd->gt->hGetThreads[i]) {
+ bsd->st->hEvents[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
+ bsd->gt->hGetThreads[i] = THREAD(thread_get, &i);
+ if (bsd->gt->hGetEvents[i] == NULL || bsd->gt->hGetThreads[i] == NULL) {
+ bsd->gt->hGetThreads[i] = 0;
+ write_log("BSDSOCK: ERROR - Thread/Event creation failed - error code: %d\n", GetLastError());
+ bsdsocklib_seterrno(sb, 12); // ENOMEM
sb->resultval = -1;
return;
}
if (i >= MAX_GET_THREADS)
write_log("BSDSOCK: ERROR - Too many getprotobyname()s\n");
else {
- bsdsetpriority (hGetThreads[i]);
+ bsdsetpriority (bsd->gt->hGetThreads[i]);
- threadGetargs[i] = &args;
- threadGetargs_inuse[i] = 1;
+ bsd->gt->threadGetargs[i] = &args;
+ bsd->gt->threadGetargs_inuse[i] = 1;
- SetEvent(hGetEvents[i]);
+ SetEvent(bsd->gt->hGetEvents[i]);
}
sb->eintr = 0;
- while ( threadGetargs_inuse[i] != 0 && sb->eintr == 0) {
+ while (bsd->gt->threadGetargs_inuse[i] != 0 && sb->eintr == 0) {
WAITSIGNAL;
if (sb->eintr == 1)
- threadGetargs_inuse[i] = -1;
+ bsd->gt->threadGetargs_inuse[i] = -1;
}
CANCELSIGNAL;
put_long(sb->protoent+8,p->p_proto);
for (i = 0; i < numaliases; i++)
- put_long(sb->protoent+12+i*4,addstr(&aptr,p->p_aliases[i]));
- put_long(sb->protoent+12+numaliases*4,0);
- put_long(sb->protoent,aptr);
- addstr(&aptr,p->p_name);
- TRACE(("OK (%s, %d)\n",p->p_name,p->p_proto));
+ put_long(sb->protoent + 12 + i * 4, addstr(&aptr, p->p_aliases[i]));
+ put_long(sb->protoent + 12 + numaliases * 4,0);
+ put_long(sb->protoent, aptr);
+ addstr(&aptr, p->p_name);
+ TRACE(("OK (%s, %d)\n", p->p_name, p->p_proto));
bsdsocklib_seterrno(sb,0);
} else {
- TRACE(("failed (%d)\n",sb->sb_errno));
+ TRACE(("failed (%d)\n", sb->sb_errno));
}
}
args.args5 = buf;
for (i = 0; i < MAX_GET_THREADS; i++) {
- if (threadGetargs_inuse[i] == -1) {
- threadGetargs_inuse[i] = 0;
- threadGetargs[i] = NULL;
+ if (bsd->gt->threadGetargs_inuse[i] == -1) {
+ bsd->gt->threadGetargs_inuse[i] = 0;
+ bsd->gt->threadGetargs[i] = NULL;
}
- if (hGetThreads[i] && !threadGetargs_inuse[i]) break;
+ if (bsd->gt->hGetThreads[i] && !bsd->gt->threadGetargs_inuse[i]) break;
}
if (i >= MAX_GET_THREADS) {
for (i = 0; i < MAX_GET_THREADS; i++) {
- if (!hGetThreads[i]) {
- hGetEvents[i] = CreateEvent(NULL,FALSE,FALSE,NULL);
- hGetThreads[i] = THREAD(thread_get,&i);
- if (hGetEvents[i] == NULL || hGetThreads[i] == NULL) {
- hGetThreads[i] = 0;
+ if (!bsd->gt->hGetThreads[i]) {
+ bsd->gt->hGetEvents[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
+ bsd->gt->hGetThreads[i] = THREAD(thread_get, &i);
+ if (bsd->gt->hGetEvents[i] == NULL || bsd->gt->hGetThreads[i] == NULL) {
+ bsd->gt->hGetThreads[i] = 0;
write_log("BSDSOCK: ERROR - Thread/Event creation failed - error code: %d\n",GetLastError());
- bsdsocklib_seterrno(sb,12); // ENOMEM
+ bsdsocklib_seterrno(sb, 12); // ENOMEM
sb->resultval = -1;
return;
}
if (i >= MAX_GET_THREADS)
write_log("BSDSOCK: ERROR - Too many getprotobyname()s\n");
else {
- bsdsetpriority (hGetThreads[i]);
+ bsdsetpriority (bsd->gt->hGetThreads[i]);
- threadGetargs[i] = &args;
- threadGetargs_inuse[i] = 1;
+ bsd->gt->threadGetargs[i] = &args;
+ bsd->gt->threadGetargs_inuse[i] = 1;
- SetEvent(hGetEvents[i]);
+ SetEvent(bsd->gt->hGetEvents[i]);
}
sb->eintr = 0;
- while ( threadGetargs_inuse[i] != 0 && sb->eintr == 0) {
+ while (bsd->gt->threadGetargs_inuse[i] != 0 && sb->eintr == 0) {
WAITSIGNAL;
if (sb->eintr == 1)
- threadGetargs_inuse[i] = -1;
+ bsd->gt->threadGetargs_inuse[i] = -1;
}
CANCELSIGNAL;
if (!sb->servent) {
write_log("BSDSOCK: WARNING - getservby%s() ran out of Amiga memory (couldn't allocate %ld bytes)\n",type ? "port" : "name",size);
- bsdsocklib_seterrno(sb,12); // ENOMEM
+ bsdsocklib_seterrno(sb, 12); // ENOMEM
return;
}
sb->serventsize = size;
- aptr = sb->servent+20+numaliases*4;
+ aptr = sb->servent + 20 + numaliases * 4;
// transfer servent to Amiga memory
- put_long(sb->servent+4,sb->servent+16);
- put_long(sb->servent+8,(unsigned short)htons(s->s_port));
+ put_long(sb->servent + 4, sb->servent + 16);
+ put_long(sb->servent + 8, (unsigned short)htons(s->s_port));
for (i = 0; i < numaliases; i++)
- put_long(sb->servent+16+i*4,addstr(&aptr,s->s_aliases[i]));
- put_long(sb->servent+16+numaliases*4,0);
- put_long(sb->servent,aptr);
- addstr(&aptr,s->s_name);
- put_long(sb->servent+12,aptr);
- addstr(&aptr,s->s_proto);
-
- TRACE(("OK (%s, %d)\n",s->s_name,(unsigned short)htons(s->s_port)));
- bsdsocklib_seterrno(sb,0);
+ put_long(sb->servent + 16 + i * 4,addstr(&aptr,s->s_aliases[i]));
+ put_long(sb->servent + 16 + numaliases * 4,0);
+ put_long(sb->servent, aptr);
+ addstr(&aptr, s->s_name);
+ put_long(sb->servent + 12, aptr);
+ addstr(&aptr, s->s_proto);
+
+ TRACE(("OK (%s, %d)\n", s->s_name, (unsigned short)htons(s->s_port)));
+ bsdsocklib_seterrno(sb, 0);
} else {
TRACE(("failed (%d)\n",sb->sb_errno));