diff options
Diffstat (limited to 'main/abuild/0001-abuild-fix-fetch-lock-file-on-nfs.patch')
-rw-r--r-- | main/abuild/0001-abuild-fix-fetch-lock-file-on-nfs.patch | 338 |
1 files changed, 0 insertions, 338 deletions
diff --git a/main/abuild/0001-abuild-fix-fetch-lock-file-on-nfs.patch b/main/abuild/0001-abuild-fix-fetch-lock-file-on-nfs.patch deleted file mode 100644 index 336a44092c..0000000000 --- a/main/abuild/0001-abuild-fix-fetch-lock-file-on-nfs.patch +++ /dev/null @@ -1,338 +0,0 @@ -From 92186b70ca9c520fc726e0885aac633aadace655 Mon Sep 17 00:00:00 2001 -From: Natanael Copa <ncopa@alpinelinux.org> -Date: Wed, 26 Aug 2015 08:14:36 +0200 -Subject: [PATCH] abuild: fix fetch lock file on nfs - -flock(2) on an NFS mount will on the server side convert the lock to a -POSIX lock (fcntl(F_SETLK)). This means that abuild running on NFS -server and client will create different locks and they will both try -download same file at same time. - -We fix this by creating a small abuild-fetch application that will -create a POSIX lock which works with NFS. ---- - Makefile | 6 +- - abuild-fetch.c | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - abuild.in | 69 +------------------- - 3 files changed, 200 insertions(+), 69 deletions(-) - create mode 100644 abuild-fetch.c - -diff --git a/Makefile b/Makefile -index 81c2851..b7332b2 100644 ---- a/Makefile -+++ b/Makefile -@@ -11,7 +11,7 @@ abuildrepo ?= ~/.cache/abuild - SCRIPTS := abuild abuild-keygen abuild-sign newapkbuild \ - abump apkgrel buildlab apkbuild-cpan checkapk \ - apkbuild-gem-resolver --USR_BIN_FILES := $(SCRIPTS) abuild-tar abuild-sudo -+USR_BIN_FILES := $(SCRIPTS) abuild-tar abuild-sudo abuild-fetch - SAMPLES := sample.APKBUILD sample.initd sample.confd \ - sample.pre-install sample.post-install - AUTOTOOLS_TOOLCHAIN_FILES := config.sub -@@ -47,6 +47,7 @@ LIBS-abuild-tar = $(SSL_LIBS) - CFLAGS-abuild-tar = $(SSL_CFLAGS) - - OBJS-abuild-sudo = abuild-sudo.o -+OBJS-abuild-fetch = abuild-fetch.o - - .SUFFIXES: .sh.in .in - %.sh: %.sh.in -@@ -73,6 +74,9 @@ abuild-sudo: abuild-sudo.o - abuild-tar: abuild-tar.o - $(LINK) - -+abuild-fetch: abuild-fetch.o -+ $(LINK) -+ - abuild-tar.static: abuild-tar.o - $(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS-$@) -o $@ -static $(LIBS-$@) $^ - -diff --git a/abuild-fetch.c b/abuild-fetch.c -new file mode 100644 -index 0000000..51b41eb ---- /dev/null -+++ b/abuild-fetch.c -@@ -0,0 +1,194 @@ -+/* MIT license -+ -+Copyright (C) 2015 Natanael Copa <ncopa@alpinelinux.org> -+ -+Permission is hereby granted, free of charge, to any person obtaining a copy -+of this software and associated documentation files (the "Software"), to deal -+in the Software without restriction, including without limitation the rights -+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -+copies of the Software, and to permit persons to whom the Software is -+furnished to do so, subject to the following conditions: -+ -+The above copyright notice and this permission notice shall be included in -+all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -+THE SOFTWARE. -+ -+*/ -+ -+ -+#include <sys/wait.h> -+ -+#include <err.h> -+#include <fcntl.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <unistd.h> -+ -+static char *program; -+static char lockfile[PATH_MAX] = ""; -+ -+struct cmdarray { -+ size_t argc; -+ char *argv[32]; -+}; -+ -+void add_opt(struct cmdarray *cmd, char *opt) -+{ -+ cmd->argv[cmd->argc++] = opt; -+ cmd->argv[cmd->argc] = NULL; -+} -+ -+int usage(int eval) -+{ -+ printf("usage: %s [-d DESTDIR] URL\n", program); -+ return eval; -+} -+ -+/* create or wait for an NFS-safe lockfile and fetch url with curl or wget */ -+int fetch(char *url, const char *destdir) -+{ -+ int lockfd, status=0; -+ pid_t childpid; -+ char outfile[PATH_MAX], partfile[PATH_MAX]; -+ char *name, *p; -+ struct flock fl = { -+ .l_type = F_WRLCK, -+ .l_whence = SEEK_SET, -+ .l_start = 1, -+ .l_len = 0, -+ }; -+ struct cmdarray curlcmd = { -+ .argc = 6, -+ .argv = { "curl", "-k", "-L", "-f", "-o", partfile, NULL } -+ }; -+ struct cmdarray wgetcmd = { -+ .argc = 3, -+ .argv = { "wget", "-O", partfile, NULL } -+ }; -+ -+ name = strrchr(url, '/'); -+ if (name == NULL) -+ errx(1, "%s: no '/' in url"); -+ p = strstr(url, "::"); -+ if (p != NULL) { -+ name = url; -+ *p = '\0'; -+ url = p + 2; -+ } else if (strstr(url, "saveas-") == url) { -+ *name++ = '\0'; -+ url += 7; /* strlen("saveas-") */ -+ } else { -+ name++; -+ } -+ -+ snprintf(outfile, sizeof(outfile), "%s/%s", destdir, name); -+ snprintf(lockfile, sizeof(lockfile), "%s.lock", outfile); -+ snprintf(partfile, sizeof(partfile), "%s.part", outfile); -+ -+ lockfd = open(lockfile, O_WRONLY|O_CREAT, 0660); -+ if (lockfd < 0) -+ err(1, lockfile); -+ -+ if (fcntl(lockfd, F_SETLK, &fl) < 0) { -+ printf("Waiting for %s ...\n", lockfile); -+ if (fcntl(lockfd, F_SETLKW, &fl) < 0) -+ err(1, "fcntl(F_SETLKW)"); -+ } -+ -+ if (access(outfile, F_OK) == 0) -+ goto fetch_done; -+ -+ if (access(partfile, F_OK) == 0) { -+ printf("Partial download found. Trying to resume.\n"); -+ add_opt(&curlcmd, "-C"); -+ add_opt(&curlcmd, "-"); -+ add_opt(&wgetcmd, "-c"); -+ } -+ -+ add_opt(&curlcmd, url); -+ add_opt(&wgetcmd, url); -+ -+ childpid = fork(); -+ if (childpid < 0 ) -+ err(1, "fork"); -+ -+ if (childpid == 0) { -+ execvp(curlcmd.argv[0], curlcmd.argv); -+ printf("Using wget\n"); -+ execvp(wgetcmd.argv[0], wgetcmd.argv); -+ warn(wgetcmd.argv[0]); -+ unlink(lockfile); -+ exit(1); -+ } -+ wait(&status); -+ rename(partfile, outfile); -+ -+fetch_done: -+ unlink(lockfile); -+ close(lockfd); -+ lockfile[0] = '\0'; -+ return status; -+ -+} -+ -+void sighandler(int sig) -+{ -+ switch(sig) { -+ case SIGABRT: -+ case SIGINT: -+ case SIGQUIT: -+ case SIGTERM: -+ unlink(lockfile); -+ exit(0); -+ break; -+ default: -+ break; -+ } -+} -+ -+int main(int argc, char *argv[]) -+{ -+ int opt, r=0, i; -+ char *destdir = "/var/cache/distfiles"; -+ -+ program = argv[0]; -+ while ((opt = getopt(argc, argv, "hd:")) != -1) { -+ switch (opt) { -+ case 'h': -+ return usage(0); -+ break; -+ case 'd': -+ destdir = optarg; -+ break; -+ default: -+ printf("Unkonwn option '%c'\n", opt); -+ return usage(1); -+ break; -+ } -+ } -+ -+ argv += optind; -+ argc -= optind; -+ -+ if (argc < 1) -+ return usage(1); -+ -+ signal(SIGABRT, sighandler); -+ signal(SIGINT, sighandler); -+ signal(SIGQUIT, sighandler); -+ signal(SIGTERM, sighandler); -+ -+ for (i = 0; i < argc; i++) { -+ if (fetch(argv[i], destdir)) -+ r++; -+ } -+ return r; -+} -diff --git a/abuild.in b/abuild.in -index b8d8851..952048b 100644 ---- a/abuild.in -+++ b/abuild.in -@@ -298,79 +298,12 @@ sourcecheck() { - return 0 - } - --# convert curl options to wget options and call wget instead of curl --wget_fallback() { -- local wget_opts= outfile= opt= -- while getopts "C:Lko:s" opt; do -- case $opt in -- 'L') ;; # --location. wget does this by default -- 'f') ;; # --fail. wget does this by default -- 'C') wget_opts="$wget_opts -c";; # --continue-at -- 's') wget_opts="$wget_opts -q";; # --silent -- 'o') wget_opts="$wget_opts -O $OPTARG";; # --output -- 'k') wget_opts="$wget_opts --no-check-certificate";; #gnu wget -- esac -- done -- shift $(( $OPTIND - 1 )) -- wget $wget_opts "$1" --} -- - uri_fetch() { - local uri="$1" -- local d="${uri##*/}" # $(basename $uri) -- local opts - [ -n "$quiet" ] && opts="-s" - -- local lockfile="$SRCDEST/$d".lock -- -- # fix saveas-*://* URIs -- case "$uri" in -- # remove 'saveas-' from beginning and -- # '/filename' from end of URI -- saveas-*://*) uri="${uri:7:$(expr ${#uri} - 7 - ${#d} - 1)}";; -- -- *::*) -- d=${uri%%::*} -- uri=${uri#$d::} -- ;; -- esac -- -- case "$uri" in -- https://*) opts="-k";; -- esac -- - mkdir -p "$SRCDEST" -- -- CLEANUP_FILES="$CLEANUP_FILES $lockfile" -- ( -- flock -n -x 9 || msg "Waiting for ${lockfile##*/}..." -- flock -x 9 -- -- [ -f "$SRCDEST/$d" ] && exit 0 # use exit since its a subshell -- -- if [ -f "$SRCDEST/$d.part" ]; then -- msg "Partial download found. Trying to resume" -- opts="$opts -C -" -- fi -- msg "Fetching $uri" -- -- # fallback to wget if curl is missing. useful for bootstrapping -- local fetcher= -- if ! [ -x "$(which curl)" ]; then -- fetcher=wget_fallback -- else -- fetcher=curl -- opts="$opts -L -f -k" -- fi -- -- $fetcher $opts -o "$SRCDEST/$d.part" "$uri" \ -- && mv "$SRCDEST/$d.part" "$SRCDEST/$d" -- -- ) 9>$lockfile -- -- local rc=$? -- rm -f "$lockfile" -- return $rc -+ abuild-fetch -d "$SRCDEST" "$uri" - } - - is_remote() { --- -2.5.0 - |