Skip to content

Commit

Permalink
CMakeLists.txt: added linker for GIO
Browse files Browse the repository at this point in the history
handle.h: added option for LRO_NETWORK_WAIT and a helper function for handling netowork wait
handle.c: Added callback function required for GMainEventLoop and functionality for option
handle-py.c: Added the case for LRO_NETWORK_WAIT

Adds API support for waiting on network:
This waits for clients network interfaces till the specified time.
lr_handle_setopt(priv->repo_handle, error, LRO_NETWORK_WAIT, seconds)
This parses metalinkurl/baseurl and polls g_network_monitor_can_reach() in an event driven
manner with the help of GMainEventLoop.
  • Loading branch information
RishabhSaini committed Aug 31, 2022
1 parent 66d4f81 commit 2541042
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 1 deletion.
1 change: 1 addition & 0 deletions librepo/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ TARGET_LINK_LIBRARIES(librepo
${LIBCRYPTO_LIBRARIES}
${GPGME_VANILLA_LIBRARIES}
${GLIB2_LIBRARIES}
${GIO2_LIBRARIES}
)
IF (WITH_ZCHUNK)
TARGET_LINK_LIBRARIES(librepo ${ZCHUNKLIB_LIBRARIES})
Expand Down
78 changes: 77 additions & 1 deletion librepo/handle.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <gio/gio.h>


#include "handle_internal.h"
Expand Down Expand Up @@ -264,6 +266,26 @@ lr_handle_remote_sources_changed(LrHandle *handle, LrChangedRemoteSource type)
}
}

struct callback_data {
GMainLoop *loop;
long input_seconds;
time_t begin;
GNetworkMonitor *monitor;
GSocketConnectable *connectable;
GCancellable *cancellable;
};

gboolean timeout_callback(gpointer data)
{
struct callback_data *dt = (struct callback_data*)data;
if(!g_network_monitor_can_reach(dt->monitor, dt->connectable, dt->cancellable, NULL) &&
time(NULL) - dt->begin <= dt->input_seconds){
return TRUE;
}
g_main_loop_quit(dt->loop);
return FALSE;
}

gboolean
lr_handle_setopt(LrHandle *handle,
GError **err,
Expand Down Expand Up @@ -812,6 +834,10 @@ lr_handle_setopt(LrHandle *handle,
c_rc = curl_easy_setopt(c_h, CURLOPT_FILETIME, handle->preservetime);
break;

case LRO_NETWORK_WAIT:
assert(lr_handle_network_wait(handle, err, va_arg(arg, long)));
break;

default:
g_set_error(err, LR_HANDLE_ERROR, LRE_BADOPTARG,
"Unknown option");
Expand Down Expand Up @@ -841,7 +867,57 @@ lr_handle_setopt(LrHandle *handle,
return ret;
}

static gboolean
gboolean
lr_handle_network_wait(LrHandle *handle, GError **err, guint seconds)
{

assert(!err || *err == NULL);

if (!handle) {
g_set_error(err, LR_HANDLE_ERROR, LRE_BADFUNCARG,
"No handle specified");
return FALSE;
}

GNetworkMonitor *monitor = g_network_monitor_get_default();
GCancellable *cancellable = g_cancellable_new ();

struct callback_data data_struct;
data_struct.input_seconds = seconds;
data_struct.begin = time(NULL);
data_struct.cancellable = cancellable;
data_struct.monitor = monitor;

gchar *baseurl;
if(handle->metalinkurl)
baseurl = handle->metalinkurl;
else if(handle->mirrorlisturl)
baseurl = handle->mirrorlisturl;
else if(handle->urls)
baseurl = handle->urls[0];
assert(baseurl);

GUri *uri = g_uri_parse(baseurl, G_URI_FLAGS_NONE, NULL);
if(uri == NULL){
return FALSE;
}
const gchar* host = g_uri_get_host(uri);
guint16 port = g_uri_get_port(uri);
GSocketConnectable *connectable = g_network_address_new(host, port);
data_struct.connectable = connectable;
GMainLoop *loop;
loop = g_main_loop_new(NULL, FALSE);
data_struct.loop = loop;
g_timeout_add(200, timeout_callback, &data_struct);
g_main_loop_run(loop);
g_main_loop_unref(loop);

//Check for handle->metalinkurl and handle->mirrorlisturl

return TRUE;
}

gboolean
lr_handle_prepare_urls(LrHandle *handle, GError **err)
{
assert(!handle->urls_mirrors);
Expand Down
7 changes: 7 additions & 0 deletions librepo/handle.h
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,9 @@ typedef enum {

LRO_SENTINEL, /*!< Sentinel */

LRO_NETWORK_WAIT, /*!< (long)
This option waits time t until the baseurl is reachable.*/

} LrHandleOption; /*!< Handle config options */

/** Handle options for the ::lr_handle_getinfo function. */
Expand Down Expand Up @@ -560,6 +563,10 @@ lr_handle_getinfo(LrHandle *handle,
gboolean
lr_handle_perform(LrHandle *handle, LrResult *result, GError **err);


gboolean
lr_handle_network_wait(LrHandle *handle, GError **err, guint seconds);

/** @} */

G_END_DECLS
Expand Down
1 change: 1 addition & 0 deletions librepo/python/handle-py.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,7 @@ py_setopt(_HandleObject *self, PyObject *args)
case LRO_MAXDOWNLOADSPERMIRROR:
case LRO_HTTPAUTHMETHODS:
case LRO_PROXYAUTHMETHODS:
case LRO_NETWORK_WAIT:
{
long d;

Expand Down

0 comments on commit 2541042

Please sign in to comment.