Enlightenment CVS committal
Author : tsauerbeck
Project : e17
Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_con
Modified Files:
ecore_con.c ecore_con_private.h
Log Message:
ssl code fixes
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/ecore_con.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- ecore_con.c 2 Apr 2004 18:32:55 -0000 1.15
+++ ecore_con.c 3 Apr 2004 15:03:33 -0000 1.16
@@ -15,6 +15,7 @@
#include <stdlib.h>
#include <fcntl.h>
#include <netdb.h>
+#include <assert.h>
#if USE_OPENSSL
#include <time.h>
@@ -256,7 +257,7 @@
if (svr->path) free(svr->path);
if (svr->fd >= 0) close(svr->fd);
if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler);
- if (svr->buf) free(svr->buf);
+ if (svr->write_buf) free(svr->write_buf);
free(svr);
return NULL;
}
@@ -484,22 +485,22 @@
if (!data) return 0;
if (size < 1) return 0;
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
- if (svr->buf)
+ if (svr->write_buf)
{
unsigned char *newbuf;
- newbuf = realloc(svr->buf, svr->buf_size + size);
- if (newbuf) svr->buf = newbuf;
+ newbuf = realloc(svr->write_buf, svr->write_buf_size + size);
+ if (newbuf) svr->write_buf = newbuf;
else return 0;
- memcpy(svr->buf + svr->buf_size, data, size);
- svr->buf_size += size;
+ memcpy(svr->write_buf + svr->write_buf_size, data, size);
+ svr->write_buf_size += size;
}
else
{
- svr->buf = malloc(size);
- if (!svr->buf) return 0;
- svr->buf_size = size;
- memcpy(svr->buf, data, size);
+ svr->write_buf = malloc(size);
+ if (!svr->write_buf) return 0;
+ svr->write_buf_size = size;
+ memcpy(svr->write_buf, data, size);
}
_ecore_con_server_flush(svr);
return 1;
@@ -620,8 +621,8 @@
_ecore_con_server_free(Ecore_Con_Server *svr)
{
ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
- while ((svr->buf) && (!svr->dead)) _ecore_con_server_flush(svr);
- if (svr->buf) free(svr->buf);
+ while ((svr->write_buf) && (!svr->dead)) _ecore_con_server_flush(svr);
+ if (svr->write_buf) free(svr->write_buf);
servers = _ecore_list_remove(servers, svr);
while (svr->clients)
_ecore_con_client_free((Ecore_Con_Client *)svr->clients);
@@ -701,10 +702,88 @@
return 1;
}
+#if USE_OPENSSL
+/**
+ * Tries to connect a Ecore_Con_Server using a SSL connection.
+ *
+ * @param svr
+ * @return Boolean success or failure.
+ */
+static int svr_try_connect_ssl(Ecore_Con_Server *svr)
+{
+ int res, ssl_err, flag = 0;
+
+ assert(svr);
+ assert(svr->connecting);
+ assert(svr->ssl);
+
+ res = SSL_connect(svr->ssl);
+ ssl_err = SSL_get_error(svr->ssl, res);
+
+ if (ssl_err == SSL_ERROR_NONE)
+ return 1;
+
+ if (ssl_err == SSL_ERROR_WANT_READ)
+ flag = ECORE_FD_READ;
+ else if (ssl_err == SSL_ERROR_WANT_WRITE)
+ flag = ECORE_FD_WRITE;
+
+ if (flag)
+ ecore_main_fd_handler_active_set(svr->fd_handler, flag);
+
+ return 0;
+}
+#endif
+
+static int svr_try_connect(Ecore_Con_Server *svr)
+{
+ int so_err = 0, size = sizeof(int);
+
+ assert(svr);
+ assert(svr->connecting);
+
+ if (getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, &so_err, &size) < 0)
+ so_err = -1;
+
+ if (so_err != 0) { /* we lost our server! */
+ Ecore_Con_Event_Server_Del *e;
+
+ e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
+ if (e) {
+ e->server = svr;
+ ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
+ _ecore_con_event_server_del_free, NULL);
+ }
+
+ svr->dead = 1;
+ ecore_main_fd_handler_del(svr->fd_handler);
+ svr->fd_handler = NULL;
+ } else { /* we got our server! */
+ Ecore_Con_Event_Server_Add *e;
+
+ svr->connecting = 0;
+ e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
+ if (e) {
+ e->server = svr;
+ ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
+ _ecore_con_event_server_add_free, NULL);
+ }
+
+ if (!svr->write_buf)
+ ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+ }
+
+ return (!svr->dead);
+}
+
+
static int
_ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
{
Ecore_Con_Server *svr;
+#if USE_OPENSSL
+ int ssl_err = 0;
+#endif
svr = data;
if (svr->dead) return 1;
@@ -712,18 +791,30 @@
{
unsigned char *inbuf = NULL;
int inbuf_num = 0;
+
+#if USE_OPENSSL
+ if (svr->ssl && svr->connecting && svr_try_connect_ssl(svr) &&
+ !svr_try_connect(svr))
+ return 1;
+#endif
for (;;)
{
- char buf[65536];
- int num;
+ int num, lost_server = 0;
+
#if USE_OPENSSL
- if (!svr->ssl)
+ if (!svr->ssl) {
#endif
- num = read(svr->fd, buf, 65536);
+ if ((num = read(svr->fd, svr->read_buf, READBUFSIZ)) < 0)
+ lost_server = (errno == EIO || errno == EBADF ||
+ errno == EPIPE || errno == EINVAL ||
+ errno == ENOSPC || num == 0); /* is num == 0 right? */
#if USE_OPENSSL
- else
- num = SSL_read(svr->ssl, buf, 65536);
+ } else {
+ num = SSL_read(svr->ssl, svr->read_buf, READBUFSIZ);
+ ssl_err = SSL_get_error(svr->ssl, num);
+ lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN);
+ }
#endif
if (num < 1)
{
@@ -741,9 +832,7 @@
_ecore_con_event_server_data_free, NULL);
}
}
- if ((errno == EIO) || (errno == EBADF) ||
- (errno == EPIPE) || (errno == EINVAL) ||
- (errno == ENOSPC) || (num == 0)/* is num == 0 right? */)
+ if (lost_server)
{
/* we lost our server! */
Ecore_Con_Event_Server_Del *e;
@@ -758,74 +847,41 @@
svr->dead = 1;
ecore_main_fd_handler_del(svr->fd_handler);
svr->fd_handler = NULL;
+ return 1;
}
break;
}
else
{
inbuf = realloc(inbuf, inbuf_num + num);
- memcpy(inbuf + inbuf_num, buf, num);
+ memcpy(inbuf + inbuf_num, svr->read_buf, num);
inbuf_num += num;
}
}
- }
- else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
- {
- if (svr->connecting)
- {
- int so_err;
- int size;
#if USE_OPENSSL
- struct timespec t = {0, 250000000L};
-
- if (svr->ssl)
- while (SSL_connect(svr->ssl) == -1)
- nanosleep(&t, NULL);
+ if (svr->ssl && ssl_err == SSL_ERROR_WANT_READ)
+ ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
+ else if (svr->ssl && ssl_err == SSL_ERROR_WANT_WRITE)
+ ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
#endif
-
- svr->connecting = 0;
- so_err = 0;
- size = sizeof(int);
- if (getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, &so_err, &size) < 0) so_err
= -1;
- if (so_err != 0)
- {
- /* we lost our server! */
- Ecore_Con_Event_Server_Del *e;
-
- e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
- if (e)
- {
- e->server = svr;
- ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
- _ecore_con_event_server_del_free, NULL);
- }
- svr->dead = 1;
- ecore_main_fd_handler_del(svr->fd_handler);
- svr->fd_handler = NULL;
- ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
- return 1;
- }
- else
- {
- {
- /* we got our server! */
- Ecore_Con_Event_Server_Add *e;
-
- e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
- if (e)
- {
- e->server = svr;
- ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
- _ecore_con_event_server_add_free, NULL);
- }
- }
- if (!svr->buf)
- ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
- }
- }
- _ecore_con_server_flush(svr);
}
+ else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE)) {
+ if (svr->connecting) {
+#if USE_OPENSSL
+ if (!svr->ssl) {
+#endif
+ if (!svr_try_connect(svr))
+ return 1;
+#if USE_OPENSSL
+ } else if (svr_try_connect_ssl(svr) && !svr_try_connect(svr))
+ return 1;
+#endif
+ }
+
+ _ecore_con_server_flush(svr);
+ }
+
return 1;
}
@@ -900,23 +956,26 @@
static void
_ecore_con_server_flush(Ecore_Con_Server *svr)
{
- int count, num, err, lost_server = 0;
+ int count, num, lost_server = 0;
+#if USE_OPENSSL
+ int ssl_err;
+#endif
- if (!svr->buf) return;
+ if (!svr->write_buf) return;
/* check whether we need to write anything at all.
* we must not write zero bytes with SSL_write() since it
* causes undefined behaviour
*/
- if (svr->buf_size == svr->buf_offset)
+ if (svr->write_buf_size == svr->write_buf_offset)
return;
- num = svr->buf_size - svr->buf_offset;
+ num = svr->write_buf_size - svr->write_buf_offset;
#if USE_OPENSSL
if (!svr->ssl) {
#endif
- count = write(svr->fd, svr->buf + svr->buf_offset, num);
+ count = write(svr->fd, svr->write_buf + svr->write_buf_offset, num);
if (count < 1)
lost_server = (errno == EIO || errno == EBADF ||
@@ -924,19 +983,9 @@
errno == ENOSPC);
#if USE_OPENSSL
} else {
- struct timespec t = {0, 250000000L};
-
- for (;;) {
- count = SSL_write(svr->ssl, svr->buf + svr->buf_offset, num);
- err = SSL_get_error(svr->ssl, count);
-
- if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
- nanosleep(&t, NULL);
- else
- break;
- }
-
- lost_server = (err != SSL_ERROR_NONE);
+ count = SSL_write(svr->ssl, svr->write_buf + svr->write_buf_offset, num);
+ ssl_err = SSL_get_error(svr->ssl, count);
+ lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN);
}
#endif
@@ -958,16 +1007,25 @@
return;
}
- if (count < 1)
+ if (count < 1) {
+#if USE_OPENSSL
+ if (svr->ssl && ssl_err == SSL_ERROR_WANT_READ)
+ ecore_main_fd_handler_active_set(svr->fd_handler,
+ ECORE_FD_READ);
+ else if (svr->ssl && ssl_err == SSL_ERROR_WANT_WRITE)
+ ecore_main_fd_handler_active_set(svr->fd_handler,
+ ECORE_FD_WRITE);
+#endif
return;
+ }
- svr->buf_offset += count;
- if (svr->buf_offset >= svr->buf_size)
+ svr->write_buf_offset += count;
+ if (svr->write_buf_offset >= svr->write_buf_size)
{
- svr->buf_size = 0;
- svr->buf_offset = 0;
- free(svr->buf);
- svr->buf = NULL;
+ svr->write_buf_size = 0;
+ svr->write_buf_offset = 0;
+ free(svr->write_buf);
+ svr->write_buf = NULL;
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
}
}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/ecore_con_private.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- ecore_con_private.h 31 Mar 2004 16:47:45 -0000 1.3
+++ ecore_con_private.h 3 Apr 2004 15:03:33 -0000 1.4
@@ -8,6 +8,8 @@
#include <openssl/ssl.h>
#endif
+#define READBUFSIZ 65536
+
typedef struct _Ecore_Con_Client Ecore_Con_Client;
typedef struct _Ecore_Con_Server Ecore_Con_Server;
@@ -47,12 +49,16 @@
void *data;
Ecore_Fd_Handler *fd_handler;
Ecore_Con_Client *clients;
- int buf_size;
- int buf_offset;
- unsigned char *buf;
+ int write_buf_size;
+ int write_buf_offset;
+ unsigned char *write_buf;
char dead : 1;
char created : 1;
char connecting : 1;
+
+ /* put the read buffer here to play nice with OpenSSL */
+ unsigned char read_buf[READBUFSIZ];
+
#if USE_OPENSSL
SSL_CTX *ssl_ctx;
SSL *ssl;
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs