diff options
author | Omar Tarabai <tarabai@devegypt.com> | 2014-05-12 15:55:41 +0000 |
---|---|---|
committer | Omar Tarabai <tarabai@devegypt.com> | 2014-05-12 15:55:41 +0000 |
commit | 6f1bbf8034e41837c33c5e3a7270c603a02e9d2e (patch) | |
tree | 5f3bf2aa83959c110376303298da5f49ba1134cf | |
parent | a9670db6f78bdc4be16dc856a02fe42f4e039f93 (diff) | |
download | gnunet-6f1bbf8034e41837c33c5e3a7270c603a02e9d2e.tar.gz gnunet-6f1bbf8034e41837c33c5e3a7270c603a02e9d2e.zip |
PEERSTORE store function
-rw-r--r-- | src/include/gnunet_peerstore_plugin.h | 8 | ||||
-rw-r--r-- | src/peerstore/gnunet-service-peerstore.c | 67 | ||||
-rw-r--r-- | src/peerstore/peerstore_api.c | 3 | ||||
-rw-r--r-- | src/peerstore/plugin_peerstore_sqlite.c | 2 | ||||
-rw-r--r-- | src/peerstore/test_peerstore_api.c | 8 | ||||
-rw-r--r-- | src/sensor/gnunet-service-sensor.c | 2 |
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 | ||
31 | struct GNUNET_PEERSTORE_Handle *h; | 31 | struct GNUNET_PEERSTORE_Handle *h; |
32 | 32 | ||
33 | void store_cont(void *cls, const char *emsg) | ||
34 | { | ||
35 | GNUNET_PEERSTORE_disconnect(h); | ||
36 | } | ||
37 | |||
33 | static void | 38 | static void |
34 | run (void *cls, | 39 | run (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 | */ |