GNUnet 0.21.1
gnunet-service-namecache.c File Reference

namecache for the GNUnet naming system More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_statistics_service.h"
#include "gnunet_namecache_service.h"
#include "gnunet_namecache_plugin.h"
#include "gnunet_signatures.h"
#include "namecache.h"
Include dependency graph for gnunet-service-namecache.c:

Go to the source code of this file.

Data Structures

struct  NamecacheClient
 A namecache client. More...
 
struct  LookupBlockContext
 Context for name lookups passed from handle_lookup_block to handle_lookup_block_it as closure. More...
 

Macros

#define LOG_STRERROR_FILE(kind, syscall, filename)
 

Functions

static void cleanup_task (void *cls)
 Task run during shutdown. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
 Called whenever a client is disconnected. More...
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 Add a client to our list of active clients. More...
 
static void handle_lookup_block_it (void *cls, const struct GNUNET_GNSRECORD_Block *block)
 A GNUNET_NAMECACHE_BlockCallback for name lookups in handle_lookup_block. More...
 
static void handle_lookup_block (void *cls, const struct LookupBlockMessage *ln_msg)
 Handles a GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK message. More...
 
static int check_block_cache (void *cls, const struct BlockCacheMessage *rp_msg)
 Check a GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE message. More...
 
static void handle_block_cache (void *cls, const struct BlockCacheMessage *rp_msg)
 Handles a GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE message. More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_SERVICE_Handle *service)
 Process namecache requests. More...
 
 GNUNET_SERVICE_MAIN ("namecache", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_fixed_size(lookup_block, GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK, struct LookupBlockMessage, NULL), GNUNET_MQ_hd_var_size(block_cache, GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE, struct BlockCacheMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro. More...
 

Variables

static const struct GNUNET_CONFIGURATION_HandleGSN_cfg
 Configuration handle. More...
 
static struct GNUNET_STATISTICS_Handlestatistics
 Handle to the statistics service. More...
 
static struct GNUNET_NAMECACHE_PluginFunctionsGSN_database
 Database handle. More...
 
static char * db_lib_name
 Name of the database plugin. More...
 

Detailed Description

namecache for the GNUnet naming system

Author
Matthias Wachs
Christian Grothoff

Definition in file gnunet-service-namecache.c.

Macro Definition Documentation

◆ LOG_STRERROR_FILE

#define LOG_STRERROR_FILE (   kind,
  syscall,
  filename 
)
Value:
syscall, \
static char * filename
#define GNUNET_log_from_strerror_file(level, component, cmd, filename)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...

Definition at line 35 of file gnunet-service-namecache.c.

Function Documentation

◆ cleanup_task()

static void cleanup_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused

Definition at line 85 of file gnunet-service-namecache.c.

86{
88 "Stopping namecache service\n");
89 GNUNET_break (NULL ==
93 db_lib_name = NULL;
94 if (NULL != statistics)
95 {
97 GNUNET_NO);
98 statistics = NULL;
99 }
100}
static struct GNUNET_NAMECACHE_PluginFunctions * GSN_database
Database handle.
static char * db_lib_name
Name of the database plugin.
static struct GNUNET_STATISTICS_Handle * statistics
Handle to the statistics service.
#define GNUNET_log(kind,...)
@ GNUNET_NO
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition: plugin.c:242
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).

References db_lib_name, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_NO, GNUNET_PLUGIN_unload(), GNUNET_STATISTICS_destroy(), GSN_database, and statistics.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  app_ctx 
)
static

Called whenever a client is disconnected.

Frees our resources associated with that client.

Parameters
clsclosure
clientidentification of the client
app_ctxthe struct NamecacheClient for this client

Definition at line 112 of file gnunet-service-namecache.c.

115{
116 struct NamecacheClient *nc = app_ctx;
117
119 "Client %p disconnected\n",
120 client);
121 GNUNET_free (nc);
122}
static struct GNUNET_NotificationContext * nc
Notification context for broadcasting to monitors.
A namecache client.
struct GNUNET_SERVICE_Client * client
The client.

References NamecacheClient::client, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, and nc.

◆ client_connect_cb()

static void * client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

Add a client to our list of active clients.

Parameters
clsNULL
clientclient to add
mqqueue to talk to client
Returns
internal namecache client structure for this client

Definition at line 134 of file gnunet-service-namecache.c.

137{
138 struct NamecacheClient *nc;
139
141 "Client %p connected\n",
142 client);
143 nc = GNUNET_new (struct NamecacheClient);
144 nc->client = client;
145 nc->mq = mq;
146 return nc;
147}
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
#define GNUNET_new(type)
Allocate a struct or union of the given type.

References NamecacheClient::client, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, mq, and nc.

◆ handle_lookup_block_it()

static void handle_lookup_block_it ( void *  cls,
const struct GNUNET_GNSRECORD_Block block 
)
static

A GNUNET_NAMECACHE_BlockCallback for name lookups in handle_lookup_block.

Parameters
clsa struct LookupNameContext * with information about the request
blockthe block

Definition at line 180 of file gnunet-service-namecache.c.

182{
183 struct LookupBlockContext *lnc = cls;
184 struct GNUNET_MQ_Envelope *env;
186 size_t bsize;
187
190 bsize,
192 r->gns_header.r_id = htonl (lnc->request_id);
193 GNUNET_memcpy (&r[1],
194 block,
195 bsize);
197 "blocks found in cache",
198 1,
199 GNUNET_NO);
203 "Sending NAMECACHE_LOOKUP_BLOCK_RESPONSE message\n");
204 GNUNET_MQ_send (lnc->nc->mq,
205 env);
206}
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static unsigned int bsize
size_t GNUNET_GNSRECORD_block_get_size(const struct GNUNET_GNSRECORD_Block *block)
Returns the length of this block in bytes.
struct GNUNET_TIME_Absolute GNUNET_GNSRECORD_block_get_expiration(const struct GNUNET_GNSRECORD_Block *block)
Returns the expiration of a block.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:304
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
Definition: gnunet_mq_lib.h:63
#define GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE
Service to client: result of block lookup.
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:638
uint32_t r_id
Request ID in NBO.
Definition: namecache.h:51
Context for name lookups passed from handle_lookup_block to handle_lookup_block_it as closure.
struct NamecacheClient * nc
The client to send the response to.
uint32_t request_id
Operation id for the name lookup.
Lookup response.
Definition: namecache.h:76
struct GNUNET_TIME_AbsoluteNBO expire
Expiration time.
Definition: namecache.h:85
struct GNUNET_NAMECACHE_Header gns_header
Type will be GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE.
Definition: namecache.h:80
struct GNUNET_MQ_Handle * mq
The message queue to talk to client.

References bsize, env, LookupBlockResponseMessage::expire, LookupBlockResponseMessage::gns_header, GNUNET_ERROR_TYPE_DEBUG, GNUNET_GNSRECORD_block_get_expiration(), GNUNET_GNSRECORD_block_get_size(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_TIME_absolute_hton(), NamecacheClient::mq, LookupBlockContext::nc, GNUNET_NAMECACHE_Header::r_id, LookupBlockContext::request_id, and statistics.

Referenced by handle_lookup_block().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_lookup_block()

static void handle_lookup_block ( void *  cls,
const struct LookupBlockMessage ln_msg 
)
static

Handles a GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK message.

Parameters
clsa struct NamecacheClient *
ln_msgthe inbound message

Definition at line 216 of file gnunet-service-namecache.c.

218{
219 struct NamecacheClient *nc = cls;
220 struct GNUNET_MQ_Envelope *env;
221 struct LookupBlockContext lnc;
222 struct LookupBlockResponseMessage *zir_end;
223 int ret;
224
226 "Received NAMECACHE_LOOKUP_BLOCK message\n");
228 "blocks looked up",
229 1,
230 GNUNET_NO);
231 lnc.request_id = ntohl (ln_msg->gns_header.r_id);
232 lnc.nc = nc;
233 lnc.status = GNUNET_OK;
234 if (GNUNET_SYSERR ==
236 &ln_msg->query,
238 &lnc)))
239 {
240 /* internal error (in database plugin); might be best to just hang up on
241 plugin rather than to signal that there are 'no' results, which
242 might also be false... */
243 GNUNET_break (0);
245 return;
246 }
247 if ((0 == ret) || (GNUNET_SYSERR == lnc.status))
248 {
249 /* no records match at all, generate empty response */
251 "Sending empty NAMECACHE_LOOKUP_BLOCK_RESPONSE message\n");
252 env = GNUNET_MQ_msg (zir_end,
254 zir_end->gns_header.r_id = ln_msg->gns_header.r_id;
255 GNUNET_MQ_send (nc->mq,
256 env);
257 }
259}
static int ret
Final status code.
Definition: gnunet-arm.c:94
static void handle_lookup_block_it(void *cls, const struct GNUNET_GNSRECORD_Block *block)
A GNUNET_NAMECACHE_BlockCallback for name lookups in handle_lookup_block.
@ GNUNET_OK
@ GNUNET_SYSERR
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:78
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2489
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2408
int(* lookup_block)(void *cls, const struct GNUNET_HashCode *query, GNUNET_NAMECACHE_BlockCallback iter, void *iter_cls)
Get the block for a particular zone and label in the datastore.
void * cls
Closure to pass to all plugin functions.
struct GNUNET_NAMECACHE_Header gns_header
Type will be GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK.
Definition: namecache.h:63
struct GNUNET_HashCode query
The query.
Definition: namecache.h:68

References GNUNET_NAMECACHE_PluginFunctions::cls, env, LookupBlockMessage::gns_header, LookupBlockResponseMessage::gns_header, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK_RESPONSE, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_NO, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_STATISTICS_update(), GNUNET_SYSERR, GSN_database, handle_lookup_block_it(), GNUNET_NAMECACHE_PluginFunctions::lookup_block, nc, LookupBlockContext::nc, LookupBlockMessage::query, GNUNET_NAMECACHE_Header::r_id, LookupBlockContext::request_id, ret, statistics, and LookupBlockContext::status.

Here is the call graph for this function:

◆ check_block_cache()

static int check_block_cache ( void *  cls,
const struct BlockCacheMessage rp_msg 
)
static

Check a GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE message.

Parameters
clsour struct NamecacheClient
rp_msgmessage to process
Returns
GNUNET_OK (always fine)

Definition at line 270 of file gnunet-service-namecache.c.

272{
273 return GNUNET_OK;
274}

References GNUNET_OK.

◆ handle_block_cache()

static void handle_block_cache ( void *  cls,
const struct BlockCacheMessage rp_msg 
)
static

Handles a GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE message.

Parameters
clsour struct NamecacheClient
rp_msgmessage to process

Definition at line 284 of file gnunet-service-namecache.c.

286{
287 struct NamecacheClient *nc = cls;
288 struct GNUNET_MQ_Envelope *env;
289 struct BlockCacheResponseMessage *rpr_msg;
290 struct GNUNET_GNSRECORD_Block *block;
291 size_t esize;
292 int res;
293
295 "blocks cached",
296 1,
297 GNUNET_NO);
298 esize = ntohs (rp_msg->gns_header.header.size) - sizeof(struct
300 block = GNUNET_malloc (esize);
301 memcpy (block, &rp_msg[1], esize);
303 "Received NAMECACHE_BLOCK_CACHE message with type %u\n",
304 htonl (block->type));
306 block);
307 GNUNET_free (block);
308 env = GNUNET_MQ_msg (rpr_msg,
310 rpr_msg->gns_header.r_id = rp_msg->gns_header.r_id;
311 rpr_msg->op_result = htonl (res);
312 GNUNET_MQ_send (nc->mq,
313 env);
315}
static char * res
Currently read line or NULL on EOF.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE_RESPONSE
Service to client: result of block cache request.
Cache a record in the namecache.
Definition: namecache.h:95
struct GNUNET_NAMECACHE_Header gns_header
Type will be GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE.
Definition: namecache.h:99
Response to a request to cache a block.
Definition: namecache.h:114
int32_t op_result
GNUNET_OK on success, GNUNET_SYSERR error
Definition: namecache.h:123
struct GNUNET_NAMECACHE_Header gns_header
Type will be GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE_RESPONSE.
Definition: namecache.h:118
uint32_t type
The zone type (GNUNET_GNSRECORD_TYPE_PKEY)
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
struct GNUNET_MessageHeader header
header.type will be GNUNET_MESSAGE_TYPE_NAMECACHE_* header.size will be message size
Definition: namecache.h:46
int(* cache_block)(void *cls, const struct GNUNET_GNSRECORD_Block *block)
Cache a block in the datastore.

References GNUNET_NAMECACHE_PluginFunctions::cache_block, GNUNET_NAMECACHE_PluginFunctions::cls, env, BlockCacheMessage::gns_header, BlockCacheResponseMessage::gns_header, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_malloc, GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE_RESPONSE, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_NO, GNUNET_SERVICE_client_continue(), GNUNET_STATISTICS_update(), GSN_database, GNUNET_NAMECACHE_Header::header, nc, BlockCacheResponseMessage::op_result, GNUNET_NAMECACHE_Header::r_id, res, GNUNET_MessageHeader::size, statistics, and GNUNET_GNSRECORD_Block::type.

Here is the call graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle cfg,
struct GNUNET_SERVICE_Handle service 
)
static

Process namecache requests.

Parameters
clsclosure
cfgconfiguration to use
servicethe initialized service

Definition at line 326 of file gnunet-service-namecache.c.

329{
330 char *database;
331
333 "Starting namecache service\n");
334 GSN_cfg = cfg;
335
336 /* Loading database plugin */
337 if (GNUNET_OK !=
339 "namecache",
340 "database",
341 &database))
343 "No database backend configured\n");
344
346 "libgnunet_plugin_namecache_%s",
347 database);
349 (void *) GSN_cfg);
350 GNUNET_free (database);
351 if (NULL == GSN_database)
352 {
354 "Could not load database backend `%s'\n",
357 NULL);
358 return;
359 }
361 cfg);
362
363 /* Configuring server handles */
365 NULL);
366}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
static void cleanup_task(void *cls)
Task run during shutdown.
static const struct GNUNET_CONFIGURATION_Handle * GSN_cfg
Configuration handle.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
@ GNUNET_ERROR_TYPE_ERROR
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
void * GNUNET_PLUGIN_load(const char *library_name, void *arg)
Setup plugin (runs the "init" callback and returns whatever "init" returned).
Definition: plugin.c:198
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1340
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1305
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.

References cfg, cleanup_task(), db_lib_name, GNUNET_asprintf(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_PLUGIN_load(), GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_add_shutdown(), GNUNET_STATISTICS_create(), GSN_cfg, GSN_database, and statistics.

Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

GNUNET_SERVICE_MAIN ( "namecache"  ,
GNUNET_SERVICE_OPTION_NONE  ,
run,
client_connect_cb,
client_disconnect_cb,
NULL  ,
GNUNET_MQ_hd_fixed_size(lookup_block, GNUNET_MESSAGE_TYPE_NAMECACHE_LOOKUP_BLOCK, struct LookupBlockMessage, NULL)  ,
GNUNET_MQ_hd_var_size(block_cache, GNUNET_MESSAGE_TYPE_NAMECACHE_BLOCK_CACHE, struct BlockCacheMessage, NULL)  ,
GNUNET_MQ_handler_end()   
)

Define "main" method using service macro.

Variable Documentation

◆ GSN_cfg

const struct GNUNET_CONFIGURATION_Handle* GSN_cfg
static

Configuration handle.

Definition at line 61 of file gnunet-service-namecache.c.

Referenced by run().

◆ statistics

struct GNUNET_STATISTICS_Handle* statistics
static

Handle to the statistics service.

Definition at line 66 of file gnunet-service-namecache.c.

Referenced by cleanup_task(), handle_block_cache(), handle_lookup_block(), handle_lookup_block_it(), and run().

◆ GSN_database

struct GNUNET_NAMECACHE_PluginFunctions* GSN_database
static

Database handle.

Definition at line 71 of file gnunet-service-namecache.c.

Referenced by cleanup_task(), handle_block_cache(), handle_lookup_block(), and run().

◆ db_lib_name

char* db_lib_name
static

Name of the database plugin.

Definition at line 76 of file gnunet-service-namecache.c.

Referenced by cleanup_task(), and run().