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:
parent
e909f1794a
commit
38636f3cb1
|
@ -96,12 +96,13 @@ ecore_con_shutdown(void)
|
|||
* FIXME: To be fixed.
|
||||
*/
|
||||
Ecore_Con_Server *
|
||||
ecore_con_server_add(Ecore_Con_Type type,
|
||||
ecore_con_server_add(Ecore_Con_Type compl_type,
|
||||
char *name,
|
||||
int port,
|
||||
const void *data)
|
||||
{
|
||||
Ecore_Con_Server *svr;
|
||||
Ecore_Con_Type type;
|
||||
struct sockaddr_in socket_addr;
|
||||
struct sockaddr_un socket_unix;
|
||||
struct linger lin;
|
||||
|
@ -114,6 +115,12 @@ ecore_con_server_add(Ecore_Con_Type type,
|
|||
svr = calloc(1, sizeof(Ecore_Con_Server));
|
||||
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) ||
|
||||
(type == ECORE_CON_LOCAL_SYSTEM))
|
||||
{
|
||||
|
@ -242,6 +249,20 @@ ecore_con_server_add(Ecore_Con_Type type,
|
|||
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);
|
||||
if (!svr->name) goto error;
|
||||
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_handler) ecore_main_fd_handler_del(svr->fd_handler);
|
||||
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);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -274,7 +299,7 @@ ecore_con_server_connect(Ecore_Con_Type compl_type,
|
|||
const void *data)
|
||||
{
|
||||
Ecore_Con_Server *svr;
|
||||
Ecore_Con_Type type = compl_type;
|
||||
Ecore_Con_Type type;
|
||||
struct sockaddr_un socket_unix;
|
||||
struct sockaddr_in socket_addr;
|
||||
int curstate = 0;
|
||||
|
@ -288,6 +313,7 @@ ecore_con_server_connect(Ecore_Con_Type compl_type,
|
|||
svr = calloc(1, sizeof(Ecore_Con_Server));
|
||||
if (!svr) return NULL;
|
||||
|
||||
type = compl_type;
|
||||
#if USE_OPENSSL
|
||||
/* unset the SSL flag for the following checks */
|
||||
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->fd >= 0) close(svr->fd);
|
||||
#if USE_OPENSSL
|
||||
if (svr->ssl) {
|
||||
if (svr->ssl)
|
||||
{
|
||||
SSL_shutdown(svr->ssl);
|
||||
SSL_free(svr->ssl);
|
||||
}
|
||||
|
||||
if (svr->ssl_ctx) SSL_CTX_free(svr->ssl_ctx);
|
||||
#endif
|
||||
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->fd_handler = ecore_main_fd_handler_add(cl->fd,
|
||||
ECORE_FD_READ,
|
||||
_ecore_con_svr_cl_handler, cl,
|
||||
NULL, NULL);
|
||||
_ecore_con_svr_cl_handler,
|
||||
cl, NULL, NULL);
|
||||
ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
|
||||
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
|
||||
/**
|
||||
* 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)
|
||||
static int
|
||||
svr_try_connect_ssl(Ecore_Con_Server *svr)
|
||||
{
|
||||
int res, ssl_err, flag = 0;
|
||||
|
||||
assert(svr);
|
||||
assert(svr->connecting);
|
||||
assert(svr->ssl);
|
||||
|
||||
if ((res = SSL_connect(svr->ssl)) == 1)
|
||||
return 1;
|
||||
|
||||
res = SSL_connect(svr->ssl);
|
||||
if ((res = SSL_connect(svr->ssl)) == 1) return 1;
|
||||
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;
|
||||
}
|
||||
#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);
|
||||
|
||||
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! */
|
||||
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) {
|
||||
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! */
|
||||
}
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -793,8 +806,10 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
|
|||
int inbuf_num = 0;
|
||||
|
||||
#if USE_OPENSSL
|
||||
if (svr->ssl && svr->connecting && svr_try_connect_ssl(svr) &&
|
||||
!svr_try_connect(svr))
|
||||
if ((svr->ssl) &&
|
||||
(svr->connecting) &&
|
||||
(svr_try_connect_ssl(svr)) &&
|
||||
(!svr_try_connect(svr)))
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
|
@ -803,20 +818,24 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
|
|||
int num, lost_server = 0;
|
||||
|
||||
#if USE_OPENSSL
|
||||
if (!svr->ssl) {
|
||||
if (!svr->ssl)
|
||||
{
|
||||
#endif
|
||||
if ((num = read(svr->fd, svr->read_buf, READBUFSIZ)) < 1)
|
||||
lost_server = (errno == EIO || errno == EBADF ||
|
||||
errno == EPIPE || errno == EINVAL ||
|
||||
errno == ENOSPC || num == 0); /* is num == 0 right? */
|
||||
#if USE_OPENSSL
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
num = SSL_read(svr->ssl, svr->read_buf, READBUFSIZ);
|
||||
|
||||
if (num < 1) {
|
||||
if (num < 1)
|
||||
{
|
||||
ssl_err = SSL_get_error(svr->ssl, num);
|
||||
lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN);
|
||||
} else
|
||||
}
|
||||
else
|
||||
ssl_err = SSL_ERROR_NONE;
|
||||
}
|
||||
#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);
|
||||
#endif
|
||||
}
|
||||
else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE)) {
|
||||
if (svr->connecting) {
|
||||
else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
|
||||
{
|
||||
if (svr->connecting)
|
||||
{
|
||||
#if USE_OPENSSL
|
||||
if (!svr->ssl) {
|
||||
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))
|
||||
}
|
||||
else if ((svr_try_connect_ssl(svr)) && (!svr_try_connect(svr)))
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
_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! */
|
||||
Ecore_Con_Event_Client_Del *e;
|
||||
|
||||
printf("read ERR\n", num);
|
||||
e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
|
||||
if (e)
|
||||
{
|
||||
|
@ -975,28 +998,31 @@ _ecore_con_server_flush(Ecore_Con_Server *svr)
|
|||
return;
|
||||
|
||||
num = svr->write_buf_size - svr->write_buf_offset;
|
||||
|
||||
#if USE_OPENSSL
|
||||
if (!svr->ssl) {
|
||||
if (!svr->ssl)
|
||||
{
|
||||
#endif
|
||||
count = write(svr->fd, svr->write_buf + svr->write_buf_offset, num);
|
||||
|
||||
if (count < 1)
|
||||
lost_server = (errno == EIO || errno == EBADF ||
|
||||
errno == EPIPE || errno == EINVAL ||
|
||||
errno == ENOSPC);
|
||||
#if USE_OPENSSL
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
lost_server = (ssl_err == SSL_ERROR_ZERO_RETURN);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (lost_server) {
|
||||
if (lost_server)
|
||||
{
|
||||
/* we lost our server! */
|
||||
Ecore_Con_Event_Server_Del *e;
|
||||
|
||||
|
@ -1014,7 +1040,8 @@ _ecore_con_server_flush(Ecore_Con_Server *svr)
|
|||
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,
|
||||
|
|
|
@ -570,7 +570,7 @@ _ecore_ipc_event_client_data(void *data, int ev_type, void *ev)
|
|||
_ecore_ipc_event_client_data_free, NULL);
|
||||
}
|
||||
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);
|
||||
major = ntohl(msg->major);
|
||||
|
@ -580,7 +580,7 @@ _ecore_ipc_event_client_data(void *data, int ev_type, void *ev)
|
|||
response = ntohl(msg->response);
|
||||
size = ntohl(msg->size);
|
||||
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;
|
||||
}
|
||||
/* 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;
|
||||
return 0;
|
||||
}
|
||||
memcpy(buf, cl->buf + offset + sizeof(Ecore_Ipc_Msg_Head), size);
|
||||
memcpy(buf, cl->buf + offset, size);
|
||||
free(cl->buf);
|
||||
cl->buf = buf;
|
||||
cl->buf_size = size;
|
||||
|
|
Loading…
Reference in New Issue