# ------------------------------------------------------------------------------
+if CURL_HAS_WEBSOCKETS
bin_PROGRAMS += \
pakfire-daemon
+endif
-pakfire_daemon_SOURCES = \
+dist_pakfire_daemon_SOURCES = \
src/cli/pakfire-daemon.c
pakfire_daemon_CPPFLAGS = \
AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
AM_CONDITIONAL(HAVE_SYSTEMD, [test -n "$with_systemdsystemunitdir"])
+# Check if cURL has support for WebSockets
+AC_CHECK_PROG(CURL_CONFIG, curl-config, curl-config)
+if test "$CURL_CONFIG" != ""; then
+ # Check curl version
+ CURL_VERSION=$($CURL_CONFIG --version)
+
+ # Check for WebSocket support
+ AC_MSG_CHECKING([for curl WebSocket support])
+ CURL_FEATURES=$($CURL_CONFIG --features)
+
+ if echo "$CURL_FEATURES" | grep -q "websockets"; then
+ AC_MSG_RESULT([yes])
+ CURL_HAS_WEBSOCKETS=yes
+ else
+ AC_MSG_RESULT([no])
+ CURL_HAS_WEBSOCKETS=no
+ fi
+else
+ AC_MSG_ERROR([curl-config not found])
+fi
+
+# Set up a variable for later use
+AC_SUBST(CURL_HAS_WEBSOCKETS)
+AM_CONDITIONAL(CURL_HAS_WEBSOCKETS, [test "x$CURL_HAS_WEBSOCKETS" = "xyes"])
+
AC_DEFINE_UNQUOTED([PAKFIRE_CONFIG_DIR], ["${sysconfdir}/${PACKAGE_NAME}"],
[The path where Pakfire stores configuration files])
AC_DEFINE_UNQUOTED([PAKFIRE_CACHE_DIR], ["/var/cache/${PACKAGE_NAME}"],
# #
#############################################################################*/
+#ifdef CURL_HAS_WEBSOCKETS
+
#include <pakfire/ctx.h>
#include <pakfire/daemon.h>
return r;
}
+
+#endif /* CURL_HAS_WEBSOCKETS */
#ifndef PAKFIRE_CLI_DAEMON_H
#define PAKFIRE_CLI_DAEMON_H
+#ifdef CURL_HAS_WEBSOCKETS
+
#include <pakfire/ctx.h>
int cli_daemon_main(struct pakfire_ctx* ctx);
+#endif /* CURL_HAS_WEBSOCKETS */
#endif /* PAKFIRE_CLI_DAEMON_H */
# #
#############################################################################*/
+#ifdef CURL_HAS_WEBSOCKETS
+
#include <errno.h>
#include <stdlib.h>
return 0;
}
+
+#endif /* CURL_HAS_WEBSOCKETS */
#define PAKFIRE_DAEMON_H
#ifdef PAKFIRE_PRIVATE
+#ifdef CURL_HAS_WEBSOCKETS
struct pakfire_daemon;
int pakfire_daemon_job_finished(struct pakfire_daemon* daemon, struct pakfire_job* job);
+#endif /* CURL_HAS_WEBSOCKETS */
#endif /* PAKFIRE_PRIVATE */
#endif /* PAKFIRE_DAEMON_H */
#define PAKFIRE_JOB_H
#ifdef PAKFIRE_PRIVATE
+#ifdef CURL_HAS_WEBSOCKETS
#include <pakfire/ctx.h>
#include <pakfire/daemon.h>
int pakfire_job_exited(sd_event_source* s, const siginfo_t* si, void* data);
+#endif /* CURL_HAS_WEBSOCKETS */
#endif /* PAKFIRE_PRIVATE */
#endif /* PAKFIRE_JOB_H */
struct pakfire_xfer* xfer, struct json_object** response);
// WebSocket
+#ifdef CURL_HAS_WEBSOCKETS
typedef int (*pakfire_xfer_open_callback)(struct pakfire_xfer* xfer, void* data);
typedef int (*pakfire_xfer_recv_callback)(struct pakfire_xfer* xfer, const char* message, const size_t size, void* data);
typedef int (*pakfire_xfer_send_callback)(struct pakfire_xfer* xfer, void* data);
pakfire_xfer_recv_callback recv, pakfire_xfer_send_callback send, pakfire_xfer_close_callback close, void* data);
int pakfire_xfer_send_message(struct pakfire_xfer* xfer, const char* message, const size_t length);
+#endif /* CURL_HAS_WEBSOCKETS */
#endif /* PAKFIRE_PRIVATE */
#endif /* PAKFIRE_XFER_H */
# #
#############################################################################*/
+#ifdef CURL_HAS_WEBSOCKETS
+
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
return 0;
}
+
+#endif /* CURL_HAS_WEBSOCKETS */
enum {
PAKFIRE_XFER_DOWNLOAD = 0,
PAKFIRE_XFER_UPLOAD = 1,
+#ifdef CURL_HAS_WEBSOCKETS
PAKFIRE_XFER_SOCKET = 2,
+#endif /* CURL_HAS_WEBSOCKETS */
} direction;
// Size
// Event Loop
sd_event_source* event;
+#ifdef CURL_HAS_WEBSOCKETS
// Callbacks
struct pakfire_xfer_callbacks {
pakfire_xfer_open_callback open;
char* data;
size_t size;
} buffer;
+#endif /* CURL_HAS_WEBSOCKETS */
};
static void pakfire_xfer_free(struct pakfire_xfer* xfer) {
if (xfer->event)
sd_event_source_unref(xfer->event);
+#ifdef CURL_HAS_WEBSOCKETS
// Buffer
if (xfer->buffer.data)
free(xfer->buffer.data);
+#endif /* CURL_HAS_WEBSOCKETS */
// cURL stuff
if (xfer->handle)
return -EAGAIN;
}
+#ifdef CURL_HAS_WEBSOCKETS
// Call the close callback for WebSockets
if (xfer->direction == PAKFIRE_XFER_SOCKET) {
if (xfer->callbacks.close) {
return r;
}
}
+#endif /* CURL_HAS_WEBSOCKETS */
return code;
}
return "unknown";
}
+#ifdef CURL_HAS_WEBSOCKETS
static int pakfire_xfer_allocate(struct pakfire_xfer* xfer, size_t size) {
// Otherwise, we resize the buffer
return r;
}
+#endif /* CURL_HAS_WEBSOCKETS */
static int pakfire_xfer_save(struct pakfire_xfer* xfer) {
int r;
goto ERROR;
break;
+#ifdef CURL_HAS_WEBSOCKETS
case PAKFIRE_XFER_SOCKET:
return pakfire_xfer_done_socket(xfer, code);
+#endif /* CURL_HAS_WEBSOCKETS */
default:
break;
xfer->xferred = ulnow;
break;
+#ifdef CURL_HAS_WEBSOCKETS
case PAKFIRE_XFER_SOCKET:
break;
+#endif /* CURL_HAS_WEBSOCKETS */
}
// Do nothing if no progress indicator has been set up
goto ERROR;
}
+#ifdef CURL_HAS_WEBSOCKETS
// Replace the schema if we are using SOCKET
if (xfer->direction == PAKFIRE_XFER_SOCKET) {
r = curl_url_set(xfer->fullurl, CURLUPART_SCHEME, "wss", 0);
goto ERROR;
}
}
+#endif /* CURL_HAS_WEBSOCKETS */
// Set the URL
r = curl_easy_setopt(xfer->handle, CURLOPT_CURLU, xfer->fullurl);
xfer->headers = curl_slist_append(xfer->headers, "Transfer-Encoding: chunked");
break;
+#ifdef CURL_HAS_WEBSOCKETS
case PAKFIRE_XFER_SOCKET:
// Ask cURL to connect and let us handle the rest
r = curl_easy_setopt(xfer->handle, CURLOPT_CONNECT_ONLY, 2L);
}
break;
+#endif /* CURL_HAS_WEBSOCKETS */
}
// Compose the URL
return 0;
}
+#ifdef CURL_HAS_WEBSOCKETS
int pakfire_xfer_socket(struct pakfire_xfer* xfer, pakfire_xfer_open_callback open,
pakfire_xfer_recv_callback recv, pakfire_xfer_send_callback send,
pakfire_xfer_close_callback close, void* data) {
return 0;
}
+#endif /* CURL_HAS_WEBSOCKETS */
pakfire_xfer_error_code_t pakfire_xfer_run(struct pakfire_xfer* xfer, int flags) {
int r;