RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 16-Apr-2009 06:04:46 Branch: HEAD Handle: 2009041604044402 Modified files: rpm CHANGES rpm/build parseScript.c rpm/lib psm.c rpmds.c rpm/rpmio macro.c rpmpython.c rpmpython.h Log: - python: load and use sys.argv. - ruby: finish converting to WITH_RUBYEMBED. - use poptParseArgvString, not argvSplit, for shell arg escaping. Summary: Revision Changes Path 1.2936 +3 -0 rpm/CHANGES 2.71 +1 -1 rpm/build/parseScript.c 2.360 +10 -9 rpm/lib/psm.c 2.150 +1 -1 rpm/lib/rpmds.c 2.225 +127 -124 rpm/rpmio/macro.c 2.10 +29 -16 rpm/rpmio/rpmpython.c 2.6 +0 -1 rpm/rpmio/rpmpython.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2935 -r1.2936 CHANGES --- rpm/CHANGES 15 Apr 2009 23:01:40 -0000 1.2935 +++ rpm/CHANGES 16 Apr 2009 04:04:44 -0000 1.2936 @@ -1,5 +1,8 @@ 5.2a4 -> 5.2b1: + - jbj: python: load and use sys.argv. + - jbj: ruby: finish converting to WITH_RUBYEMBED. + - jbj: use poptParseArgvString, not argvSplit, for shell arg escaping. - jbj: rework the embedded interpreter API's preparing to handle args. - jbj: permit args in PHP like %{python a b c:...} syntax. - jbj: map NULL interp to lazily instantiated globally persistent instance. @@ . patch -p0 <<'@@ .' Index: rpm/build/parseScript.c ============================================================================ $ cvs diff -u -r2.70 -r2.71 parseScript.c --- rpm/build/parseScript.c 8 Apr 2009 18:13:04 -0000 2.70 +++ rpm/build/parseScript.c 16 Apr 2009 04:04:45 -0000 2.71 @@ -325,7 +325,7 @@ "BuiltinPythonScripts", "5.2-1"); } else #endif -#ifdef WITH_RUBY +#ifdef WITH_RUBYEMBED if (!strcmp(progArgv[0], "<ruby>")) { (void) rpmlibNeedsFeature(pkg->header, "BuiltinRubyScripts", "5.2-1"); @@ . patch -p0 <<'@@ .' Index: rpm/lib/psm.c ============================================================================ $ cvs diff -u -r2.359 -r2.360 psm.c --- rpm/lib/psm.c 14 Apr 2009 19:27:58 -0000 2.359 +++ rpm/lib/psm.c 16 Apr 2009 04:04:45 -0000 2.360 @@ -630,6 +630,7 @@ /*...@globals h_errno, fileSystem, internalState @*/ /*...@modifies psm, fileSystem, internalState @*/ { + char * av[] = { NULL, NULL, NULL, NULL }; int rootFdno = -1; rpmRC rc = RPMRC_OK; int xx; @@ -641,6 +642,12 @@ if (ssp != NULL) *ssp |= (RPMSCRIPT_STATE_LUA|RPMSCRIPT_STATE_EXEC); + av[0] = (char *) Phe->p.argv[0]; + if (arg1 >= 0) + (void) sprintf((av[1] = alloca(32)), "%d", arg1); + if (arg2 >= 0) + (void) sprintf((av[2] = alloca(32)), "%d", arg2); + #if defined(WITH_LUA) if (!strcmp(Phe->p.argv[0], "<lua>")) { rc = runLuaScript(psm, sln, Phe, script, arg1, arg2); @@ -662,15 +669,9 @@ #endif #if defined(WITH_PYTHONEMBED) if (!strcmp(Phe->p.argv[0], "<python>")) { - rpmpython python = rpmpythonNew(NULL, 0); - char args[128]; - (void)snprintf(args, sizeof(args), "arg = (%d,%d)", arg1, arg2); - args[sizeof(args)-1] = '\0'; - if (rpmpythonRun(python, args, NULL) == RPMRC_OK - && rpmpythonRun(python, script, NULL) == RPMRC_OK) - rc = RPMRC_OK; - else - rc = RPMRC_FAIL; + rpmpython python = rpmpythonNew((const char **)av, 0); + rc = rpmpythonRun(python, script, NULL) == RPMRC_OK + ? RPMRC_OK : RPMRC_FAIL; python = rpmpythonFree(python); } else #endif @@ . patch -p0 <<'@@ .' Index: rpm/lib/rpmds.c ============================================================================ $ cvs diff -u -r2.149 -r2.150 rpmds.c --- rpm/lib/rpmds.c 15 Apr 2009 12:15:51 -0000 2.149 +++ rpm/lib/rpmds.c 16 Apr 2009 04:04:45 -0000 2.150 @@ -1484,7 +1484,7 @@ ( RPMSENSE_EQUAL), N_("internal embedded python scripts.") }, #endif -#if defined(WITH_RUBY) +#if defined(WITH_RUBYEMBED) { "rpmlib(BuiltinRubyScripts)", "5.2-1", ( RPMSENSE_EQUAL), N_("internal embedded ruby scripts.") }, @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/macro.c ============================================================================ $ cvs diff -u -r2.224 -r2.225 macro.c --- rpm/rpmio/macro.c 15 Apr 2009 23:01:40 -0000 2.224 +++ rpm/rpmio/macro.c 16 Apr 2009 04:04:46 -0000 2.225 @@ -63,7 +63,6 @@ #include <rpmio_internal.h> #include <rpmlog.h> -#include <argv.h> #include <mire.h> #ifdef WITH_LUA @@ -1443,6 +1442,123 @@ return rc; } +#if !defined(DEBUG_MACROS) +/* =============================================================== */ +/* 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) + /*...@modifies *argcPtr, *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 = xmalloc(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) + /*...@modifies *argcPtr, *argvPtr @*/ +{ + const char * src; + char quote = '\0'; + int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA; + const char ** argv = xmalloc(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; + /*...@switchbreak@*/ break; + case '\\': + src++; + if (!*src) { + rc = POPT_ERROR_BADQUOTE; + goto exit; + } + /*...@fallthrough@*/ + default: + *buf++ = *src; + /*...@switchbreak@*/ break; + } + } + + if (strlen(argv[argc])) { + argc++, buf++; + } + + rc = XpoptDupArgv(argc, argv, argcPtr, argvPtr); + +exit: + if (argv) free(argv); + return rc; +} +#endif /* !defined(DEBUG_MACROS) */ /** * Parse args and string for PHP like %{foo <args> : <string> } syntax. @@ -1454,7 +1570,6 @@ static char * parseEmbedded(const char * s, size_t nb, const char *** avp) /*...@*/ { - char * args = NULL; char * script = NULL; const char * se; @@ -1467,11 +1582,15 @@ bingo: { size_t na = (size_t)(se-s-1); - int xx; + char * args = NULL; + int ac; + int rc; args = memcpy(xmalloc(na+1), s+1, na); args[na] = '\0'; - xx = argvSplit(avp, args, NULL); + + ac = 0; + rc = XpoptParseArgvString(args, &ac, avp); args = _free(args); nb -= na; } @@ -1780,7 +1899,7 @@ } } perl = rpmperlFree(perl); - av = argvFree(av); + av = _free(av); script = _free(script); s = se; continue; @@ -1808,7 +1927,7 @@ } } python = rpmpythonFree(python); - av = argvFree(av); + av = _free(av); script = _free(script); s = se; continue; @@ -1836,7 +1955,7 @@ } } ruby = rpmrubyFree(ruby); - av = argvFree(av); + av = _free(av); script = _free(script); s = se; continue; @@ -1861,7 +1980,7 @@ mb->nb -= len; } tcl = rpmtclFree(tcl); - av = argvFree(av); + av = _free(av); script = _free(script); s = se; continue; @@ -2037,122 +2156,6 @@ #if !defined(DEBUG_MACROS) /* =============================================================== */ -/* 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) - /*...@modifies *argcPtr, *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 = xmalloc(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) - /*...@modifies *argcPtr, *argvPtr @*/ -{ - const char * src; - char quote = '\0'; - int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA; - const char ** argv = xmalloc(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; - /*...@switchbreak@*/ break; - case '\\': - src++; - if (!*src) { - rc = POPT_ERROR_BADQUOTE; - goto exit; - } - /*...@fallthrough@*/ - default: - *buf++ = *src; - /*...@switchbreak@*/ break; - } - } - - if (strlen(argv[argc])) { - argc++, buf++; - } - - rc = XpoptDupArgv(argc, argv, argcPtr, argvPtr); - -exit: - if (argv) free(argv); - return rc; -} - -/* =============================================================== */ /*...@unchecked@*/ static int _debug = 0; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmpython.c ============================================================================ $ cvs diff -u -r2.9 -r2.10 rpmpython.c --- rpm/rpmio/rpmpython.c 15 Apr 2009 23:01:40 -0000 2.9 +++ rpm/rpmio/rpmpython.c 16 Apr 2009 04:04:46 -0000 2.10 @@ -1,5 +1,7 @@ #include "system.h" +#include <argv.h> + #define _RPMPYTHON_INTERNAL #include "rpmpython.h" @@ -22,7 +24,6 @@ { rpmpython python = _python; - python->flags = 0; #if defined(WITH_PYTHONEMBED) Py_Finalize(); #endif @@ -49,39 +50,51 @@ /*...@unchecked@*/ #if defined(WITH_PYTHONEMBED) static const char * rpmpythonInitStringIO = "\ -import rpm\n\ import sys\n\ from cStringIO import StringIO\n\ -stdout = sys.stdout\n\ sys.stdout = StringIO()\n\ +import rpm\n\ "; #endif +static rpmpython rpmpythonI(void) + /*...@globals _rpmpythonI @*/ + /*...@modifies _rpmpythonI @*/ +{ + if (_rpmpythonI == NULL) + _rpmpythonI = rpmpythonNew(NULL, 0); + return _rpmpythonI; +} + rpmpython rpmpythonNew(const char ** av, int flags) { - rpmpython python = rpmpythonGetPool(_rpmpythonPool); + static const char * _av[] = { "rpmpython", NULL }; + int initialize = (!flags || _rpmpythonI == NULL); + rpmpython python = (flags ? rpmpythonI() : rpmpythonGetPool(_rpmpythonPool)); + +if (_rpmpython_debug) +fprintf(stderr, "==> %s(%p, %d) python %p\n", __FUNCTION__, av, flags, python); - python->flags = flags; + if (av == NULL) av = _av; #if defined(WITH_PYTHONEMBED) - Py_Initialize(); + if (!Py_IsInitialized()) { + Py_SetProgramName((char *)_av[0]); + Py_Initialize(); + } if (PycStringIO == NULL) PycStringIO = PyCObject_Import("cStringIO", "cStringIO_CAPI"); - (void) rpmpythonRun(python, rpmpythonInitStringIO, NULL); + + if (initialize) { + int ac = argvCount(av); + (void) PySys_SetArgv(ac, (char **)av); + (void) rpmpythonRun(python, rpmpythonInitStringIO, NULL); + } #endif return rpmpythonLink(python); } -static rpmpython rpmpythonI(void) - /*...@globals _rpmpythonI @*/ - /*...@modifies _rpmpythonI @*/ -{ - if (_rpmpythonI == NULL) - _rpmpythonI = rpmpythonNew(NULL, 0); - return _rpmpythonI; -} - rpmRC rpmpythonRunFile(rpmpython python, const char * fn, const char ** resultp) { rpmRC rc = RPMRC_FAIL; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmpython.h ============================================================================ $ cvs diff -u -r2.5 -r2.6 rpmpython.h --- rpm/rpmio/rpmpython.h 15 Apr 2009 23:01:40 -0000 2.5 +++ rpm/rpmio/rpmpython.h 16 Apr 2009 04:04:46 -0000 2.6 @@ -19,7 +19,6 @@ #if defined(_RPMPYTHON_INTERNAL) struct rpmpython_s { struct rpmioItem_s _item; /*!< usage mutex and pool identifier. */ - int flags; void * I; /* (unused) */ }; #endif /* _RPMPYTHON_INTERNAL */ @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org