From 2e27d0d955235680f8a62bf544441667bbb4e7cd Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 26 Jun 2025 13:12:22 +0000 Subject: [PATCH] client: Move sending a crash report here Signed-off-by: Michael Tremer --- src/pakfire/client.c | 52 ++++++++++++++++++++++++++++++++++++++++++++ src/pakfire/client.h | 6 +++++ src/pakfire/job.c | 48 ++++++---------------------------------- 3 files changed, 65 insertions(+), 41 deletions(-) diff --git a/src/pakfire/client.c b/src/pakfire/client.c index 7a1bc52a..0bc8847b 100644 --- a/src/pakfire/client.c +++ b/src/pakfire/client.c @@ -27,6 +27,7 @@ #include +#include #include #include #include @@ -1413,3 +1414,54 @@ ERROR: return r; } + +/* + This is called when a job has crashed. +*/ +int pakfire_client_job_crashed(struct pakfire_client* self, + const char* job_id, int signo, struct pakfire_buffer* log) { + struct json_object* request = NULL; + struct pakfire_xfer* xfer = NULL; + int r; + + // Create a new request object + r = pakfire_json_new_object(&request); + if (r < 0) + goto ERROR; + + // Add signal number + r = pakfire_json_add_int64(request, "signo", signo); + if (r < 0) + goto ERROR; + + // Optionally append the log + if (!pakfire_buffer_is_empty(log)) { + r = pakfire_json_add_bytes(request, "log", log->data, log->length); + if (r < 0) + goto ERROR; + } + + // Create a new transfer + r = pakfire_client_xfer_create(&xfer, self, "/api/v1/jobs/%s/crashed", job_id); + if (r < 0) + goto ERROR; + + // Enable authentication + r = pakfire_client_xfer_auth(self, xfer); + if (r < 0) + goto ERROR; + + // Set the request body + r = pakfire_xfer_set_json_payload(xfer, request); + if (r < 0) + goto ERROR; + + // Enqueue the transfer + r = pakfire_httpclient_enqueue(self->httpclient, xfer); + +ERROR: + if (xfer) + pakfire_xfer_unref(xfer); + + return r; +} diff --git a/src/pakfire/client.h b/src/pakfire/client.h index 2823a528..2ebd4cdc 100644 --- a/src/pakfire/client.h +++ b/src/pakfire/client.h @@ -25,6 +25,7 @@ struct pakfire_client; #include +#include #include #include #include @@ -109,4 +110,9 @@ int pakfire_client_create_repo(struct pakfire_client* client, int pakfire_client_delete_repo(struct pakfire_client* client, const char* distro, const char* name); +// Jobs + +int pakfire_client_job_crashed(struct pakfire_client* self, + const char* job_id, int signo, struct pakfire_buffer* log); + #endif /* PAKFIRE_CLIENT_H */ diff --git a/src/pakfire/job.c b/src/pakfire/job.c index d9b4edaa..9f4e541d 100644 --- a/src/pakfire/job.c +++ b/src/pakfire/job.c @@ -375,56 +375,22 @@ ERROR: return r; } -static int pakfire_job_crashed(struct pakfire_job* job, const siginfo_t* si) { - struct pakfire_xfer* xfer = NULL; +static int pakfire_job_crashed(struct pakfire_job* self, const siginfo_t* si) { + struct pakfire_buffer log = {}; int r; - struct pakfire_job_log { - char* data; - size_t length; - } log = {}; - - DEBUG(job->ctx, "Sending crash report...\n"); + DEBUG(self->ctx, "Sending crash report...\n"); // Dump the log - r = pakfire_log_buffer_dump(job->log.buffer, &log.data, &log.length); - if (r < 0) - goto ERROR; - - // Create a new transfer - r = pakfire_job_xfer_create(&xfer, job, "/api/v1/jobs/%s/crashed", job->id); - if (r < 0) - goto ERROR; - - // Enable authentication - r = pakfire_xfer_auth(xfer); - if (r) - goto ERROR; - - // Add the exit code - r = pakfire_xfer_add_param(xfer, "signo", "%d", si->si_status); + r = pakfire_log_buffer_dump(self->log.buffer, &log.data, &log.length); if (r < 0) goto ERROR; - // If we have a log, let's send the log, too - // XXX THIS IS NOT QUITE IDEAL BECAUSE THE LOG COULD CONTAIN NULL-CHARACTERS - // WE SHOULD IMPLEMENT THIS WITH CURL'S MIME CALLBACK FUNCTIONS - if (log.data) { - r = pakfire_xfer_add_param(xfer, "log", "%.*s", (int)log.length, log.data); - if (r < 0) - goto ERROR; - } - - // Send the request - r = pakfire_xfer_run_api_request(xfer, NULL, NULL); - if (r < 0) - goto ERROR; + // Send the report + r = pakfire_client_job_crashed(self->client, self->id, si->si_status, &log); ERROR: - if (xfer) - pakfire_xfer_unref(xfer); - if (log.data) - free(log.data); + pakfire_buffer_free(&log); return r; } -- 2.47.2