#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
-#ifdef WINNT
+#ifdef _WIN32
#include <stdlib.h>
#endif
int
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
-#ifdef WINNT
+#ifdef _WIN32
#include <stdlib.h>
#endif
int
#undef sock_errstr
#define sock_errno() errno
#define sock_errstr(e) STRERROR(e)
+#define sock_errset(e) errno = (e)
#ifdef HAVE_WINSOCK
# define tcp_read( s, buf, len ) recv( s, buf, len, 0 )
#undef sock_errstr
#define sock_errno() WSAGetLastError()
#define sock_errstr(e) ber_pvt_wsa_err2string(e)
+#define sock_errset(e) WSASetLastError(e)
LBER_F( char * ) ber_pvt_wsa_err2string LDAP_P((int));
char buf[sizeof(ber->ber_len)-1];
ber_len_t tlen = 0;
- errno = 0;
+ sock_errset(0);
sblen=ber_int_sb_read( sb, ber->ber_rwptr,
((char *)&ber->ber_len + LENSIZE*2 - 1)-ber->ber_rwptr);
if (sblen<=0) return LBER_DEFAULT;
break;
/* Is the tag too big? */
if (i == sizeof(ber_tag_t)-1) {
- errno = ERANGE;
+ sock_errset(ERANGE);
return LBER_DEFAULT;
}
}
/* Did we run out of bytes? */
if ((char *)p == ber->ber_rwptr) {
#if defined( EWOULDBLOCK )
- errno = EWOULDBLOCK;
+ sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN )
- errno = EAGAIN;
+ sock_errset(EAGAIN);
#endif
return LBER_DEFAULT;
}
if ( ber->ber_ptr == ber->ber_rwptr ) {
#if defined( EWOULDBLOCK )
- errno = EWOULDBLOCK;
+ sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN )
- errno = EAGAIN;
+ sock_errset(EAGAIN);
#endif
return LBER_DEFAULT;
}
unsigned char *p = (unsigned char *)ber->ber_ptr;
int llen = *p++ & 0x7f;
if (llen > (int)sizeof(ber_len_t)) {
- errno = ERANGE;
+ sock_errset(ERANGE);
return LBER_DEFAULT;
}
/* Not enough bytes? */
if (ber->ber_rwptr - (char *)p < llen) {
#if defined( EWOULDBLOCK )
- errno = EWOULDBLOCK;
+ sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN )
- errno = EAGAIN;
+ sock_errset(EAGAIN);
#endif
return LBER_DEFAULT;
}
/* make sure length is reasonable */
if ( ber->ber_len == 0 ) {
- errno = ERANGE;
+ sock_errset(ERANGE);
return LBER_DEFAULT;
}
ber_log_printf( LDAP_DEBUG_CONNS, ber->ber_debug,
"ber_get_next: sockbuf_max_incoming exceeded "
"(%ld > %ld)\n", ber->ber_len, sb->sb_max_incoming );
- errno = ERANGE;
+ sock_errset(ERANGE);
return LBER_DEFAULT;
}
* already read.
*/
if ( ber->ber_len < sblen + l ) {
- errno = ERANGE;
+ sock_errset(ERANGE);
return LBER_DEFAULT;
}
ber->ber_buf = (char *) ber_memalloc_x( ber->ber_len + 1, ber->ber_memctx );
to_go = ber->ber_end - ber->ber_rwptr;
assert( to_go > 0 );
- errno = 0;
+ sock_errset(0);
res = ber_int_sb_read( sb, ber->ber_rwptr, to_go );
if (res<=0) return LBER_DEFAULT;
ber->ber_rwptr+=res;
if (res<to_go) {
#if defined( EWOULDBLOCK )
- errno = EWOULDBLOCK;
+ sock_errset(EWOULDBLOCK);
#elif defined( EAGAIN )
- errno = EAGAIN;
+ sock_errset(EAGAIN);
#endif
return LBER_DEFAULT;
}
/*
* 32-bit Windows Socket API (under Windows NT or Windows 95)
*/
- {
- int rc;
-
- rc = recv( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
-
-#ifdef HAVE_WINSOCK
- if ( rc < 0 ) {
- int err;
-
- err = WSAGetLastError();
- errno = err;
- }
-#endif
-
- return rc;
- }
+ return recv( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
#elif defined( HAVE_NCSA )
/*
/*
* 32-bit Windows Socket API (under Windows NT or Windows 95)
*/
- {
- int rc = send( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
-
-#ifdef HAVE_WINSOCK
- if ( rc < 0 ) {
- int err;
- err = WSAGetLastError();
- errno = err;
- }
-#endif
- return rc;
- }
+ return send( sbiod->sbiod_sb->sb_fd, buf, len, 0 );
#elif defined(HAVE_NCSA)
return netwrite( sbiod->sbiod_sb->sb_fd, buf, len );
ret = LBER_SBIOD_READ_NEXT( sbiod, buf, len );
if (sbiod->sbiod_sb->sb_debug & LDAP_DEBUG_PACKETS) {
- int err = errno;
+ int err = sock_errno();
if ( ret < 0 ) {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%sread: want=%ld error=%s\n", (char *)sbiod->sbiod_pvt,
- (long)len, AC_STRERROR_R( errno, ebuf, sizeof ebuf ) );
+ (long)len, AC_STRERROR_R( err, ebuf, sizeof ebuf ) );
} else {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%sread: want=%ld, got=%ld\n", (char *)sbiod->sbiod_pvt,
ber_log_bprint( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
(const char *)buf, ret );
}
- errno = err;
+ sock_errset(err);
}
return ret;
}
ret = LBER_SBIOD_WRITE_NEXT( sbiod, buf, len );
if (sbiod->sbiod_sb->sb_debug & LDAP_DEBUG_PACKETS) {
- int err = errno;
+ int err = sock_errno();
if ( ret < 0 ) {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%swrite: want=%ld error=%s\n",
(char *)sbiod->sbiod_pvt, (long)len,
- AC_STRERROR_R( errno, ebuf, sizeof ebuf ) );
+ AC_STRERROR_R( err, ebuf, sizeof ebuf ) );
} else {
ber_log_printf( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
"%swrite: want=%ld, written=%ld\n",
ber_log_bprint( LDAP_DEBUG_PACKETS, sbiod->sbiod_sb->sb_debug,
(const char *)buf, ret );
}
- errno = err;
+ sock_errset(err);
}
return ret;
ber_pvt_sb_buf_init( &p->buf_out );
if ( ber_pvt_sb_grow_buffer( &p->sec_buf_in, SASL_MIN_BUFF_SIZE ) < 0 ) {
LBER_FREE( p );
- errno = ENOMEM;
+ sock_errset(ENOMEM);
return -1;
}
sasl_getprop( p->sasl_context, SASL_MAXOUTBUF,
if ( ( p->sec_buf_in.buf_size < (ber_len_t) ret ) &&
ber_pvt_sb_grow_buffer( &p->sec_buf_in, ret ) < 0 )
{
- errno = ENOMEM;
+ sock_errset(ENOMEM);
return -1;
}
p->sec_buf_in.buf_end = ret;
ber_log_printf( LDAP_DEBUG_ANY, sbiod->sbiod_sb->sb_debug,
"sb_sasl_read: failed to decode packet: %s\n",
sasl_errstring( ret, NULL, NULL ) );
- errno = EIO;
+ sock_errset(EIO);
return -1;
}
/* Still have something left?? */
if ( p->buf_out.buf_ptr != p->buf_out.buf_end ) {
- errno = EAGAIN;
+ sock_errset(EAGAIN);
return -1;
}
}
ber_log_printf( LDAP_DEBUG_ANY, sbiod->sbiod_sb->sb_debug,
"sb_sasl_write: failed to encode packet: %s\n",
sasl_errstring( ret, NULL, NULL ) );
- errno = EIO;
+ sock_errset(EIO);
return -1;
}
p->buf_out.buf_end = p->buf_out.buf_size;
static void
ldap_pvt_set_errno(int err)
{
- errno = err;
+ sock_errset(err);
}
int
struct sockaddr *sin, socklen_t addrlen,
int async)
{
- int rc;
+ int rc, err;
struct timeval tv = { 0 },
*opt_tv = NULL;
return ( 0 );
}
-#ifdef HAVE_WINSOCK
- ldap_pvt_set_errno( WSAGetLastError() );
-#endif
-
- if ( errno != EINPROGRESS && errno != EWOULDBLOCK ) {
+ err = sock_errno();
+ if ( err != EINPROGRESS && err != EWOULDBLOCK ) {
return ( -1 );
}
LDAPConn *lc = lr->lr_conn;
if ( ber_flush2( lc->lconn_sb, lr->lr_ber, LBER_FLUSH_FREE_NEVER ) != 0 ) {
- if ( errno == EAGAIN ) {
+ if ( sock_errno() == EAGAIN ) {
/* need to continue write later */
lr->lr_status = LDAP_REQST_WRITING;
ldap_mark_select_write( ld, lc->lconn_sb );
if ( rc == -1 ) {
Debug( LDAP_DEBUG_TRACE,
"ldap_int_select returned -1: errno %d\n",
- errno, 0, 0 );
+ sock_errno(), 0, 0 );
}
#endif
if ( rc == 0 || ( rc == -1 && (
!LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART)
- || errno != EINTR ) ) )
+ || sock_errno() != EINTR ) ) )
{
ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN :
LDAP_TIMEOUT);
assert( LBER_VALID (ber) );
/* get the next message */
- errno = 0;
+ sock_errset(0);
#ifdef LDAP_CONNECTIONLESS
if ( LDAP_IS_UDP(ld) ) {
struct sockaddr from;
"ber_get_next failed.\n", 0, 0, 0 );
#endif
#ifdef EWOULDBLOCK
- if ( errno == EWOULDBLOCK ) return LDAP_MSG_X_KEEP_LOOKING;
+ if ( sock_errno() == EWOULDBLOCK ) return LDAP_MSG_X_KEEP_LOOKING;
#endif
#ifdef EAGAIN
- if ( errno == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING;
+ if ( sock_errno() == EAGAIN ) return LDAP_MSG_X_KEEP_LOOKING;
#endif
ld->ld_errno = LDAP_SERVER_DOWN;
return -1;
err = SSL_get_error( p->ssl, ret );
if (err == SSL_ERROR_WANT_READ ) {
sbiod->sbiod_sb->sb_trans_needs_read = 1;
- errno = EWOULDBLOCK;
+ sock_errset(EWOULDBLOCK);
}
else
sbiod->sbiod_sb->sb_trans_needs_read = 0;
err = SSL_get_error( p->ssl, ret );
if (err == SSL_ERROR_WANT_WRITE ) {
sbiod->sbiod_sb->sb_trans_needs_write = 1;
- errno = EWOULDBLOCK;
+ sock_errset(EWOULDBLOCK);
} else {
sbiod->sbiod_sb->sb_trans_needs_write = 0;
BIO_clear_retry_flags( b );
if ( ret < 0 ) {
- int err = errno;
+ int err = sock_errno();
if ( err == EAGAIN || err == EWOULDBLOCK ) {
BIO_set_retry_read( b );
}
BIO_clear_retry_flags( b );
if ( ret < 0 ) {
- int err = errno;
+ int err = sock_errno();
if ( err == EAGAIN || err == EWOULDBLOCK ) {
BIO_set_retry_write( b );
}
return -1;
}
- errno = 0;
+ sock_errset(0);
#ifdef LDAP_CONNECTIONLESS
if ( conn->c_is_udp ) {
tag = ber_get_next( conn->c_sb, &len, conn->c_currentber );
if ( tag != LDAP_TAG_MESSAGE ) {
- int err = errno;
+ int err = sock_errno();
ber_socket_t sd;
ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &sd );
break;
}
- err = errno;
+ err = sock_errno();
/*
* we got an error. if it's ewouldblock, we need to