From a8d0a82adf55799f0613d5cfc98e5b91bb05fac3 Mon Sep 17 00:00:00 2001
From: Philippe PITTOLI
Date: Tue, 4 Jun 2019 01:35:33 +0200
Subject: [PATCH] user_type
---
examples/pong.c | 4 ++--
src/communication.h | 4 ----
src/ipc.h | 10 ++++++----
src/message.c | 14 ++++++++++----
4 files changed, 18 insertions(+), 14 deletions(-)
delete mode 100644 src/communication.h
diff --git a/examples/pong.c b/examples/pong.c
index 676edf6..6383504 100644
--- a/examples/pong.c
+++ b/examples/pong.c
@@ -35,7 +35,7 @@ void non_interactive (char *env[])
}
printf ("msg to send (%ld): %.*s\n", (ssize_t) strlen(MSG) +1, (int) strlen(MSG), MSG);
- ret = ipc_message_format_data (&m, MSG, (ssize_t) strlen(MSG) +1);
+ ret = ipc_message_format_data (&m, 42, MSG, (ssize_t) strlen(MSG) +1);
if (ret != IPC_ERROR_NONE) {
PRINTERR(ret, "message format data");
exit (EXIT_FAILURE);
@@ -58,7 +58,7 @@ void non_interactive (char *env[])
exit (EXIT_FAILURE);
}
- printf ("msg recv: %s\n", m.payload);
+ printf ("msg recv (type: %u): %s\n", m.user_type, m.payload);
ipc_message_empty (&m);
ret = ipc_close (&srv);
diff --git a/src/communication.h b/src/communication.h
deleted file mode 100644
index e3c31b0..0000000
--- a/src/communication.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef __IPC_COMMUNICATION_H__
-#define __IPC_COMMUNICATION_H__
-
-#endif
diff --git a/src/ipc.h b/src/ipc.h
index a937f87..3451d6d 100644
--- a/src/ipc.h
+++ b/src/ipc.h
@@ -11,7 +11,7 @@
#define RUNDIR "/run/ipc/"
#define PATH_MAX 4096
-#define IPC_HEADER_SIZE 5
+#define IPC_HEADER_SIZE 6
#define IPC_MAX_MESSAGE_SIZE 8000000-IPC_HEADER_SIZE
// #define IPC_MAX_MESSAGE_SIZE 100-IPC_HEADER_SIZE
// #include "queue.h"
@@ -146,6 +146,7 @@ struct ipc_connection_infos {
struct ipc_message {
char type;
+ char user_type;
uint32_t length;
char *payload;
};
@@ -211,7 +212,6 @@ enum ipc_errors ipc_connection (char **env, struct ipc_connection_info *srv, c
enum ipc_errors ipc_server_close (struct ipc_connection_info *srv);
enum ipc_errors ipc_close (struct ipc_connection_info *p);
-enum ipc_errors ipc_accept (struct ipc_connection_info *srv, struct ipc_connection_info *p);
enum ipc_errors ipc_read (const struct ipc_connection_info *, struct ipc_message *m);
enum ipc_errors ipc_write (const struct ipc_connection_info *, const struct ipc_message *m);
@@ -259,8 +259,10 @@ enum ipc_errors ipc_message_read (int32_t fd, struct ipc_message *m);
// write a structure msg to fd
enum ipc_errors ipc_message_write (int32_t fd, const struct ipc_message *m);
-enum ipc_errors ipc_message_format (struct ipc_message *m, char type, const char *payload, ssize_t length);
-enum ipc_errors ipc_message_format_data (struct ipc_message *m, const char *payload, ssize_t length);
+enum ipc_errors ipc_message_format (struct ipc_message *m
+ , char type, char utype, const char *payload, ssize_t length);
+enum ipc_errors ipc_message_format_data (struct ipc_message *m
+ , char utype, const char *payload, ssize_t length);
enum ipc_errors ipc_message_format_server_close (struct ipc_message *m);
enum ipc_errors ipc_message_empty (struct ipc_message *m);
diff --git a/src/message.c b/src/message.c
index a20cc72..0a4c683 100644
--- a/src/message.c
+++ b/src/message.c
@@ -56,8 +56,11 @@ enum ipc_errors ipc_message_format_read (struct ipc_message *m, const char *buf,
return IPC_ERROR_MESSAGE_FORMAT_READ__MESSAGE_SIZE;
}
+ // message format:
+ // Type (1 B) | Length (4 B) | UserType (1 B) | Payload (Length B)
m->type = buf[0];
memcpy (&m->length, buf+1, sizeof m->length);
+ m->user_type = buf[1 + sizeof m->length];
assert (m->length <= IPC_MAX_MESSAGE_SIZE);
#if defined(IPC_WITH_ERRORS) && IPC_WITH_ERRORS > 2
@@ -106,6 +109,7 @@ enum ipc_errors ipc_message_format_write (const struct ipc_message *m, char **bu
buffer[0] = m->type;
memcpy (buffer + 1, &m->length, sizeof m->length);
+ buffer[1 + sizeof m->length] = m->user_type;
if (m->payload != NULL) {
memcpy (buffer + IPC_HEADER_SIZE, m->payload, m->length);
}
@@ -185,7 +189,8 @@ enum ipc_errors ipc_message_write (int32_t fd, const struct ipc_message *m)
// MSG FORMAT
-enum ipc_errors ipc_message_format (struct ipc_message *m, char type, const char *payload, ssize_t length)
+enum ipc_errors ipc_message_format (struct ipc_message *m
+ , char type, char utype, const char *payload, ssize_t length)
{
assert (m != NULL);
assert (length <= IPC_MAX_MESSAGE_SIZE);
@@ -206,6 +211,7 @@ enum ipc_errors ipc_message_format (struct ipc_message *m, char type, const char
}
m->type = type;
+ m->user_type = utype;
m->length = (uint32_t) length;
if (payload != NULL) {
@@ -226,14 +232,14 @@ enum ipc_errors ipc_message_format (struct ipc_message *m, char type, const char
return IPC_ERROR_NONE;
}
-enum ipc_errors ipc_message_format_data (struct ipc_message *m, const char *payload, ssize_t length)
+enum ipc_errors ipc_message_format_data (struct ipc_message *m, char utype, const char *payload, ssize_t length)
{
- return ipc_message_format (m, MSG_TYPE_DATA, payload, length);
+ return ipc_message_format (m, MSG_TYPE_DATA, utype, payload, length);
}
enum ipc_errors ipc_message_format_server_close (struct ipc_message *m)
{
- return ipc_message_format (m, MSG_TYPE_SERVER_CLOSE, NULL, 0);
+ return ipc_message_format (m, MSG_TYPE_SERVER_CLOSE, 0, NULL, 0);
}
enum ipc_errors ipc_message_empty (struct ipc_message *m)