# # Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher # --- libetpan/src/Makefile.in~gnutls 2005-03-10 10:11:30.000000000 +0100 +++ libetpan/src/Makefile.in 2005-03-11 21:43:10.975597607 +0100 @@ -15,7 +15,7 @@ VERSINFO = @API_VERSION@ CC = @CC@ -LDFLAGS = @LIBS@ @SSLLIBS@ @LDFLAGS@ @DBLIB@ +LDFLAGS = @LIBS@ @SSLLIBS@ @LDFLAGS@ @DBLIB@ @GNUTLSLIBS@ SUBLIBS = data-types/libdata-types.la \ low-level/liblow-level.la \ --- libetpan/src/data-types/mailstream_ssl.c~gnutls 2005-03-10 10:11:30.000000000 +0100 +++ libetpan/src/data-types/mailstream_ssl.c 2005-03-11 21:44:56.373673788 +0100 @@ -61,7 +61,12 @@ /* mailstream_low, ssl */ #ifdef USE_SSL +#ifndef USE_GNUTLS #include +#else +#include +#include +#endif #ifdef LIBETPAN_REENTRANT #include #endif @@ -85,9 +90,9 @@ #ifdef USE_SSL static int mailstream_low_ssl_close(mailstream_low * s); static ssize_t mailstream_low_ssl_read(mailstream_low * s, - void * buf, size_t count); + void * buf, size_t count); static ssize_t mailstream_low_ssl_write(mailstream_low * s, - const void * buf, size_t count); + const void * buf, size_t count); static void mailstream_low_ssl_free(mailstream_low * s); static int mailstream_low_ssl_get_fd(mailstream_low * s); @@ -113,10 +118,10 @@ SSL_CTX * tmp_ctx; int fd_flags; int old_fd_flags; - + #ifdef LIBETPAN_REENTRANT pthread_mutex_lock(&ssl_lock); -#endif +#endif if (!ssl_init_done) { SSL_library_init(); ssl_init_done = 1; @@ -124,35 +129,37 @@ #ifdef LIBETPAN_REENTRANT pthread_mutex_unlock(&ssl_lock); #endif - + tmp_ctx = SSL_CTX_new(TLSv1_client_method()); if (tmp_ctx == NULL) goto err; - + ssl_conn = (SSL *) SSL_new(tmp_ctx); if (ssl_conn == NULL) goto free_ctx; - + if (SSL_set_fd(ssl_conn, fd) == 0) goto free_ssl_conn; - + +#ifndef USE_GNUTLS SSL_set_read_ahead(ssl_conn, 1); - +#endif + r = SSL_connect(ssl_conn); if (r <= 0) goto free_ssl_conn; - + fd_flags = fcntl(fd, F_GETFL, 0); old_fd_flags = fd_flags; fd_flags |= O_NDELAY; r = fcntl(fd, F_SETFL, fd_flags); if (r < 0) goto free_ssl_conn; - + ssl_data = malloc(sizeof(* ssl_data)); if (ssl_data == NULL) goto reset_fd_flags; - + ssl_data->fd = fd; ssl_data->ssl_conn = ssl_conn; ssl_data->ssl_ctx = tmp_ctx; @@ -241,52 +248,101 @@ } static ssize_t mailstream_low_ssl_read(mailstream_low * s, - void * buf, size_t count) + void * buf, size_t count) { struct mailstream_ssl_data * ssl_data; int r; ssl_data = (struct mailstream_ssl_data *) s->data; - + while (1) { int ssl_r; fd_set fds_read; +#ifndef USE_GNUTLS struct timeval timeout; - +#else + fd_set fds_excp; + + { + struct timeval timeout2; + timeout2 = mailstream_network_delay; + + FD_ZERO(&fds_read); + FD_SET(ssl_data->fd, &fds_read); + FD_ZERO(&fds_excp); + FD_SET(ssl_data->fd, &fds_excp); + r = select(ssl_data->fd + 1, &fds_read, NULL, &fds_excp, &timeout2); + if (r==0) { + return -1; + } + if (FD_ISSET(ssl_data->fd, &fds_excp)) + return -1; + if (!FD_ISSET(ssl_data->fd, &fds_read)) + return 0; + } +#endif r = SSL_read(ssl_data->ssl_conn, buf, count); - if (r > 0) + if (r > 0) { return r; - + } +#ifdef USE_GNUTLS + if (errno!=EAGAIN&&errno!=EWOULDBLOCK) { + return r; + } +#else ssl_r = SSL_get_error(ssl_data->ssl_conn, r); switch (ssl_r) { case SSL_ERROR_NONE: return r; - + case SSL_ERROR_ZERO_RETURN: return r; - + case SSL_ERROR_WANT_READ: timeout = mailstream_network_delay; - + FD_ZERO(&fds_read); FD_SET(ssl_data->fd, &fds_read); r = select(ssl_data->fd + 1, &fds_read, NULL, NULL, &timeout); if (r == 0) return -1; break; - + default: return r; } +#endif } } static ssize_t mailstream_low_ssl_write(mailstream_low * s, - const void * buf, size_t count) + const void * buf, size_t count) { struct mailstream_ssl_data * ssl_data; ssl_data = (struct mailstream_ssl_data *) s->data; +#ifdef USE_GNUTLS + { + fd_set fds_write; + fd_set fds_excp; + struct timeval timeout; + int r; + + timeout = mailstream_network_delay; + + FD_ZERO(&fds_write); + FD_SET(ssl_data->fd, &fds_write); + FD_ZERO(&fds_excp); + FD_SET(ssl_data->fd, &fds_excp); + r = select(ssl_data->fd + 1, NULL, &fds_write, &fds_excp, &timeout); + if (r == 0) + return -1; + if (FD_ISSET(ssl_data->fd, &fds_excp)) + return -1; + if (!FD_ISSET(ssl_data->fd, &fds_write)) + return 0; + } +#endif return SSL_write(ssl_data->ssl_conn, buf, count); } #endif