From c93867811a16da986e91baded0bb94b224b67173 Mon Sep 17 00:00:00 2001
From: "7u83@mail.ru" <7u83@mail.ru@noemail.net>
Date: Wed, 7 Mar 2018 09:30:40 +0000
Subject: [PATCH] cw_kvstore_add works now
fixed a bug in mavl_add
FossilOrigin-Name: 4b040305182ef40f6f053fe1d84ea15f533e931c9d665b513b9a644592519f3e
---
 libcw.project                        |  4 +++
 src/cw/cw.h                          |  2 +-
 src/cw/cw_kvstore_add.c              | 38 ++++++++++++++++++++++++++++
 src/cw/cw_read_descriptor_subelems.c | 20 +++++----------
 src/cw/cw_strdup.c                   | 10 ++++++++
 src/cw/cw_type_byte.c                | 12 ++++-----
 src/cw/cw_type_dword.c               | 14 +++++-----
 src/cw/cw_types.h                    |  2 ++
 src/cw/cw_types_del_null.c           |  6 +++++
 src/cw/kvstore.h                     | 15 +++++++++++
 src/cw/mavl.h                        |  3 ++-
 src/cw/mavl_add.c                    | 15 +++++------
 src/cw/sock_receive.c                |  5 ++--
 13 files changed, 108 insertions(+), 38 deletions(-)
 create mode 100644 src/cw/cw_kvstore_add.c
 create mode 100644 src/cw/cw_strdup.c
 create mode 100644 src/cw/cw_types_del_null.c
 create mode 100644 src/cw/kvstore.h
diff --git a/libcw.project b/libcw.project
index 5280ade5..df3e0d0a 100644
--- a/libcw.project
+++ b/libcw.project
@@ -322,6 +322,10 @@
       
       
       
+      
+      
+      
+      
     
   
   
diff --git a/src/cw/cw.h b/src/cw/cw.h
index c776d97e..adad2aa3 100644
--- a/src/cw/cw.h
+++ b/src/cw/cw.h
@@ -469,7 +469,7 @@ extern cw_iplist_t cw_aciplist_create();
 
 */
 
-
+char *cw_strdup(const char *s);
 
 
 /**
diff --git a/src/cw/cw_kvstore_add.c b/src/cw/cw_kvstore_add.c
new file mode 100644
index 00000000..cc393a69
--- /dev/null
+++ b/src/cw/cw_kvstore_add.c
@@ -0,0 +1,38 @@
+#include "kvstore.h"
+#include "cw_types.h"
+#include "cw.h"
+
+#include "log.h"
+
+const char * cw_kvstore_add(mavl_t kvstore, const char *key, const struct cw_Type *type,
+			const uint8_t * data, int len)
+{
+	mavldata_t mdata, *mresult;
+	
+	mdata.kv.key=cw_strdup(key);
+	if (!mdata.kv.key){
+		cw_log(LOG_ERR, "Can't allocate memory for key %s: %s",
+				key,strerror(errno));
+		return NULL;
+	}
+
+
+	mresult = type->get(&mdata,data,len);
+	if (!mresult){
+		cw_log(LOG_ERR, "Can't create kvstore element for key %s of type %s: %s",
+				key,type->name, strerror(errno));
+		free(mdata.kv.key);
+		return NULL;
+	}
+	
+	mresult = mavl_add(kvstore, &mdata);
+	if (mresult != &mdata){
+		cw_log(LOG_ERR, "Element already exists %s", key);
+		/* element already exists */
+		free(mdata.kv.key);
+		type->del(mresult);
+		return key;
+	}
+	
+	return mdata.kv.key;
+}
diff --git a/src/cw/cw_read_descriptor_subelems.c b/src/cw/cw_read_descriptor_subelems.c
index 2e4d773f..97c23c73 100644
--- a/src/cw/cw_read_descriptor_subelems.c
+++ b/src/cw/cw_read_descriptor_subelems.c
@@ -20,6 +20,7 @@
 #include "cw_types.h"
 #include "dbg.h"
 #include "keys.h"
+#include "kvstore.h"
 
 int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key, 
 				uint8_t * data, int len,
@@ -54,7 +55,7 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key,
 			errors++;
 		} else {
 			int l = sublen;
-			mavldata_t mdata, *mdata_result;
+
 			char dbgstr[1048];
 			char key[1024];
 			
@@ -68,20 +69,13 @@ int cw_read_descriptor_subelems(mavl_t cfg, const char * parent_key,
 
 			/* vendor */
 			sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_KEY_VENDOR);
-			mdata.kv.key = strdup(key);
-			mdata.kv.val.dword = vendor_id;
-			mdata.kv.priv=CW_TYPE_DWORD;
-			mavl_add(cfg,&mdata);
-
-
+			cw_kvstore_add(cfg,key,CW_TYPE_DWORD,data + sub,4);
+	
 			/* version */
 			sprintf(key,"%s/%s/%s",parent_key,elems[i].key,CW_KEY_VERSION);
-			mdata_result = cw_type_version.get(&mdata,data+sub+8,l);
-			mdata.kv.key = strdup(key);
-			mavl_add(cfg,mdata_result);
-
-			cw_type_version.to_str(mdata_result,dbgstr,90);
-			sprintf(dbgstr, "Storing '%s'", elems[i].key);
+			cw_kvstore_add(cfg,key,CW_TYPE_VERSION,data+sub+8,l);
+	
+			sprintf(dbgstr, "%s", key);
 			cw_dbg_version_subelem(DBG_SUBELEM, dbgstr, subtype, vendor_id, data+sub+8,l);
 			success++;
 		}
diff --git a/src/cw/cw_strdup.c b/src/cw/cw_strdup.c
new file mode 100644
index 00000000..15f6ad2f
--- /dev/null
+++ b/src/cw/cw_strdup.c
@@ -0,0 +1,10 @@
+#include 
+#include 
+
+char *cw_strdup(const char *s) {
+    size_t size = strlen(s) + 1;
+    char *p = malloc(size);
+    if (p) 
+        memcpy(p, s, size);
+    return p;
+}
diff --git a/src/cw/cw_type_byte.c b/src/cw/cw_type_byte.c
index d6a2b6f2..f58c44d3 100644
--- a/src/cw/cw_type_byte.c
+++ b/src/cw/cw_type_byte.c
@@ -46,10 +46,10 @@ static mavldata_t *from_str(mavldata_t * data, const char *src)
 
 
 const struct cw_Type cw_type_byte = {
-	"Byte",		/* name */
-	NULL,		/* del */
-	put,		/* put */
-	get,		/* get */
-	to_str,		/* to_str */
-	from_str	/* from_str */ 
+	"Byte",			/* name */
+	cw_types_del_null,	/* del */
+	put,			/* put */
+	get,			/* get */
+	to_str,			/* to_str */
+	from_str		/* from_str */ 
 };
diff --git a/src/cw/cw_type_dword.c b/src/cw/cw_type_dword.c
index 53532f66..f5283ddb 100644
--- a/src/cw/cw_type_dword.c
+++ b/src/cw/cw_type_dword.c
@@ -23,7 +23,7 @@
 
 static mavldata_t *get(mavldata_t * data, const uint8_t * src, int len)
 {
-	data->kv.priv = &cw_type_byte;
+	data->kv.priv = &cw_type_dword;
 	data->kv.val.dword = cw_get_dword(src);
 	return data;
 }
@@ -45,11 +45,11 @@ static mavldata_t *from_str(mavldata_t * data, const char *src)
 }
 
 const struct cw_Type cw_type_dword = {
-	"Dword",	/* name */
-	NULL,		/* del */
-	put,		/* put */
-	get,		/* get */
-	to_str,		/* to_str */
-	from_str	/* from_str */ 
+	"Dword",		/* name */
+	cw_types_del_null,	/* del */
+	put,			/* put */
+	get,			/* get */
+	to_str,			/* to_str */
+	from_str		/* from_str */ 
 };
 
diff --git a/src/cw/cw_types.h b/src/cw/cw_types.h
index dec738d3..7c670060 100644
--- a/src/cw/cw_types.h
+++ b/src/cw/cw_types.h
@@ -42,4 +42,6 @@ extern const struct cw_Type  cw_type_version;
 #define CW_TYPE_DWORD (&cw_type_dword)
 #define CW_TYPE_VERSION (&cw_type_version)
 
+void cw_types_del_null(mavldata_t *data);
+
 #endif /* __CW_TYPES_H */
diff --git a/src/cw/cw_types_del_null.c b/src/cw/cw_types_del_null.c
new file mode 100644
index 00000000..a7131455
--- /dev/null
+++ b/src/cw/cw_types_del_null.c
@@ -0,0 +1,6 @@
+#include "mavl.h"
+#include "cw_types.h"
+
+void cw_types_del_null(mavldata_t *data){
+	return;
+}
diff --git a/src/cw/kvstore.h b/src/cw/kvstore.h
new file mode 100644
index 00000000..30e1d4d1
--- /dev/null
+++ b/src/cw/kvstore.h
@@ -0,0 +1,15 @@
+#ifndef __CW_KVSTORE_H
+#define __CW_KVSTORE_H
+
+#include "mavl.h"
+#include "cw_types.h"
+
+void cw_kvstore_mavl_delete(mavldata_t *data);
+const char * cw_kvstore_add(mavl_t kvstore, const char *key, const struct cw_Type *type,
+			const uint8_t * data, int len);
+			
+#define cw_kvstore_create()\
+	mavl_create(mavl_cmp_kv, cw_kvstore_mavl_delete)
+
+
+#endif /* __CW_KVSTORE_H */
diff --git a/src/cw/mavl.h b/src/cw/mavl.h
index 71df95bf..3447767c 100644
--- a/src/cw/mavl.h
+++ b/src/cw/mavl.h
@@ -121,7 +121,7 @@ void mavlnode_destroy(struct mavl *t, struct mavlnode *n);
 
 void mavl_del_all(struct mavl *t);
 union mavldata *mavl_del(struct mavl *t, union mavldata *data);
-union mavldata *mavl_add(struct mavl *t, union mavldata *data);
+union mavldata *mavl_add(struct mavl *t, const union mavldata *data);
 union mavldata * mavl_get(struct mavl *t ,union mavldata *data);
 struct mavlnode *mavl_get_node(struct mavl *t, union mavldata *data);
 void * mavl_get_ptr(mavl_t tree, void * search);
@@ -228,6 +228,7 @@ extern union mavldata  * mavliter_seek(mavliter_t *i,void *d);
 	while(NULL != (val = mavliter_next(iter)))
 
 
+
 /**
  * Get the number of elements stored in a mavl object
  * @param m mavl object
diff --git a/src/cw/mavl_add.c b/src/cw/mavl_add.c
index a09e93e0..18fe8887 100644
--- a/src/cw/mavl_add.c
+++ b/src/cw/mavl_add.c
@@ -1,6 +1,5 @@
 #include "mavl.h"
 
-
 static struct mavlnode *mavlnode_create(union mavldata *data)
 {
 	struct mavlnode *n = malloc(sizeof(struct mavlnode));
@@ -16,16 +15,16 @@ static struct mavlnode *mavlnode_create(union mavldata *data)
 
 
 
-static int mavl_add0(struct mavl *t, struct mavlnode **parent, union mavldata * data)
+static int mavl_add0(struct mavl *t, struct mavlnode **parent, union mavldata ** data)
 {
 	struct mavlnode *tmp;
 
 	struct mavlnode *n = *parent;
-	int rc = t->cmp(data, &n->data);
+	int rc = t->cmp(*data, &n->data);
 
 	int bal;
 	if (rc == 0) {
-		*data = n->data;
+		*data = &n->data;
 		return 2;
 	}
 
@@ -78,7 +77,7 @@ static int mavl_add0(struct mavl *t, struct mavlnode **parent, union mavldata *
 		}
 
 		/* n->left is 0 */
-		n->left = mavlnode_create(data);
+		n->left = mavlnode_create(*data);
 		if (!n->left)
 			return 3;
 
@@ -141,7 +140,7 @@ static int mavl_add0(struct mavl *t, struct mavlnode **parent, union mavldata *
 
 		/* n->right is 0 */
 
-		n->right = mavlnode_create(data);
+		n->right = mavlnode_create(*data);
 		if (!n->right)
 			return 3;
 
@@ -170,7 +169,7 @@ static int mavl_add0(struct mavl *t, struct mavlnode **parent, union mavldata *
  * @example mavl_add_example.c
  */
  
-union mavldata *mavl_add(struct mavl *t, union mavldata *data)
+union mavldata *mavl_add(struct mavl *t, const union mavldata *data)
 {
 	union mavldata * d;
 	int rc;
@@ -184,7 +183,7 @@ union mavldata *mavl_add(struct mavl *t, union mavldata *data)
 
 	d = data;
 
-	rc = mavl_add0(t, &t->root, d);
+	rc = mavl_add0(t, &t->root, &d);
 
 	if (rc > 3)
 		return NULL;
diff --git a/src/cw/sock_receive.c b/src/cw/sock_receive.c
index f71e939f..98d2ff6e 100644
--- a/src/cw/sock_receive.c
+++ b/src/cw/sock_receive.c
@@ -42,11 +42,12 @@
 int sock_receive(int sock, void *buf, size_t len, int flags,
 		 struct sockaddr *srcaddr, socklen_t * srcaddrlen)
 {
-//	socklen_t al = sizeof(struct sockaddr_storage);
+	int n;
+/*	socklen_t al = sizeof(struct sockaddr_storage); */
 	*srcaddrlen=sizeof(struct sockaddr);	
 	memset(srcaddr, 0, sizeof(struct sockaddr));
 
-	int n;
+
 	while ((n = recvfrom(sock, (char *) buf, len, flags, srcaddr, srcaddrlen)) < 0) {
 		if (errno != EINTR)
 			return n;