aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmar Tarabai <tarabai@devegypt.com>2014-05-12 15:55:41 +0000
committerOmar Tarabai <tarabai@devegypt.com>2014-05-12 15:55:41 +0000
commit6f1bbf8034e41837c33c5e3a7270c603a02e9d2e (patch)
tree5f3bf2aa83959c110376303298da5f49ba1134cf
parenta9670db6f78bdc4be16dc856a02fe42f4e039f93 (diff)
downloadgnunet-6f1bbf8034e41837c33c5e3a7270c603a02e9d2e.tar.gz
gnunet-6f1bbf8034e41837c33c5e3a7270c603a02e9d2e.zip
PEERSTORE store function
-rw-r--r--src/include/gnunet_peerstore_plugin.h8
-rw-r--r--src/peerstore/gnunet-service-peerstore.c67
-rw-r--r--src/peerstore/peerstore_api.c3
-rw-r--r--src/peerstore/plugin_peerstore_sqlite.c2
-rw-r--r--src/peerstore/test_peerstore_api.c8
-rw-r--r--src/sensor/gnunet-service-sensor.c2
6 files changed, 74 insertions, 16 deletions
diff --git a/src/include/gnunet_peerstore_plugin.h b/src/include/gnunet_peerstore_plugin.h
index 8dcc1ec2a..f693072c0 100644
--- a/src/include/gnunet_peerstore_plugin.h
+++ b/src/include/gnunet_peerstore_plugin.h
@@ -63,10 +63,10 @@ struct GNUNET_PEERSTORE_PluginFunctions
63 */ 63 */
64 int 64 int
65 (*store_record) (void *cls, 65 (*store_record) (void *cls,
66 const char *sub_system, 66 const struct GNUNET_PeerIdentity *peer,
67 const struct GNUNET_PeerIdentity *peer, 67 const char *sub_system,
68 const void *value, 68 const void *value,
69 size_t size); 69 size_t size);
70 70
71}; 71};
72 72
diff --git a/src/peerstore/gnunet-service-peerstore.c b/src/peerstore/gnunet-service-peerstore.c
index d3f87c4bc..837c5ca75 100644
--- a/src/peerstore/gnunet-service-peerstore.c
+++ b/src/peerstore/gnunet-service-peerstore.c
@@ -26,6 +26,10 @@
26#include "platform.h" 26#include "platform.h"
27#include "gnunet_util_lib.h" 27#include "gnunet_util_lib.h"
28#include "peerstore.h" 28#include "peerstore.h"
29#include "gnunet_peerstore_plugin.h"
30
31//TODO: GNUNET_SERVER_receive_done() ?
32//TODO: implement value lifetime
29 33
30/** 34/**
31 * Our configuration. 35 * Our configuration.
@@ -85,21 +89,68 @@ void handle_store (void *cls,
85 struct GNUNET_SERVER_Client *client, 89 struct GNUNET_SERVER_Client *client,
86 const struct GNUNET_MessageHeader *message) 90 const struct GNUNET_MessageHeader *message)
87{ 91{
88 struct StoreRequestMessage *sreqm; 92 struct StoreRequestMessage *req;
89 struct GNUNET_SERVER_TransmitContext *tc;
90 struct StoreResponseMessage *sresm;
91 uint16_t msg_size; 93 uint16_t msg_size;
94 uint16_t sub_system_size;
95 uint16_t value_size;
92 char *sub_system; 96 char *sub_system;
97 void *value;
98 struct GNUNET_SERVER_TransmitContext *tc;
99 struct StoreResponseMessage *res;
100 char *emsg;
101 size_t emsg_size = 0;
102 char *emsg_dest;
93 103
94 msg_size = ntohs(message->size); 104 msg_size = ntohs(message->size);
95 GNUNET_break_op(msg_size > sizeof(struct GNUNET_MessageHeader) + sizeof(struct StoreRequestMessage)); 105 if(msg_size < sizeof(struct StoreRequestMessage))
96 sreqm = (struct StoreRequestMessage *)&message[1]; 106 {
97 sub_system = (char *)&sreqm[1]; 107 GNUNET_break(0);
108 GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
109 return;
110 }
111 req = (struct StoreRequestMessage *)message;
112 sub_system_size = ntohs(req->sub_system_size);
113 value_size = ntohs(req->value_size);
114 if(sub_system_size + value_size + sizeof(struct StoreRequestMessage)
115 != msg_size)
116 {
117 GNUNET_break(0);
118 GNUNET_SERVER_receive_done(client, GNUNET_SYSERR);
119 return;
120 }
121 sub_system = (char *)&req[1];
122 value = sub_system + sub_system_size;
98 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Received a store request (size: %lu) for sub system `%s' and peer `%s'\n", 123 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Received a store request (size: %lu) for sub system `%s' and peer `%s'\n",
99 msg_size, 124 msg_size,
100 sub_system, 125 sub_system,
101 GNUNET_i2s (&sreqm->peer)); 126 GNUNET_i2s (&req->peer));
102 //TODO: do the actual storage 127 if(GNUNET_OK != db->store_record(db->cls,
128 &req->peer,
129 sub_system,
130 value,
131 value_size))
132 {
133 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Failed to store requested value, sqlite database error.");
134 emsg = _("Failed to store requested value, sqlite database error.");
135 emsg_size = strlen(emsg) + 1;
136 }
137 res = GNUNET_malloc(sizeof(struct StoreResponseMessage) + emsg_size);
138 res->emsg_size = htons(emsg_size);
139 res->header.size = htons(sizeof(struct StoreResponseMessage) + emsg_size);
140 res->header.type = htons(GNUNET_MESSAGE_TYPE_PEERSTORE_STORE_RESULT);
141 if(emsg_size > 0)
142 {
143 res->success = htons(GNUNET_NO);
144 emsg_dest = (char *)&res[1];
145 memcpy(emsg_dest, emsg, emsg_size);
146 }
147 else
148 res->success = htons(GNUNET_YES);
149 tc = GNUNET_SERVER_transmit_context_create (client);
150 GNUNET_SERVER_transmit_context_append_message(tc, (struct GNUNET_MessageHeader *)res);
151 GNUNET_free(res);
152 GNUNET_SERVER_transmit_context_run (tc, GNUNET_TIME_UNIT_FOREVER_REL);
153
103} 154}
104 155
105/** 156/**
diff --git a/src/peerstore/peerstore_api.c b/src/peerstore/peerstore_api.c
index 959d2488a..ffe973df4 100644
--- a/src/peerstore/peerstore_api.c
+++ b/src/peerstore/peerstore_api.c
@@ -232,6 +232,7 @@ GNUNET_PEERSTORE_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
232 232
233/** 233/**
234 * Disconnect from the PEERSTORE service 234 * Disconnect from the PEERSTORE service
235 * Do not call in case of pending requests
235 * 236 *
236 * @param h handle to disconnect 237 * @param h handle to disconnect
237 */ 238 */
@@ -583,7 +584,7 @@ GNUNET_PEERSTORE_store (struct GNUNET_PEERSTORE_Handle *h,
583 LOG (GNUNET_ERROR_TYPE_DEBUG, 584 LOG (GNUNET_ERROR_TYPE_DEBUG,
584 "Storing value (size: %lu) for subsytem `%s' and peer `%s'\n", 585 "Storing value (size: %lu) for subsytem `%s' and peer `%s'\n",
585 size, sub_system, GNUNET_i2s (peer)); 586 size, sub_system, GNUNET_i2s (peer));
586 sub_system_size = strlen(sub_system); 587 sub_system_size = strlen(sub_system) + 1;
587 request_size = sizeof(struct StoreRequestMessage) + sub_system_size + size; 588 request_size = sizeof(struct StoreRequestMessage) + sub_system_size + size;
588 rc = GNUNET_malloc(sizeof(struct GNUNET_PEERSTORE_RequestContext) + request_size); 589 rc = GNUNET_malloc(sizeof(struct GNUNET_PEERSTORE_RequestContext) + request_size);
589 rc->h = h; 590 rc->h = h;
diff --git a/src/peerstore/plugin_peerstore_sqlite.c b/src/peerstore/plugin_peerstore_sqlite.c
index 1695938bb..e967e2177 100644
--- a/src/peerstore/plugin_peerstore_sqlite.c
+++ b/src/peerstore/plugin_peerstore_sqlite.c
@@ -104,7 +104,7 @@ peerstore_sqlite_store_record (void *cls,
104 //FIXME: check if value exists with the same key first 104 //FIXME: check if value exists with the same key first
105 105
106 if(SQLITE_OK != sqlite3_bind_blob(stmt, 2, peer, sizeof(struct GNUNET_PeerIdentity), SQLITE_STATIC) 106 if(SQLITE_OK != sqlite3_bind_blob(stmt, 2, peer, sizeof(struct GNUNET_PeerIdentity), SQLITE_STATIC)
107 || SQLITE_OK != sqlite3_bind_text(stmt, 1, sub_system, sizeof(sub_system), SQLITE_STATIC) 107 || SQLITE_OK != sqlite3_bind_text(stmt, 1, sub_system, strlen(sub_system) + 1, SQLITE_STATIC)
108 || SQLITE_OK != sqlite3_bind_blob(stmt, 3, value, size, SQLITE_STATIC)) 108 || SQLITE_OK != sqlite3_bind_blob(stmt, 3, value, size, SQLITE_STATIC))
109 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, 109 LOG_SQLITE (plugin, GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
110 "sqlite3_bind"); 110 "sqlite3_bind");
diff --git a/src/peerstore/test_peerstore_api.c b/src/peerstore/test_peerstore_api.c
index 51251d72a..8cb2c4516 100644
--- a/src/peerstore/test_peerstore_api.c
+++ b/src/peerstore/test_peerstore_api.c
@@ -30,6 +30,11 @@ static int ok = 1;
30 30
31struct GNUNET_PEERSTORE_Handle *h; 31struct GNUNET_PEERSTORE_Handle *h;
32 32
33void store_cont(void *cls, const char *emsg)
34{
35 GNUNET_PEERSTORE_disconnect(h);
36}
37
33static void 38static void
34run (void *cls, 39run (void *cls,
35 const struct GNUNET_CONFIGURATION_Handle *cfg, 40 const struct GNUNET_CONFIGURATION_Handle *cfg,
@@ -49,9 +54,8 @@ run (void *cls,
49 val, 54 val,
50 val_size, 55 val_size,
51 GNUNET_TIME_UNIT_FOREVER_REL, 56 GNUNET_TIME_UNIT_FOREVER_REL,
52 NULL, 57 &store_cont,
53 NULL); 58 NULL);
54 GNUNET_PEERSTORE_disconnect(h);
55 59
56} 60}
57 61
diff --git a/src/sensor/gnunet-service-sensor.c b/src/sensor/gnunet-service-sensor.c
index b11da6ecd..8a6b151d8 100644
--- a/src/sensor/gnunet-service-sensor.c
+++ b/src/sensor/gnunet-service-sensor.c
@@ -28,6 +28,8 @@
28#include "gnunet_util_lib.h" 28#include "gnunet_util_lib.h"
29#include "sensor.h" 29#include "sensor.h"
30 30
31//TODO: GNUNET_SERVER_receive_done() ?
32
31/** 33/**
32 * Minimum sensor execution interval (in seconds) 34 * Minimum sensor execution interval (in seconds)
33 */ 35 */