[popt] Applied patches/popt-1.16-6.fc23/popt-1.16-execfail.patch.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Mon, 7 Sep 2015 20:16:44 +0000 (16:16 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Mon, 7 Sep 2015 20:16:44 +0000 (16:16 -0400)
extlib/popt/popt.c
extlib/popt/poptint.h

index 879f899..944992f 100644 (file)
@@ -202,6 +202,7 @@ poptContext poptGetContext(const char * name, int argc, const char ** argv,
     con->flags = flags;
     con->execs = NULL;
     con->numExecs = 0;
+    con->execFail = NULL;
     con->finalArgvAlloced = argc * 2;
     con->finalArgv = calloc( (size_t)con->finalArgvAlloced, sizeof(*con->finalArgv) );
     con->execAbsolute = 1;
@@ -246,6 +247,7 @@ void poptResetContext(poptContext con)
     con->nextLeftover = 0;
     con->restLeftover = 0;
     con->doExec = NULL;
+    con->execFail = _free(con->execFail);
 
     if (con->finalArgv != NULL)
     for (i = 0; i < con->finalArgvCount; i++) {
@@ -582,6 +584,7 @@ if (_popt_debug)
 /*@-nullstate@*/
     rc = execvp(argv[0], (char *const *)argv);
 /*@=nullstate@*/
+    con->execFail = xstrdup(argv[0]);
 
 exit:
     if (argv) {
@@ -1715,11 +1718,19 @@ int poptAddItem(poptContext con, poptItem newItem, int flags)
 const char * poptBadOption(poptContext con, unsigned int flags)
 {
     struct optionStackEntry * os = NULL;
+    const char *badOpt = NULL;
+
+    if (con != NULL) {
+       /* Stupid hack to return something semi-meaningful from exec failure */
+       if (con->execFail) {
+           badOpt = con->execFail;
+       } else {
+           os = (flags & POPT_BADOPTION_NOALIAS) ? con->optionStack : con->os;
+           badOpt = os->argv[os->next - 1];
+       }
+    }
 
-    if (con != NULL)
-       os = (flags & POPT_BADOPTION_NOALIAS) ? con->optionStack : con->os;
-
-    return (os != NULL && os->argv != NULL ? os->argv[os->next - 1] : NULL);
+    return badOpt;
 }
 
 const char * poptStrerror(const int error)
index 720728f..0bf63bd 100644 (file)
@@ -132,6 +132,7 @@ struct poptContext_s {
 /*@owned@*/ /*@null@*/
     poptItem execs;
     int numExecs;
+    char * execFail;
 /*@only@*/ /*@null@*/
     poptArgv finalArgv;
     int finalArgvCount;