fix a bug in ecore_ipc - damn.. how could that stay there? :)

and err - clean up some indenting etc...

trill - going to put n SSL server support too (ie ecore can act as SSL server
too) ?


SVN revision: 9720
This commit is contained in:
Carsten Haitzler 2004-04-14 08:51:19 +00:00
parent e909f1794a
commit 38636f3cb1
3 changed files with 198 additions and 171 deletions

View File

@ -96,12 +96,13 @@ ecore_con_shutdown(void)
* FIXME: To be fixed. * FIXME: To be fixed.
*/ */
Ecore_Con_Server * Ecore_Con_Server *
ecore_con_server_add(Ecore_Con_Type type, ecore_con_server_add(Ecore_Con_Type compl_type,
char *name, char *name,
int port, int port,
const void *data) const void *data)
{ {
Ecore_Con_Server *svr; Ecore_Con_Server *svr;
Ecore_Con_Type type;
struct sockaddr_in socket_addr; struct sockaddr_in socket_addr;
struct sockaddr_un socket_unix; struct sockaddr_un socket_unix;
struct linger lin; struct linger lin;
@ -114,6 +115,12 @@ ecore_con_server_add(Ecore_Con_Type type,
svr = calloc(1, sizeof(Ecore_Con_Server)); svr = calloc(1, sizeof(Ecore_Con_Server));
if (!svr) return NULL; if (!svr) return NULL;
type = compl_type;
#if USE_OPENSSL
/* unset the SSL flag for the following checks */
type &= ~ECORE_CON_USE_SSL;
#endif
if ((type == ECORE_CON_LOCAL_USER) || if ((type == ECORE_CON_LOCAL_USER) ||
(type == ECORE_CON_LOCAL_SYSTEM)) (type == ECORE_CON_LOCAL_SYSTEM))
{ {
@ -242,6 +249,20 @@ ecore_con_server_add(Ecore_Con_Type type,
if (!svr->fd_handler) goto error; if (!svr->fd_handler) goto error;
} }
#if USE_OPENSSL
if (compl_type & ECORE_CON_USE_SSL)
{
/* SSLv3 gives *weird* results on my box, don't use it yet */
if (!(svr->ssl_ctx = SSL_CTX_new(SSLv2_client_method())))
goto error;
if (!(svr->ssl = SSL_new(svr->ssl_ctx)))
goto error;
SSL_set_fd(svr->ssl, svr->fd);
}
#endif
svr->name = strdup(name); svr->name = strdup(name);
if (!svr->name) goto error; if (!svr->name) goto error;
svr->type = type; svr->type = type;
@ -258,6 +279,10 @@ ecore_con_server_add(Ecore_Con_Type type,
if (svr->fd >= 0) close(svr->fd); if (svr->fd >= 0) close(svr->fd);
if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler); if (svr->fd_handler) ecore_main_fd_handler_del(svr->fd_handler);
if (svr->write_buf) free(svr->write_buf); if (svr->write_buf) free(svr->write_buf);
#if USE_OPENSSL
if (svr->ssl) SSL_free(svr->ssl);
if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx);
#endif
free(svr); free(svr);
return NULL; return NULL;
} }
@ -274,7 +299,7 @@ ecore_con_server_connect(Ecore_Con_Type compl_type,
const void *data) const void *data)
{ {
Ecore_Con_Server *svr; Ecore_Con_Server *svr;
Ecore_Con_Type type = compl_type; Ecore_Con_Type type;
struct sockaddr_un socket_unix; struct sockaddr_un socket_unix;
struct sockaddr_in socket_addr; struct sockaddr_in socket_addr;
int curstate = 0; int curstate = 0;
@ -288,6 +313,7 @@ ecore_con_server_connect(Ecore_Con_Type compl_type,
svr = calloc(1, sizeof(Ecore_Con_Server)); svr = calloc(1, sizeof(Ecore_Con_Server));
if (!svr) return NULL; if (!svr) return NULL;
type = compl_type;
#if USE_OPENSSL #if USE_OPENSSL
/* unset the SSL flag for the following checks */ /* unset the SSL flag for the following checks */
type &= ~ECORE_CON_USE_SSL; type &= ~ECORE_CON_USE_SSL;
@ -629,11 +655,11 @@ _ecore_con_server_free(Ecore_Con_Server *svr)
if ((svr->created) && (svr->path)) unlink(svr->path); if ((svr->created) && (svr->path)) unlink(svr->path);
if (svr->fd >= 0) close(svr->fd); if (svr->fd >= 0) close(svr->fd);
#if USE_OPENSSL #if USE_OPENSSL
if (svr->ssl) { if (svr->ssl)
{
SSL_shutdown(svr->ssl); SSL_shutdown(svr->ssl);
SSL_free(svr->ssl); SSL_free(svr->ssl);
} }
if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx); if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx);
#endif #endif
if (svr->name) free(svr->name); if (svr->name) free(svr->name);
@ -683,8 +709,8 @@ _ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler)
cl->server = svr; cl->server = svr;
cl->fd_handler = ecore_main_fd_handler_add(cl->fd, cl->fd_handler = ecore_main_fd_handler_add(cl->fd,
ECORE_FD_READ, ECORE_FD_READ,
_ecore_con_svr_cl_handler, cl, _ecore_con_svr_cl_handler,
NULL, NULL); cl, NULL, NULL);
ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT); ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
svr->clients = _ecore_list_append(svr->clients, cl); svr->clients = _ecore_list_append(svr->clients, cl);
{ {
@ -703,76 +729,63 @@ _ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler)
} }
#if USE_OPENSSL #if USE_OPENSSL
/** static int
* Tries to connect a Ecore_Con_Server using a SSL connection. svr_try_connect_ssl(Ecore_Con_Server *svr)
*
* @param svr
* @return Boolean success or failure.
*/
static int svr_try_connect_ssl(Ecore_Con_Server *svr)
{ {
int res, ssl_err, flag = 0; int res, ssl_err, flag = 0;
assert(svr); res = SSL_connect(svr->ssl);
assert(svr->connecting); if ((res = SSL_connect(svr->ssl)) == 1) return 1;
assert(svr->ssl);
if ((res = SSL_connect(svr->ssl)) == 1)
return 1;
ssl_err = SSL_get_error(svr->ssl, res); ssl_err = SSL_get_error(svr->ssl, res);
assert (ssl_err != SSL_ERROR_NONE);
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);
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; return 0;
} }
#endif #endif
static int svr_try_connect(Ecore_Con_Server *svr) static int
svr_try_connect(Ecore_Con_Server *svr)
{ {
int so_err = 0, size = sizeof(int); int so_err = 0, size = sizeof(int);
assert(svr);
assert(svr->connecting);
if (getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, &so_err, &size) < 0) if (getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, &so_err, &size) < 0)
so_err = -1; so_err = -1;
if (so_err != 0) { /* we lost our server! */ if (so_err != 0)
{
/* we lost our server! */
Ecore_Con_Event_Server_Del *e; Ecore_Con_Event_Server_Del *e;
e = calloc(1, sizeof(Ecore_Con_Event_Server_Del)); e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
if (e) { if (e)
{
e->server = svr; e->server = svr;
ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e, ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
_ecore_con_event_server_del_free, NULL); _ecore_con_event_server_del_free, NULL);
} }
svr->dead = 1; svr->dead = 1;
ecore_main_fd_handler_del(svr->fd_handler); ecore_main_fd_handler_del(svr->fd_handler);
svr->fd_handler = NULL; svr->fd_handler = NULL;
} else { /* we got our server! */ }
else
{
/* we got our server! */
Ecore_Con_Event_Server_Add *e; Ecore_Con_Event_Server_Add *e;
svr->connecting = 0; svr->connecting = 0;
e = calloc(1, sizeof(Ecore_Con_Event_Server_Add)); e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
if (e) { if (e)
{
e->server = svr; e->server = svr;
ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
_ecore_con_event_server_add_free, NULL); _ecore_con_event_server_add_free, NULL);
} }
if (!svr->write_buf) if (!svr->write_buf)
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
} }
return (!svr->dead); return (!svr->dead);
} }
@ -793,8 +806,10 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
int inbuf_num = 0; int inbuf_num = 0;
#if USE_OPENSSL #if USE_OPENSSL
if (svr->ssl && svr->connecting && svr_try_connect_ssl(svr) && if ((svr->ssl) &&
!svr_try_connect(svr)) (svr->connecting) &&
(svr_try_connect_ssl(svr)) &&
(!svr_try_connect(svr)))
return 1; return 1;
#endif #endif
@ -803,20 +818,24 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
int num, lost_server = 0; int num, lost_server = 0;
#if USE_OPENSSL #if USE_OPENSSL
if (!svr->ssl) { if (!svr->ssl)
{
#endif #endif
if ((num = read(svr->fd, svr->read_buf, READBUFSIZ)) < 1) if ((num = read(svr->fd, svr->read_buf, READBUFSIZ)) < 1)
lost_server = (errno == EIO || errno == EBADF || lost_server = (errno == EIO || errno == EBADF ||
errno == EPIPE || errno == EINVAL || errno == EPIPE || errno == EINVAL ||
errno == ENOSPC || num == 0); /* is num == 0 right? */ errno == ENOSPC || num == 0); /* is num == 0 right? */
#if USE_OPENSSL #if USE_OPENSSL
} else { }
else
{
num = SSL_read(svr->ssl, svr->read_buf, READBUFSIZ); num = SSL_read(svr->ssl, svr->read_buf, READBUFSIZ);
if (num < 1)
if (num < 1) { {
ssl_err = SSL_get_error(svr->ssl, num); ssl_err = SSL_get_error(svr->ssl, num);
lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN); lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN);
} else }
else
ssl_err = SSL_ERROR_NONE; ssl_err = SSL_ERROR_NONE;
} }
#endif #endif
@ -870,19 +889,22 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
#endif #endif
} }
else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE)) { else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
if (svr->connecting) { {
if (svr->connecting)
{
#if USE_OPENSSL #if USE_OPENSSL
if (!svr->ssl) { if (!svr->ssl)
{
#endif #endif
if (!svr_try_connect(svr)) if (!svr_try_connect(svr))
return 1; return 1;
#if USE_OPENSSL #if USE_OPENSSL
} else if (svr_try_connect_ssl(svr) && !svr_try_connect(svr)) }
else if ((svr_try_connect_ssl(svr)) && (!svr_try_connect(svr)))
return 1; return 1;
#endif #endif
} }
_ecore_con_server_flush(svr); _ecore_con_server_flush(svr);
} }
@ -931,6 +953,7 @@ _ecore_con_svr_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
/* we lost our client! */ /* we lost our client! */
Ecore_Con_Event_Client_Del *e; Ecore_Con_Event_Client_Del *e;
printf("read ERR\n", num);
e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
if (e) if (e)
{ {
@ -975,28 +998,31 @@ _ecore_con_server_flush(Ecore_Con_Server *svr)
return; return;
num = svr->write_buf_size - svr->write_buf_offset; num = svr->write_buf_size - svr->write_buf_offset;
#if USE_OPENSSL #if USE_OPENSSL
if (!svr->ssl) { if (!svr->ssl)
{
#endif #endif
count = write(svr->fd, svr->write_buf + svr->write_buf_offset, num); count = write(svr->fd, svr->write_buf + svr->write_buf_offset, num);
if (count < 1) if (count < 1)
lost_server = (errno == EIO || errno == EBADF || lost_server = (errno == EIO || errno == EBADF ||
errno == EPIPE || errno == EINVAL || errno == EPIPE || errno == EINVAL ||
errno == ENOSPC); errno == ENOSPC);
#if USE_OPENSSL #if USE_OPENSSL
} else { }
else
{
count = SSL_write(svr->ssl, svr->write_buf + svr->write_buf_offset, num); count = SSL_write(svr->ssl, svr->write_buf + svr->write_buf_offset, num);
if (count < 1) { if (count < 1)
{
ssl_err = SSL_get_error(svr->ssl, count); ssl_err = SSL_get_error(svr->ssl, count);
lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN); lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN);
} }
} }
#endif #endif
if (lost_server) { if (lost_server)
{
/* we lost our server! */ /* we lost our server! */
Ecore_Con_Event_Server_Del *e; Ecore_Con_Event_Server_Del *e;
@ -1014,7 +1040,8 @@ _ecore_con_server_flush(Ecore_Con_Server *svr)
return; return;
} }
if (count < 1) { if (count < 1)
{
#if USE_OPENSSL #if USE_OPENSSL
if (svr->ssl && ssl_err == SSL_ERROR_WANT_READ) if (svr->ssl && ssl_err == SSL_ERROR_WANT_READ)
ecore_main_fd_handler_active_set(svr->fd_handler, ecore_main_fd_handler_active_set(svr->fd_handler,

View File

@ -570,7 +570,7 @@ _ecore_ipc_event_client_data(void *data, int ev_type, void *ev)
_ecore_ipc_event_client_data_free, NULL); _ecore_ipc_event_client_data_free, NULL);
} }
offset += (sizeof(Ecore_Ipc_Msg_Head) + size); offset += (sizeof(Ecore_Ipc_Msg_Head) + size);
if (cl->buf_size - offset >= sizeof(Ecore_Ipc_Msg_Head)) if ((cl->buf_size - offset) >= sizeof(Ecore_Ipc_Msg_Head))
{ {
msg = (Ecore_Ipc_Msg_Head *)(cl->buf + offset); msg = (Ecore_Ipc_Msg_Head *)(cl->buf + offset);
major = ntohl(msg->major); major = ntohl(msg->major);
@ -580,7 +580,7 @@ _ecore_ipc_event_client_data(void *data, int ev_type, void *ev)
response = ntohl(msg->response); response = ntohl(msg->response);
size = ntohl(msg->size); size = ntohl(msg->size);
if (size < 0) size = 0; if (size < 0) size = 0;
if (cl->buf_size - offset >= (sizeof(Ecore_Ipc_Msg_Head) + size)) if ((cl->buf_size - offset) >= (sizeof(Ecore_Ipc_Msg_Head) + size))
goto redo; goto redo;
} }
/* remove data from our buffer and "scoll" the rest down */ /* remove data from our buffer and "scoll" the rest down */
@ -596,7 +596,7 @@ _ecore_ipc_event_client_data(void *data, int ev_type, void *ev)
cl->buf_size = 0; cl->buf_size = 0;
return 0; return 0;
} }
memcpy(buf, cl->buf + offset + sizeof(Ecore_Ipc_Msg_Head), size); memcpy(buf, cl->buf + offset, size);
free(cl->buf); free(cl->buf);
cl->buf = buf; cl->buf = buf;
cl->buf_size = size; cl->buf_size = size;