From 9865fcefff0083207e9b753bf09d423037b8f0ee Mon Sep 17 00:00:00 2001
From: Philippe PITTOLI
Date: Mon, 29 Oct 2018 08:48:07 +0100
Subject: [PATCH] ipc-debug now uses ipc_application_poll_event
---
core/communication.c | 2 +-
core/usocket.h | 2 +-
pong/app/ipc-debug.c | 184 ++++++++++++++++++++++++-------------------
3 files changed, 105 insertions(+), 83 deletions(-)
diff --git a/core/communication.c b/core/communication.c
index 3c1379a..981fcb4 100644
--- a/core/communication.c
+++ b/core/communication.c
@@ -13,7 +13,7 @@ void service_path (char *path, const char *sname, int index, int version)
assert (path != NULL);
assert (sname != NULL);
memset (path, 0, PATH_MAX);
- snprintf (path, PATH_MAX, "%s/%s-%d-%d", TMPDIR, sname, index, version);
+ snprintf (path, PATH_MAX, "%s/%s-%d-%d", RUNDIR, sname, index, version);
}
int ipc_server_init (char **env
diff --git a/core/usocket.h b/core/usocket.h
index 3a803e3..4dbc8e5 100644
--- a/core/usocket.h
+++ b/core/usocket.h
@@ -7,7 +7,7 @@
#define LISTEN_BACKLOG 128
-#define TMPDIR "/run/ipc/"
+#define RUNDIR "/run/ipc/"
#define PATH_MAX 4096
#define IPC_HEADER_SIZE 5
diff --git a/pong/app/ipc-debug.c b/pong/app/ipc-debug.c
index 8bd16c3..d4b4d14 100644
--- a/pong/app/ipc-debug.c
+++ b/pong/app/ipc-debug.c
@@ -10,7 +10,7 @@
#define SERVICE_NAME "pongd"
-#define MAX_MESSAGE_SIZE 20000
+#define MAX_MESSAGE_SIZE IPC_MAX_MESSAGE_SIZE
#define MESSAGE "salut ça va ?"
void interactive (char * service_name, char *env[])
@@ -30,94 +30,82 @@ void interactive (char * service_name, char *env[])
exit (EXIT_FAILURE);
}
- char msg_type = 0;
+ struct ipc_event event;
+ memset (&event, 0, sizeof (struct ipc_event));
+
+ struct ipc_services services;
+ memset (&services, 0, sizeof (struct ipc_services));
+ ipc_service_add (&services, &srv);
+ int ret = 0;
while (1) {
-#if 0 // version with readline, slow, valgrind-incompatible
-
- char * mtype_str = readline("msg type: ");
- if (strlen(mtype_str) == 0 || strncmp (mtype_str, "exit", 4) == 0) {
- free (mtype_str);
- break;
- }
- msg_type = atoi(mtype_str);
- free(mtype_str);
+ printf ("msg to send: ");
+ fflush (stdout);
+ ret = ipc_application_peek_event (&services, &event);
- char * buf = readline ("msg: ");
- if (strlen(buf) == 0 || strncmp (buf, "exit", 4) == 0) {
- free (buf);
- break;
+ if (ret != 0) {
+ handle_error("ipc_application_peek_event != 0");
+ exit (EXIT_FAILURE);
}
- ipc_message_format (&m, msg_type, buf, strlen(buf));
- free (buf);
+ switch (event.type) {
+ case IPC_EVENT_TYPE_STDIN:
+ {
+ struct ipc_message *m = event.m;
+ if ( m->length == 0 || strncmp (m->payload, "exit", 4) == 0) {
- // print_msg (&m);
+ ipc_message_empty (m);
+ free (m);
- if (ipc_application_write (&srv, &m) < 0) {
- handle_err("main", "application_write < 0");
- exit (EXIT_FAILURE);
- }
- ipc_message_empty (&m);
+ ipc_services_free (&services);
- if (ipc_application_read (&srv, &m) < 0) {
- handle_err("main", "application_read < 0");
- exit (EXIT_FAILURE);
- }
+ if (ipc_application_close (&srv) < 0) {
+ handle_err("main", "application_close < 0");
+ exit (EXIT_FAILURE);
+ }
- printf ("\nmsg recv: %s", m.payload);
- ipc_message_empty (&m);
-#else
+ exit (EXIT_SUCCESS);
+ }
- char mtype_str[50];
- memset(mtype_str, 0, 50);
- printf ("message type: ");
- fflush(stdout);
- read(0, mtype_str, 50);
- msg_type = atoi(mtype_str);
- memset(mtype_str, 0, 50);
+ char mtype_str[5];
+ memset(mtype_str, 0, 5);
+ printf ("message type: ");
+ fflush(stdout);
+ read(0, mtype_str, 5);
+ m->type = atoi(mtype_str);
+ memset(mtype_str, 0, 5);
- char mpayload[MAX_MESSAGE_SIZE];
- memset(mpayload, 0, MAX_MESSAGE_SIZE);
- printf ("message payload: ");
- fflush(stdout);
- read(0, mpayload, MAX_MESSAGE_SIZE);
- if (strlen(mpayload) == 0 || strncmp (mpayload, "exit", 4) == 0) {
- break;
+ if (ipc_application_write (&srv, m) < 0) {
+ handle_err("main", "application_write < 0");
+ exit (EXIT_FAILURE);
+ }
+ }
+ break;
+ case IPC_EVENT_TYPE_MESSAGE:
+ {
+ struct ipc_message *m = event.m;
+ printf ("msg recv: %.*s", m->length, m->payload);
+ };
+ break;
+ case IPC_EVENT_TYPE_DISCONNECTION:
+ {
+ printf ("server disconnected: quitting...\n");
+
+ // just remove srv from services, it's already closed
+ ipc_services_free (&services);
+
+ exit (EXIT_SUCCESS);
+ };
+ case IPC_EVENT_TYPE_NOT_SET:
+ case IPC_EVENT_TYPE_CONNECTION:
+ case IPC_EVENT_TYPE_ERROR:
+ default :
+ fprintf (stderr, "should not happen, event type %d\n", event.type);
}
-
- ipc_message_format (&m, msg_type, mpayload, strlen(mpayload));
- // print_msg (&m);
-
- if (ipc_application_write (&srv, &m) < 0) {
- handle_err("main", "application_write < 0");
- exit (EXIT_FAILURE);
- }
- ipc_message_empty (&m);
-
- if (msg_type == 0) { // message type 0 => close the server, no read to do
- break;
- }
-
- if (ipc_application_read (&srv, &m) < 0) {
- handle_err("main", "application_read < 0");
- exit (EXIT_FAILURE);
- }
-
- if (m.length > 0) {
- printf ("msg recv: %.*s", m.length, m.payload);
- }
- ipc_message_empty (&m);
-#endif
}
-
- if (ipc_application_close (&srv) < 0) {
- handle_err("main", "application_close < 0");
- exit (EXIT_FAILURE);
- }
- ipc_message_empty (&m);
}
+
void non_interactive (char msg_type, char *msg, char * service_name, char *env[])
{
struct ipc_message m;
@@ -161,27 +149,61 @@ void non_interactive (char msg_type, char *msg, char * service_name, char *env[]
ipc_message_empty (&m);
}
+// usage: ipc-debug [service-name]
int main (int argc, char *argv[], char *env[])
{
+ if (argc == 1) {
+ printf ("usage: %s [-n] [service_name [message-type [message]]]\n", argv[0]);
+ exit (EXIT_SUCCESS);
+ }
+
char service_name[100];
memset (service_name, 0, 100);
+ int asked_non_interactive = 0;
+ int current_param = 1;
+
+ if (argc >= 2) {
+ if (memcmp (argv[current_param], "-n", 2) == 0) {
+ // non interactive
+ asked_non_interactive = 1;
+ current_param++;
+ argc--;
+ }
+ }
+
if (argc != 1) {
- ssize_t t = strlen(argv[1]) > 100 ? 100 : strlen(argv[1]);
- memcpy(service_name, argv[1], t);
+ ssize_t t = strlen(argv[current_param]) > 100 ? 100 : strlen(argv[current_param]);
+ memcpy(service_name, argv[current_param], t);
+ current_param++;
}
else { memcpy(service_name, SERVICE_NAME, strlen(SERVICE_NAME)); }
char mtype = 2;
- if (argc > 2) { mtype = atoi(argv[2]); }
+ if (argc > 2) {
+ mtype = atoi(argv[current_param]);
+ current_param++;
+ }
- char msg[IPC_MAX_MESSAGE_SIZE];
- memset(msg, 0, IPC_MAX_MESSAGE_SIZE);
+ char *msg = malloc (MAX_MESSAGE_SIZE);
+ if (msg == NULL) {
+ handle_err("main", "not enough memory");
+ exit (EXIT_FAILURE);
+ }
+ memset(msg, 0, MAX_MESSAGE_SIZE);
- if (argc > 3) { memcpy(msg, argv[3], strlen(argv[3])); }
+ if (argc > 3) { memcpy(msg, argv[current_param], strlen(argv[current_param])); }
else { memcpy(msg, MESSAGE, strlen(MESSAGE)); }
- non_interactive (mtype, msg, service_name, env);
+ if (asked_non_interactive) {
+ non_interactive (mtype, msg, service_name, env);
+ free (msg);
+ }
+ else {
+
+ free (msg);
+ interactive (service_name, env);
+ }
return EXIT_SUCCESS;
}