Obsolete
/
libipc-old
Archived
3
0
Fork 0

Multiple clients: ok.

pollfd
Karchnu 2020-07-01 12:47:04 +02:00
parent a5877101eb
commit 71db43802e
7 changed files with 39 additions and 21 deletions

View File

@ -249,6 +249,11 @@ struct ipc_error ipc_add ( struct ipc_ctx *ctx, struct ipc_connection_info *p, s
// Memory reallocation. // Memory reallocation.
ipc_ctx_new_alloc (ctx); ipc_ctx_new_alloc (ctx);
if (ctx->size <= 0) {
printf ("ERROR: new alloc <= 0\n");
exit(1);
}
ctx->cinfos[ctx->size - 1] = *p; ctx->cinfos[ctx->size - 1] = *p;
ctx->pollfd[ctx->size - 1] = *pollfd; ctx->pollfd[ctx->size - 1] = *pollfd;
@ -259,13 +264,12 @@ struct ipc_error ipc_del (struct ipc_ctx *ctx, uint32_t index)
{ {
T_R ((ctx == NULL), IPC_ERROR_DEL__NO_CLIENTS_PARAM); T_R ((ctx == NULL), IPC_ERROR_DEL__NO_CLIENTS_PARAM);
T_R ((ctx->cinfos == NULL || ctx->pollfd == NULL), IPC_ERROR_DEL__EMPTY_LIST); T_R ((ctx->cinfos == NULL || ctx->pollfd == NULL), IPC_ERROR_DEL__EMPTY_LIST);
T_R ((index >= ctx->size), IPC_ERROR_DEL__CANNOT_FIND_CLIENT);
if (index >= ctx->size) { if (ctx->cinfos[index].spath != NULL) {
IPC_RETURN_ERROR (IPC_ERROR_DEL__CANNOT_FIND_CLIENT);
}
if (ctx->cinfos[index].spath != NULL)
free (ctx->cinfos[index].spath); free (ctx->cinfos[index].spath);
ctx->cinfos[index].spath = NULL;
}
ctx->size--; ctx->size--;
@ -336,6 +340,8 @@ struct ipc_error handle_writing_message (struct ipc_event *event, struct ipc_ctx
ipc_message_empty (m); ipc_message_empty (m);
printf ("Removing the message\n"); printf ("Removing the message\n");
ipc_messages_del (&ctx->tx, i); // remove the message indexed by i ipc_messages_del (&ctx->tx, i); // remove the message indexed by i
break; // The message has been sent
} }
} }

View File

@ -165,13 +165,20 @@ struct ipc_error ipc_messages_add (struct ipc_messages *messages, const struct
// DEEP COPY. // DEEP COPY.
messages->messages[messages->size -1] = *message; messages->messages[messages->size -1] = *message;
messages->messages[messages->size -1].payload = malloc(message->length * sizeof (char)); if (message->length > 0 && message->payload != NULL) {
strncpy(messages->messages[messages->size -1].payload, message->payload, message->length); messages->messages[messages->size -1].payload = malloc(message->length * sizeof (char));
strncpy(messages->messages[messages->size -1].payload, message->payload, message->length);
}
else {
messages->messages[messages->size -1].payload = NULL;
}
printf ("first message payload (%d): %s\n", message->length, message->payload); if (message->length > 0 && message->payload != NULL) {
printf ("second message payload (%d): %s\n" printf ("first message payload (%d): %s\n", message->length, message->payload);
, messages->messages[messages->size - 1].length printf ("second message payload (%d): %s\n"
, messages->messages[messages->size - 1].payload); , messages->messages[messages->size - 1].length
, messages->messages[messages->size - 1].payload);
}
IPC_RETURN_NO_ERROR; IPC_RETURN_NO_ERROR;
} }
@ -182,11 +189,16 @@ struct ipc_error ipc_messages_del (struct ipc_messages *messages, uint32_t inde
T_R ((messages->size == 0 || index >= messages->size), IPC_ERROR_MESSAGE_DEL__INDEX_ERROR); T_R ((messages->size == 0 || index >= messages->size), IPC_ERROR_MESSAGE_DEL__INDEX_ERROR);
// NOT A DEEP COPY. // NOT A DEEP COPY.
messages->messages[index] = messages->messages[messages->size - 1];
messages->size--; messages->size--;
messages->messages = realloc (messages->messages, sizeof (struct ipc_message) * messages->size); if (messages->size == 0) {
free (messages->messages);
T_R ((messages->messages == NULL), IPC_ERROR_MESSAGE_DEL__EMPTY_LIST); messages->messages = NULL;
}
else {
messages->messages[index] = messages->messages[messages->size];
messages->messages = realloc (messages->messages, sizeof (struct ipc_message) * messages->size);
T_R ((messages->messages == NULL), IPC_ERROR_MESSAGE_DEL__EMPTY_LIST);
}
IPC_RETURN_NO_ERROR; IPC_RETURN_NO_ERROR;
} }

View File

@ -6,7 +6,7 @@
#define SERVICE_NAME "pong" #define SERVICE_NAME "pong"
int main(int argc, char * argv[], char **env) int main(int argc, char * argv[])
{ {
argc = (int) argc; argc = (int) argc;
argv = (char **) argv; argv = (char **) argv;
@ -52,7 +52,7 @@ int main(int argc, char * argv[], char **env)
TEST_IPC_Q(ipc_close_all(&ctx), EXIT_FAILURE); TEST_IPC_Q(ipc_close_all(&ctx), EXIT_FAILURE);
printf ("func 01 - closing ctx...\n"); printf ("func 01 - closing ctx...\n");
ipc_connections_free (&ctx); ipc_ctx_free (&ctx);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -75,7 +75,7 @@ void interactive ()
TEST_IPC_Q(ipc_close_all (&ctx), EXIT_FAILURE); TEST_IPC_Q(ipc_close_all (&ctx), EXIT_FAILURE);
ipc_connections_free (&ctx); ipc_ctx_free (&ctx);
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
} }

View File

@ -99,7 +99,7 @@ void exit_program(int signal)
TEST_IPC_Q(ipc_close_all (ctx), EXIT_FAILURE); TEST_IPC_Q(ipc_close_all (ctx), EXIT_FAILURE);
// free remaining ctx // free remaining ctx
ipc_connections_free (ctx); ipc_ctx_free (ctx);
free (ctx); free (ctx);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);

View File

@ -52,7 +52,7 @@ void read_message (struct ipc_connection_info *ci)
break; break;
} }
ipc_connections_free (&clients); ipc_ctx_free (&clients);
#else #else
SECURE_DECLARATION (struct ipc_message, m); SECURE_DECLARATION (struct ipc_message, m);

View File

@ -57,7 +57,7 @@ int main_loop(int argc, char * argv[], char **env)
} }
printf ("func 03 - closing clients...\n"); printf ("func 03 - closing clients...\n");
ipc_connections_free (&clients); ipc_ctx_free (&clients);
printf ("func 03 - closing server...\n"); printf ("func 03 - closing server...\n");
TEST_IPC_Q (ipc_server_close(&srv), EXIT_FAILURE); TEST_IPC_Q (ipc_server_close(&srv), EXIT_FAILURE);