From: Panu Matilainen Date: Wed, 12 Mar 2008 13:34:49 +0000 (+0200) Subject: Remove rpmio internal copy of poptParseArgvString() & friends X-Git-Tag: tznext/4.11.0.1.tizen20130304~4575 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f1f6510ceecc99fb4d3fc0c840e5b87232566174;p=tools%2Flibrpm-tizen.git Remove rpmio internal copy of poptParseArgvString() & friends - the old included version segfaults with funky input and whatnot... - link rpmio to real popt instead --- diff --git a/rpmio/Makefile.am b/rpmio/Makefile.am index 7f33c4c..cda6457 100644 --- a/rpmio/Makefile.am +++ b/rpmio/Makefile.am @@ -27,6 +27,7 @@ librpmio_la_LIBADD = \ @WITH_BZ2_LIB@ \ @WITH_ZLIB_LIB@ \ @WITH_LIBELF_LIB@ \ + @WITH_POPT_LIB@ \ -lpthread check_PROGRAMS = diff --git a/rpmio/rpmfileutil.c b/rpmio/rpmfileutil.c index e0f73e7..08b3040 100644 --- a/rpmio/rpmfileutil.c +++ b/rpmio/rpmfileutil.c @@ -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;