Changeset 1690 for trunk/src


Ignore:
Timestamp:
Nov 10, 1999, 5:36:16 PM (26 years ago)
Author:
phaller
Message:

Fix: SetLastError/GetLastError behaviour changed

Location:
trunk/src/wsock32
Files:
3 edited

Legend:

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

    r1588 r1690  
    1 /* $Id: async.cpp,v 1.12 1999-11-04 01:13:41 phaller Exp $ */
     1/* $Id: async.cpp,v 1.13 1999-11-10 16:36:15 phaller Exp $ */
    22
    33/*
     
    4848
    4949ODINDEBUGCHANNEL(WSOCK32-ASYNC)
     50
     51
     52typedef enum tagSocketStatus
     53{
     54  SOCKSTAT_UNKNOWN = 0,     // unknown socket state
     55  SOCKSTAT_NORMAL,          // normal socket state
     56  SOCKSTAT_CONNECT_PENDING  // non-blocking connect attempted
     57};
     58
     59typedef struct tagSocketAsync
     60{
     61  int hSocket; /* operating system socket descriptor */
     62  int iStatus;
     63} SOCKETASYNC, *PSOCKETASYNC;
    5064
    5165
     
    122136void _Optlink WorkerThreadProc(void* pParam);
    123137BOOL _System PostMessageA(HWND hwnd, UINT ulMessage, WPARAM wParam, LPARAM lParam);
    124 
    125 void _System SetLastError(int iError);
    126 int  _System GetLastError(void);
    127 #define WSASetLastError(a) SetLastError(a)
    128138
    129139
     
    10001010  ulEvent = (ULONG) pRequest->ul2;
    10011011
     1012  //@@@PH to do
     1013  // 1. automatically set socket to non-blocking mode
     1014
    10021015  //@@@PH how to implement other events?
     1016
    10031017
    10041018  // finally do the select!
  • trunk/src/wsock32/wsock32.cpp

    r1468 r1690  
    1 /* $Id: wsock32.cpp,v 1.11 1999-10-27 08:38:05 phaller Exp $ */
     1/* $Id: wsock32.cpp,v 1.12 1999-11-10 16:36:15 phaller Exp $ */
    22
    33/*
     
    5555#include <sys/time.h>
    5656#include <win32type.h>
     57#include <wprocess.h>
     58#include <heapstring.h>
     59
    5760#include "wsock32const.h"
    5861#include "wsock32.h"
     
    7780#undef FD_ISSET
    7881#define FD_ISSET(x,y) WFD_SET(x,y)
     82#endif
     83
     84#ifndef ERROR_SUCCESS
     85#define ERROR_SUCCESS 0
    7986#endif
    8087
     
    117124
    118125// @@@PH not reentrancy proof
    119 static WHOSTENT whsnt;
    120 static WSERVENT wsvnt;
    121 static WPROTOENT wptnt;
     126//<_sandervl> phs: I already have a rewrite of the error support in wsock. Use the
     127//            GetThreadTHDB export in kernel32 and add a DWORD to the thread
     128//            structure in include\win\thread.h
     129
     130typedef struct tagWsockThreadData
     131{
     132  DWORD     dwLastError; // Get/SetLastError
     133  WHOSTENT  whsnt;       // database conversion buffers
     134  WSERVENT  wsvnt;
     135  WPROTOENT wptnt;
     136} WSOCKTHREADDATA, *PWSOCKTHREADDATA;
     137
     138static WSOCKTHREADDATA wstdFallthru; // for emergency only
     139
     140
     141/*****************************************************************************
     142 * Name      :
     143 * Purpose   :
     144 * Parameters:
     145 * Variables :
     146 * Result    :
     147 * Remark    : free memory when thread dies
     148 * Status    : UNTESTED STUB
     149 *
     150 * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
     151 *****************************************************************************/
     152
     153PWSOCKTHREADDATA iQueryWsockThreadData(void)
     154{
     155  struct _THDB*     pThreadDB = (struct _THDB*)GetThreadTHDB();
     156  PWSOCKTHREADDATA pwstd;
     157
     158  // check for existing pointer
     159  if (pThreadDB != NULL)
     160  {
     161    if (pThreadDB->pWsockData == NULL)
     162    {
     163      // allocate on demand + initialize
     164      pwstd = (PWSOCKTHREADDATA)HEAP_malloc (sizeof(WSOCKTHREADDATA));
     165      pThreadDB->pWsockData = (LPVOID)pwstd;
     166    }
     167    else
     168      // use already allocated memory
     169      pwstd = (PWSOCKTHREADDATA)pThreadDB->pWsockData;
     170  }
     171
     172  if (pwstd == NULL)
     173    pwstd = &wstdFallthru; // no memory and not allocated already
     174
     175  return pwstd;
     176}
    122177
    123178
     
    240295
    241296  if (rc == INVALID_SOCKET)
    242      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     297    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     298  else
     299    WSASetLastError(ERROR_SUCCESS);
    243300
    244301  return rc;
     
    265322
    266323  if (rc < 0)
    267      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
    268 
     324    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     325  else
     326    WSASetLastError(ERROR_SUCCESS);
    269327  return rc;
    270328}
     
    288346
    289347  if (rc < 0)
    290      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     348    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     349  else
     350    WSASetLastError(ERROR_SUCCESS);
    291351
    292352  return rc;
     
    315375
    316376  if (rc < 0)
    317      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     377    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     378  else
     379    WSASetLastError(ERROR_SUCCESS);
    318380
    319381  return rc;
     
    340402
    341403  if (rc < 0)
    342      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     404    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     405  else
     406    WSASetLastError(ERROR_SUCCESS);
    343407
    344408  return rc;
     
    365429
    366430  if (rc == SOCKET_ERROR)
    367      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     431    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     432  else
     433    WSASetLastError(ERROR_SUCCESS);
    368434
    369435  return rc;
     
    390456
    391457  if (rc == SOCKET_ERROR)
    392      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     458    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     459  else
     460    WSASetLastError(ERROR_SUCCESS);
    393461
    394462  return rc;
     
    417485
    418486  if (rc == SOCKET_ERROR)
    419      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     487    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     488  else
     489    WSASetLastError(ERROR_SUCCESS);
    420490
    421491  return rc;
     
    513583
    514584  if (rc < 0)
    515      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     585    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     586  else
     587    WSASetLastError(ERROR_SUCCESS);
    516588
    517589  return rc;
     
    575647
    576648  if (rc < 0)
    577      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     649    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     650  else
     651    WSASetLastError(ERROR_SUCCESS);
    578652
    579653  return rc;
     
    603677
    604678  if (rc < 0)
    605      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     679    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     680  else
     681    WSASetLastError(ERROR_SUCCESS);
    606682
    607683  return rc;
     
    636712
    637713  if (rc == SOCKET_ERROR)
    638      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     714    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     715  else
     716    WSASetLastError(ERROR_SUCCESS);
    639717
    640718  return rc;
     
    666744
    667745  if (rc < 0)
    668      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     746    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     747  else
     748    WSASetLastError(ERROR_SUCCESS);
    669749
    670750  return rc;
     
    694774
    695775  if (rc < 0)
    696      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     776    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     777  else
     778    WSASetLastError(ERROR_SUCCESS);
    697779
    698780  return rc;
     
    735817
    736818  if (rc == SOCKET_ERROR)
    737      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     819    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     820  else
     821    WSASetLastError(ERROR_SUCCESS);
    738822
    739823  return rc;
     
    759843
    760844  if (rc == SOCKET_ERROR)
    761      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     845    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     846  else
     847    WSASetLastError(ERROR_SUCCESS);
    762848
    763849  return rc;
     
    784870
    785871  if (rc == INVALID_SOCKET)
    786      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     872    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     873  else
     874    WSASetLastError(ERROR_SUCCESS);
    787875
    788876  return rc;
     
    806894                                         int,         type)
    807895{
    808   WHOSTENT *yy;
    809   struct hostent *xx;
     896  WHOSTENT         *yy;
     897  struct hostent   *xx;
     898  PWSOCKTHREADDATA pwstd;
    810899
    811900  xx = gethostbyaddr((char *)addr,len,type);
     
    813902  if(xx == NULL)
    814903  {
    815      OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     904     WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
    816905     return (WHOSTENT *)NULL;
    817906  }
    818 
    819   whsnt.h_name = xx->h_name;
    820   whsnt.h_aliases = xx->h_aliases;
    821   whsnt.h_addrtype = (short)xx->h_addrtype;
    822   whsnt.h_length = (short)xx->h_length;
    823   whsnt.h_addr_list = xx->h_addr_list;
    824 
    825   return &whsnt;
     907  else
     908    WSASetLastError(ERROR_SUCCESS);
     909
     910  // access current thread wsock data block
     911  pwstd = iQueryWsockThreadData();
     912
     913  pwstd->whsnt.h_name      = xx->h_name;
     914  pwstd->whsnt.h_aliases   = xx->h_aliases;
     915  pwstd->whsnt.h_addrtype  = (short)xx->h_addrtype;
     916  pwstd->whsnt.h_length    = (short)xx->h_length;
     917  pwstd->whsnt.h_addr_list = xx->h_addr_list;
     918
     919  return &pwstd->whsnt;
    826920}
    827921
     
    841935ODINFUNCTION1(WHOSTENT*,OS2gethostbyname,const char*,name)
    842936{
    843   WHOSTENT *yy;
    844   struct hostent *xx;
     937  WHOSTENT         *yy;
     938  struct hostent   *xx;
     939  PWSOCKTHREADDATA pwstd;
     940
    845941
    846942  xx = gethostbyname((char *)name);
    847943  if(xx == NULL)
    848944  {
    849     OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     945    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
    850946    return (WHOSTENT *)NULL;
    851947  }
    852 
    853   whsnt.h_name = xx->h_name;
    854   whsnt.h_aliases = xx->h_aliases;
    855   whsnt.h_addrtype = (short)xx->h_addrtype;
    856   whsnt.h_length = (short)xx->h_length;
    857   whsnt.h_addr_list = xx->h_addr_list;
    858 
    859   return &whsnt;
     948  else
     949    WSASetLastError(ERROR_SUCCESS);
     950
     951  // access current thread wsock data block
     952  pwstd = iQueryWsockThreadData();
     953
     954  pwstd->whsnt.h_name      = xx->h_name;
     955  pwstd->whsnt.h_aliases   = xx->h_aliases;
     956  pwstd->whsnt.h_addrtype  = (short)xx->h_addrtype;
     957  pwstd->whsnt.h_length    = (short)xx->h_length;
     958  pwstd->whsnt.h_addr_list = xx->h_addr_list;
     959
     960  return &pwstd->whsnt;
    860961}
    861962
     
    895996                                          const char*, proto)
    896997{
    897   struct servent *xx;
     998  struct servent   *xx;
     999  PWSOCKTHREADDATA pwstd;
    8981000
    8991001  xx = getservbyport(port,(char *)proto);
     
    9011003  if(xx == NULL)
    9021004  { // this call doesn't generate an error message
    903     OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     1005    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
    9041006    return (WSERVENT *)NULL;
    9051007  }
    906 
    907   wsvnt.s_name = xx->s_name;
    908   wsvnt.s_aliases = xx->s_aliases;
    909   wsvnt.s_port = (short)xx->s_port;
    910   wsvnt.s_proto = xx->s_proto;
    911 
    912   return &wsvnt;
     1008  else
     1009    WSASetLastError(ERROR_SUCCESS);
     1010
     1011  // access current thread wsock data block
     1012  pwstd = iQueryWsockThreadData();
     1013
     1014  pwstd->wsvnt.s_name    = xx->s_name;
     1015  pwstd->wsvnt.s_aliases = xx->s_aliases;
     1016  pwstd->wsvnt.s_port    = (short)xx->s_port;
     1017  pwstd->wsvnt.s_proto   = xx->s_proto;
     1018
     1019  return &pwstd->wsvnt;
    9131020}
    9141021
     
    9291036                                         const char*,proto)
    9301037{
    931   WSERVENT *yy;
    932   struct servent *xx;
     1038  WSERVENT         *yy;
     1039  struct servent   *xx;
     1040  PWSOCKTHREADDATA pwstd;
     1041
    9331042
    9341043  xx = getservbyname((char *)name,(char *)proto);
     
    9361045  if(xx == NULL)
    9371046  { // this call doesn't generate an error message
    938     OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     1047    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
    9391048    return (WSERVENT *)NULL;
    9401049  }
    941 
    942   wsvnt.s_name = xx->s_name;
    943   wsvnt.s_aliases = xx->s_aliases;
    944   wsvnt.s_port = (short)xx->s_port;
    945   wsvnt.s_proto = xx->s_proto;
    946 
    947   return &wsvnt;
     1050  else
     1051    WSASetLastError(ERROR_SUCCESS);
     1052
     1053  // access current thread wsock data block
     1054  pwstd = iQueryWsockThreadData();
     1055
     1056  pwstd->wsvnt.s_name    = xx->s_name;
     1057  pwstd->wsvnt.s_aliases = xx->s_aliases;
     1058  pwstd->wsvnt.s_port    = (short)xx->s_port;
     1059  pwstd->wsvnt.s_proto   = xx->s_proto;
     1060
     1061  return &pwstd->wsvnt;
    9481062}
    9491063
     
    9631077ODINFUNCTION1(WPROTOENT*,OS2getprotobynumber,int,proto)
    9641078{
    965   struct protoent *xx;
     1079  struct protoent  *xx;
     1080  PWSOCKTHREADDATA pwstd;
    9661081
    9671082  xx = getprotobynumber(proto);
     
    9701085  {
    9711086     // this call doesn't generate an error message
    972     OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     1087    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
    9731088    return (WPROTOENT *)NULL;
    9741089  }
    975 
    976   wptnt.p_name = xx->p_name;
    977   wptnt.p_aliases = xx->p_aliases;
    978   wptnt.p_proto = (short)xx->p_proto;
    979 
    980   return &wptnt;
     1090  else
     1091    WSASetLastError(ERROR_SUCCESS);
     1092
     1093  // access current thread wsock data block
     1094  pwstd = iQueryWsockThreadData();
     1095
     1096  pwstd->wptnt.p_name    = xx->p_name;
     1097  pwstd->wptnt.p_aliases = xx->p_aliases;
     1098  pwstd->wptnt.p_proto   = (short)xx->p_proto;
     1099
     1100  return &pwstd->wptnt;
    9811101}
    9821102
     
    9961116ODINFUNCTION1(WPROTOENT*,OS2getprotobyname,const char*,name)
    9971117{
    998   struct protoent *xx;
     1118  struct protoent  *xx;
     1119  PWSOCKTHREADDATA pwstd;
    9991120
    10001121  xx = getprotobyname((char *)name);
     
    10021123  if(xx == NULL)
    10031124  { // this call doesn't generate an error message
    1004     OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
     1125    WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
    10051126    return (WPROTOENT *)NULL;
    10061127  }
    1007 
    1008   wptnt.p_name = xx->p_name;
    1009   wptnt.p_aliases = xx->p_aliases;
    1010   wptnt.p_proto = (short)xx->p_proto;
    1011 
    1012   return &wptnt;
     1128  else
     1129    WSASetLastError(ERROR_SUCCESS);
     1130
     1131  // access current thread wsock data block
     1132  pwstd = iQueryWsockThreadData();
     1133
     1134  pwstd->wptnt.p_name    = xx->p_name;
     1135  pwstd->wptnt.p_aliases = xx->p_aliases;
     1136  pwstd->wptnt.p_proto   = (short)xx->p_proto;
     1137
     1138  return &pwstd->wptnt;
    10131139}
    10141140
     
    10301156{
    10311157  APIRET rc;
    1032   int ii;
    10331158
    10341159  /* Make sure that the version requested is >= 1.1.   */
     
    10571182    WriteLog("WSOCK32: WSAStartup sock_init returned 0\n");
    10581183#endif
    1059       return 0;
     1184    WSASetLastError(ERROR_SUCCESS);
     1185    return 0;
    10601186  }
    10611187  else
    1062     ii = iTranslateSockErrToWSock(sock_errno());
    1063 
    1064   return ii;
     1188    return(iTranslateSockErrToWSock(sock_errno()));
    10651189}
    10661190
     
    10961220 *****************************************************************************/
    10971221
    1098 ODINPROCEDURE1(OS2WSASetLastError,int,iError)
    1099 {
    1100   SetLastError(iError);
    1101 }
    1102 
    1103 
    1104 /*****************************************************************************
    1105  * Name      :
    1106  * Purpose   :
    1107  * Parameters:
    1108  * Variables :
    1109  * Result    :
    1110  * Remark    :
    1111  * Status    : UNTESTED STUB
    1112  *
    1113  * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
    1114  *****************************************************************************/
    1115 
    1116 ODINFUNCTION0(int,OS2WSAGetLastError)
    1117 {
    1118   return GetLastError();
     1222ODINPROCEDURE1(WSASetLastError,int,iError)
     1223{
     1224  PWSOCKTHREADDATA pwstd = iQueryWsockThreadData();
     1225  pwstd->dwLastError = iError;
     1226}
     1227
     1228
     1229/*****************************************************************************
     1230 * Name      :
     1231 * Purpose   :
     1232 * Parameters:
     1233 * Variables :
     1234 * Result    :
     1235 * Remark    :
     1236 * Status    : UNTESTED STUB
     1237 *
     1238 * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
     1239 *****************************************************************************/
     1240
     1241ODINFUNCTION0(int,WSAGetLastError)
     1242{
     1243  PWSOCKTHREADDATA pwstd = iQueryWsockThreadData();
     1244  return(pwstd->dwLastError);
    11191245}
    11201246
  • trunk/src/wsock32/wsock32.def

    r1588 r1690  
    1 ; $Id: wsock32.def,v 1.13 1999-11-04 01:13:42 phaller Exp $
     1; $Id: wsock32.def,v 1.14 1999-11-10 16:36:16 phaller Exp $
    22
    33;Created by BLAST for IBM's compiler
     
    77IMPORTS
    88    PostMessageA           = USER32.416
    9     SetLastError           = KERNEL32.654
    10     GetLastError           = KERNEL32.340
    119    bsd_select             = SO32DLL.32
    1210    os2_select             = SO32DLL.12
    1311
    1412EXPORTS
    15 ;   _WSAFDIsSet =       _OS2_WSAFDIsSet@8
    1613;   Arecv = _OS2Arecv
    1714;   Asend = _OS2Asend
     
    7471   WSASetBlockingHook =      _OS2WSASetBlockingHook@4                  @109
    7572   WSAUnhookBlockingHook =   _OS2WSAUnhookBlockingHook@0       @110
    76    WSAGetLastError =           _OS2WSAGetLastError@0                   @111
    77    WSASetLastError =           _OS2WSASetLastError@4                   @112
     73   WSAGetLastError =           _WSAGetLastError@0                   @111
     74   WSASetLastError =           _WSASetLastError@4                   @112
    7875   WSACancelBlockingCall =   _OS2WSACancelBlockingCall@0       @113
    7976
Note: See TracChangeset for help on using the changeset viewer.