--- /dev/null
+CVS
+.deps
+.depend
+.depend-done
+.libs
+apidocs
+autodeps
+intl
+scripts
+po
+[a-zA-Z]
+*-BUGGY
+*.a
+*.la
+*.in
+*.lo
+*.o
+*.so
+*.orig
+*.rej
+*.gz
+*.po
+.exclude
+CHANGES
+Doxyfile
+Makefile
+mklog
+config.cache
+config.guess
+config.h
+config.log
+config.status
+config.sub
+configure
+doxygen
+libtool
+ltconfig
+ltmain.sh
+stamp-h
+tags
4.0.3 -> 4.1
- - cpio mappings carry dirname/basename, not absolute path.
- - fix: check waitpid return code.
- - remove support for v1 src rpm's.
- - re-position callbacks with ts/fi in cpio payload layer.
- - state machines for packages (psm.c) and payloads (fsm.c)
- - add --repackage option to put erased bits back into a package.
4.0.2 -> 4.0.3
- update per-interpreter dependency scripts, add sql/tcl (#20295).
- fix: s390 (and ppc?) could return CPIOERR_BAD_HEADER (#28645).
- fix: Fwrite's are optimized out by aggressive compiler(irix) (#34711).
- portability: vsnprintf/snprintf wrappers for those without (#34657).
+ - cpio mappings carry dirname/basename, not absolute path.
+ - fix: check waitpid return code.
+ - remove support for v1 src rpm's.
+ - re-position callbacks with ts/fi in cpio payload layer.
+ - state machines for packages (psm.c) and payloads (fsm.c)
+ - add --repackage option to put erased bits back into a package.
+ - fix: (ppc) copy va_list in loop (#36845).
4.0 -> 4.0.[12]
- add doxygen and lclint annotations most everywhere.
.depend
Makefile
Makefile.in
+getdate.c
tagtable.c
.libs
*.la
fi ;\
fi
-BUILT_SOURCES = tagtable.c
+BUILT_SOURCES = tagtable.c getdate.c
.PHONY: lclint
.PHONY: lclint
pkgNum = al->size++;
p = al->list + pkgNum;
p->h = headerLink(h); /* XXX reference held by transaction set */
+ p->depth = p->npreds = 0;
memset(&p->tsi, 0, sizeof(p->tsi));
p->multiLib = 0; /* MULTILIB */
sense = rpmvercmp(aR, bR);
}
}
- free(aEVR);
- free(bEVR);
+ aEVR = _free(aEVR);
+ bEVR = _free(bEVR);
/* Detect overlap of {A,B} range. */
result = 0;
exit:
rpmMessage(RPMMESS_DEBUG, _(" %s A %s\tB %s\n"),
- (result ? "YES" : "NO "), aDepend, bDepend);
- if (aDepend) free((void *)aDepend);
- if (bDepend) free((void *)bDepend);
+ (result ? _("YES") : _("NO ")), aDepend, bDepend);
+ aDepend = _free(aDepend);
+ bDepend = _free(bDepend);
return result;
}
void rpmtransFree(rpmTransactionSet ts)
{
- struct availableList * addedPackages = &ts->addedPackages;
- struct availableList * availablePackages = &ts->availablePackages;
-
- alFree(addedPackages);
- alFree(availablePackages);
- if (ts->di)
- free((void *)ts->di);
- if (ts->removedPackages)
- free(ts->removedPackages);
- if (ts->order)
- free(ts->order);
+ alFree(&ts->addedPackages);
+ alFree(&ts->availablePackages);
+ ts->di = _free(ts->di);
+ ts->removedPackages = _free(ts->removedPackages);
+ ts->order = _free(ts->order);
if (ts->scriptFd)
ts->scriptFd = fdFree(ts->scriptFd, "rpmtransSetScriptFd (rpmtransFree");
- if (ts->rootDir)
- free((void *)ts->rootDir);
- if (ts->currDir)
- free((void *)ts->currDir);
+ ts->rootDir = _free(ts->rootDir);
+ ts->currDir = _free(ts->currDir);
- free(ts);
+ ts = _free(ts);
}
void rpmdepFreeConflicts(struct rpmDependencyConflict * conflicts,
for (i = 0; i < numConflicts; i++) {
headerFree(conflicts[i].byHeader);
- free((void *)conflicts[i].byName);
- free((void *)conflicts[i].byVersion);
- free((void *)conflicts[i].byRelease);
- free((void *)conflicts[i].needsName);
- free((void *)conflicts[i].needsVersion);
+ conflicts[i].byName = _free(conflicts[i].byName);
+ conflicts[i].byVersion = _free(conflicts[i].byVersion);
+ conflicts[i].byRelease = _free(conflicts[i].byRelease);
+ conflicts[i].needsName = _free(conflicts[i].needsName);
+ conflicts[i].needsVersion = _free(conflicts[i].needsVersion);
}
- free(conflicts);
+ conflicts = _free(conflicts);
}
/**
dirNeedle.dirNameLen = strlen(dirName);
dirMatch = bsearch(&dirNeedle, al->dirs, al->numDirs,
sizeof(dirNeedle), dirInfoCompare);
- free((void *)dirName);
+ dirName = _free(dirName);
if (!dirMatch) return NULL;
baseName = strrchr(fileName, '/') + 1;
xx = dbiGet(dbi, dbcursor, (void **)&keyDepend, &keylen, &datap, &datalen, 0);
if (xx == 0 && datap && datalen == 4) {
memcpy(&rc, datap, datalen);
- rpmMessage(RPMMESS_DEBUG, _("%s: %-45s %-3s (cached)\n"),
- keyType, keyDepend, (rc ? "NO" : "YES"));
+ rpmMessage(RPMMESS_DEBUG, _("%s: %-45s %-s (cached)\n"),
+ keyType, keyDepend, (rc ? _("NO ") : _("YES")));
xx = dbiCclose(dbi, NULL, 0);
return rc;
}
_cacheDependsRC = 0;
#if 0 /* XXX NOISY */
else
- rpmMessage(RPMMESS_DEBUG, _("%s: (%s, %s) added to Depends cache.\n"), keyType, keyDepend, (rc ? "NO" : "YES"));
+ rpmMessage(RPMMESS_DEBUG, _("%s: (%s, %s) added to Depends cache.\n"), keyType, keyDepend, (rc ? _("NO ") : _("YES")));
#endif
xx = dbiCclose(dbi, dbcursor, 0);
}
headerNVR(h, &name, &version, &release);
- if (!hge(h, RPMTAG_REQUIRENAME, &rnt, (void **) &requires, &requiresCount)) {
+ if (!hge(h, RPMTAG_REQUIRENAME, &rnt, (void **) &requires, &requiresCount))
+ {
requiresCount = 0;
} else {
hge(h, RPMTAG_REQUIREFLAGS, &type, (void **) &requireFlags,
}
for (i = 0; i < requiresCount && !ourrc; i++) {
- const char *keyDepend;
+ const char * keyDepend;
/* Filter out requires that came along for the ride. */
if (keyName && strcmp(keyName, requires[i]))
ourrc = 1;
break;
}
- free((void *)keyDepend);
+ keyDepend = _free(keyDepend);
}
if (requiresCount) {
}
for (i = 0; i < conflictsCount && !ourrc; i++) {
- const char *keyDepend;
+ const char * keyDepend;
/* Filter out conflicts that came along for the ride. */
if (keyName && strcmp(keyName, conflicts[i]))
ourrc = 1;
break;
}
- free((void *)keyDepend);
+ keyDepend = _free(keyDepend);
}
if (conflictsCount) {
{ "compat-glibc", "db2" },
{ "compat-glibc", "db1" },
{ "pam", "initscripts" },
- { "kernel", "initscripts" },
{ "initscripts", "sysklogd" },
/* 6.2 */
{ "egcs-c++", "libstdc++" },
tsi_prev->tsi_next = tsi->tsi_next;
tsi->tsi_next = NULL;
tsi->tsi_suc = NULL;
- free(tsi);
+ tsi = _free(tsi);
if (nzaps)
(*nzaps)++;
if (zap)
/* T3. Record next "q <- p" relation (i.e. "p" requires "q"). */
p->tsi.tsi_count++; /* bump p predecessor count */
+ if (p->depth <= q->depth) /* Save max. depth in dependency tree */
+ p->depth = q->depth + 1;
+
tsi = xmalloc(sizeof(*tsi));
tsi->tsi_suc = p;
tsi->tsi_reqx = j;
int rpmdepOrder(rpmTransactionSet ts)
{
int npkgs = ts->addedPackages.size;
+ int chainsaw = ts->transFlags & RPMTRANS_FLAG_CHAINSAW;
struct availablePackage * p;
struct availablePackage * q;
struct availablePackage * r;
}
}
+ /* Save predecessor count. */
+ for (i = 0, p = ts->addedPackages.list; i < npkgs; i++, p++) {
+ p->npreds = p->tsi.tsi_count;
+ }
+
/* T4. Scan for zeroes. */
rpmMessage(RPMMESS_DEBUG, _("========== tsorting packages\n"));
for (i = 0, p = ts->addedPackages.list; i < npkgs; i++, p++) {
/* Prefer packages in presentation order. */
- p->tsi.tsi_qcnt = (npkgs - i);
+ if (!chainsaw)
+ p->tsi.tsi_qcnt = (npkgs - i);
if (p->tsi.tsi_count != 0)
continue;
/* T5. Output front of queue (T7. Remove from queue.) */
for (; q != NULL; q = q->tsi.tsi_suc) {
- rpmMessage(RPMMESS_DEBUG, "%5d (%d,%d) %s-%s-%s\n", orderingCount,
- qlen, q->tsi.tsi_qcnt,
+ rpmMessage(RPMMESS_DEBUG, "%4d%4d%4d%4d %*s %s-%s-%s\n",
+ orderingCount, q->npreds, q->tsi.tsi_qcnt, q->depth,
+ 2*q->depth, "",
q->name, q->version, q->release);
ordering[orderingCount++] = q - ts->addedPackages.list;
qlen--;
addQ(p, &q->tsi.tsi_suc, &r);
qlen++;
}
- free(tsi);
+ tsi = _free(tsi);
}
if (!_printed && loopcheck == qlen && q->tsi.tsi_suc != NULL) {
_printed++;
sprintf(buf, "%s-%s-%s", p->name, p->version, p->release);
rpmMessage(RPMMESS_WARNING, " %-40s %s\n", buf, dp);
- if (dp) {
- free((void *)dp);
- dp = NULL;
- }
+ dp = _free((void *)dp);
}
/* Walk (and erase) linear part of predecessor chain as well. */
}
assert(newOrderCount == ts->orderCount);
- free(ts->order);
+ ts->order = _free(ts->order);
ts->order = newOrder;
ts->orderAlloced = ts->orderCount;
- free(orderList);
+ orderList = _free(orderList);
return 0;
}
break;
}
- free(fileName);
+ fileName = _free(fileName);
baseNames = hfd(baseNames, bnt);
dirNames = hfd(dirNames, dnt);
if (rc)
mi = NULL;
}
- if (!ps.num) {
- free(ps.problems);
- } else {
+ if (ps.num) {
*conflicts = ps.problems;
+ ps.problems = NULL;
*numConflicts = ps.num;
}
- ps.problems = NULL;
rc = 0;
exit:
if (mi)
rpmdbFreeIterator(mi);
- if (ps.problems)
- free(ps.problems);
+ ps.problems = _free(ps.problems);
return rc;
}
int providesCount; /*!< No. of Provide:'s in header. */
int requiresCount; /*!< No. of Require:'s in header. */
int filesCount; /*!< No. of files in header. */
+ int npreds; /*!< No. of predecessors. */
+ int depth; /*!< Max. depth in dependency tree. */
struct tsortInfo tsi; /*!< Dependency tsort data. */
uint_32 multiLib; /* MULTILIB */
/*@kept@*/ const void * key; /*!< Private data associated with a package (e.g. file name of package). */
extern "C" {
#endif
-/* XXX lib/scriptlet.c */
/** \ingroup rpmdep
* Compare package name-version-release from header with dependency, looking
* for overlap.
/* Generate provides for this package name-version-release. */
headerNVR(h, &name, &version, &release);
+ if (!(name && version && release))
+ return;
pEVR = p = alloca(21 + strlen(version) + 1 + strlen(release) + 1);
*p = '\0';
if (headerGetEntry(h, RPMTAG_EPOCH, NULL, (void **) &epoch, NULL)) {
if (headerIsEntry(*hdr, RPMTAG_FILEGROUPNAME))
headerRemoveEntry(*hdr, RPMTAG_FILEGIDS);
- /* We switched the way we do relocateable packages. We fix some of
- it up here, though the install code still has to be a bit
- careful. This fixup makes queries give the new values though,
- which is quite handy. */
+ /*
+ * We switched the way we do relocateable packages. We fix some of
+ * it up here, though the install code still has to be a bit
+ * careful. This fixup makes queries give the new values though,
+ * which is quite handy.
+ */
if (headerGetEntry(*hdr, RPMTAG_DEFAULTPREFIX, NULL,
(void **) &defaultPrefix, NULL)) {
defaultPrefix =
rc = rpmGlob(*fnp, &ac, &av);
if (rc || ac == 0) continue;
- if (argc == 0)
- argv = xmalloc((argc+2) * sizeof(*argv));
- else
- argv = xrealloc(argv, (argc+2) * sizeof(*argv));
+ argv = (argc == 0)
+ ? xmalloc((argc+2) * sizeof(*argv))
+ : xrealloc(argv, (argc+2) * sizeof(*argv));
memcpy(argv+argc, av, ac * sizeof(*av));
argc += ac;
argv[argc] = NULL;
}
pkgState = _free(pkgState);
pkgURL = _free(pkgURL);
+ argv = _free(argv);
if (dbIsOpen) rpmdbClose(db);
return numFailed;
}
/** \ingroup header
* Regenerate signature header.
* @param h header
- * @return regenerated signature header
+ * @return regenerated signature header
*/
Header headerRegenSigHeader(const Header h) /*@*/;
RPMTRANS_FLAG_NOTRIGGERPOSTUN = (1 << 23),
RPMTRANS_FLAG_NOPAYLOAD = (1 << 24),
RPMTRANS_FLAG_APPLYONLY = (1 << 25),
+
+ RPMTRANS_FLAG_CHAINSAW = (1 << 26),
} rpmtransFlags;
#define _noTransScripts \
INSTALL_NOORDER = (1 << 3), /*!< from --noorder */
INSTALL_LABEL = (1 << 4), /*!< from --verbose (notify) */
INSTALL_UPGRADE = (1 << 5), /*!< from --upgrade */
- INSTALL_FRESHEN = (1 << 6), /*!< from --freshen */
+ INSTALL_FRESHEN = (1 << 6) /*!< from --freshen */
} rpmInstallInterfaceFlags;
/** \ingroup rpmcli
typedef enum rpmEraseInterfaceFlags_e {
UNINSTALL_NONE = 0,
UNINSTALL_NODEPS = (1 << 0), /*!< from --nodeps */
- UNINSTALL_ALLMATCHES= (1 << 1), /*!< from --allmatches */
+ UNINSTALL_ALLMATCHES= (1 << 1) /*!< from --allmatches */
} rpmEraseInterfaceFlags;
/** \ingroup rpmcli
RPMSIG_UNKNOWN = 1, /*!< Signature is unknown. */
RPMSIG_BAD = 2, /*!< Signature does not verify. */
RPMSIG_NOKEY = 3, /*!< Key is unavailable. */
- RPMSIG_NOTTRUSTED = 4, /*!< Signature is OK, but key is not trusted. */
+ RPMSIG_NOTTRUSTED = 4 /*!< Signature is OK, but key is not trusted. */
} rpmVerifySignatureReturn;
/** \ingroup signature
CHECKSIG_NONE = 0, /*!< Don't check any signatures. */
CHECKSIG_PGP = (1 << 0), /*!< if not --nopgp */
CHECKSIG_MD5 = (1 << 1), /*!< if not --nomd5 */
- CHECKSIG_GPG = (1 << 2), /*!< if not --nogpg */
+ CHECKSIG_GPG = (1 << 2) /*!< if not --nogpg */
} rpmCheckSigFlags;
/** \ingroup rpmcli
*/
typedef enum rpmResignFlags_e {
RESIGN_NEW_SIGNATURE = 0, /*!< from --resign */
- RESIGN_ADD_SIGNATURE, /*!< from --addsign */
+ RESIGN_ADD_SIGNATURE /*!< from --addsign */
} rpmResignFlags;
/** \ingroup rpmcli
{ "rpmlib(HeaderLoadSortsTags)", "4.0.1-1",
( RPMSENSE_EQUAL),
N_("header tags are always sorted after being loaded.") },
- { NULL, NULL, NULL, 0 }
+ { NULL, NULL, 0, NULL }
};
void rpmShowRpmlibProvides(FILE * fp)
}
if (altH) {
- const char *n, *v, *r;
+ const char * n, * v, * r;
headerNVR(altH, &n, &v, &r);
p->altNEVR =
t = xmalloc(strlen(n) + strlen(v) + strlen(r) + sizeof("--"));
if (strcmp(baseNames[i], te)) /* basename changed too? */
baseNames[i] = alloca_strdup(te);
*te = '\0'; /* terminate new directory name */
- }
+ }
/* Does this directory already exist in the directory list? */
for (j = 0; j < dirCount; j++) {
baseNames, fileCount);
fi->bnl = hfd(fi->bnl, RPM_STRING_ARRAY_TYPE);
hge(h, RPMTAG_BASENAMES, NULL, (void **) &fi->bnl, &fi->fc);
-
+
headerModifyEntry(h, RPMTAG_DIRNAMES, RPM_STRING_ARRAY_TYPE,
dirNames, dirCount);
fi->dnl = hfd(fi->dnl, RPM_STRING_ARRAY_TYPE);
baseNames = hfd(baseNames, RPM_STRING_ARRAY_TYPE);
dirNames = hfd(dirNames, RPM_STRING_ARRAY_TYPE);
- if (fn) free(fn);
+ fn = _free(fn);
return h;
}
tmpPath = _free(tmpPath);
}
-
s = rpmExpand("%{_install_langs}", NULL);
if (!(s && *s != '%'))
s = _free(s);
if (noDocs && (fi->fflags[i] & RPMFILE_DOC)) {
drc[ix]--; dff[ix] = 1;
fi->actions[i] = FA_SKIPNSTATE;
+ continue;
}
}
preTransCount = 0;
fi->type = ts->order[oc].type;
- switch (ts->order[oc].type) {
+ switch (fi->type) {
case TR_ADDED:
i = ts->order[oc].u.addedIndex;
alp = ts->addedPackages.list + i;
NULL, ts->notifyData));
if (ts->chrootDone) {
- /*@-unrecog@*/ chroot("."); /*@-unrecog@*/
+ /*@-unrecog@*/ chroot("."); /*@-unrecog@*/
ts->chrootDone = 0;
chdir(ts->currDir);
}
gotfd = 0;
psm->fi = fi;
switch (fi->type)
- {
+ {
case TR_ADDED:
alp = tsGetAlp(tsi);
assert(alp == fi->ap);
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2001-04-04 13:52-0400\n"
+"POT-Creation-Date: 2001-04-18 16:40-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgstr ""
#. XXX legacy epoch-less requires/conflicts compatibility
-#: lib/depends.c:570
+#: lib/depends.c:571
#, c-format
msgid ""
"the \"B\" dependency needs an epoch (assuming same as \"A\")\n"
"\tA %s\tB %s\n"
msgstr ""
-#: lib/depends.c:599
+#: lib/depends.c:600
#, c-format
msgid " %s A %s\tB %s\n"
msgstr ""
-#: lib/depends.c:967
+#: lib/depends.c:960
#, c-format
msgid "%s: %-45s YES (added files)\n"
msgstr ""
-#: lib/depends.c:1026
+#: lib/depends.c:1019
#, c-format
msgid "%s: %-45s YES (added provide)\n"
msgstr ""
-#: lib/depends.c:1078
+#: lib/depends.c:1071
#, c-format
msgid "%s: %-45s %-3s (cached)\n"
msgstr ""
-#: lib/depends.c:1097
+#: lib/depends.c:1090
#, c-format
msgid "%s: %-45s YES (rpmrc provides)\n"
msgstr ""
-#: lib/depends.c:1114
+#: lib/depends.c:1107
#, c-format
msgid "%s: %-45s YES (rpmlib provides)\n"
msgstr ""
-#: lib/depends.c:1136
+#: lib/depends.c:1129
#, c-format
msgid "%s: %-45s YES (db files)\n"
msgstr ""
-#: lib/depends.c:1149
+#: lib/depends.c:1142
#, c-format
msgid "%s: %-45s YES (db provides)\n"
msgstr ""
-#: lib/depends.c:1163
+#: lib/depends.c:1156
#, c-format
msgid "%s: %-45s YES (db package)\n"
msgstr ""
-#: lib/depends.c:1179
+#: lib/depends.c:1172
#, c-format
msgid "%s: %-45s NO\n"
msgstr ""
-#: lib/depends.c:1200
+#: lib/depends.c:1193
#, c-format
msgid "%s: (%s, %s) added to Depends cache.\n"
msgstr ""
#. requirements are not satisfied.
-#: lib/depends.c:1261
+#: lib/depends.c:1254
#, c-format
msgid "package %s-%s-%s require not satisfied: %s\n"
msgstr ""
#. conflicts exist.
-#: lib/depends.c:1328
+#: lib/depends.c:1321
#, c-format
msgid "package %s conflicts: %s\n"
msgstr ""
-#: lib/depends.c:1543
+#: lib/depends.c:1536
#, c-format
msgid "removing %s-%s-%s \"%s\" from tsort relations.\n"
msgstr ""
#. Record all relations.
-#: lib/depends.c:1682
+#: lib/depends.c:1679
msgid "========== recording tsort relations\n"
msgstr ""
#. T4. Scan for zeroes.
-#: lib/depends.c:1729
+#: lib/depends.c:1731
msgid "========== tsorting packages\n"
msgstr ""
-#: lib/depends.c:1774
+#: lib/depends.c:1778
msgid "========== successors only (presentation order)\n"
msgstr ""
-#: lib/depends.c:1823
+#: lib/depends.c:1827
msgid "LOOP:\n"
msgstr ""
-#: lib/depends.c:1854
+#: lib/depends.c:1855
msgid "========== continuing tsort ...\n"
msgstr ""
msgid " conflicts with %s-%s-%s\n"
msgstr ""
-#: lib/problems.c:99
+#: lib/problems.c:118
#, c-format
msgid "package %s is for a different architecture"
msgstr ""
-#: lib/problems.c:103
+#: lib/problems.c:122
#, c-format
msgid "package %s is for a different operating system"
msgstr ""
-#: lib/problems.c:107
+#: lib/problems.c:126
#, c-format
msgid "package %s is already installed"
msgstr ""
-#: lib/problems.c:111
+#: lib/problems.c:130
#, c-format
msgid "path %s in package %s is not relocateable"
msgstr ""
-#: lib/problems.c:116
+#: lib/problems.c:135
#, c-format
msgid "file %s conflicts between attempted installs of %s and %s"
msgstr ""
-#: lib/problems.c:121
+#: lib/problems.c:140
#, c-format
msgid "file %s from install of %s conflicts with file from package %s"
msgstr ""
-#: lib/problems.c:126
+#: lib/problems.c:145
#, c-format
msgid "package %s (which is newer than %s) is already installed"
msgstr ""
-#: lib/problems.c:131
+#: lib/problems.c:150
#, c-format
msgid "installing package %s needs %ld%cb on the %s filesystem"
msgstr ""
-#: lib/problems.c:141
+#: lib/problems.c:160
#, c-format
msgid "installing package %s needs %ld inodes on the %s filesystem"
msgstr ""
-#: lib/problems.c:146
+#: lib/problems.c:165
#, c-format
msgid "package %s pre-transaction syscall(s): %s failed: %s"
msgstr ""
-#: lib/problems.c:153
+#: lib/problems.c:172
#, c-format
msgid "unknown error %d encountered while manipulating package %s"
msgstr ""
msgid "record %d could not be read\n"
msgstr ""
-#: lib/query.c:744 lib/rpminstall.c:591
+#: lib/query.c:744 lib/rpminstall.c:592
#, c-format
msgid "package %s is not installed\n"
msgstr ""
msgid "file %s requires a newer version of RPM\n"
msgstr ""
-#: lib/rpminstall.c:439 lib/rpminstall.c:659
+#: lib/rpminstall.c:439 lib/rpminstall.c:660
#, c-format
msgid "%s cannot be installed\n"
msgstr ""
msgid "cannot open file %s: %s\n"
msgstr ""
-#: lib/rpminstall.c:578
+#: lib/rpminstall.c:579
#, c-format
msgid "cannot open %s/packages.rpm\n"
msgstr ""
-#: lib/rpminstall.c:594
+#: lib/rpminstall.c:595
#, c-format
msgid "\"%s\" specifies multiple packages\n"
msgstr ""
-#: lib/rpminstall.c:617
+#: lib/rpminstall.c:618
msgid "removing these packages would break dependencies:\n"
msgstr ""
-#: lib/rpminstall.c:646
+#: lib/rpminstall.c:647
#, c-format
msgid "cannot open %s: %s\n"
msgstr ""
-#: lib/rpminstall.c:652
+#: lib/rpminstall.c:653
#, c-format
msgid "Installing %s\n"
msgstr ""
* import os, rpm
*
* fd = os.open("/tmp/foo-1.0-1.i386.rpm", os.O_RDONLY)
- * (isSource, header) = rpm.headerFromPackage(fd)
+ * (header, isSource) = rpm.headerFromPackage(fd)
* fd.close()
* \endcode
* The Python interface to the header data is quite elegant. It
{ "initdb", (PyCFunction) rpmInitDB, METH_VARARGS, NULL },
{ "opendb", (PyCFunction) rpmOpenDB, METH_VARARGS, NULL },
{ "rebuilddb", (PyCFunction) rebuildDB, METH_VARARGS, NULL },
+ { "mergeHeaderListFromFD", (PyCFunction) rpmMergeHeadersFromFD, METH_VARARGS, NULL },
{ "readHeaderListFromFD", (PyCFunction) rpmHeaderFromFD, METH_VARARGS, NULL },
{ "readHeaderListFromFile", (PyCFunction) rpmHeaderFromFile, METH_VARARGS, NULL },
{ "errorSetCallback", (PyCFunction) errorSetCallback, METH_VARARGS, NULL },
_("build the packages for the build targets platform1...platformN."));
printHelpLine( " --nobuild ",
_("do not execute any stages"));
- printHelpLine(_(" --timecheck <secs> "),
- _("set the time check to <secs> seconds (0 disables)"));
puts("");
printHelpLine(_(" --rebuild <src_pkg> "),
_("install source package, build binary package and remove spec file, sources, patches, and icons."));
tdigest.o: tdigest.c
tdigest: librpmio.la tdigest.o
$(LINK) -o $@ tdigest.o librpmio.la $(top_builddir)/popt/libpopt.la
+
+tficl.o: tficl.c
+ $(COMPILE) -I/usr/include/ficl -o $@ -c tficl.c
+
+tficl: tficl.o
+ $(LINK) -o $@ tficl.o -lficl
/* Allocate a sufficently large buffer for output. */
while (1) {
+ va_list apc;
+ __va_copy(apc, ap);
/*@-unrecog@*/
- nb = vsnprintf(msgbuf, msgnb, fmt, ap);
+ nb = vsnprintf(msgbuf, msgnb, fmt, apc);
/*@=unrecog@*/
if (nb > -1 && nb < msgnb)
break;
#include <stdio.h>\r
#include <string.h>\r
#include <time.h>\r
-#ifdef WIN32\r
-#include <direct.h>\r
-#endif\r
#include <sys/types.h>\r
#include <sys/stat.h>\r
#ifdef linux\r
{\r
char *cp;\r
\r
-#ifdef WIN32 \r
- cp = _getcwd(NULL, 80);\r
-#else\r
cp = getcwd(NULL, 80);\r
-#endif\r
vmTextOut(pVM, cp, 1);\r
free(cp);\r
return;\r
vmGetString(pVM, pFS, '\n');\r
if (pFS->count > 0)\r
{\r
-#ifdef WIN32\r
- int err = _chdir(pFS->text);\r
-#else\r
int err = chdir(pFS->text);\r
-#endif\r
if (err)\r
{\r
vmTextOut(pVM, "Error: path not found", 1);\r
FILE *fp;\r
int result;\r
CELL id;\r
-#ifdef WIN32 \r
- struct _stat buf;\r
-#else\r
struct stat buf;\r
-#endif\r
-\r
\r
vmGetString(pVM, pFilename, '\n');\r
\r
/*\r
** get the file's size and make sure it exists \r
*/\r
-#ifdef WIN32 \r
- result = _stat( pFilename->text, &buf );\r
-#else\r
result = stat( pFilename->text, &buf );\r
-#endif\r
\r
if (result != 0)\r
{\r
}\r
\r
\r
-void buildTestInterface(void)\r
+static void buildTestInterface(void)\r
{\r
ficlBuild("break", ficlBreak, FW_DEFAULT);\r
ficlBuild("clock", ficlClock, FW_DEFAULT);\r
}\r
\r
\r
-#if !defined (_WINDOWS)\r
-#define nINBUF 256\r
+static int quiet = 0;\r
+\r
int main(int argc, char **argv)\r
{\r
- char in[nINBUF];\r
+ char in[BUFSIZ], * s;\r
FICL_VM *pVM;\r
+ extern char * optarg;\r
+ extern int optind, opterr, optopt;\r
+ int errflg = 0;\r
+ int ret;\r
+ int c;\r
+\r
+ while ((c = getopt(argc, argv, "q")) != EOF)\r
+ switch (c) {\r
+ case 'q':\r
+ quiet++;\r
+ break;\r
+ case '?':\r
+ default:\r
+ errflg++;\r
+ break;\r
+ }\r
\r
ficlInitSystem(10000);\r
buildTestInterface();\r
pVM = ficlNewVM();\r
\r
- ficlExec(pVM, ".ver .( " __DATE__ " ) cr quit");\r
+ if (!quiet)\r
+ ficlExec(pVM, ".ver .( " __DATE__ " ) cr quit");\r
\r
- /*\r
- ** load file from cmd line...\r
- */\r
- if (argc > 1)\r
- {\r
- sprintf(in, ".( loading %s ) cr load %s\n cr", argv[1], argv[1]);\r
+ for ( ; optind < argc; optind++) {\r
+ sprintf(in, ".( loading %s ) cr load %s\n cr", argv[optind], argv[optind]);\r
ficlExec(pVM, in);\r
}\r
\r
- for (;;)\r
- {\r
- int ret;\r
- fgets(in, nINBUF, stdin);\r
- ret = ficlExec(pVM, in);\r
- if (ret == VM_USEREXIT)\r
- {\r
- ficlTermSystem();\r
- break;\r
- }\r
- }\r
+ s = in;\r
+ if (!quiet)\r
+ *s++ = '\n';\r
+ *s++ = '\0';\r
+ ret = 0;\r
+ do {\r
+ if (in[0])\r
+ ret = ficlExec(pVM, in);\r
+ } while (ret != VM_USEREXIT && (s = fgets(in, sizeof(in)-1, stdin)) != NULL);\r
+\r
+ ficlTermSystem();\r
\r
return 0;\r
}\r
-\r
-#endif\r
-\r
#include "system.h"
-#include "rpmbuild.h"
-#include "buildio.h"
+#include <rpmlib.h>
+#include <rpmmacro.h>
+#include <rpmurl.h>
#include "depends.h"
-#include "header.h"
+
+#include "manifest.h"
+#include "misc.h"
#include "debug.h"
extern int _depends_debug;
+static int noAvailable = 0;
+static const char * avdbpath =
+ "/usr/lib/rpmdb/%{_arch}-%{_vendor}-%{_os}/redhat";
+static int noChainsaw = 0;
static int noDeps = 0;
+/**
+ * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
+ * @param this memory to free
+ * @retval NULL always
+ */
+static /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) {
+ if (this) free((void *)this);
+ return NULL;
+}
+
static int
do_tsort(const char *fileArgv[])
{
const char * rootdir = "/";
- const char ** fileURL;
- int numPkgs;
- int numFailed = 0;
rpmdb rpmdb = NULL;
rpmTransactionSet ts = NULL;
+ const char ** pkgURL = NULL;
+ char * pkgState = NULL;
+ const char ** fnp;
+ const char * fileURL = NULL;
+ int numPkgs = 0;
+ int numFailed = 0;
+ int prevx;
+ int pkgx;
+ const char ** argv = NULL;
+ int argc = 0;
+ const char ** av = NULL;
+ int ac = 0;
Header h;
- int rc;
+ int rc = 0;
+ int i;
if (fileArgv == NULL)
return 0;
- if (rpmdbOpen(rootdir, &rpmdb, O_RDONLY, 0644)) {
+ rc = rpmdbOpen(rootdir, &rpmdb, O_RDONLY, 0644);
+ if (rc) {
rpmMessage(RPMMESS_ERROR, _("cannot open Packages database\n"));
rc = -1;
goto exit;
}
ts = rpmtransCreateSet(rpmdb, rootdir);
+ if (!noChainsaw)
+ ts->transFlags = RPMTRANS_FLAG_CHAINSAW;
+
+ /* Load all the available packages. */
+ if (!(noDeps || noAvailable)) {
+ rpmdbMatchIterator mi = NULL;
+ struct rpmdb_s * avdb = NULL;
+
+ addMacro(NULL, "_dbpath", NULL, avdbpath, RMIL_CMDLINE);
+ rc = rpmdbOpen(rootdir, &avdb, O_RDONLY, 0644);
+ delMacro(NULL, "_dbpath");
+ if (rc) {
+ rpmMessage(RPMMESS_ERROR, _("cannot open Available database\n"));
+ goto endavail;
+ }
+ mi = rpmdbInitIterator(avdb, RPMDBI_PACKAGES, NULL, 0);
+ while ((h = rpmdbNextIterator(mi)) != NULL) {
+ rpmtransAvailablePackage(ts, h, NULL);
+ }
+
+endavail:
+ if (mi) rpmdbFreeIterator(mi);
+ if (avdb) rpmdbClose(avdb);
+ }
+
+ /* Build fully globbed list of arguments in argv[argc]. */
+ for (fnp = fileArgv; *fnp; fnp++) {
+ av = _free(av);
+ ac = 0;
+ rc = rpmGlob(*fnp, &ac, &av);
+ if (rc || ac == 0) continue;
+
+ argv = (argc == 0)
+ ? xmalloc((argc+2) * sizeof(*argv))
+ : xrealloc(argv, (argc+2) * sizeof(*argv));
+ memcpy(argv+argc, av, ac * sizeof(*av));
+ argc += ac;
+ argv[argc] = NULL;
+ }
+ av = _free(av);
+
+ numPkgs = 0;
+ prevx = 0;
+ pkgx = 0;
+
+restart:
+ /* Allocate sufficient storage for next set of args. */
+ if (pkgx >= numPkgs) {
+ numPkgs = pkgx + argc;
+ pkgURL = (pkgURL == NULL)
+ ? xmalloc( (numPkgs + 1) * sizeof(*pkgURL))
+ : xrealloc(pkgURL, (numPkgs + 1) * sizeof(*pkgURL));
+ memset(pkgURL + pkgx, 0, ((argc + 1) * sizeof(*pkgURL)));
+ pkgState = (pkgState == NULL)
+ ? xmalloc( (numPkgs + 1) * sizeof(*pkgState))
+ : xrealloc(pkgState, (numPkgs + 1) * sizeof(*pkgState));
+ memset(pkgState + pkgx, 0, ((argc + 1) * sizeof(*pkgState)));
+ }
- for (fileURL = fileArgv, numPkgs = 0; *fileURL; fileURL++, numPkgs++)
- ;
+ /* Copy next set of args. */
+ for (i = 0; i < argc; i++) {
+ fileURL = _free(fileURL);
+ fileURL = argv[i];
+ argv[i] = NULL;
+ pkgURL[pkgx] = fileURL;
+ fileURL = NULL;
+ pkgx++;
+ }
+ fileURL = _free(fileURL);
- for (fileURL = fileArgv; *fileURL; fileURL++) {
+ /* Continue processing file arguments, building transaction set. */
+ for (fnp = pkgURL+prevx; *fnp; fnp++, prevx++) {
const char * fileName;
- rpmRC rpmrc;
+ int isSource;
FD_t fd;
- (void) urlPath(*fileURL, &fileName);
- fd = Fopen(*fileURL, "r.ufdio");
+ (void) urlPath(*fnp, &fileName);
+
+ /* Try to read the header from a package file. */
+ fd = Fopen(*fnp, "r.ufdio");
if (fd == NULL || Ferror(fd)) {
- rpmMessage(RPMMESS_ERROR, _("cannot open file %s: %s\n"), *fileURL,
- Fstrerror(fd));
+ rpmError(RPMERR_OPEN, _("open of %s failed: %s\n"), *fnp,
+ Fstrerror(fd));
if (fd) Fclose(fd);
- numFailed++;
- continue;
- }
+ numFailed++; *fnp = NULL;
+ continue;
+ }
- rpmrc = rpmReadPackageHeader(fd, &h, NULL, NULL, NULL);
+ rc = rpmReadPackageHeader(fd, &h, &isSource, NULL, NULL);
+ Fclose(fd);
- rc = rpmtransAddPackage(ts, h, NULL, fileName, 0, NULL);
+ if (rc == 2) {
+ numFailed++; *fnp = NULL;
+ continue;
+ }
+
+ if (rc == 0) {
+ rc = rpmtransAddPackage(ts, h, NULL, fileName, 0, NULL);
+ headerFree(h); /* XXX reference held by transaction set */
+ continue;
+ }
+
+ if (rc != 1) {
+ rpmMessage(RPMMESS_ERROR, _("%s cannot be installed\n"), *fnp);
+ numFailed++; *fnp = NULL;
+ break;
+ }
- headerFree(h); /* XXX reference held by transaction set */
+ /* Try to read a package manifest. */
+ fd = Fopen(*fnp, "r.fpio");
+ if (fd == NULL || Ferror(fd)) {
+ rpmError(RPMERR_OPEN, _("open of %s failed: %s\n"), *fnp,
+ Fstrerror(fd));
+ if (fd) Fclose(fd);
+ numFailed++; *fnp = NULL;
+ break;
+ }
+
+ /* Read list of packages from manifest. */
+ rc = rpmReadPackageManifest(fd, &argc, &argv);
+ if (rc)
+ rpmError(RPMERR_MANIFEST, _("%s: read manifest failed: %s\n"),
+ fileURL, Fstrerror(fd));
Fclose(fd);
+ /* If successful, restart the query loop. */
+ if (rc == 0) {
+ prevx++;
+ goto restart;
+ }
+
+ numFailed++; *fnp = NULL;
+ break;
}
+ if (numFailed) goto exit;
+
if (!noDeps) {
struct rpmDependencyConflict * conflicts = NULL;
int numConflicts = 0;
const char * str;
int i;
+ alp = NULL;
str = "???";
switch (ts->order[oc].type) {
case TR_ADDED:
}
if (h) {
- const char *n, *v, *r;
- headerNVR(h, &n, &v, &r);
- fprintf(stdout, "%s %s-%s-%s\n", str, n, v, r);
+ if (alp && alp->key) {
+ const char * fn = alp->key;
+ fprintf(stdout, "%s %s\n", str, fn);
+ } else {
+ const char *n, *v, *r;
+ headerNVR(h, &n, &v, &r);
+ fprintf(stdout, "%s %s-%s-%s\n", str, n, v, r);
+ }
headerFree(h);
}
rc = 0;
exit:
- if (ts) {
- rpmtransFree(ts);
- ts = NULL;
- }
- if (rpmdb) {
- rpmdbClose(rpmdb);
- rpmdb = NULL;
+ if (ts) rpmtransFree(ts);
+ for (i = 0; i < numPkgs; i++) {
+ pkgURL[i] = _free(pkgURL[i]);
}
+ pkgState = _free(pkgState);
+ pkgURL = _free(pkgURL);
+ argv = _free(argv);
+ if (rpmdb) rpmdbClose(rpmdb);
return rc;
}
static struct poptOption optionsTable[] = {
+ { "noavailable", '\0', 0, &noAvailable, 0, NULL, NULL},
+ { "nochainsaw", '\0', 0, &noChainsaw, 0, NULL, NULL},
{ "nodeps", '\0', 0, &noDeps, 0, NULL, NULL},
{ "verbose", 'v', 0, 0, 'v', NULL, NULL},
{ NULL, 0, 0, 0, 0, NULL, NULL}