aboutsummaryrefslogtreecommitdiffstats
path: root/patches
diff options
context:
space:
mode:
Diffstat (limited to 'patches')
-rw-r--r--patches/0001-implement-CacheServer.patch341
-rw-r--r--patches/0001-support-http-header-Cache-Control-no-cache-for-soft-failure.patch69
2 files changed, 0 insertions, 410 deletions
diff --git a/patches/0001-implement-CacheServer.patch b/patches/0001-implement-CacheServer.patch
deleted file mode 100644
index 061d123..0000000
--- a/patches/0001-implement-CacheServer.patch
+++ /dev/null
@@ -1,341 +0,0 @@
-From a5239c9b76a515598afdb3e698dc82263341b1ad Mon Sep 17 00:00:00 2001
-From: Christian Hesse <mail@eworm.de>
-Date: Fri, 21 Jan 2022 16:11:02 +0100
-Subject: [PATCH] implement CacheServer
-
-This implements a new configuration option 'CacheServer'. Adding a cache
-server makes it ignore the server error limit.
-
-We have a struct that stores the server errors. Extend (and rename) this
-struct to store if this is a cache server. The errors are not increased
-for cache servers, thus they are never ignored.
-
-Signed-off-by: Christian Hesse <mail@eworm.de>
----
- doc/pacman.conf.5.asciidoc | 5 ++++
- lib/libalpm/alpm.h | 7 +++--
- lib/libalpm/db.c | 22 ++++++++++++----
- lib/libalpm/db.h | 1 +
- lib/libalpm/dload.c | 52 +++++++++++++++++++++++++++++++-------
- lib/libalpm/dload.h | 2 ++
- src/pacman/conf.c | 16 +++++++++---
- src/pacman/conf.h | 1 +
- src/pacman/pacman-conf.c | 1 +
- 9 files changed, 88 insertions(+), 19 deletions(-)
-
-diff --git a/doc/pacman.conf.5.asciidoc b/doc/pacman.conf.5.asciidoc
-index 41f3ea03..a25e35eb 100644
---- a/doc/pacman.conf.5.asciidoc
-+++ b/doc/pacman.conf.5.asciidoc
-@@ -243,6 +243,11 @@ number.
- *Server =* url::
- A full URL to a location where the database, packages, and signatures (if
- available) for this repository can be found.
-+
-+*CacheServer =* url::
-+ A full URL to a location where packages, and signatures (if available)
-+ for this repository can be found. There's no server error limit, log
-+ messages are not shown for server side errors (http code >= 400).
- +
- During parsing, pacman will define the `$repo` variable to the name of the
- current section. This is often utilized in files specified using the 'Include'
-diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
-index cdf71fdc..14889b9c 100644
---- a/lib/libalpm/alpm.h
-+++ b/lib/libalpm/alpm.h
-@@ -1322,16 +1322,19 @@ alpm_list_t *alpm_db_get_servers(const alpm_db_t *db);
- /** Sets the list of servers for the database to use.
- * @param db the database to set the servers. The list will be duped and
- * the original will still need to be freed by the caller.
-+ * @param cacheservers a char* list of cacheservers.
- * @param servers a char* list of servers.
- */
--int alpm_db_set_servers(alpm_db_t *db, alpm_list_t *servers);
-+int alpm_db_set_servers(alpm_db_t *db, alpm_list_t *cacheservers,
-+ alpm_list_t *servers);
-
- /** Add a download server to a database.
- * @param db database pointer
- * @param url url of the server
-+ * @param cache 0 for regular server, 1 for cacheserver
- * @return 0 on success, -1 on error (pm_errno is set accordingly)
- */
--int alpm_db_add_server(alpm_db_t *db, const char *url);
-+int alpm_db_add_server(alpm_db_t *db, const char *url, const int cache);
-
- /** Remove a download server from a database.
- * @param db database pointer
-diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
-index ece8eae6..e9bca9c8 100644
---- a/lib/libalpm/db.c
-+++ b/lib/libalpm/db.c
-@@ -36,6 +36,7 @@
- #include "alpm.h"
- #include "package.h"
- #include "group.h"
-+#include "dload.h"
-
- alpm_db_t SYMEXPORT *alpm_register_syncdb(alpm_handle_t *handle,
- const char *treename, int siglevel)
-@@ -137,14 +138,22 @@ alpm_list_t SYMEXPORT *alpm_db_get_servers(const alpm_db_t *db)
- return db->servers;
- }
-
--int SYMEXPORT alpm_db_set_servers(alpm_db_t *db, alpm_list_t *servers)
-+int SYMEXPORT alpm_db_set_servers(alpm_db_t *db, alpm_list_t *cacheservers,
-+ alpm_list_t *servers)
- {
- alpm_list_t *i;
- ASSERT(db != NULL, return -1);
-+ FREELIST(db->cacheservers);
- FREELIST(db->servers);
-+ for(i = cacheservers; i; i = i->next) {
-+ char *url = i->data;
-+ if(alpm_db_add_server(db, url, 1) != 0) {
-+ return -1;
-+ }
-+ }
- for(i = servers; i; i = i->next) {
- char *url = i->data;
-- if(alpm_db_add_server(db, url) != 0) {
-+ if(alpm_db_add_server(db, url, 0) != 0) {
- return -1;
- }
- }
-@@ -164,7 +173,7 @@ static char *sanitize_url(const char *url)
- return newurl;
- }
-
--int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url)
-+int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url, const int cache)
- {
- char *newurl;
-
-@@ -178,8 +187,11 @@ int SYMEXPORT alpm_db_add_server(alpm_db_t *db, const char *url)
- return -1;
- }
- db->servers = alpm_list_add(db->servers, newurl);
-- _alpm_log(db->handle, ALPM_LOG_DEBUG, "adding new server URL to database '%s': %s\n",
-- db->treename, newurl);
-+ if(cache) {
-+ server_make_cache(db->handle, newurl);
-+ }
-+ _alpm_log(db->handle, ALPM_LOG_DEBUG, "adding new %sserver URL to database '%s': %s\n",
-+ cache ? "cache " : "", db->treename, newurl);
-
- return 0;
- }
-diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h
-index c9400365..50812e28 100644
---- a/lib/libalpm/db.h
-+++ b/lib/libalpm/db.h
-@@ -69,6 +69,7 @@ struct _alpm_db_t {
- char *_path;
- alpm_pkghash_t *pkgcache;
- alpm_list_t *grpcache;
-+ alpm_list_t *cacheservers;
- alpm_list_t *servers;
- const struct db_operations *ops;
-
-diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
-index 7c27c3ea..3b3e5dc4 100644
---- a/lib/libalpm/dload.c
-+++ b/lib/libalpm/dload.c
-@@ -62,15 +62,16 @@ static int curl_gethost(const char *url, char *buffer, size_t buf_len);
- * server blacklisting */
- const unsigned int server_error_limit = 3;
-
--struct server_error_count {
-+struct server_opts {
- char server[HOSTNAME_SIZE];
-+ unsigned int cache;
- unsigned int errors;
- };
-
--static struct server_error_count *find_server_errors(alpm_handle_t *handle, const char *server)
-+static struct server_opts *find_server_errors(alpm_handle_t *handle, const char *server)
- {
- alpm_list_t *i;
-- struct server_error_count *h;
-+ struct server_opts *h;
- char hostname[HOSTNAME_SIZE];
- /* key off the hostname because a host may serve multiple repos under
- * different url's and errors are likely to be host-wide */
-@@ -83,7 +84,7 @@ static struct server_error_count *find_server_errors(alpm_handle_t *handle, cons
- return h;
- }
- }
-- if((h = calloc(sizeof(struct server_error_count), 1))
-+ if((h = calloc(sizeof(struct server_opts), 1))
- && alpm_list_append(&handle->server_errors, h)) {
- strcpy(h->server, hostname);
- h->errors = 0;
-@@ -94,9 +95,38 @@ static struct server_error_count *find_server_errors(alpm_handle_t *handle, cons
- }
- }
-
-+static int is_cache_server(alpm_handle_t *handle, const char *server)
-+{
-+ struct server_opts *h;
-+ if((h = find_server_errors(handle, server))) {
-+ return h->cache;
-+ }
-+ return 0;
-+}
-+
-+static int should_skip_cacheserver(alpm_handle_t *handle, const char *server, const char *filepath)
-+{
-+ if(!is_cache_server(handle, server)) {
-+ return 0;
-+ }
-+ if(filepath) {
-+ int len = strlen(filepath);
-+ return (len > 3 && strncmp(filepath + len - 3, ".db", 3) == 0) ? 1 : 0;
-+ }
-+ return 0;
-+}
-+
-+void server_make_cache(alpm_handle_t *handle, const char *server)
-+{
-+ struct server_opts *h;
-+ if((h = find_server_errors(handle, server))) {
-+ h->cache = 1;
-+ }
-+}
-+
- static int should_skip_server(alpm_handle_t *handle, const char *server)
- {
-- struct server_error_count *h;
-+ struct server_opts *h;
- if(server_error_limit && (h = find_server_errors(handle, server)) ) {
- return h->errors >= server_error_limit;
- }
-@@ -105,9 +135,10 @@ static int should_skip_server(alpm_handle_t *handle, const char *server)
-
- static void server_increment_error(alpm_handle_t *handle, const char *server, int count)
- {
-- struct server_error_count *h;
-+ struct server_opts *h;
- if(server_error_limit
- && (h = find_server_errors(handle, server))
-+ && !is_cache_server(handle, server)
- && !should_skip_server(handle, server) ) {
- h->errors += count;
-
-@@ -414,7 +445,8 @@ static int curl_retry_next_server(CURLM *curlm, CURL *curl, struct dload_payload
- struct stat st;
- alpm_handle_t *handle = payload->handle;
-
-- while(payload->servers && should_skip_server(handle, payload->servers->data)) {
-+ while(payload->servers && (should_skip_server(handle, payload->servers->data)
-+ || should_skip_cacheserver(handle, payload->servers->data, payload->filepath))) {
- payload->servers = payload->servers->next;
- }
- if(!payload->servers) {
-@@ -511,7 +543,7 @@ static int curl_check_finished_download(CURLM *curlm, CURLMsg *msg,
- /* non-translated message is same as libcurl */
- snprintf(payload->error_buffer, sizeof(payload->error_buffer),
- "The requested URL returned error: %ld", payload->respcode);
-- _alpm_log(handle, ALPM_LOG_ERROR,
-+ _alpm_log(handle, is_cache_server(handle, payload->fileurl) ? ALPM_LOG_DEBUG : ALPM_LOG_ERROR,
- _("failed retrieving file '%s' from %s : %s\n"),
- payload->remote_name, hostname, payload->error_buffer);
- server_soft_error(handle, payload->fileurl);
-@@ -769,7 +801,9 @@ static int curl_add_payload(alpm_handle_t *handle, CURLM *curlm,
- ASSERT(!payload->filepath, GOTO_ERR(handle, ALPM_ERR_WRONG_ARGS, cleanup));
- } else {
- const char *server;
-- while(payload->servers && should_skip_server(handle, payload->servers->data)) {
-+
-+ while(payload->servers && (should_skip_server(handle, payload->servers->data)
-+ || should_skip_cacheserver(handle, payload->servers->data, payload->filepath))) {
- payload->servers = payload->servers->next;
- }
-
-diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h
-index 9438e04a..d117244d 100644
---- a/lib/libalpm/dload.h
-+++ b/lib/libalpm/dload.h
-@@ -58,6 +58,8 @@ struct dload_payload {
- #endif
- };
-
-+void server_make_cache(alpm_handle_t *handle, const char *server);
-+
- void _alpm_dload_payload_reset(struct dload_payload *payload);
-
- int _alpm_download(alpm_handle_t *handle,
-diff --git a/src/pacman/conf.c b/src/pacman/conf.c
-index f9edf75b..04bb478b 100644
---- a/src/pacman/conf.c
-+++ b/src/pacman/conf.c
-@@ -172,6 +172,7 @@ void config_repo_free(config_repo_t *repo)
- return;
- }
- free(repo->name);
-+ FREELIST(repo->cacheservers);
- FREELIST(repo->servers);
- free(repo);
- }
-@@ -781,9 +782,9 @@ static char *replace_server_vars(config_t *c, config_repo_t *r, const char *s)
- }
- }
-
--static int _add_mirror(alpm_db_t *db, char *value)
-+static int _add_mirror(alpm_db_t *db, char *value, const int cache)
- {
-- if(alpm_db_add_server(db, value) != 0) {
-+ if(alpm_db_add_server(db, value, cache) != 0) {
- /* pm_errno is set by alpm_db_setserver */
- pm_printf(ALPM_LOG_ERROR, _("could not add server URL to database '%s': %s (%s)\n"),
- alpm_db_get_name(db), value, alpm_strerror(alpm_errno(config->handle)));
-@@ -809,8 +810,14 @@ static int register_repo(config_repo_t *repo)
- repo->usage, repo->name);
- alpm_db_set_usage(db, repo->usage);
-
-+ for(i = repo->cacheservers; i; i = alpm_list_next(i)) {
-+ if(_add_mirror(db, i->data, 1) != 0) {
-+ return 1;
-+ }
-+ }
-+
- for(i = repo->servers; i; i = alpm_list_next(i)) {
-- if(_add_mirror(db, i->data) != 0) {
-+ if(_add_mirror(db, i->data, 0) != 0) {
- return 1;
- }
- }
-@@ -993,6 +1000,9 @@ static int _parse_repo(const char *key, char *value, const char *file,
- if(strcmp(key, "Server") == 0) {
- CHECK_VALUE(value);
- repo->servers = alpm_list_add(repo->servers, strdup(value));
-+ } else if(strcmp(key, "CacheServer") == 0) {
-+ CHECK_VALUE(value);
-+ repo->cacheservers = alpm_list_add(repo->cacheservers, strdup(value));
- } else if(strcmp(key, "SigLevel") == 0) {
- CHECK_VALUE(value);
- alpm_list_t *values = NULL;
-diff --git a/src/pacman/conf.h b/src/pacman/conf.h
-index f7916ca9..f242f522 100644
---- a/src/pacman/conf.h
-+++ b/src/pacman/conf.h
-@@ -37,6 +37,7 @@ typedef struct __colstr_t {
-
- typedef struct __config_repo_t {
- char *name;
-+ alpm_list_t *cacheservers;
- alpm_list_t *servers;
- int usage;
- int siglevel;
-diff --git a/src/pacman/pacman-conf.c b/src/pacman/pacman-conf.c
-index a9d1f52b..db648d4c 100644
---- a/src/pacman/pacman-conf.c
-+++ b/src/pacman/pacman-conf.c
-@@ -236,6 +236,7 @@ static void dump_repo(config_repo_t *repo)
- {
- show_usage("Usage", repo->usage);
- show_siglevel("SigLevel", repo->siglevel, 0);
-+ show_list_str("CacheServer", repo->cacheservers);
- show_list_str("Server", repo->servers);
- }
-
diff --git a/patches/0001-support-http-header-Cache-Control-no-cache-for-soft-failure.patch b/patches/0001-support-http-header-Cache-Control-no-cache-for-soft-failure.patch
deleted file mode 100644
index 17154a9..0000000
--- a/patches/0001-support-http-header-Cache-Control-no-cache-for-soft-failure.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-From b2d83e4d7e17d2a6d1fe8efa19e74d4f1eb1d64c Mon Sep 17 00:00:00 2001
-From: Christian Hesse <mail@eworm.de>
-Date: Fri, 21 May 2021 09:52:34 +0200
-Subject: [PATCH 1/1] support http header 'Cache-Control: no-cache' for soft
- failure
-
-The idea has been borrowed from cloud providers' reverse proxies and
-load balancers. These accept http headers to control caching behaviour,
-even to control 'negative caching' when error codes are returned.
-
-By setting the http header 'Cache-Control: no-cache' when returning with
-the status code 404 (not found) the server can indicate that this is a
-soft failure. No error message is shown, and server's error count is
-not increased.
-
-This can be used by servers that are not expected to be complete, for
-example when serving a local cache [0]. In nginx this can be achived by
-acting on error_page and sending the extra header by adding a directive:
-
- server {
- listen 8080 default_server;
- root /var/cache/pacman/pkg;
- error_page 404 = @no-cache;
- location @no-cache {
- add_header Cache-Control "no-cache" always;
- }
- }
-
-Also this is a perfect match for pacredir [1].
-
-[0] https://wiki.archlinux.org/title/Pacman/Tips_and_tricks#Network_shared_pacman_cache
-[1] https://git.eworm.de/cgit/pacredir/about/
-
-Signed-off-by: Christian Hesse <mail@eworm.de>
----
- lib/libalpm/dload.c | 11 +++++++++++
- 1 file changed, 11 insertions(+)
-
-diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
-index 4fa17b35..74462bba 100644
---- a/lib/libalpm/dload.c
-+++ b/lib/libalpm/dload.c
-@@ -274,8 +274,10 @@ static size_t dload_parseheader_cb(void *ptr, size_t size, size_t nmemb, void *u
- {
- size_t realsize = size * nmemb;
- const char *fptr, *endptr = NULL;
-+ const char * const cc_header = "Cache-Control:";
- const char * const cd_header = "Content-Disposition:";
- const char * const fn_key = "filename=";
-+ const char * const nc_key = "no-cache";
- struct dload_payload *payload = (struct dload_payload *)user;
- long respcode;
-
-@@ -302,6 +304,15 @@ static size_t dload_parseheader_cb(void *ptr, size_t size, size_t nmemb, void *u
- }
- }
-
-+ /* By setting the http header 'Cache-Control: no-cache' the server can indicate
-+ that this is a soft failure which should not be cached. No error message is
-+ shown, and server's error count is not increased. */
-+ if(_alpm_raw_ncmp(cc_header, ptr, strlen(cc_header)) == 0) {
-+ if(strstr(ptr, nc_key)) {
-+ payload->errors_ok = 1;
-+ }
-+ }
-+
- curl_easy_getinfo(payload->curl, CURLINFO_RESPONSE_CODE, &respcode);
- if(payload->respcode != respcode) {
- payload->respcode = respcode;