GNUnet 0.21.0
gnunet-search.c File Reference

searching for files on GNUnet More...

#include "platform.h"
#include <ctype.h>
#include <inttypes.h>
#include <limits.h>
#include "gnunet_fs_service.h"
Include dependency graph for gnunet-search.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_SEARCH_MetadataPrinterInfo
 

Macros

#define GNUNET_SEARCH_log(kind, ...)    GNUNET_log_from (kind, "gnunet-search", __VA_ARGS__)
 
#define DEFAULT_DIR_FORMAT   "#%n:\ngnunet-download -o \"%f\" -R %u\n\n"
 
#define HELP_DEFAULT_DIR_FORMAT   "#%n:\\ngnunet-download -o \"%f\" -R %u\\n\\n"
 
#define DEFAULT_FILE_FORMAT   "#%n:\ngnunet-download -o \"%f\" %u\n\n"
 
#define HELP_DEFAULT_FILE_FORMAT   "#%n:\\ngnunet-download -o \"%f\" %u\\n\\n"
 
#define VERB_DEFAULT_DIR_FORMAT   DEFAULT_DIR_FORMAT "%a\n"
 
#define VERB_DEFAULT_FILE_FORMAT   DEFAULT_FILE_FORMAT "%a\n"
 
#define DEFAULT_META_FORMAT   " MetaType #%i: %p\n"
 
#define HELP_DEFAULT_META_FORMAT   " MetaType #%i: %p\\n"
 
#define HELP_EXTRACTOR_TEXTADD   ""
 
#define GENERIC_DIRECTORY_NAME   "collection"
 
#define GENERIC_FILE_NAME   "no-name"
 
#define GENERIC_FILE_MIMETYPE   "application/octet-stream"
 
#define info   ((struct GNUNET_SEARCH_MetadataPrinterInfo *) cls)
 

Enumerations

enum  GNUNET_SEARCH_MetadataPrinterFlags { METADATA_PRINTER_FLAG_NONE = 0 , METADATA_PRINTER_FLAG_ONE_RUN = 1 , METADATA_PRINTER_FLAG_HAVE_TYPE = 2 }
 

Functions

static const char * print_escape_sequence (const char *const esc)
 Print the escape sequence at the beginning of a string. More...
 
static int item_printer (void *const cls, const char *const plugin_name, const enum EXTRACTOR_MetaType type, const enum EXTRACTOR_MetaFormat format, const char *const data_mime_type, const char *const data, const size_t data_size)
 Type of a function that libextractor calls for each meta data item found. More...
 
static void print_search_result (const char *const filename, const struct GNUNET_FS_Uri *const uri, const struct GNUNET_FS_MetaData *const metadata, const unsigned int resultnum, const int is_directory)
 Print a search result according to the current formats. More...
 
static void clean_task (void *const cls)
 
static void * progress_cb (void *const cls, const struct GNUNET_FS_ProgressInfo *const info)
 Called by FS client to give information about the progress of an operation. More...
 
static void shutdown_task (void *const cls)
 
static void timeout_task (void *const cls)
 
static void run (void *const cls, char *const *const args, const char *const cfgfile, const struct GNUNET_CONFIGURATION_Handle *const cfgarg)
 Main function that will be run by the scheduler. More...
 
int main (int argc, char *const *argv)
 The main function to search GNUnet. More...
 

Variables

static int ret
 
static const struct GNUNET_CONFIGURATION_Handlecfg
 
static struct GNUNET_FS_Handlectx
 
static struct GNUNET_FS_SearchContextsc
 
static char * output_filename
 
static char * format_string
 
static char * dir_format_string
 
static char * meta_format_string
 
static struct GNUNET_FS_DirectoryBuilderdb
 
static unsigned int anonymity = 1
 
static struct GNUNET_TIME_Relative timeout
 Timeout for the search, 0 means to wait for CTRL-C. More...
 
static unsigned int results_limit
 
static unsigned int results
 
static unsigned int verbose
 
static int bookmark_only
 
static int local_only
 
static int silent_mode
 
static struct GNUNET_SCHEDULER_Tasktt
 
static int stop_searching
 

Detailed Description

searching for files on GNUnet

Author
Christian Grothoff
Krista Bennett
James Blackwell
Igor Wronsky
madmurphy

Definition in file gnunet-search.c.

Macro Definition Documentation

◆ GNUNET_SEARCH_log

#define GNUNET_SEARCH_log (   kind,
  ... 
)     GNUNET_log_from (kind, "gnunet-search", __VA_ARGS__)

Definition at line 37 of file gnunet-search.c.

◆ DEFAULT_DIR_FORMAT

#define DEFAULT_DIR_FORMAT   "#%n:\ngnunet-download -o \"%f\" -R %u\n\n"

Definition at line 43 of file gnunet-search.c.

◆ HELP_DEFAULT_DIR_FORMAT

#define HELP_DEFAULT_DIR_FORMAT   "#%n:\\ngnunet-download -o \"%f\" -R %u\\n\\n"

Definition at line 44 of file gnunet-search.c.

◆ DEFAULT_FILE_FORMAT

#define DEFAULT_FILE_FORMAT   "#%n:\ngnunet-download -o \"%f\" %u\n\n"

Definition at line 45 of file gnunet-search.c.

◆ HELP_DEFAULT_FILE_FORMAT

#define HELP_DEFAULT_FILE_FORMAT   "#%n:\\ngnunet-download -o \"%f\" %u\\n\\n"

Definition at line 46 of file gnunet-search.c.

◆ VERB_DEFAULT_DIR_FORMAT

#define VERB_DEFAULT_DIR_FORMAT   DEFAULT_DIR_FORMAT "%a\n"

Definition at line 47 of file gnunet-search.c.

◆ VERB_DEFAULT_FILE_FORMAT

#define VERB_DEFAULT_FILE_FORMAT   DEFAULT_FILE_FORMAT "%a\n"

Definition at line 48 of file gnunet-search.c.

◆ DEFAULT_META_FORMAT

#define DEFAULT_META_FORMAT   " MetaType #%i: %p\n"

Definition at line 55 of file gnunet-search.c.

◆ HELP_DEFAULT_META_FORMAT

#define HELP_DEFAULT_META_FORMAT   " MetaType #%i: %p\\n"

Definition at line 56 of file gnunet-search.c.

◆ HELP_EXTRACTOR_TEXTADD

#define HELP_EXTRACTOR_TEXTADD   ""

Definition at line 57 of file gnunet-search.c.

◆ GENERIC_DIRECTORY_NAME

#define GENERIC_DIRECTORY_NAME   "collection"

Definition at line 60 of file gnunet-search.c.

◆ GENERIC_FILE_NAME

#define GENERIC_FILE_NAME   "no-name"

Definition at line 61 of file gnunet-search.c.

◆ GENERIC_FILE_MIMETYPE

#define GENERIC_FILE_MIMETYPE   "application/octet-stream"

Definition at line 62 of file gnunet-search.c.

◆ info

#define info   ((struct GNUNET_SEARCH_MetadataPrinterInfo *) cls)

Enumeration Type Documentation

◆ GNUNET_SEARCH_MetadataPrinterFlags

Enumerator
METADATA_PRINTER_FLAG_NONE 
METADATA_PRINTER_FLAG_ONE_RUN 
METADATA_PRINTER_FLAG_HAVE_TYPE 

Definition at line 65 of file gnunet-search.c.

66{
70};
@ METADATA_PRINTER_FLAG_HAVE_TYPE
Definition: gnunet-search.c:69
@ METADATA_PRINTER_FLAG_NONE
Definition: gnunet-search.c:67
@ METADATA_PRINTER_FLAG_ONE_RUN
Definition: gnunet-search.c:68

Function Documentation

◆ print_escape_sequence()

static const char * print_escape_sequence ( const char *const  esc)
static

Print the escape sequence at the beginning of a string.

Parameters
esca string that must begin with a backslash (the function only assumes that it does, but does not check)
Returns
the fragment that follows what has been printed
Author
madmurphy

If "\\nfoo" is passed as argument, this function prints a new line and returns "foo"

Definition at line 135 of file gnunet-search.c.

136{
137 unsigned int probe;
138 const char *cursor = esc + 1;
139 char tmp;
140 switch (*cursor)
141 {
142 /* Trivia */
143 case '\\': putchar ('\\'); return cursor + 1;
144 case 'a': putchar ('\a'); return cursor + 1;
145 case 'b': putchar ('\b'); return cursor + 1;
146 case 'e': putchar ('\x1B'); return cursor + 1;
147 case 'f': putchar ('\f'); return cursor + 1;
148 case 'n': putchar ('\n'); return cursor + 1;
149 case 'r': putchar ('\r'); return cursor + 1;
150 case 't': putchar ('\t'); return cursor + 1;
151 case 'v': putchar ('\v'); return cursor + 1;
152
153 /* Possibly hexadecimal code point */
154 case 'x':
155 probe = 0;
156 while (probe < 256 && isxdigit ((tmp = *++cursor)))
157 probe = (probe << 4) + tmp - (tmp > 96 ? 87 : tmp > 64 ? 55 : 48);
158 goto maybe_codepoint;
159
160 /* Possibly octal code point */
161 case '0': case '1': case '2': case '3':
162 case '4': case '5': case '6': case '7':
163 probe = *cursor++ - 48;
164 do probe = (probe << 3) + *cursor++ - 48;
165 while (probe < 256 && cursor < esc + 4 && *cursor > 47 && *cursor < 56);
166 goto maybe_codepoint;
167
168 /* Boredom */
169 case '\0': putchar ('\\'); return cursor;
170 default: printf ("\\%c", *cursor); return cursor + 1;
171 }
172
173 maybe_codepoint:
174 if (probe < 256)
175 putchar (probe);
176 else
177 fwrite (esc, 1, cursor - esc, stdout);
178 return cursor;
179}

Referenced by item_printer(), and print_search_result().

Here is the caller graph for this function:

◆ item_printer()

static int item_printer ( void *const  cls,
const char *const  plugin_name,
const enum EXTRACTOR_MetaType  type,
const enum EXTRACTOR_MetaFormat  format,
const char *const  data_mime_type,
const char *const  data,
const size_t  data_size 
)
static

Type of a function that libextractor calls for each meta data item found.

Parameters
clsclosure (user-defined, used for the iteration info)
plugin_namename of the plugin that produced this value; special values can be used (e.g. '<zlib>' for zlib being used in the main libextractor library and yielding meta data).
typelibextractor-type describing the meta data
formatbasic format information about data
data_mime_typemime-type of data (not of the original file); can be NULL (if mime-type is not known)
dataactual meta-data found
data_sizenumber of bytes in data
Returns
0 to continue extracting, 1 to abort

Definition at line 200 of file gnunet-search.c.

207{
208#define info ((struct GNUNET_SEARCH_MetadataPrinterInfo *) cls)
209 if ((format != EXTRACTOR_METAFORMAT_UTF8 &&
210 format != EXTRACTOR_METAFORMAT_C_STRING) ||
212 return 0;
213 info->counter++;
214 if ((info->flags & METADATA_PRINTER_FLAG_HAVE_TYPE) && type != info->type)
215 return 0;
216
217 const char *cursor = meta_format_string;
218 const char *next_spec = strchr (cursor, '%');
219 const char *next_esc = strchr (cursor, '\\');
220
221 parse_format:
222
223 /* If an escape sequence exists before the next format specifier... */
224 if (next_esc && (! next_spec || next_esc < next_spec))
225 {
226 if (next_esc > cursor)
227 fwrite (cursor, 1, next_esc - cursor, stdout);
228
229 cursor = print_escape_sequence (next_esc);
230 next_esc = strchr (cursor, '\\');
231 goto parse_format;
232 }
233
234 /* If a format specifier exists before the next escape sequence... */
235 if (next_spec && (! next_esc || next_spec < next_esc))
236 {
237 if (next_spec > cursor)
238 fwrite (cursor, 1, next_spec - cursor, stdout);
239
240 switch (*++next_spec)
241 {
242 case '%': putchar ('%'); break;
243 case 'i': printf ("%d", type); break;
244 case 'l': printf ("%lu", (long unsigned int) data_size); break;
245 case 'n': printf ("%u", info->counter); break;
246 case 'p': printf ("%s", data); break;
247#if HAVE_LIBEXTRACTOR
248 case 't':
249 printf ("%s",
251 EXTRACTOR_metatype_to_string (type)));
252 break;
253#endif
254 case 'w': printf ("%s", plugin_name); break;
255 case '\0': putchar ('%'); return 0;
256 default: printf ("%%%c", *next_spec); break;
257 }
258 cursor = next_spec + 1;
259 next_spec = strchr (cursor, '%');
260 goto parse_format;
261 }
262
263 if (*cursor)
264 printf ("%s", cursor);
265
266 return info->flags & METADATA_PRINTER_FLAG_ONE_RUN;
267#undef info
268}
#define dgettext(Domainname, Msgid)
Definition: gettext.h:47
static char * data
The data to insert into the dht.
static uint32_t type
Type string converted to DNS type value.
static size_t data_size
Number of bytes in data.
#define info
static char * meta_format_string
Definition: gnunet-search.c:95
static const char * print_escape_sequence(const char *const esc)
Print the escape sequence at the beginning of a string.
static char * plugin_name
Name of our plugin.
#define EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME
#define LIBEXTRACTOR_GETTEXT_DOMAIN
Definition: platform.h:179

References data, data_size, dgettext, EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME, info, LIBEXTRACTOR_GETTEXT_DOMAIN, meta_format_string, METADATA_PRINTER_FLAG_HAVE_TYPE, METADATA_PRINTER_FLAG_ONE_RUN, plugin_name, print_escape_sequence(), and type.

Referenced by print_search_result().

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

◆ print_search_result()

static void print_search_result ( const char *const  filename,
const struct GNUNET_FS_Uri *const  uri,
const struct GNUNET_FS_MetaData *const  metadata,
const unsigned int  resultnum,
const int  is_directory 
)
static

Print a search result according to the current formats.

Parameters
filenamethe filename for this result
urithe struct GNUNET_FS_Uri this result refers to
metadatathe struct GNUNET_FS_MetaData associated with this result
resultnumthe result number
is_directoryGNUNET_YES if this is a directory, otherwise GNUNET_NO
Author
madmurphy

Definition at line 283 of file gnunet-search.c.

288{
289
290 const char *cursor = GNUNET_YES == is_directory ?
293
294 const char *next_spec = strchr (cursor, '%');
295 const char *next_esc = strchr (cursor, '\\');
296 char *placeholder;
298
299 parse_format:
300 /* If an escape sequence exists before the next format specifier... */
301 if (next_esc && (! next_spec || next_esc < next_spec))
302 {
303 if (next_esc > cursor)
304 fwrite (cursor, 1, next_esc - cursor, stdout);
305
306 cursor = print_escape_sequence (next_esc);
307 next_esc = strchr (cursor, '\\');
308 goto parse_format;
309 }
310
311 /* If a format specifier exists before the next escape sequence... */
312 if (next_spec && (! next_esc || next_spec < next_esc))
313 {
314 if (next_spec > cursor)
315 fwrite (cursor, 1, next_spec - cursor, stdout);
316
317 switch (*++next_spec)
318 {
319 /* All metadata fields */
320 case 'a':
322
323 iterate_meta:
324 info.counter = 0;
326 break;
327 /* File's name */
328 case 'f':
329 if (GNUNET_YES == is_directory)
330 {
331 printf ("%s%s", filename, GNUNET_FS_DIRECTORY_EXT);
332 break;
333 }
334 printf ("%s", filename);
335 break;
336 /* Only the first metadata field */
337 case 'j':
339 goto iterate_meta;
340 /* File name's length */
341 case 'l':
342 printf ("%lu",
343 (long unsigned int) (GNUNET_YES == is_directory ?
344 strlen (filename)
345 + (sizeof(GNUNET_FS_DIRECTORY_EXT) - 1)
346 :
347 strlen (filename)));
348 break;
349 /* File's mime type */
350 case 'm':
351 if (GNUNET_YES == is_directory)
352 {
353 printf ("%s", GNUNET_FS_DIRECTORY_MIME);
354 break;
355 }
356 placeholder = GNUNET_FS_meta_data_get_by_type (
357 metadata,
358 EXTRACTOR_METATYPE_MIMETYPE);
359 printf ("%s", placeholder ? placeholder : GENERIC_FILE_MIMETYPE);
360 GNUNET_free (placeholder);
361 break;
362 /* Result number */
363 case 'n': printf ("%u", resultnum); break;
364 /* File's size */
365 case 's':
366 printf ("%" PRIu64, GNUNET_FS_uri_chk_get_file_size (uri));
367 break;
368 /* File's URI */
369 case 'u':
370 placeholder = GNUNET_FS_uri_to_string (uri);
371 printf ("%s", placeholder);
372 GNUNET_free (placeholder);
373 break;
374
375 /* We can add as many cases as we want here... */
376
377 /* Handle `%123#a` and `%123#j` (e.g. `%5#j` is a book title) */
378 case '0': case '1': case '2': case '3': case '4':
379 case '5': case '6': case '7': case '8': case '9':
380 cursor = next_spec;
381 info.type = *cursor - 48;
382 while (isdigit (*++cursor) && info.type < (INT_MAX - *cursor + 48) / 10)
383 info.type = info.type * 10 + *cursor - 48;
384 if (info.type == 0 || *cursor != '#')
385 goto not_a_specifier;
386 switch (*++cursor)
387 {
388 /* All metadata fields of type `info.type` */
389 case 'a':
390 next_spec = cursor;
392 goto iterate_meta;
393
394 /* Only the first metadata field of type `info.type` */
395 case 'j':
396 next_spec = cursor;
399 goto iterate_meta;
400 }
401 goto not_a_specifier;
402
403 /* All other cases */
404 case '%': putchar ('%'); break;
405 case '\0': putchar ('%'); return;
406
407 not_a_specifier:
408 default: printf ("%%%c", *next_spec); break;
409 }
410 cursor = next_spec + 1;
411 next_spec = strchr (cursor, '%');
412 goto parse_format;
413 }
414
415 if (*cursor)
416 printf ("%s", cursor);
417}
#define INT_MAX
static char * filename
static struct GNUNET_FS_Uri * uri
Value of URI provided on command-line (when not publishing a file but just creating UBlocks to refer ...
static char * dir_format_string
Definition: gnunet-search.c:93
#define GENERIC_FILE_MIMETYPE
Definition: gnunet-search.c:62
static char * format_string
Definition: gnunet-search.c:91
static int item_printer(void *const cls, const char *const plugin_name, const enum EXTRACTOR_MetaType type, const enum EXTRACTOR_MetaFormat format, const char *const data_mime_type, const char *const data, const size_t data_size)
Type of a function that libextractor calls for each meta data item found.
uint64_t GNUNET_FS_uri_chk_get_file_size(const struct GNUNET_FS_Uri *uri)
What is the size of the file that this URI refers to?
Definition: fs_uri.c:1360
#define GNUNET_FS_DIRECTORY_MIME
char * GNUNET_FS_uri_to_string(const struct GNUNET_FS_Uri *uri)
Convert a URI to a UTF-8 String.
Definition: fs_uri.c:2017
#define GNUNET_FS_DIRECTORY_EXT
@ GNUNET_YES
#define GNUNET_free(ptr)
Wrapper around free.
int GNUNET_FS_meta_data_iterate(const struct GNUNET_FS_MetaData *md, EXTRACTOR_MetaDataProcessor iter, void *iter_cls)
Iterate over MD entries.
Definition: meta_data.c:418
char * GNUNET_FS_meta_data_get_by_type(const struct GNUNET_FS_MetaData *md, enum EXTRACTOR_MetaType type)
Get the first MD entry of the given type.
Definition: meta_data.c:438

References dir_format_string, filename, format_string, GENERIC_FILE_MIMETYPE, GNUNET_free, GNUNET_FS_DIRECTORY_EXT, GNUNET_FS_DIRECTORY_MIME, GNUNET_FS_meta_data_get_by_type(), GNUNET_FS_meta_data_iterate(), GNUNET_FS_uri_chk_get_file_size(), GNUNET_FS_uri_to_string(), GNUNET_YES, info, INT_MAX, item_printer(), METADATA_PRINTER_FLAG_HAVE_TYPE, METADATA_PRINTER_FLAG_NONE, METADATA_PRINTER_FLAG_ONE_RUN, print_escape_sequence(), and uri.

Referenced by progress_cb().

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

◆ clean_task()

static void clean_task ( void *const  cls)
static

Definition at line 421 of file gnunet-search.c.

422{
423 size_t dsize;
424 void *ddata;
425
427 ctx = NULL;
428 if (output_filename == NULL)
429 return;
430 if (GNUNET_OK !=
431 GNUNET_FS_directory_builder_finish (db, &dsize, &ddata))
432 {
433 GNUNET_break (0);
435 return;
436 }
438 if (GNUNET_OK !=
440 ddata,
441 dsize,
444 {
446 _ ("Failed to write directory with search results to "
447 "`%s'\n"),
449 }
450 GNUNET_free (ddata);
452}
static char * output_filename
Definition: gnunet-search.c:89
#define GNUNET_SEARCH_log(kind,...)
Definition: gnunet-search.c:37
static struct GNUNET_FS_Handle * ctx
Definition: gnunet-search.c:85
static struct GNUNET_FS_DirectoryBuilder * db
Definition: gnunet-search.c:97
enum GNUNET_GenericReturnValue GNUNET_DISK_fn_write(const char *fn, const void *buf, size_t buf_size, enum GNUNET_DISK_AccessPermissions mode)
Write a buffer to a file atomically.
Definition: disk.c:725
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_remove(const char *filename)
Remove all files in a directory (rm -rf).
Definition: disk.c:1087
@ GNUNET_DISK_PERM_USER_READ
Owner can read.
@ GNUNET_DISK_PERM_USER_WRITE
Owner can write.
int GNUNET_FS_directory_builder_finish(struct GNUNET_FS_DirectoryBuilder *bld, size_t *rsize, void **rdata)
Finish building the directory.
Definition: fs_directory.c:578
void GNUNET_FS_stop(struct GNUNET_FS_Handle *h)
Close our connection with the file-sharing service.
Definition: fs_api.c:3310
@ GNUNET_OK
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_ERROR
#define _(String)
GNU gettext support macro.
Definition: platform.h:178

References _, ctx, db, GNUNET_break, GNUNET_DISK_directory_remove(), GNUNET_DISK_fn_write(), GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_FS_directory_builder_finish(), GNUNET_FS_stop(), GNUNET_OK, GNUNET_SEARCH_log, and output_filename.

Referenced by progress_cb().

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

◆ progress_cb()

static void * progress_cb ( void *const  cls,
const struct GNUNET_FS_ProgressInfo *const  info 
)
static

Called by FS client to give information about the progress of an operation.

Parameters
clsclosure
infodetails about the event, specifying the event type and various bits about the event
Returns
client-context (for the next progress call for this operation; should be set to NULL for SUSPEND and STOPPED events). The value returned will be passed to future callbacks in the respective field in the GNUNET_FS_ProgressInfo struct.

Definition at line 469 of file gnunet-search.c.

471{
472 static unsigned int cnt;
473 int is_directory;
474 char *filename;
475
476 switch (info->status)
477 {
479 break;
480
482 if (stop_searching)
483 break;
484
485 if (db != NULL)
487 db,
488 info->value.search.specifics.result.uri,
489 info->value.search.specifics.result.meta,
490 NULL);
491
492 if (silent_mode)
493 break;
494
495 cnt++;
497 info->value.search.specifics.result.meta,
500 info->value.search.specifics.result.meta);
501 if (NULL != filename)
502 {
503 while ((filename[0] != '\0') && ('/' == filename[strlen (filename) - 1]))
504 filename[strlen (filename) - 1] = '\0';
506 }
509 : is_directory ?
511 :
513 info->value.search.specifics.result.uri,
514 info->value.search.specifics.result.meta,
515 cnt,
516 is_directory);
517 fflush (stdout);
519 results++;
520 if ((results_limit > 0) && (results >= results_limit))
521 {
523 /* otherwise the function might keep printing results for a while... */
525 }
526 break;
527
530 /* ignore */
531 break;
532
535 _ ("Error searching: %s.\n"),
536 info->value.search.specifics.error.message);
538 break;
539
542 break;
543
544 default:
546 _ ("Unexpected status: %d\n"),
547 info->status);
548 break;
549 }
550 return NULL;
551}
#define GENERIC_FILE_NAME
Definition: gnunet-search.c:61
static void clean_task(void *const cls)
static int silent_mode
static unsigned int results
static int stop_searching
static unsigned int results_limit
#define GENERIC_DIRECTORY_NAME
Definition: gnunet-search.c:60
static void print_search_result(const char *const filename, const struct GNUNET_FS_Uri *const uri, const struct GNUNET_FS_MetaData *const metadata, const unsigned int resultnum, const int is_directory)
Print a search result according to the current formats.
void GNUNET_DISK_filename_canonicalize(char *fn)
Removes special characters as ':' from a filename.
Definition: disk.c:1191
int GNUNET_FS_meta_data_test_for_directory(const struct GNUNET_FS_MetaData *md)
Does the meta-data claim that this is a directory? Checks if the mime-type is that of a GNUnet direct...
Definition: fs_directory.c:55
void GNUNET_FS_directory_builder_add(struct GNUNET_FS_DirectoryBuilder *bld, const struct GNUNET_FS_Uri *uri, const struct GNUNET_FS_MetaData *md, const void *data)
Add an entry to a directory.
Definition: fs_directory.c:392
@ GNUNET_FS_STATUS_SEARCH_UPDATE
We have additional data about the quality or availability of a search result.
@ GNUNET_FS_STATUS_SEARCH_ERROR
Signals a problem with this search.
@ GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED
Event generated for each search result when the respective search is stopped.
@ GNUNET_FS_STATUS_SEARCH_RESULT
This search has yielded a result.
@ GNUNET_FS_STATUS_SEARCH_START
First event generated when a client requests a search to begin or when a namespace result automatical...
@ GNUNET_FS_STATUS_SEARCH_STOPPED
Last message from a search; this signals that there will be no further events associated with this se...
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:562
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:1299

References _, clean_task(), db, EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME, filename, GENERIC_DIRECTORY_NAME, GENERIC_FILE_NAME, GNUNET_DISK_filename_canonicalize(), GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_FS_directory_builder_add(), GNUNET_FS_meta_data_get_by_type(), GNUNET_FS_meta_data_test_for_directory(), GNUNET_FS_STATUS_SEARCH_ERROR, GNUNET_FS_STATUS_SEARCH_RESULT, GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED, GNUNET_FS_STATUS_SEARCH_START, GNUNET_FS_STATUS_SEARCH_STOPPED, GNUNET_FS_STATUS_SEARCH_UPDATE, GNUNET_SCHEDULER_add_now(), GNUNET_SCHEDULER_shutdown(), GNUNET_SEARCH_log, GNUNET_YES, info, print_search_result(), results, results_limit, silent_mode, and stop_searching.

Referenced by run().

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

◆ shutdown_task()

static void shutdown_task ( void *const  cls)
static

Definition at line 555 of file gnunet-search.c.

556{
557 if (sc != NULL)
558 {
560 sc = NULL;
561 }
562}
static struct GNUNET_FS_SearchContext * sc
Definition: gnunet-search.c:87
void GNUNET_FS_search_stop(struct GNUNET_FS_SearchContext *sc)
Stop search for content.
Definition: fs_search.c:1766

References GNUNET_FS_search_stop(), and sc.

Referenced by run().

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

◆ timeout_task()

static void timeout_task ( void *const  cls)
static

Definition at line 566 of file gnunet-search.c.

567{
568 tt = NULL;
571}
static struct GNUNET_SCHEDULER_Task * tt

References GNUNET_SCHEDULER_shutdown(), GNUNET_YES, stop_searching, and tt.

Referenced by run().

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

◆ run()

static void run ( void *const  cls,
char *const *const  args,
const char *const  cfgfile,
const struct GNUNET_CONFIGURATION_Handle *const  cfgarg 
)
static

Main function that will be run by the scheduler.

Parameters
clsclosure
argsremaining command-line arguments
cfgfilename of the configuration file used (for saving, can be NULL!)
cfgargconfiguration

Definition at line 583 of file gnunet-search.c.

587{
588 struct GNUNET_FS_Uri *uri;
589 unsigned int argc;
591
593 {
594 fprintf (stderr,
595 _ ("Conflicting options --bookmark-only and --silent.\n"));
596 ret = 1;
597 return;
598 }
600 {
601 fprintf (stderr,
602 _ ("Conflicting options --bookmark-only and --output.\n"));
603 ret = 1;
604 return;
605 }
607 {
608 fprintf (stderr, _ ("An output file is mandatory for silent mode.\n"));
609 ret = 1;
610 return;
611 }
612 if (NULL == dir_format_string)
616 if (NULL == format_string)
619 if (NULL == meta_format_string)
621 argc = 0;
622 while (NULL != args[argc])
623 argc++;
624 uri = GNUNET_FS_uri_ksk_create_from_args (argc, (const char **) args);
625 if (NULL == uri)
626 {
627 fprintf (stderr,
628 "%s",
629 _ ("Could not create keyword URI from arguments.\n"));
630 ret = 1;
631 return;
632 }
634 {
635 fprintf (stderr,
636 "%s",
637 _ ("Invalid URI. Valid URIs for searching are keyword query "
638 "URIs\n(\"gnunet://fs/ksk/...\") and namespace content URIs "
639 "(\"gnunet://fs/sks/...\").\n"));
641 ret = 1;
642 return;
643 }
644 if (bookmark_only)
645 {
646 char *bmstr = GNUNET_FS_uri_to_string (uri);
647 printf ("%s\n", bmstr);
648 GNUNET_free (bmstr);
650 ret = 0;
651 return;
652 }
653 cfg = cfgarg;
655 "gnunet-search",
657 NULL,
660 if (NULL == ctx)
661 {
662 fprintf (stderr, _ ("Could not initialize the `%s` subsystem.\n"), "FS");
664 ret = 1;
665 return;
666 }
667 if (output_filename != NULL)
670 if (local_only)
674 if (NULL == sc)
675 {
676 fprintf (stderr, "%s", _ ("Could not start searching.\n"));
678 ret = 1;
679 return;
680 }
681 if (0 != timeout.rel_value_us)
684}
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
#define VERB_DEFAULT_DIR_FORMAT
Definition: gnunet-search.c:47
#define DEFAULT_META_FORMAT
Definition: gnunet-search.c:55
static unsigned int verbose
#define DEFAULT_DIR_FORMAT
Definition: gnunet-search.c:43
static void timeout_task(void *const cls)
static void shutdown_task(void *const cls)
static unsigned int anonymity
Definition: gnunet-search.c:99
static const struct GNUNET_CONFIGURATION_Handle * cfg
Definition: gnunet-search.c:83
static int bookmark_only
static int ret
Definition: gnunet-search.c:81
static struct GNUNET_TIME_Relative timeout
Timeout for the search, 0 means to wait for CTRL-C.
#define DEFAULT_FILE_FORMAT
Definition: gnunet-search.c:45
static int local_only
static void * progress_cb(void *const cls, const struct GNUNET_FS_ProgressInfo *const info)
Called by FS client to give information about the progress of an operation.
#define VERB_DEFAULT_FILE_FORMAT
Definition: gnunet-search.c:48
GNUNET_FS_SearchOptions
Options for searching.
int GNUNET_FS_uri_test_ksk(const struct GNUNET_FS_Uri *uri)
Is this a keyword URI?
Definition: fs_uri.c:1324
struct GNUNET_FS_Handle * GNUNET_FS_start(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *client_name, GNUNET_FS_ProgressCallback upcb, void *upcb_cls, enum GNUNET_FS_Flags flags,...)
Setup a connection to the file-sharing service.
Definition: fs_api.c:3244
struct GNUNET_FS_Uri * GNUNET_FS_uri_ksk_create_from_args(unsigned int argc, const char **argv)
Create an FS URI from a user-supplied command line of keywords.
Definition: fs_uri.c:1144
void GNUNET_FS_uri_destroy(struct GNUNET_FS_Uri *uri)
Free URI.
Definition: fs_uri.c:677
int GNUNET_FS_uri_test_sks(const struct GNUNET_FS_Uri *uri)
Is this a namespace URI?
Definition: fs_uri.c:1271
struct GNUNET_FS_DirectoryBuilder * GNUNET_FS_directory_builder_create(const struct GNUNET_FS_MetaData *mdir)
Create a directory builder.
Definition: fs_directory.c:366
struct GNUNET_FS_SearchContext * GNUNET_FS_search_start(struct GNUNET_FS_Handle *h, const struct GNUNET_FS_Uri *uri, uint32_t anonymity, enum GNUNET_FS_SearchOptions options, void *cctx)
Start search for content.
Definition: fs_search.c:1607
@ GNUNET_FS_FLAGS_NONE
No special flags set.
@ GNUNET_FS_SEARCH_OPTION_LOOPBACK_ONLY
Only search the local host, do not search remote systems (no P2P)
@ GNUNET_FS_SEARCH_OPTION_NONE
No options (use defaults for everything).
@ GNUNET_FS_OPTIONS_END
Last option in the VARARG list.
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:1334
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1272
A Universal Resource Identifier (URI), opaque.
Definition: fs_api.h:167
uint64_t rel_value_us
The actual value.

References _, anonymity, consensus-simulation::args, bookmark_only, cfg, ctx, db, DEFAULT_DIR_FORMAT, DEFAULT_FILE_FORMAT, DEFAULT_META_FORMAT, dir_format_string, format_string, GNUNET_free, GNUNET_FS_directory_builder_create(), GNUNET_FS_FLAGS_NONE, GNUNET_FS_OPTIONS_END, GNUNET_FS_SEARCH_OPTION_LOOPBACK_ONLY, GNUNET_FS_SEARCH_OPTION_NONE, GNUNET_FS_search_start(), GNUNET_FS_start(), GNUNET_FS_stop(), GNUNET_FS_uri_destroy(), GNUNET_FS_uri_ksk_create_from_args(), GNUNET_FS_uri_test_ksk(), GNUNET_FS_uri_test_sks(), GNUNET_FS_uri_to_string(), GNUNET_SCHEDULER_add_delayed(), GNUNET_SCHEDULER_add_shutdown(), local_only, meta_format_string, options, output_filename, progress_cb(), GNUNET_TIME_Relative::rel_value_us, ret, sc, shutdown_task(), silent_mode, timeout, timeout_task(), tt, uri, VERB_DEFAULT_DIR_FORMAT, VERB_DEFAULT_FILE_FORMAT, and verbose.

Referenced by main().

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

◆ main()

int main ( int  argc,
char *const *  argv 
)

The main function to search GNUnet.

Parameters
argcnumber of arguments from the command line
argvcommand line arguments
Returns
0 ok, an error number on error

Definition at line 695 of file gnunet-search.c.

696{
699 'a',
700 "anonymity",
701 "LEVEL",
702 gettext_noop ("set the desired LEVEL of receiver-anonymity (default: "
703 "1)"),
704 &anonymity),
706 'b',
707 "bookmark-only",
708 gettext_noop ("do not search, print only the URI that points to this "
709 "search"),
712 'F',
713 "dir-printf",
714 "FORMAT",
715 gettext_noop ("write search results for directories according to "
716 "FORMAT; accepted placeholders are: %a, %f, %j, %l, %m, "
717 "%n, %s; defaults to the value of --printf when omitted "
718 "or to `" HELP_DEFAULT_DIR_FORMAT "` if --printf is "
719 "omitted too"),
722 'f',
723 "printf",
724 "FORMAT",
725 gettext_noop ("write search results according to FORMAT; accepted "
726 "placeholders are: %a, %f, %j, %l, %m, %n, %s; defaults "
727 "to `" HELP_DEFAULT_FILE_FORMAT "` when omitted"),
730 'i',
731 "iter-printf",
732 "FORMAT",
733 gettext_noop ("when the %a or %j placeholders appear in --printf or "
734 "--dir-printf, list each metadata property according to "
735 "FORMAT; accepted placeholders are: %i, %l, %n, %p"
736 HELP_EXTRACTOR_TEXTADD ", %w; defaults to `"
737 HELP_DEFAULT_META_FORMAT "` when omitted"),
740 "results",
741 "VALUE",
742 gettext_noop ("automatically terminate search "
743 "after VALUE results are found"),
746 'n',
747 "no-network",
748 gettext_noop ("only search the local peer (no P2P network search)"),
749 &local_only),
751 'o',
752 "output",
753 "FILENAME",
754 gettext_noop ("create a GNUnet directory with search results at "
755 "FILENAME (e.g. `gnunet-search --output=commons"
756 GNUNET_FS_DIRECTORY_EXT " commons`)"),
759 's',
760 "silent",
761 gettext_noop ("silent mode (requires the --output argument)"),
762 &silent_mode),
764 't',
765 "timeout",
766 "DELAY",
767 gettext_noop ("automatically terminate search after DELAY; the value "
768 "given must be a number followed by a space and a time "
769 "unit, for example \"500 ms\"; without a unit it defaults "
770 "to microseconds - 1000000 = 1 second; if 0 or omitted "
771 "it means to wait for CTRL-C"),
772 &timeout),
774 'V',
775 "verbose",
776 gettext_noop ("be verbose (append \"%a\\n\" to the default --printf and "
777 "--dir-printf arguments - ignored when these are provided "
778 "by the user)"),
779 &verbose),
781
782 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
783 return 12;
784
785 if (GNUNET_SYSERR ==
786 GNUNET_PROGRAM_run (argc,
787 argv,
788 "gnunet-search [OPTIONS] KEYWORD1 KEYWORD2 ...",
789 gettext_noop ("Search for files that have been "
790 "published on GNUnet\n"),
791 options,
792 &run,
793 NULL))
794 ret = 1;
795
796 GNUNET_free_nz ((void *) argv);
797 return ret;
798}
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
#define gettext_noop(String)
Definition: gettext.h:70
#define HELP_DEFAULT_FILE_FORMAT
Definition: gnunet-search.c:46
#define HELP_DEFAULT_DIR_FORMAT
Definition: gnunet-search.c:44
#define HELP_DEFAULT_META_FORMAT
Definition: gnunet-search.c:56
static void run(void *const cls, char *const *const args, const char *const cfgfile, const struct GNUNET_CONFIGURATION_Handle *const cfgarg)
Main function that will be run by the scheduler.
#define HELP_EXTRACTOR_TEXTADD
Definition: gnunet-search.c:57
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_increment_uint(char shortName, const char *name, const char *description, unsigned int *val)
Increment val each time the option flag is given by one.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_uint(char shortName, const char *name, const char *argumentHelp, const char *description, unsigned int *val)
Allow user to specify an unsigned int.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_relative_time(char shortName, const char *name, const char *argumentHelp, const char *description, struct GNUNET_TIME_Relative *val)
Allow user to specify a struct GNUNET_TIME_Relative (using human-readable "fancy" time).
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
@ GNUNET_SYSERR
#define GNUNET_free_nz(ptr)
Wrapper around free.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
Definition: program.c:400
enum GNUNET_GenericReturnValue GNUNET_STRINGS_get_utf8_args(int argc, char *const *argv, int *u8argc, char *const **u8argv)
Returns utf-8 encoded arguments.
Definition: strings.c:1230
Definition of a command line option.

References anonymity, bookmark_only, dir_format_string, format_string, gettext_noop, GNUNET_free_nz, GNUNET_FS_DIRECTORY_EXT, GNUNET_GETOPT_OPTION_END, GNUNET_GETOPT_option_flag(), GNUNET_GETOPT_option_increment_uint(), GNUNET_GETOPT_option_relative_time(), GNUNET_GETOPT_option_string(), GNUNET_GETOPT_option_uint(), GNUNET_OK, GNUNET_PROGRAM_run(), GNUNET_STRINGS_get_utf8_args(), GNUNET_SYSERR, HELP_DEFAULT_DIR_FORMAT, HELP_DEFAULT_FILE_FORMAT, HELP_DEFAULT_META_FORMAT, HELP_EXTRACTOR_TEXTADD, local_only, meta_format_string, options, output_filename, results_limit, ret, run(), silent_mode, timeout, and verbose.

Here is the call graph for this function:

Variable Documentation

◆ ret

int ret
static

Definition at line 81 of file gnunet-search.c.

Referenced by main(), and run().

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

Definition at line 83 of file gnunet-search.c.

Referenced by run().

◆ ctx

struct GNUNET_FS_Handle* ctx
static

Definition at line 85 of file gnunet-search.c.

Referenced by clean_task(), and run().

◆ sc

◆ output_filename

char* output_filename
static

Definition at line 89 of file gnunet-search.c.

Referenced by clean_task(), main(), and run().

◆ format_string

char* format_string
static

Definition at line 91 of file gnunet-search.c.

Referenced by main(), print_search_result(), and run().

◆ dir_format_string

char* dir_format_string
static

Definition at line 93 of file gnunet-search.c.

Referenced by main(), print_search_result(), and run().

◆ meta_format_string

char* meta_format_string
static

Definition at line 95 of file gnunet-search.c.

Referenced by item_printer(), main(), and run().

◆ db

struct GNUNET_FS_DirectoryBuilder* db
static

Definition at line 97 of file gnunet-search.c.

Referenced by clean_task(), do_scheduler_notify(), download_cb(), GNUNET_CURL_download_get_result_(), GNUNET_PQ_connect2(), GNUNET_PQ_connect_with_cfg2(), GNUNET_PQ_disconnect(), GNUNET_PQ_eval_prepared_multi_select(), GNUNET_PQ_eval_prepared_non_select(), GNUNET_PQ_eval_prepared_singleton_select(), GNUNET_PQ_eval_result(), GNUNET_PQ_event_do_poll(), GNUNET_PQ_event_listen(), GNUNET_PQ_event_listen_cancel(), GNUNET_PQ_event_notify(), GNUNET_PQ_event_reconnect_(), GNUNET_PQ_exec_prepared(), GNUNET_PQ_exec_sql(), GNUNET_PQ_exec_statements(), GNUNET_PQ_get_oid_by_name(), GNUNET_PQ_prepare_once(), GNUNET_PQ_prepare_statements(), GNUNET_PQ_query_param_array_abs_time(), GNUNET_PQ_query_param_array_bool(), GNUNET_PQ_query_param_array_bytes(), GNUNET_PQ_query_param_array_bytes_same_size(), GNUNET_PQ_query_param_array_ptrs_abs_time(), GNUNET_PQ_query_param_array_ptrs_bytes(), GNUNET_PQ_query_param_array_ptrs_bytes_same_size(), GNUNET_PQ_query_param_array_ptrs_rel_time(), GNUNET_PQ_query_param_array_ptrs_string(), GNUNET_PQ_query_param_array_ptrs_timestamp(), GNUNET_PQ_query_param_array_rel_time(), GNUNET_PQ_query_param_array_string(), GNUNET_PQ_query_param_array_timestamp(), GNUNET_PQ_query_param_array_uint16(), GNUNET_PQ_query_param_array_uint32(), GNUNET_PQ_query_param_array_uint64(), GNUNET_PQ_reconnect(), GNUNET_PQ_reconnect_if_down(), GNUNET_PQ_result_spec_array_abs_time(), GNUNET_PQ_result_spec_array_bool(), GNUNET_PQ_result_spec_array_fixed_size(), GNUNET_PQ_result_spec_array_rel_time(), GNUNET_PQ_result_spec_array_string(), GNUNET_PQ_result_spec_array_timestamp(), GNUNET_PQ_result_spec_array_uint16(), GNUNET_PQ_result_spec_array_uint32(), GNUNET_PQ_result_spec_array_uint64(), GNUNET_PQ_result_spec_array_variable_size(), GNUNET_PQ_run_sql(), load_initial_oids(), manage_subscribe(), progress_cb(), publish_content(), register_notify(), run(), and scheduler_fd_cb().

◆ anonymity

unsigned int anonymity = 1
static

Definition at line 99 of file gnunet-search.c.

Referenced by main(), and run().

◆ timeout

struct GNUNET_TIME_Relative timeout
static

Timeout for the search, 0 means to wait for CTRL-C.

Definition at line 104 of file gnunet-search.c.

Referenced by main(), and run().

◆ results_limit

unsigned int results_limit
static

Definition at line 106 of file gnunet-search.c.

Referenced by main(), and progress_cb().

◆ results

unsigned int results
static

◆ verbose

unsigned int verbose
static

Definition at line 110 of file gnunet-search.c.

Referenced by main(), and run().

◆ bookmark_only

int bookmark_only
static

Definition at line 112 of file gnunet-search.c.

Referenced by main(), and run().

◆ local_only

int local_only
static

Definition at line 114 of file gnunet-search.c.

Referenced by main(), and run().

◆ silent_mode

int silent_mode
static

Definition at line 116 of file gnunet-search.c.

Referenced by main(), progress_cb(), and run().

◆ tt

struct GNUNET_SCHEDULER_Task* tt
static

Definition at line 118 of file gnunet-search.c.

Referenced by run(), and timeout_task().

◆ stop_searching

int stop_searching
static

Definition at line 120 of file gnunet-search.c.

Referenced by progress_cb(), and timeout_task().