Hi,
I saw in the daily snapshot that errno is only used in _libssh2_send()
and _libssh2_recv().
That's good because it permits to better adapt libssh2 to other
platforms.

But I'm guessing if it is not possible to get rid of errno:
errno is a global error information that contain an error code but not
systematically from the actual socket.
Using this variable makes libssh2 not thread safe.

In fact _libssh2_send()/_libssh2_recv() returns only 3 values:
 1) >=0: number of bytes transmitted/received
 2) -EAGAIN: special error which indicates that the read/write
operation should be re-executed.
 3) <0 (but not -EAGAIN): real error.

Would it not be possible to use select to generate such error code?
This would made the _libssh2_send()/_libssh2_recv() thread safe.

For example:
ssize_t _libssh2_recv(libssh2_socket_t sock, void *buffer, size_t
length, int flags)
{
    ssize_t rc = recv(sock, buffer, length, flags);
    if (rc < 0 )
        return -errno;
    return rc;
}

would be rewritten something like:
ssize_t _libssh2_recv(libssh2_socket_t sock, void *buffer, size_t
length, int flags)
{
    ssize_t rc = recv(sock, buffer, length, flags);
    if (rc < 0 )
    {
      int             res; 
      fd_set          sready; 
      struct timeval  nowait; 

      FD_ZERO(&sready); 
      FD_SET((unsigned int)sock,&sready); 
      memset((char *)&nowait,0,sizeof(nowait)); 

      res = select(sock+1,&sready,NULL,NULL,&nowait); /* select without
timeout */
      if (res<0)
        return -EIO; /* Select gives an error */
      else if( FD_ISSET(sock,&sready) ) 
        return -EAGAIN; /* this should not occurs often: recv does not
receive, but just after it does */
      else 
        return -EAGAIN; /* socket not ready */ 
    }
    return rc;
}

I'm not sure if this code works. 

I'm waiting for comments.
Sébastien

 

-- 

------------------------------------------------------------
Ipetronik GmbH & Co.KG
Jaegerweg 1
D-76532 Baden-Baden
 
Phone-No. +49 - (0)7221/9922-467
Fax-No. +49 - (0)7221/9922-153
 
mailto: [email protected]
web: http://www.ipetronik.com 
 
------------------------------------------------------------
Kommanditgesellschaft mit Sitz in Baden-Baden, Registergericht HRA
Nr.201313
Persoenlich haftende Gesellschaft ist die IPETRONIK Verwaltungs GmbH 
mit Sitz in Baden-Baden, Registergericht Mannheim HRB Nr.202089, 
Geschäftsführer: J.Abromeit, E.Rudolf, A. Wocke
-------------------------------------------------------------
 
 


_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

Reply via email to