diff options
Diffstat (limited to 'src/fs/gnunet-search.c')
-rw-r--r-- | src/fs/gnunet-search.c | 376 |
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 | */ |
78 | static int | 78 | static int |
79 | item_printer (void *cls, | 79 | item_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 | ||
104 | static void | 104 | static void |
105 | clean_task (void *cls) | 105 | clean_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 | */ |
148 | static void * | 148 | static void * |
149 | progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *info) | 149 | progress_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 | ||
227 | static void | 233 | static void |
228 | shutdown_task (void *cls) | 234 | shutdown_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 | ||
238 | static void | 244 | static void |
239 | timeout_task (void *cls) | 245 | timeout_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 | */ |
254 | static void | 260 | static void |
255 | run (void *cls, | 261 | run(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 | */ |
317 | int | 323 | int |
318 | main (int argc, char *const *argv) | 324 | main(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 | ||