Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Cancellation support for the "pkg update" path.
Gleb Popov committed 2 years ago
commit e686c3ff0b10b9fd0e0e0771f605b5745408b0ae
parent d187ac0
5 files changed +19 -14
modified libpkg/fetch_libcurl.c
@@ -1,5 +1,7 @@
/*-
 * Copyright (c) 2023 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2023 Serenity Cyber Security, LLC
+
 *                    Author: Gleb Popov <arrowd@FreeBSD.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
@@ -166,12 +168,13 @@ curl_do_fetch(struct curl_userdata *data, CURL *cl, struct curl_repodata *cr)

	while ((msg = curl_multi_info_read(cr->cm, &msg_left))) {
		if (msg->msg == CURLMSG_DONE) {
+
			if (msg->data.result == CURLE_ABORTED_BY_CALLBACK)
+
				return (-1); // FIXME: more clear return code?
			CURL *eh = msg->easy_handle;
			long rc = 0;
			curl_easy_getinfo(eh, CURLINFO_RESPONSE_CODE, &rc);
			return (rc);
		}
-

	}
	return (0);
}
@@ -257,7 +260,7 @@ curl_parseheader_cb(void *ptr __unused, size_t size, size_t nmemb, void *userdat
	return (size *nmemb);
}

-
static size_t
+
static int
curl_progress_cb(void *userdata, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal __unused, curl_off_t ulnow __unused)
{
	struct curl_userdata *d = (struct curl_userdata *)userdata;
@@ -265,8 +268,7 @@ curl_progress_cb(void *userdata, curl_off_t dltotal, curl_off_t dlnow, curl_off_
	if (d->response != 200)
		return (0);

-
	pkg_emit_progress_tick(dlnow, dltotal);
-
	return (0);
+
	return pkg_emit_progress_tick(dlnow, dltotal);
}

int
@@ -446,6 +448,8 @@ retry:
	curl_easy_cleanup(cl);
	if (rc == 304) {
		retcode = EPKG_UPTODATE;
+
	} else if (rc == -1) {
+
		retcode = EPKG_CANCEL;
	} else if (rc != 200) {
		--retry;
		if (retry <= 0 || (rc == 404 && repo->mirror_type == NOMIRROR)) {
modified libpkg/pkg.h.in
@@ -515,7 +515,11 @@ typedef enum {
	/**
	 * the package already exist
	 */
-
	EPKG_EXIST
+
	EPKG_EXIST,
+
	/**
+
	 * the operation was cancelled
+
	 */
+
	EPKG_CANCEL
} pkg_error_t;

/**
modified libpkg/pkg_event.c
@@ -1016,7 +1016,7 @@ pkg_emit_progress_start(const char *fmt, ...)
	free(ev.e_progress_start.msg);
}

-
void
+
int
pkg_emit_progress_tick(int64_t current, int64_t total)
{
	struct pkg_event ev;
@@ -1025,8 +1025,7 @@ pkg_emit_progress_tick(int64_t current, int64_t total)
	ev.e_progress_tick.current = current;
	ev.e_progress_tick.total = total;

-
	pkg_emit_event(&ev);
-

+
	return !!pkg_emit_event(&ev);
}

void
modified libpkg/private/event.h
@@ -85,7 +85,7 @@ bool pkg_emit_query_yesno(bool deft, const char *msg);
int pkg_emit_query_select(const char *msg, const char **items, int ncnt, int deft);

void pkg_emit_progress_start(const char *fmt, ...) PKG_FORMAT_ATTRIBUTE(1, 2);
-
void pkg_emit_progress_tick(int64_t current, int64_t total);
+
int pkg_emit_progress_tick(int64_t current, int64_t total);

void pkg_emit_add_deps_begin(struct pkg *p);
void pkg_emit_add_deps_finished(struct pkg *p);
modified libpkg/repo/binary/update.c
@@ -457,7 +457,7 @@ pkg_repo_binary_update_proceed(const char *name, struct pkg_repo *repo,
	time_t *mtime, bool force)
{
	struct pkg *pkg = NULL;
-
	int rc = EPKG_FATAL;
+
	int rc = EPKG_FATAL, cancel = 0;
	sqlite3 *sqlite = NULL;
	int cnt = 0;
	time_t local_t;
@@ -530,13 +530,11 @@ pkg_repo_binary_update_proceed(const char *name, struct pkg_repo *repo,
		cnt++;
		totallen += linelen;
		if ((cnt % 10 ) == 0)
-
			pkg_emit_progress_tick(totallen, len);
+
			cancel = pkg_emit_progress_tick(totallen, len);
		rc = pkg_repo_binary_add_from_manifest(line, sqlite, linelen,
		    &pkg, repo);
-
		if (rc != EPKG_OK) {
-
			pkg_emit_progress_tick(len, len);
+
		if (rc != EPKG_OK || cancel != 0)
			break;
-
		}
	}
	pkg_emit_progress_tick(len, len);