static enum shell_reply shell_exec_download_resume(struct gnutella_shell *sh, int argc, const char *argv[]) { fileinfo_t *fi; struct guid guid; const char *id; shell_check(sh); g_assert(argv); g_assert(argc > 0); if (argc < 3) { shell_set_msg(sh, "parameter missing"); goto error; } id = argv[2]; if (!hex_to_guid(id, &guid)) { shell_set_msg(sh, "Unparsable ID"); goto error; } fi = file_info_by_guid(&guid); if (NULL == fi) { shell_set_msg(sh, "Invalid ID"); goto error; } file_info_resume(fi); return REPLY_READY; error: return REPLY_ERROR; }
enum shell_reply shell_exec_set(struct gnutella_shell *sh, int argc, const char *argv[]) { const char *verbose; const option_t options[] = { { "v", &verbose }, }; property_t prop; int parsed; shell_check(sh); g_assert(argv); g_assert(argc > 0); parsed = shell_options_parse(sh, argv, options, G_N_ELEMENTS(options)); if (parsed < 0) return REPLY_ERROR; argv += parsed; /* args[0] is first command argument */ argc -= parsed; /* counts only command arguments now */ if (argc < 1) { shell_set_msg(sh, _("Property missing")); goto error; } prop = gnet_prop_get_by_name(argv[0]); if (prop == NO_PROP) { shell_set_msg(sh, _("Unknown property")); goto error; } if (argc < 2) { shell_set_msg(sh, _("Value missing")); goto error; } if (gnet_prop_is_internal(prop)) { shell_set_msg(sh, _("Property cannot be changed")); goto error; } if (verbose) { shell_write_linef(sh, REPLY_READY, _("Previous value was %s"), shell_property_to_string(prop)); } gnet_prop_set_from_string(prop, argv[1]); if (verbose) { shell_write_linef(sh, REPLY_READY, _("New value is %s"), shell_property_to_string(prop)); } shell_set_msg(sh, _("Value found and set")); return REPLY_READY; error: return REPLY_ERROR; }
enum shell_reply shell_exec_print(struct gnutella_shell *sh, int argc, const char *argv[]) { property_t prop; shell_check(sh); g_assert(argv); g_assert(argc > 0); if (argc < 2) { shell_set_msg(sh, _("Property missing")); goto error; } prop = gnet_prop_get_by_name(argv[1]); if (prop == NO_PROP) { char buf[120]; str_bprintf(buf, sizeof buf, _("Unknown property \"%s\""), argv[1]); shell_set_msg(sh, buf); goto error; } shell_write(sh, _("Value: ")); shell_write(sh, gnet_prop_to_typed_string(prop)); shell_write(sh, "\n"); shell_set_msg(sh, _("Value found and displayed")); return REPLY_READY; error: return REPLY_ERROR; }
/** * Handles the download command. */ enum shell_reply shell_exec_download(struct gnutella_shell *sh, int argc, const char *argv[]) { shell_check(sh); g_assert(argv); g_assert(argc > 0); if (argc < 2) goto error; #define CMD(name) G_STMT_START { \ if (0 == ascii_strcasecmp(argv[1], #name)) \ return shell_exec_download_ ## name(sh, argc, argv); \ } G_STMT_END CMD(abort); CMD(add); CMD(list); CMD(pause); CMD(resume); CMD(rename); CMD(show); #undef CMD shell_set_msg(sh, _("Unknown operation")); goto error; error: return REPLY_ERROR; }
enum shell_reply shell_exec_quit(struct gnutella_shell *sh, int argc, const char *argv[]) { shell_check(sh); g_assert(argv); g_assert(argc > 0); shell_set_msg(sh, _("Good bye")); shell_exit(sh); return REPLY_BYE; }
static enum shell_reply shell_exec_download_rename(struct gnutella_shell *sh, int argc, const char *argv[]) { fileinfo_t *fi; struct guid guid; const char *id, *filename; shell_check(sh); g_assert(argv); g_assert(argc > 0); if (argc != 4) { shell_set_msg(sh, "Invalid parameter count"); goto error; } id = argv[2]; filename = argv[3]; if (!hex_to_guid(id, &guid)) { shell_set_msg(sh, "Unparsable ID"); goto error; } fi = file_info_by_guid(&guid); if (NULL == fi) { shell_set_msg(sh, "Invalid ID"); goto error; } if (!file_info_rename(fi, filename)) { shell_set_msg(sh, "Renaming failed"); goto error; } return REPLY_READY; error: return REPLY_ERROR; }
static enum shell_reply shell_exec_download_add(struct gnutella_shell *sh, int argc, const char *argv[]) { const char *url; gboolean success; shell_check(sh); g_assert(argv); g_assert(argc > 0); if (argc < 3) { shell_set_msg(sh, _("URL missing")); goto error; } url = argv[2]; if (is_strcaseprefix(url, "http://")) { success = download_handle_http(url); } else if (is_strcaseprefix(url, "magnet:?")) { unsigned n_downloads, n_searches; n_downloads = download_handle_magnet(url); n_searches = search_handle_magnet(url); success = n_downloads > 0 || n_searches > 0; } else { success = FALSE; } if (!success) { shell_set_msg(sh, _("The download could not be created")); goto error; } shell_set_msg(sh, _("Download added")); return REPLY_READY; error: return REPLY_ERROR; }
/** * Displays all active downloads. */ enum shell_reply shell_exec_downloads(struct gnutella_shell *sh, int argc, const char *argv[]) { shell_check(sh); g_assert(argv); g_assert(argc > 0); shell_set_msg(sh, ""); shell_write(sh, "100~ \n"); file_info_foreach(print_download_info, sh); shell_write(sh, ".\n"); /* Terminate message body */ return REPLY_READY; }
/** * Displays all active uploads */ enum shell_reply shell_exec_uploads(struct gnutella_shell *sh, int argc, const char *argv[]) { const pslist_t *sl; pslist_t *sl_info; shell_check(sh); g_assert(argv); g_assert(argc > 0); shell_set_msg(sh, ""); shell_write(sh, "100~ \n"); sl_info = upload_get_info_list(); PSLIST_FOREACH(sl_info, sl) { print_upload_info(sh, sl->data); }
/** * Displays all connected nodes */ enum shell_reply shell_exec_nodes(struct gnutella_shell *sh, int argc, const char *argv[]) { const GSList *sl; shell_check(sh); g_assert(argv); g_assert(argc > 0); shell_set_msg(sh, ""); shell_write(sh, "100~ \n" "Node Port Flags CC Since Uptime User-Agent\n"); for (sl = node_all_nodes(); sl; sl = g_slist_next(sl)) { const struct gnutella_node *n = sl->data; print_node_info(sh, n); } shell_write(sh, ".\n"); /* Terminate message body */ return REPLY_READY; }
/** * Displays all connected nodes */ enum shell_reply shell_exec_nodes(struct gnutella_shell *sh, int argc, const char *argv[]) { const pslist_t *sl; shell_check(sh); g_assert(argv); g_assert(argc > 0); shell_set_msg(sh, ""); shell_write(sh, "100~ \n" "Node Flags CC Since Uptime User-Agent\n"); PSLIST_FOREACH(node_all_nodes(), sl) { const gnutella_node_t *n = sl->data; print_node_info(sh, n); } shell_write(sh, ".\n"); /* Terminate message body */ return REPLY_READY; }
/** * The "INTR" command. */ enum shell_reply shell_exec_intr(struct gnutella_shell *sh, int argc, const char *argv[]) { shell_check(sh); g_assert(argv); g_assert(argc > 0); if (shell_toggle_interactive(sh)) { /* * Special case: If INTR is the first command, we already sent a * welcome message. */ if (1 == shell_line_count(sh)) return REPLY_NONE; shell_set_msg(sh, _("Interactive mode turned on.")); } else { /* Always give them feedback on that command! */ shell_write(sh, "100 "); shell_write(sh, _("Interactive mode turned off.")); shell_write(sh, "\n"); } return REPLY_READY; }
static enum shell_reply shell_exec_download_show(struct gnutella_shell *sh, int argc, const char *argv[]) { fileinfo_t *fi; struct guid guid; const char *id, *property; gnet_fi_status_t status; gnet_fi_info_t *info; int i; shell_check(sh); g_assert(argv); g_assert(argc > 0); if (argc < 3) { shell_set_msg(sh, "parameter missing"); goto error; } id = argv[2]; if (!hex_to_guid(id, &guid)) { shell_set_msg(sh, "Unparsable ID"); goto error; } fi = file_info_by_guid(&guid); if (NULL == fi) { shell_set_msg(sh, "Invalid ID"); goto error; } info = guc_fi_get_info(fi->fi_handle); guc_fi_get_status(fi->fi_handle, &status); for (i = 3; i < argc; i++) { property = argv[i]; if (0 == strcmp(property, "id")) { show_property(sh, property, guid_to_string(info->guid)); } else if (0 == strcmp(property, "filename")) { show_property(sh, property, info->filename); } else if (0 == strcmp(property, "pathname")) { show_property(sh, property, fi->pathname); } else if (0 == strcmp(property, "size")) { show_property(sh, property, filesize_to_string(info->size)); } else if (0 == strcmp(property, "sha1")) { show_property(sh, property, info->sha1 ? sha1_to_urn_string(info->sha1) : ""); } else if (0 == strcmp(property, "tth")) { show_property(sh, property, info->tth ? tth_to_urn_string(info->tth) : ""); } else if (0 == strcmp(property, "bitprint")) { show_property(sh, property, (info->sha1 && info->tth) ? bitprint_to_urn_string(info->sha1, info->tth) : ""); } else if (0 == strcmp(property, "created")) { show_property(sh, property, info->created ? timestamp_to_string(info->created) : ""); } else if (0 == strcmp(property, "modified")) { show_property(sh, property, status.modified ? timestamp_to_string(status.modified) : ""); } else if (0 == strcmp(property, "downloaded")) { show_property(sh, property, filesize_to_string(status.done)); } else if (0 == strcmp(property, "uploaded")) { show_property(sh, property, uint64_to_string(status.uploaded)); } else if (0 == strcmp(property, "paused")) { show_property(sh, property, boolean_to_string(status.paused)); } else if (0 == strcmp(property, "seeding")) { show_property(sh, property, boolean_to_string(status.seeding)); } else if (0 == strcmp(property, "verifying")) { show_property(sh, property, boolean_to_string(status.verifying)); } else if (0 == strcmp(property, "finished")) { show_property(sh, property, boolean_to_string(status.finished)); } else if (0 == strcmp(property, "complete")) { show_property(sh, property, boolean_to_string(status.complete)); } else if (0 == strcmp(property, "magnet")) { char *magnet = file_info_build_magnet(fi->fi_handle); show_property(sh, property, EMPTY_STRING(magnet)); HFREE_NULL(magnet); } } guc_fi_free_info(info); return REPLY_READY; error: return REPLY_ERROR; }