2 This file is part of GNUnet.
3 (C) 2009 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 2, or (at your
8 option) any later version.
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 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @file fs/gnunet-service-fs.c
23 * @brief program that provides the file-sharing service
24 * @author Christian Grothoff
27 #include "gnunet_protocols.h"
28 #include "gnunet_core_service.h"
29 #include "gnunet_datastore_service.h"
30 #include "gnunet_util_lib.h"
33 static struct GNUNET_DATASTORE_Handle *dsh;
36 * Handle INDEX_START-message.
39 * @param client identification of the client
40 * @param message the actual message
43 handle_index_start (void *cls,
44 struct GNUNET_SERVER_Client *client,
45 const struct GNUNET_MessageHeader *message)
47 const struct IndexStartMessage *ism;
51 msize = ntohs(message->size);
52 if ( (msize <= sizeof (struct IndexStartMessage)) ||
53 ( ((const char *)message)[msize-1] != '\0') )
56 GNUNET_SERVER_receive_done (client,
60 ism = (const struct IndexStartMessage*) message;
61 fn = (const char*) &ism[1];
62 // FIXME: store fn, hash, check, respond to client, etc.
67 * Handle INDEX_LIST_GET-message.
70 * @param client identification of the client
71 * @param message the actual message
74 handle_index_list_get (void *cls,
75 struct GNUNET_SERVER_Client *client,
76 const struct GNUNET_MessageHeader *message)
78 struct GNUNET_SERVER_TransmitContext *tc;
79 struct IndexInfoMessage *iim;
80 char buf[GNUNET_SERVER_MAX_MESSAGE_SIZE];
83 struct GNUNET_MessageHeader *msg;
85 tc = GNUNET_SERVER_transmit_context_create (client);
86 iim = (struct IndexInfoMessage*) buf;
91 // FIXME: read actual list of indexed files...
94 slen = strlen (fn) + 1;
95 if (slen + sizeof (struct IndexInfoMessage) >
96 GNUNET_SERVER_MAX_MESSAGE_SIZE)
101 memcpy (&iim[1], fn, slen);
102 GNUNET_SERVER_transmit_context_append
105 sizeof (struct IndexInfoMessage)
106 - sizeof (struct GNUNET_MessageHeader) + slen,
107 GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_ENTRY);
109 GNUNET_SERVER_transmit_context_append (tc,
111 GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_END);
112 GNUNET_SERVER_transmit_context_run (tc,
113 GNUNET_TIME_UNIT_MINUTES);
118 * Handle UNINDEX-message.
121 * @param client identification of the client
122 * @param message the actual message
125 handle_unindex (void *cls,
126 struct GNUNET_SERVER_Client *client,
127 const struct GNUNET_MessageHeader *message)
129 const struct UnindexMessage *um;
130 struct GNUNET_SERVER_TransmitContext *tc;
132 um = (const struct UnindexMessage*) message;
134 tc = GNUNET_SERVER_transmit_context_create (client);
135 GNUNET_SERVER_transmit_context_append (tc,
137 GNUNET_MESSAGE_TYPE_FS_UNINDEX_OK);
138 GNUNET_SERVER_transmit_context_run (tc,
139 GNUNET_TIME_UNIT_MINUTES);
147 * @param ok GNUNET_OK if DS is ready, GNUNET_SYSERR on timeout
149 typedef void (*RequestFunction)(void *cls,
154 * Run the next DS request in our
155 * queue, we're done with the current one.
167 queue_ds_request (struct GNUNET_TIME_Relative deadline,
176 * Closure for processing START_SEARCH
177 * messages from a client.
179 struct LocalGetContext
182 * Client that initiated the search.
184 struct GNUNET_SERVER_Client *client;
192 transmit_local_get (void *cls,
195 struct LocalGetContext *lgc = cls;
196 // FIXME: search locally
198 GNUNET_assert (GNUNET_OK == ok);
199 GNUNET_SERVER_receive_done (lgc->client,
202 // once we're done processing the DS reply, do:
204 // FIXME: if not found, initiate P2P search
206 // FIXME: once done with "client" handle:
207 GNUNET_SERVER_client_drop (lgc->client);
212 * Handle START_SEARCH-message.
215 * @param client identification of the client
216 * @param message the actual message
219 handle_start_search (void *cls,
220 struct GNUNET_SERVER_Client *client,
221 const struct GNUNET_MessageHeader *message)
223 const struct SearchMessage *sm;
224 struct LocalGetContext *lgc;
226 sm = (const struct SearchMessage*) message;
227 GNUNET_SERVER_client_keep (client);
228 lgc = GNUNET_malloc (sizeof (struct LocalGetContext));
229 lgc->client = client;
231 queue_ds_request (GNUNET_TIME_UNIT_FOREVER_REL,
238 * List of handlers for the messages understood by this
241 static struct GNUNET_SERVER_MessageHandler handlers[] = {
242 {&handle_index_start, NULL,
243 GNUNET_MESSAGE_TYPE_FS_INDEX_START, 0},
244 {&handle_index_list_get, NULL,
245 GNUNET_MESSAGE_TYPE_FS_INDEX_LIST_GET, sizeof(struct GNUNET_MessageHeader) },
246 {&handle_unindex, NULL, GNUNET_MESSAGE_TYPE_FS_UNINDEX,
247 sizeof (struct UnindexMessage) },
248 {&handle_start_search, NULL, GNUNET_MESSAGE_TYPE_FS_START_SEARCH,
249 sizeof (struct SearchMessage) },
255 * Task run during shutdown.
261 shutdown_task (void *cls,
262 const struct GNUNET_SCHEDULER_TaskContext *tc)
264 GNUNET_DATASTORE_disconnect (dsh,
271 * Process fs requests.
274 * @param sched scheduler to use
275 * @param server the initialized server
276 * @param cfg configuration to use
280 struct GNUNET_SCHEDULER_Handle *sched,
281 struct GNUNET_SERVER_Handle *server,
282 const struct GNUNET_CONFIGURATION_Handle *cfg)
284 dsh = GNUNET_DATASTORE_connect (cfg,
288 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
289 _("Failed to connect to datastore service.\n"));
292 GNUNET_SERVER_add_handlers (server, handlers);
293 // FIXME: also handle P2P messages!
295 GNUNET_SCHEDULER_add_delayed (sched,
297 GNUNET_SCHEDULER_PRIORITY_IDLE,
298 GNUNET_SCHEDULER_NO_TASK,
299 GNUNET_TIME_UNIT_FOREVER_REL,
306 * The main function for the fs service.
308 * @param argc number of arguments from the command line
309 * @param argv command line arguments
310 * @return 0 ok, 1 on error
313 main (int argc, char *const *argv)
316 GNUNET_SERVICE_run (argc,
318 "fs", &run, NULL, NULL, NULL)) ? 0 : 1;
321 /* end of gnunet-service-fs.c */