Browse Source

faux.msg: Compilable lib

Serj Kalichev 3 years ago
parent
commit
7c6e556103
3 changed files with 63 additions and 99 deletions
  1. 3 0
      faux/Makefile.am
  2. 26 29
      faux/msg.h
  3. 34 70
      faux/msg/msg.c

+ 3 - 0
faux/Makefile.am

@@ -23,6 +23,7 @@ nobase_include_HEADERS += \
 	faux/time.h \
 	faux/sched.h \
 	faux/net.h \
+	faux/msg.h \
 	faux/testc_helpers.h
 
 EXTRA_DIST += \
@@ -40,6 +41,7 @@ EXTRA_DIST += \
 	faux/time/Makefile.am \
 	faux/sched/Makefile.am \
 	faux/net/Makefile.am \
+	faux/msg/Makefile.am \
 	faux/testc_helpers/Makefile.am
 
 include $(top_srcdir)/faux/base/Makefile.am
@@ -56,6 +58,7 @@ include $(top_srcdir)/faux/argv/Makefile.am
 include $(top_srcdir)/faux/time/Makefile.am
 include $(top_srcdir)/faux/sched/Makefile.am
 include $(top_srcdir)/faux/net/Makefile.am
+include $(top_srcdir)/faux/msg/Makefile.am
 include $(top_srcdir)/faux/testc_helpers/Makefile.am
 
 if TESTC

+ 26 - 29
faux/msg.h

@@ -47,7 +47,7 @@
 typedef struct faux_msg_s faux_msg_t;
 
 // Debug variable. BOOL_TRUE for debug and BOOL_FALSE to switch debug off
-extern bool_t faux_msg_debug;
+extern bool_t faux_msg_debug_flag;
 
 
 /** @brief Parameter header
@@ -71,11 +71,7 @@ typedef struct faux_hdr_s {
 	uint32_t param_num; // Number of parameters
 	uint32_t len; // Length of whole message (including header)
 	faux_phdr_t phdr[]; // Parameter headers (unknown length)
-} crsp_hdr_t;
-
-
-// Debug variable. 1 for debug and 0 to switch debug off
-extern int crsp_debug;
+} faux_hdr_t;
 
 
 C_DECL_BEGIN
@@ -87,31 +83,32 @@ void faux_phdr_set_len(faux_phdr_t *phdr, uint32_t param_len);
 uint32_t faux_phdr_get_len(const faux_phdr_t *phdr);
 
 // Message functions
-crsp_msg_t *crsp_msg_new(void);
-void crsp_msg_free(crsp_msg_t *crsp_msg);
-void crsp_msg_set_cmd(crsp_msg_t *crsp_msg, crsp_cmd_e cmd);
-crsp_cmd_e crsp_msg_get_cmd(const crsp_msg_t *crsp_msg);
-void crsp_msg_set_status(crsp_msg_t *crsp_msg, crsp_status_e status);
-crsp_status_e crsp_msg_get_status(const crsp_msg_t *crsp_msg);
-void crsp_msg_set_req_id(crsp_msg_t *crsp_msg, uint32_t req_id);
-uint32_t crsp_msg_get_req_id(const crsp_msg_t *crsp_msg);
-uint32_t crsp_msg_get_param_num(const crsp_msg_t *crsp_msg);
-uint32_t crsp_msg_get_len(const crsp_msg_t *crsp_msg);
-ssize_t crsp_msg_add_param(crsp_msg_t *crsp_msg, crsp_param_e type,
+faux_msg_t *faux_msg_new(uint32_t magic, uint8_t major, uint8_t minor);
+void faux_msg_free(faux_msg_t *msg);
+void faux_msg_set_cmd(faux_msg_t *msg, uint16_t cmd);
+uint16_t faux_msg_get_cmd(const faux_msg_t *msg);
+void faux_msg_set_status(faux_msg_t *msg, uint32_t status);
+uint32_t faux_msg_get_status(const faux_msg_t *msg);
+void faux_msg_set_req_id(faux_msg_t *msg, uint32_t req_id);
+uint32_t faux_msg_get_req_id(const faux_msg_t *msg);
+uint32_t faux_msg_get_param_num(const faux_msg_t *msg);
+int faux_msg_get_len(const faux_msg_t *msg);
+uint32_t faux_msg_get_magic(const faux_msg_t *msg);
+int faux_msg_get_major(const faux_msg_t *msg);
+int faux_msg_get_minor(const faux_msg_t *msg);
+ssize_t faux_msg_add_param(faux_msg_t *msg, uint16_t type,
 	const void *buf, size_t len);
-faux_list_node_t *crsp_msg_init_param_iter(const crsp_msg_t *crsp_msg);
-crsp_phdr_t *crsp_msg_get_param_each(faux_list_node_t **node,
-	crsp_param_e *param_type, void **param_data, uint32_t *param_len);
-crsp_phdr_t *crsp_msg_get_param_by_index(const crsp_msg_t *crsp_msg, unsigned int index,
-	crsp_param_e *param_type, void **param_data, uint32_t *param_len);
-crsp_phdr_t *crsp_msg_get_param_by_type(const crsp_msg_t *crsp_msg,
-	crsp_param_e param_type, void **param_data, uint32_t *param_len);
-ssize_t crsp_msg_send(crsp_msg_t *crsp_msg, faux_net_t *faux_net);
-crsp_msg_t *crsp_msg_recv(faux_net_t *faux_net, crsp_recv_e *status);
-char *crsp_msg_get_param_cdp_uri(const crsp_msg_t *crsp_msg);
-void crsp_msg_debug(crsp_msg_t *crsp_msg);
+faux_list_node_t *faux_msg_init_param_iter(const faux_msg_t *msg);
+faux_phdr_t *faux_msg_get_param_each(faux_list_node_t **node,
+	uint16_t *param_type, void **param_data, uint32_t *param_len);
+faux_phdr_t *faux_msg_get_param_by_index(const faux_msg_t *msg, unsigned int index,
+	uint16_t *param_type, void **param_data, uint32_t *param_len);
+faux_phdr_t *faux_msg_get_param_by_type(const faux_msg_t *msg,
+	uint16_t param_type, void **param_data, uint32_t *param_len);
+ssize_t faux_msg_send(faux_msg_t *msg, faux_net_t *faux_net);
+faux_msg_t *faux_msg_recv(faux_net_t *faux_net);
+void faux_msg_debug(faux_msg_t *msg);
 
 C_DECL_END
 
 #endif // _faux_msg_h
-

+ 34 - 70
faux/msg/msg.c

@@ -33,7 +33,7 @@
 #include <faux/msg.h>
 
 // Global variable to switch debug on/off (true/false)
-bool_t faux_msg_debug = BOOL_FALSE;
+bool_t faux_msg_debug_flag = BOOL_FALSE;
 
 
 /** @brief Opaque faux_msg_s structure. */
@@ -43,11 +43,15 @@ struct faux_msg_s {
 };
 
 
+static void faux_msg_set_len(faux_msg_t *msg, uint32_t len);
+static void faux_msg_set_param_num(faux_msg_t *msg, uint32_t param_num);
+
+
 /** @brief Allocate memory to store message.
  *
  * This static function is needed because new message object can be created
  * in a different ways. The first way is creating outgoing message manually and
- * the second way is receiving CRSP message from network. These ways need
+ * the second way is receiving message from network. These ways need
  * different initialization but the same memory allocation.
  *
  * @return Allocated but not fully initialized faux_msg_t object
@@ -383,16 +387,11 @@ static ssize_t faux_msg_add_param_internal(faux_msg_t *msg,
 	memcpy(param + sizeof(*phdr), buf, len);
 
 	if (update_len) {
-		uint32_t cur_param_num = 0;
-		uint32_t cur_len = 0;
-
 		// Update number of parameters
-		faux_msg_get_param_num(msg, &cur_param_num);
-		faux_msg_set_param_num(msg, cur_param_num + 1);
-
+		faux_msg_set_param_num(msg, faux_msg_get_param_num(msg) + 1);
 		// Update whole message length
-		faux_msg_get_len(msg, &cur_len);
-		crsp_msg_set_len(crsp_msg, cur_len + sizeof(*phdr) + len);
+		faux_msg_set_len(msg,
+			faux_msg_get_len(msg) + sizeof(*phdr) + len);
 	}
 
 	// Add to parameter list
@@ -501,7 +500,7 @@ faux_phdr_t *faux_msg_get_param_each(faux_list_node_t **node,
  *
  * @param [in] msg Allocated faux_msg_t object.
  * @param [in] index Parameter's index.
- * @param [out] param_type Type of parameter. See the crsp_param_e enumeration.
+ * @param [out] param_type Type of parameter.
  * @param [out] param_buf Parameter's data buffer.
  * @param [out] param_len Parameter's data length.
  * @return Pointer to parameter's header or NULL on error.
@@ -543,7 +542,7 @@ faux_phdr_t *faux_msg_get_param_by_index(const faux_msg_t *msg, unsigned int ind
  * @return Pointer to parameter's header or NULL on error.
  */
 faux_phdr_t *faux_msg_get_param_by_type(const faux_msg_t *msg,
-	uint16_t *param_type, void **param_data, uint32_t *param_len)
+	uint16_t param_type, void **param_data, uint32_t *param_len)
 {
 	faux_list_node_t *iter = NULL;
 
@@ -581,14 +580,13 @@ faux_phdr_t *faux_msg_get_param_by_type(const faux_msg_t *msg,
  * @param [in] faux_net Preinitialized faux_net_t object.
  * @return Length of sent data or < 0 on error.
  */
-ssize_t faux_msg_send(crsp_msg_t *msg, faux_net_t *faux_net)
+ssize_t faux_msg_send(faux_msg_t *msg, faux_net_t *faux_net)
 {
 	unsigned int vec_entries_num = 0;
 	struct iovec *iov = NULL;
 	unsigned int i = 0;
 	faux_list_node_t *iter = NULL;
 	size_t ret = 0;
-	uint32_t param_num = 0;
 
 	assert(msg);
 	assert(msg->hdr);
@@ -597,8 +595,7 @@ ssize_t faux_msg_send(crsp_msg_t *msg, faux_net_t *faux_net)
 
 	// Calculate number if struct iovec entries.
 	// n = (msg header) + ((param hdr) + (param data)) * (param_num)
-	faux_msg_get_param_num(msg, &param_num);
-	vec_entries_num = 1 + (2 * param_num);
+	vec_entries_num = 1 + (2 * faux_msg_get_param_num(msg));
 	iov = faux_zmalloc(vec_entries_num * sizeof(*iov));
 
 	// Message header
@@ -619,7 +616,7 @@ ssize_t faux_msg_send(crsp_msg_t *msg, faux_net_t *faux_net)
 	// Parameter data
 	for (iter = faux_msg_init_param_iter(msg);
 		iter; iter = faux_list_next_node(iter)) {
-		crsp_phdr_t *phdr = NULL;
+		faux_phdr_t *phdr = NULL;
 		void *data = NULL;
 		phdr = (faux_phdr_t *)faux_list_data(iter);
 		data = (char *)phdr + sizeof(*phdr);
@@ -633,7 +630,7 @@ ssize_t faux_msg_send(crsp_msg_t *msg, faux_net_t *faux_net)
 
 #ifdef DEBUG
 	// Debug
-	if (msg && ret > 0 && faux_msg_debug) {
+	if (msg && ret > 0 && faux_msg_debug_flag) {
 		printf("(o) ");
 		faux_msg_debug(msg);
 	}
@@ -654,32 +651,21 @@ ssize_t faux_msg_send(crsp_msg_t *msg, faux_net_t *faux_net)
  * - Interrupted by allowed signal (see signal mask).
  * - Timeout.
  *
- * It can be an logical errors while message receiving like wrong protocol
- * version. So function has additional parameter named 'status'. It will
- * be CRSP_STATUS_OK in a case when all is ok but function can return NULL and
- * set appropriate status to this parameter. It can be
- * CRSP_STATUS_WRONG_VERSION for example. The function will return NULL
- * and CRSP_STATUS_OK on some system errors like illegal parameters or
- * insufficient of memory.
- *
  * @param [in] faux_net Preinitialized faux_net_t object.
  * @param [out] status Status while message receiving. Can be NULL.
  * @return Allocated faux_msg_t object. Object contains received message.
  */
-faux_msg_t *faux_msg_recv(faux_net_t *faux_net, crsp_recv_e *status)
+faux_msg_t *faux_msg_recv(faux_net_t *faux_net)
 {
 	faux_msg_t *msg = NULL;
 	size_t received = 0;
 	faux_phdr_t *phdr = NULL;
-	unsigned int param_num = 0;
 	size_t phdr_whole_len = 0;
 	size_t max_data_len = 0;
-	size_t cur_data_len = 0;
 	unsigned int i = 0;
 	char *data = NULL;
+	uint32_t param_num = 0;
 
-	if (status)
-		*status = CRSP_RECV_OK;
 	msg = faux_msg_allocate();
 	assert(msg);
 	if (!msg)
@@ -693,21 +679,19 @@ faux_msg_t *faux_msg_recv(faux_net_t *faux_net, crsp_recv_e *status)
 	}
 
 	// Receive parameter headers
-	faux_msg_get_param_num(msg, &param_num);
+	param_num = faux_msg_get_param_num(msg);
 	if (param_num != 0) {
 		phdr_whole_len = param_num * sizeof(*phdr);
 		phdr = faux_zmalloc(phdr_whole_len);
 		received = faux_net_recv(faux_net, phdr, phdr_whole_len);
 		if (received != phdr_whole_len) {
 			faux_free(phdr);
-			crsp_msg_free(crsp_msg);
-			if (status)
-				*status = CRSP_RECV_BROKEN_PARAM;
+			faux_msg_free(msg);
 			return NULL;
 		}
 		// Find out maximum data length
 		for (i = 0; i < param_num; i++) {
-			cur_data_len = ntohl(phdr[i].param_len);
+			size_t cur_data_len = faux_phdr_get_len(phdr + i);
 			if (cur_data_len > max_data_len)
 				max_data_len = cur_data_len;
 		}
@@ -715,20 +699,18 @@ faux_msg_t *faux_msg_recv(faux_net_t *faux_net, crsp_recv_e *status)
 		// Receive parameter data
 		data = faux_zmalloc(max_data_len);
 		for (i = 0; i < param_num; i++) {
-			cur_data_len = ntohl(phdr[i].param_len);
+			size_t cur_data_len = faux_phdr_get_len(phdr + i);
 			if (0 == cur_data_len)
 				continue;
-			received = faux_net_recv(faux_net,
-				data, cur_data_len);
+			received = faux_net_recv(faux_net, data, cur_data_len);
 			if (received != cur_data_len) {
 				faux_free(data);
 				faux_free(phdr);
-				crsp_msg_free(crsp_msg);
-				if (status)
-					*status = CRSP_RECV_BROKEN_PARAM;
+				faux_msg_free(msg);
 				return NULL;
 			}
-			crsp_msg_add_param_internal(crsp_msg, phdr[i].param_type,
+			faux_msg_add_param_internal(msg,
+				faux_phdr_get_type(phdr + i),
 				data, cur_data_len, BOOL_FALSE);
 		}
 
@@ -738,7 +720,7 @@ faux_msg_t *faux_msg_recv(faux_net_t *faux_net, crsp_recv_e *status)
 
 #ifdef DEBUG
 	// Debug
-	if (msg && faux_msg_debug) {
+	if (msg && faux_msg_debug_flag) {
 		printf("(i) ");
 		faux_msg_debug(msg);
 	}
@@ -758,17 +740,6 @@ void faux_msg_debug(faux_msg_t *msg)
 #ifdef DEBUG
 {
 	faux_list_node_t *iter = 0;
-
-	// Header vars
-	uint32_t magic = 0;
-	uint8_t major = 0;
-	uint8_t minor = 0;
-	uint16_t cmd = 0;
-	uint32_t status = 0;
-	uint32_t req_id = 0;
-	uint32_t param_num = 0;
-	uint32_t len = 0;
-
 	// Parameter vars
 	void *param_data = NULL;
 	uint16_t param_type = 0;
@@ -779,22 +750,15 @@ void faux_msg_debug(faux_msg_t *msg)
 		return;
 
 	// Header
-	faux_msg_get_magic(msg, &magic);
-	faux_msg_get_version(msg, &major, &minor);
-	faux_msg_get_cmd(msg, &cmd);
-	faux_msg_get_status(msg, &status);
-	faux_msg_get_req_id(msg, &req_id);
-	faux_msg_get_param_num(msg, &param_num);
-	faux_msg_get_len(msg, &len);
 	printf("%lx(%u.%u): c%04x s%08x i%08x p%u l%u |%lub\n",
-		magic,
-		major,
-		minor,
-		cmd,
-		status,
-		req_id,
-		param_num,
-		len
+		faux_msg_get_magic(msg),
+		faux_msg_get_major(msg),
+		faux_msg_get_minor(msg),
+		faux_msg_get_cmd(msg),
+		faux_msg_get_status(msg),
+		faux_msg_get_req_id(msg),
+		faux_msg_get_param_num(msg),
+		faux_msg_get_len(msg),
 		sizeof(*msg->hdr)
 		);