Added %triggerpostun
authormarc <devnull@localhost>
Wed, 1 Apr 1998 16:02:05 +0000 (16:02 +0000)
committermarc <devnull@localhost>
Wed, 1 Apr 1998 16:02:05 +0000 (16:02 +0000)
deps for shared libs
only check first 128 chars for non-printables

CVS patchset: 2058
CVS date: 1998/04/01 16:02:05

CHANGES
autodeps/linux.req
build.c
build/parseReqs.c
build/parseScript.c
build/parseSpec.c
build/parseTrigger.c [deleted file]
build/part.c
build/part.h
docs/triggers
lib/rpmlib.h

diff --git a/CHANGES b/CHANGES
index 79e8e7e..f0bb98b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+2.4.105 -> 2.5:
+       - build: inly check for non-printables in first 128 chars
+       - added %triggerpostun
+       - linux.req generates deps for shared libs
+
 2.4.104 -> 2.4.105:
        - added langpatt: to rpmrc, and mark files with matches
        - added some C++ cruft to rpmlib.h
index ae00b78..da1e73a 100644 (file)
@@ -8,6 +8,7 @@ ulimit -c 0
 filelist=`sed "s/['\"]/\\\&/g"`
 exelist=`echo $filelist | xargs -r file | fgrep executable | cut -d: -f1 `
 scriptlist=`echo $filelist | xargs -r file | egrep ":.*(perl |script )" | cut -d: -f1 `
+liblist=`echo $filelist | xargs -r file | grep "shared object" | cut -d : -f1 `
 
 for f in $exelist; do
     if [ -x $f ]; then
@@ -15,6 +16,10 @@ for f in $exelist; do
     fi
 done | sort -u | sed "s/['\"]/\\\&/g" | xargs -r -n 1 basename | sort -u
 
+for f in $liblist; do
+    ldd $f | awk '/=>/ { print $1 }'
+done | sort -u | sed "s/['\"]/\\\&/g" | xargs -r -n 1 basename | sort -u
+
 for f in $scriptlist; do
     if [ -x $f ]; then
        head -1 $f | sed -e 's/^\#\![   ]*//' | cut -d" " -f1
diff --git a/build.c b/build.c
index e23e745..33bf2d7 100644 (file)
--- a/build.c
+++ b/build.c
@@ -39,17 +39,30 @@ int build(char *arg, int buildAmount, char *passPhrase,
        sprintf(tmpSpecFile, "%s/rpm-spec-file-%d", specDir, (int) getpid());
 
        cmd = alloca(strlen(arg) + 50 + strlen(tmpSpecFile));
-       sprintf(cmd, "gunzip < %s | tar xOvf - \\*.spec 2>&1 > %s", arg,
+       sprintf(cmd, "gunzip < %s | tar xOvf - Specfile 2>&1 > %s", arg,
                        tmpSpecFile);
        if (!(f = popen(cmd, "r"))) {
            fprintf(stderr, _("Failed to open tar pipe: %s\n"), 
                        strerror(errno));
            return 1;
        }
-       if (!fgets(buf, sizeof(buf) - 1, f)) {
-           fprintf(stderr, _("Failed to read spec file from %s\n"), arg);
-           unlink(tmpSpecFile);
-           return 1;
+       if ((!fgets(buf, sizeof(buf) - 1, f)) || !strchr(buf, '/')) {
+           /* Try again */
+           pclose(f);
+
+           sprintf(cmd, "gunzip < %s | tar xOvf - \\*.spec 2>&1 > %s", arg,
+                   tmpSpecFile);
+           if (!(f = popen(cmd, "r"))) {
+               fprintf(stderr, _("Failed to open tar pipe: %s\n"), 
+                       strerror(errno));
+               return 1;
+           }
+           if (!fgets(buf, sizeof(buf) - 1, f)) {
+               /* Give up */
+               fprintf(stderr, _("Failed to read spec file from %s\n"), arg);
+               unlink(tmpSpecFile);
+               return 1;
+           }
        }
        pclose(f);
 
@@ -109,7 +122,7 @@ int build(char *arg, int buildAmount, char *passPhrase,
        fprintf(stderr, _("Unable to open spec file: %s\n"), specfile);
        return 1;
     }
-    count = read(fd, buf, sizeof(buf));
+    count = read(fd, buf, sizeof(buf) < 128 ? sizeof(buf) : 128);
     close(fd);
     s = buf;
     while(count--) {
index a248cea..f25e540 100644 (file)
@@ -56,6 +56,9 @@ int parseRequiresConflicts(Spec spec, Package pkg, char *field,
        } else if (tag == RPMTAG_TRIGGERIN) {
            flags = RPMSENSE_TRIGGERIN;
            name = "%triggerin";
+       } else if (tag == RPMTAG_TRIGGERPOSTUN) {
+           flags = RPMSENSE_TRIGGERUN;
+           name = "%triggerpostun";
        } else if (tag == RPMTAG_TRIGGERUN) {
            flags = RPMSENSE_TRIGGERUN;
            name = "%triggerun";
index 8a6e733..d7f7e5f 100644 (file)
@@ -89,6 +89,7 @@ int parseScript(Spec spec, int parsePart)
        tag = RPMTAG_TRIGGERSCRIPTS;
        reqtag = RPMTAG_TRIGGERIN;
        progtag = RPMTAG_TRIGGERSCRIPTPROG;
+       partname = "%triggerin";
        break;
       case PART_TRIGGERUN:
        tag = RPMTAG_TRIGGERSCRIPTS;
@@ -96,6 +97,12 @@ int parseScript(Spec spec, int parsePart)
        progtag = RPMTAG_TRIGGERSCRIPTPROG;
        partname = "%triggerun";
        break;
+      case PART_TRIGGERPOSTUN:
+       tag = RPMTAG_TRIGGERSCRIPTS;
+       reqtag = RPMTAG_TRIGGERPOSTUN;
+       progtag = RPMTAG_TRIGGERSCRIPTPROG;
+       partname = "%triggerpostun";
+       break;
     }
 
     if (tag == RPMTAG_TRIGGERSCRIPTS) {
index 311d627..124b113 100644 (file)
@@ -88,6 +88,7 @@ int parseSpec(Spec *specp, char *specFile, char *buildRoot,
          case PART_VERIFYSCRIPT:
          case PART_TRIGGERIN:
          case PART_TRIGGERUN:
+         case PART_TRIGGERPOSTUN:
            parsePart = parseScript(spec, parsePart);
            break;
 
diff --git a/build/parseTrigger.c b/build/parseTrigger.c
deleted file mode 100644 (file)
index d70ec12..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/* handle triggers */
-
-#include <stdlib.h>
-#include <string.h>
-
-int parseTrigger(Spec spec, int part)
-{
-    int nextPart;
-    char **lineArgv, **triggerArgv;
-    int lineArgc, triggerArgc;
-    int rc, dash;
-
-    if ((rc = poptParseArgvString(spec->line, &lineArgc, &lineArgv))) {
-       rpmError(RPMERR_BADSPEC, "line %d: Error parsing trigger options: %s",
-                spec->lineNum, partname, poptStrerror(rc));
-       return RPMERR_BADSPEC;
-    }
-    triggerArgv = lineArgv;
-    triggerArgc = lineArgc;
-
-    /* New stuff starts here */
-    
-    parseScript(spec, part);
-    
-    dash = 0;
-    while (dash <= lineArgc) {
-       if (!strcmp(lineArgv[dash], "--")) {
-           lineArgv[dash] = NULL;
-           if ((rc = parseScriptArgs(spec, dash, lineArgv,
-                                     &prog, &name, &flag))) {
-               free(lineArgv);
-               return rc;
-           }
-           triggerArgv = &(lineArgv[dash + 1]);
-           triggerArgc = lineArgc - dash - 1;
-           break;
-       }
-       dash++;
-    }
-
-    if ((rc = parseRequiresConflicts(spec, pkg, field,
-                                    RPMSENSE_TRIGGER_IN, index,
-                                    triggerArgc, triggerArgv))) {
-       free(lineArgv);
-       return rc;
-    }
-
-    return 0;
-}
-
-int addTrigger(struct PackageRec *package,
-              int sense, char *script, char *args)
-{
-    struct TriggerEntry *te;
-    int i;
-    char *arg = NULL;
-    struct ReqComp *rc = NULL;
-    char *version;
-
-    /* add the script */
-    i = package->trigger.used++;
-    if (i == package->trigger.alloced) {
-       /* extend */
-       package->trigger.alloced += CHUNK;
-       package->trigger.triggerScripts =
-           realloc(package->trigger.triggerScripts,
-                   package->trigger.alloced *
-                   sizeof(*(package->trigger.triggerScripts)));
-    }
-    package->trigger.triggerScripts[i] = strdup(script);
-    rpmMessage(RPMMESS_DEBUG, "TRIGGER %d:\n%s", i, script);
-
-    /* create the entry (or entries) */
-    te = NULL;
-    while (arg || (arg = strtok(args, " ,\t\n"))) {
-       if (!te) {
-           te = malloc(sizeof(*te));
-           te->flags = sense;
-       }
-       if ((version = strtok(NULL, " ,\t\n"))) {
-           rc = ReqComparisons;
-           while (rc->token && strcmp(version, rc->token)) {
-               rc++;
-           }
-           if (rc->token) {
-               /* read a version */
-               te->flags |= rc->flags;
-               version = strtok(NULL, " ,\t\n");
-           }
-       }
-       if ((te->flags & RPMSENSE_SENSEMASK) && !version) {
-           rpmError(RPMERR_BADSPEC, "Version required in trigger");
-           return RPMERR_BADSPEC;
-       }
-       te->name = strdup(arg);
-       te->version = (rc && rc->token && version) ? strdup(version) : NULL;
-       te->index = i;
-
-       rpmMessage(RPMMESS_DEBUG, "TRIGGER(%s): %s %s %s %d\n",
-              (sense == RPMSENSE_TRIGGER_IN) ? "in" : "un",
-              te->name,
-              (rc && rc->token) ? rc->token : "NONE",
-              te->version, te->index);
-       
-       /* link it in */
-       te->next = package->trigger.trigger;
-       package->trigger.trigger = te;
-       package->trigger.triggerCount++;
-       te = NULL;
-
-       /* prepare for next round */
-       arg = NULL;
-       if (! (rc && rc->token)) {
-           /* No version -- we just read a name */
-           arg = version;
-       }
-       args = NULL;
-    }
-
-    return 0;
-}
-
-void generateTriggerEntries(Header h, struct PackageRec *p)
-{
-    struct TriggerEntry *te;
-    int i;
-    char **nameArray;
-    char **versionArray;
-    int_32 *flagArray;
-    int_32 *indexArray;
-
-    /* Add the scripts */
-    
-    if (p->trigger.used) {
-       headerAddEntry(h, RPMTAG_TRIGGERSCRIPTS, RPM_STRING_ARRAY_TYPE,
-                p->trigger.triggerScripts, p->trigger.used);
-    }
-
-    /* Add the entries */
-
-    if (p->trigger.triggerCount) {
-       nameArray = malloc(p->trigger.triggerCount * sizeof(*nameArray));
-       versionArray = malloc(p->trigger.triggerCount * sizeof(*versionArray));
-       flagArray = malloc(p->trigger.triggerCount * sizeof(*flagArray));
-       indexArray = malloc(p->trigger.triggerCount * sizeof(*indexArray));
-       
-       te = p->trigger.trigger;
-       i = 0;
-       while (te) {
-           nameArray[i] = te->name;
-           versionArray[i] = te->version ? te->version : "";
-           flagArray[i] = te->flags;
-           indexArray[i] = te->index;
-           i++;
-           te = te->next;
-       }
-       
-       headerAddEntry(h, RPMTAG_TRIGGERNAME, RPM_STRING_ARRAY_TYPE, nameArray, i);
-       headerAddEntry(h, RPMTAG_TRIGGERVERSION, RPM_STRING_ARRAY_TYPE, versionArray, i);
-       headerAddEntry(h, RPMTAG_TRIGGERFLAGS, RPM_INT32_TYPE, flagArray, i);
-       headerAddEntry(h, RPMTAG_TRIGGERINDEX, RPM_INT32_TYPE, indexArray, i);
-    }
-}
-
-void freeTriggers(struct TriggerStruct t)
-{
-    char **s;
-    struct TriggerEntry *te;
-    
-    s = t.triggerScripts;
-    while (t.used--) {
-       FREE(*s++);
-    }
-    FREE(t.triggerScripts);
-
-    while (t.trigger) {
-       te = t.trigger;
-       t.trigger = t.trigger->next;
-       FREE(te->name);
-       FREE(te->version);
-       free(te);
-    }
-}
index a672049..9ad94c6 100644 (file)
@@ -7,22 +7,23 @@ static struct PartRec {
     int len;
     char *token;
 } partList[] = {
-    {PART_PREAMBLE,     0, "%package"},
-    {PART_PREP,         0, "%prep"},
-    {PART_BUILD,        0, "%build"},
-    {PART_INSTALL,      0, "%install"},
-    {PART_CLEAN,        0, "%clean"},
-    {PART_PREUN,        0, "%preun"},
-    {PART_POSTUN,       0, "%postun"},
-    {PART_PRE,          0, "%pre"},
-    {PART_POST,         0, "%post"},
-    {PART_FILES,        0, "%files"},
-    {PART_CHANGELOG,    0, "%changelog"},
-    {PART_DESCRIPTION,  0, "%description"},
-    {PART_TRIGGERUN,    0, "%triggerun"},
-    {PART_TRIGGERIN,    0, "%triggerin"},
-    {PART_TRIGGERIN,    0, "%trigger"},
-    {PART_VERIFYSCRIPT, 0, "%verifyscript"},
+    {PART_PREAMBLE,      0, "%package"},
+    {PART_PREP,          0, "%prep"},
+    {PART_BUILD,         0, "%build"},
+    {PART_INSTALL,       0, "%install"},
+    {PART_CLEAN,         0, "%clean"},
+    {PART_PREUN,         0, "%preun"},
+    {PART_POSTUN,        0, "%postun"},
+    {PART_PRE,           0, "%pre"},
+    {PART_POST,          0, "%post"},
+    {PART_FILES,         0, "%files"},
+    {PART_CHANGELOG,     0, "%changelog"},
+    {PART_DESCRIPTION,   0, "%description"},
+    {PART_TRIGGERPOSTUN, 0, "%triggerpostun"},
+    {PART_TRIGGERUN,     0, "%triggerun"},
+    {PART_TRIGGERIN,     0, "%triggerin"},
+    {PART_TRIGGERIN,     0, "%trigger"},
+    {PART_VERIFYSCRIPT,  0, "%verifyscript"},
     {0, 0, 0}
 };
 
index 6ddae32..af135e8 100644 (file)
@@ -18,6 +18,7 @@
 #define PART_TRIGGERUN          14
 #define PART_VERIFYSCRIPT       15
 #define PART_BUILDARCHITECTURES 16
+#define PART_TRIGGERPOSTUN      17
 
 int isPart(char *line);
 
index d72dbd8..af17e37 100644 (file)
@@ -97,15 +97,13 @@ Trigger Syntax
 
 Trigger specifications are of the form:
 
-       %trigger{un|in} {-n} {subpackage} {-p <program>} -- <trigger>
-
-The -n and -p arguments are the same as for %post scripts, except that
-only a single argument may be given to -p (for %post type scripts, a
-full command line, with arguments, may be specified). The <trigger>
-portion is syntactically equivalent to a "Requires" specification (version
-numbers may be used). If multiple items are given (comma separated), the
-trigger is run when *any* of those conditions becomes true (the , can be
-read as "or"). For example:
+       %trigger{un|in} [[-n] <subpackage>] [-p <program>] -- <trigger>
+
+The -n and -p arguments are the same as for %post scripts.  The
+<trigger> portion is syntactically equivalent to a "Requires"
+specification (version numbers may be used). If multiple items are
+given (comma separated), the trigger is run when *any* of those
+conditions becomes true (the , can be read as "or"). For example:
 
        %triggerin -n package -p /usr/bin/perl -- fileutils > 3.0, perl < 1.2
        print "I'm in my trigger!\n";
index 30c254b..1a1ebfa 100644 (file)
@@ -122,6 +122,7 @@ extern const struct headerSprintfExtension rpmHeaderFormats[];
 #define RPMTAG_INSTPREFIXES             1099
 #define RPMTAG_TRIGGERIN                1100 /* internal */
 #define RPMTAG_TRIGGERUN                1101 /* internal */
+#define RPMTAG_TRIGGERPOSTUN            1102 /* internal */
     
 #define RPMTAG_EXTERNAL_TAG            1000000
 
@@ -182,7 +183,9 @@ extern const struct headerSprintfExtension rpmHeaderFormats[];
 
 #define RPMSENSE_TRIGGERIN       (1 << 16)
 #define RPMSENSE_TRIGGERUN       (1 << 17)
-#define RPMSENSE_TRIGGER         (RPMSENSE_TRIGGERIN | RPMSENSE_TRIGGERUN)
+#define RPMSENSE_TRIGGERPOSTUN   (1 << 18)
+#define RPMSENSE_TRIGGER         (RPMSENSE_TRIGGERIN | RPMSENSE_TRIGGERUN | \
+                                  RPMSENSE_TRIGGERPOSTUN)
 
 /* Stuff for maintaining "variables" like SOURCEDIR, BUILDDIR, etc */