static void print_node_info(struct gnutella_shell *sh, const struct gnutella_node *n) { gnet_node_flags_t flags; time_delta_t up, con; char buf[1024]; char vendor_escaped[50]; char uptime_buf[8]; char contime_buf[8]; g_return_if_fail(sh); g_return_if_fail(n); if (!node_fill_flags(NODE_ID(n), &flags)) return; con = n->connect_date ? delta_time(tm_time(), n->connect_date) : 0; up = n->up_date ? delta_time(tm_time(), n->up_date) : 0; { const char *vendor; char *escaped; vendor = node_vendor(n); escaped = hex_escape(vendor, TRUE); clamp_strcpy(vendor_escaped, sizeof vendor_escaped, escaped); if (escaped != vendor) { HFREE_NULL(escaped); } } clamp_strcpy(uptime_buf, sizeof uptime_buf, up > 0 ? compact_time(up) : "?"); clamp_strcpy(contime_buf, sizeof contime_buf, con > 0 ? compact_time(con) : "?"); gm_snprintf(buf, sizeof buf, "%-21.45s %5.1u %s %2.2s %6.6s %6.6s %.50s", node_addr(n), (unsigned) n->gnet_port, node_flags_to_string(&flags), iso3166_country_cc(n->country), contime_buf, uptime_buf, vendor_escaped); shell_write(sh, buf); shell_write(sh, "\n"); /* Terminate line */ }
/** * Copies user_callback and user_data from the query buffer to the * reply buffer. This function won't fail. However, if gethostbyname() * fails ``reply->addr'' will be set to zero. */ static void adns_gethostbyname(const struct adns_request *req, struct adns_response *ans) { g_assert(NULL != req); g_assert(NULL != ans); ans->common = req->common; if (req->common.reverse) { const struct adns_reverse_query *query = &req->query.reverse; struct adns_reverse_reply *reply = &ans->reply.reverse; const char *host; if (common_dbg > 1) { g_debug("%s: resolving \"%s\" ...", G_STRFUNC, host_addr_to_string(query->addr)); } reply->addr = query->addr; host = host_addr_to_name(query->addr); clamp_strcpy(reply->hostname, sizeof reply->hostname, host ? host : ""); } else { const struct adns_query *query = &req->query.by_addr; struct adns_reply *reply = &ans->reply.by_addr; GSList *sl_addr, *sl; size_t i = 0; if (common_dbg > 1) { g_debug("%s: resolving \"%s\" ...", G_STRFUNC, query->hostname); } clamp_strcpy(reply->hostname, sizeof reply->hostname, query->hostname); sl_addr = name_to_host_addr(query->hostname, query->net); for (sl = sl_addr; NULL != sl; sl = g_slist_next(sl)) { host_addr_t *addr = sl->data; g_assert(addr); if (i >= G_N_ELEMENTS(reply->addrs)) { break; } reply->addrs[i++] = *addr; } host_addr_free_list(&sl_addr); if (i < G_N_ELEMENTS(reply->addrs)) { reply->addrs[i] = zero_host_addr; } } }
/** * Get the full program path. * * @return a newly allocated string (through halloc()) that points to the * path of the program being run, NULL if we can't compute a suitable path. */ char * file_program_path(const char *argv0) { filestat_t buf; char *file = deconstify_char(argv0); char filepath[MAX_PATH_LEN + 1]; if (is_running_on_mingw() && !is_strsuffix(argv0, (size_t) -1, ".exe")) { concat_strings(filepath, sizeof filepath, argv0, ".exe", NULL_PTR); } else { clamp_strcpy(filepath, sizeof filepath, argv0); } if (-1 == stat(filepath, &buf)) { int saved_errno = errno; file = file_locate_from_path(argv0); if (NULL == file) { errno = saved_errno; s_warning("%s(): could not stat() \"%s\": %m", G_STRFUNC, filepath); return NULL; } } if (file != NULL && file != argv0) return file; /* Allocated by file_locate_from_path() */ return h_strdup(filepath); }
/** * Compute special folder path. * * @param which_folder the special folder token * @param path sub-path underneath the special folder * * @return halloc()'ed full path, NULL if special folder is unknown. */ char * get_folder_path(enum special_folder which_folder, const char *path) { char *pathname; size_t offset = 0; const char *special_path = NULL; special_path = (*get_folder_basepath_func)(which_folder); if (NULL == special_path) return NULL; pathname = halloc(MAX_PATH_LEN); offset = clamp_strcpy(pathname, MAX_PATH_LEN, special_path); /* * A special folder MUST be an absolute path. */ if (!is_absolute_path(pathname)) { s_error("special folder %s is not an absolute path: %s", special_folder_name(which_folder), pathname); } /* * If we have a sub-path underneath the special folder, append it at the * tail of the path we already figured. */ if (path != NULL) { /* Add directory separator if missing at the tail of the special path */ if (offset > 0 && pathname[offset - 1] != G_DIR_SEPARATOR) pathname[offset++] = G_DIR_SEPARATOR; clamp_strcpy(&pathname[offset], MAX_PATH_LEN - offset, path); } return pathname; }