fixed segfault
parent
02c25c150d
commit
2813bd2695
|
@ -101,7 +101,7 @@ struct ipc_error ipc_contact_ipcd (int *pfd, const char *sname)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create context, contact ipcd, connects to the service.
|
// Create context, contact ipcd, connects to the service.
|
||||||
struct ipc_error ipc_connection_ (struct ipc_ctx *ctx, const char *sname, enum ipc_connection_type type)
|
struct ipc_error ipc_connection_ (struct ipc_ctx *ctx, const char *sname, enum ipc_connection_type type, int *serverfd)
|
||||||
{
|
{
|
||||||
T_R ((ctx == NULL), IPC_ERROR_CONNECTION__NO_CTX);
|
T_R ((ctx == NULL), IPC_ERROR_CONNECTION__NO_CTX);
|
||||||
T_R ((sname == NULL), IPC_ERROR_CONNECTION__NO_SERVICE_NAME);
|
T_R ((sname == NULL), IPC_ERROR_CONNECTION__NO_SERVICE_NAME);
|
||||||
|
@ -124,6 +124,10 @@ struct ipc_error ipc_connection_ (struct ipc_ctx *ctx, const char *sname, enum i
|
||||||
// Add the server to the listened file descriptors.
|
// Add the server to the listened file descriptors.
|
||||||
TEST_IPC_RR (ipc_add (ctx, &srv, &pollfd), "cannot add the server in the context");
|
TEST_IPC_RR (ipc_add (ctx, &srv, &pollfd), "cannot add the server in the context");
|
||||||
|
|
||||||
|
if (serverfd != NULL) {
|
||||||
|
*serverfd = pollfd.fd;
|
||||||
|
}
|
||||||
|
|
||||||
IPC_RETURN_NO_ERROR;
|
IPC_RETURN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,17 +149,37 @@ int ipc_ctx_fd_type (struct ipc_ctx *ctx, int fd, enum ipc_connection_type type)
|
||||||
struct ipc_error ipc_connection (struct ipc_ctx *ctx, const char *sname)
|
struct ipc_error ipc_connection (struct ipc_ctx *ctx, const char *sname)
|
||||||
{
|
{
|
||||||
// Data received on the socket = messages, not new clients, and not switched (no callbacks).
|
// Data received on the socket = messages, not new clients, and not switched (no callbacks).
|
||||||
return ipc_connection_ (ctx, sname, IPC_CONNECTION_TYPE_IPC);
|
return ipc_connection_ (ctx, sname, IPC_CONNECTION_TYPE_IPC, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ipc_error ipc_connection_switched (struct ipc_ctx *ctx, const char *sname)
|
struct ipc_error ipc_connection_switched (struct ipc_ctx *ctx, const char *sname, int clientfd, int *serverfd)
|
||||||
{
|
{
|
||||||
|
int sfd = 0;
|
||||||
// Data received are for switched fd (callbacks should be used).
|
// Data received are for switched fd (callbacks should be used).
|
||||||
return ipc_connection_ (ctx, sname, IPC_CONNECTION_TYPE_SWITCHED);
|
struct ipc_error ret = ipc_connection_ (ctx
|
||||||
|
, sname
|
||||||
|
, IPC_CONNECTION_TYPE_SWITCHED
|
||||||
|
, &sfd);
|
||||||
|
|
||||||
|
if (ret.error_code != IPC_ERROR_NONE) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (serverfd != NULL) {
|
||||||
|
*serverfd = sfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
ipc_add_fd_switched (ctx, clientfd);
|
||||||
|
// ipc_ctx_fd_type (ctx, clientfd, IPC_CONNECTION_TYPE_SWITCHED);
|
||||||
|
ipc_ctx_switching_add (ctx, clientfd, sfd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ipc_error ipc_close_all (struct ipc_ctx *ctx)
|
struct ipc_error ipc_close_all (struct ipc_ctx *ctx)
|
||||||
{
|
{
|
||||||
|
T_R ((ctx == NULL), IPC_ERROR_CLOSE_ALL__NO_CTX_PARAM);
|
||||||
|
|
||||||
for (size_t i = 0 ; i < ctx->size ; i++) {
|
for (size_t i = 0 ; i < ctx->size ; i++) {
|
||||||
TEST_IPC_P (ipc_close (ctx, i), "cannot close a connection in handle_message");
|
TEST_IPC_P (ipc_close (ctx, i), "cannot close a connection in handle_message");
|
||||||
}
|
}
|
||||||
|
@ -165,6 +189,8 @@ struct ipc_error ipc_close_all (struct ipc_ctx *ctx)
|
||||||
|
|
||||||
struct ipc_error ipc_close (struct ipc_ctx *ctx, uint32_t index)
|
struct ipc_error ipc_close (struct ipc_ctx *ctx, uint32_t index)
|
||||||
{
|
{
|
||||||
|
T_R ((ctx == NULL), IPC_ERROR_CLOSE__NO_CTX_PARAM);
|
||||||
|
|
||||||
struct ipc_error ret = usock_close (ctx->pollfd[index].fd);
|
struct ipc_error ret = usock_close (ctx->pollfd[index].fd);
|
||||||
|
|
||||||
// TODO: verify that the close was OK??
|
// TODO: verify that the close was OK??
|
||||||
|
|
|
@ -141,6 +141,8 @@ static struct ipc_errors_verbose ipc_errors_verbose[] = {
|
||||||
, {IPC_ERROR_ADD__NO_PARAM_POLLFD, "IPC_ERROR_ADD__NO_PARAM_POLLFD"}
|
, {IPC_ERROR_ADD__NO_PARAM_POLLFD, "IPC_ERROR_ADD__NO_PARAM_POLLFD"}
|
||||||
, {IPC_ERROR_WRITE__FD_NOT_FOUND, "IPC_ERROR_WRITE__FD_NOT_FOUND"}
|
, {IPC_ERROR_WRITE__FD_NOT_FOUND, "IPC_ERROR_WRITE__FD_NOT_FOUND"}
|
||||||
, {IPC_ERROR_FD_SWITCHING__NO_FD_RECORD, "IPC_ERROR_FD_SWITCHING__NO_FD_RECORD"}
|
, {IPC_ERROR_FD_SWITCHING__NO_FD_RECORD, "IPC_ERROR_FD_SWITCHING__NO_FD_RECORD"}
|
||||||
|
, {IPC_ERROR_CLOSE_ALL__NO_CTX_PARAM, "IPC_ERROR_CLOSE_ALL__NO_CTX_PARAM" }
|
||||||
|
, {IPC_ERROR_CLOSE__NO_CTX_PARAM, "IPC_ERROR_CLOSE__NO_CTX_PARAM"}
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *ipc_errors_get (enum ipc_error_code e)
|
const char *ipc_errors_get (enum ipc_error_code e)
|
||||||
|
|
|
@ -204,6 +204,8 @@ enum ipc_error_code {
|
||||||
, IPC_ERROR_ADD__NOT_ENOUGH_MEMORY = 105
|
, IPC_ERROR_ADD__NOT_ENOUGH_MEMORY = 105
|
||||||
, IPC_ERROR_WAIT_EVENT__POLL = 106
|
, IPC_ERROR_WAIT_EVENT__POLL = 106
|
||||||
, IPC_ERROR_FD_SWITCHING__NO_FD_RECORD = 107
|
, IPC_ERROR_FD_SWITCHING__NO_FD_RECORD = 107
|
||||||
|
, IPC_ERROR_CLOSE_ALL__NO_CTX_PARAM = 108
|
||||||
|
, IPC_ERROR_CLOSE__NO_CTX_PARAM = 109
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ipc_error {
|
struct ipc_error {
|
||||||
|
@ -328,7 +330,7 @@ struct ipc_error ipc_wait_event (struct ipc_ctx *, struct ipc_event *, int *time
|
||||||
|
|
||||||
struct ipc_error ipc_server_init (struct ipc_ctx *ctx, const char *sname);
|
struct ipc_error ipc_server_init (struct ipc_ctx *ctx, const char *sname);
|
||||||
struct ipc_error ipc_connection (struct ipc_ctx *ctx, const char *sname);
|
struct ipc_error ipc_connection (struct ipc_ctx *ctx, const char *sname);
|
||||||
struct ipc_error ipc_connection_switched (struct ipc_ctx *ctx, const char *sname);
|
struct ipc_error ipc_connection_switched (struct ipc_ctx *ctx, const char *sname, int clientfd, int *serverfd);
|
||||||
|
|
||||||
struct ipc_error ipc_close (struct ipc_ctx *ctx, uint32_t index);
|
struct ipc_error ipc_close (struct ipc_ctx *ctx, uint32_t index);
|
||||||
struct ipc_error ipc_close_all (struct ipc_ctx *ctx);
|
struct ipc_error ipc_close_all (struct ipc_ctx *ctx);
|
||||||
|
|
Reference in New Issue