From b8745a7b5db8d905ebd84de44349fc96674a5693 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Sun, 28 Dec 2014 12:32:09 +0100 Subject: [PATCH] musl: merge getopt changes from master to unbreak GNU getopt_long behaviour. --- srcpkgs/musl/patches/getopt.patch | 233 ++++++++++++++++++++++++++++++ srcpkgs/musl/template | 2 +- 2 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/musl/patches/getopt.patch diff --git a/srcpkgs/musl/patches/getopt.patch b/srcpkgs/musl/patches/getopt.patch new file mode 100644 index 0000000000..f6f9c01b1f --- /dev/null +++ b/srcpkgs/musl/patches/getopt.patch @@ -0,0 +1,233 @@ +--- src/misc/getopt.c 2014-10-14 19:32:42.000000000 +0200 ++++ src/misc/getopt.c 2014-12-28 12:26:01.385579878 +0100 +@@ -4,6 +4,7 @@ + #include + #include + #include "libc.h" ++#include "locale_impl.h" + + char *optarg; + int optind=1, opterr=1, optopt, __optpos, __optreset=0; +@@ -11,6 +12,18 @@ int optind=1, opterr=1, optopt, __optpos + #define optpos __optpos + weak_alias(__optreset, optreset); + ++void __getopt_msg(const char *a, const char *b, const char *c, size_t l) ++{ ++ FILE *f = stderr; ++ b = __lctrans_cur(b); ++ flockfile(f); ++ fwrite(a, strlen(a), 1, f) ++ && fwrite(b, strlen(b), 1, f) ++ && fwrite(c, l, 1, f) ++ && putc('\n', f); ++ funlockfile(f); ++} ++ + int getopt(int argc, char * const argv[], const char *optstring) + { + int i; +@@ -24,8 +37,20 @@ int getopt(int argc, char * const argv[] + optind = 1; + } + +- if (optind >= argc || !argv[optind] || argv[optind][0] != '-' || !argv[optind][1]) ++ if (optind >= argc || !argv[optind]) ++ return -1; ++ ++ if (argv[optind][0] != '-') { ++ if (optstring[0] == '-') { ++ optarg = argv[optind++]; ++ return 1; ++ } + return -1; ++ } ++ ++ if (!argv[optind][1]) ++ return -1; ++ + if (argv[optind][1] == '-' && !argv[optind][2]) + return optind++, -1; + +@@ -43,30 +68,31 @@ int getopt(int argc, char * const argv[] + optpos = 0; + } + +- for (i=0; (l = mbtowc(&d, optstring+i, MB_LEN_MAX)) && d!=c; i+=l>0?l:1); ++ if (optstring[0] == '-' || optstring[0] == '+') ++ optstring++; ++ ++ i = 0; ++ d = 0; ++ do { ++ l = mbtowc(&d, optstring+i, MB_LEN_MAX); ++ if (l>0) i+=l; else i++; ++ } while (l && d != c); + + if (d != c) { +- if (optstring[0] != ':' && opterr) { +- write(2, argv[0], strlen(argv[0])); +- write(2, ": illegal option: ", 18); +- write(2, optchar, k); +- write(2, "\n", 1); +- } ++ if (optstring[0] != ':' && opterr) ++ __getopt_msg(argv[0], ": unrecognized option: ", optchar, k); + return '?'; + } +- if (optstring[i+1] == ':') { +- if (optind >= argc) { ++ if (optstring[i] == ':') { ++ if (optstring[i+1] == ':') optarg = 0; ++ else if (optind >= argc) { + if (optstring[0] == ':') return ':'; +- if (opterr) { +- write(2, argv[0], strlen(argv[0])); +- write(2, ": option requires an argument: ", 31); +- write(2, optchar, k); +- write(2, "\n", 1); +- } ++ if (opterr) __getopt_msg(argv[0], ++ ": option requires an argument: ", ++ optchar, k); + return '?'; + } +- if (optstring[i+2] == ':') optarg = 0; +- if (optstring[i+2] != ':' || optpos) { ++ if (optstring[i+1] != ':' || optpos) { + optarg = argv[optind++] + optpos; + optpos = 0; + } +--- src/misc/getopt_long.c 2014-10-14 19:32:42.000000000 +0200 ++++ src/misc/getopt_long.c 2014-12-28 12:26:01.385579878 +0100 +@@ -2,37 +2,106 @@ + #include + #include + #include ++#include + + extern int __optpos, __optreset; + ++static void permute(char *const *argv, int dest, int src) ++{ ++ char **av = (char **)argv; ++ char *tmp = av[src]; ++ int i; ++ for (i=src; i>dest; i--) ++ av[i] = av[i-1]; ++ av[dest] = tmp; ++} ++ ++void __getopt_msg(const char *, const char *, const char *, size_t); ++ ++static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly); ++ + static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly) + { ++ int ret, skipped, resumed; ++ const char *optstring2 = optstring + 1; + if (!optind || __optreset) { + __optreset = 0; + __optpos = 0; + optind = 1; + } +- if (optind >= argc || !argv[optind] || argv[optind][0] != '-') return -1; +- if ((longonly && argv[optind][1]) || +- (argv[optind][1] == '-' && argv[optind][2])) +- { ++ if (optind >= argc || !argv[optind]) return -1; ++ skipped = optind; ++ if (optstring[0] != '+' && optstring[0] != '-') { + int i; +- for (i=0; longopts[i].name; i++) { ++ for (i=optind; ; i++) { ++ if (i >= argc || !argv[i]) return -1; ++ if (argv[i][0] == '-' && argv[i][1]) break; ++ } ++ optind = i; ++ optstring2 = optstring; ++ } ++ resumed = optind; ++ ret = __getopt_long_core(argc, argv, optstring2, longopts, idx, longonly); ++ if (resumed > skipped) { ++ int i, cnt = optind-resumed; ++ for (i=0; i