summaryrefslogtreecommitdiffstats
path: root/lib/libalpm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libalpm')
-rw-r--r--lib/libalpm/alpm.h73
-rw-r--r--lib/libalpm/dload.c11
-rw-r--r--lib/libalpm/handle.c54
-rw-r--r--lib/libalpm/handle.h12
-rw-r--r--lib/libalpm/log.c2
5 files changed, 124 insertions, 28 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 2e99d4d8..65b8e2fb 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -971,8 +971,9 @@ typedef union _alpm_event_t {
/** Event callback.
*
* Called when an event occurs
+ * @param ctx user-provided context
* @param event the event that occurred */
-typedef void (*alpm_cb_event)(alpm_event_t *);
+typedef void (*alpm_cb_event)(void *ctx, alpm_event_t *);
/**
* Type of question.
@@ -1114,9 +1115,10 @@ typedef union _alpm_question_t {
/** Question callback.
*
* This callback allows user to give input and decide what to do during certain events
+ * @param ctx user-provided context
* @param question the question being asked.
*/
-typedef void (*alpm_cb_question)(alpm_question_t *);
+typedef void (*alpm_cb_question)(void *ctx, alpm_question_t *);
/** An enum over different kinds of progress alerts. */
typedef enum _alpm_progress_t {
@@ -1147,6 +1149,7 @@ typedef enum _alpm_progress_t {
* Alert the front end about the progress of certain events.
* Allows the implementation of loading bars for events that
* make take a while to complete.
+ * @param ctx user-provided context
* @param progress the kind of event that is progressing
* @param pkg for package operations, the name of the package being operated on
* @param percent the percent completion of the action
@@ -1154,7 +1157,7 @@ typedef enum _alpm_progress_t {
* @param current the current amount of items completed
*/
/** Progress callback */
-typedef void (*alpm_cb_progress)(alpm_progress_t progress, const char *pkg,
+typedef void (*alpm_cb_progress)(void *ctx, alpm_progress_t progress, const char *pkg,
int percent, size_t howmany, size_t current);
/*
@@ -1201,22 +1204,24 @@ typedef struct _alpm_download_event_completed_t {
} alpm_download_event_completed_t;
/** Type of download progress callbacks.
+ * @param ctx user-provided context
* @param filename the name of the file being downloaded
* @param event the event type
* @param data the event data of type alpm_download_event_*_t
*/
-typedef void (*alpm_cb_download)(const char *filename,
+typedef void (*alpm_cb_download)(void *ctx, const char *filename,
alpm_download_event_type_t event, void *data);
/** A callback for downloading files
+ * @param ctx user-provided context
* @param url the URL of the file to be downloaded
* @param localpath the directory to which the file should be downloaded
* @param force whether to force an update, even if the file is the same
* @return 0 on success, 1 if the file exists and is identical, -1 on
* error.
*/
-typedef int (*alpm_cb_fetch)(const char *url, const char *localpath,
+typedef int (*alpm_cb_fetch)(void *ctx, const char *url, const char *localpath,
int force);
/* End of libalpm_cb */
@@ -1464,11 +1469,12 @@ typedef enum _alpm_loglevel_t {
* libalpm will call this function whenever something is to be logged.
* many libalpm will produce log output. Additionally any calls to \link alpm_logaction
* \endlink will also call this callback.
+ * @param ctx user-provided context
* @param level the currently set loglevel
* @param fmt the printf like format string
* @param args printf like arguments
*/
-typedef void (*alpm_cb_log)(alpm_loglevel_t level, const char *fmt, va_list args);
+typedef void (*alpm_cb_log)(void *ctx, alpm_loglevel_t level, const char *fmt, va_list args);
/** A printf-like function for logging.
* @param handle the context handle
@@ -1498,12 +1504,19 @@ int alpm_logaction(alpm_handle_t *handle, const char *prefix,
*/
alpm_cb_log alpm_option_get_logcb(alpm_handle_t *handle);
+/** Returns the callback used for logging.
+ * @param handle the context handle
+ * @return the currently set log callback context
+ */
+void *alpm_option_get_logcb_ctx(alpm_handle_t *handle);
+
/** Sets the callback used for logging.
* @param handle the context handle
* @param cb the cb to use
+ * @param ctx user-provided context to pass to cb
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
-int alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb);
+int alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb, void *ctx);
/** Returns the callback used to report download progress.
* @param handle the context handle
@@ -1511,12 +1524,19 @@ int alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb);
*/
alpm_cb_download alpm_option_get_dlcb(alpm_handle_t *handle);
+/** Returns the callback used to report download progress.
+ * @param handle the context handle
+ * @return the currently set download callback context
+ */
+void *alpm_option_get_dlcb_ctx(alpm_handle_t *handle);
+
/** Sets the callback used to report download progress.
* @param handle the context handle
* @param cb the cb to use
+ * @param ctx user-provided context to pass to cb
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
-int alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb);
+int alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb, void *ctx);
/** Returns the downloading callback.
* @param handle the context handle
@@ -1524,12 +1544,19 @@ int alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb);
*/
alpm_cb_fetch alpm_option_get_fetchcb(alpm_handle_t *handle);
+/** Returns the downloading callback.
+ * @param handle the context handle
+ * @return the currently set fetch callback context
+ */
+void *alpm_option_get_fetchcb_ctx(alpm_handle_t *handle);
+
/** Sets the downloading callback.
* @param handle the context handle
* @param cb the cb to use
+ * @param ctx user-provided context to pass to cb
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
-int alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb);
+int alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb, void *ctx);
/** Returns the callback used for events.
* @param handle the context handle
@@ -1537,12 +1564,19 @@ int alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb);
*/
alpm_cb_event alpm_option_get_eventcb(alpm_handle_t *handle);
+/** Returns the callback used for events.
+ * @param handle the context handle
+ * @return the currently set event callback context
+ */
+void *alpm_option_get_eventcb_ctx(alpm_handle_t *handle);
+
/** Sets the callback used for events.
* @param handle the context handle
* @param cb the cb to use
+ * @param ctx user-provided context to pass to cb
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
-int alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb);
+int alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb, void *ctx);
/** Returns the callback used for questions.
* @param handle the context handle
@@ -1550,13 +1584,19 @@ int alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb);
*/
alpm_cb_question alpm_option_get_questioncb(alpm_handle_t *handle);
+/** Returns the callback used for questions.
+ * @param handle the context handle
+ * @return the currently set question callback context
+ */
+void *alpm_option_get_questioncb_ctx(alpm_handle_t *handle);
+
/** Sets the callback used for questions.
* @param handle the context handle
* @param cb the cb to use
+ * @param ctx user-provided context to pass to cb
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
-int alpm_option_set_questioncb(alpm_handle_t *handle, alpm_cb_question cb);
-
+int alpm_option_set_questioncb(alpm_handle_t *handle, alpm_cb_question cb, void *ctx);
/**Returns the callback used for operation progress.
* @param handle the context handle
@@ -1564,12 +1604,19 @@ int alpm_option_set_questioncb(alpm_handle_t *handle, alpm_cb_question cb);
*/
alpm_cb_progress alpm_option_get_progresscb(alpm_handle_t *handle);
+/**Returns the callback used for operation progress.
+ * @param handle the context handle
+ * @return the currently set progress callback context
+ */
+void *alpm_option_get_progresscb_ctx(alpm_handle_t *handle);
+
/** Sets the callback used for operation progress.
* @param handle the context handle
* @param cb the cb to use
+ * @param ctx user-provided context to pass to cb
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
-int alpm_option_set_progresscb(alpm_handle_t *handle, alpm_cb_progress cb);
+int alpm_option_set_progresscb(alpm_handle_t *handle, alpm_cb_progress cb, void *ctx);
/* End of callback accessors */
/** @} */
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index a4c42f8d..70ec318a 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -209,7 +209,8 @@ static int dload_progress_cb(void *file, curl_off_t dltotal, curl_off_t dlnow,
* download_size (nor included in the total download size callback) */
cb_data.total = dltotal;
cb_data.downloaded = dlnow;
- payload->handle->dlcb(payload->remote_name, ALPM_DOWNLOAD_PROGRESS, &cb_data);
+ payload->handle->dlcb(payload->handle->dlcb_ctx,
+ payload->remote_name, ALPM_DOWNLOAD_PROGRESS, &cb_data);
payload->prevprogress = current_size;
return 0;
@@ -672,7 +673,7 @@ cleanup:
alpm_download_event_completed_t cb_data = {0};
cb_data.total = bytes_dl;
cb_data.result = ret;
- handle->dlcb(payload->remote_name, ALPM_DOWNLOAD_COMPLETED, &cb_data);
+ handle->dlcb(handle->dlcb_ctx, payload->remote_name, ALPM_DOWNLOAD_COMPLETED, &cb_data);
}
curl_multi_remove_handle(curlm, curl);
@@ -806,7 +807,7 @@ static int curl_download_internal(alpm_handle_t *handle,
if(curl_add_payload(handle, curlm, payload, localpath) == 0) {
if(handle->dlcb && !payload->signature) {
alpm_download_event_init_t cb_data = {.optional = payload->errors_ok};
- handle->dlcb(payload->remote_name, ALPM_DOWNLOAD_INIT, &cb_data);
+ handle->dlcb(handle->dlcb_ctx, payload->remote_name, ALPM_DOWNLOAD_INIT, &cb_data);
}
payloads = payloads->next;
@@ -877,7 +878,7 @@ int _alpm_download(alpm_handle_t *handle,
int success = 0;
if(payload->fileurl) {
- if (handle->fetchcb(payload->fileurl, localpath, payload->force) != -1) {
+ if (handle->fetchcb(handle->fetchcb_ctx, payload->fileurl, localpath, payload->force) != -1) {
success = 1;
break;
}
@@ -891,7 +892,7 @@ int _alpm_download(alpm_handle_t *handle,
MALLOC(fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
snprintf(fileurl, len, "%s/%s", server, payload->filepath);
- ret = handle->fetchcb(fileurl, localpath, payload->force);
+ ret = handle->fetchcb(handle->fetchcb_ctx, fileurl, localpath, payload->force);
free(fileurl);
if (ret != -1) {
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index 46224a25..e6b683cb 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -162,36 +162,72 @@ alpm_cb_log SYMEXPORT alpm_option_get_logcb(alpm_handle_t *handle)
return handle->logcb;
}
+void SYMEXPORT *alpm_option_get_logcb_ctx(alpm_handle_t *handle)
+{
+ CHECK_HANDLE(handle, return NULL);
+ return handle->logcb_ctx;
+}
+
alpm_cb_download SYMEXPORT alpm_option_get_dlcb(alpm_handle_t *handle)
{
CHECK_HANDLE(handle, return NULL);
return handle->dlcb;
}
+void SYMEXPORT *alpm_option_get_dlcb_ctx(alpm_handle_t *handle)
+{
+ CHECK_HANDLE(handle, return NULL);
+ return handle->dlcb_ctx;
+}
+
alpm_cb_fetch SYMEXPORT alpm_option_get_fetchcb(alpm_handle_t *handle)
{
CHECK_HANDLE(handle, return NULL);
return handle->fetchcb;
}
+void SYMEXPORT *alpm_option_get_fetchcb_ctx(alpm_handle_t *handle)
+{
+ CHECK_HANDLE(handle, return NULL);
+ return handle->fetchcb_ctx;
+}
+
alpm_cb_event SYMEXPORT alpm_option_get_eventcb(alpm_handle_t *handle)
{
CHECK_HANDLE(handle, return NULL);
return handle->eventcb;
}
+void SYMEXPORT *alpm_option_get_eventcb_ctx(alpm_handle_t *handle)
+{
+ CHECK_HANDLE(handle, return NULL);
+ return handle->eventcb_ctx;
+}
+
alpm_cb_question SYMEXPORT alpm_option_get_questioncb(alpm_handle_t *handle)
{
CHECK_HANDLE(handle, return NULL);
return handle->questioncb;
}
+void SYMEXPORT *alpm_option_get_questioncb_ctx(alpm_handle_t *handle)
+{
+ CHECK_HANDLE(handle, return NULL);
+ return handle->questioncb_ctx;
+}
+
alpm_cb_progress SYMEXPORT alpm_option_get_progresscb(alpm_handle_t *handle)
{
CHECK_HANDLE(handle, return NULL);
return handle->progresscb;
}
+void SYMEXPORT *alpm_option_get_progresscb_ctx(alpm_handle_t *handle)
+{
+ CHECK_HANDLE(handle, return NULL);
+ return handle->progresscb_ctx;
+}
+
const char SYMEXPORT *alpm_option_get_root(alpm_handle_t *handle)
{
CHECK_HANDLE(handle, return NULL);
@@ -300,45 +336,51 @@ int SYMEXPORT alpm_option_get_parallel_downloads(alpm_handle_t *handle)
return handle->parallel_downloads;
}
-int SYMEXPORT alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb)
+int SYMEXPORT alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb, void *ctx)
{
CHECK_HANDLE(handle, return -1);
handle->logcb = cb;
+ handle->logcb_ctx = ctx;
return 0;
}
-int SYMEXPORT alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb)
+int SYMEXPORT alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb, void *ctx)
{
CHECK_HANDLE(handle, return -1);
handle->dlcb = cb;
+ handle->dlcb_ctx = ctx;
return 0;
}
-int SYMEXPORT alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb)
+int SYMEXPORT alpm_option_set_fetchcb(alpm_handle_t *handle, alpm_cb_fetch cb, void *ctx)
{
CHECK_HANDLE(handle, return -1);
handle->fetchcb = cb;
+ handle->fetchcb_ctx = ctx;
return 0;
}
-int SYMEXPORT alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb)
+int SYMEXPORT alpm_option_set_eventcb(alpm_handle_t *handle, alpm_cb_event cb, void *ctx)
{
CHECK_HANDLE(handle, return -1);
handle->eventcb = cb;
+ handle->eventcb_ctx = ctx;
return 0;
}
-int SYMEXPORT alpm_option_set_questioncb(alpm_handle_t *handle, alpm_cb_question cb)
+int SYMEXPORT alpm_option_set_questioncb(alpm_handle_t *handle, alpm_cb_question cb, void *ctx)
{
CHECK_HANDLE(handle, return -1);
handle->questioncb = cb;
+ handle->questioncb_ctx = ctx;
return 0;
}
-int SYMEXPORT alpm_option_set_progresscb(alpm_handle_t *handle, alpm_cb_progress cb)
+int SYMEXPORT alpm_option_set_progresscb(alpm_handle_t *handle, alpm_cb_progress cb, void *ctx)
{
CHECK_HANDLE(handle, return -1);
handle->progresscb = cb;
+ handle->progresscb_ctx = ctx;
return 0;
}
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index 52dc2125..b1526c67 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -34,19 +34,19 @@
#define EVENT(h, e) \
do { \
if((h)->eventcb) { \
- (h)->eventcb((alpm_event_t *) (e)); \
+ (h)->eventcb((h)->eventcb_ctx, (alpm_event_t *) (e)); \
} \
} while(0)
#define QUESTION(h, q) \
do { \
if((h)->questioncb) { \
- (h)->questioncb((alpm_question_t *) (q)); \
+ (h)->questioncb((h)->questioncb_ctx, (alpm_question_t *) (q)); \
} \
} while(0)
#define PROGRESS(h, e, p, per, n, r) \
do { \
if((h)->progresscb) { \
- (h)->progresscb(e, p, per, n, r); \
+ (h)->progresscb((h)->progresscb_ctx, e, p, per, n, r); \
} \
} while(0)
@@ -72,11 +72,17 @@ struct __alpm_handle_t {
/* callback functions */
alpm_cb_log logcb; /* Log callback function */
+ void *logcb_ctx;
alpm_cb_download dlcb; /* Download callback function */
+ void *dlcb_ctx;
alpm_cb_fetch fetchcb; /* Download file callback function */
+ void *fetchcb_ctx;
alpm_cb_event eventcb;
+ void *eventcb_ctx;
alpm_cb_question questioncb;
+ void *questioncb_ctx;
alpm_cb_progress progresscb;
+ void *progresscb_ctx;
/* filesystem paths */
char *root; /* Root path, default '/' */
diff --git a/lib/libalpm/log.c b/lib/libalpm/log.c
index 4c781ea2..c4d291cb 100644
--- a/lib/libalpm/log.c
+++ b/lib/libalpm/log.c
@@ -107,6 +107,6 @@ void _alpm_log(alpm_handle_t *handle, alpm_loglevel_t flag, const char *fmt, ...
}
va_start(args, fmt);
- handle->logcb(flag, fmt, args);
+ handle->logcb(handle->logcb_ctx, flag, fmt, args);
va_end(args);
}