Ignore:
Timestamp:
Oct 20, 1999, 10:41:54 PM (26 years ago)
Author:
phaller
Message:

Fix: socket fixes

File:
1 edited

Legend:

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

    r1384 r1385  
    1 /* $Id: wsock32.cpp,v 1.8 1999-10-20 20:10:58 phaller Exp $ */
     1/* $Id: wsock32.cpp,v 1.9 1999-10-20 20:41:54 phaller Exp $ */
    22
    33/*
     
    6767 *****************************************************************************/
    6868
    69 #define GETSERVBYNAME    1
    70 #define GETSERVBYPORT    2
    71 #define GETPROTOBYNAME   3
    72 #define GETPROTOBYNUMBER 4
    73 #define GETHOSTBYNAME    5
    74 #define GETHOSTBYADDR    6
    75 
    76 #define BLOCKING 0
    77 #define NONBLOCKING 1
    7869
    7970#ifdef FD_CLR
     
    8980
    9081
     82// forwarder prototypes
     83void _System SetLastError(int iError);
     84int  _System GetLastError(void);
     85
     86
    9187/*****************************************************************************
    9288 * Structures                                                                *
    9389 *****************************************************************************/
    94 
    95 typedef struct WSAStruct
    96 {
    97   int CallingWhat;
    98   HWND hw;
    99   u_int msg;
    100   char *carg1;
    101   char *carg2;
    102   int iarg1;
    103   int iarg2;
    104   char *buf;
    105   int buflen;
    106 } WSAStruct;
    107 
    108 typedef struct PipeStruct
    109 {
    110   AsyncStatus as;
    111   int MsgLoop;
    112   HFILE rcv;
    113   HFILE snd;
    114 } PipeStruct;
    11590
    11691typedef struct sockaddr* PSOCKADDR;
     
    136111 *****************************************************************************/
    137112
    138 void _System AsyncLoop             (ULONG);
    139 void         CheckThreads          (AsyncStatus *);
    140 void         NotifyApp             (int,AsyncStatus *);
    141 int          Notify                (AsyncStatus *,int);
    142 int          NotifyWSA             (HWND hw,u_int msg,UINT wp,LONG lp);
    143 void _System WSAFunct              (ULONG); // for the wsa database calls
    144 void         SetErrForDatabaseCalls(void);
    145 
    146113
    147114/*****************************************************************************
     
    149116 *****************************************************************************/
    150117
     118// @@@PH not reentrancy proof
    151119static WHOSTENT whsnt;
    152120static WSERVENT wsvnt;
    153121static WPROTOENT wptnt;
    154 size_t nSize;
    155 int *pArray;
    156 
    157 int MsgSent;
    158 int LocalErrorNumber = 0;
    159 
    160 TID tidAsyncLoop = 0;     /* ID of AsyncSelect (AsyncLoop) thread */
    161 
    162 PipeStruct PS;
    163 
    164 AsyncStatus *TopASY = 0;
    165 
    166 
    167 /*
    168 typedef struct AsyncStatus {
    169     HWND hwnd;     // owner's hwindow
    170     u_int msg;     // message to send when event occurs
    171     long event;    // event that may occur
    172     SOCKET socket; // the socket
    173     int status;    // blocking yes/no
    174     TID threadID;  // Thread ID for async
    175     int MsgStat;   // has message been sent yet?
    176     struct AsyncStatus *Next; // pointer to next AsyncStatus in the list
    177     struct AsyncStatus *Prev; // pointer to previous AsyncStatus in the list
    178 } AsyncStatus;
    179 */
    180 
    181 
    182 /*****************************************************************************
    183  * Name      :
    184  * Purpose   :
    185  * Parameters:
    186  * Variables :
    187  * Result    :
    188  * Remark    :
    189  * Status    : UNTESTED STUB
    190  *
    191  * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
    192  *****************************************************************************/
    193 
    194 void _System AsyncLoop(ULONG ASP)
    195 {
    196   int socks[1],r,w,e,rc,ii;
    197   AsyncStatus *as;
    198 
    199   as = (AsyncStatus *)ASP;
    200 
    201   r = w = e = 0;
    202   if(as->event & FD_READ) r = 1;
    203   if(as->event & FD_WRITE) w = 1;
    204   if(as->event & FD_OOB) e = 1;
    205 
    206   socks[0] = (int)as->socket;
    207 
    208   if((r+w+e) == 0)
    209   {
    210     dprintf(("WSOCK32: Turning off async\n"));
    211 
    212     ii = 0;
    213     rc = ioctl(socks[0],FIONBIO,(char *)&ii,sizeof(ii));
    214     as->threadID = 0;
    215     as->hwnd = 0;
    216     as->msg = 0;
    217     as->event = 0;
    218     as->status = BLOCKING;
    219     return;
    220   } // end if
    221   else
    222   {
    223     dprintf(("WSOCK32: Setting up non-blocking sockets\n"));
    224     ii = 1;
    225     rc = ioctl(socks[0],FIONBIO,(char *)&ii,sizeof(ii));
    226     if(rc != 0)
    227     {
    228       dprintf(("WSOCK32: ioctl failed trying to non-block.\n"));
    229       return;
    230     }
    231     as->status = NONBLOCKING;
    232   } // end else
    233 
    234   do
    235   {
    236     rc = select(socks[0],(fd_set*)&r,0,0,0); // ioctl may be better for this.
    237     if(rc > 0)
    238     {
    239       rc = ioctl(socks[0],FIONREAD,(char *)&ii,sizeof(ii));
    240       if(rc == 0 && ii > 0)
    241       {
    242         /* data is ready */
    243         NotifyApp(FD_READ,as);
    244       }
    245     }
    246 
    247     if(rc < 0)
    248     {
    249       rc = sock_errno();
    250       /* something ain't right */
    251       if(rc == 10038)
    252       { // Connection closed
    253         NotifyApp(FD_CLOSE,as);
    254         DosSleep(500);
    255         return;
    256       }
    257 
    258       dprintf(("WSOCK32: Select error: %d\n",
    259                rc));
    260     } // end if
    261     DosSleep(50);
    262   }
    263   while(1);
    264 }
    265 
    266 
    267 /*****************************************************************************
    268  * Name      :
    269  * Purpose   :
    270  * Parameters:
    271  * Variables :
    272  * Result    :
    273  * Remark    :
    274  * Status    : UNTESTED STUB
    275  *
    276  * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
    277  *****************************************************************************/
    278 
    279 void CheckThreads(AsyncStatus *as)
    280 {
    281   AsyncStatus *asy;
    282 
    283   if(as != NULL)
    284     if(as->threadID != 0) DosKillThread(as->threadID);
    285 
    286   for(asy = TopASY; asy; asy = asy->Next)
    287     if(asy->threadID != 0)
    288       DosKillThread(asy->threadID);
    289 }
    290 
    291 
    292 /*****************************************************************************
    293  * Name      :
    294  * Purpose   :
    295  * Parameters:
    296  * Variables :
    297  * Result    :
    298  * Remark    :
    299  * Status    : UNTESTED STUB
    300  *
    301  * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
    302  *****************************************************************************/
    303 
    304 void NotifyApp(int xx,AsyncStatus *as)
    305 {
    306   BOOL    fResult;        /* message-posted indicator             */
    307   unsigned long ii;
    308 
    309 
    310 //#ifdef DEBUG
    311 //    WriteLog("WSOCK32: Notifying the caller.  rc = %d\n",xx);
    312 //#endif
    313 
    314   if(as->MsgStat == 0)
    315   {
    316    fResult = Notify(as,xx);
    317    dprintf(("WSOCK32: Notify returns: %d\n",
    318             fResult));
    319   } // end if
    320 
    321   if(as->MsgStat == 2)
    322     as->MsgStat = 0;
    323   else
    324     as->MsgStat = 1;
    325 }
    326 
    327 
    328 /*****************************************************************************
    329  * Name      :
    330  * Purpose   :
    331  * Parameters:
    332  * Variables :
    333  * Result    :
    334  * Remark    :
    335  * Status    : UNTESTED STUB
    336  *
    337  * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
    338  *****************************************************************************/
    339 
    340 void _System WSAFunct(ULONG xx)
    341 {
    342   WSAStruct *wsa;
    343   WSERVENT *ooo;
    344   char *yy;
    345   int ii;
    346   size_t ss;
    347   UINT wp;
    348   LONG lp;
    349   int id = *_threadid;
    350 
    351   wsa = (WSAStruct *)xx;
    352 
    353   dprintf(("WSOCK32: WSAFunct: xx = %p, hwnd = %p\n",
    354            xx,
    355            wsa->hw));
    356 
    357   dprintf(("WSOCK32: WSAFunct info carg1 = %s, carg2 = %s\n",
    358            wsa->carg1,
    359            wsa->carg2));
    360 
    361   dprintf(("WSOCK32: WSAFunct info buf = %p, %d\n",
    362            wsa->buf,
    363            wsa->buflen));
    364 
    365   switch (wsa->CallingWhat)
    366   {
    367     case GETSERVBYNAME:
    368       yy = (char *)OS2getservbyname(wsa->carg1,wsa->carg2);
    369       ss = sizeof(WSERVENT);
    370       break;
    371     case GETSERVBYPORT:
    372       yy = (char *)OS2getservbyport(wsa->iarg1,wsa->carg1);
    373       break;
    374     case GETPROTOBYNUMBER:
    375       yy = (char *)OS2getprotobynumber(wsa->iarg1);
    376       break;
    377     case GETPROTOBYNAME:
    378       yy = (char *)OS2getprotobyname(wsa->carg1);
    379       break;
    380     case GETHOSTBYNAME:
    381       yy = (char *)OS2gethostbyname(wsa->carg1);
    382       break;
    383     case GETHOSTBYADDR:
    384       yy = (char *)OS2gethostbyaddr(wsa->carg1,wsa->iarg1,wsa->iarg2);
    385       break;
    386     default:
    387       yy = (char *)NULL;
    388       OS2WSASetLastError(-5000);
    389       break;
    390   } // end switch
    391 
    392 #ifdef DEBUG
    393   if(yy)
    394   {
    395     ooo = (WSERVENT *)yy;
    396     dprintf(("WSOCK32: WSAFunct service name = %s, port = %d\n",
    397              ooo->s_name,
    398              (int)ooo->s_port));
    399   }
    400 #endif
    401 
    402   wp = id;
    403 
    404   if(yy == (char *)NULL)
    405   {
    406     dprintf(("WSOCK32: WSAFunct error carg1 = %s, carg2 = %s\n",
    407              wsa->carg1,
    408              wsa->carg2));
    409 
    410    ii = OS2WSAGetLastError();
    411    lp = OS2WSAMAKEASYNCREPLY(0,ii);
    412   } // end if
    413   else
    414   {
    415     if(wsa->buflen < ss)
    416       ii = WSAENOBUFS;
    417     else
    418       ii = 0;
    419 
    420     lp = OS2WSAMAKEASYNCREPLY(ss,ii);
    421     if(ii == 0)
    422       memmove(wsa->buf,yy,ss);
    423   }
    424 
    425   do
    426   {
    427     if(WinQueryAnchorBlock(wsa->hw))
    428           ii = NotifyWSA(wsa->hw,wsa->msg,wp,lp);
    429   } while(ii != TRUE);
    430 
    431   free(wsa);
    432 }
    433122
    434123
     
    482171 *****************************************************************************/
    483172
    484 AsyncStatus * FindASY(SOCKET s)
    485 {
    486   AsyncStatus *as;
    487 
    488   for(as = TopASY; as; as = as->Next)
    489     if(as->socket == s)
    490       return as;
    491 
    492   return NULL;
    493 }
    494 
    495 
    496 /*****************************************************************************
    497  * Name      :
    498  * Purpose   :
    499  * Parameters:
    500  * Variables :
    501  * Result    :
    502  * Remark    :
    503  * Status    : UNTESTED STUB
    504  *
    505  * Author    : Patrick Haller [Tue, 1998/06/16 23:00]
    506  *****************************************************************************/
    507 
    508173ODINFUNCTION2(int, OS2__WSAFDIsSet, SOCKET,       fd,
    509174                                    Wfd_set FAR*, set)
     
    573238ODINFUNCTION1(int,OS2closesocket,SOCKET,s)
    574239{
    575   AsyncStatus *as;
    576 
    577   as = FindASY(s);
    578   if(as == NULL)
    579   {
    580     LocalErrorNumber = 10038;
    581     return -1;
    582   }
    583 
    584   CheckThreads(as);
    585 
    586   if(as->Prev && as->Next)
    587     as->Prev->Prev = as->Next->Next; // I SURE HOPE THIS IS RIGHT!!!!!!!!
    588 
    589   free(as);
    590 
    591240  return soclose((int)s);
    592241}
     
    841490                          int,   flags)
    842491{
    843   unsigned long ii;
    844   int           xx,
    845                 yy;
    846   char          buff[200];
    847   AsyncStatus   *as;
    848 
    849   PS.MsgLoop = 0;
    850 
    851   as = FindASY(s);
    852 
    853   if(as != NULL)
    854     as->MsgStat = 2;
    855 
    856   xx = recv(s,buf,len,flags);
    857 
    858   return xx;
     492  return recv(s,buf,len,flags);
    859493}
    860494
     
    1029663                               int,protocol)
    1030664{
    1031   SOCKET s;
    1032   AsyncStatus *as;
    1033 
    1034   s = (SOCKET)socket(af,type,protocol);
    1035   if(s > 0)
    1036   {
    1037     as = (AsyncStatus *)malloc(sizeof(AsyncStatus));
    1038     if(as != NULL)
    1039     {
    1040       as->hwnd = (HWND)0;
    1041       as->msg = 0;
    1042       as->event = 0L;
    1043       as->socket = s;
    1044       as->status = BLOCKING;
    1045       as->threadID = 0;
    1046       as->MsgStat = 0;
    1047       as->Next = TopASY;
    1048       as->Prev = NULL;
    1049 
    1050       if(TopASY)
    1051         TopASY->Prev = as;
    1052 
    1053       TopASY = as;
    1054     }
    1055     else
    1056     {
    1057       soclose(s);
    1058       return -1;
    1059     }
    1060   }
    1061 
    1062   return s;
     665  return (SOCKET)socket(af,type,protocol);
    1063666}
    1064667
     
    1321924  lpWsaData->iMaxSockets = 2048;
    1322925  strcpy(lpWsaData->szSystemStatus,"No Status");
    1323 
    1324   LocalErrorNumber = 0;
    1325926
    1326927  if(sock_init() == 0)
     
    1352953ODINFUNCTION0(int,OS2WSACleanup)
    1353954{
    1354   CheckThreads((AsyncStatus *)NULL);
    1355 
    1356955  return 0;
    1357956}
     
    1372971ODINPROCEDURE1(OS2WSASetLastError,int,iError)
    1373972{
    1374   LocalErrorNumber = iError;
     973  SetLastError(iError);
    1375974}
    1376975
     
    1390989ODINFUNCTION0(int,OS2WSAGetLastError)
    1391990{
    1392   int ii;
    1393 
    1394   if(LocalErrorNumber == 0)
    1395   {
    1396     ii = sock_errno(); // WSAGetLastError();
    1397     return ii;
    1398   }
    1399   else
    1400   {
    1401     return LocalErrorNumber;
    1402   }
     991  return GetLastError();
    1403992}
    1404993
Note: See TracChangeset for help on using the changeset viewer.