GNUnet  0.11.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 
38 {
43 
48 
52  void *iterator_cls;
53 
58 
62  void *cont_cls;
63 };
64 
65 
73 static void
75  const struct GNUNET_MessageHeader *msg)
76 {
77  struct GNUNET_FS_GetIndexedContext *gic = cls;
78 
79  (void) gic->iterator (gic->iterator_cls,
80  NULL,
81  NULL);
83 }
84 
85 
93 static int
94 check_index_info (void *cls,
95  const struct IndexInfoMessage *iim)
96 {
97  uint16_t msize = ntohs (iim->header.size) - sizeof(*iim);
98  const char *filename;
99 
100  filename = (const char *) &iim[1];
101  if (filename[msize - 1] != '\0')
102  {
103  GNUNET_break (0);
104  return GNUNET_SYSERR;
105  }
106  return GNUNET_OK;
107 }
108 
109 
117 static void
118 handle_index_info (void *cls,
119  const struct IndexInfoMessage *iim)
120 {
121  struct GNUNET_FS_GetIndexedContext *gic = cls;
122  const char *filename;
123 
124  filename = (const char *) &iim[1];
125  if (GNUNET_OK !=
126  gic->iterator (gic->iterator_cls,
127  filename,
128  &iim->file_id))
129  {
131  return;
132  }
133 }
134 
135 
144 static void
145 mq_error_handler (void *cls,
146  enum GNUNET_MQ_Error error)
147 {
148  struct GNUNET_FS_GetIndexedContext *gic = cls;
149 
151  _ ("Failed to receive response from `%s' service.\n"),
152  "fs");
153  (void) gic->iterator (gic->iterator_cls, NULL, NULL);
155 }
156 
157 
169  void *iterator_cls)
170 {
171  struct GNUNET_FS_GetIndexedContext *gic
173  struct GNUNET_MQ_MessageHandler handlers[] = {
174  GNUNET_MQ_hd_fixed_size (index_info_end,
176  struct GNUNET_MessageHeader,
177  gic),
178  GNUNET_MQ_hd_var_size (index_info,
180  struct IndexInfoMessage,
181  gic),
183  };
184  struct GNUNET_MQ_Envelope *env;
185  struct GNUNET_MessageHeader *msg;
186 
187  gic->mq = GNUNET_CLIENT_connect (h->cfg,
188  "fs",
189  handlers,
191  h);
192  if (NULL == gic->mq)
193  {
195  _ ("Failed to not connect to `%s' service.\n"),
196  "fs");
197  GNUNET_free (gic);
198  return NULL;
199  }
200  gic->iterator = iterator;
201  gic->iterator_cls = iterator_cls;
202  env = GNUNET_MQ_msg (msg,
204  GNUNET_MQ_send (gic->mq,
205  env);
206  return gic;
207 }
208 
209 
215 void
217 {
218  GNUNET_MQ_destroy (gic->mq);
219  GNUNET_free (gic);
220 }
221 
222 
223 /* 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:1057
GNUNET_MQ_Error
Error codes for the queue.
Master context for most FS operations.
Definition: fs_api.h:1068
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:195
#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:211
#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:99
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:201
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:85
#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:824
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:353
#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:1073