+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
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
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
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);
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--) {
} 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";
tag = RPMTAG_TRIGGERSCRIPTS;
reqtag = RPMTAG_TRIGGERIN;
progtag = RPMTAG_TRIGGERSCRIPTPROG;
+ partname = "%triggerin";
break;
case PART_TRIGGERUN:
tag = RPMTAG_TRIGGERSCRIPTS;
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) {
case PART_VERIFYSCRIPT:
case PART_TRIGGERIN:
case PART_TRIGGERUN:
+ case PART_TRIGGERPOSTUN:
parsePart = parseScript(spec, parsePart);
break;
+++ /dev/null
-/* 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);
- }
-}
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}
};
#define PART_TRIGGERUN 14
#define PART_VERIFYSCRIPT 15
#define PART_BUILDARCHITECTURES 16
+#define PART_TRIGGERPOSTUN 17
int isPart(char *line);
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";
#define RPMTAG_INSTPREFIXES 1099
#define RPMTAG_TRIGGERIN 1100 /* internal */
#define RPMTAG_TRIGGERUN 1101 /* internal */
+#define RPMTAG_TRIGGERPOSTUN 1102 /* internal */
#define RPMTAG_EXTERNAL_TAG 1000000
#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 */