- (Error) message handling has changed
- Better Protocol Version handling
- Added x509 Certificate Verification
+- gnutls_read() semantics are now closer to read(2)
Version 0.1.4 (22/06/2001)
- Corrected (srp) base64 encoding.
int gnutls_global_init();
void gnutls_global_deinit();
+void gnutls_set_recv_func( ssize_t (*recv_func)(SOCKET, void*, size_t, int));
+void gnutls_set_send_func( ssize_t (*send_func)(SOCKET, const void*, size_t, int));
+
/* error codes appended here */
# include <errno.h>
#endif
-extern ssize_t (*recv_func)( SOCKET, void*, size_t, int);
-extern ssize_t (*send_func)( SOCKET,const void*, size_t, int);
+extern ssize_t (*_gnutls_recv_func)( SOCKET, void*, size_t, int);
+extern ssize_t (*_gnutls_send_func)( SOCKET,const void*, size_t, int);
int gnutls_insertDataBuffer(ContentType type, GNUTLS_STATE state, char *data, int length)
left = sizeOfPtr;
while (left > 0) {
- i = recv_func(fd, &ptr[i], left, flag);
+ i = _gnutls_recv_func(fd, &ptr[i], left, flag);
if (i < 0) {
return (0-errno);
} else {
#endif
left = n;
while (left > 0) {
- i = send(fd, &ptr[i], left, flags);
+ i = _gnutls_send_func(fd, &ptr[i], left, flags);
if (i == -1) {
return (0-errno);
}
GNUTLS_ERROR_ENTRY( GNUTLS_E_RECEIVED_MORE_DATA, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_UNEXPECTED_PACKET, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_WARNING_ALERT_RECEIVED, 0),
- GNUTLS_ERROR_ENTRY( GNUTLS_E_CLOSURE_ALERT_RECEIVED, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_ERROR_IN_FINISHED_PACKET, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET, 1),
GNUTLS_ERROR_ENTRY( GNUTLS_E_UNKNOWN_KX_ALGORITHM, 1),
#define GNUTLS_E_RECEIVED_MORE_DATA -14
#define GNUTLS_E_UNEXPECTED_PACKET -15
#define GNUTLS_E_WARNING_ALERT_RECEIVED -16
-#define GNUTLS_E_CLOSURE_ALERT_RECEIVED -17
#define GNUTLS_E_ERROR_IN_FINISHED_PACKET -18
#define GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET -19
#define GNUTLS_E_UNKNOWN_KX_ALGORITHM -20
extern const static_asn pkix_asn1_tab[];
static void* old_sig_handler;
-ssize_t (*recv_func)( SOCKET, void*, size_t, int);
-ssize_t (*send_func)( SOCKET,const void*, size_t, int);
+ssize_t (*_gnutls_recv_func)( SOCKET, void*, size_t, int);
+ssize_t (*_gnutls_send_func)( SOCKET,const void*, size_t, int);
static node_asn *PKIX1_ASN;
static node_asn *PKCS1_ASN;
return PKCS1_ASN;
}
+/**
+ * gnutls_set_recv_func - This function sets the recv() function
+ * @(*recv_func): it's a recv(2) like function
+ *
+ * This is the function were you set the recv() function gnutls
+ * is going to use. Normaly you may not use this function since
+ * the default (recv(2)) will probably be ok, unless you use
+ * some external library (like gnu pthreads), which provide
+ * a front end to this function. This function should be
+ * called once and after gnutls_global_init().
+ *
+ **/
+void gnutls_set_recv_func( ssize_t (*recv_func)(SOCKET,void*,size_t,int)) {
+ _gnutls_recv_func = recv_func;
+}
+
+/**
+ * gnutls_set_send_func - This function sets the send() function
+ * @(*send_func): it's a send(2) like function
+ *
+ * This is the function were you set the send() function gnutls
+ * is going to use. Normaly you may not use this function since
+ * the default (send(2)) will probably be ok, unless you use
+ * some external library (like gnu pthreads), which provide
+ * a front end to this function. This function should be
+ * called once and after gnutls_global_init().
+ **/
+void gnutls_set_send_func( ssize_t (*send_func)(SOCKET, const void*,size_t,int)) {
+ _gnutls_send_func = send_func;
+}
+
int gnutls_is_secure_memory(const void* mem) {
return 0;
}
/* set default recv/send functions
*/
- recv_func = recv;
- send_func = send;
+ _gnutls_recv_func = recv;
+ _gnutls_send_func = send;
/* initialize parser
* This should not deal with files in the final
return ret;
}
- if (state->gnutls_internals.valid_connection == VALID_FALSE) {
- gnutls_assert();
- return GNUTLS_E_INVALID_SESSION;
+ if (state->gnutls_internals.valid_connection == VALID_FALSE || sizeofdata==0) {
+ return 0; /* EOF */
+/* return GNUTLS_E_INVALID_SESSION; */
}
/* in order for GNUTLS_E_AGAIN to be returned the socket
gnutls_free(tmpdata);
- return GNUTLS_E_CLOSURE_ALERT_RECEIVED;
+ return 0; /* EOF */
+/* return GNUTLS_E_CLOSURE_ALERT_RECEIVED; */
} else {
/* if the alert is FATAL or WARNING
* 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.
+ * Returns the number of bytes received, zero on EOF, or
+ * a negative error code.
**/
ssize_t gnutls_recv(SOCKET cd, GNUTLS_STATE state, void *data, size_t sizeofdata, int flags) {
return gnutls_recv_int( cd, state, GNUTLS_APPLICATION_DATA, -1, data, sizeofdata, flags);
*
* This function has the same semantics as read() has. The only
* difference is that is accepts a GNUTLS state.
+ * Returns the number of bytes received, zero on EOF, or
+ * a negative error code.
**/
ssize_t gnutls_read(SOCKET cd, GNUTLS_STATE state, void *data, size_t sizeofdata) {
return gnutls_recv_int( cd, state, GNUTLS_APPLICATION_DATA, -1, data, sizeofdata, 0);
ret = gnutls_read(sd, state, buffer, MAX_BUF);
/* remove new line */
- if (gnutls_is_fatal_error(ret) == 1) {
- if (ret == GNUTLS_E_CLOSURE_ALERT_RECEIVED || ret == GNUTLS_E_INVALID_SESSION) {
+ if (gnutls_is_fatal_error(ret) == 1 || ret==0) {
+ if (ret == 0) {
printf("- Peer has closed the GNUTLS connection\n");
break;
} else {
*/
gnutls_set_cipher_priority(state, GNUTLS_NULL_CIPHER,
GNUTLS_RIJNDAEL_CBC, GNUTLS_3DES_CBC, GNUTLS_ARCFOUR, 0);
+ gnutls_set_cipher_priority(state, GNUTLS_NULL_CIPHER,
+ GNUTLS_RIJNDAEL_CBC, GNUTLS_3DES_CBC, 0);
gnutls_set_compression_priority(state, GNUTLS_ZLIB, GNUTLS_NULL_COMPRESSION, 0);
gnutls_set_kx_priority(state, GNUTLS_KX_DHE_RSA, GNUTLS_KX_RSA, GNUTLS_KX_SRP,
GNUTLS_KX_DH_ANON, 0);
* print the hostname he connected to.
*/
if (gnutls_ext_get_dnsname(state)!=NULL) {
- printf("\n<p>DNSNAME: ");
- printf("<b>%s</b></p>\n", gnutls_ext_get_dnsname(state));
+ sprintf(tmp2, "\n<p>DNSNAME: ");
+ sprintf(tmp2, "<b>%s</b></p>\n", gnutls_ext_get_dnsname(state));
}
/* print srp specific data */
bzero(buffer, MAX_BUF + 1);
ret = read_request(sd, state, buffer, MAX_BUF, (http==0)?1:2);
- if (gnutls_is_fatal_error(ret) == 1) {
- if (ret == GNUTLS_E_CLOSURE_ALERT_RECEIVED) {
+ if (gnutls_is_fatal_error(ret) == 1 || ret == 0) {
+ if (ret == 0) {
printf
("\n- Peer has closed the GNUTLS connection\n");
break;