aboutsummaryrefslogtreecommitdiff
path: root/src/fs/gnunet-search.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/gnunet-search.c')
-rw-r--r--src/fs/gnunet-search.c173
1 files changed, 94 insertions, 79 deletions
diff --git a/src/fs/gnunet-search.c b/src/fs/gnunet-search.c
index 3995b1b5b..7d6ff4c6b 100644
--- a/src/fs/gnunet-search.c
+++ b/src/fs/gnunet-search.c
@@ -92,11 +92,10 @@ item_printer (void *cls,
92#if HAVE_LIBEXTRACTOR 92#if HAVE_LIBEXTRACTOR
93 printf ("\t%20s: %s\n", 93 printf ("\t%20s: %s\n",
94 dgettext (LIBEXTRACTOR_GETTEXT_DOMAIN, 94 dgettext (LIBEXTRACTOR_GETTEXT_DOMAIN,
95 EXTRACTOR_metatype_to_string (type)), data); 95 EXTRACTOR_metatype_to_string (type)),
96#else
97 printf ("\t%20d: %s\n",
98 type,
99 data); 96 data);
97#else
98 printf ("\t%20d: %s\n", type, data);
100#endif 99#endif
101 return 0; 100 return 0;
102} 101}
@@ -118,13 +117,14 @@ clean_task (void *cls)
118 GNUNET_free (output_filename); 117 GNUNET_free (output_filename);
119 return; 118 return;
120 } 119 }
121 if (dsize != 120 if (dsize != GNUNET_DISK_fn_write (output_filename,
122 GNUNET_DISK_fn_write (output_filename, ddata, dsize, 121 ddata,
123 GNUNET_DISK_PERM_USER_READ | 122 dsize,
124 GNUNET_DISK_PERM_USER_WRITE)) 123 GNUNET_DISK_PERM_USER_READ |
124 GNUNET_DISK_PERM_USER_WRITE))
125 { 125 {
126 FPRINTF (stderr, 126 fprintf (stderr,
127 _("Failed to write directory with search results to `%s'\n"), 127 _ ("Failed to write directory with search results to `%s'\n"),
128 output_filename); 128 output_filename);
129 } 129 }
130 GNUNET_free_non_null (ddata); 130 GNUNET_free_non_null (ddata);
@@ -165,31 +165,35 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *info)
165 NULL); 165 NULL);
166 uri = GNUNET_FS_uri_to_string (info->value.search.specifics.result.uri); 166 uri = GNUNET_FS_uri_to_string (info->value.search.specifics.result.uri);
167 printf ("#%u:\n", ++cnt); 167 printf ("#%u:\n", ++cnt);
168 filename = 168 filename = GNUNET_CONTAINER_meta_data_get_by_type (
169 GNUNET_CONTAINER_meta_data_get_by_type (info->value.search. 169 info->value.search.specifics.result.meta,
170 specifics.result.meta, 170 EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME);
171 EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME); 171 is_directory = GNUNET_FS_meta_data_test_for_directory (
172 is_directory = 172 info->value.search.specifics.result.meta);
173 GNUNET_FS_meta_data_test_for_directory (info->value.search.
174 specifics.result.meta);
175 if (NULL != filename) 173 if (NULL != filename)
176 { 174 {
177 while ( (filename[0] != '\0') && 175 while ((filename[0] != '\0') && ('/' == filename[strlen (filename) - 1]))
178 ('/' == filename[strlen(filename)-1]) ) 176 filename[strlen (filename) - 1] = '\0';
179 filename[strlen(filename)-1] = '\0';
180 GNUNET_DISK_filename_canonicalize (filename); 177 GNUNET_DISK_filename_canonicalize (filename);
181 if (GNUNET_YES == is_directory) 178 if (GNUNET_YES == is_directory)
182 printf ("gnunet-download -o \"%s%s\" -R %s\n", filename, GNUNET_FS_DIRECTORY_EXT, uri); 179 printf ("gnunet-download -o \"%s%s\" -R %s\n",
180 filename,
181 GNUNET_FS_DIRECTORY_EXT,
182 uri);
183 else 183 else
184 printf ("gnunet-download -o \"%s\" %s\n", filename, uri); 184 printf ("gnunet-download -o \"%s\" %s\n", filename, uri);
185 } 185 }
186 else if (GNUNET_YES == is_directory) 186 else if (GNUNET_YES == is_directory)
187 printf ("gnunet-download -o \"collection%s\" -R %s\n", GNUNET_FS_DIRECTORY_EXT, uri); 187 printf ("gnunet-download -o \"collection%s\" -R %s\n",
188 GNUNET_FS_DIRECTORY_EXT,
189 uri);
188 else 190 else
189 printf ("gnunet-download %s\n", uri); 191 printf ("gnunet-download %s\n", uri);
190 if (verbose) 192 if (verbose)
191 GNUNET_CONTAINER_meta_data_iterate (info->value.search.specifics. 193 GNUNET_CONTAINER_meta_data_iterate (info->value.search.specifics.result
192 result.meta, &item_printer, NULL); 194 .meta,
195 &item_printer,
196 NULL);
193 printf ("\n"); 197 printf ("\n");
194 fflush (stdout); 198 fflush (stdout);
195 GNUNET_free_non_null (filename); 199 GNUNET_free_non_null (filename);
@@ -204,7 +208,8 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *info)
204 /* ignore */ 208 /* ignore */
205 break; 209 break;
206 case GNUNET_FS_STATUS_SEARCH_ERROR: 210 case GNUNET_FS_STATUS_SEARCH_ERROR:
207 FPRINTF (stderr, _("Error searching: %s.\n"), 211 fprintf (stderr,
212 _ ("Error searching: %s.\n"),
208 info->value.search.specifics.error.message); 213 info->value.search.specifics.error.message);
209 GNUNET_SCHEDULER_shutdown (); 214 GNUNET_SCHEDULER_shutdown ();
210 break; 215 break;
@@ -212,7 +217,7 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *info)
212 GNUNET_SCHEDULER_add_now (&clean_task, NULL); 217 GNUNET_SCHEDULER_add_now (&clean_task, NULL);
213 break; 218 break;
214 default: 219 default:
215 FPRINTF (stderr, _("Unexpected status: %d\n"), info->status); 220 fprintf (stderr, _ ("Unexpected status: %d\n"), info->status);
216 break; 221 break;
217 } 222 }
218 return NULL; 223 return NULL;
@@ -247,7 +252,9 @@ timeout_task (void *cls)
247 * @param c configuration 252 * @param c configuration
248 */ 253 */
249static void 254static void
250run (void *cls, char *const *args, const char *cfgfile, 255run (void *cls,
256 char *const *args,
257 const char *cfgfile,
251 const struct GNUNET_CONFIGURATION_Handle *c) 258 const struct GNUNET_CONFIGURATION_Handle *c)
252{ 259{
253 struct GNUNET_FS_Uri *uri; 260 struct GNUNET_FS_Uri *uri;
@@ -260,17 +267,22 @@ run (void *cls, char *const *args, const char *cfgfile,
260 uri = GNUNET_FS_uri_ksk_create_from_args (argc, (const char **) args); 267 uri = GNUNET_FS_uri_ksk_create_from_args (argc, (const char **) args);
261 if (NULL == uri) 268 if (NULL == uri)
262 { 269 {
263 FPRINTF (stderr, "%s", _("Could not create keyword URI from arguments.\n")); 270 fprintf (stderr,
271 "%s",
272 _ ("Could not create keyword URI from arguments.\n"));
264 ret = 1; 273 ret = 1;
265 return; 274 return;
266 } 275 }
267 cfg = c; 276 cfg = c;
268 ctx = 277 ctx = GNUNET_FS_start (cfg,
269 GNUNET_FS_start (cfg, "gnunet-search", &progress_cb, NULL, 278 "gnunet-search",
270 GNUNET_FS_FLAGS_NONE, GNUNET_FS_OPTIONS_END); 279 &progress_cb,
280 NULL,
281 GNUNET_FS_FLAGS_NONE,
282 GNUNET_FS_OPTIONS_END);
271 if (NULL == ctx) 283 if (NULL == ctx)
272 { 284 {
273 FPRINTF (stderr, _("Could not initialize `%s' subsystem.\n"), "FS"); 285 fprintf (stderr, _ ("Could not initialize `%s' subsystem.\n"), "FS");
274 GNUNET_FS_uri_destroy (uri); 286 GNUNET_FS_uri_destroy (uri);
275 ret = 1; 287 ret = 1;
276 return; 288 return;
@@ -284,17 +296,14 @@ run (void *cls, char *const *args, const char *cfgfile,
284 GNUNET_FS_uri_destroy (uri); 296 GNUNET_FS_uri_destroy (uri);
285 if (NULL == sc) 297 if (NULL == sc)
286 { 298 {
287 FPRINTF (stderr, "%s", _("Could not start searching.\n")); 299 fprintf (stderr, "%s", _ ("Could not start searching.\n"));
288 GNUNET_FS_stop (ctx); 300 GNUNET_FS_stop (ctx);
289 ret = 1; 301 ret = 1;
290 return; 302 return;
291 } 303 }
292 if (0 != timeout.rel_value_us) 304 if (0 != timeout.rel_value_us)
293 tt = GNUNET_SCHEDULER_add_delayed (timeout, 305 tt = GNUNET_SCHEDULER_add_delayed (timeout, &timeout_task, NULL);
294 &timeout_task, 306 GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
295 NULL);
296 GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
297 NULL);
298} 307}
299 308
300 309
@@ -308,49 +317,55 @@ run (void *cls, char *const *args, const char *cfgfile,
308int 317int
309main (int argc, char *const *argv) 318main (int argc, char *const *argv)
310{ 319{
311 struct GNUNET_GETOPT_CommandLineOption options[] = { 320 struct GNUNET_GETOPT_CommandLineOption options[] =
312 GNUNET_GETOPT_option_uint ('a', 321 {GNUNET_GETOPT_option_uint ('a',
313 "anonymity", 322 "anonymity",
314 "LEVEL", 323 "LEVEL",
315 gettext_noop ("set the desired LEVEL of receiver-anonymity"), 324 gettext_noop (
316 &anonymity), 325 "set the desired LEVEL of receiver-anonymity"),
317 GNUNET_GETOPT_option_flag ('n', 326 &anonymity),
318 "no-network", 327 GNUNET_GETOPT_option_flag (
319 gettext_noop ("only search the local peer (no P2P network search)"), 328 'n',
320 &local_only), 329 "no-network",
321 GNUNET_GETOPT_option_string ('o', 330 gettext_noop ("only search the local peer (no P2P network search)"),
322 "output", 331 &local_only),
323 "PREFIX", 332 GNUNET_GETOPT_option_string (
324 gettext_noop ("write search results to file starting with PREFIX"), 333 'o',
325 &output_filename), 334 "output",
326 GNUNET_GETOPT_option_relative_time ('t', 335 "PREFIX",
327 "timeout", 336 gettext_noop ("write search results to file starting with PREFIX"),
328 "DELAY", 337 &output_filename),
329 gettext_noop ("automatically terminate search after DELAY"), 338 GNUNET_GETOPT_option_relative_time (
330 &timeout), 339 't',
331 GNUNET_GETOPT_option_verbose (&verbose), 340 "timeout",
332 GNUNET_GETOPT_option_uint ('N', 341 "DELAY",
333 "results", 342 gettext_noop ("automatically terminate search after DELAY"),
334 "VALUE", 343 &timeout),
335 gettext_noop ("automatically terminate search " 344 GNUNET_GETOPT_option_verbose (&verbose),
336 "after VALUE results are found"), 345 GNUNET_GETOPT_option_uint ('N',
337 &results_limit), 346 "results",
338 GNUNET_GETOPT_OPTION_END 347 "VALUE",
339 }; 348 gettext_noop ("automatically terminate search "
340 349 "after VALUE results are found"),
341 if (GNUNET_OK != 350 &results_limit),
342 GNUNET_STRINGS_get_utf8_args (argc, argv, 351 GNUNET_GETOPT_OPTION_END};
343 &argc, &argv)) 352
353 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
344 return 2; 354 return 2;
345 355
346 ret = (GNUNET_OK == 356 ret =
347 GNUNET_PROGRAM_run (argc, 357 (GNUNET_OK ==
348 argv, 358 GNUNET_PROGRAM_run (argc,
349 "gnunet-search [OPTIONS] KEYWORD", 359 argv,
350 gettext_noop 360 "gnunet-search [OPTIONS] KEYWORD",
351 ("Search GNUnet for files that were published on GNUnet"), 361 gettext_noop (
352 options, &run, NULL)) ? ret : 1; 362 "Search GNUnet for files that were published on GNUnet"),
353 GNUNET_free ((void*) argv); 363 options,
364 &run,
365 NULL))
366 ? ret
367 : 1;
368 GNUNET_free ((void *) argv);
354 return ret; 369 return ret;
355} 370}
356 371