diff options
author | Omar Tarabai <tarabai@devegypt.com> | 2014-05-14 16:40:45 +0000 |
---|---|---|
committer | Omar Tarabai <tarabai@devegypt.com> | 2014-05-14 16:40:45 +0000 |
commit | a760c1b877f3a9ac17f2577cdc298f793c574407 (patch) | |
tree | 7411c99a1865aa1b1a6e1141172aa9a1378d4db7 /src/peerstore/gnunet-service-peerstore.c | |
parent | cb67c0bb1e6f2a5bae0295a75bc1f4b1b9f9f765 (diff) | |
download | gnunet-a760c1b877f3a9ac17f2577cdc298f793c574407.tar.gz gnunet-a760c1b877f3a9ac17f2577cdc298f793c574407.zip |
peerstore helper file
Diffstat (limited to 'src/peerstore/gnunet-service-peerstore.c')
-rw-r--r-- | src/peerstore/gnunet-service-peerstore.c | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/src/peerstore/gnunet-service-peerstore.c b/src/peerstore/gnunet-service-peerstore.c index 303f25027..990fa2c88 100644 --- a/src/peerstore/gnunet-service-peerstore.c +++ b/src/peerstore/gnunet-service-peerstore.c | |||
@@ -27,6 +27,7 @@ | |||
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" | 29 | #include "gnunet_peerstore_plugin.h" |
30 | #include "peerstore_common.h" | ||
30 | 31 | ||
31 | //TODO: GNUNET_SERVER_receive_done() ? | 32 | //TODO: GNUNET_SERVER_receive_done() ? |
32 | //TODO: implement value lifetime | 33 | //TODO: implement value lifetime |
@@ -79,6 +80,20 @@ handle_client_disconnect (void *cls, | |||
79 | } | 80 | } |
80 | 81 | ||
81 | /** | 82 | /** |
83 | * Handle an iterate request from client | ||
84 | * | ||
85 | * @param cls unused | ||
86 | * @param client identification of the client | ||
87 | * @param message the actual message | ||
88 | */ | ||
89 | void handle_iterate (void *cls, | ||
90 | struct GNUNET_SERVER_Client *client, | ||
91 | const struct GNUNET_MessageHeader *message) | ||
92 | { | ||
93 | |||
94 | } | ||
95 | |||
96 | /** | ||
82 | * Handle a store request from client | 97 | * Handle a store request from client |
83 | * | 98 | * |
84 | * @param cls unused | 99 | * @param cls unused |
@@ -89,49 +104,46 @@ void handle_store (void *cls, | |||
89 | struct GNUNET_SERVER_Client *client, | 104 | struct GNUNET_SERVER_Client *client, |
90 | const struct GNUNET_MessageHeader *message) | 105 | const struct GNUNET_MessageHeader *message) |
91 | { | 106 | { |
92 | struct StoreRequestMessage *req; | 107 | struct GNUNET_PEERSTORE_Record *record; |
93 | uint16_t req_size; | ||
94 | uint16_t ss_size; | ||
95 | uint16_t key_size; | ||
96 | uint16_t value_size; | ||
97 | char *sub_system; | ||
98 | char *key; | ||
99 | void *value; | ||
100 | uint16_t response_type; | 108 | uint16_t response_type; |
101 | struct GNUNET_SERVER_TransmitContext *tc; | 109 | struct GNUNET_SERVER_TransmitContext *tc; |
102 | 110 | ||
103 | req_size = ntohs(message->size); | 111 | record = PEERSTORE_parse_record_message(message); |
104 | if(req_size < sizeof(struct StoreRequestMessage)) | 112 | if(NULL == record) |
113 | { | ||
114 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Malformed store request from client\n"); | ||
115 | GNUNET_SERVER_receive_done(client, GNUNET_SYSERR); | ||
116 | return; | ||
117 | } | ||
118 | if(NULL == record->sub_system) | ||
119 | { | ||
120 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Sub system not supplied in client store request\n"); | ||
121 | GNUNET_SERVER_receive_done(client, GNUNET_SYSERR); | ||
122 | return; | ||
123 | } | ||
124 | if(NULL == record->peer) | ||
105 | { | 125 | { |
106 | GNUNET_break(0); | 126 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Peer id not supplied in client store request\n"); |
107 | GNUNET_SERVER_receive_done(client, GNUNET_SYSERR); | 127 | GNUNET_SERVER_receive_done(client, GNUNET_SYSERR); |
108 | return; | 128 | return; |
109 | } | 129 | } |
110 | req = (struct StoreRequestMessage *)message; | 130 | if(NULL == record->key) |
111 | ss_size = ntohs(req->sub_system_size); | ||
112 | key_size = ntohs(req->key_size); | ||
113 | value_size = ntohs(req->value_size); | ||
114 | if(ss_size + key_size + value_size + sizeof(struct StoreRequestMessage) | ||
115 | != req_size) | ||
116 | { | 131 | { |
117 | GNUNET_break(0); | 132 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Key not supplied in client store request\n"); |
118 | GNUNET_SERVER_receive_done(client, GNUNET_SYSERR); | 133 | GNUNET_SERVER_receive_done(client, GNUNET_SYSERR); |
119 | return; | 134 | return; |
120 | } | 135 | } |
121 | sub_system = (char *)&req[1]; | ||
122 | key = sub_system + ss_size; | ||
123 | value = key + key_size; | ||
124 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Received a store request (size: %lu) for sub system `%s', peer `%s', key `%s'\n", | 136 | GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Received a store request (size: %lu) for sub system `%s', peer `%s', key `%s'\n", |
125 | value_size, | 137 | record->value_size, |
126 | sub_system, | 138 | record->sub_system, |
127 | GNUNET_i2s (&req->peer), | 139 | GNUNET_i2s (record->peer), |
128 | key); | 140 | record->key); |
129 | if(GNUNET_OK == db->store_record(db->cls, | 141 | if(GNUNET_OK == db->store_record(db->cls, |
130 | sub_system, | 142 | record->sub_system, |
131 | &req->peer, | 143 | record->peer, |
132 | key, | 144 | record->key, |
133 | value, | 145 | record->value, |
134 | value_size)) | 146 | record->value_size)) |
135 | { | 147 | { |
136 | response_type = GNUNET_MESSAGE_TYPE_PEERSTORE_STORE_RESULT_OK; | 148 | response_type = GNUNET_MESSAGE_TYPE_PEERSTORE_STORE_RESULT_OK; |
137 | } | 149 | } |
@@ -161,6 +173,7 @@ run (void *cls, | |||
161 | { | 173 | { |
162 | static const struct GNUNET_SERVER_MessageHandler handlers[] = { | 174 | static const struct GNUNET_SERVER_MessageHandler handlers[] = { |
163 | {&handle_store, NULL, GNUNET_MESSAGE_TYPE_PEERSTORE_STORE, 0}, | 175 | {&handle_store, NULL, GNUNET_MESSAGE_TYPE_PEERSTORE_STORE, 0}, |
176 | {&handle_iterate, NULL, GNUNET_MESSAGE_TYPE_PEERSTORE_ITERATE, 0}, | ||
164 | {NULL, NULL, 0, 0} | 177 | {NULL, NULL, 0, 0} |
165 | }; | 178 | }; |
166 | char *database; | 179 | char *database; |