more safety measures

SVN revision: 23081
This commit is contained in:
Carsten Haitzler 2006-06-02 07:24:04 +00:00
parent 7ee02394bc
commit ff5f8cc24f
2 changed files with 161 additions and 112 deletions

View File

@ -434,6 +434,8 @@ ecore_con_server_connect(Ecore_Con_Type compl_type,
_ecore_con_cl_handler, svr,
NULL, NULL);
if (!svr->fd_handler) goto error;
if (!svr->delete_me)
{
/* we got our server! */
Ecore_Con_Event_Server_Add *e;
@ -974,6 +976,7 @@ _ecore_con_svr_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__)
(ip >> 16) & 0xff,
(ip >> 24) & 0xff);
cl->ip = strdup(buf);
if (!cl->delete_me)
{
Ecore_Con_Event_Client_Add *e;
@ -1015,7 +1018,10 @@ svr_try_connect_ssl(Ecore_Con_Server *svr)
if (ssl_err == SSL_ERROR_WANT_READ) flag = ECORE_FD_READ;
else if (ssl_err == SSL_ERROR_WANT_WRITE) flag = ECORE_FD_WRITE;
else return -1;
if (flag) ecore_main_fd_handler_active_set(svr->fd_handler, flag);
if (svr->fd_handler)
{
if (flag) ecore_main_fd_handler_active_set(svr->fd_handler, flag);
}
return 0;
}
#endif
@ -1023,15 +1029,18 @@ svr_try_connect_ssl(Ecore_Con_Server *svr)
static void
kill_server(Ecore_Con_Server *svr)
{
Ecore_Con_Event_Server_Del *e;
e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
if (e)
if (!svr->delete_me)
{
svr->event_count++;
e->server = svr;
ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
_ecore_con_event_server_del_free, NULL);
Ecore_Con_Event_Server_Del *e;
e = calloc(1, sizeof(Ecore_Con_Event_Server_Del));
if (e)
{
svr->event_count++;
e->server = svr;
ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
_ecore_con_event_server_del_free, NULL);
}
}
svr->dead = 1;
@ -1129,20 +1138,26 @@ svr_try_connect_plain(Ecore_Con_Server *svr)
}
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 (!svr->delete_me)
{
svr->event_count++;
e->server = svr;
ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
_ecore_con_event_server_add_free, NULL);
/* we got our server! */
Ecore_Con_Event_Server_Add *e;
svr->connecting = 0;
e = calloc(1, sizeof(Ecore_Con_Event_Server_Add));
if (e)
{
svr->event_count++;
e->server = svr;
ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e,
_ecore_con_event_server_add_free, NULL);
}
}
if (svr->fd_handler)
{
if (!svr->write_buf)
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
}
if (!svr->write_buf)
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
}
return (!svr->dead);
}
@ -1231,18 +1246,21 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
{
if (inbuf)
{
Ecore_Con_Event_Server_Data *e;
e = calloc(1, sizeof(Ecore_Con_Event_Server_Data));
if (e)
if (!svr->delete_me)
{
svr->event_count++;
e->server = svr;
e->data = inbuf;
e->size = inbuf_num;
ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e,
_ecore_con_event_server_data_free,
NULL);
Ecore_Con_Event_Server_Data *e;
e = calloc(1, sizeof(Ecore_Con_Event_Server_Data));
if (e)
{
svr->event_count++;
e->server = svr;
e->data = inbuf;
e->size = inbuf_num;
ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e,
_ecore_con_event_server_data_free,
NULL);
}
}
}
if (lost_server)
@ -1262,10 +1280,13 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
}
#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);
if (svr->fd_handler)
{
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
}
else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
@ -1303,38 +1324,45 @@ _ecore_con_svr_cl_handler(void *data, Ecore_Fd_Handler *fd_handler)
{
if (inbuf)
{
Ecore_Con_Event_Client_Data *e;
e = calloc(1, sizeof(Ecore_Con_Event_Client_Data));
if (e)
if (!cl->delete_me)
{
cl->event_count++;
e->client = cl;
e->data = inbuf;
e->size = inbuf_num;
ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e,
_ecore_con_event_client_data_free,
NULL);
Ecore_Con_Event_Client_Data *e;
e = calloc(1, sizeof(Ecore_Con_Event_Client_Data));
if (e)
{
cl->event_count++;
e->client = cl;
e->data = inbuf;
e->size = inbuf_num;
ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e,
_ecore_con_event_client_data_free,
NULL);
}
}
}
if ((errno == EIO) || (errno == EBADF) ||
(errno == EPIPE) || (errno == EINVAL) ||
(errno == ENOSPC) || (num == 0)/* is num == 0 right? */)
{
/* we lost our client! */
Ecore_Con_Event_Client_Del *e;
e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
if (e)
if (!cl->delete_me)
{
cl->event_count++;
e->client = cl;
ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
_ecore_con_event_client_del_free,
NULL);
/* we lost our client! */
Ecore_Con_Event_Client_Del *e;
e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
if (e)
{
cl->event_count++;
e->client = cl;
ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
_ecore_con_event_client_del_free,
NULL);
}
}
cl->dead = 1;
ecore_main_fd_handler_del(cl->fd_handler);
if (cl->fd_handler)
ecore_main_fd_handler_del(cl->fd_handler);
cl->fd_handler = NULL;
}
break;
@ -1403,12 +1431,15 @@ _ecore_con_server_flush(Ecore_Con_Server *svr)
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);
if (svr->fd_handler)
{
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;
}
@ -1420,7 +1451,8 @@ _ecore_con_server_flush(Ecore_Con_Server *svr)
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);
if (svr->fd_handler)
ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
}
}
@ -1437,20 +1469,24 @@ _ecore_con_client_flush(Ecore_Con_Client *cl)
if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) ||
(errno == EINVAL) || (errno == ENOSPC))
{
/* we lost our client! */
Ecore_Con_Event_Client_Del *e;
e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
if (e)
if (!cl->delete_me)
{
cl->event_count++;
e->client = cl;
ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
_ecore_con_event_client_del_free, NULL);
/* we lost our client! */
Ecore_Con_Event_Client_Del *e;
e = calloc(1, sizeof(Ecore_Con_Event_Client_Del));
if (e)
{
cl->event_count++;
e->client = cl;
ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
_ecore_con_event_client_del_free, NULL);
}
cl->dead = 1;
if (cl->fd_handler)
ecore_main_fd_handler_del(cl->fd_handler);
cl->fd_handler = NULL;
}
cl->dead = 1;
ecore_main_fd_handler_del(cl->fd_handler);
cl->fd_handler = NULL;
}
return;
}
@ -1461,7 +1497,8 @@ _ecore_con_client_flush(Ecore_Con_Client *cl)
cl->buf_offset = 0;
free(cl->buf);
cl->buf = NULL;
ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
if (cl->fd_handler)
ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
}
}

View File

@ -973,6 +973,7 @@ _ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void
ecore_con_client_data_set(cl->client, (void *)cl);
svr->clients = _ecore_list2_append(svr->clients, cl);
ecore_list_append(svr->client_list, cl);
if (!cl->delete_me)
{
Ecore_Ipc_Event_Client_Add *e2;
@ -1009,13 +1010,16 @@ _ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void
ecore_list_goto(svr->client_list, cl);
ecore_list_remove(svr->client_list);
ecore_list_goto_first(svr->client_list);
e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
if (e2)
if (!cl->delete_me)
{
cl->event_count++;
e2->client = cl;
ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
_ecore_ipc_event_client_del_free, NULL);
e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
if (e2)
{
cl->event_count++;
e2->client = cl;
ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
_ecore_ipc_event_client_del_free, NULL);
}
}
}
}
@ -1034,6 +1038,7 @@ _ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void
Ecore_Ipc_Server *svr;
svr = ecore_con_server_data_get(e->server);
if (!svr->delete_me)
{
Ecore_Ipc_Event_Server_Add *e2;
@ -1062,6 +1067,7 @@ _ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void
Ecore_Ipc_Server *svr;
svr = ecore_con_server_data_get(e->server);
if (!svr->delete_me)
{
Ecore_Ipc_Event_Server_Del *e2;
@ -1219,21 +1225,24 @@ _ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void
if (!buf) return 0;
memcpy(buf, cl->buf + offset + s, msg.size);
}
e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
if (e2)
if (!cl->delete_me)
{
cl->event_count++;
e2->client = cl;
e2->major = msg.major;
e2->minor = msg.minor;
e2->ref = msg.ref;
e2->ref_to = msg.ref_to;
e2->response = msg.response;
e2->size = msg.size;
e2->data = buf;
ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
_ecore_ipc_event_client_data_free,
NULL);
e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
if (e2)
{
cl->event_count++;
e2->client = cl;
e2->major = msg.major;
e2->minor = msg.minor;
e2->ref = msg.ref;
e2->ref_to = msg.ref_to;
e2->response = msg.response;
e2->size = msg.size;
e2->data = buf;
ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
_ecore_ipc_event_client_data_free,
NULL);
}
}
}
cl->prev.i = msg;
@ -1399,21 +1408,24 @@ _ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void
if (!buf) return 0;
memcpy(buf, svr->buf + offset + s, msg.size);
}
e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
if (e2)
if (!svr->delete_me)
{
svr->event_count++;
e2->server = svr;
e2->major = msg.major;
e2->minor = msg.minor;
e2->ref = msg.ref;
e2->ref_to = msg.ref_to;
e2->response = msg.response;
e2->size = msg.size;
e2->data = buf;
ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
_ecore_ipc_event_server_data_free,
NULL);
e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
if (e2)
{
svr->event_count++;
e2->server = svr;
e2->major = msg.major;
e2->minor = msg.minor;
e2->ref = msg.ref;
e2->ref_to = msg.ref_to;
e2->response = msg.response;
e2->size = msg.size;
e2->data = buf;
ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
_ecore_ipc_event_server_data_free,
NULL);
}
}
}
svr->prev.i = msg;