From cea64661166a830c4417fe2f992cbffc5a611835 Mon Sep 17 00:00:00 2001 From: Leonid Pliushch Date: Thu, 2 Jan 2020 21:06:07 +0200 Subject: [PATCH] new package: renameutils Requested in https://github.com/termux/termux-packages/issues/1109. --- .../renameutils/add-missing-functions.patch | 393 ++++++++++++++++++ packages/renameutils/build.sh | 7 + packages/renameutils/fix-tmpdir.patch | 12 + packages/renameutils/fix-typos.patch | 24 ++ 4 files changed, 436 insertions(+) create mode 100644 packages/renameutils/add-missing-functions.patch create mode 100644 packages/renameutils/build.sh create mode 100644 packages/renameutils/fix-tmpdir.patch create mode 100644 packages/renameutils/fix-typos.patch diff --git a/packages/renameutils/add-missing-functions.patch b/packages/renameutils/add-missing-functions.patch new file mode 100644 index 000000000..02b3f9d80 --- /dev/null +++ b/packages/renameutils/add-missing-functions.patch @@ -0,0 +1,393 @@ +diff -uNr renameutils-0.12.0/src/common/Makefile.am renameutils-0.12.0.mod/src/common/Makefile.am +--- renameutils-0.12.0/src/common/Makefile.am 2012-04-23 14:11:04.000000000 +0300 ++++ renameutils-0.12.0.mod/src/common/Makefile.am 2020-01-02 20:43:15.306228148 +0200 +@@ -25,4 +25,6 @@ + tab-utils.c \ + tab-utils.h \ + tmap.c \ +- tmap.h ++ tmap.h \ ++ wordexp.c \ ++ wordexp.h +diff -uNr renameutils-0.12.0/src/common/Makefile.in renameutils-0.12.0.mod/src/common/Makefile.in +--- renameutils-0.12.0/src/common/Makefile.in 2012-04-23 14:24:10.000000000 +0300 ++++ renameutils-0.12.0.mod/src/common/Makefile.in 2020-01-02 20:47:56.755267916 +0200 +@@ -156,7 +156,7 @@ + am_lib_common_a_OBJECTS = error.$(OBJEXT) hmap.$(OBJEXT) \ + io-utils.$(OBJEXT) intutil.$(OBJEXT) llist.$(OBJEXT) \ + strbuf.$(OBJEXT) string-utils.$(OBJEXT) tab-utils.$(OBJEXT) \ +- tmap.$(OBJEXT) ++ tmap.$(OBJEXT) wordexp.$(OBJEXT) + lib_common_a_OBJECTS = $(am_lib_common_a_OBJECTS) + DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) + depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +@@ -997,7 +997,9 @@ + tab-utils.c \ + tab-utils.h \ + tmap.c \ +- tmap.h ++ tmap.h \ ++ wordexp.c \ ++ wordexp.h + + all: all-am + +diff -uNr renameutils-0.12.0/src/common/wordexp.c renameutils-0.12.0.mod/src/common/wordexp.c +--- renameutils-0.12.0/src/common/wordexp.c 1970-01-01 03:00:00.000000000 +0300 ++++ renameutils-0.12.0.mod/src/common/wordexp.c 2020-01-02 20:41:33.516494851 +0200 +@@ -0,0 +1,194 @@ ++#include "wordexp.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++//##include ++#include ++static void reap(pid_t pid) ++{ ++ int status; ++ for (;;) { ++ if (waitpid(pid, &status, 0) < 0) { ++ if (errno != EINTR) return; ++ } else { ++ if (WIFEXITED(status)) return; ++ } ++ } ++} ++ ++static char *getword(FILE *f) ++{ ++ char *s = 0; ++ return getdelim(&s, (size_t [1]){0}, 0, f) < 0 ? 0 : s; ++} ++ ++static int do_wordexp(const char *s, wordexp_t *we, int flags) ++{ ++ size_t i, l; ++ int sq=0, dq=0; ++ size_t np=0; ++ char *w, **tmp; ++ char *redir = (flags & WRDE_SHOWERR) ? "" : "2>/dev/null"; ++ int err = 0; ++ FILE *f; ++ size_t wc = 0; ++ char **wv = 0; ++ int p[2]; ++ pid_t pid; ++ sigset_t set; ++ sigset_t all_set; ++ if (flags & WRDE_REUSE) wordfree(we); ++ ++ if (flags & WRDE_NOCMD) for (i=0; s[i]; i++) switch (s[i]) { ++ case '\\': ++ if (!sq) i++; ++ break; ++ case '\'': ++ if (!dq) sq^=1; ++ break; ++ case '"': ++ if (!sq) dq^=1; ++ break; ++ case '(': ++ if (np) { ++ np++; ++ break; ++ } ++ case ')': ++ if (np) { ++ np--; ++ break; ++ } ++ case '\n': ++ case '|': ++ case '&': ++ case ';': ++ case '<': ++ case '>': ++ case '{': ++ case '}': ++ if (!(sq|dq|np)) return WRDE_BADCHAR; ++ break; ++ case '$': ++ if (sq) break; ++ if (s[i+1]=='(' && s[i+2]=='(') { ++ i += 2; ++ np += 2; ++ break; ++ } else if (s[i+1] != '(') break; ++ case '`': ++ if (sq) break; ++ return WRDE_CMDSUB; ++ } ++ ++ if (flags & WRDE_APPEND) { ++ wc = we->we_wordc; ++ wv = we->we_wordv; ++ } ++ ++ i = wc; ++ if (flags & WRDE_DOOFFS) { ++ if (we->we_offs > SIZE_MAX/sizeof(void *)/4) ++ goto nospace; ++ i += we->we_offs; ++ } else { ++ we->we_offs = 0; ++ } ++ ++ if (pipe2(p, O_CLOEXEC) < 0) goto nospace; ++// sigfillset(&all_set); ++// sigprocmask(SIG_SETMASK, &all_set, &set); ++ pid = fork(); ++// sigprocmask(SIG_SETMASK, &set, &all_set); ++ if (pid < 0) { ++ close(p[0]); ++ close(p[1]); ++ goto nospace; ++ } ++ if (!pid) { ++ if (p[1] == 1) fcntl(1, F_SETFD, 0); ++ else dup2(p[1], 1); ++ execl("/data/data/com.termux/files/usr/bin/sh", "sh", "-c", ++ "eval \"printf %s\\\\\\\\0 x $1 $2\"", ++ "sh", s, redir, (char *)0); ++ _exit(1); ++ } ++ close(p[1]); ++ ++ f = fdopen(p[0], "r"); ++ if (!f) { ++ close(p[0]); ++ kill(pid, SIGKILL); ++ reap(pid); ++ goto nospace; ++ } ++ ++ l = wv ? i+1 : 0; ++ ++ free(getword(f)); ++ if (feof(f)) { ++ fclose(f); ++ reap(pid); ++ return WRDE_SYNTAX; ++ } ++ ++ while ((w = getword(f))) { ++ if (i+1 >= l) { ++ l += l/2+10; ++ tmp = realloc(wv, l*sizeof(char *)); ++ if (!tmp) break; ++ wv = tmp; ++ } ++ wv[i++] = w; ++ wv[i] = 0; ++ } ++ if (!feof(f)) err = WRDE_NOSPACE; ++ ++ fclose(f); ++ reap(pid); ++ ++ if (!wv) wv = calloc(i+1, sizeof *wv); ++ ++ we->we_wordv = wv; ++ we->we_wordc = i; ++ ++ if (flags & WRDE_DOOFFS) { ++ if (wv) for (i=we->we_offs; i; i--) ++ we->we_wordv[i-1] = 0; ++ we->we_wordc -= we->we_offs; ++ } ++ return err; ++ ++nospace: ++ if (!(flags & WRDE_APPEND)) { ++ we->we_wordc = 0; ++ we->we_wordv = 0; ++ } ++ return WRDE_NOSPACE; ++} ++ ++int wordexp(const char *restrict s, wordexp_t *restrict we, int flags) ++{ ++ int r, cs; ++ //pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); ++ r = do_wordexp(s, we, flags); ++ //pthread_setcancelstate(cs, 0); ++ return r; ++} ++ ++void wordfree(wordexp_t *we) ++{ ++ size_t i; ++ if (!we->we_wordv) return; ++ for (i=0; iwe_wordc; i++) free(we->we_wordv[we->we_offs+i]); ++ free(we->we_wordv); ++ we->we_wordv = 0; ++ we->we_wordc = 0; ++} +diff -uNr renameutils-0.12.0/src/common/wordexp.h renameutils-0.12.0.mod/src/common/wordexp.h +--- renameutils-0.12.0/src/common/wordexp.h 1970-01-01 03:00:00.000000000 +0300 ++++ renameutils-0.12.0.mod/src/common/wordexp.h 2020-01-02 20:41:33.516494851 +0200 +@@ -0,0 +1,41 @@ ++#ifndef _WORDEXP_H ++#define _WORDEXP_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++ ++#define __NEED_size_t ++ ++//#include ++ ++#define WRDE_DOOFFS 1 ++#define WRDE_APPEND 2 ++#define WRDE_NOCMD 4 ++#define WRDE_REUSE 8 ++#define WRDE_SHOWERR 16 ++#define WRDE_UNDEF 32 ++#include ++typedef struct { ++ size_t we_wordc; ++ char **we_wordv; ++ size_t we_offs; ++} wordexp_t; ++ ++#define WRDE_NOSYS -1 ++#define WRDE_NOSPACE 1 ++#define WRDE_BADCHAR 2 ++#define WRDE_BADVAL 3 ++#define WRDE_CMDSUB 4 ++#define WRDE_SYNTAX 5 ++ ++int wordexp (const char *__restrict, wordexp_t *__restrict, int); ++void wordfree (wordexp_t *); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff -uNr renameutils-0.12.0/src/editformats/getsubopt.c renameutils-0.12.0.mod/src/editformats/getsubopt.c +--- renameutils-0.12.0/src/editformats/getsubopt.c 1970-01-01 03:00:00.000000000 +0300 ++++ renameutils-0.12.0.mod/src/editformats/getsubopt.c 2020-01-02 20:56:21.548067937 +0200 +@@ -0,0 +1,59 @@ ++#include ++#include ++#include ++ ++char *suboptarg; ++ ++int ++getsubopt(optionp, tokens, valuep) ++ char **optionp, **valuep; ++ char * const *tokens; ++{ ++ int cnt; ++ char *p; ++ ++ /* optionp is tested below */ ++ ++ suboptarg = *valuep = NULL; ++ ++ if (!optionp || !*optionp) ++ return(-1); ++ ++ /* skip leading white-space, commas */ ++ for (p = *optionp; *p && (*p == ',' || *p == ' ' || *p == '\t'); ++p); ++ ++ if (!*p) { ++ *optionp = p; ++ return(-1); ++ } ++ ++ /* save the start of the token, and skip the rest of the token. */ ++ for (suboptarg = p; ++ *++p && *p != ',' && *p != '=' && *p != ' ' && *p != '\t';); ++ ++ if (*p) { ++ /* ++ * If there's an equals sign, set the value pointer, and ++ * skip over the value part of the token. Terminate the ++ * token. ++ */ ++ if (*p == '=') { ++ *p = '\0'; ++ for (*valuep = ++p; ++ *p && *p != ',' && *p != ' ' && *p != '\t'; ++p); ++ if (*p) ++ *p++ = '\0'; ++ } else ++ *p++ = '\0'; ++ /* Skip any whitespace or commas after this token. */ ++ for (; *p && (*p == ',' || *p == ' ' || *p == '\t'); ++p); ++ } ++ ++ /* set optionp for next round. */ ++ *optionp = p; ++ ++ for (cnt = 0; *tokens; ++tokens, ++cnt) ++ if (!strcmp(suboptarg, *tokens)) ++ return(cnt); ++ return(-1); ++} +diff -uNr renameutils-0.12.0/src/editformats/Makefile.am renameutils-0.12.0.mod/src/editformats/Makefile.am +--- renameutils-0.12.0/src/editformats/Makefile.am 2012-04-23 14:11:26.000000000 +0300 ++++ renameutils-0.12.0.mod/src/editformats/Makefile.am 2020-01-02 20:54:12.826838061 +0200 +@@ -9,4 +9,5 @@ + lib_editformats_a_SOURCES = \ + destination-only.c \ + dual-column.c \ +- single-column.c ++ single-column.c \ ++ getsubopt.c +diff -uNr renameutils-0.12.0/src/editformats/Makefile.in renameutils-0.12.0.mod/src/editformats/Makefile.in +--- renameutils-0.12.0/src/editformats/Makefile.in 2012-04-23 14:24:11.000000000 +0300 ++++ renameutils-0.12.0.mod/src/editformats/Makefile.in 2020-01-02 20:55:04.196335228 +0200 +@@ -154,7 +154,7 @@ + lib_editformats_a_AR = $(AR) $(ARFLAGS) + lib_editformats_a_LIBADD = + am_lib_editformats_a_OBJECTS = destination-only.$(OBJEXT) \ +- dual-column.$(OBJEXT) single-column.$(OBJEXT) ++ dual-column.$(OBJEXT) single-column.$(OBJEXT) getsubopt.$(OBJEXT) + lib_editformats_a_OBJECTS = $(am_lib_editformats_a_OBJECTS) + DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) + depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +@@ -979,7 +979,8 @@ + lib_editformats_a_SOURCES = \ + destination-only.c \ + dual-column.c \ +- single-column.c ++ single-column.c \ ++ getsubopt.c + + all: all-am + +diff -uNr renameutils-0.12.0/src/interactive.c renameutils-0.12.0.mod/src/interactive.c +--- renameutils-0.12.0/src/interactive.c 2008-09-21 12:10:31.000000000 +0300 ++++ renameutils-0.12.0.mod/src/interactive.c 2020-01-02 20:45:42.994296610 +0200 +@@ -23,9 +23,6 @@ + # include /* POSIX */ + #endif + #include /* gnulib (POSIX) */ +-#if HAVE_WORDEXP_H +-#include /* POSIX */ +-#endif + #include /* gnulib (POSIX) */ + #include /* C89 */ + #include /* C89 */ +@@ -45,6 +42,7 @@ + #include "common/comparison.h" + #include "common/string-utils.h" + #include "common/error.h" ++#include "common/wordexp.h" + #include "qcmd.h" + + struct Command { diff --git a/packages/renameutils/build.sh b/packages/renameutils/build.sh new file mode 100644 index 000000000..d9062fc31 --- /dev/null +++ b/packages/renameutils/build.sh @@ -0,0 +1,7 @@ +TERMUX_PKG_HOMEPAGE=https://www.nongnu.org/renameutils/ +TERMUX_PKG_DESCRIPTION="A set of programs designed to make renaming of files faster and less cumbersome" +TERMUX_PKG_LICENSE="GPL-2.0" +TERMUX_PKG_VERSION=0.12.0 +TERMUX_PKG_SRCURL=https://savannah.nongnu.org/download/renameutils/renameutils-$TERMUX_PKG_VERSION.tar.gz +TERMUX_PKG_SHA256=cbd2f002027ccf5a923135c3f529c6d17fabbca7d85506a394ca37694a9eb4a3 +TERMUX_PKG_DEPENDS="readline" diff --git a/packages/renameutils/fix-tmpdir.patch b/packages/renameutils/fix-tmpdir.patch new file mode 100644 index 000000000..e7b52a9a1 --- /dev/null +++ b/packages/renameutils/fix-tmpdir.patch @@ -0,0 +1,12 @@ +diff -uNr renameutils-0.12.0/src/common/io-utils.c renameutils-0.12.0.mod/src/common/io-utils.c +--- renameutils-0.12.0/src/common/io-utils.c 2008-09-21 12:11:38.000000000 +0300 ++++ renameutils-0.12.0.mod/src/common/io-utils.c 2020-01-02 21:05:14.564767978 +0200 +@@ -183,7 +183,7 @@ + if (tmpdir == NULL) + tmpdir = P_tmpdir; + if (tmpdir == NULL) +- tmpdir = "/tmp"; ++ tmpdir = "@TERMUX_PREFIX@/tmp"; + name = xasprintf("%s/%sXXXXXX", tmpdir, base); + } else { + name = xasprintf("%sXXXXXX", base); diff --git a/packages/renameutils/fix-typos.patch b/packages/renameutils/fix-typos.patch new file mode 100644 index 000000000..9dd1b2699 --- /dev/null +++ b/packages/renameutils/fix-typos.patch @@ -0,0 +1,24 @@ +diff -uNr renameutils-0.12.0/src/Makefile.am renameutils-0.12.0.mod/src/Makefile.am +--- renameutils-0.12.0/src/Makefile.am 2012-04-23 14:10:43.000000000 +0300 ++++ renameutils-0.12.0.mod/src/Makefile.am 2020-01-02 21:01:40.172933544 +0200 +@@ -49,7 +49,7 @@ + @[ -f icp ] || (echo $(LN_S) icmd icp ; $(LN_S) icmd icp) + + install-exec-local: +- $(mkdir_p) $(DESTDIR)($bindir) ++ $(mkdir_p) $(DESTDIR)$(bindir) + @[ -f $(DESTDIR)$(bindir)/qmv ] || (echo $(LN_S) qcmd $(DESTDIR)$(bindir)/qmv ; $(LN_S) qcmd $(DESTDIR)$(bindir)/qmv) + @[ -f $(DESTDIR)$(bindir)/qcp ] || (echo $(LN_S) qcmd $(DESTDIR)$(bindir)/qcp ; $(LN_S) qcmd $(DESTDIR)$(bindir)/qcp) + @[ -f $(DESTDIR)$(bindir)/imv ] || (echo $(LN_S) icmd $(DESTDIR)$(bindir)/imv ; $(LN_S) icmd $(DESTDIR)$(bindir)/imv) +diff -uNr renameutils-0.12.0/src/Makefile.in renameutils-0.12.0.mod/src/Makefile.in +--- renameutils-0.12.0/src/Makefile.in 2012-04-23 14:24:10.000000000 +0300 ++++ renameutils-0.12.0.mod/src/Makefile.in 2020-01-02 21:01:59.269099337 +0200 +@@ -1577,7 +1577,7 @@ + @[ -f icp ] || (echo $(LN_S) icmd icp ; $(LN_S) icmd icp) + + install-exec-local: +- $(mkdir_p) $(DESTDIR)($bindir) ++ $(mkdir_p) $(DESTDIR)$(bindir) + @[ -f $(DESTDIR)$(bindir)/qmv ] || (echo $(LN_S) qcmd $(DESTDIR)$(bindir)/qmv ; $(LN_S) qcmd $(DESTDIR)$(bindir)/qmv) + @[ -f $(DESTDIR)$(bindir)/qcp ] || (echo $(LN_S) qcmd $(DESTDIR)$(bindir)/qcp ; $(LN_S) qcmd $(DESTDIR)$(bindir)/qcp) + @[ -f $(DESTDIR)$(bindir)/imv ] || (echo $(LN_S) icmd $(DESTDIR)$(bindir)/imv ; $(LN_S) icmd $(DESTDIR)$(bindir)/imv)