aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--testing/rofi-file-browser-extended/APKBUILD38
-rw-r--r--testing/rofi-file-browser-extended/musl-compat.patch267
2 files changed, 305 insertions, 0 deletions
diff --git a/testing/rofi-file-browser-extended/APKBUILD b/testing/rofi-file-browser-extended/APKBUILD
new file mode 100644
index 0000000000..df6aed7eaf
--- /dev/null
+++ b/testing/rofi-file-browser-extended/APKBUILD
@@ -0,0 +1,38 @@
+# Contributor: Jakub Jirutka <jakub@jirutka.cz>
+# Maintainer: Jakub Jirutka <jakub@jirutka.cz>
+pkgname=rofi-file-browser-extended
+pkgver=1.3.0
+pkgrel=0
+pkgdesc="Use rofi to quickly open files"
+url="https://github.com/marvinkreis/rofi-file-browser-extended"
+arch="all !riscv64 !s390x" # blocked by rofi -> librsvg -> rust
+license="MIT"
+depends="cmd:rofi"
+makedepends="cmake rofi-dev"
+subpackages="$pkgname-doc"
+source="https://github.com/marvinkreis/rofi-file-browser-extended/archive/$pkgver/rofi-file-browser-extended-$pkgver.tar.gz
+ musl-compat.patch
+ "
+options="!check" # no tests provided
+
+build() {
+ local crossopts=
+ if [ "$CBUILD" != "$CHOST" ]; then
+ crossopts="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux"
+ fi
+ cmake -B build \
+ -DCMAKE_BUILD_TYPE=MinSizeRel \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_VERBOSE_MAKEFILE=ON \
+ $crossopts .
+ cmake --build build
+}
+
+package() {
+ DESTDIR="$pkgdir" cmake --install build
+}
+
+sha512sums="
+8d41c4f0750e2196b52448529c0ded99afb8c443cc817778b6e8924674111e83a580861206ce62a58e4ddb091f93ff835cc9f27e7ee3fe9a4496c5afc050201a rofi-file-browser-extended-1.3.0.tar.gz
+bb1005d35496bde8351e98ba3ac4501aaac1eb25a8f2fcecd55189f085416affc330ea14f8dcd3c6a864d767793699584f3308ee44b48103d63d55438f5411bf musl-compat.patch
+"
diff --git a/testing/rofi-file-browser-extended/musl-compat.patch b/testing/rofi-file-browser-extended/musl-compat.patch
new file mode 100644
index 0000000000..bdc6d11922
--- /dev/null
+++ b/testing/rofi-file-browser-extended/musl-compat.patch
@@ -0,0 +1,267 @@
+Patch-Source: https://github.com/marvinkreis/rofi-file-browser-extended/pull/40
+From 7a910d567d36e8282e4cc2acefea0accb32b15e3 Mon Sep 17 00:00:00 2001
+From: Jakub Jirutka <jakub@jirutka.cz>
+Date: Sat, 22 Jan 2022 00:50:23 +0100
+Subject: [PATCH] Fix compatibility with non-glibc systems
+
+Resolves #20
+---
+ CMakeLists.txt | 2 +-
+ include/compat/extended_nftw.h | 21 ++++
+ src/compat/extended_nftw.c | 184 +++++++++++++++++++++++++++++++++
+ src/files.c | 3 +-
+ 4 files changed, 208 insertions(+), 2 deletions(-)
+ create mode 100644 include/compat/extended_nftw.h
+ create mode 100644 src/compat/extended_nftw.c
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 78a8381..1f9b7b7 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -17,7 +17,7 @@ include_directories(
+ ${CAIRO_INCLUDE_DIRS}
+ )
+
+-file(GLOB SRC "src/*.c")
++file(GLOB_RECURSE SRC "src/*.c")
+
+ add_library(filebrowser SHARED ${SRC})
+ set_target_properties(filebrowser PROPERTIES PREFIX "")
+diff --git a/include/compat/extended_nftw.h b/include/compat/extended_nftw.h
+new file mode 100644
+index 0000000..f038200
+--- /dev/null
++++ b/include/compat/extended_nftw.h
+@@ -0,0 +1,21 @@
++#ifndef FILE_BROWSER_EXTENDED_NFTW_H
++#define FILE_BROWSER_EXTENDED_NFTW_H
++
++#include <ftw.h>
++
++#if defined(FTW_ACTIONRETVAL) /* glibc */
++
++#define extended_nftw nftw
++
++#else /* non-glibc */
++
++#define FTW_ACTIONRETVAL 0x10
++#define FTW_CONTINUE 0
++#define FTW_STOP 1
++#define FTW_SKIP_SUBTREE 2
++#define FTW_SKIP_SIBLINGS 3
++
++int extended_nftw(const char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags);
++#endif
++
++#endif
+diff --git a/src/compat/extended_nftw.c b/src/compat/extended_nftw.c
+new file mode 100644
+index 0000000..d43e098
+--- /dev/null
++++ b/src/compat/extended_nftw.c
+@@ -0,0 +1,184 @@
++/*
++This file has been copied from musl libc and modified using patch
++https://inbox.vuxu.org/musl/20210326054456.899700-1-dominique.martinet@atmark-techno.com/
++to add support for glibc-specific flag FTW_ACTIONRETVAL.
++
++musl as a whole is licensed under the following standard MIT license:
++
++----------------------------------------------------------------------
++Copyright © 2005-2020 Rich Felker, et al.
++
++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 <ftw.h>
++#include <dirent.h>
++#include <fcntl.h>
++#include <sys/stat.h>
++#include <errno.h>
++#include <unistd.h>
++#include <string.h>
++#include <limits.h>
++#include <pthread.h>
++
++#include "compat/extended_nftw.h"
++
++struct history
++{
++ struct history *chain;
++ dev_t dev;
++ ino_t ino;
++ int level;
++ int base;
++};
++
++#undef dirfd
++#define dirfd(d) (*(int *)d)
++
++static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags, struct history *h)
++{
++ size_t l = strlen(path), j = l && path[l-1]=='/' ? l-1 : l;
++ struct stat st;
++ struct history new;
++ int type;
++ int r;
++ int dfd;
++ int err;
++ struct FTW lev;
++
++ if ((flags & FTW_PHYS) ? lstat(path, &st) : stat(path, &st) < 0) {
++ if (!(flags & FTW_PHYS) && errno==ENOENT && !lstat(path, &st))
++ type = FTW_SLN;
++ else if (errno != EACCES) return -1;
++ else type = FTW_NS;
++ } else if (S_ISDIR(st.st_mode)) {
++ if (flags & FTW_DEPTH) type = FTW_DP;
++ else type = FTW_D;
++ } else if (S_ISLNK(st.st_mode)) {
++ if (flags & FTW_PHYS) type = FTW_SL;
++ else type = FTW_SLN;
++ } else {
++ type = FTW_F;
++ }
++
++ if ((flags & FTW_MOUNT) && h && st.st_dev != h->dev)
++ return 0;
++
++ new.chain = h;
++ new.dev = st.st_dev;
++ new.ino = st.st_ino;
++ new.level = h ? h->level+1 : 0;
++ new.base = j+1;
++
++ lev.level = new.level;
++ if (h) {
++ lev.base = h->base;
++ } else {
++ size_t k;
++ for (k=j; k && path[k]=='/'; k--);
++ for (; k && path[k-1]!='/'; k--);
++ lev.base = k;
++ }
++
++ if (type == FTW_D || type == FTW_DP) {
++ dfd = open(path, O_RDONLY);
++ err = errno;
++ if (dfd < 0 && err == EACCES) type = FTW_DNR;
++ if (!fd_limit) close(dfd);
++ }
++
++ if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev)))
++ return r;
++
++ for (; h; h = h->chain)
++ if (h->dev == st.st_dev && h->ino == st.st_ino)
++ return 0;
++
++ if ((type == FTW_D || type == FTW_DP) && fd_limit) {
++ if (dfd < 0) {
++ errno = err;
++ return -1;
++ }
++ DIR *d = fdopendir(dfd);
++ if (d) {
++ struct dirent *de;
++ while ((de = readdir(d))) {
++ if (de->d_name[0] == '.'
++ && (!de->d_name[1]
++ || (de->d_name[1]=='.'
++ && !de->d_name[2]))) continue;
++ if (strlen(de->d_name) >= PATH_MAX-l) {
++ errno = ENAMETOOLONG;
++ closedir(d);
++ return -1;
++ }
++ path[j]='/';
++ strcpy(path+j+1, de->d_name);
++ if ((r=do_nftw(path, fn, fd_limit-1, flags, &new))) {
++ if (flags & FTW_ACTIONRETVAL) {
++ if (r == FTW_SKIP_SIBLINGS)
++ break;
++ if (r == FTW_SKIP_SUBTREE)
++ continue;
++ }
++ closedir(d);
++ return r;
++ }
++ }
++ closedir(d);
++ } else {
++ close(dfd);
++ return -1;
++ }
++ }
++
++ path[l] = 0;
++ if ((flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev)))
++ return ((flags & FTW_ACTIONRETVAL)
++ && (r == FTW_SKIP_SUBTREE)
++ && (type == FTW_D)) ? FTW_CONTINUE : r;
++
++ return 0;
++}
++
++int extended_nftw(const char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags)
++{
++ int r, cs;
++ size_t l;
++ char pathbuf[PATH_MAX+1];
++
++ if (fd_limit <= 0) return 0;
++
++ l = strlen(path);
++ if (l > PATH_MAX) {
++ errno = ENAMETOOLONG;
++ return -1;
++ }
++ memcpy(pathbuf, path, l+1);
++
++ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
++ r = do_nftw(pathbuf, fn, fd_limit, flags, NULL);
++ pthread_setcancelstate(cs, 0);
++
++ if ((flags & FTW_ACTIONRETVAL) && (r == FTW_SKIP_SIBLINGS || r == FTW_SKIP_SUBTREE))
++ r = 0;
++
++ return r;
++}
+diff --git a/src/files.c b/src/files.c
+index f6d13c1..0d8c5d6 100644
+--- a/src/files.c
++++ b/src/files.c
+@@ -9,6 +9,7 @@
+ #include "types.h"
+ #include "util.h"
+ #include "files.h"
++#include "compat/extended_nftw.h"
+
+ /**
+ * Save file browser data globally so nftw's callback can access it.
+@@ -125,7 +126,7 @@ void load_files ( FileBrowserFileData *fd )
+ int nftw_flags = fd->follow_symlinks ? FTW_ACTIONRETVAL : ( FTW_ACTIONRETVAL | FTW_PHYS );
+ /* Workaround to make nftw work if the current directory is a symlink. */
+ char *path = g_build_filename ( fd->current_dir, ".", NULL );
+- nftw ( path , add_file, 16, nftw_flags );
++ extended_nftw ( path , add_file, 16, nftw_flags );
+ g_free ( path );
+
+ /* Exclude the parent dir from sorting. */