GNUnet  0.19.3
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 size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
uint32_t data
The data value.
#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:178
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

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 ?
292  : format_string;
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:422
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:442

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:724
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_remove(const char *filename)
Remove all files in a directory (rm -rf).
Definition: disk.c:1084
@ 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:177

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  }
508  filename
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:1188
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 
592  if (silent_mode && bookmark_only)
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  }
606  if (silent_mode && ! output_filename)
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",
656  &progress_cb,
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_DirectoryBuilder * GNUNET_FS_directory_builder_create(const struct GNUNET_FS_MetaData *mdir)
Create a directory builder.
Definition: fs_directory.c:366
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_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_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"),
710  &bookmark_only),
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"),
728  &format_string),
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"),
744  &results_limit),
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`)"),
757  &output_filename),
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:1222
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

struct GNUNET_FS_SearchContext* sc
static

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

Referenced by call_completion_task(), connect_cb(), continue_writing(), decrypt_block_with_keyword(), deserialize_search(), deserialize_search_file(), deserialize_search_result(), disconnect_cb(), do_reconnect(), extract_box_cb(), find_opc(), find_sender_by_address(), free_search_context(), GNUNET_FS_search_continue(), GNUNET_FS_search_make_status_(), GNUNET_FS_search_pause(), GNUNET_FS_search_signal_suspend_(), GNUNET_FS_search_start_searching_(), GNUNET_FS_search_stop(), GNUNET_FS_search_sync_(), GNUNET_HELLO_extract_address(), GNUNET_PEERSTORE_disconnect(), GNUNET_PEERSTORE_store(), GNUNET_PEERSTORE_store_cancel(), GNUNET_TESTBED_get_statistics(), GNUNET_TESTING_service_run(), GNUNET_TRANSPORT_TESTING_large_send(), GNUNET_TRANSPORT_TESTING_simple_send(), handle_client_start_search(), handle_datastore_reply(), handle_request(), handle_result(), iteration_completion_cb(), iterator_cb(), locate_by_id(), notify_client_chk_result(), notify_client_chk_update(), op_done_task(), opc_search_iterator(), oprelease_get_stats(), opstart_get_stats(), process_kblock(), process_ksk_result(), process_sblock(), process_sks_result(), reconnect(), refresh_timeout_task(), run(), schedule_transmit_search_request(), search_iterator(), search_mq_error_handler(), search_rcop(), search_result_stop(), search_result_suspend(), search_start(), select_best_pending_from_link(), server_access_cb(), server_disconnect_cb(), server_lookup_connection(), server_send_callback(), service_run_main(), setup_sender(), shutdown_task(), signal_result_resume(), signal_search_resume(), signal_socks_failure(), store_request_sent(), timeout_cadet_task(), transmit_on_queue(), try_reconnect(), and update_sre_result_maps().

◆ 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

◆ 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 99 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

◆ 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().