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.
|
* 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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue