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.c376
1 files changed, 191 insertions, 185 deletions
diff --git a/src/fs/gnunet-search.c b/src/fs/gnunet-search.c
index 7d6ff4c6b..ac31387e2 100644
--- a/src/fs/gnunet-search.c
+++ b/src/fs/gnunet-search.c
@@ -11,12 +11,12 @@
11 WITHOUT ANY WARRANTY; without even the implied warranty of 11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details. 13 Affero General Public License for more details.
14 14
15 You should have received a copy of the GNU Affero General Public License 15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17
18 SPDX-License-Identifier: AGPL3.0-or-later 18 SPDX-License-Identifier: AGPL3.0-or-later
19*/ 19 */
20/** 20/**
21 * @file fs/gnunet-search.c 21 * @file fs/gnunet-search.c
22 * @brief searching for files on GNUnet 22 * @brief searching for files on GNUnet
@@ -76,13 +76,13 @@ static struct GNUNET_SCHEDULER_Task *tt;
76 * @return 0 to continue extracting, 1 to abort 76 * @return 0 to continue extracting, 1 to abort
77 */ 77 */
78static int 78static int
79item_printer (void *cls, 79item_printer(void *cls,
80 const char *plugin_name, 80 const char *plugin_name,
81 enum EXTRACTOR_MetaType type, 81 enum EXTRACTOR_MetaType type,
82 enum EXTRACTOR_MetaFormat format, 82 enum EXTRACTOR_MetaFormat format,
83 const char *data_mime_type, 83 const char *data_mime_type,
84 const char *data, 84 const char *data,
85 size_t data_size) 85 size_t data_size)
86{ 86{
87 if ((format != EXTRACTOR_METAFORMAT_UTF8) && 87 if ((format != EXTRACTOR_METAFORMAT_UTF8) &&
88 (format != EXTRACTOR_METAFORMAT_C_STRING)) 88 (format != EXTRACTOR_METAFORMAT_C_STRING))
@@ -90,45 +90,45 @@ item_printer (void *cls,
90 if (type == EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME) 90 if (type == EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME)
91 return 0; 91 return 0;
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)), 95 EXTRACTOR_metatype_to_string(type)),
96 data); 96 data);
97#else 97#else
98 printf ("\t%20d: %s\n", type, data); 98 printf("\t%20d: %s\n", type, data);
99#endif 99#endif
100 return 0; 100 return 0;
101} 101}
102 102
103 103
104static void 104static void
105clean_task (void *cls) 105clean_task(void *cls)
106{ 106{
107 size_t dsize; 107 size_t dsize;
108 void *ddata; 108 void *ddata;
109 109
110 GNUNET_FS_stop (ctx); 110 GNUNET_FS_stop(ctx);
111 ctx = NULL; 111 ctx = NULL;
112 if (output_filename == NULL) 112 if (output_filename == NULL)
113 return; 113 return;
114 if (GNUNET_OK != GNUNET_FS_directory_builder_finish (db, &dsize, &ddata)) 114 if (GNUNET_OK != GNUNET_FS_directory_builder_finish(db, &dsize, &ddata))
115 { 115 {
116 GNUNET_break (0); 116 GNUNET_break(0);
117 GNUNET_free (output_filename); 117 GNUNET_free(output_filename);
118 return; 118 return;
119 } 119 }
120 if (dsize != GNUNET_DISK_fn_write (output_filename, 120 if (dsize != GNUNET_DISK_fn_write(output_filename,
121 ddata, 121 ddata,
122 dsize, 122 dsize,
123 GNUNET_DISK_PERM_USER_READ | 123 GNUNET_DISK_PERM_USER_READ |
124 GNUNET_DISK_PERM_USER_WRITE)) 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);
131 GNUNET_free (output_filename); 131 GNUNET_free(output_filename);
132} 132}
133 133
134 134
@@ -146,7 +146,7 @@ clean_task (void *cls)
146 * field in the GNUNET_FS_ProgressInfo struct. 146 * field in the GNUNET_FS_ProgressInfo struct.
147 */ 147 */
148static void * 148static void *
149progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *info) 149progress_cb(void *cls, const struct GNUNET_FS_ProgressInfo *info)
150{ 150{
151 static unsigned int cnt; 151 static unsigned int cnt;
152 int is_directory; 152 int is_directory;
@@ -154,92 +154,98 @@ progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *info)
154 char *filename; 154 char *filename;
155 155
156 switch (info->status) 156 switch (info->status)
157 {
158 case GNUNET_FS_STATUS_SEARCH_START:
159 break;
160 case GNUNET_FS_STATUS_SEARCH_RESULT:
161 if (db != NULL)
162 GNUNET_FS_directory_builder_add (db,
163 info->value.search.specifics.result.uri,
164 info->value.search.specifics.result.meta,
165 NULL);
166 uri = GNUNET_FS_uri_to_string (info->value.search.specifics.result.uri);
167 printf ("#%u:\n", ++cnt);
168 filename = GNUNET_CONTAINER_meta_data_get_by_type (
169 info->value.search.specifics.result.meta,
170 EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME);
171 is_directory = GNUNET_FS_meta_data_test_for_directory (
172 info->value.search.specifics.result.meta);
173 if (NULL != filename)
174 { 157 {
175 while ((filename[0] != '\0') && ('/' == filename[strlen (filename) - 1])) 158 case GNUNET_FS_STATUS_SEARCH_START:
176 filename[strlen (filename) - 1] = '\0'; 159 break;
177 GNUNET_DISK_filename_canonicalize (filename); 160
178 if (GNUNET_YES == is_directory) 161 case GNUNET_FS_STATUS_SEARCH_RESULT:
179 printf ("gnunet-download -o \"%s%s\" -R %s\n", 162 if (db != NULL)
180 filename, 163 GNUNET_FS_directory_builder_add(db,
181 GNUNET_FS_DIRECTORY_EXT, 164 info->value.search.specifics.result.uri,
182 uri); 165 info->value.search.specifics.result.meta,
166 NULL);
167 uri = GNUNET_FS_uri_to_string(info->value.search.specifics.result.uri);
168 printf("#%u:\n", ++cnt);
169 filename = GNUNET_CONTAINER_meta_data_get_by_type(
170 info->value.search.specifics.result.meta,
171 EXTRACTOR_METATYPE_GNUNET_ORIGINAL_FILENAME);
172 is_directory = GNUNET_FS_meta_data_test_for_directory(
173 info->value.search.specifics.result.meta);
174 if (NULL != filename)
175 {
176 while ((filename[0] != '\0') && ('/' == filename[strlen(filename) - 1]))
177 filename[strlen(filename) - 1] = '\0';
178 GNUNET_DISK_filename_canonicalize(filename);
179 if (GNUNET_YES == is_directory)
180 printf("gnunet-download -o \"%s%s\" -R %s\n",
181 filename,
182 GNUNET_FS_DIRECTORY_EXT,
183 uri);
184 else
185 printf("gnunet-download -o \"%s\" %s\n", filename, uri);
186 }
187 else if (GNUNET_YES == is_directory)
188 printf("gnunet-download -o \"collection%s\" -R %s\n",
189 GNUNET_FS_DIRECTORY_EXT,
190 uri);
183 else 191 else
184 printf ("gnunet-download -o \"%s\" %s\n", filename, uri); 192 printf("gnunet-download %s\n", uri);
193 if (verbose)
194 GNUNET_CONTAINER_meta_data_iterate(info->value.search.specifics.result
195 .meta,
196 &item_printer,
197 NULL);
198 printf("\n");
199 fflush(stdout);
200 GNUNET_free_non_null(filename);
201 GNUNET_free(uri);
202 results++;
203 if ((results_limit > 0) && (results >= results_limit))
204 GNUNET_SCHEDULER_shutdown();
205 break;
206
207 case GNUNET_FS_STATUS_SEARCH_UPDATE:
208 break;
209
210 case GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED:
211 /* ignore */
212 break;
213
214 case GNUNET_FS_STATUS_SEARCH_ERROR:
215 fprintf(stderr,
216 _("Error searching: %s.\n"),
217 info->value.search.specifics.error.message);
218 GNUNET_SCHEDULER_shutdown();
219 break;
220
221 case GNUNET_FS_STATUS_SEARCH_STOPPED:
222 GNUNET_SCHEDULER_add_now(&clean_task, NULL);
223 break;
224
225 default:
226 fprintf(stderr, _("Unexpected status: %d\n"), info->status);
227 break;
185 } 228 }
186 else if (GNUNET_YES == is_directory)
187 printf ("gnunet-download -o \"collection%s\" -R %s\n",
188 GNUNET_FS_DIRECTORY_EXT,
189 uri);
190 else
191 printf ("gnunet-download %s\n", uri);
192 if (verbose)
193 GNUNET_CONTAINER_meta_data_iterate (info->value.search.specifics.result
194 .meta,
195 &item_printer,
196 NULL);
197 printf ("\n");
198 fflush (stdout);
199 GNUNET_free_non_null (filename);
200 GNUNET_free (uri);
201 results++;
202 if ((results_limit > 0) && (results >= results_limit))
203 GNUNET_SCHEDULER_shutdown ();
204 break;
205 case GNUNET_FS_STATUS_SEARCH_UPDATE:
206 break;
207 case GNUNET_FS_STATUS_SEARCH_RESULT_STOPPED:
208 /* ignore */
209 break;
210 case GNUNET_FS_STATUS_SEARCH_ERROR:
211 fprintf (stderr,
212 _ ("Error searching: %s.\n"),
213 info->value.search.specifics.error.message);
214 GNUNET_SCHEDULER_shutdown ();
215 break;
216 case GNUNET_FS_STATUS_SEARCH_STOPPED:
217 GNUNET_SCHEDULER_add_now (&clean_task, NULL);
218 break;
219 default:
220 fprintf (stderr, _ ("Unexpected status: %d\n"), info->status);
221 break;
222 }
223 return NULL; 229 return NULL;
224} 230}
225 231
226 232
227static void 233static void
228shutdown_task (void *cls) 234shutdown_task(void *cls)
229{ 235{
230 if (sc != NULL) 236 if (sc != NULL)
231 { 237 {
232 GNUNET_FS_search_stop (sc); 238 GNUNET_FS_search_stop(sc);
233 sc = NULL; 239 sc = NULL;
234 } 240 }
235} 241}
236 242
237 243
238static void 244static void
239timeout_task (void *cls) 245timeout_task(void *cls)
240{ 246{
241 tt = NULL; 247 tt = NULL;
242 GNUNET_SCHEDULER_shutdown (); 248 GNUNET_SCHEDULER_shutdown();
243} 249}
244 250
245 251
@@ -252,10 +258,10 @@ timeout_task (void *cls)
252 * @param c configuration 258 * @param c configuration
253 */ 259 */
254static void 260static void
255run (void *cls, 261run(void *cls,
256 char *const *args, 262 char *const *args,
257 const char *cfgfile, 263 const char *cfgfile,
258 const struct GNUNET_CONFIGURATION_Handle *c) 264 const struct GNUNET_CONFIGURATION_Handle *c)
259{ 265{
260 struct GNUNET_FS_Uri *uri; 266 struct GNUNET_FS_Uri *uri;
261 unsigned int argc; 267 unsigned int argc;
@@ -264,46 +270,46 @@ run (void *cls,
264 argc = 0; 270 argc = 0;
265 while (NULL != args[argc]) 271 while (NULL != args[argc])
266 argc++; 272 argc++;
267 uri = GNUNET_FS_uri_ksk_create_from_args (argc, (const char **) args); 273 uri = GNUNET_FS_uri_ksk_create_from_args(argc, (const char **)args);
268 if (NULL == uri) 274 if (NULL == uri)
269 { 275 {
270 fprintf (stderr, 276 fprintf(stderr,
271 "%s", 277 "%s",
272 _ ("Could not create keyword URI from arguments.\n")); 278 _("Could not create keyword URI from arguments.\n"));
273 ret = 1; 279 ret = 1;
274 return; 280 return;
275 } 281 }
276 cfg = c; 282 cfg = c;
277 ctx = GNUNET_FS_start (cfg, 283 ctx = GNUNET_FS_start(cfg,
278 "gnunet-search", 284 "gnunet-search",
279 &progress_cb, 285 &progress_cb,
280 NULL, 286 NULL,
281 GNUNET_FS_FLAGS_NONE, 287 GNUNET_FS_FLAGS_NONE,
282 GNUNET_FS_OPTIONS_END); 288 GNUNET_FS_OPTIONS_END);
283 if (NULL == ctx) 289 if (NULL == ctx)
284 { 290 {
285 fprintf (stderr, _ ("Could not initialize `%s' subsystem.\n"), "FS"); 291 fprintf(stderr, _("Could not initialize `%s' subsystem.\n"), "FS");
286 GNUNET_FS_uri_destroy (uri); 292 GNUNET_FS_uri_destroy(uri);
287 ret = 1; 293 ret = 1;
288 return; 294 return;
289 } 295 }
290 if (output_filename != NULL) 296 if (output_filename != NULL)
291 db = GNUNET_FS_directory_builder_create (NULL); 297 db = GNUNET_FS_directory_builder_create(NULL);
292 options = GNUNET_FS_SEARCH_OPTION_NONE; 298 options = GNUNET_FS_SEARCH_OPTION_NONE;
293 if (local_only) 299 if (local_only)
294 options |= GNUNET_FS_SEARCH_OPTION_LOOPBACK_ONLY; 300 options |= GNUNET_FS_SEARCH_OPTION_LOOPBACK_ONLY;
295 sc = GNUNET_FS_search_start (ctx, uri, anonymity, options, NULL); 301 sc = GNUNET_FS_search_start(ctx, uri, anonymity, options, NULL);
296 GNUNET_FS_uri_destroy (uri); 302 GNUNET_FS_uri_destroy(uri);
297 if (NULL == sc) 303 if (NULL == sc)
298 { 304 {
299 fprintf (stderr, "%s", _ ("Could not start searching.\n")); 305 fprintf(stderr, "%s", _("Could not start searching.\n"));
300 GNUNET_FS_stop (ctx); 306 GNUNET_FS_stop(ctx);
301 ret = 1; 307 ret = 1;
302 return; 308 return;
303 } 309 }
304 if (0 != timeout.rel_value_us) 310 if (0 != timeout.rel_value_us)
305 tt = GNUNET_SCHEDULER_add_delayed (timeout, &timeout_task, NULL); 311 tt = GNUNET_SCHEDULER_add_delayed(timeout, &timeout_task, NULL);
306 GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); 312 GNUNET_SCHEDULER_add_shutdown(&shutdown_task, NULL);
307} 313}
308 314
309 315
@@ -315,57 +321,57 @@ run (void *cls,
315 * @return 0 ok, 1 on error 321 * @return 0 ok, 1 on error
316 */ 322 */
317int 323int
318main (int argc, char *const *argv) 324main(int argc, char *const *argv)
319{ 325{
320 struct GNUNET_GETOPT_CommandLineOption options[] = 326 struct GNUNET_GETOPT_CommandLineOption options[] =
321 {GNUNET_GETOPT_option_uint ('a', 327 { GNUNET_GETOPT_option_uint('a',
322 "anonymity", 328 "anonymity",
323 "LEVEL", 329 "LEVEL",
324 gettext_noop ( 330 gettext_noop(
325 "set the desired LEVEL of receiver-anonymity"), 331 "set the desired LEVEL of receiver-anonymity"),
326 &anonymity), 332 &anonymity),
327 GNUNET_GETOPT_option_flag ( 333 GNUNET_GETOPT_option_flag(
328 'n', 334 'n',
329 "no-network", 335 "no-network",
330 gettext_noop ("only search the local peer (no P2P network search)"), 336 gettext_noop("only search the local peer (no P2P network search)"),
331 &local_only), 337 &local_only),
332 GNUNET_GETOPT_option_string ( 338 GNUNET_GETOPT_option_string(
333 'o', 339 'o',
334 "output", 340 "output",
335 "PREFIX", 341 "PREFIX",
336 gettext_noop ("write search results to file starting with PREFIX"), 342 gettext_noop("write search results to file starting with PREFIX"),
337 &output_filename), 343 &output_filename),
338 GNUNET_GETOPT_option_relative_time ( 344 GNUNET_GETOPT_option_relative_time(
339 't', 345 't',
340 "timeout", 346 "timeout",
341 "DELAY", 347 "DELAY",
342 gettext_noop ("automatically terminate search after DELAY"), 348 gettext_noop("automatically terminate search after DELAY"),
343 &timeout), 349 &timeout),
344 GNUNET_GETOPT_option_verbose (&verbose), 350 GNUNET_GETOPT_option_verbose(&verbose),
345 GNUNET_GETOPT_option_uint ('N', 351 GNUNET_GETOPT_option_uint('N',
346 "results", 352 "results",
347 "VALUE", 353 "VALUE",
348 gettext_noop ("automatically terminate search " 354 gettext_noop("automatically terminate search "
349 "after VALUE results are found"), 355 "after VALUE results are found"),
350 &results_limit), 356 &results_limit),
351 GNUNET_GETOPT_OPTION_END}; 357 GNUNET_GETOPT_OPTION_END };
352 358
353 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) 359 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args(argc, argv, &argc, &argv))
354 return 2; 360 return 2;
355 361
356 ret = 362 ret =
357 (GNUNET_OK == 363 (GNUNET_OK ==
358 GNUNET_PROGRAM_run (argc, 364 GNUNET_PROGRAM_run(argc,
359 argv, 365 argv,
360 "gnunet-search [OPTIONS] KEYWORD", 366 "gnunet-search [OPTIONS] KEYWORD",
361 gettext_noop ( 367 gettext_noop(
362 "Search GNUnet for files that were published on GNUnet"), 368 "Search GNUnet for files that were published on GNUnet"),
363 options, 369 options,
364 &run, 370 &run,
365 NULL)) 371 NULL))
366 ? ret 372 ? ret
367 : 1; 373 : 1;
368 GNUNET_free ((void *) argv); 374 GNUNET_free((void *)argv);
369 return ret; 375 return ret;
370} 376}
371 377