Changeset 3199 for trunk/src


Ignore:
Timestamp:
Mar 22, 2000, 9:07:30 PM (25 years ago)
Author:
sandervl
Message:

put back old wsock32

Location:
trunk/src/wsock32
Files:
2 added
5 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wsock32/dbglocal.cpp

    r3195 r3199  
    1 /* $Id: dbglocal.cpp,v 1.2 2000-03-22 18:46:15 sandervl Exp $ */
     1/* $Id: dbglocal.cpp,v 1.3 2000-03-22 20:07:20 sandervl Exp $ */
    22
    33/*
     
    2020{
    2121"initterm",
    22 "wsastruct",
     22"relaywin",
    2323"wsock32",
    2424"unknown",
    2525"async",
    26 "asyncthread",
    27 "wsa"
     26"asyncthread"
    2827};
    2928//******************************************************************************
  • trunk/src/wsock32/dbglocal.h

    r3195 r3199  
    1 /* $Id: dbglocal.h,v 1.2 2000-03-22 18:46:16 sandervl Exp $ */
     1/* $Id: dbglocal.h,v 1.3 2000-03-22 20:07:21 sandervl Exp $ */
    22
    33/*
     
    2020
    2121#define DBG_initterm       0
    22 #define DBG_wsastruct      1
     22#define DBG_relaywin       1
    2323#define DBG_wsock32        2
    2424#define DBG_unknown        3
    2525#define DBG_async          4
    2626#define DBG_asyncthread    5
    27 #define DBG_wsa            6
    28 #define DBG_MAXFILES       7
     27#define DBG_MAXFILES       6
    2928
    3029extern USHORT DbgEnabled[DBG_MAXFILES];
  • trunk/src/wsock32/makefile

    r3195 r3199  
    1 # $Id: makefile,v 1.23 2000-03-22 18:46:16 sandervl Exp $
     1# $Id: makefile,v 1.24 2000-03-22 20:07:22 sandervl Exp $
    22
    33#
     
    2626$(OBJDIR)\wsock32.obj \
    2727$(OBJDIR)\unknown.obj \
    28 $(OBJDIR)\wsa.obj \
    29 $(OBJDIR)\wsastruct.obj \
     28$(OBJDIR)\relaywin.obj \
    3029$(OBJDIR)\wsock32rsrc.obj \
    3130$(OBJDIR)\initterm.obj \
    32 $(OBJDIR)\asyncapi.obj \
    33 $(OBJDIR)\asyncthread.obj \
     31#$(OBJDIR)\async.obj \
     32#$(OBJDIR)\asyncthread.obj \
    3433$(OBJDIR)\dbglocal.obj
    3534
     
    3736# Target name - name of the dll without extention and path.
    3837TARGET = wsock32
    39 
    40 CXXFLAGS = $(CXXFLAGS) -DNEW_ASYNC
    4138
    4239
     
    6461$(OBJS)
    6562$(TARGET).def
    66 tcp32dll.lib so32dll.lib
     63pmwsock.lib
    6764$(PDWIN32_LIB)\kernel32.lib
    6865$(PDWIN32_LIB)/user32.lib
  • trunk/src/wsock32/unknown.cpp

    r3195 r3199  
    1 /* $Id: unknown.cpp,v 1.5 2000-03-22 18:46:18 sandervl Exp $ */
     1/* $Id: unknown.cpp,v 1.6 2000-03-22 20:07:25 sandervl Exp $ */
    22
    33/*
     
    1515#include <misc.h>
    1616#include <odinwrap.h>
    17 #include "wsock32.h"
    1817
    1918#define DBG_LOCALLOG    DBG_unknown
     
    2120
    2221ODINDEBUGCHANNEL(WSOCK32-UNKNOWN)
     22
     23/*****************************************************************************
     24 * Prototypes & Types & Defines                                              *
     25 *****************************************************************************/
     26
     27typedef int SOCKET;
     28
     29int _System rexec(char **, int, char *, char *, char *, int *);
     30int _System rcmd (char **, int, const char *, const char *, const char *, int *);
     31
    2332
    2433/*****************************************************************************
     
    98107 *****************************************************************************/
    99108
    100 ODINFUNCTION4(int, WSARecvEx, SOCKET,    s,
     109ODINFUNCTION4(int, OS2WSARecvEx, SOCKET,    s,
    101110                                 char FAR*, buf,
    102111                                 int,       len,
  • trunk/src/wsock32/wsock32.cpp

    r3195 r3199  
    1 /* $Id: wsock32.cpp,v 1.22 2000-03-22 18:46:19 sandervl Exp $ */
     1/* $Id: wsock32.cpp,v 1.23 2000-03-22 20:07:28 sandervl Exp $ */
    22
    33/*
     
    88 *
    99 * Copyright (C) 1999 Patrick Haller <phaller@gmx.net>
    10  * Copyright (C) 2000 Sander van Leeuwen (sandervl@xs4all.nl)
    11  *
    12  * Some parts based on Wine code: (dlls\winsock\socket.c)
    13  * (C) 1993,1994,1996,1997 John Brezak, Erik Bos, Alex Korobka.
    1410 *
    1511 */
     
    2117 *            -> open issue: WSASetLastError / WSAGetLastError
    2218 *               call SetLastError / GetLastError according to docs
    23  *
    24  * 2000/22/03 Complete rewrite -> got rid of pmwsock
    2519 *
    2620 * identical structures:
     
    4438 *****************************************************************************/
    4539
    46 #define INCL_BASE
    47 #include <os2wrap.h>    //Odin32 OS/2 api wrappers
    48 
    49 #include <string.h>
     40#include <pmwsock.h>
     41#include <odin.h>
    5042#include <odinwrap.h>
    5143#include <os2sel.h>
     44#include <misc.h>
     45#include <wprocess.h>
     46#include <heapstring.h>
     47#include <win32wnd.h>
    5248#include <stdlib.h>
    5349#include <win32api.h>
    54 #include <win32wnd.h>
    55 #include <wprocess.h>
    56 #include <misc.h>
    5750
    5851#include "wsock32.h"
    59 #include "wsastruct.h"
    60 #include "asyncthread.h"
    61 
     52#include "relaywin.h"
    6253#define DBG_LOCALLOG    DBG_wsock32
    6354#include "dbglocal.h"
     
    7162 *****************************************************************************/
    7263
    73 static LPWSINFO lpFirstIData = NULL;
    74 
    75 //******************************************************************************
    76 //******************************************************************************
    77 LPWSINFO WINSOCK_GetIData(HANDLE tid)
    78 {
    79     LPWSINFO iData;
    80     BOOL     fCurrentThread = FALSE;
    81 
    82     if(tid == CURRENT_THREAD) {
    83         tid = GetCurrentThread();
    84         fCurrentThread = TRUE;
     64#define ERROR_SUCCESS 0
     65
     66
     67static WSOCKTHREADDATA wstdFallthru; // for emergency only
     68
     69static HWND hwndRelay = NULL; // handle to our relay window
     70
     71BOOL fWSAInitialized = FALSE;
     72
     73/*****************************************************************************
     74 * Prototypes                                                                *
     75 *****************************************************************************/
     76
     77/*****************************************************************************
     78 * Name      :
     79 * Purpose   :
     80 * Parameters:
     81 * Variables :
     82 * Result    :
     83 * Remark    : free memory when thread dies
     84 * Status    : UNTESTED STUB
     85 *
     86 * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
     87 *****************************************************************************/
     88
     89PWSOCKTHREADDATA iQueryWsockThreadData(void)
     90{
     91  struct _THDB*     pThreadDB = (struct _THDB*)GetThreadTHDB();
     92  PWSOCKTHREADDATA pwstd;
     93
     94  // check for existing pointer
     95  if (pThreadDB != NULL)
     96  {
     97    if (pThreadDB->pWsockData == NULL)
     98    {
     99      // allocate on demand + initialize
     100      pwstd = (PWSOCKTHREADDATA)HEAP_malloc (sizeof(WSOCKTHREADDATA));
     101      pThreadDB->pWsockData = (LPVOID)pwstd;
    85102    }
    86 tryagain:
    87     for (iData = lpFirstIData; iData; iData = iData->lpNextIData) {
    88         if (iData->dwThisThread == tid)
    89             break;
    90     }
    91     if(iData == NULL && fCurrentThread) {
    92         WINSOCK_CreateIData();
    93         fCurrentThread = FALSE; //just to prevent infinite loops
    94         goto tryagain;
    95     }
    96     else {
    97         dprintf(("WINSOCK_GetIData: couldn't find struct for thread %x", tid));
    98         DebugInt3();// should never happen!!!!!!!
    99     }
    100     return iData;
    101 }
    102 //******************************************************************************
    103 //******************************************************************************
    104 BOOL WINSOCK_CreateIData(void)
    105 {
    106     LPWSINFO iData;
    107    
    108     iData = (LPWSINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WSINFO));
    109     if (!iData)
    110         return FALSE;
    111     iData->dwThisThread = GetCurrentThread();
    112     iData->lpNextIData = lpFirstIData;
    113     lpFirstIData = iData;
    114     return TRUE;
    115 }
    116 //******************************************************************************
    117 //******************************************************************************
    118 void WINSOCK_DeleteIData(void)
    119 {
    120     LPWSINFO ppid, iData;
    121 
    122     if (iData) {
    123         ppid = lpFirstIData;
    124         while(ppid)
    125         {
    126                 iData = ppid;
    127                 ppid  = ppid->lpNextIData;
    128 
    129                 if( iData->flags & WSI_BLOCKINGCALL )
    130                         dprintf(("\tinside blocking call!\n"));
    131 
    132                 /* delete scratch buffers */
    133 
    134                 if(iData->he)   free(iData->he);
    135                 if(iData->se)   free(iData->se);
    136                 if(iData->pe)   free(iData->pe);
    137 
    138         ////    if( iData->buffer ) SEGPTR_FREE(iData->buffer);
    139         ////    if( iData->dbuffer ) SEGPTR_FREE(iData->dbuffer);
    140 
    141                 HeapFree(GetProcessHeap(), 0, iData);
    142         }
    143     }
    144 }
    145 //******************************************************************************
    146 //******************************************************************************
    147 ODINPROCEDURE1(WSASetLastError,
     103    else
     104      // use already allocated memory
     105      pwstd = (PWSOCKTHREADDATA)pThreadDB->pWsockData;
     106  }
     107
     108  if (pwstd == NULL)
     109    pwstd = &wstdFallthru; // no memory and not allocated already
     110
     111  return pwstd;
     112}
     113
     114
     115#if 0
     116/*****************************************************************************
     117 * Name      :
     118 * Purpose   :
     119 * Parameters:
     120 * Variables :
     121 * Result    :
     122 * Remark    :
     123 * Status    : UNTESTED STUB
     124 *
     125 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     126 *****************************************************************************/
     127
     128#define CASEERR2(a) case SOC##a: case a: return WSA##a;
     129#define CASEERR1(a) case SOC##a: return WSA##a;
     130
     131int iTranslateSockErrToWSock(int iError)
     132{
     133  switch(iError)
     134  {
     135    CASEERR2(EINTR)
     136    CASEERR2(EBADF)
     137    CASEERR2(EACCES)
     138    CASEERR2(EINVAL)
     139    CASEERR2(EMFILE)
     140
     141    CASEERR1(EWOULDBLOCK)
     142    CASEERR1(EINPROGRESS)
     143    CASEERR1(EALREADY)
     144    CASEERR1(ENOTSOCK)
     145//  CASEERR1(EDESTADRREQ)
     146    CASEERR1(EMSGSIZE)
     147    CASEERR1(EPROTOTYPE)
     148    CASEERR1(ENOPROTOOPT)
     149    CASEERR1(EPROTONOSUPPORT)
     150    CASEERR1(ESOCKTNOSUPPORT)
     151    CASEERR1(EOPNOTSUPP)
     152    CASEERR1(EPFNOSUPPORT)
     153    CASEERR1(EAFNOSUPPORT)
     154    CASEERR1(EADDRINUSE)
     155    CASEERR1(EADDRNOTAVAIL)
     156    CASEERR1(ENETDOWN)
     157    CASEERR1(ENETUNREACH)
     158    CASEERR1(ENETRESET)
     159    CASEERR1(ECONNABORTED)
     160    CASEERR1(ECONNRESET)
     161    CASEERR1(ENOBUFS)
     162    CASEERR1(EISCONN)
     163    CASEERR1(ENOTCONN)
     164    CASEERR1(ESHUTDOWN)
     165    CASEERR1(ETOOMANYREFS)
     166    CASEERR1(ETIMEDOUT)
     167    CASEERR1(ECONNREFUSED)
     168    CASEERR1(ELOOP)
     169    CASEERR1(ENAMETOOLONG)
     170    CASEERR1(EHOSTDOWN)
     171    CASEERR1(EHOSTUNREACH)
     172
     173    CASEERR1(ENOTEMPTY)
     174//    CASEERR(EPROCLIM)
     175//    CASEERR(EUSERS)
     176//    CASEERR(EDQUOT)
     177//    CASEERR(ESTALE)
     178//    CASEERR(EREMOTE)
     179//    CASEERR(EDISCON)
     180
     181
     182    default:
     183      dprintf(("WSOCK32: Unknown error condition: %d\n",
     184               iError));
     185      return iError;
     186  }
     187}
     188
     189#endif
     190
     191
     192
     193
     194
     195
     196
     197/*****************************************************************************
     198 * Name      :
     199 * Purpose   :
     200 * Parameters:
     201 * Variables :
     202 * Result    :
     203 * Remark    :
     204 * Status    : UNTESTED STUB
     205 *
     206 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     207 *****************************************************************************/
     208
     209
     210ODINPROCEDURE1(OS2WSASetLastError,
    148211               int,iError)
    149212{
    150213  // according to the docs, WSASetLastError() is just a call-through
    151214  // to SetLastError()
     215  WSASetLastError(iError);
    152216  SetLastError(iError);
    153217}
    154 //******************************************************************************
    155 //******************************************************************************
    156 ODINFUNCTION0(int,WSAGetLastError)
    157 {
    158   return GetLastError();
    159 }
    160 //******************************************************************************
    161 //******************************************************************************
    162 ODINFUNCTION2(int,OS2shutdown,
    163               SOCKET,s,
    164               int,how)
    165 {
    166  int ret;
    167 
    168    if(!fWSAInitialized) {
    169         WSASetLastError(WSANOTINITIALISED);
    170         return SOCKET_ERROR;
    171    }
    172    else
    173    if(WSAIsBlocking()) {
    174         WSASetLastError(WSAEINPROGRESS);
    175         return SOCKET_ERROR;
    176    }
    177    ret = shutdown(s, how);
    178    
    179    if(ret == SOCKET_ERROR) {
    180         WSASetLastError(wsaErrno());
    181    }
    182    else WSASetLastError(NO_ERROR);
    183    return ret;
    184 }
    185 //******************************************************************************
    186 //******************************************************************************
    187 ODINFUNCTION3(SOCKET,OS2socket,
    188               int,af,
    189               int,type,
    190               int,protocol)
    191 {
    192  SOCKET s;
    193 
    194    if(!fWSAInitialized) {
    195         WSASetLastError(WSANOTINITIALISED);
    196         return SOCKET_ERROR;
    197    }
    198    else
    199    if(WSAIsBlocking()) {
    200         WSASetLastError(WSAEINPROGRESS);
    201         return SOCKET_ERROR;
    202    }
    203    s = socket(af, type, protocol);
    204    
    205    if(s == SOCKET_ERROR && sock_errno() == SOCEPFNOSUPPORT) {
    206         //map SOCEPFNOSUPPORT to SOCEPFNOSUPPORT
    207         WSASetLastError(SOCEPFNOSUPPORT);
    208    }
    209    else
    210    if(s == SOCKET_ERROR) {
    211         WSASetLastError(wsaErrno());
    212    }
    213    else WSASetLastError(NO_ERROR);
    214    return s;
    215 }
    216 //******************************************************************************
    217 //******************************************************************************
     218
     219
     220/*****************************************************************************
     221 * Name      :
     222 * Purpose   :
     223 * Parameters:
     224 * Variables :
     225 * Result    :
     226 * Remark    :
     227 * Status    : UNTESTED STUB
     228 *
     229 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     230 *****************************************************************************/
     231
     232ODINFUNCTION0(int,OS2WSAGetLastError)
     233{
     234  // according to the docs, WSASetLastError() is just a call-through
     235  // to SetLastError(). However, what can be implemented here?
     236  return WSAGetLastError();
     237}
     238
     239
     240/*****************************************************************************
     241 * Name      :
     242 * Purpose   :
     243 * Parameters:
     244 * Variables :
     245 * Result    :
     246 * Remark    :
     247 * Status    : UNTESTED STUB
     248 *
     249 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     250 *****************************************************************************/
     251
     252ODINFUNCTION2(int,OS2__WSAFDIsSet,SOCKET, s,
     253                                  fd_set*,fds)
     254{
     255  return (__WSAFDIsSet(s,fds));
     256}
     257
     258
     259/*****************************************************************************
     260 * Name      :
     261 * Purpose   :
     262 * Parameters:
     263 * Variables :
     264 * Result    :
     265 * Remark    :
     266 * Status    : UNTESTED STUB
     267 *
     268 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     269 *****************************************************************************/
     270
     271ODINFUNCTION3(SOCKET,OS2accept, SOCKET,           s,
     272                                struct sockaddr *,addr,
     273                                int *,            addrlen)
     274{
     275  return(accept(s,addr,addrlen));
     276}
     277
     278
     279/*****************************************************************************
     280 * Name      :
     281 * Purpose   :
     282 * Parameters:
     283 * Variables :
     284 * Result    :
     285 * Remark    :
     286 * Status    : UNTESTED STUB
     287 *
     288 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     289 *****************************************************************************/
     290
     291ODINFUNCTION3(int,OS2bind,
     292              SOCKET ,s,
     293              const struct sockaddr *,addr,
     294              int, namelen)
     295{
     296  return(bind(s,addr,namelen));
     297}
     298
     299
     300/*****************************************************************************
     301 * Name      :
     302 * Purpose   :
     303 * Parameters:
     304 * Variables :
     305 * Result    :
     306 * Remark    :
     307 * Status    : UNTESTED STUB
     308 *
     309 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     310 *****************************************************************************/
     311
    218312ODINFUNCTION1(int,OS2closesocket,SOCKET, s)
    219313{
    220  int ret;
    221 
    222    if(!fWSAInitialized) {
    223         WSASetLastError(WSANOTINITIALISED);
    224         return SOCKET_ERROR;
    225    }
    226    else
    227    if(WSAIsBlocking()) {
    228         WSASetLastError(WSAEINPROGRESS);
    229         return SOCKET_ERROR;
    230    }
    231    ret = soclose(s);
    232 
    233    //Close WSAAsyncSelect thread if one was created for this socket
    234    EnableAsyncEvent(s, 0L);
    235    
    236    if(ret == SOCKET_ERROR) {
    237         WSASetLastError(wsaErrno());
    238    }
    239    else WSASetLastError(NO_ERROR);
    240    return ret;
    241 }
    242 //******************************************************************************
    243 //******************************************************************************
     314  return(closesocket(s));
     315}
     316
     317
     318/*****************************************************************************
     319 * Name      :
     320 * Purpose   :
     321 * Parameters:
     322 * Variables :
     323 * Result    :
     324 * Remark    :
     325 * Status    : UNTESTED STUB
     326 *
     327 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     328 *****************************************************************************/
     329
    244330ODINFUNCTION3(int,OS2connect,
    245331              SOCKET, s,
     
    247333              int, namelen)
    248334{
    249  int ret;
    250 
    251    if(!fWSAInitialized) {
    252         WSASetLastError(WSANOTINITIALISED);
    253         return SOCKET_ERROR;
    254    }
    255    else
    256    if(WSAIsBlocking()) {
    257         WSASetLastError(WSAEINPROGRESS);
    258         return SOCKET_ERROR;
    259    }
    260    ret = connect(s, (sockaddr *)name, namelen);
    261    // map BSD error codes
    262    if(ret == SOCKET_ERROR) {
    263         if(sock_errno() == SOCEINPROGRESS) {
    264                 WSASetLastError(WSAEWOULDBLOCK);
    265         }
    266         else
    267         if (sock_errno() == SOCEOPNOTSUPP) {
    268                 WSASetLastError(WSAEINVAL);
    269         }
    270         else    WSASetLastError(wsaErrno());
    271    }
    272    else WSASetLastError(NO_ERROR);
    273    return ret;
    274 }
    275 //******************************************************************************
    276 //******************************************************************************
     335  return(connect(s,name,namelen));
     336}
     337
     338
     339/*****************************************************************************
     340 * Name      :
     341 * Purpose   :
     342 * Parameters:
     343 * Variables :
     344 * Result    :
     345 * Remark    :
     346 * Status    : UNTESTED STUB
     347 *
     348 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     349 *****************************************************************************/
     350
    277351ODINFUNCTION3(int,OS2ioctlsocket,
    278352              SOCKET,s,
     
    280354              u_long *,argp)
    281355{
    282  int ret;
    283 
    284    if(!fWSAInitialized) {
    285         WSASetLastError(WSANOTINITIALISED);
    286         return SOCKET_ERROR;
    287    }
    288    else
    289    if(WSAIsBlocking()) {
    290         WSASetLastError(WSAEINPROGRESS);
    291         return SOCKET_ERROR;
    292    }
    293    if(cmd != FIONBIO && cmd != FIONREAD && cmd != SIOCATMARK) {
    294         WSASetLastError(WSAEINVAL);
    295         return SOCKET_ERROR;
    296    }
    297 
    298    WSASetLastError(NO_ERROR);
    299 
    300    //check if app want to set a socket, which has an outstanding async select,
    301    //to blocking mode
    302    if (cmd == FIONBIO) {
    303         HWND  hwnd;
    304         int   msg;
    305         ULONG lEvent;
    306 
    307         if(QueryAsyncEvent(s, &hwnd, &msg, &lEvent) == TRUE) {
    308                 if(*argp != 0) {
    309                         //nothing to do; already non-blocking
    310                         return NO_ERROR;
    311                 }
    312                 else {
    313                         dprintf(("Trying to set socket to blocking mode while async select active -> return error!"));
    314                         WSASetLastError(WSAEINVAL);
    315                         return SOCKET_ERROR;
    316                 }
    317         }
    318    }
    319    // clear high word (not used in OS/2's tcpip stack)
    320    ret = ioctl(s, LOUSHORT(cmd), (char *)argp, sizeof(int));
    321 
    322    // Map EOPNOTSUPP to EINVAL
    323    if(ret == SOCKET_ERROR && sock_errno() == SOCEOPNOTSUPP)
    324         WSASetLastError(WSAEINVAL);
    325    else
    326    if(ret == SOCKET_ERROR) {
    327         WSASetLastError(wsaErrno());
    328    }
    329    else WSASetLastError(NO_ERROR);
    330    return ret;
    331 }
    332 //******************************************************************************
    333 //******************************************************************************
     356  return(ioctlsocket(s,cmd,argp));
     357}
     358
     359
     360/*****************************************************************************
     361 * Name      :
     362 * Purpose   :
     363 * Parameters:
     364 * Variables :
     365 * Result    :
     366 * Remark    :
     367 * Status    : UNTESTED STUB
     368 *
     369 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     370 *****************************************************************************/
     371
    334372ODINFUNCTION3(int,OS2getpeername,
    335373              SOCKET, s,
     
    337375              int *, namelen)
    338376{
    339  int ret;
    340 
    341    if(!fWSAInitialized) {
    342         WSASetLastError(WSANOTINITIALISED);
    343         return SOCKET_ERROR;
    344    }
    345    else
    346    if(WSAIsBlocking()) {
    347         WSASetLastError(WSAEINPROGRESS);
    348         return SOCKET_ERROR;
    349    }
    350    else
    351    if (namelen == NULL || *namelen < (int)sizeof(struct sockaddr_in)) {
    352         WSASetLastError(WSAEFAULT);
    353         return SOCKET_ERROR;
    354    }
    355    ret = getsockname(s, name, namelen);
    356    if(ret == SOCKET_ERROR) {
    357         WSASetLastError(wsaErrno());
    358    }
    359    else WSASetLastError(NO_ERROR);
    360    return ret;
    361 }
    362 //******************************************************************************
    363 //******************************************************************************
     377  return(getpeername(s,name,namelen));
     378}
     379
     380
     381/*****************************************************************************
     382 * Name      :
     383 * Purpose   :
     384 * Parameters:
     385 * Variables :
     386 * Result    :
     387 * Remark    :
     388 * Status    : UNTESTED STUB
     389 *
     390 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     391 *****************************************************************************/
     392
    364393ODINFUNCTION3(int,OS2getsockname,
    365394              SOCKET,s,
     
    367396              int *, namelen)
    368397{
    369  int ret;
    370 
    371    if(!fWSAInitialized) {
    372         WSASetLastError(WSANOTINITIALISED);
    373         return SOCKET_ERROR;
    374    }
    375    else
    376    if(WSAIsBlocking()) {
    377         WSASetLastError(WSAEINPROGRESS);
    378         return SOCKET_ERROR;
    379    }
    380    else
    381    if (namelen == NULL || *namelen < (int)sizeof(struct sockaddr_in)) {
    382         WSASetLastError(WSAEFAULT);
    383         return SOCKET_ERROR;
    384    }
    385    ret = getsockname(s, name, namelen);
    386    if(ret == SOCKET_ERROR) {
    387         WSASetLastError(wsaErrno());
    388    }
    389    else WSASetLastError(NO_ERROR);
    390    return ret;
    391 }
    392 //******************************************************************************
    393 //******************************************************************************
     398  return(getsockname(s,name,namelen));
     399}
     400
     401
     402/*****************************************************************************
     403 * Name      :
     404 * Purpose   :
     405 * Parameters:
     406 * Variables :
     407 * Result    :
     408 * Remark    :
     409 * Status    : UNTESTED STUB
     410 *
     411 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     412 *****************************************************************************/
     413
     414ODINFUNCTION5(int,OS2getsockopt,
     415              SOCKET, s,
     416              int, level,
     417              int, optname,
     418              char *, optval,
     419              int *,optlen)
     420{
     421  return(getsockopt(s,
     422                    level,
     423                    optname,
     424                    optval,
     425                    optlen));
     426}
     427
     428
     429/*****************************************************************************
     430 * Name      :
     431 * Purpose   :
     432 * Parameters:
     433 * Variables :
     434 * Result    :
     435 * Remark    :
     436 * Status    : UNTESTED STUB
     437 *
     438 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     439 *****************************************************************************/
     440
    394441ODINFUNCTION1(u_long,OS2htonl,
    395442              u_long,hostlong)
     
    397444  return(htonl(hostlong));
    398445}
    399 //******************************************************************************
    400 //******************************************************************************
     446
     447
     448/*****************************************************************************
     449 * Name      :
     450 * Purpose   :
     451 * Parameters:
     452 * Variables :
     453 * Result    :
     454 * Remark    :
     455 * Status    : UNTESTED STUB
     456 *
     457 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     458 *****************************************************************************/
     459
    401460ODINFUNCTION1(u_short,OS2htons,
    402461              u_short,hostshort)
     
    404463  return(htons(hostshort));
    405464}
    406 //******************************************************************************
    407 //******************************************************************************
    408 ODINFUNCTION1(u_long,OS2ntohl,
    409               u_long,netlong)
    410 {
    411   return(ntohl(netlong));
    412 }
    413 //******************************************************************************
    414 //******************************************************************************
    415 ODINFUNCTION1(u_short,OS2ntohs,
    416               u_short,netshort)
    417 {
    418   return(ntohs(netshort));
    419 }
    420 //******************************************************************************
    421 //******************************************************************************
     465
     466
     467/*****************************************************************************
     468 * Name      :
     469 * Purpose   :
     470 * Parameters:
     471 * Variables :
     472 * Result    :
     473 * Remark    :
     474 * Status    : UNTESTED STUB
     475 *
     476 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     477 *****************************************************************************/
     478
    422479ODINFUNCTION1(unsigned long,OS2inet_addr,
    423480              const char *, cp)
     
    426483           cp));
    427484
    428   return (inet_addr((char *)cp));
    429 }
    430 //******************************************************************************
    431 //******************************************************************************
     485  return (inet_addr(cp));
     486}
     487
     488
     489/*****************************************************************************
     490 * Name      :
     491 * Purpose   :
     492 * Parameters:
     493 * Variables :
     494 * Result    :
     495 * Remark    :
     496 * Status    : UNTESTED STUB
     497 *
     498 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     499 *****************************************************************************/
     500
    432501ODINFUNCTION1(char *,OS2inet_ntoa,
    433502              struct in_addr, in)
     
    435504  return(inet_ntoa(in));
    436505}
    437 //******************************************************************************
    438 //******************************************************************************
    439 ODINFUNCTION3(SOCKET,OS2accept, SOCKET,           s,
    440                                 struct sockaddr *,addr,
    441                                 int *,            addrlen)
    442 {
    443  int   ret, msg;
    444  HWND  hwnd;
    445  ULONG lEvent;
    446 
    447    if(!fWSAInitialized) {
    448         WSASetLastError(WSANOTINITIALISED);
    449         return SOCKET_ERROR;
    450    }
    451    else
    452    if(WSAIsBlocking()) {
    453         WSASetLastError(WSAEINPROGRESS);
    454         return SOCKET_ERROR;
    455    }
    456    else
    457    if ((addr != NULL) && (addrlen != NULL)) {
    458         if (*addrlen < (int)sizeof(struct sockaddr_in)) {
    459                 WSASetLastError(WSAEFAULT);
    460                 return SOCKET_ERROR;
    461         }
    462    }
    463    ret = accept(s, addr, addrlen);
    464 
    465    if(ret != SOCKET_ERROR) {
    466         //Enable FD_ACCEPT event flag if WSAAsyncSelect was called for this socket
    467         EnableAsyncEvent(s, FD_ACCEPT);
    468 
    469         //if this socket has an active async. select pending, then call WSAAsyncSelect
    470         //with the same parameters for the new socket (see docs)
    471         if(QueryAsyncEvent(s, &hwnd, &msg, &lEvent) == TRUE) {
    472                 if(WSAAsyncSelect(ret, hwnd, msg, lEvent) == SOCKET_ERROR) {
    473                         ret = SOCKET_ERROR;
    474                 }
    475         }
    476    }
    477    if(ret == SOCKET_ERROR) {
    478         WSASetLastError(wsaErrno());
    479    }
    480    else WSASetLastError(NO_ERROR);
    481    return ret;
    482 }
    483 //******************************************************************************
    484 //******************************************************************************
    485 ODINFUNCTION3(int,OS2bind,
    486               SOCKET ,s,
    487               const struct sockaddr *,addr,
    488               int, namelen)
    489 {
    490  int ret;
    491 
    492    if(!fWSAInitialized) {
    493         WSASetLastError(WSANOTINITIALISED);
    494         return SOCKET_ERROR;
    495    }
    496    else
    497    if(WSAIsBlocking()) {
    498         WSASetLastError(WSAEINPROGRESS);
    499         return SOCKET_ERROR;
    500    }
    501    else
    502    if(namelen < (int)sizeof(struct sockaddr_in)) {
    503         WSASetLastError(WSAEFAULT);
    504         return SOCKET_ERROR;
    505    }
    506    ret = bind(s, (struct sockaddr *)addr, namelen);
    507 
    508    if(ret == SOCKET_ERROR) {
    509         WSASetLastError(wsaErrno());
    510    }
    511    else WSASetLastError(NO_ERROR);
    512    return ret;
    513 }
    514 //******************************************************************************
    515 //******************************************************************************
     506
     507
     508/*****************************************************************************
     509 * Name      :
     510 * Purpose   :
     511 * Parameters:
     512 * Variables :
     513 * Result    :
     514 * Remark    :
     515 * Status    : UNTESTED STUB
     516 *
     517 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     518 *****************************************************************************/
     519
    516520ODINFUNCTION2(int,OS2listen,
    517521              SOCKET, s,
    518522              int, backlog)
    519523{
    520    int ret, tmp, namelen;
    521    struct sockaddr_in name;
    522 
    523    if(!fWSAInitialized) {
    524         WSASetLastError(WSANOTINITIALISED);
    525         return SOCKET_ERROR;
    526    }
    527    else
    528    if(WSAIsBlocking()) {
    529         WSASetLastError(WSAEINPROGRESS);
    530         return SOCKET_ERROR;
    531    }
    532    namelen = sizeof(name);
    533    ret = getsockname(s, (struct sockaddr *)&name, &namelen);
    534    if (ret == 0) {
    535         if (name.sin_port == 0 && name.sin_addr.s_addr == 0) {
    536                 // Socket is not bound
    537                 WSASetLastError(WSAEINVAL);
    538                 return SOCKET_ERROR;
    539         }
    540         ret = ioctl(s, FIOBSTATUS, (char *)&tmp, sizeof(tmp)) &
    541                    (SS_ISCONNECTING | SS_ISCONNECTED | SS_ISDISCONNECTING);
    542         if(ret) {
    543                 // Socket is already connected
    544                 WSASetLastError(WSAEISCONN);
    545                 return SOCKET_ERROR;
    546         }
    547         ret = listen(s, backlog);
    548         //todo: reset FD_ACCEPT bit? (wine seems to do this, but it's not documented)
    549    }
    550    if(ret == SOCKET_ERROR) {
    551         WSASetLastError(wsaErrno());
    552    }
    553    else WSASetLastError(NO_ERROR);
    554    return ret;
    555 }
    556 //******************************************************************************
    557 //******************************************************************************
     524  return(listen(s,backlog));
     525}
     526
     527
     528/*****************************************************************************
     529 * Name      :
     530 * Purpose   :
     531 * Parameters:
     532 * Variables :
     533 * Result    :
     534 * Remark    :
     535 * Status    : UNTESTED STUB
     536 *
     537 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     538 *****************************************************************************/
     539
     540ODINFUNCTION1(u_long,OS2ntohl,
     541              u_long,netlong)
     542{
     543  return(ntohl(netlong));
     544}
     545
     546
     547/*****************************************************************************
     548 * Name      :
     549 * Purpose   :
     550 * Parameters:
     551 * Variables :
     552 * Result    :
     553 * Remark    :
     554 * Status    : UNTESTED STUB
     555 *
     556 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     557 *****************************************************************************/
     558
     559ODINFUNCTION1(u_short,OS2ntohs,
     560              u_short,netshort)
     561{
     562  return(ntohs(netshort));
     563}
     564
     565
     566/*****************************************************************************
     567 * Name      :
     568 * Purpose   :
     569 * Parameters:
     570 * Variables :
     571 * Result    :
     572 * Remark    :
     573 * Status    : UNTESTED STUB
     574 *
     575 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     576 *****************************************************************************/
     577
    558578ODINFUNCTION4(int,OS2recv,
    559579              SOCKET,s,
     
    562582              int,flags)
    563583{
    564    int ret;
    565 
    566    if(!fWSAInitialized) {
    567         WSASetLastError(WSANOTINITIALISED);
    568         return SOCKET_ERROR;
    569    }
    570    else
    571    if(WSAIsBlocking()) {
    572         WSASetLastError(WSAEINPROGRESS);
    573         return SOCKET_ERROR;
    574    }
    575    ret = recv(s, buf, len, flags);
    576 
    577    if(ret == SOCKET_ERROR) {
    578         WSASetLastError(wsaErrno());
    579    }
    580    else WSASetLastError(NO_ERROR);
    581 
    582    //Reset FD_READ event flagfor  WSAAsyncSelect thread if one was created for this socket
    583    EnableAsyncEvent(s, FD_READ);
    584    return ret;
    585 }
    586 //******************************************************************************
    587 //******************************************************************************
     584  return(recv(s,
     585              buf,
     586              len,
     587              flags));
     588}
     589
     590
     591/*****************************************************************************
     592 * Name      :
     593 * Purpose   :
     594 * Parameters:
     595 * Variables :
     596 * Result    :
     597 * Remark    :
     598 * Status    : UNTESTED STUB
     599 *
     600 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     601 *****************************************************************************/
     602
    588603ODINFUNCTION6(int,OS2recvfrom,
    589604              SOCKET,s,
     
    594609              int *,fromlen)
    595610{
    596    int ret;
    597 
    598    if(!fWSAInitialized) {
    599         WSASetLastError(WSANOTINITIALISED);
    600         return SOCKET_ERROR;
    601    }
    602    else
    603    if(WSAIsBlocking()) {
    604         WSASetLastError(WSAEINPROGRESS);
    605         return SOCKET_ERROR;
    606    }
    607    else
    608    if(fromlen == NULL || *fromlen < (int)sizeof(struct sockaddr_in)) {
    609         WSASetLastError(WSAEFAULT);
    610         return SOCKET_ERROR;
    611    }
    612    ret = recvfrom(s, buf, len, flags, from, fromlen);
    613 
    614    if(ret == SOCKET_ERROR) {
    615         WSASetLastError(wsaErrno());
    616    }
    617    else WSASetLastError(NO_ERROR);
    618 
    619    //Reset FD_READ event flagfor  WSAAsyncSelect thread if one was created for this socket
    620    EnableAsyncEvent(s, FD_READ);
    621    return ret;
    622 }
    623 //******************************************************************************
    624 //******************************************************************************
     611
     612  return(recvfrom(s,
     613                buf,
     614                len,
     615                flags,
     616                from,
     617                fromlen));
     618}
     619
     620
     621/*****************************************************************************
     622 * Name      :
     623 * Purpose   :
     624 * Parameters:
     625 * Variables :
     626 * Result    :
     627 * Remark    :
     628 * Status    : UNTESTED STUB
     629 *
     630 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     631 *****************************************************************************/
     632
     633ODINFUNCTION5(int,OS2select,
     634              int,nfds,
     635              fd_set *,readfds,
     636              fd_set *,writefds,
     637              fd_set *,exceptfds,
     638              const struct timeval *,timeout)
     639{
     640  return(select(nfds,
     641                readfds,
     642                writefds,
     643                exceptfds,
     644                timeout));
     645}
     646
     647
     648/*****************************************************************************
     649 * Name      :
     650 * Purpose   :
     651 * Parameters:
     652 * Variables :
     653 * Result    :
     654 * Remark    :
     655 * Status    : UNTESTED STUB
     656 *
     657 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     658 *****************************************************************************/
     659
    625660ODINFUNCTION4(int,OS2send,
    626661              SOCKET,s,
     
    629664              int,flags)
    630665{
    631    int ret;
    632 
    633    if(!fWSAInitialized) {
    634         WSASetLastError(WSANOTINITIALISED);
    635         return SOCKET_ERROR;
    636    }
    637    else
    638    if(WSAIsBlocking()) {
    639         WSASetLastError(WSAEINPROGRESS);
    640         return SOCKET_ERROR;
    641    }
    642    ret = send(s, (char *)buf, len, flags);
    643 
    644    if(ret == SOCKET_ERROR) {
    645         WSASetLastError(wsaErrno());
    646    }
    647    else WSASetLastError(NO_ERROR);
    648 
    649    //Reset FD_WRITE event flagfor  WSAAsyncSelect thread if one was created for this socket
    650    EnableAsyncEvent(s, FD_WRITE);
    651    return ret;
    652 }
    653 //******************************************************************************
    654 //******************************************************************************
     666  return(send(s,
     667              buf,
     668              len,
     669              flags));
     670}
     671
     672
     673/*****************************************************************************
     674 * Name      :
     675 * Purpose   :
     676 * Parameters:
     677 * Variables :
     678 * Result    :
     679 * Remark    :
     680 * Status    : UNTESTED STUB
     681 *
     682 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     683 *****************************************************************************/
     684
    655685ODINFUNCTION6(int,OS2sendto,
    656686              SOCKET,s,
     
    661691              int,tolen)
    662692{
    663    int ret;
    664 
    665    if(!fWSAInitialized) {
    666         WSASetLastError(WSANOTINITIALISED);
    667         return SOCKET_ERROR;
    668    }
    669    else
    670    if(WSAIsBlocking()) {
    671         WSASetLastError(WSAEINPROGRESS);
    672         return SOCKET_ERROR;
    673    }
    674    else
    675    if(tolen < (int)sizeof(struct sockaddr_in)) {
    676         WSASetLastError(WSAEFAULT);
    677         return SOCKET_ERROR;
    678    }
    679    ret = sendto(s, (char *)buf, len, flags, (struct sockaddr *)to, tolen);
    680 
    681    if(ret == SOCKET_ERROR) {
    682         WSASetLastError(wsaErrno());
    683    }
    684    else WSASetLastError(NO_ERROR);
    685 
    686    //Reset FD_WRITE event flagfor  WSAAsyncSelect thread if one was created for this socket
    687    EnableAsyncEvent(s, FD_WRITE);
    688    return ret;
    689 }
    690 //******************************************************************************
    691 //******************************************************************************
    692 ODINFUNCTION5(int,OS2select,
    693               int,nfds,
    694               ws_fd_set *,readfds,
    695               ws_fd_set *,writefds,
    696               ws_fd_set *,exceptfds,
    697               const struct timeval *,timeout)
    698 {
    699  int ret, i, j;
    700  int *sockets, *socktmp;
    701  int nrread, nrwrite, nrexcept;
    702  ULONG ttimeout;
    703 
    704    WSASetLastError(NO_ERROR);
    705 
    706    if(!fWSAInitialized) {
    707         WSASetLastError(WSANOTINITIALISED);
    708         return SOCKET_ERROR;
    709    }
    710    else
    711    if(WSAIsBlocking()) {
    712         WSASetLastError(WSAEINPROGRESS);
    713         return SOCKET_ERROR;
    714    }
    715    else {
    716         nrread = nrwrite = nrexcept = 0;
    717         if(readfds) {
    718                 nrread += readfds->fd_count;
    719         }
    720         if(writefds) {
    721                 nrwrite += writefds->fd_count;
    722         }
    723         if(exceptfds) {
    724                 nrexcept += exceptfds->fd_count;
    725         }
    726         if(nrread + nrwrite + nrexcept  == 0) {
    727                 WSASetLastError(WSAEINVAL);
    728                 return SOCKET_ERROR;
    729         }
    730         if(timeout != NULL && (timeout->tv_sec < 0 || timeout->tv_usec < 0)) {
    731                 WSASetLastError(WSAEINVAL);
    732                 return SOCKET_ERROR;
    733         }
    734         if(timeout == NULL) {
    735                 ttimeout = -1L; // no timeout
    736         }
    737         else    ttimeout = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
    738        
    739         sockets = (int *)malloc(sizeof(int) * (nrread+nrwrite+nrexcept));
    740         if(readfds) {
    741                 memcpy(&sockets[0], readfds->fd_array, nrread * sizeof(SOCKET));
    742         }
    743         if(writefds) {
    744                 memcpy(&sockets[nrread], writefds->fd_array, nrwrite * sizeof(SOCKET));
    745         }
    746         if(exceptfds) {
    747                 memcpy(&sockets[nrread+nrwrite], exceptfds->fd_array, nrexcept * sizeof(SOCKET));
    748         }
    749 
    750         ret = select(sockets, nrread, nrwrite, nrexcept, ttimeout);
    751 
    752         if(ret == SOCKET_ERROR)
    753         {
    754                 if(readfds != NULL)
    755                         readfds->fd_count = 0;
    756 
    757                 if(writefds != NULL)
    758                         writefds->fd_count = 0;
    759 
    760                 if(exceptfds != NULL)
    761                         exceptfds->fd_count = 0;
    762 
    763                 WSASetLastError(wsaErrno());
    764                 free(sockets);
    765                 return SOCKET_ERROR;
    766         }
    767 
    768         if(ret != 0) {
    769                 socktmp = sockets;
    770                 if(readfds != NULL) {
    771                         for(i=0;i<nrread;i++) {
    772                                 if(socktmp[i] != -1) {
    773                                         readfds->fd_array[j] = socktmp[i];
    774                                 }
    775                         }
    776                         readfds->fd_count = i;
    777                         socktmp += nrread;
    778                 }
    779 
    780                 if(writefds != NULL) {
    781                         for(i=0;i<nrwrite;i++) {
    782                                 if(socktmp[i] != -1) {
    783                                         writefds->fd_array[j] = socktmp[i];
    784                                 }
    785                         }
    786                         writefds->fd_count = i;
    787                         socktmp += nrwrite;
    788                 }
    789                 if(exceptfds != NULL) {
    790                         for(i=0;i<nrexcept;i++) {
    791                                 if(socktmp[i] != -1) {
    792                                         exceptfds->fd_array[j] = socktmp[i];
    793                                 }
    794                         }
    795                         exceptfds->fd_count = i;
    796                 }
    797          }
    798         else {
    799             if(readfds != NULL)
    800                readfds->fd_count = 0;
    801 
    802             if(writefds != NULL)
    803                writefds->fd_count = 0;
    804 
    805             if(exceptfds != NULL)
    806                exceptfds->fd_count = 0;
    807         }
    808         free(sockets);
    809    }
    810    return ret;
    811 }
    812 //******************************************************************************
    813 //******************************************************************************
     693  return(sendto(s,
     694              buf,
     695              len,
     696              flags,
     697              to,
     698              tolen));
     699}
     700
     701
     702/*****************************************************************************
     703 * Name      :
     704 * Purpose   :
     705 * Parameters:
     706 * Variables :
     707 * Result    :
     708 * Remark    :
     709 * Status    : UNTESTED STUB
     710 *
     711 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     712 *****************************************************************************/
     713
    814714ODINFUNCTION5(int,OS2setsockopt,
    815715              SOCKET,s,
     
    819719              int,optlen)
    820720{
    821   struct ws_linger *yy;
    822   struct linger     xx;
    823   int               ret;
    824   ULONG             size;
    825 
    826    if(!fWSAInitialized) {
    827         WSASetLastError(WSANOTINITIALISED);
    828         return SOCKET_ERROR;
    829    }
    830    else
    831    if(WSAIsBlocking()) {
    832         WSASetLastError(WSAEINPROGRESS);
    833         return SOCKET_ERROR;
    834    }
    835    if (level == SOL_SOCKET) {
    836         switch(optname) {
    837         case SO_DONTLINGER:
    838         case SO_LINGER:
    839                 if(optlen < (int)sizeof(ws_linger)) {
    840                         WSASetLastError(WSAEFAULT);
    841                         return SOCKET_ERROR;
    842                 }
    843                 yy = (struct ws_linger *)optval;
    844                 xx.l_onoff  = (optname == SO_DONTLINGER) ? !yy->l_onoff : yy->l_onoff;
    845                 xx.l_linger = yy->l_linger;
    846 
    847                 ret = setsockopt(s,level,optname,(char *)&xx, sizeof(xx));
    848                 break;
    849         case SO_SNDBUF:
    850         case SO_RCVBUF:
    851                 if(optlen < (int)sizeof(int)) {
    852                         WSASetLastError(WSAEFAULT);
    853                         return SOCKET_ERROR;
    854                 }
    855 
    856                 size = *(ULONG *)optval;
     721  struct Wlinger *yy;
     722  struct linger xx;
     723  int    rc;
     724
     725  if(level   == SOL_SOCKET &&
     726     optname == SO_LINGER)
     727  {
     728    yy = (struct Wlinger *)optval;
     729    xx.l_onoff = (int)yy->l_onoff;
     730    xx.l_linger = (int)yy->l_linger;
     731
     732    rc = setsockopt(s,level,optname,(char *)&xx, sizeof(xx));
     733  }
     734  else
     735  if(level == SOL_SOCKET && (optname == SO_SNDBUF || optname == SO_RCVBUF)) {
     736        ULONG size;
     737
     738        size = *(ULONG *)optval;
    857739tryagain:
    858                 ret = setsockopt(s,level,optname, (char *)&size, sizeof(ULONG));
    859                 if(ret == SOCKET_ERROR && size > 65535) {
    860                         //SvL: Limit send & receive buffer length to 64k
    861                         //     (only happens with 16 bits tcpip stack?)
    862                         size = 65000;
    863                         goto tryagain;
    864                 }
    865                 break;
    866 
    867         case SO_BROADCAST:
    868         case SO_DEBUG:
    869         case SO_KEEPALIVE:
    870         case SO_DONTROUTE:
    871         case SO_OOBINLINE:
    872         case SO_REUSEADDR:
    873                 if(optlen < (int)sizeof(int)) {
    874                         WSASetLastError(WSAEFAULT);
    875                         return SOCKET_ERROR;
    876                 }
    877                 ret = setsockopt(s, level, optname, (char *)optval, optlen);
    878                 break;
    879         default:
    880                 WSASetLastError(WSAENOPROTOOPT);
    881                 return SOCKET_ERROR;
    882         }
    883    }
    884    else
    885    if(level == IPPROTO_TCP) {
    886         if(optname == TCP_NODELAY) {
    887                 if(optlen < (int)sizeof(int)) {
    888                         WSASetLastError(WSAEFAULT);
    889                         return SOCKET_ERROR;
    890                 }
    891                 ret = setsockopt(s, level, optname, (char *)optval, optlen);
    892         }
    893         else {
    894                 WSASetLastError(WSAENOPROTOOPT);
    895                 return SOCKET_ERROR;
    896         }
    897    }
    898    else {
    899         WSASetLastError(WSAEINVAL);
    900         return SOCKET_ERROR;
    901    }
    902 
    903    if(ret == SOCKET_ERROR) {
    904         WSASetLastError(wsaErrno());
    905    }
    906    else WSASetLastError(NO_ERROR);
    907    return ret;
    908 }
    909 //******************************************************************************
    910 //******************************************************************************
    911 ODINFUNCTION5(int,OS2getsockopt,
    912               SOCKET, s,
    913               int, level,
    914               int, optname,
    915               char *, optval,
    916               int *,optlen)
    917 {
    918   struct ws_linger *yy;
    919   struct linger     xx;
    920   int               ret;
    921   int               size, options;
    922 
    923    if(!fWSAInitialized) {
    924         WSASetLastError(WSANOTINITIALISED);
    925         return SOCKET_ERROR;
    926    }
    927    else
    928    if(WSAIsBlocking()) {
    929         WSASetLastError(WSAEINPROGRESS);
    930         return SOCKET_ERROR;
    931    }
    932    if (level == SOL_SOCKET) {
    933         switch(optname) {
    934         case SO_DONTLINGER:
    935         case SO_LINGER:
    936                 if(optlen == NULL || *optlen < sizeof(ws_linger)) {
    937                         WSASetLastError(WSAEFAULT);
    938                         return SOCKET_ERROR;
    939                 }
    940                 size = sizeof(xx);
    941                 ret = getsockopt(s,level,optname,(char *)&xx, &size);
    942                 yy = (struct ws_linger *)optval;
    943                 yy->l_onoff  = (optname == SO_DONTLINGER) ? !xx.l_onoff : xx.l_onoff;
    944                 yy->l_linger = xx.l_linger;
    945                 *optlen = size;
    946                 break;
    947 
    948         case SO_SNDBUF:
    949         case SO_RCVBUF:
    950         case SO_BROADCAST:
    951         case SO_DEBUG:
    952         case SO_KEEPALIVE:
    953         case SO_DONTROUTE:
    954         case SO_OOBINLINE:
    955         case SO_REUSEADDR:
    956         case SO_TYPE:
    957                 if(optlen == NULL || *optlen < sizeof(int)) {
    958                         WSASetLastError(WSAEFAULT);
    959                         return SOCKET_ERROR;
    960                 }
    961                 ret = getsockopt(s, level, optname, (char *)optval, optlen);
    962                 break;
    963         case SO_ACCEPTCONN:
    964                 if(optlen == NULL || *optlen < sizeof(int)) {
    965                         WSASetLastError(WSAEFAULT);
    966                         return SOCKET_ERROR;
    967                 }
    968                 size = sizeof(options);
    969                 ret = getsockopt(s, SOL_SOCKET, SO_OPTIONS, (char *)&options, &size);
    970                 if(ret != SOCKET_ERROR) {
    971                         *(BOOL *)optval = (options & SO_ACCEPTCONN) == SO_ACCEPTCONN;
    972                         *optlen = sizeof(BOOL);
    973                 }
    974                 break;
    975         default:
    976                 WSASetLastError(WSAENOPROTOOPT);
    977                 return SOCKET_ERROR;
    978         }
    979    }
    980    else
    981    if(level == IPPROTO_TCP) {
    982         if(optname == TCP_NODELAY) {
    983                 if(optlen == NULL || *optlen < sizeof(int)) {
    984                         WSASetLastError(WSAEFAULT);
    985                         return SOCKET_ERROR;
    986                 }
    987                 ret = getsockopt(s, level, optname, (char *)optval, optlen);
    988         }
    989         else {
    990                 WSASetLastError(WSAENOPROTOOPT);
    991                 return SOCKET_ERROR;
    992         }
    993    }
    994    else {
    995         WSASetLastError(WSAEINVAL);
    996         return SOCKET_ERROR;
    997    }
    998 
    999    if(ret == SOCKET_ERROR) {
    1000         WSASetLastError(wsaErrno());
    1001    }
    1002    else WSASetLastError(NO_ERROR);
    1003    return ret;
    1004 }
    1005 //******************************************************************************
    1006 //******************************************************************************
     740        rc = setsockopt(s,level,optname, (char *)&size, sizeof(ULONG));
     741        if(rc == SOCKET_ERROR && size > 65535) {
     742                //SvL: Limit send & receive buffer length to 64k
     743                //     (only happens with 16 bits tcpip stack?)
     744                size = 65000;
     745                goto tryagain;
     746        }
     747
     748  }
     749  else {
     750    rc = setsockopt(s,level,optname,(char *)optval,optlen);
     751  }
     752
     753  if (rc == SOCKET_ERROR)
     754    //OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     755    OS2WSASetLastError(WSAEINVAL);
     756  else
     757    OS2WSASetLastError(ERROR_SUCCESS);
     758
     759  return rc;
     760}
     761
     762
     763/*****************************************************************************
     764 * Name      :
     765 * Purpose   :
     766 * Parameters:
     767 * Variables :
     768 * Result    :
     769 * Remark    :
     770 * Status    : UNTESTED STUB
     771 *
     772 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     773 *****************************************************************************/
     774
     775ODINFUNCTION2(int,OS2shutdown,
     776              SOCKET,s,
     777              int,how)
     778{
     779  return(shutdown(s,
     780                  how));
     781}
     782
     783
     784/*****************************************************************************
     785 * Name      :
     786 * Purpose   :
     787 * Parameters:
     788 * Variables :
     789 * Result    :
     790 * Remark    :
     791 * Status    : UNTESTED STUB
     792 *
     793 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     794 *****************************************************************************/
     795
     796ODINFUNCTION3(SOCKET,OS2socket,
     797              int,af,
     798              int,type,
     799              int,protocol)
     800{
     801  return(socket(af,
     802                type,
     803                protocol));
     804}
     805
     806
    1007807/* Database function prototypes */
    1008 //******************************************************************************
    1009 //******************************************************************************
     808
     809/*****************************************************************************
     810 * Name      :
     811 * Purpose   :
     812 * Parameters:
     813 * Variables :
     814 * Result    :
     815 * Remark    :
     816 * Status    : UNTESTED STUB
     817 *
     818 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     819 *****************************************************************************/
     820
     821ODINFUNCTION3(struct Whostent *,OS2gethostbyaddr,
     822              const char *,addr,
     823              int,len,
     824              int,type)
     825{
     826  WHOSTENT         *yy;
     827  struct hostent   *xx;
     828  PWSOCKTHREADDATA pwstd;
     829
     830  xx = gethostbyaddr((char *)addr,len,type);
     831  //PH: we assume PMWSOCK sets WSASetLastError correctly!
     832
     833  if(xx == NULL)
     834     return (WHOSTENT *)NULL;
     835
     836  // access current thread wsock data block
     837  pwstd = iQueryWsockThreadData();
     838
     839  pwstd->whsnt.h_name      = xx->h_name;
     840  pwstd->whsnt.h_aliases   = xx->h_aliases;
     841  pwstd->whsnt.h_addrtype  = (short)xx->h_addrtype;
     842  pwstd->whsnt.h_length    = (short)xx->h_length;
     843  pwstd->whsnt.h_addr_list = xx->h_addr_list;
     844
     845  return &pwstd->whsnt;
     846}
     847
     848
     849/*****************************************************************************
     850 * Name      :
     851 * Purpose   :
     852 * Parameters:
     853 * Variables :
     854 * Result    :
     855 * Remark    :
     856 * Status    : UNTESTED STUB
     857 *
     858 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     859 *****************************************************************************/
     860
     861ODINFUNCTION1(struct Whostent *,OS2gethostbyname,
     862              const char *,name)
     863{
     864  WHOSTENT         *yy;
     865  struct hostent   *xx;
     866  PWSOCKTHREADDATA pwstd;
     867
     868
     869  xx = gethostbyname((char *)name);
     870  //PH: we assume PMWSOCK sets WSASetLastError correctly!
     871
     872  if(xx == NULL)
     873    return (WHOSTENT *)NULL;
     874
     875  // access current thread wsock data block
     876  pwstd = iQueryWsockThreadData();
     877
     878  pwstd->whsnt.h_name      = xx->h_name;
     879  pwstd->whsnt.h_aliases   = xx->h_aliases;
     880  pwstd->whsnt.h_addrtype  = (short)xx->h_addrtype;
     881  pwstd->whsnt.h_length    = (short)xx->h_length;
     882  pwstd->whsnt.h_addr_list = xx->h_addr_list;
     883
     884  return &pwstd->whsnt;
     885}
     886
     887
     888/*****************************************************************************
     889 * Name      :
     890 * Purpose   :
     891 * Parameters:
     892 * Variables :
     893 * Result    :
     894 * Remark    :
     895 * Status    : UNTESTED STUB
     896 *
     897 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     898 *****************************************************************************/
     899
    1010900ODINFUNCTION2(int,OS2gethostname,
    1011901              char *,name,
    1012902              int,namelen)
    1013903{
    1014  int ret;
    1015 
    1016    ret = gethostname(name, namelen);
    1017    if(ret == NULL) {
    1018         WSASetLastError(NO_ERROR);
    1019         return 0;
    1020    }
    1021    WSASetLastError((errno == EINVAL) ? WSAEFAULT : wsaErrno());
    1022    return SOCKET_ERROR;
    1023 }
    1024 //******************************************************************************
    1025 //******************************************************************************
    1026 ODINFUNCTION3(ws_hostent *,OS2gethostbyaddr,
     904   //PH: we assume PMWSOCK sets WSASetLastError correctly!
     905   return(gethostname(name,
     906                     namelen));
     907}
     908
     909
     910/*****************************************************************************
     911 * Name      :
     912 * Purpose   :
     913 * Parameters:
     914 * Variables :
     915 * Result    :
     916 * Remark    :
     917 * Status    : UNTESTED STUB
     918 *
     919 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     920 *****************************************************************************/
     921
     922ODINFUNCTION2(struct Wservent *,OS2getservbyport,
     923              int,              port,
     924              const char *,     proto)
     925{
     926  struct servent   *xx;
     927  PWSOCKTHREADDATA pwstd;
     928
     929  //PH: we assume PMWSOCK sets WSASetLastError correctly!
     930  xx = getservbyport(port,(char *)proto);
     931
     932  if(xx == NULL)
     933    return (WSERVENT *)NULL;
     934
     935  // access current thread wsock data block
     936  pwstd = iQueryWsockThreadData();
     937
     938  pwstd->wsvnt.s_name    = xx->s_name;
     939  pwstd->wsvnt.s_aliases = xx->s_aliases;
     940  pwstd->wsvnt.s_port    = (short)xx->s_port;
     941  pwstd->wsvnt.s_proto   = xx->s_proto;
     942
     943  return &pwstd->wsvnt;
     944}
     945
     946
     947/*****************************************************************************
     948 * Name      :
     949 * Purpose   :
     950 * Parameters:
     951 * Variables :
     952 * Result    :
     953 * Remark    :
     954 * Status    : UNTESTED STUB
     955 *
     956 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     957 *****************************************************************************/
     958
     959ODINFUNCTION2(struct Wservent *,OS2getservbyname,
     960              const char *,     name,
     961              const char *,     proto)
     962{
     963  WSERVENT         *yy;
     964  struct servent   *xx;
     965  PWSOCKTHREADDATA pwstd;
     966
     967
     968  //PH: we assume PMWSOCK sets WSASetLastError correctly!
     969  xx = getservbyname((char *)name,(char *)proto);
     970
     971  if(xx == NULL)
     972    return (WSERVENT *)NULL;
     973
     974  // access current thread wsock data block
     975  pwstd = iQueryWsockThreadData();
     976
     977  pwstd->wsvnt.s_name    = xx->s_name;
     978  pwstd->wsvnt.s_aliases = xx->s_aliases;
     979  pwstd->wsvnt.s_port    = (short)xx->s_port;
     980  pwstd->wsvnt.s_proto   = xx->s_proto;
     981
     982  return &pwstd->wsvnt;
     983}
     984
     985
     986/*****************************************************************************
     987 * Name      :
     988 * Purpose   :
     989 * Parameters:
     990 * Variables :
     991 * Result    :
     992 * Remark    :
     993 * Status    : UNTESTED STUB
     994 *
     995 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     996 *****************************************************************************/
     997
     998ODINFUNCTION1(struct Wprotoent *,OS2getprotobynumber,
     999              int,proto)
     1000{
     1001  struct protoent  *xx;
     1002  PWSOCKTHREADDATA pwstd;
     1003
     1004  //PH: we assume PMWSOCK sets WSASetLastError correctly!
     1005  xx = getprotobynumber(proto);
     1006
     1007  if(xx == NULL)
     1008    return (WPROTOENT *)NULL;
     1009
     1010  // access current thread wsock data block
     1011  pwstd = iQueryWsockThreadData();
     1012
     1013  pwstd->wptnt.p_name    = xx->p_name;
     1014  pwstd->wptnt.p_aliases = xx->p_aliases;
     1015  pwstd->wptnt.p_proto   = (short)xx->p_proto;
     1016
     1017  return &pwstd->wptnt;
     1018}
     1019
     1020
     1021/*****************************************************************************
     1022 * Name      :
     1023 * Purpose   :
     1024 * Parameters:
     1025 * Variables :
     1026 * Result    :
     1027 * Remark    :
     1028 * Status    : UNTESTED STUB
     1029 *
     1030 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1031 *****************************************************************************/
     1032
     1033ODINFUNCTION1(struct Wprotoent *,OS2getprotobyname,
     1034              const char *,name)
     1035{
     1036  struct protoent  *xx;
     1037  PWSOCKTHREADDATA pwstd;
     1038
     1039  //PH: we assume PMWSOCK sets WSASetLastError correctly!
     1040  xx = getprotobyname((char *)name);
     1041
     1042  if(xx == NULL)
     1043    return (WPROTOENT *)NULL;
     1044
     1045  // access current thread wsock data block
     1046  pwstd = iQueryWsockThreadData();
     1047
     1048  pwstd->wptnt.p_name    = xx->p_name;
     1049  pwstd->wptnt.p_aliases = xx->p_aliases;
     1050  pwstd->wptnt.p_proto   = (short)xx->p_proto;
     1051
     1052  return &pwstd->wptnt;
     1053}
     1054
     1055
     1056
     1057/* Microsoft Windows Extension function prototypes */
     1058
     1059/*****************************************************************************
     1060 * Name      :
     1061 * Purpose   :
     1062 * Parameters:
     1063 * Variables :
     1064 * Result    :
     1065 * Remark    :
     1066 * Status    : UNTESTED STUB
     1067 *
     1068 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1069 *****************************************************************************/
     1070
     1071ODINFUNCTION2(int,OS2WSAStartup,
     1072              USHORT,wVersionRequired,
     1073              LPWSADATA,lpWSAData)
     1074{
     1075  fWSAInitialized = TRUE;
     1076  return(WSAStartup(wVersionRequired,
     1077                    lpWSAData));
     1078}
     1079
     1080
     1081/*****************************************************************************
     1082 * Name      :
     1083 * Purpose   :
     1084 * Parameters:
     1085 * Variables :
     1086 * Result    :
     1087 * Remark    :
     1088 * Status    : UNTESTED STUB
     1089 *
     1090 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1091 *****************************************************************************/
     1092
     1093ODINFUNCTION0(int,OS2WSACleanup)
     1094{
     1095  fWSAInitialized = FALSE;
     1096  return(WSACleanup());
     1097}
     1098
     1099
     1100/*****************************************************************************
     1101 * Name      :
     1102 * Purpose   :
     1103 * Parameters:
     1104 * Variables :
     1105 * Result    :
     1106 * Remark    :
     1107 * Status    : UNTESTED STUB
     1108 *
     1109 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1110 *****************************************************************************/
     1111
     1112ODINFUNCTION0(BOOL,OS2WSAIsBlocking)
     1113{
     1114  return WSAIsBlocking();
     1115}
     1116
     1117
     1118/*****************************************************************************
     1119 * Name      :
     1120 * Purpose   :
     1121 * Parameters:
     1122 * Variables :
     1123 * Result    :
     1124 * Remark    :
     1125 * Status    : UNTESTED STUB
     1126 *
     1127 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1128 *****************************************************************************/
     1129
     1130ODINFUNCTION0(int,OS2WSAUnhookBlockingHook)
     1131{
     1132  return WSAUnhookBlockingHook();
     1133}
     1134
     1135
     1136/*****************************************************************************
     1137 * Name      :
     1138 * Purpose   :
     1139 * Parameters:
     1140 * Variables :
     1141 * Result    :
     1142 * Remark    :
     1143 * Status    : UNTESTED STUB
     1144 *
     1145 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1146 *****************************************************************************/
     1147
     1148ODINFUNCTION1(PFN,OS2WSASetBlockingHook,
     1149              PFN,lpBlockFunc)
     1150{
     1151  return(WSASetBlockingHook(lpBlockFunc));
     1152}
     1153
     1154
     1155/*****************************************************************************
     1156 * Name      :
     1157 * Purpose   :
     1158 * Parameters:
     1159 * Variables :
     1160 * Result    :
     1161 * Remark    :
     1162 * Status    : UNTESTED STUB
     1163 *
     1164 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1165 *****************************************************************************/
     1166
     1167ODINFUNCTION0(int,OS2WSACancelBlockingCall)
     1168{
     1169  return(WSACancelBlockingCall());
     1170}
     1171
     1172
     1173/*****************************************************************************
     1174 * Name      :
     1175 * Purpose   :
     1176 * Parameters:
     1177 * Variables :
     1178 * Result    :
     1179 * Remark    :
     1180 * Status    : UNTESTED STUB
     1181 *
     1182 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1183 *****************************************************************************/
     1184
     1185ODINFUNCTION6(LHANDLE,OS2WSAAsyncGetServByName,
     1186              HWND,hWnd,
     1187              u_int,wMsg,
     1188              const char *,name,
     1189              const char *,proto,
     1190              char *,buf,
     1191              int,buflen)
     1192{
     1193  int   rc;
     1194  HWND  hwndOS2 = Win32ToOS2Handle(hWnd);
     1195  ULONG ulNewID;
     1196
     1197  if (hwndRelay == NULL) // already initialized ?
     1198    hwndRelay = RelayInitialize(hwndOS2);
     1199
     1200  // add entry to list, we need to store both our temp buffer and the apps buffer
     1201  ulNewID = RelayAlloc(hWnd,
     1202                       wMsg,
     1203                       ASYNCREQUEST_GETSERVBYNAME,
     1204                       FALSE,
     1205                       buf);
     1206
     1207  // call pmwsock function, will fill our temp buffer
     1208  rc = WSAAsyncGetServByName(hwndRelay,
     1209                              ulNewID,
     1210                              name,
     1211                              proto,
     1212                              buf,
     1213                              buflen);
     1214
     1215  // if an error occurs, free the allocated relay entry
     1216  if (rc == SOCKET_ERROR)
     1217    RelayFree(ulNewID);
     1218
     1219  return (rc);
     1220}
     1221
     1222
     1223/*****************************************************************************
     1224 * Name      :
     1225 * Purpose   :
     1226 * Parameters:
     1227 * Variables :
     1228 * Result    :
     1229 * Remark    :
     1230 * Status    : UNTESTED STUB
     1231 *
     1232 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1233 *****************************************************************************/
     1234
     1235ODINFUNCTION6(LHANDLE,OS2WSAAsyncGetServByPort,
     1236              HWND,hWnd,
     1237              u_int,wMsg,
     1238              int,port,
     1239              const char *,proto,
     1240              char *,buf,
     1241              int,buflen)
     1242{
     1243  int   rc;
     1244  HWND  hwndOS2 = Win32ToOS2Handle(hWnd);
     1245  ULONG ulNewID;
     1246
     1247  if (hwndRelay == NULL) // already initialized ?
     1248    hwndRelay = RelayInitialize(hwndOS2);
     1249
     1250  // add entry to list, we need to store both our temp buffer and the apps buffer
     1251  ulNewID = RelayAlloc(hWnd,
     1252                       wMsg,
     1253                       ASYNCREQUEST_GETSERVBYPORT,
     1254                       FALSE,
     1255                       buf);
     1256
     1257  // call pmwsock function, will fill our temp buffer
     1258  rc = WSAAsyncGetServByPort(hwndRelay,
     1259                             ulNewID,
     1260                             port,
     1261                             proto,
     1262                             buf,
     1263                             buflen);
     1264
     1265  // if an error occurs, free the allocated relay entry
     1266  if (rc == SOCKET_ERROR)
     1267    RelayFree(ulNewID);
     1268
     1269  return rc;
     1270}
     1271
     1272
     1273/*****************************************************************************
     1274 * Name      :
     1275 * Purpose   :
     1276 * Parameters:
     1277 * Variables :
     1278 * Result    :
     1279 * Remark    :
     1280 * Status    : UNTESTED STUB
     1281 *
     1282 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1283 *****************************************************************************/
     1284
     1285ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetProtoByName,
     1286              HWND,hWnd,
     1287              u_int,wMsg,
     1288              const char *,name,
     1289              char *,buf,
     1290              int,buflen)
     1291{
     1292  int   rc;
     1293  HWND  hwndOS2 = Win32ToOS2Handle(hWnd);
     1294  ULONG ulNewID;
     1295
     1296  if (hwndRelay == NULL) // already initialized ?
     1297    hwndRelay = RelayInitialize(hwndOS2);
     1298
     1299  // add entry to list, we need to store both our temp buffer and the apps buffer
     1300  ulNewID = RelayAlloc(hWnd,
     1301                       wMsg,
     1302                       ASYNCREQUEST_GETPROTOBYNAME,
     1303                       FALSE,
     1304                       buf);
     1305
     1306  // call pmwsock function, will fill our temp buffer
     1307  rc = WSAAsyncGetProtoByName(hwndRelay,
     1308                              ulNewID,
     1309                              name,
     1310                              buf,
     1311                              buflen);
     1312
     1313  // if an error occurs, free the allocated relay entry
     1314  if (rc == SOCKET_ERROR)
     1315    RelayFree(ulNewID);
     1316
     1317  return (rc);
     1318}
     1319
     1320
     1321/*****************************************************************************
     1322 * Name      :
     1323 * Purpose   :
     1324 * Parameters:
     1325 * Variables :
     1326 * Result    :
     1327 * Remark    :
     1328 * Status    : UNTESTED STUB
     1329 *
     1330 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1331 *****************************************************************************/
     1332
     1333ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetProtoByNumber,
     1334              HWND,hWnd,
     1335              u_int,wMsg,
     1336              int,number,
     1337              char *,buf,
     1338              int,buflen)
     1339{
     1340  int   rc;
     1341  HWND  hwndOS2 = Win32ToOS2Handle(hWnd);
     1342  ULONG ulNewID;
     1343
     1344  if (hwndRelay == NULL) // already initialized ?
     1345    hwndRelay = RelayInitialize(hwndOS2);
     1346
     1347  // add entry to list, we need to store both our temp buffer and the apps buffer
     1348  ulNewID = RelayAlloc(hWnd,
     1349                       wMsg,
     1350                       ASYNCREQUEST_GETPROTOBYNUMBER,
     1351                       FALSE,
     1352                       buf);
     1353
     1354  // call pmwsock function, will fill our temp buffer
     1355  rc = WSAAsyncGetProtoByNumber(hwndRelay,
     1356                                ulNewID,
     1357                                number,
     1358                                buf,
     1359                                buflen);
     1360
     1361  // if an error occurs, free the allocated relay entry
     1362  if (rc == SOCKET_ERROR)
     1363    RelayFree(ulNewID);
     1364
     1365  return rc;
     1366}
     1367
     1368
     1369/*****************************************************************************
     1370 * Name      :
     1371 * Purpose   :
     1372 * Parameters:
     1373 * Variables :
     1374 * Result    :
     1375 * Remark    :
     1376 * Status    : UNTESTED STUB
     1377 *
     1378 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1379 *****************************************************************************/
     1380
     1381ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetHostByName,
     1382              HWND,hWnd,
     1383              u_int,wMsg,
     1384              const char *,name,
     1385              char *,buf,
     1386              int,buflen)
     1387{
     1388  int   rc;
     1389  HWND  hwndOS2 = Win32ToOS2Handle(hWnd);
     1390  ULONG ulNewID;
     1391
     1392  dprintf(("WSAAsyncGetHostByName %s", name));
     1393
     1394  if (hwndRelay == NULL) // already initialized ?
     1395    hwndRelay = RelayInitialize(hwndOS2);
     1396
     1397  // add entry to list, we need to store both our temp buffer and the apps buffer
     1398  ulNewID = RelayAlloc(hWnd,
     1399                       wMsg,
     1400                       ASYNCREQUEST_GETHOSTBYNAME,
     1401                       FALSE,
     1402                       (PVOID)buf, (PVOID)buflen);
     1403
     1404  // call pmwsock function, will fill our temp buffer
     1405  rc = WSAAsyncGetHostByName(hwndRelay,
     1406                             ulNewID,
     1407                             name,
     1408                             buf,
     1409                             buflen);
     1410
     1411  // if an error occurs, free the allocated relay entry
     1412  if (rc == SOCKET_ERROR)
     1413    RelayFree(ulNewID);
     1414
     1415  return rc;
     1416}
     1417
     1418
     1419/*****************************************************************************
     1420 * Name      :
     1421 * Purpose   :
     1422 * Parameters:
     1423 * Variables :
     1424 * Result    :
     1425 * Remark    :
     1426 * Status    : UNTESTED STUB
     1427 *
     1428 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1429 *****************************************************************************/
     1430
     1431ODINFUNCTION7(LHANDLE,OS2WSAAsyncGetHostByAddr,
     1432              HWND,hWnd,
     1433              u_int,wMsg,
    10271434              const char *,addr,
    10281435              int,len,
    1029               int,type)
    1030 {
    1031     LPWSINFO pwsi = WINSOCK_GetIData();
    1032 
    1033     if( pwsi )
    1034     {
    1035         struct hostent* host;
    1036         if( (host = gethostbyaddr((char *)addr, len, type)) != NULL ) {
    1037                 if( WS_dup_he(pwsi, host) ) {
    1038                         WSASetLastError(NO_ERROR);
    1039                         return pwsi->he;
    1040                 }
    1041                 else    WSASetLastError(WSAENOBUFS);
    1042         }
    1043         else    WSASetLastError((h_errno < 0) ? wsaErrno() : wsaHerrno());
    1044     }
    1045     else WSASetLastError(WSANOTINITIALISED);
    1046     return NULL;
    1047 }
    1048 //******************************************************************************
    1049 //******************************************************************************
    1050 ODINFUNCTION1(ws_hostent *,OS2gethostbyname,
    1051               const char *,name)
    1052 {
    1053     LPWSINFO pwsi = WINSOCK_GetIData();
    1054 
    1055     if( pwsi )
    1056     {
    1057         struct hostent*     host;
    1058         if( (host = gethostbyname((char *)name)) != NULL ) {
    1059                 if( WS_dup_he(pwsi, host) ) {
    1060                         WSASetLastError(NO_ERROR);
    1061                         return pwsi->he;
    1062                 }
    1063                 else    WSASetLastError(WSAENOBUFS);
    1064         }
    1065         else    WSASetLastError((h_errno < 0) ? wsaErrno() : wsaHerrno());
    1066     }
    1067     else WSASetLastError(WSANOTINITIALISED);
    1068     return NULL;
    1069 }
    1070 //******************************************************************************
    1071 //******************************************************************************
    1072 ODINFUNCTION2(struct ws_servent *,OS2getservbyport,
    1073               int,              port,
    1074               const char *,     proto)
    1075 {
    1076     LPWSINFO pwsi = WINSOCK_GetIData();
    1077 
    1078     if( pwsi )
    1079     {
    1080         struct servent* serv;
    1081         if( (serv = getservbyport(port, pwsi->buffer)) != NULL ) {
    1082                 if( WS_dup_se(pwsi, serv) ) {
    1083                         WSASetLastError(NO_ERROR);
    1084                         return pwsi->se;
    1085                 }
    1086                 else    WSASetLastError(WSAENOBUFS);
    1087         }
    1088         else    WSASetLastError(WSANO_DATA);
    1089     }
    1090     else WSASetLastError(WSANOTINITIALISED);
    1091     return NULL;
    1092 }
    1093 //******************************************************************************
    1094 //******************************************************************************
    1095 ODINFUNCTION2(struct ws_servent *,OS2getservbyname,
    1096               const char *,     name,
    1097               const char *,     proto)
    1098 {
    1099     LPWSINFO pwsi = WINSOCK_GetIData();
    1100 
    1101     if( pwsi )
    1102     {
    1103         struct servent*     serv;
    1104         if( (serv = getservbyname(pwsi->buffer, pwsi->buffer)) != NULL ) {
    1105                 if( WS_dup_se(pwsi, serv) ) {
    1106                         WSASetLastError(NO_ERROR);
    1107                         return pwsi->se;
    1108                 }
    1109                 else    WSASetLastError(WSAENOBUFS);
    1110         }
    1111         else    WSASetLastError(WSANO_DATA);
    1112     }
    1113     else WSASetLastError(WSANOTINITIALISED);
    1114     return NULL;
    1115 }
    1116 //******************************************************************************
    1117 //******************************************************************************
    1118 ODINFUNCTION1(struct ws_protoent *,OS2getprotobynumber,
    1119               int,number)
    1120 {
    1121     LPWSINFO pwsi = WINSOCK_GetIData();
    1122 
    1123     if( pwsi )
    1124     {
    1125         struct protoent* proto;
    1126         if( (proto = getprotobynumber(number)) != NULL ) {
    1127                 if( WS_dup_pe(pwsi, proto) ) {
    1128                         WSASetLastError(NO_ERROR);
    1129                         return pwsi->pe;
    1130                 }
    1131                 else    WSASetLastError(WSAENOBUFS);
    1132         }
    1133         else    WSASetLastError(WSANO_DATA);
    1134     }
    1135     else WSASetLastError(WSANOTINITIALISED);
    1136     return NULL;
    1137 }
    1138 //******************************************************************************
    1139 //******************************************************************************
    1140 ODINFUNCTION1(struct ws_protoent *,OS2getprotobyname,
    1141               const char *,name)
    1142 {
    1143     LPWSINFO pwsi = WINSOCK_GetIData();
    1144 
    1145     if( pwsi )
    1146     {
    1147         struct protoent * proto;
    1148         if( (proto = getprotobyname((char *)name)) != NULL ) {
    1149                 if(WS_dup_pe(pwsi, proto)) {
    1150                         WSASetLastError(NO_ERROR);
    1151                         return pwsi->pe;
    1152                 }
    1153                 else    WSASetLastError(WSAENOBUFS);
    1154         }
    1155         else    WSASetLastError((h_errno < 0) ? wsaErrno() : wsaHerrno());
    1156     }
    1157     else WSASetLastError(WSANOTINITIALISED);
    1158     return NULL;
    1159 }
    1160 //******************************************************************************
    1161 //******************************************************************************
     1436              int,type,
     1437              char *,buf,
     1438              int,buflen)
     1439{
     1440  int   rc;
     1441  HWND  hwndOS2 = Win32ToOS2Handle(hWnd);
     1442  ULONG ulNewID;
     1443
     1444  if (hwndRelay == NULL) // already initialized ?
     1445    hwndRelay = RelayInitialize(hwndOS2);
     1446
     1447  // add entry to list, we need to store both our temp buffer and the apps buffer
     1448  ulNewID = RelayAlloc(hWnd,
     1449                       wMsg,
     1450                       ASYNCREQUEST_GETHOSTBYADDR,
     1451                       FALSE,
     1452                       buf);
     1453
     1454  // call pmwsock function, will fill our temp buffer
     1455  rc = WSAAsyncGetHostByAddr(hwndRelay,
     1456                             ulNewID,
     1457                             addr,
     1458                             len,
     1459                             type,
     1460                             buf,
     1461                             buflen);
     1462
     1463  // if an error occurs, free the allocated relay entry
     1464  if (rc == SOCKET_ERROR)
     1465    RelayFree(ulNewID);
     1466
     1467  return (rc);
     1468}
     1469
     1470
     1471/*****************************************************************************
     1472 * Name      :
     1473 * Purpose   :
     1474 * Parameters:
     1475 * Variables :
     1476 * Result    :
     1477 * Remark    :
     1478 * Status    : UNTESTED STUB
     1479 *
     1480 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1481 *****************************************************************************/
     1482
     1483ODINFUNCTION1(int,OS2WSACancelAsyncRequest,
     1484              LHANDLE,hAsyncTaskHandle)
     1485{
     1486  return(WSACancelAsyncRequest(hAsyncTaskHandle));
     1487}
     1488
     1489
     1490/*****************************************************************************
     1491 * Name      :
     1492 * Purpose   :
     1493 * Parameters:
     1494 * Variables :
     1495 * Result    :
     1496 * Remark    :
     1497 * Status    : UNTESTED STUB
     1498 *
     1499 * Author    : Patrick Haller [Thu, 1999/11/25 23:00]
     1500 *****************************************************************************/
     1501
     1502ODINFUNCTION4(int,OS2WSAAsyncSelect,
     1503              SOCKET,s,
     1504              HWND,hWnd,
     1505              u_int,wMsg,
     1506              long,lEvent)
     1507{
     1508  int   rc;
     1509//  int   iError;
     1510  HWND  hwndOS2 = Win32ToOS2Handle(hWnd);
     1511  ULONG ulNewID;
     1512
     1513  if (hwndRelay == NULL) // already initialized ?
     1514    hwndRelay = RelayInitialize(hwndOS2);
     1515
     1516  /* @@@PH: our source window doesn't seem to have an anchor block.
     1517            Docs suggest we've missed to call WinInitialize on the
     1518            caller thread.
     1519
     1520            Cause however is the Open32 handle is (of course!) invalid
     1521            in plain PM Window Manager! -> use DAPWSOCK
     1522
     1523            Unfortunately, DAPWSOCK calls WinQueryAnchorBlock(hOpen32), too.
     1524            So, we're stuck until I resolve hWnd to it's valid PM
     1525            counterpart.
     1526
     1527            new problem: we've ultimately got to use PostMessageA instead
     1528            anything else. => create invisible msg relay window:
     1529            - hMsg = registerMessage(hWnd, wMsg)
     1530            - call WSAAsyncSelect with object window handle
     1531            - overwrite hWnd relay for "same handles"
     1532   */
     1533
     1534  // add event to list or remove any list entry in case of WSAAsyncSelect(hwnd,0,0)
     1535  if ( (wMsg == 0) && (lEvent == 0) )
     1536  {
     1537    // remove entry from list
     1538    RelayFreeByHwnd(hWnd);
     1539  }
     1540  else
     1541    // add entry to list
     1542    ulNewID = RelayAlloc(hWnd,
     1543                         wMsg,
     1544                         ASYNCREQUEST_SELECT,
     1545                         FALSE); //SvL: allow multiple selects -> pmwsock should fail if it not allowed
     1546//                         TRUE);
     1547
     1548  rc = WSAAsyncSelect(s,
     1549                      hwndRelay,
     1550                      ulNewID,
     1551                      lEvent);
     1552
     1553  // if an error occurs, free the allocated relay entry
     1554  if (rc == SOCKET_ERROR)
     1555    RelayFree(ulNewID);
     1556
     1557  return (rc);
     1558}
  • trunk/src/wsock32/wsock32.def

    r3195 r3199  
    1 ; $Id: wsock32.def,v 1.16 2000-03-22 18:46:20 sandervl Exp $
     1/* $Id: wsock32.def,v 1.17 2000-03-22 20:07:29 sandervl Exp $ */
    22
    33;Created by BLAST for IBM's compiler
     
    4848; ----------------------------
    4949
    50    WSAAsyncSelect              = _WSAAsyncSelect@16                    @101
    51    WSAAsyncGetHostByAddr       = _WSAAsyncGetHostByAddr@28             @102
    52    WSAAsyncGetHostByName       = _WSAAsyncGetHostByName@20             @103
    53    WSAAsyncGetProtoByNumber    = _WSAAsyncGetProtoByNumber@20          @104
    54    WSAAsyncGetProtoByName      = _WSAAsyncGetProtoByName@20            @105
    55    WSAAsyncGetServByPort       = _WSAAsyncGetServByPort@24             @106
    56    WSAAsyncGetServByName       = _WSAAsyncGetServByName@24             @107
    57    WSACancelAsyncRequest       = _WSACancelAsyncRequest@4              @108
    58    WSASetBlockingHook          = _WSASetBlockingHook@4                 @109
    59    WSAUnhookBlockingHook       = _WSAUnhookBlockingHook@0              @110
    60    WSAGetLastError             = _WSAGetLastError@0                    @111
    61    WSASetLastError             = _WSASetLastError@4                    @112
    62    WSACancelBlockingCall       = _WSACancelBlockingCall@0              @113
    63    WSAIsBlocking               = _WSAIsBlocking@0                      @114
    64    WSAStartup                  = _WSAStartup@8                         @115
    65    WSACleanup                  = _WSACleanup@0                         @116
    66    __WSAFDIsSet                = ___WSAFDIsSet@8                       @151
     50   WSAAsyncSelect              = _OS2WSAAsyncSelect@16                    @101
     51   WSAAsyncGetHostByAddr       = _OS2WSAAsyncGetHostByAddr@28             @102
     52   WSAAsyncGetHostByName       = _OS2WSAAsyncGetHostByName@20             @103
     53   WSAAsyncGetProtoByNumber    = _OS2WSAAsyncGetProtoByNumber@20          @104
     54   WSAAsyncGetProtoByName      = _OS2WSAAsyncGetProtoByName@20            @105
     55   WSAAsyncGetServByPort       = _OS2WSAAsyncGetServByPort@24             @106
     56   WSAAsyncGetServByName       = _OS2WSAAsyncGetServByName@24             @107
     57   WSACancelAsyncRequest       = _OS2WSACancelAsyncRequest@4              @108
     58   WSASetBlockingHook          = _OS2WSASetBlockingHook@4                 @109
     59   WSAUnhookBlockingHook       = _OS2WSAUnhookBlockingHook@0              @110
     60   WSAGetLastError             = _OS2WSAGetLastError@0                    @111
     61   WSASetLastError             = _OS2WSASetLastError@4                    @112
     62   WSACancelBlockingCall       = _OS2WSACancelBlockingCall@0              @113
     63   WSAIsBlocking               = _OS2WSAIsBlocking@0                      @114
     64   WSAStartup                  = _OS2WSAStartup@8                         @115
     65   WSACleanup                  = _OS2WSACleanup@0                         @116
     66   __WSAFDIsSet                = _OS2__WSAFDIsSet@8                       @151
    6767
    6868   rcmd                        = _OS2rcmd@24                              @1102
    6969   rexec                       = _OS2rexec@24                             @1103
    70    WSARecvEx                   = _WSARecvEx@16                         @1107
     70   WSARecvEx                   = _OS2WSARecvEx@16                         @1107
    7171   s_perror                    = _OS2s_perror@8                           @1108
    7272
  • trunk/src/wsock32/wsock32.h

    r3195 r3199  
    1 /* $Id: wsock32.h,v 1.11 2000-03-22 18:46:20 sandervl Exp $ */
     1; $Id: wsock32.h,v 1.12 2000-03-22 20:07:30 sandervl Exp $
    22
    33/* WSOCK32.H--definitions & conversions for Odin's wsock32.dll.
     
    1616#define _WINSOCK32CONST_
    1717
    18 #include <sys\socket.h>
    19 #include <sys\ioctl.h>
    20 #include <netdb.h>
    21 #include <netinet\in.h>
    22 #include <netinet\tcp.h>
    23 #include <nerrno.h>
    24 #include <sys\time.h>
    25 
    26 /*
    27  * Socket state bits.
    28  */
    29 #define SS_NOFDREF              0x0001  /* no file table ref any more */
    30 #define SS_ISCONNECTED          0x0002  /* socket connected to a peer */
    31 #define SS_ISCONNECTING         0x0004  /* in process of connecting to peer */
    32 #define SS_ISDISCONNECTING      0x0008  /* in process of disconnecting */
    33 #define SS_CANTSENDMORE         0x0010  /* can't send more data to peer */
    34 #define SS_CANTRCVMORE          0x0020  /* can't receive more data from peer */
    35 #define SS_RCVATMARK            0x0040  /* at mark on input */
    36 
    37 #define SS_NBIO                 0x0100  /* non-blocking ops */
    38 #define SS_ASYNC                0x0200  /* async i/o notify */
    39 #define SS_ISCONFIRMING         0x0400  /* deciding to accept connection req */
    40 
    41 #define SS_INCOMP               0x0800  /* unaccepted, incomplete connection */
    42 #define SS_COMP                 0x1000  /* unaccepted, complete connection */
    43 #define SS_ISDISCONNECTED       0x2000  /* socket disconnected from peer */
    44 
    45 //socketopt options
    46 #define SO_DONTLINGER   (u_int)(~SO_LINGER)
    47 
    48 // WSAAsyncSelect flags
    49 #define FD_READ         0x01
    50 #define FD_WRITE        0x02
    51 #define FD_OOB          0x04
    52 #define FD_ACCEPT       0x08
    53 #define FD_CONNECT      0x10
    54 #define FD_CLOSE        0x20
    55 
    56 #define SOCKET_ERROR            -1
    57 #define NO_ERROR                0
    58 
    59 #define WSABASEERR              10000
    60 
    61 #define WSAEINTR                (WSABASEERR+4)
    62 #define WSAEBADF                (WSABASEERR+9)
    63 #define WSAEACCES               (WSABASEERR+13)
    64 #define WSAEFAULT               (WSABASEERR+14)
    65 #define WSAEINVAL               (WSABASEERR+22)
    66 #define WSAEMFILE               (WSABASEERR+24)
    67 
    68 #define WSAEWOULDBLOCK          (WSABASEERR+35)
    69 #define WSAEINPROGRESS          (WSABASEERR+36)
    70 #define WSAEALREADY             (WSABASEERR+37)
    71 #define WSAENOTSOCK             (WSABASEERR+38)
    72 #define WSAEDESTADDRREQ         (WSABASEERR+39)
    73 #define WSAEMSGSIZE             (WSABASEERR+40)
    74 #define WSAEPROTOTYPE           (WSABASEERR+41)
    75 #define WSAENOPROTOOPT          (WSABASEERR+42)
    76 #define WSAEPROTONOSUPPORT      (WSABASEERR+43)
    77 #define WSAESOCKTNOSUPPORT      (WSABASEERR+44)
    78 #define WSAEOPNOTSUPP           (WSABASEERR+45)
    79 #define WSAEPFNOSUPPORT         (WSABASEERR+46)
    80 #define WSAEAFNOSUPPORT         (WSABASEERR+47)
    81 #define WSAEADDRINUSE           (WSABASEERR+48)
    82 #define WSAEADDRNOTAVAIL        (WSABASEERR+49)
    83 #define WSAENETDOWN             (WSABASEERR+50)
    84 #define WSAENETUNREACH          (WSABASEERR+51)
    85 #define WSAENETRESET            (WSABASEERR+52)
    86 #define WSAECONNABORTED         (WSABASEERR+53)
    87 #define WSAECONNRESET           (WSABASEERR+54)
    88 #define WSAENOBUFS              (WSABASEERR+55)
    89 #define WSAEISCONN              (WSABASEERR+56)
    90 #define WSAENOTCONN             (WSABASEERR+57)
    91 #define WSAESHUTDOWN            (WSABASEERR+58)
    92 #define WSAETOOMANYREFS         (WSABASEERR+59)
    93 #define WSAETIMEDOUT            (WSABASEERR+60)
    94 #define WSAECONNREFUSED         (WSABASEERR+61)
    95 #define WSAELOOP                (WSABASEERR+62)
    96 #define WSAENAMETOOLONG         (WSABASEERR+63)
    97 #define WSAEHOSTDOWN            (WSABASEERR+64)
    98 #define WSAEHOSTUNREACH         (WSABASEERR+65)
    99 #define WSAENOTEMPTY            (WSABASEERR+66)
    100 #define WSAEPROCLIM             (WSABASEERR+67)
    101 #define WSAEUSERS               (WSABASEERR+68)
    102 #define WSAEDQUOT               (WSABASEERR+69)
    103 #define WSAESTALE               (WSABASEERR+70)
    104 #define WSAEREMOTE              (WSABASEERR+71)
    105 #define WSASYSNOTREADY          (WSABASEERR+91)
    106 #define WSAVERNOTSUPPORTED      (WSABASEERR+92)
    107 #define WSANOTINITIALISED       (WSABASEERR+93)
    108 #define WSAHOST_NOT_FOUND       (WSABASEERR+1001)
    109 #define WSATRY_AGAIN            (WSABASEERR+1002)
    110 #define WSANO_RECOVERY          (WSABASEERR+1003)
    111 #define WSANO_DATA              (WSABASEERR+1004)
    112 #define WSANO_ADDRESS           WSANO_DATA
    113 
    114 typedef u_int           SOCKET;
    115 
    116 #define FD_SETSIZE      64
    117 
    118 #pragma pack(1)
    119 
    120 #define WSADESCRIPTION_LEN      256
    121 #define WSASYS_STATUS_LEN       128
    122 
    123 typedef struct WSAData {
    124         USHORT              wVersion;
    125         USHORT              wHighVersion;
    126         char                szDescription[WSADESCRIPTION_LEN+1];
    127         char                szSystemStatus[WSASYS_STATUS_LEN+1];
    128         unsigned short      iMaxSockets;
    129         unsigned short      iMaxUdpDg;
    130         char *              lpVendorInfo;
    131 } WSADATA;
    132 typedef WSADATA *PWSADATA;
    133 typedef WSADATA *LPWSADATA;
    134 
    135 typedef struct ws_fd_set {
    136         u_int   fd_count;
    137         SOCKET  fd_array[FD_SETSIZE];
    138 } _ws_fd_set;
    13918
    14019/*
    14120 * Structure used for manipulating linger option.
    14221 */
    143 typedef struct  ws_linger {
     22struct  Wlinger {
    14423        u_short l_onoff;                /* option on/off */
    14524        u_short l_linger;               /* linger time */
    146 } _ws_linger;
     25};
     26
    14727
    14828/*
     
    15232 */
    15333
    154 typedef struct ws_hostent
     34struct  Whostent {
     35        char     * h_name;           /* official name of host */
     36        char     *  * h_aliases;  /* alias list */
     37        short   h_addrtype;             /* host address type */
     38        short   h_length;               /* length of address */
     39        char     *  * h_addr_list; /* list of addresses */
     40#define h_addr  h_addr_list[0]          /* address, for backward compat */
     41};
     42
     43/*
     44 * It is assumed here that a network number
     45 * fits in 32 bits.
     46 */
     47struct  Wnetent {
     48        char     * n_name;           /* official name of net */
     49        char     *  * n_aliases;  /* alias list */
     50        short   n_addrtype;             /* net address type */
     51        u_long  n_net;                  /* network # */
     52};
     53typedef struct Whostent WHOSTENT;
     54typedef WHOSTENT *PWHOSTENT;
     55
     56struct  Wservent {
     57        char     * s_name;           /* official service name */
     58        char     *  * s_aliases;  /* alias list */
     59        short   s_port;                 /* port # */
     60        char     * s_proto;          /* protocol to use */
     61};
     62typedef struct Wservent WSERVENT;
     63typedef WSERVENT *PWSERVENT;
     64
     65struct  Wprotoent {
     66        char     * p_name;           /* official protocol name */
     67        char     *  * p_aliases;  /* alias list */
     68        short   p_proto;                /* protocol # */
     69};
     70typedef struct Wprotoent WPROTOENT;
     71typedef WPROTOENT *PWPROTOENT;
     72
     73typedef struct tagWsockThreadData
    15574{
    156         char *  h_name;         /* official name of host */
    157         char ** h_aliases;      /* alias list */
    158         INT16   h_addrtype;     /* host address type */
    159         INT16   h_length;       /* length of address */
    160         char ** h_addr_list;    /* list of addresses from name server */
    161 } _ws_hostent;
     75  int              dwLastError; // Get/SetLastError
     76  struct Whostent  whsnt;       // database conversion buffers
     77  struct Wservent  wsvnt;
     78  struct Wprotoent wptnt;
     79  struct Wnetent   wntnt;
     80  struct Wlinger   wlinger;
     81} WSOCKTHREADDATA, *PWSOCKTHREADDATA;
    16282
    163 typedef struct ws_protoent
    164 {
    165         char *  p_name;         /* official protocol name */
    166         char ** p_aliases;      /* alias list */
    167         INT16   p_proto;        /* protocol # */
    168 } _ws_protoent;
     83// internal prototype
     84PWSOCKTHREADDATA iQueryWsockThreadData(void);
    16985
    170 typedef struct ws_servent
    171 {
    172         char *  s_name;         /* official service name */
    173         char ** s_aliases;      /* alias list */
    174         INT16   s_port;         /* port # */
    175         char *  s_proto;        /* protocol to use */
    176 } _ws_servent;
    177 
    178 typedef struct ws_netent
    179 {
    180         char *  n_name;         /* official name of net */
    181         char ** n_aliases;      /* alias list */
    182         INT16   n_addrtype;     /* net address type */
    183         INT     n_net;          /* network # */
    184 } _ws_netent;
    185 
    186 #pragma pack()
    187 
    188 #define WS_MAX_SOCKETS_PER_PROCESS      128     /* reasonable guess */
    189 #define WS_MAX_UDP_DATAGRAM             1024
    190 
    191 #define WSI_BLOCKINGCALL        0x00000001      /* per-thread info flags */
    192 #define WSI_BLOCKINGHOOK        0x00000002      /* 32-bit callback */
    193 
    194 typedef struct _WSINFO
    195 {
    196   DWORD                 dwThisThread;
    197   struct _WSINFO       *lpNextIData;
    198 
    199   unsigned              flags;
    200   INT16                 num_startup;            /* reference counter */
    201   INT16                 num_async_rq;
    202   INT16                 last_free;              /* entry in the socket table */
    203   USHORT                buflen;
    204   char*                 buffer;                 /* allocated from char * heap */
    205   struct ws_hostent     *he;
    206   int                   helen;
    207   struct ws_servent     *se;
    208   int                   selen;
    209   struct ws_protoent    *pe;
    210   int                   pelen;
    211   char*                 dbuffer;                /* buffer for dummies (32 bytes) */
    212 
    213   DWORD                 blocking_hook;
    214 } WSINFO, *LPWSINFO;
    215 
    216 void WIN32API WSASetLastError(int iError);
    217 int  WIN32API WSAGetLastError(void);
    218 BOOL WIN32API WSAIsBlocking(void);
    219 int  WIN32API WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);
    22086
    22187extern BOOL fWSAInitialized;
    22288
    223 UINT wsaErrno();
    224 UINT wsaHerrno();
     89void WIN32API OS2WSASetLastError(int iError);
    22590
    226 #define CURRENT_THREAD -1
    227 void WSASetBlocking(BOOL fBlock, HANDLE tid = CURRENT_THREAD);
     91int  WIN32API OS2WSAGetLastError(void);
    22892
    229 void WINSOCK_DeleteIData(void);
    230 BOOL WINSOCK_CreateIData(void);
    231 LPWSINFO WINSOCK_GetIData(HANDLE tid = CURRENT_THREAD);
     93BOOL WIN32API OS2WSAIsBlocking(void);
    23294
    23395#endif  /* _WINSOCK32CONST_ */
Note: See TracChangeset for help on using the changeset viewer.