Changeset 3205 for trunk/src


Ignore:
Timestamp:
Mar 23, 2000, 8:21:56 PM (25 years ago)
Author:
sandervl
Message:

wsock32\new update

Location:
trunk/src/wsock32
Files:
2 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wsock32/new/asyncapi.cpp

    r3198 r3205  
    1 /* $Id: asyncapi.cpp,v 1.1 2000-03-22 20:01:04 sandervl Exp $ */
     1/* $Id: asyncapi.cpp,v 1.2 2000-03-23 19:21:53 sandervl Exp $ */
    22
    33/*
     
    77 * Copyright (C) 2000 Sander van Leeuwen (sandervl@xs4all.nl)
    88 *
    9  * Based on Wine code: (dlls\winsock\async.c)
     9 * Parts based on Wine code: (dlls\winsock\async.c)
    1010 * (C) 1993,1994,1996,1997 John Brezak, Erik Bos, Alex Korobka.
    1111 * (C) 1999 Marcus Meissner
     
    1717#include <os2wrap.h>
    1818#include <stdio.h>
     19#include <stdlib.h>
    1920#include <string.h>
    2021#include <odin.h>
     
    152153                     (WPARAM)pThreadParm->hAsyncTaskHandle, lParam);
    153154   }
    154    RemoveFromQueue(pThreadParm);
    155155}
    156156//******************************************************************************
     
    161161{
    162162  PASYNCTHREADPARM pThreadParm;
    163   LHANDLE          hHost = 0;
    164   LPSTR            tempname;
    165   LPSTR            tempproto;
    166   LPSTR            tempaddr;
     163  LHANDLE          hAsyncRequest = 0;
     164  LPSTR            tempname  = 0;
     165  LPSTR            tempproto = 0;
     166  LPSTR            tempaddr  = 0;
    167167
    168168   if(!fWSAInitialized)
     
    193193                return 0;
    194194        }
     195        memset(pThreadParm, 0, sizeof(*pThreadParm));
    195196        pThreadParm->request= requesttype;
    196197        pThreadParm->hwnd   = hwnd;
     
    283284                break;
    284285        }
    285         return (LHANDLE)QueueAsyncJob(WSAsyncThreadProc, pThreadParm);
     286        hAsyncRequest = (LHANDLE)QueueAsyncJob(WSAsyncThreadProc, pThreadParm);
     287        if(hAsyncRequest == 0) {
     288                free(pThreadParm);
     289                if(tempname)    free(tempname);
     290                if(tempaddr)    free(tempaddr);
     291                if(tempproto)   free(tempproto);
     292
     293                dprintf(("WSAAsyncRequest: QueueAsyncJob failure!"));
     294                DebugInt3();
     295                WSASetLastError(WSAEFAULT);
     296                return 0;
     297        }
     298        return hAsyncRequest;
    286299   }
    287300   return 0;
     
    377390//******************************************************************************
    378391//******************************************************************************
     392void AsyncNotifyEvent(PASYNCTHREADPARM pThreadParm, ULONG event, ULONG socket_error)
     393{
     394   pThreadParm->u.asyncselect.lEventsPending &= ~event;
     395
     396   event = WSAMAKESELECTREPLY(event, socket_error);
     397
     398   PostMessageA(pThreadParm->hwnd, pThreadParm->msg, (WPARAM)pThreadParm->u.asyncselect.s,
     399               (LPARAM)event);
     400}
     401//******************************************************************************
     402#define  nr(i)          ((i != -1) ? 1 : 0)
     403#define  ready(i)       ((i != -1) && (sockets[i] != -1))
     404//******************************************************************************
     405void ASYNCCNV WSAsyncSelectThreadProc(void *pparm)
     406{
     407 PASYNCTHREADPARM pThreadParm = (PASYNCTHREADPARM)pparm;
     408 SOCKET           sockets[3];
     409 SOCKET           s = pThreadParm->u.asyncselect.s;
     410 int              noread, nowrite, noexcept, state, sockoptlen, sockoptval;
     411 int              tmp, i, lEventsPending, ret, bytesread;
     412 
     413   while(TRUE)
     414   {
     415asyncloopstart:
     416        i         = 0;
     417        noread    = nowrite = noexcept = -1;
     418
     419        //break if user cancelled request
     420        if(pThreadParm->u.asyncselect.lEvents == 0) {
     421                break;
     422        }
     423
     424        lEventsPending = pThreadParm->u.asyncselect.lEventsPending;
     425        //block if no events are pending
     426        if(lEventsPending == 0)
     427        {
     428                //wait for events to be enabled
     429                pThreadParm->u.asyncselect.asyncSem->wait();
     430                //reset event semaphore
     431                pThreadParm->u.asyncselect.asyncSem->reset();
     432                continue;
     433        }
     434
     435        if(lEventsPending & (FD_READ | FD_CLOSE | FD_ACCEPT)) {
     436                noread = i++;
     437                sockets[noread] = s;
     438        }
     439        if(lEventsPending & (FD_WRITE | FD_CONNECT)) {
     440                nowrite = i++;
     441                sockets[nowrite] = s;
     442        }
     443        if(lEventsPending & FD_OOB) {
     444                noexcept = i++;
     445                sockets[noexcept] = s;
     446        }
     447
     448        dprintf(("WSAsyncSelectThreadProc %x wrs=%d, rds=%d, oos =%d, pending = %x", pThreadParm->u.asyncselect.s, noread, nowrite, noexcept, lEventsPending));
     449
     450        ret = select((int *)sockets, nr(noread), nr(nowrite), nr(noexcept), -1);
     451        if(ret == SOCKET_ERROR) {
     452                int selecterr = sock_errno();
     453                switch(selecterr)
     454                {
     455                case SOCEINTR:
     456                        goto asyncloopstart;    //so_cancel was called
     457
     458                case SOCECONNRESET:
     459                case SOCEPIPE:
     460                        if(lEventsPending & FD_CLOSE)
     461                                AsyncNotifyEvent(pThreadParm, FD_CLOSE, WSAECONNRESET);
     462
     463                        //remote connection broken (so can't receive data anymore)
     464                        //but can still send
     465                        pThreadParm->u.asyncselect.lEventsPending &= ~(FD_READ | FD_ACCEPT);
     466                        goto asyncloopstart;
     467
     468                case SOCEINVAL:
     469                        if(lEventsPending & FD_CLOSE)
     470                                AsyncNotifyEvent(pThreadParm, FD_CLOSE, selecterr);
     471                        break;
     472                default:
     473                        dprintf(("WSAsyncSelectThreadProc: select SOCKET_ERROR %x", selecterr));
     474                        break; //something bad happened
     475                }
     476                break;
     477        }
     478
     479        if(ready(nowrite))
     480        {
     481                state = ioctl(s, FIOBSTATUS, (char *)&tmp, sizeof(tmp));
     482
     483                if(lEventsPending & FD_CONNECT) {
     484                        if(state & SS_ISCONNECTED) {
     485                                AsyncNotifyEvent(pThreadParm, FD_CONNECT, NO_ERROR);
     486                        }
     487                        else {
     488                                sockoptlen = sizeof(int);
     489
     490                                ret = getsockopt(s, SOL_SOCKET, SO_ERROR,
     491                                                 (char *) &sockoptval, &sockoptlen);
     492                                if(sockoptval == (WSAECONNREFUSED-WSABASEERR)) {
     493                                        AsyncNotifyEvent(pThreadParm, FD_CONNECT, WSAECONNREFUSED);
     494                                }
     495                        } 
     496                }
     497                else
     498                if(!(state & SS_CANTSENDMORE) && (lEventsPending & FD_WRITE)) {
     499                        AsyncNotifyEvent(pThreadParm, FD_WRITE, NO_ERROR);
     500                }
     501        }
     502
     503        if(ready(noread))
     504        {
     505                state = ioctl(s, FIONREAD, (CHAR *) &bytesread, sizeof(bytesread));
     506                if(state == SOCKET_ERROR) {
     507                        if(lEventsPending & FD_CLOSE)
     508                        {
     509                                AsyncNotifyEvent(pThreadParm, FD_CLOSE, NO_ERROR);
     510                                //remote connection broken (so can't receive data anymore)
     511                                //but can still send
     512                                pThreadParm->u.asyncselect.lEventsPending &= ~(FD_READ | FD_ACCEPT);
     513                                continue;
     514                        }
     515                        else {
     516                                dprintf(("WSAsyncSelectThreadProc: ioctl SOCKET_ERROR!"));
     517                                break; //todo: correct???
     518                        }
     519                }
     520                if(lEventsPending & FD_ACCEPT)
     521                {
     522                        sockoptlen = sizeof(sockoptlen);
     523
     524                        ret = getsockopt(s, SOL_SOCKET, SO_OPTIONS,
     525                                         (char *) &sockoptval, &sockoptlen);
     526                        if(ret == SOCKET_ERROR) {
     527                                dprintf(("WSAsyncSelectThreadProc: getsockopt SOCKET_ERROR!"));
     528                                break;
     529                        }
     530                        if((sockoptval & SO_ACCEPTCONN) == SO_ACCEPTCONN) {
     531                                AsyncNotifyEvent(pThreadParm, FD_ACCEPT, NO_ERROR);
     532                        }
     533                }
     534                if((lEventsPending & FD_READ) && bytesread > 0) {
     535                        AsyncNotifyEvent(pThreadParm, FD_READ, NO_ERROR);
     536                }
     537        }
     538        if(ready(noexcept))
     539        {
     540                if(lEventsPending & FD_OOB) {
     541                        AsyncNotifyEvent(pThreadParm, FD_OOB, NO_ERROR);
     542                }
     543        }
     544        if((pThreadParm->u.asyncselect.lEventsPending & (FD_ACCEPT|FD_CLOSE|FD_CONNECT)) ==
     545            (lEventsPending & (FD_ACCEPT|FD_CLOSE|FD_CONNECT))) {
     546                DosSleep(10);
     547        }
     548   }
     549   delete pThreadParm->u.asyncselect.asyncSem;
     550}
     551//******************************************************************************
     552//******************************************************************************
    379553ODINFUNCTION4(int,WSAAsyncSelect,
    380554              SOCKET,s,
     
    383557              long,lEvent)
    384558{
    385   return SOCKET_ERROR;
    386 }
    387 //******************************************************************************
    388 //******************************************************************************
     559  PASYNCTHREADPARM pThreadParm;
     560  int              nonblock = 1;
     561  int              ret;
     562
     563   if(!fWSAInitialized)
     564   {
     565        WSASetLastError(WSANOTINITIALISED);
     566        return SOCKET_ERROR;
     567   }
     568   else
     569   if(WSAIsBlocking())
     570   {
     571        WSASetLastError(WSAEINPROGRESS);        // blocking call in progress
     572        return SOCKET_ERROR;
     573   }
     574   else
     575   if(hWnd && !IsWindow(hWnd))
     576   {
     577        WSASetLastError(WSAEINVAL);             // invalid parameter
     578        return SOCKET_ERROR;
     579   }
     580   //Set socket to non-blocking mode
     581   ret = ioctl(s, FIONBIO, (char *) &nonblock, sizeof(nonblock));
     582   if(ret == SOCKET_ERROR) {
     583        WSASetLastError(wsaErrno());
     584        return SOCKET_ERROR;
     585   }
     586   if(FindAndSetAsyncEvent(s, hWnd, wMsg, lEvent) == TRUE) {
     587        //found and changed active async event
     588        WSASetLastError(NO_ERROR);
     589        return NO_ERROR;
     590   }
     591   pThreadParm = (PASYNCTHREADPARM)malloc(sizeof(ASYNCTHREADPARM));
     592   if(pThreadParm == NULL) {
     593        dprintf(("WSAAsyncSelect: malloc failure!"));
     594        DebugInt3();
     595        WSASetLastError(WSAEFAULT);
     596        return SOCKET_ERROR;
     597   }
     598   memset(pThreadParm, 0, sizeof(*pThreadParm));
     599   pThreadParm->request= ASYNC_SELECT;
     600   pThreadParm->hwnd   = hWnd;
     601   pThreadParm->msg    = wMsg;
     602   pThreadParm->u.asyncselect.lEvents        = lEvent;
     603   pThreadParm->u.asyncselect.lEventsPending = lEvent;
     604   pThreadParm->u.asyncselect.s              = s;
     605   pThreadParm->u.asyncselect.asyncSem       = new VSemaphore;
     606   if(pThreadParm->u.asyncselect.asyncSem == NULL) {
     607        dprintf(("WSAAsyncSelect: VSemaphore alloc failure!"));
     608        DebugInt3();
     609        WSASetLastError(WSAEFAULT);
     610        return SOCKET_ERROR;
     611   }
     612   if(QueueAsyncJob(WSAsyncSelectThreadProc, pThreadParm) == 0) {
     613        delete pThreadParm->u.asyncselect.asyncSem;
     614        free(pThreadParm);
     615        dprintf(("WSAAsyncSelect: QueueAsyncJob failure!"));
     616        DebugInt3();
     617        WSASetLastError(WSAEFAULT);
     618        return SOCKET_ERROR;
     619   }
     620   WSASetLastError(NO_ERROR);
     621   return NO_ERROR;
     622}
     623//******************************************************************************
     624//******************************************************************************
  • trunk/src/wsock32/new/asyncthread.cpp

    r3198 r3205  
    1 /* $Id: asyncthread.cpp,v 1.1 2000-03-22 20:01:04 sandervl Exp $ */
     1/* $Id: asyncthread.cpp,v 1.2 2000-03-23 19:21:53 sandervl Exp $ */
    22
    33/*
     
    66 * Copyright 2000 Sander van Leeuwen (sandervl@xs4all.nl)
    77 *
    8  *
    9  * Not everything is thread safe
     8 * TODO: Not everything is 100% thread safe  (i.e. async parameter updates)
    109 *
    1110 * Project Odin Software License can be found in LICENSE.TXT
     11 *
    1212 */
    1313#define INCL_BASE
    1414#include <os2wrap.h>
    1515#include <os2sel.h>
     16#include <stdlib.h>
    1617#include <wprocess.h>
    1718#include <win32api.h>
     
    3536  pThreadParm->asyncProc((PVOID)arg);
    3637
    37   WSASetBlocking(TRUE, pThreadParm->hThread);
     38//only for blocking hooks (currently not implemented
     39////  if(pThreadParm->request == ASYNC_BLOCKHOOK)
     40////    WSASetBlocking(FALSE, pThreadParm->hThread);
     41
     42  pThreadParm->fActive = FALSE;
     43  RemoveFromQueue(pThreadParm);
     44  free((PVOID)pThreadParm);
    3845
    3946  DosExit(EXIT_THREAD, 0);
     
    4148//******************************************************************************
    4249//******************************************************************************
    43 ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm)
     50ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm, BOOL fSetBlocking)
    4451{
    4552 APIRET rc;
     
    5562   AddToQueue(pThreadParm);
    5663
    57    WSASetBlocking(TRUE);
     64   if(fSetBlocking) WSASetBlocking(TRUE);
    5865
    5966   rc = DosCreateThread(&tid, AsyncThread, (ULONG)pThreadParm, CREATE_READY, 16384);
     
    6168   {
    6269        dprintf(("QueueAsyncJob: DosCreateThread failed with error %x", rc));
    63         WSASetBlocking(FALSE);
     70        if(fSetBlocking) WSASetBlocking(FALSE);
    6471        RemoveFromQueue(pThreadParm);
    6572        WSASetLastError(WSAEFAULT);
     
    8390void RemoveFromQueue(PASYNCTHREADPARM pThreadParm)
    8491{
    85  PASYNCTHREADPARM parm;
    86 
    87    asyncThreadMutex.enter();
    88    parm = threadList;
    89 
    90    if(parm == pThreadParm) {
     92 PASYNCTHREADPARM pThreadInfo;
     93
     94   asyncThreadMutex.enter();
     95   pThreadInfo = threadList;
     96
     97   if(pThreadInfo == pThreadParm) {
    9198        threadList = pThreadParm->next;
    9299   }
    93100   else {
    94         while(parm->next) {
    95                 if(parm->next == pThreadParm) {
    96                         parm->next = pThreadParm->next;
     101        while(pThreadInfo->next) {
     102                if(pThreadInfo->next == pThreadParm) {
     103                        pThreadInfo->next = pThreadParm->next;
    97104                        break;
    98105                }
    99                 parm = parm->next;
    100         }
    101         if(parm == NULL) {
     106                pThreadInfo = pThreadInfo->next;
     107        }
     108        if(pThreadInfo == NULL) {
    102109                dprintf(("RemoveFromQueue: parm %x not found!!", pThreadParm));
    103110                DebugInt3();
     
    111118int WIN32API WSACancelAsyncRequest(LHANDLE hAsyncTaskHandle)
    112119{
    113  PASYNCTHREADPARM parm;
     120 PASYNCTHREADPARM pThreadInfo;
    114121 BOOL             found = FALSE;
    115122
    116123   dprintf(("WSACancelAsyncRequest: cancel task %x", hAsyncTaskHandle));
    117124   asyncThreadMutex.enter();
    118    parm = threadList;
    119 
    120    while(parm) {
    121         if(parm->hAsyncTaskHandle == hAsyncTaskHandle) {
    122                 parm->fCancelled = TRUE;
     125   pThreadInfo = threadList;
     126
     127   while(pThreadInfo) {
     128        if(pThreadInfo->hAsyncTaskHandle == hAsyncTaskHandle) {
     129                pThreadInfo->fCancelled = TRUE;
    123130                found = TRUE;
    124131                break;
    125132        }
    126         parm = parm->next;
     133        pThreadInfo = pThreadInfo->next;
    127134   }
    128135   asyncThreadMutex.leave();
     
    134141}
    135142//******************************************************************************
     143//Only to cancel blocking hooks
     144//******************************************************************************
     145int WIN32API WSACancelBlockingCall()
     146{
     147 HANDLE hThread = GetCurrentThread();
     148
     149   dprintf(("WSACancelBlockingCall"));
     150#if 0
     151   asyncThreadMutex.enter();
     152   pThreadInfo = threadList;
     153
     154   while(pThreadInfo) {
     155        if(pThreadInfo->hThread == hThread) {
     156                pThreadInfo->fCancelled = TRUE;
     157
     158                if(pThreadInfo->request == ASYNC_BLOCKHOOK) {
     159                        ret = so_cancel(pThreadInfo->blockedsocket);
     160                }
     161
     162                found = TRUE;
     163                break;
     164        }
     165        pThreadInfo = pThreadInfo->next;
     166   }
     167   asyncThreadMutex.leave();
     168#endif
     169   return SOCKET_ERROR;
     170}
     171//******************************************************************************
     172//Assumes caller owns async thread mutex!
     173//******************************************************************************
     174static PASYNCTHREADPARM FindAsyncEvent(SOCKET s)
     175{
     176 PASYNCTHREADPARM pThreadInfo;
     177
     178   pThreadInfo = threadList;
     179   while(pThreadInfo) {
     180        if(pThreadInfo->u.asyncselect.s == s) {
     181                return pThreadInfo;
     182        }
     183        pThreadInfo = pThreadInfo->next;
     184   }
     185   return NULL;
     186}
     187//******************************************************************************
     188//******************************************************************************
     189BOOL FindAndSetAsyncEvent(SOCKET s, HWND hwnd, int msg, ULONG lEvent)
     190{
     191 PASYNCTHREADPARM pThreadInfo;
     192 
     193   asyncThreadMutex.enter();
     194   pThreadInfo = FindAsyncEvent(s);
     195   if(pThreadInfo) {
     196        pThreadInfo->u.asyncselect.lEvents = lEvent;
     197        pThreadInfo->hwnd                  = hwnd;
     198        pThreadInfo->msg                   = msg;
     199        //cancel pending select in async select thread (if any)
     200        so_cancel(s);
     201
     202        //unblock async thread if it was waiting
     203        pThreadInfo->u.asyncselect.asyncSem->post();
     204   }
     205   asyncThreadMutex.leave();
     206   return(pThreadInfo != NULL);
     207}
     208//******************************************************************************
    136209//******************************************************************************
    137210void EnableAsyncEvent(SOCKET s, ULONG flags)
    138211{
     212 PASYNCTHREADPARM pThreadInfo;
     213
     214   asyncThreadMutex.enter();
     215   pThreadInfo = FindAsyncEvent(s);
     216   if(pThreadInfo) {
     217        pThreadInfo->u.asyncselect.lEventsPending |= (pThreadInfo->u.asyncselect.lEvents & flags);
     218        //cancel pending select in async select thread (if any)
     219        so_cancel(s);
     220
     221        //unblock async thread if it was waiting
     222        pThreadInfo->u.asyncselect.asyncSem->post();
     223   }
     224   asyncThreadMutex.leave();
    139225}
    140226//******************************************************************************
     
    142228BOOL QueryAsyncEvent(SOCKET s, HWND *pHwnd, int *pMsg, ULONG *plEvent)
    143229{
    144    return FALSE;
    145 }
    146 //******************************************************************************
    147 //******************************************************************************
     230 PASYNCTHREADPARM pThreadInfo;
     231
     232   asyncThreadMutex.enter();
     233   pThreadInfo = FindAsyncEvent(s);
     234   if(pThreadInfo) {
     235        *pHwnd   = pThreadInfo->hwnd;
     236        *pMsg    = pThreadInfo->msg;
     237        *plEvent = pThreadInfo->u.asyncselect.lEvents;
     238   }
     239   asyncThreadMutex.leave();
     240   return(pThreadInfo != NULL);
     241}
     242//******************************************************************************
     243//******************************************************************************
  • trunk/src/wsock32/new/asyncthread.h

    r3198 r3205  
    1 /* $Id: asyncthread.h,v 1.1 2000-03-22 20:01:04 sandervl Exp $ */
     1/* $Id: asyncthread.h,v 1.2 2000-03-23 19:21:54 sandervl Exp $ */
    22
    33/*
     
    1212
    1313#include <vmutex.h>
     14#include <vsemaphore.h>
    1415
    1516#define ASYNCCNV        _Optlink
     
    2324  ASYNC_GETPROTOBYNUMBER,
    2425  ASYNC_GETSERVBYNAME,
    25   ASYNC_GETSERVBYPORT
     26  ASYNC_GETSERVBYPORT,
     27  ASYNC_SELECT
    2628} ;
    2729
     
    6264                        LPSTR   proto;
    6365                } getservbyport;
     66                struct {
     67                        VSemaphore *asyncSem;
     68                        DWORD       lEvents;
     69                        DWORD       lEventsPending;
     70                        SOCKET      s;
     71                } asyncselect;
    6472        } u;
    6573        _ASYNCTHREADPARM *next;
    6674} ASYNCTHREADPARM, *PASYNCTHREADPARM;
    6775
    68 ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm);
     76ULONG QueueAsyncJob(ASYNCTHREADPROC asyncproc, PASYNCTHREADPARM pThreadParm, BOOL fSetBlocking = FALSE);
    6977void  RemoveFromQueue(PASYNCTHREADPARM pThreadParm);
    7078
    7179void  EnableAsyncEvent(SOCKET s, ULONG flags);
    7280BOOL  QueryAsyncEvent(SOCKET s, HWND *pHwnd, int *pMsg, ULONG *plEvent);
     81BOOL  FindAndSetAsyncEvent(SOCKET s, HWND hwnd, int msg, ULONG lEvent);
    7382
    7483#endif  //__ASYNCTHREAD_H__
  • trunk/src/wsock32/new/wsa.cpp

    r3198 r3205  
    1 /* $Id: wsa.cpp,v 1.1 2000-03-22 20:01:07 sandervl Exp $ */
     1/* $Id: wsa.cpp,v 1.2 2000-03-23 19:21:54 sandervl Exp $ */
    22
    33/*
     
    3232ODINDEBUGCHANNEL(WSOCK32-WSA)
    3333
     34#ifndef winsockcleanupsockets
     35// Exported by SO32DLL.  Used to close all open sockets.
     36void _System winsockcleanupsockets(void);
     37#endif
     38
    3439static void WSASetBlocking(BOOL fBlock);
    3540
     
    5358    if (!lpWSAData) return WSAEINVAL;
    5459
    55     pwsi = WINSOCK_GetIData();
    56     if( pwsi == NULL )
     60    if(fWSAInitialized == FALSE)
    5761    {
    5862        WINSOCK_CreateIData();
    5963        pwsi = WINSOCK_GetIData();
    60         if (!pwsi) return WSASYSNOTREADY;
    61     }
     64
     65        sock_init();
     66    }
     67    else pwsi = WINSOCK_GetIData();
     68
     69    if (!pwsi) return WSASYSNOTREADY;
     70
    6271    pwsi->num_startup++;
    6372    fWSAInitialized = TRUE;
     
    7584    if( pwsi ) {
    7685        if( --pwsi->num_startup > 0 ) return 0;
     86
     87        winsockcleanupsockets();
    7788
    7889        fWSAInitialized = FALSE;
     
    103114//TODO: Implement this
    104115//******************************************************************************
    105 ODINFUNCTION0(int,WSACancelBlockingCall)
    106 {
    107   LPWSINFO pwsi = WINSOCK_GetIData();
    108 
    109   if( pwsi ) return 0;
    110   return SOCKET_ERROR;
    111 }
    112 //******************************************************************************
    113 //******************************************************************************
    114116ODINFUNCTION0(int,WSAUnhookBlockingHook)
    115117{
     
    126128//******************************************************************************
    127129//******************************************************************************
    128 ODINFUNCTION0(BOOL,WSAIsBlocking)
     130BOOL WIN32API WSAIsBlocking()
    129131{
    130132    LPWSINFO pwsi = WINSOCK_GetIData();
  • trunk/src/wsock32/new/wsock32.cpp

    r3198 r3205  
    1 /* $Id: wsock32.cpp,v 1.16 2000-03-22 20:01:08 sandervl Exp $ */
     1/* $Id: wsock32.cpp,v 1.17 2000-03-23 19:21:54 sandervl Exp $ */
    22
    33/*
     
    9494        goto tryagain;
    9595    }
    96     else {
     96    if(iData == NULL) {
    9797        dprintf(("WINSOCK_GetIData: couldn't find struct for thread %x", tid));
    9898        DebugInt3();// should never happen!!!!!!!
     
    145145//******************************************************************************
    146146//******************************************************************************
    147 ODINPROCEDURE1(WSASetLastError,
    148                int,iError)
     147void WIN32API WSASetLastError(int iError)
    149148{
    150149  // according to the docs, WSASetLastError() is just a call-through
    151150  // to SetLastError()
     151  if(iError) {
     152        dprintf(("WSASetLastError %x", iError));
     153  }
    152154  SetLastError(iError);
    153155}
    154156//******************************************************************************
    155157//******************************************************************************
    156 ODINFUNCTION0(int,WSAGetLastError)
     158int WIN32API WSAGetLastError()
    157159{
    158160  return GetLastError();
     
    232234
    233235   //Close WSAAsyncSelect thread if one was created for this socket
    234    EnableAsyncEvent(s, 0L);
     236   WSAAsyncSelect(s, 0, 0, 0);
    235237   
    236238   if(ret == SOCKET_ERROR) {
     
    291293        return SOCKET_ERROR;
    292294   }
     295   // clear high word (not used in OS/2's tcpip stack)
     296   cmd = LOUSHORT(cmd);
     297
    293298   if(cmd != FIONBIO && cmd != FIONREAD && cmd != SIOCATMARK) {
    294299        WSASetLastError(WSAEINVAL);
     
    317322        }
    318323   }
    319    // clear high word (not used in OS/2's tcpip stack)
    320    ret = ioctl(s, LOUSHORT(cmd), (char *)argp, sizeof(int));
     324   ret = ioctl(s, cmd, (char *)argp, sizeof(int));
    321325
    322326   // Map EOPNOTSUPP to EINVAL
     
    878882                break;
    879883        default:
     884                dprintf(("setsockopt: unknown option %x", optname));
    880885                WSASetLastError(WSAENOPROTOOPT);
    881886                return SOCKET_ERROR;
     
    892897        }
    893898        else {
     899                dprintf(("setsockopt: unknown option %x", optname));
    894900                WSASetLastError(WSAENOPROTOOPT);
    895901                return SOCKET_ERROR;
     
    974980                break;
    975981        default:
     982                dprintf(("getsockopt: unknown option %x", optname));
    976983                WSASetLastError(WSAENOPROTOOPT);
    977984                return SOCKET_ERROR;
     
    988995        }
    989996        else {
     997                dprintf(("getsockopt: unknown option %x", optname));
    990998                WSASetLastError(WSAENOPROTOOPT);
    991999                return SOCKET_ERROR;
  • trunk/src/wsock32/new/wsock32.h

    r3198 r3205  
    1 /* $Id: wsock32.h,v 1.4 2000-03-22 20:01:09 sandervl Exp $ */
     1/* $Id: wsock32.h,v 1.5 2000-03-23 19:21:55 sandervl Exp $ */
    22
    33/* WSOCK32.H--definitions & conversions for Odin's wsock32.dll.
     
    2424#include <sys\time.h>
    2525
     26#include <odinwrap.h>
     27
    2628/*
    2729 * Socket state bits.
     
    4547//socketopt options
    4648#define SO_DONTLINGER   (u_int)(~SO_LINGER)
     49
     50#define WSAMAKESELECTREPLY(event,error)     MAKELONG(event,error)
    4751
    4852// WSAAsyncSelect flags
     
    216220void WIN32API WSASetLastError(int iError);
    217221int  WIN32API WSAGetLastError(void);
     222int  WIN32API WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);
    218223BOOL WIN32API WSAIsBlocking(void);
    219 int  WIN32API WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);
    220224
    221225extern BOOL fWSAInitialized;
Note: See TracChangeset for help on using the changeset viewer.