GNUnet  0.10.x
fs_list_indexed.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2003, 2004, 2006, 2009 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
27 #include "platform.h"
28 #include "gnunet_constants.h"
29 #include "gnunet_fs_service.h"
30 #include "gnunet_protocols.h"
31 #include "fs_api.h"
32 
33 
42 
47 
51  void *iterator_cls;
52 
57 
61  void *cont_cls;
62 };
63 
64 
72 static void
74  const struct GNUNET_MessageHeader *msg)
75 {
76  struct GNUNET_FS_GetIndexedContext *gic = cls;
77 
78  (void)gic->iterator(gic->iterator_cls,
79  NULL,
80  NULL);
82 }
83 
84 
92 static int
93 check_index_info(void *cls,
94  const struct IndexInfoMessage *iim)
95 {
96  uint16_t msize = ntohs(iim->header.size) - sizeof(*iim);
97  const char *filename;
98 
99  filename = (const char *)&iim[1];
100  if (filename[msize - 1] != '\0')
101  {
102  GNUNET_break(0);
103  return GNUNET_SYSERR;
104  }
105  return GNUNET_OK;
106 }
107 
108 
116 static void
118  const struct IndexInfoMessage *iim)
119 {
120  struct GNUNET_FS_GetIndexedContext *gic = cls;
121  const char *filename;
122 
123  filename = (const char *)&iim[1];
124  if (GNUNET_OK !=
125  gic->iterator(gic->iterator_cls,
126  filename,
127  &iim->file_id))
128  {
130  return;
131  }
132 }
133 
134 
143 static void
145  enum GNUNET_MQ_Error error)
146 {
147  struct GNUNET_FS_GetIndexedContext *gic = cls;
148 
150  _("Failed to receive response from `%s' service.\n"),
151  "fs");
152  (void)gic->iterator(gic->iterator_cls, NULL, NULL);
154 }
155 
156 
168  void *iterator_cls)
169 {
170  struct GNUNET_FS_GetIndexedContext *gic
172  struct GNUNET_MQ_MessageHandler handlers[] = {
173  GNUNET_MQ_hd_fixed_size(index_info_end,
175  struct GNUNET_MessageHeader,
176  gic),
177  GNUNET_MQ_hd_var_size(index_info,
179  struct IndexInfoMessage,
180  gic),
182  };
183  struct GNUNET_MQ_Envelope *env;
184  struct GNUNET_MessageHeader *msg;
185 
186  gic->mq = GNUNET_CLIENT_connect(h->cfg,
187  "fs",
188  handlers,
190  h);
191  if (NULL == gic->mq)
192  {
194  _("Failed to not connect to `%s' service.\n"),
195  "fs");
196  GNUNET_free(gic);
197  return NULL;
198  }
199  gic->iterator = iterator;
200  gic->iterator_cls = iterator_cls;
201  env = GNUNET_MQ_msg(msg,
203  GNUNET_MQ_send(gic->mq,
204  env);
205  return gic;
206 }
207 
208 
214 void
216 {
217  GNUNET_MQ_destroy(gic->mq);
218  GNUNET_free(gic);
219 }
220 
221 
222 /* end of fs_list_indexed.c */
GNUNET_SCHEDULER_TaskCallback cont
Continuation to trigger at the end.
void * cont_cls
Closure for cont.
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
void * iterator_cls
Closure for iterator.
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:900
GNUNET_MQ_Error
Error codes for the queue.
Master context for most FS operations.
Definition: fs_api.h:1056
void GNUNET_FS_get_indexed_files_cancel(struct GNUNET_FS_GetIndexedContext *gic)
Cancel iteration over all indexed files.
#define GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_GET
Request from client for list of indexed files.
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Message send by FS service in response to a request asking for a list of all indexed files...
Definition: fs.h:191
#define GNUNET_new(type)
Allocate a struct or union of the given type.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
struct GNUNET_HashCode file_id
Hash of the indexed file.
Definition: fs.h:206
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
void(* GNUNET_SCHEDULER_TaskCallback)(void *cls)
Signature of the main function of a task.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
#define GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_ENTRY
Reply to client with an indexed file name.
int(* GNUNET_FS_IndexedFileProcessor)(void *cls, const char *filename, const struct GNUNET_HashCode *file_id)
Type of a function called by GNUNET_FS_get_indexed_files.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
struct GNUNET_FS_GetIndexedContext * GNUNET_FS_get_indexed_files(struct GNUNET_FS_Handle *h, GNUNET_FS_IndexedFileProcessor iterator, void *iterator_cls)
Iterate over all indexed files.
static char * filename
Message handler for a specific message type.
struct GNUNET_MQ_Handle * mq
Connection to the FS service.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static void handle_index_info_end(void *cls, const struct GNUNET_MessageHeader *msg)
Function called on each response from the FS service with information about indexed files...
struct GNUNET_MessageHeader header
Message type will be GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_ENTRY.
Definition: fs.h:196
static int check_index_info(void *cls, const struct IndexInfoMessage *iim)
Check validity of response from the FS service with information about indexed files.
Handle to a message queue.
Definition: mq.c:84
#define GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_END
Reply to client indicating end of list.
shared definitions for the FS library
static void handle_index_info(void *cls, const struct IndexInfoMessage *iim)
Function called on each response from the FS service with information about indexed files...
#define GNUNET_log(kind,...)
Context for GNUNET_FS_get_indexed_files().
Header for all communications.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:821
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:351
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
GNUNET_FS_IndexedFileProcessor iterator
Function to call for each indexed file.
#define GNUNET_free(ptr)
Wrapper around free.
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Definition: fs_api.h:1060