From 2f4b20ea2c334ce412dbc1fe29253cc110765205 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Tue, 28 Feb 2012 16:14:06 +0000 Subject: [PATCH] - using de/serialization functionality --- src/namestore/Makefile.am | 19 ++++++----- src/namestore/gnunet-service-namestore.c | 9 ++++-- src/namestore/namestore.h | 4 +-- src/namestore/namestore_api.c | 40 ++++++++++++++++-------- src/namestore/test_namestore_api.c | 16 +++++++++- src/namestore/test_namestore_api.conf | 2 +- 6 files changed, 62 insertions(+), 28 deletions(-) diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am index 2e9a99d5f..47517b9c8 100644 --- a/src/namestore/Makefile.am +++ b/src/namestore/Makefile.am @@ -23,19 +23,20 @@ endif check_PROGRAMS = \ - $(SQLITE_TESTS) + $(SQLITE_TESTS) \ + test_namestore_api \ + test_namestore_api_zone_iteration \ + test_namestore_record_serialization if HAVE_EXPERIMENTAL -check_PROGRAMS += test_namestore_api \ -test_namestore_api_zone_iteration \ -test_namestore_record_serialization + check_PROGRAMS endif lib_LTLIBRARIES = \ libgnunetnamestore.la - + libgnunetnamestore_la_SOURCES = \ - namestore_api.c namestore.h + namestore_api.c namestore.h libgnunetnamestore_la_LIBADD = \ $(top_builddir)/src/statistics/libgnunetstatistics.la \ $(top_builddir)/src/util/libgnunetutil.la \ @@ -72,13 +73,15 @@ libgnunet_plugin_namestore_sqlite_la_LDFLAGS = \ test_namestore_api_SOURCES = \ - test_namestore_api.c + test_namestore_api.c \ + namestore_common.c test_namestore_api_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/namestore/libgnunetnamestore.la test_namestore_api_zone_iteration_SOURCES = \ - test_namestore_api_zone_iteration.c + test_namestore_api_zone_iteration.c \ + namestore_common.c test_namestore_api_zone_iteration_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/namestore/libgnunetnamestore.la diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index 8f969371b..92eb218b9 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c @@ -369,7 +369,9 @@ static void handle_record_put (void *cls, size_t msg_size; size_t msg_size_exp; char * name; + char * rd_ser; uint32_t id = 0; + uint32_t rd_ser_len; uint32_t rd_count; int res = GNUNET_SYSERR; @@ -391,9 +393,9 @@ static void handle_record_put (void *cls, struct RecordPutMessage * rp_msg = (struct RecordPutMessage *) message; id = ntohl (rp_msg->op_id); name_len = ntohs (rp_msg->name_len); - rd_count = ntohl(rp_msg->rd_count); + rd_ser_len = ntohs(rp_msg->rd_len); msg_size = ntohs (message->size); - msg_size_exp = sizeof (struct RecordPutMessage) + sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) + name_len + rd_count * (sizeof (struct GNUNET_NAMESTORE_RecordData)); + msg_size_exp = sizeof (struct RecordPutMessage) + sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) + name_len + rd_ser_len; if (msg_size != msg_size_exp) { @@ -415,7 +417,8 @@ static void handle_record_put (void *cls, name = (char *) &zone_key[1]; expire = GNUNET_TIME_absolute_ntoh(rp_msg->expire); signature = (struct GNUNET_CRYPTO_RsaSignature *) &rp_msg->signature; - rd = (struct GNUNET_NAMESTORE_RecordData *) &name[name_len]; + rd_ser = &name[name_len]; + rd_count = GNUNET_NAMESTORE_records_deserialize(&rd, rd_ser, rd_ser_len); /* Database operation */ res = GSN_database->put_records(GSN_database->cls, diff --git a/src/namestore/namestore.h b/src/namestore/namestore.h index 5b6a24ca6..22fc860eb 100644 --- a/src/namestore/namestore.h +++ b/src/namestore/namestore.h @@ -196,8 +196,8 @@ struct RecordPutMessage /* name length */ uint16_t name_len; - /* Requested record type */ - uint32_t rd_count; + /* Length of serialized rd data */ + uint16_t rd_len; struct GNUNET_TIME_AbsoluteNBO expire; diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c index ace9945da..1d41399c6 100644 --- a/src/namestore/namestore_api.c +++ b/src/namestore/namestore_api.c @@ -739,11 +739,13 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h, /* pointer to elements */ struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key_tmp; - struct GNUNET_NAMESTORE_RecordData *rd_tmp; + char * rd_tmp; + char * rd_ser; char * name_tmp; size_t msg_size = 0; size_t name_len = strlen(name) + 1; + size_t rd_ser_len = 0; uint32_t id = 0; GNUNET_assert (NULL != h); @@ -756,8 +758,10 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h, GNUNET_CONTAINER_DLL_insert_tail(h->op_head, h->op_tail, qe); /* set msg_size*/ + rd_ser_len = GNUNET_NAMESTORE_records_serialize(&rd_ser, rd_count, rd); + struct RecordPutMessage * msg; - msg_size = sizeof (struct RecordPutMessage) + sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) + name_len + rd_count * (sizeof (struct GNUNET_NAMESTORE_RecordData)); + msg_size = sizeof (struct RecordPutMessage) + sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) + name_len + rd_ser_len; /* create msg here */ pe = GNUNET_malloc(sizeof (struct PendingMessage) + msg_size); @@ -766,7 +770,7 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h, msg = (struct RecordPutMessage *) &pe[1]; zone_key_tmp = (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *) &msg[1]; name_tmp = (char *) &zone_key_tmp[1]; - rd_tmp = (struct GNUNET_NAMESTORE_RecordData *) &name_tmp[name_len]; + rd_tmp = &name_tmp[name_len]; msg->header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_PUT); msg->header.size = htons (msg_size); @@ -776,8 +780,10 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h, msg->name_len = htons (name_len); memcpy (name_tmp, name, name_len); msg->expire = GNUNET_TIME_absolute_hton (expire); - msg->rd_count = htonl(rd_count); - memcpy (rd_tmp, rd, rd_count * (sizeof (struct GNUNET_NAMESTORE_RecordData))); + msg->rd_len = htons (rd_ser_len); + + memcpy (rd_tmp, rd_ser, rd_ser_len); + GNUNET_free (rd_ser); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for name `%s' with size %u\n", "NAMESTORE_RECORD_PUT", name, msg_size); @@ -832,8 +838,10 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, { struct GNUNET_NAMESTORE_QueueEntry *qe; struct PendingMessage *pe; - struct GNUNET_NAMESTORE_RecordData * rd_tmp; char * name_tmp; + char * rd_tmp; + char * rd_ser; + size_t rd_ser_len = 0; size_t msg_size = 0; size_t name_len = 0; uint32_t id = 0; @@ -848,8 +856,9 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, qe->op_id = id; /* set msg_size*/ + rd_ser_len = GNUNET_NAMESTORE_records_serialize(&rd_ser, 1, rd); struct RecordCreateMessage * msg; - msg_size = sizeof (struct RecordCreateMessage) + name_len + sizeof (struct GNUNET_NAMESTORE_RecordData); + msg_size = sizeof (struct RecordCreateMessage) + name_len + rd_ser_len; /* create msg here */ pe = GNUNET_malloc(sizeof (struct PendingMessage) + msg_size); @@ -858,7 +867,7 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, msg = (struct RecordCreateMessage *) &pe[1]; name_tmp = (char *) &msg[1]; - rd_tmp = (struct GNUNET_NAMESTORE_RecordData *) &name_tmp[name_len]; + rd_tmp = &name_tmp[name_len]; msg->header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE); msg->header.size = htons (msg_size); @@ -866,7 +875,8 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, //msg->signature = *signature; msg->name_len = htons (name_len); memcpy (name_tmp, name, name_len); - memcpy (rd_tmp, rd, sizeof (struct GNUNET_NAMESTORE_RecordData)); + memcpy (rd_tmp, rd_ser, rd_ser_len); + GNUNET_free (rd_ser); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for name `%s' with size %u\n", "NAMESTORE_RECORD_CREATE", name, msg_size); @@ -901,8 +911,10 @@ GNUNET_NAMESTORE_record_remove (struct GNUNET_NAMESTORE_Handle *h, { struct GNUNET_NAMESTORE_QueueEntry *qe; struct PendingMessage *pe; - struct GNUNET_NAMESTORE_RecordData * rd_tmp; + char * rd_tmp; + char * rd_ser; char * name_tmp; + size_t rd_ser_len = 0; size_t msg_size = 0; size_t name_len = 0; uint32_t id = 0; @@ -917,8 +929,9 @@ GNUNET_NAMESTORE_record_remove (struct GNUNET_NAMESTORE_Handle *h, qe->op_id = id; /* set msg_size*/ + rd_ser_len = GNUNET_NAMESTORE_records_serialize(&rd_ser, 1, rd); struct RecordRemoveMessage * msg; - msg_size = sizeof (struct RecordRemoveMessage) + name_len + sizeof (struct GNUNET_NAMESTORE_RecordData); + msg_size = sizeof (struct RecordRemoveMessage) + name_len + rd_ser_len; /* create msg here */ pe = GNUNET_malloc(sizeof (struct PendingMessage) + msg_size); @@ -927,7 +940,7 @@ GNUNET_NAMESTORE_record_remove (struct GNUNET_NAMESTORE_Handle *h, msg = (struct RecordRemoveMessage *) &pe[1]; name_tmp = (char *) &msg[1]; - rd_tmp = (struct GNUNET_NAMESTORE_RecordData *) &name_tmp[name_len]; + rd_tmp = &name_tmp[name_len]; msg->header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_REMOVE); msg->header.size = htons (msg_size); @@ -935,7 +948,8 @@ GNUNET_NAMESTORE_record_remove (struct GNUNET_NAMESTORE_Handle *h, //msg->signature = *signature; msg->name_len = htons (name_len); memcpy (name_tmp, name, name_len); - memcpy (rd_tmp, rd, sizeof (struct GNUNET_NAMESTORE_RecordData)); + memcpy (rd_tmp, rd_ser, rd_ser_len); + GNUNET_free (rd_ser); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for name `%s' with size %u\n", "NAMESTORE_RECORD_REMOVE", name, msg_size); diff --git a/src/namestore/test_namestore_api.c b/src/namestore/test_namestore_api.c index b907c7139..ebd8be3f6 100644 --- a/src/namestore/test_namestore_api.c +++ b/src/namestore/test_namestore_api.c @@ -40,6 +40,10 @@ static GNUNET_HashCode zone; static int res; +#define TEST_RECORD_TYPE 1234 +#define TEST_RECORD_DATALEN 123 +#define TEST_RECORD_DATA 'a' + static void start_arm (const char *cfgname) @@ -152,6 +156,13 @@ run (void *cls, char *const *args, const char *cfgfile, struct GNUNET_CRYPTO_RsaSignature signature; + struct GNUNET_NAMESTORE_RecordData rd; + + rd.expiration = GNUNET_TIME_absolute_get(); + rd.record_type = TEST_RECORD_TYPE; + rd.data_size = TEST_RECORD_DATALEN; + rd.data = GNUNET_malloc(TEST_RECORD_DATALEN); + memset ((char *) rd.data, 'a', TEST_RECORD_DATALEN); char * name = "dummy.dummy.gnunet"; start_arm (cfgfile); @@ -162,7 +173,10 @@ run (void *cls, char *const *args, const char *cfgfile, GNUNET_NAMESTORE_record_put (nsh, &pubkey, name, GNUNET_TIME_absolute_get_forever(), - 0, NULL, &signature, put_cont, name); + 1, &rd, &signature, put_cont, name); + + GNUNET_free ((void *)rd.data); + } static int diff --git a/src/namestore/test_namestore_api.conf b/src/namestore/test_namestore_api.conf index 1683d13cf..1b83e8f13 100644 --- a/src/namestore/test_namestore_api.conf +++ b/src/namestore/test_namestore_api.conf @@ -4,7 +4,7 @@ DEFAULTSERVICES = namestore UNIXPATH = /tmp/gnunet-p1-service-arm.sock [namestore] -PREFIX = valgrind --leak-check=full +#PREFIX = valgrind --leak-check=full AUTOSTART = YES UNIXPATH = /tmp/gnunet-service-namestore.sock UNIX_MATCH_UID = YES -- 2.25.1