[popt] - Backport upstream patch to fix --opt=<arg> syntax for aliases (#293531)
Panu Matilainen
pmatilai at fedoraproject.org
Tue Jun 14 09:04:55 UTC 2011
commit 13c5b1d53417e20d42e1de0bf91119f3c3f6992e
Author: Panu Matilainen <pmatilai at redhat.com>
Date: Tue Jun 14 12:03:47 2011 +0300
- Backport upstream patch to fix --opt=<arg> syntax for aliases (#293531)
popt-1.13-alias-equal-arg.patch | 121 +++++++++++++++++++++++++++++++++++++++
popt.spec | 7 ++-
2 files changed, 127 insertions(+), 1 deletions(-)
---
diff --git a/popt-1.13-alias-equal-arg.patch b/popt-1.13-alias-equal-arg.patch
new file mode 100644
index 0000000..64a5460
--- /dev/null
+++ b/popt-1.13-alias-equal-arg.patch
@@ -0,0 +1,121 @@
+diff -up popt-1.13/popt.c.alias-equal-arg popt-1.13/popt.c
+--- popt-1.13/popt.c.alias-equal-arg 2007-12-11 20:04:06.000000000 +0200
++++ popt-1.13/popt.c 2011-06-14 11:57:21.000000000 +0300
+@@ -308,8 +308,9 @@ static int handleExec(/*@special@*/ popt
+
+ /* Only one of longName, shortName may be set at a time */
+ static int handleAlias(/*@special@*/ poptContext con,
+- /*@null@*/ const char * longName, char shortName,
+- /*@exposed@*/ /*@null@*/ const char * nextCharArg)
++ /*@null@*/ const char * longName, size_t longNameLen,
++ char shortName,
++ /*@exposed@*/ /*@null@*/ const char * nextArg)
+ /*@uses con->aliases, con->numAliases, con->optionStack, con->os,
+ con->os->currAlias, con->os->currAlias->option.longName @*/
+ /*@modifies con @*/
+@@ -319,9 +320,11 @@ static int handleAlias(/*@special@*/ pop
+ int i;
+
+ if (item) {
+- if (longName && (item->option.longName &&
+- !strcmp(longName, item->option.longName)))
++ if (longName && item->option.longName
++ && longNameLen == strlen(item->option.longName)
++ && !strncmp(longName, item->option.longName, longNameLen))
+ return 0;
++ else
+ if (shortName && shortName == item->option.shortName)
+ return 0;
+ }
+@@ -331,10 +334,14 @@ static int handleAlias(/*@special@*/ pop
+
+ for (i = con->numAliases - 1; i >= 0; i--) {
+ item = con->aliases + i;
+- if (longName && !(item->option.longName &&
+- !strcmp(longName, item->option.longName)))
+- continue;
+- else if (shortName != item->option.shortName)
++ if (longName) {
++ if (item->option.longName == NULL)
++ continue;
++ if (longNameLen != strlen(item->option.longName))
++ continue;
++ if (strncmp(longName, item->option.longName, longNameLen))
++ continue;
++ } else if (shortName != item->option.shortName)
+ continue;
+ break;
+ }
+@@ -343,8 +350,8 @@ static int handleAlias(/*@special@*/ pop
+ if ((con->os - con->optionStack + 1) == POPT_OPTION_DEPTH)
+ return POPT_ERROR_OPTSTOODEEP;
+
+- if (nextCharArg && *nextCharArg)
+- con->os->nextCharArg = nextCharArg;
++ if (longName == NULL && nextArg && *nextArg)
++ con->os->nextCharArg = nextArg;
+
+ con->os++;
+ con->os->next = 0;
+@@ -352,8 +359,20 @@ static int handleAlias(/*@special@*/ pop
+ con->os->nextArg = NULL;
+ con->os->nextCharArg = NULL;
+ con->os->currAlias = con->aliases + i;
+- rc = poptDupArgv(con->os->currAlias->argc, con->os->currAlias->argv,
+- &con->os->argc, &con->os->argv);
++ { const char ** av;
++ int ac = con->os->currAlias->argc;
++ /* Append --foo=bar arg to alias argv array (if present). */
++ if (longName && nextArg && *nextArg) {
++ int i;
++ av = alloca((ac + 1 + 1) * sizeof(*av));
++ for (i = 0; i < ac; i++)
++ av[i] = con->os->currAlias->argv[i];
++ av[ac++] = nextArg;
++ av[ac] = NULL;
++ } else
++ av = con->os->currAlias->argv;
++ rc = poptDupArgv(ac, av, &con->os->argc, &con->os->argv);
++ }
+ con->os->argb = NULL;
+
+ return (rc ? rc : 1);
+@@ -795,13 +814,6 @@ int poptGetNextOpt(poptContext con)
+ else
+ singleDash = 1;
+
+- /* XXX aliases with arg substitution need "--alias=arg" */
+- if (handleAlias(con, optString, '\0', NULL))
+- continue;
+-
+- if (handleExec(con, optString, '\0'))
+- continue;
+-
+ /* Check for "--long=arg" option. */
+ for (oe = optString; *oe && *oe != '='; oe++)
+ {};
+@@ -809,6 +821,15 @@ int poptGetNextOpt(poptContext con)
+ if (*oe == '=')
+ longArg = oe + 1;
+
++ /* XXX aliases with arg substitution need "--alias=arg" */
++ if (handleAlias(con, optString, optStringLen, '\0', longArg)) {
++ longArg = NULL;
++ continue;
++ }
++
++ if (handleExec(con, optString, '\0'))
++ continue;
++
+ opt = findOption(con->options, optString, optStringLen, '\0', &cb, &cbData,
+ singleDash);
+ if (!opt && !singleDash)
+@@ -834,7 +855,7 @@ int poptGetNextOpt(poptContext con)
+
+ con->os->nextCharArg = NULL;
+
+- if (handleAlias(con, NULL, *origOptString, origOptString + 1))
++ if (handleAlias(con, NULL, 0, *origOptString, origOptString + 1))
+ continue;
+
+ if (handleExec(con, NULL, *origOptString)) {
diff --git a/popt.spec b/popt.spec
index 55a703e..864f6d2 100644
--- a/popt.spec
+++ b/popt.spec
@@ -1,13 +1,14 @@
Summary: C library for parsing command line parameters
Name: popt
Version: 1.13
-Release: 8%{?dist}
+Release: 9%{?dist}
License: MIT
Group: System Environment/Libraries
URL: http://www.rpm5.org/
Source: http://www.rpm5.org/files/%{name}/%{name}-%{version}.tar.gz
Patch0: popt-1.13-multilib.patch
Patch1: popt-1.13-popt_fprintf.patch
+Patch2: popt-1.13-alias-equal-arg.patch
BuildRequires: gettext, doxygen, graphviz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -44,6 +45,7 @@ Install it if you need to link statically with libpopt.
%setup -q
%patch0 -p1 -b .multilib
%patch1 -p1 -b .popt_fprintf
+%patch2 -p1 -b .alias-equal-arg
%build
%configure --libdir=/%{_lib}
@@ -92,6 +94,9 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/libpopt.a
%changelog
+* Tue Jun 14 2011 Panu Matilainen <pmatilai at redhat.com>
+- Backport upstream patch to fix --opt=<arg> syntax for aliases (#293531)
+
* Wed Feb 09 2011 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 1.13-8
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
More information about the scm-commits
mailing list