Remove rpmio internal copy of poptParseArgvString() & friends
authorPanu Matilainen <pmatilai@redhat.com>
Wed, 12 Mar 2008 13:34:49 +0000 (15:34 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Wed, 12 Mar 2008 13:34:49 +0000 (15:34 +0200)
- the old included version segfaults with funky input and whatnot...
- link rpmio to real popt instead

rpmio/Makefile.am
rpmio/rpmfileutil.c

index 7f33c4c..cda6457 100644 (file)
@@ -27,6 +27,7 @@ librpmio_la_LIBADD = \
        @WITH_BZ2_LIB@ \
        @WITH_ZLIB_LIB@ \
        @WITH_LIBELF_LIB@ \
+       @WITH_POPT_LIB@ \
        -lpthread
 
 check_PROGRAMS =
index e0f73e7..08b3040 100644 (file)
@@ -593,117 +593,6 @@ char * rpmGetPath(const char *path, ...)
 }
 
 /* =============================================================== */
-/* XXX dupe'd to avoid change in linkage conventions. */
-
-#define POPT_ERROR_NOARG        -10     /*!< missing argument */
-#define POPT_ERROR_BADQUOTE     -15     /*!< error in paramter quoting */
-#define POPT_ERROR_MALLOC       -21     /*!< memory allocation failed */
-
-#define POPT_ARGV_ARRAY_GROW_DELTA 5
-
-static int XpoptDupArgv(int argc, const char **argv,
-               int * argcPtr, const char *** argvPtr)
-{
-    size_t nb = (argc + 1) * sizeof(*argv);
-    const char ** argv2;
-    char * dst;
-    int i;
-
-    if (argc <= 0 || argv == NULL)     /* XXX can't happen */
-       return POPT_ERROR_NOARG;
-    for (i = 0; i < argc; i++) {
-       if (argv[i] == NULL)
-           return POPT_ERROR_NOARG;
-       nb += strlen(argv[i]) + 1;
-    }
-       
-    dst = malloc(nb);
-    if (dst == NULL)                   /* XXX can't happen */
-       return POPT_ERROR_MALLOC;
-    argv2 = (void *) dst;
-    dst += (argc + 1) * sizeof(*argv);
-
-    for (i = 0; i < argc; i++) {
-       argv2[i] = dst;
-       dst += strlen(strcpy(dst, argv[i])) + 1;
-    }
-    argv2[argc] = NULL;
-
-    if (argvPtr) {
-       *argvPtr = argv2;
-    } else {
-       free(argv2);
-       argv2 = NULL;
-    }
-    if (argcPtr)
-       *argcPtr = argc;
-    return 0;
-}
-static int XpoptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
-{
-    const char * src;
-    char quote = '\0';
-    int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA;
-    const char ** argv = malloc(sizeof(*argv) * argvAlloced);
-    int argc = 0;
-    size_t buflen = strlen(s) + 1;
-    char * buf = memset(alloca(buflen), 0, buflen);
-    int rc = POPT_ERROR_MALLOC;
-
-    if (argv == NULL) return rc;
-    argv[argc] = buf;
-
-    for (src = s; *src != '\0'; src++) {
-       if (quote == *src) {
-           quote = '\0';
-       } else if (quote != '\0') {
-           if (*src == '\\') {
-               src++;
-               if (!*src) {
-                   rc = POPT_ERROR_BADQUOTE;
-                   goto exit;
-               }
-               if (*src != quote) *buf++ = '\\';
-           }
-           *buf++ = *src;
-       } else if (isspace(*src)) {
-           if (*argv[argc] != '\0') {
-               buf++, argc++;
-               if (argc == argvAlloced) {
-                   argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA;
-                   argv = realloc(argv, sizeof(*argv) * argvAlloced);
-                   if (argv == NULL) goto exit;
-               }
-               argv[argc] = buf;
-           }
-       } else switch (*src) {
-         case '"':
-         case '\'':
-           quote = *src;
-           break;
-         case '\\':
-           src++;
-           if (!*src) {
-               rc = POPT_ERROR_BADQUOTE;
-               goto exit;
-           }
-         default:
-           *buf++ = *src;
-           break;
-       }
-    }
-
-    if (strlen(argv[argc])) {
-       argc++, buf++;
-    }
-
-    rc = XpoptDupArgv(argc, argv, argcPtr, argvPtr);
-
-exit:
-    if (argv) free(argv);
-    return rc;
-}
-/* =============================================================== */
 static int _debug = 0;
 
 int rpmGlob(const char * patterns, int * argcPtr, char *** argvPtr)
@@ -727,7 +616,7 @@ int rpmGlob(const char * patterns, int * argcPtr, char *** argvPtr)
     if (home != NULL && strlen(home) > 0) 
        gflags |= GLOB_TILDE;
 
-    rc = XpoptParseArgvString(patterns, &ac, &av);
+    rc = poptParseArgvString(patterns, &ac, &av);
     if (rc)
        return rc;