예제 #1
0
파일: tcpio.c 프로젝트: jiangxilong/core
static HB_SIZE s_fileWrite( PHB_FILE pFile, const void * data,
                            HB_SIZE nSize, HB_MAXINT timeout )
{
   long lSent = nSize > LONG_MAX ? LONG_MAX : ( long ) nSize;
   HB_ERRCODE errcode;

   if( timeout == -1 )
      timeout = pFile->timeout;
   lSent = hb_sockexWrite( pFile->sock, data, lSent, timeout );
   errcode = hb_socketGetError();
   hb_fsSetError( errcode );

   if( lSent < 0 )
   {
      switch( errcode )
      {
         case HB_SOCKET_ERR_TIMEOUT:
         case HB_SOCKET_ERR_AGAIN:
         case HB_SOCKET_ERR_TRYAGAIN:
            lSent = 0;
            break;
      }
   }

   return lSent;
}
예제 #2
0
static long s_bf_send( PHB_SOCKEX_BF pBF, HB_MAXINT timeout )
{
   long lSent = 0, len = pBF->inbuffer;

   while( lSent < len )
   {
      long l = hb_sockexWrite( pBF->sock, pBF->buffer + lSent, len - lSent, timeout );
      if( l <= 0 )
      {
         switch( hb_socketGetError() )
         {
            case HB_SOCKET_ERR_TIMEOUT:
            case HB_SOCKET_ERR_AGAIN:
            case HB_SOCKET_ERR_TRYAGAIN:
               break;
            default:
               lSent = -1;
               break;
         }
         break;
      }
      lSent += l;
      if( timeout > 0 )
         timeout = 0;
   }

   if( lSent > 0 )
   {
      if( lSent < len )
         memmove( pBF->buffer, pBF->buffer + lSent, len - lSent );
      pBF->inbuffer -= lSent;
   }

   return lSent;
}
예제 #3
0
파일: hbzsock.c 프로젝트: jiangxilong/core
static long s_sockexWrite( PHB_SOCKEX pSock, const void * data, long len, HB_MAXINT timeout )
{
   PHB_SOCKEX_Z pZ = HB_ZSOCK_GET( pSock );

   if( pZ->fCompressOut )
   {
      long lWritten = 0;

      pZ->z_write.next_in  = ( Bytef * ) data;
      pZ->z_write.avail_in = ( uInt ) len;

      while( pZ->z_write.avail_in )
      {
         int err;

         if( pZ->z_write.avail_out == 0 )
         {
            lWritten = s_zsock_write( pZ, timeout );
            if( lWritten <= 0 )
               break;
            timeout = 0;
         }
         err = deflate( &pZ->z_write, Z_NO_FLUSH );
         if( err != Z_OK )
         {
            if( err != Z_BUF_ERROR )
            {
               hb_socketSetError( HB_ZSOCK_ERROR_BASE - err );
               lWritten = -1;
            }
            break;
         }
      }

      return lWritten >= 0 ? ( long ) ( len - pZ->z_write.avail_in ) : lWritten;
   }
   else
      return hb_sockexWrite( pZ->sock, data, len, timeout );
}
예제 #4
0
파일: hbzsock.c 프로젝트: jiangxilong/core
static long s_zsock_write( PHB_SOCKEX_Z pZ, HB_MAXINT timeout )
{
   long lSent = 0, len = HB_ZSOCK_WRBUFSIZE - pZ->z_write.avail_out;

   while( lSent < len )
   {
      long l = hb_sockexWrite( pZ->sock, pZ->wrbuf + lSent, len - lSent, timeout );
      if( l <= 0 )
      {
         switch( hb_socketGetError() )
         {
            case HB_SOCKET_ERR_TIMEOUT:
            case HB_SOCKET_ERR_AGAIN:
            case HB_SOCKET_ERR_TRYAGAIN:
               break;
            default:
               lSent = -1;
               break;
         }
         break;
      }

      lSent += l;
      if( timeout > 0 )
         timeout = 0;
   }

   if( lSent > 0 )
   {
      if( lSent < len )
         memmove( pZ->wrbuf, pZ->wrbuf + lSent, len - lSent );
      pZ->z_write.avail_out += lSent;
      pZ->z_write.next_out -= lSent;
   }

   return lSent;
}