diff options
-rw-r--r-- | libdwfl/debuginfoserver-client.c | 87 | ||||
-rw-r--r-- | libdwfl/find-debuginfo.c | 2 |
2 files changed, 59 insertions, 30 deletions
diff --git a/libdwfl/debuginfoserver-client.c b/libdwfl/debuginfoserver-client.c index 7a0ed035..70be6d5a 100644 --- a/libdwfl/debuginfoserver-client.c +++ b/libdwfl/debuginfoserver-client.c @@ -1,58 +1,87 @@ #include <stdio.h> #include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <sys/syscall.h> #include <curl/curl.h> +const char *dbgserver_envvar = "DEBUGINFO_SERVER"; +const char *tmp_filename = "dbgserver_anon"; + int dbgserver_enabled (void) { - return getenv("DEBUGINFO_SERVER") != NULL; + return getenv(dbgserver_envvar) != NULL; } size_t -write_data (void *ptr, size_t size, size_t nmemb, FILE *file) +write_callback (char *ptr, size_t size, size_t nmemb, void *fdptr) { - // TODO - (void) ptr; - (void) size; - (void) nmemb; - (void) file; + int fd = *(int*)fdptr; + ssize_t res; + ssize_t count = size * nmemb; + + res = write(fd, (void*)ptr, count); + + if (res < 0) + return (size_t)0; - return (size_t)0; + return (size_t)res; } +/* TODO: handle errors with DWARF_E_*. */ int -dbgserver_find_debuginfo (const unsigned char *build_id, - int build_id_len) +dbgserver_find_debuginfo (const unsigned char *build_id, int build_id_len) { - (void) build_id; - (void) build_id_len; + int fd; + int url_len; + long respcode; + char *url; + char *url_base; + char idbuf[65]; + CURL *session; + CURLcode curl_res; - // TODO: build url using $DEBUGINFO_SERVER and build_id - char *url = "localhost:80/buildid/test"; - CURL *curl; - CURLcode res; - - // TODO: report errors - if (curl_global_init(CURL_GLOBAL_DEFAULT) != 0) + url_base = getenv(dbgserver_envvar); + if (url_base == NULL + || curl_global_init(CURL_GLOBAL_DEFAULT) != 0) return -1; - curl = curl_easy_init(); - if (!curl) + session = curl_easy_init(); + if (session == NULL) { curl_global_cleanup(); return -1; } - curl_easy_setopt(curl, CURLOPT_URL, url); - res = curl_easy_perform(curl); + /* copy hex representation of buildid into idbuf. */ + for (int i = 0; i < build_id_len; i++) + sprintf(idbuf + (i * 2), "%02x", build_id[i]); - if (res == CURLE_OK) - { - // TODO: check size and copy into buffer - } + /* url format: $DEBUGINFO_SERVER/buildid/HEXCODE/HEXCODE.debug */ + url_len = strlen(url_base) + strlen("/buildid/") + + build_id_len * 4 + strlen("/.debug") + 1; + + url = (char*)malloc(url_len); + if (url == NULL) + return -1; + + sprintf(url, "%s/buildid/%s/%s.debug", url_base, idbuf, idbuf); + + fd = syscall(__NR_memfd_create, tmp_filename, 0); + curl_easy_setopt(session, CURLOPT_URL, url); + curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(session, CURLOPT_WRITEDATA, (void*)&fd); + + curl_res = curl_easy_perform(session); + curl_easy_getinfo(session, CURLINFO_RESPONSE_CODE, &respcode); + curl_easy_cleanup(session); + curl_global_cleanup(); + free(url); - curl_easy_cleanup(curl); - curl_global_cleanup(); + if (curl_res == CURLE_OK && respcode == 200) + return fd; + close(fd); return -1; } diff --git a/libdwfl/find-debuginfo.c b/libdwfl/find-debuginfo.c index 6371c253..9e85a275 100644 --- a/libdwfl/find-debuginfo.c +++ b/libdwfl/find-debuginfo.c @@ -402,7 +402,7 @@ dwfl_standard_find_debuginfo (Dwfl_Module *mod, /* If all else fails and a build-id is available, query the debuginfo-server if enabled. */ if (fd < 0 && bits_len > 0 && dbgserver_enabled()) - dbgserver_find_debuginfo(bits, bits_len); + fd = dbgserver_find_debuginfo(bits, bits_len); return fd; } |