Version 0.3.0
- AUTH_INFO types and structures were moved to library internals
- AUTH_FAILED is no longer returned in SRP (any fatal error in SRP means auth failed)
+- Introduced GNUTLS_E_INTERRUPTED
+- Added support for Non blocking IO
Version 0.2.4 (12/10/2001)
- Better handling of X.509 certificate extensions
while (left > 0) {
i = _gnutls_recv_func(fd, &ptr[i], left, flag);
if (i < 0) {
- if (errno == EAGAIN)
- return GNUTLS_E_AGAIN;
- else
+ if (errno == EAGAIN || errno == EINTR) {
+ if (errno==EAGAIN) return GNUTLS_E_AGAIN;
+ else return GNUTLS_E_INTERRUPTED;
+ } else
return GNUTLS_E_UNKNOWN_ERROR;
} else {
if (i == 0)
*/
if ( sizeOfPtr - recvlowat > 0) {
ret = _gnutls_Read( fd, &buf[min], sizeOfPtr - recvlowat, flag);
- if (ret==GNUTLS_E_AGAIN)
+ if (ret < 0 && gnutls_is_fatal_error(ret)==0)
return ret;
}
if (ret >= 0 && recvlowat > 0) {
ret2 = _gnutls_Read( fd, &buf[min+ret], recvlowat, MSG_PEEK|flag);
- if (ret2==GNUTLS_E_AGAIN)
+ if (ret2 < 0 && gnutls_is_fatal_error(ret2)==0)
return ret2;
if (ret2 > 0)
GNUTLS_ERROR_ENTRY( GNUTLS_E_X509_UNSUPPORTED_CRITICAL_EXTENSION, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_X509_KEY_USAGE_VIOLATION, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_AGAIN, 0),
+ GNUTLS_ERROR_ENTRY( GNUTLS_E_INTERRUPTED, 0),
GNUTLS_ERROR_ENTRY( GNUTLS_E_REHANDSHAKE, 0),
GNUTLS_ERROR_ENTRY( GNUTLS_E_GOT_APPLICATION_DATA, 0),
GNUTLS_ERROR_ENTRY( GNUTLS_E_DB_ERROR, 1),
/**
* gnutls_is_fatal_error - Returns non-zero in case of a fatal error
- * @error: is an error returned by a gnutls function. Error is always a negative value.
+ * @error: is an error returned by a gnutls function. Error should be a negative value.
*
* If a function returns a negative value you may feed that value
* to this function to see if it is fatal. Returns 1 for a fatal
#define GNUTLS_E_NO_CERTIFICATE_FOUND -49
#define GNUTLS_E_INVALID_PARAMETERS -50
#define GNUTLS_E_INVALID_REQUEST -51
+#define GNUTLS_E_INTERRUPTED -52
#define GNUTLS_E_UNIMPLEMENTED_FEATURE -250
if (ret < 0) { \
gnutls_assert(); \
ERR( str, ret); \
- if (ret==GNUTLS_E_AGAIN) return ret; \
+ if (gnutls_is_fatal_error(ret)==0) return ret; \
gnutls_clearHashDataBuffer(state); \
return ret; \
}
IMED_RET("send client certificate verify", ret);
STATE = STATE0;
+ default:
}
}
STATE = STATE0;
+ default:
}
return 0;
return ret;
}
STATE = STATE0;
+ default:
}
IMED_RET("recv client certificate verify", ret);
STATE = STATE0; /* finished thus clear state */
+ default:
}
return 0;
* must be set to non blocking mode
*/
if ( (ret = _gnutls_read_buffered(cd, state, &headers, header_size, flags, -1)) != header_size) {
- if (ret==GNUTLS_E_AGAIN) return ret;
+ if (ret<0 && gnutls_is_fatal_error(ret)==0) return ret;
state->gnutls_internals.valid_connection = VALID_FALSE;
if (type==GNUTLS_ALERT) {
/* check if we have that data into buffer.
*/
if ( (ret = _gnutls_read_buffered(cd, state, &recv_data, header_size+length, flags, recv_type)) != length+header_size) {
- if (ret==GNUTLS_E_AGAIN) return ret;
+ if (ret<0 && gnutls_is_fatal_error(ret)==0) return ret;
state->gnutls_internals.valid_connection = VALID_FALSE;
state->gnutls_internals.resumable = RESUME_FALSE;
* The only acceptable flag is currently MSG_DONTWAIT. In that case,
* if the socket is set to non blocking IO it will return GNUTLS_E_AGAIN,
* if there are no data in the socket.
+ *
+ * If the recv() operation is interrupted then GNUTLS_E_INTERRUPTED, will be
+ * returned.
+ *
* Returns the number of bytes received, zero on EOF, or
* a negative error code.
**/