From: Michael Tremer Date: Tue, 13 Aug 2024 17:18:05 +0000 (+0000) Subject: buildservice: Move daemon stuff to the daemon X-Git-Tag: 0.9.30~1211 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f52ac950a0ff11431fa730a1e3407fecfb6817c4;p=pakfire.git buildservice: Move daemon stuff to the daemon Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/buildservice.c b/src/libpakfire/buildservice.c index fe32f2ae6..35dd52c63 100644 --- a/src/libpakfire/buildservice.c +++ b/src/libpakfire/buildservice.c @@ -1016,17 +1016,11 @@ ERROR: return r; } -static int pakfire_buildservice_daemon_recv(struct pakfire_xfer* xfer, - const char* message, const size_t size, void* data) { - printf("%.*s\n", (int)size, message); - - return 0; -} - /* Called before the daemon's */ -int pakfire_buildservice_daemon(struct pakfire_buildservice* service) { +int pakfire_buildservice_daemon(struct pakfire_buildservice* service, pakfire_xfer_recv_callback recv, + pakfire_xfer_send_callback send, pakfire_xfer_close_callback close, void* data) { struct pakfire_xfer* xfer = NULL; char url[PATH_MAX]; int r; @@ -1047,7 +1041,7 @@ int pakfire_buildservice_daemon(struct pakfire_buildservice* service) { goto ERROR; // Make this a WebSocket connection - r = pakfire_xfer_socket(xfer, pakfire_buildservice_daemon_recv, NULL, NULL, service); + r = pakfire_xfer_socket(xfer, recv, send, close, data); if (r) goto ERROR; diff --git a/src/libpakfire/daemon.c b/src/libpakfire/daemon.c index 0b92b4b40..bb5c5d306 100644 --- a/src/libpakfire/daemon.c +++ b/src/libpakfire/daemon.c @@ -27,8 +27,7 @@ #include #include #include - -#define EPOLL_MAX_EVENTS 8 +#include struct pakfire_daemon { struct pakfire_ctx* ctx; @@ -147,6 +146,55 @@ struct pakfire_daemon* pakfire_daemon_unref(struct pakfire_daemon* daemon) { return NULL; } +/* + Called when a new job has been received +*/ +static int pakfire_daemon_job(struct pakfire_daemon* daemon, json_object* m) { + return 0; +} + +static int pakfire_daemon_recv(struct pakfire_xfer* xfer, + const char* message, const size_t size, void* data) { + struct pakfire_daemon* daemon = data; + struct json_object* type = NULL; + struct json_object* m = NULL; + int r; + + // Parse the JSON message + m = pakfire_json_parse(daemon->ctx, message, size); + if (!m) { + r = -errno; + goto ERROR; + } + + // Fetch the message type + if (!json_object_object_get_ex(m, "type", &type)) { + CTX_ERROR(daemon->ctx, "Invalid message with missing type\n"); + + return -EINVAL; + } + + // Fetch the type + const char* t = json_object_get_string(type); + + // Handle new jobs + if (strcmp(t, "job") == 0) { + r = pakfire_daemon_job(daemon, m); + + } else { + CTX_ERROR(daemon->ctx, "Unknown message. Ignoring:\n%s\n", + json_object_to_json_string_ext(m, JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY)); + + r = 0; + } + +ERROR: + if (m) + json_object_put(m); + + return r; +} + static int pakfire_daemon_loop(struct pakfire_daemon* daemon) { int r; @@ -175,7 +223,8 @@ int pakfire_daemon_main(struct pakfire_daemon* daemon) { int r; // Connect to the build service - r = pakfire_buildservice_daemon(daemon->service); + r = pakfire_buildservice_daemon(daemon->service, + pakfire_daemon_recv, NULL, NULL, daemon); if (r) return r; diff --git a/src/libpakfire/include/pakfire/buildservice.h b/src/libpakfire/include/pakfire/buildservice.h index 079a613f2..313991043 100644 --- a/src/libpakfire/include/pakfire/buildservice.h +++ b/src/libpakfire/include/pakfire/buildservice.h @@ -75,8 +75,15 @@ int pakfire_buildservice_submit_stats(struct pakfire_buildservice* service); int pakfire_buildservice_job_finished(struct pakfire_buildservice* service, const char* uuid, int success, const char* logfile, const char** packages); +#ifdef PAKFIRE_PRIVATE + +#include + // Daemon -int pakfire_buildservice_daemon(struct pakfire_buildservice* service); +int pakfire_buildservice_daemon(struct pakfire_buildservice* service, pakfire_xfer_recv_callback recv, + pakfire_xfer_send_callback send, pakfire_xfer_close_callback close, void* data); + +#endif /* PAKFIRE_PRIVATE */ #endif /* PAKFIRE_BUILDSERVICE_H */