summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdwfl/debuginfoserver-client.c87
-rw-r--r--libdwfl/find-debuginfo.c2
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;
}