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

Reply via email to