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;
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;
#include <pakfire/buildservice.h>
#include <pakfire/ctx.h>
#include <pakfire/daemon.h>
-
-#define EPOLL_MAX_EVENTS 8
+#include <pakfire/util.h>
struct pakfire_daemon {
struct pakfire_ctx* ctx;
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;
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;
int pakfire_buildservice_job_finished(struct pakfire_buildservice* service,
const char* uuid, int success, const char* logfile, const char** packages);
+#ifdef PAKFIRE_PRIVATE
+
+#include <pakfire/xfer.h>
+
// 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 */