Skip to content

Commit

Permalink
Store trigger file info natively in STL vectors
Browse files Browse the repository at this point in the history
  • Loading branch information
pmatilai committed May 16, 2024
1 parent 03ae972 commit 910b660
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 62 deletions.
34 changes: 17 additions & 17 deletions build/pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,13 +139,14 @@ static rpmRC addFileToTag(rpmSpec spec, const char * file,

static rpmRC processScriptFiles(rpmSpec spec, Package pkg)
{
struct TriggerFileEntry *p;
int addflags = 0;
rpmRC rc = RPMRC_FAIL;
Header h = pkg->header;
struct TriggerFileEntry *tfa[] = {pkg->triggerFiles,
pkg->fileTriggerFiles,
pkg->transFileTriggerFiles};
std::vector<std::vector<TriggerFileEntry>*> tfa {
&pkg->triggerFiles,
&pkg->fileTriggerFiles,
&pkg->transFileTriggerFiles
};

rpmTagVal progTags[] = {RPMTAG_TRIGGERSCRIPTPROG,
RPMTAG_FILETRIGGERSCRIPTPROG,
Expand All @@ -161,7 +162,6 @@ static rpmRC processScriptFiles(rpmSpec spec, Package pkg)
rpmTagVal priorityTags[] = {0,
RPMTAG_FILETRIGGERPRIORITIES,
RPMTAG_TRANSFILETRIGGERPRIORITIES};
int i;

if (addFileToTag(spec, pkg->preInFile, h, RPMTAG_PREIN, 1) ||
addFileToTag(spec, pkg->preUnFile, h, RPMTAG_PREUN, 1) ||
Expand All @@ -176,32 +176,32 @@ static rpmRC processScriptFiles(rpmSpec spec, Package pkg)
goto exit;
}


for (i = 0; i < sizeof(tfa)/sizeof(tfa[0]); i++) {
/* we need the index number for accessing the other associated arrays */
for (size_t i = 0; i < tfa.size(); ++i) {
addflags = 0;
/* if any trigger has flags, we need to add flags entry for all of them */
for (p = tfa[i]; p != NULL; p = p->next) {
if (p->flags) {
for (auto const & p : *tfa[i]) {
if (p.flags) {
addflags = 1;
break;
}
}

for (p = tfa[i]; p != NULL; p = p->next) {
headerPutString(h, progTags[i], p->prog);
for (auto const & p : *tfa[i]) {
headerPutString(h, progTags[i], p.prog);

if (priorityTags[i]) {
headerPutUint32(h, priorityTags[i], &p->priority, 1);
headerPutUint32(h, priorityTags[i], &p.priority, 1);
}

if (addflags) {
headerPutUint32(h, flagTags[i], &p->flags, 1);
headerPutUint32(h, flagTags[i], &p.flags, 1);
}

if (p->script) {
headerPutString(h, scriptTags[i], p->script);
} else if (p->fileName) {
if (addFileToTag(spec, p->fileName, h, scriptTags[i], 0)) {
if (p.script) {
headerPutString(h, scriptTags[i], p.script);
} else if (p.fileName) {
if (addFileToTag(spec, p.fileName, h, scriptTags[i], 0)) {
goto exit;
}
} else {
Expand Down
28 changes: 5 additions & 23 deletions build/parseScript.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@ static int addTriggerIndex(Package pkg, const char *file,
rpmTagVal tag, uint32_t priority)
{
struct TriggerFileEntry *tfe;
struct TriggerFileEntry *list;
struct TriggerFileEntry *last = NULL;
int index = 0;
struct TriggerFileEntry **tfp;
std::vector<TriggerFileEntry> *tfp;

if (tag == RPMTAG_FILETRIGGERSCRIPTS) {
tfp = &pkg->fileTriggerFiles;
Expand All @@ -37,32 +34,17 @@ static int addTriggerIndex(Package pkg, const char *file,
tfp = &pkg->triggerFiles;
}

list = *tfp;

while (list) {
last = list;
list = list->next;
}

if (last)
index = last->index + 1;

tfe = (struct TriggerFileEntry *)xcalloc(1, sizeof(*tfe));
tfp->push_back({});
tfe = &tfp->back();

tfe->fileName = (file) ? xstrdup(file) : NULL;
tfe->script = (script && *script != '\0') ? xstrdup(script) : NULL;
tfe->prog = xstrdup(prog);
tfe->flags = flags;
tfe->index = index;
tfe->index = tfp->size() - 1;
tfe->priority = priority;
tfe->next = NULL;

if (last)
last->next = tfe;
else
*tfp = tfe;

return index;
return tfe->index;
}

/* %trigger is a strange combination of %pre and Requires: behavior */
Expand Down
8 changes: 5 additions & 3 deletions build/rpmbuild_internal.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#ifndef _RPMBUILD_INTERNAL_H
#define _RPMBUILD_INTERNAL_H

#include <vector>

#include <rpm/rpmbuild.h>
#include <rpm/rpmutil.h>
#include <rpm/rpmstrpool.h>
Expand Down Expand Up @@ -208,9 +210,9 @@ struct Package_s {
char * postunTransFile; /*!< %postuntrans scriptlet. */
char * verifyFile; /*!< %verifyscript scriptlet. */

struct TriggerFileEntry * triggerFiles;
struct TriggerFileEntry * fileTriggerFiles;
struct TriggerFileEntry * transFileTriggerFiles;
std::vector<TriggerFileEntry> triggerFiles;
std::vector<TriggerFileEntry> fileTriggerFiles;
std::vector<TriggerFileEntry> transFileTriggerFiles;

ARGV_t fileFile;
ARGV_t fileList; /* If NULL, package will not be written */
Expand Down
28 changes: 9 additions & 19 deletions build/spec.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,14 @@

#define SKIPSPACE(s) { while (*(s) && risspace(*(s))) (s)++; }

/**
* @param p trigger entry chain
* @return NULL always
*/
static inline
struct TriggerFileEntry * freeTriggerFiles(struct TriggerFileEntry * p)
static void freeTriggerFiles(std::vector<TriggerFileEntry> &triggers)
{
struct TriggerFileEntry *o, *q = p;

while (q != NULL) {
o = q;
q = q->next;
o->fileName = _free(o->fileName);
o->script = _free(o->script);
o->prog = _free(o->prog);
free(o);
for (auto & e : triggers) {
free(e.fileName);
free(e.script);
free(e.prog);
}
return NULL;
triggers.clear();
}

struct Source * freeSources(struct Source * s)
Expand Down Expand Up @@ -166,9 +156,9 @@ Package freePackage(Package pkg)
pkg->dpaths = argvFree(pkg->dpaths);

pkg->icon = freeSources(pkg->icon);
pkg->triggerFiles = freeTriggerFiles(pkg->triggerFiles);
pkg->fileTriggerFiles = freeTriggerFiles(pkg->fileTriggerFiles);
pkg->transFileTriggerFiles = freeTriggerFiles(pkg->transFileTriggerFiles);
freeTriggerFiles(pkg->triggerFiles);
freeTriggerFiles(pkg->fileTriggerFiles);
freeTriggerFiles(pkg->transFileTriggerFiles);
pkg->pool = rpmstrPoolFree(pkg->pool);

delete pkg;
Expand Down

0 comments on commit 910b660

Please sign in to comment.