From 75b407538ba17f1a59e2d2eece7a5472d5ae5674 Mon Sep 17 00:00:00 2001
From: Philippe PITTOLI
Date: Tue, 28 Jan 2020 13:39:06 +0100
Subject: [PATCH] Improved pong(d) examples.
---
examples/pong.c | 31 ++++++++++++++++++++-----------
examples/pongd.c | 42 +++++++++++++++++++++++++-----------------
2 files changed, 45 insertions(+), 28 deletions(-)
diff --git a/examples/pong.c b/examples/pong.c
index 0c5eb14..d39ec74 100644
--- a/examples/pong.c
+++ b/examples/pong.c
@@ -25,21 +25,28 @@ void chomp (char *str, ssize_t len)
struct ipc_connection_info *srv;
-void non_interactive (char *env[])
+void non_interactive (int verbosity, size_t nb_msg, char *msg_str, char *env[])
{
SECURE_DECLARATION (struct ipc_message, m);
// init service
TEST_IPC_QUIT_ON_ERROR (ipc_connection (env, srv, SERVICE_NAME), EXIT_FAILURE);
- TEST_IPC_QUIT_ON_ERROR (ipc_message_format_data (&m, 42, MSG, (ssize_t) strlen (MSG) + 1), EXIT_FAILURE);
- printf ("msg to send (%ld): %.*s\n", (ssize_t) strlen (MSG) + 1, (int)strlen (MSG), MSG);
- TEST_IPC_QUIT_ON_ERROR (ipc_write (srv, &m), EXIT_FAILURE);
- ipc_message_empty (&m);
- TEST_IPC_QUIT_ON_ERROR (ipc_read (srv, &m), EXIT_FAILURE);
+ if (verbosity > 1) {
+ printf ("msg to send (%ld): %.*s\n", (ssize_t) strlen (MSG) + 1, (int)strlen (MSG), MSG);
+ }
- printf ("msg recv (type: %u): %s\n", m.user_type, m.payload);
- ipc_message_empty (&m);
+ for (size_t i = 0 ; i < nb_msg ; i++) {
+ TEST_IPC_QUIT_ON_ERROR (ipc_message_format_data (&m, 42, msg_str, (ssize_t) strlen (msg_str) + 1), EXIT_FAILURE);
+ TEST_IPC_QUIT_ON_ERROR (ipc_write (srv, &m), EXIT_FAILURE);
+ ipc_message_empty (&m);
+ TEST_IPC_QUIT_ON_ERROR (ipc_read (srv, &m), EXIT_FAILURE);
+
+ if (verbosity > 1) {
+ printf ("msg recv (type: %u): %s\n", m.user_type, m.payload);
+ }
+ ipc_message_empty (&m);
+ }
TEST_IPC_QUIT_ON_ERROR (ipc_close (srv), EXIT_FAILURE);
}
@@ -140,7 +147,9 @@ void interactive (char *env[])
int main (int argc, char *argv[], char *env[])
{
- argc = argc; // warnings
+ printf("usage: %s [verbosity #messages message]", argv[0]);
+
+ // $0:
argv = argv; // warnings
srv = malloc (sizeof (struct ipc_connection_info));
@@ -150,8 +159,8 @@ int main (int argc, char *argv[], char *env[])
srv->index = 0;
srv->version = 0;
- if (argc == 1)
- non_interactive (env);
+ if (argc == 4)
+ non_interactive (atoi(argv[1]), (size_t) atoi(argv[2]), argv[3], env);
else
interactive (env);
diff --git a/examples/pongd.c b/examples/pongd.c
index 3dbbf20..15bcb08 100644
--- a/examples/pongd.c
+++ b/examples/pongd.c
@@ -14,12 +14,15 @@
int cpt = 0;
+int verbosity = 1;
+
struct ipc_connection_info *srv = NULL;
struct ipc_connection_infos *clients = NULL;
void main_loop ()
{
- long timer = 10;
+ long base_timer = 0;
+ long timer = base_timer;
SECURE_DECLARATION (struct ipc_error, ret);
clients = malloc (sizeof (struct ipc_connection_infos));
@@ -37,17 +40,17 @@ void main_loop ()
case IPC_EVENT_TYPE_CONNECTION:
{
cpt++;
-#ifdef PONGD_VERBOSE
- printf ("connection: %d clients connected, new client is %d\n", cpt, (event.origin)->fd);
-#endif
+ if (verbosity > 1) {
+ printf ("connection: %d clients connected, new client is %d\n", cpt, (event.origin)->fd);
+ }
};
break;
case IPC_EVENT_TYPE_DISCONNECTION:
{
cpt--;
-#ifdef PONGD_VERBOSE
- printf ("disconnection: %d clients remaining\n", cpt);
-#endif
+ if (verbosity > 1) {
+ printf ("disconnection: %d clients remaining\n", cpt);
+ }
// free the ipc_client structure
free (event.origin);
@@ -56,27 +59,28 @@ void main_loop ()
case IPC_EVENT_TYPE_MESSAGE:
{
struct ipc_message *m = event.m;
-#ifdef PONGD_VERBOSE
- if (m->length > 0) {
- printf ("message received (type %d, user type %d, size %u bytes): %.*s\n",
- m->type, m->user_type, m->length, m->length, m->payload);
- } else {
- printf ("message with a 0-byte size :(\n");
+ if (verbosity > 1) {
+ if (m->length > 0) {
+ printf ("message received (type %d, user type %d, size %u bytes): %.*s\n",
+ m->type, m->user_type, m->length, m->length, m->payload);
+ } else {
+ printf ("message with a 0-byte size :(\n");
+ }
}
-#endif
-
ret = ipc_write (event.origin, m);
if (ret.error_code != IPC_ERROR_NONE) {
PRINTERR (ret, "server write");
}
- printf ("message sent\n");
+ if (verbosity > 1) {
+ printf ("message sent\n");
+ }
};
break;
case IPC_EVENT_TYPE_TIMER:{
printf ("timer\n");
- timer = 10;
+ timer = base_timer;
};
break;
case IPC_EVENT_TYPE_ERROR:
@@ -136,6 +140,10 @@ int main (int argc, char *argv[], char **env)
argc = argc; // warnings
argv = argv; // warnings
+ if (argc > 1) {
+ verbosity = atoi(argv[1]);
+ }
+
printf ("pid = %d\n", getpid ());
srv = malloc (sizeof (struct ipc_connection_info));