208
207
static void setNotifyFlag(struct rpmInstallArguments_s * ia,
213
212
notifyFlags = ia->installInterfaceFlags | (rpmIsVerbose() ? INSTALL_LABEL : 0 );
214
xx = rpmtsSetNotifyCallback(ts,
215
rpmShowProgress, (void *) ((long)notifyFlags));
213
rpmtsSetNotifyCallback(ts, rpmShowProgress, (void *) ((long)notifyFlags));
294
291
static int tryReadManifest(struct rpmEIU * eiu)
298
295
/* Try to read a package manifest. */
299
eiu->fd = Fopen(*eiu->fnp, "r.fpio");
300
if (eiu->fd == NULL || Ferror(eiu->fd)) {
296
FD_t fd = Fopen(*eiu->fnp, "r.fpio");
297
if (fd == NULL || Ferror(fd)) {
301
298
rpmlog(RPMLOG_ERR, _("open of %s failed: %s\n"), *eiu->fnp,
303
if (eiu->fd != NULL) {
304
xx = Fclose(eiu->fd);
307
304
eiu->numFailed++; *eiu->fnp = NULL;
308
305
return RPMRC_FAIL;
311
308
/* Read list of packages from manifest. */
312
rc = rpmReadPackageManifest(eiu->fd, &eiu->argc, &eiu->argv);
309
rc = rpmReadPackageManifest(fd, &eiu->argc, &eiu->argv);
313
310
if (rc != RPMRC_OK)
314
311
rpmlog(RPMLOG_ERR, _("%s: not an rpm package (or package manifest): %s\n"),
315
*eiu->fnp, Fstrerror(eiu->fd));
316
xx = Fclose(eiu->fd);
312
*eiu->fnp, Fstrerror(fd));
319
316
if (rc != RPMRC_OK)
320
317
eiu->numFailed++; *eiu->fnp = NULL;
322
static int tryReadHeader(rpmts ts, struct rpmEIU * eiu, rpmVSFlags vsflags)
326
/* Try to read the header from a package file. */
327
FD_t fd = Fopen(*eiu->fnp, "r.ufdio");
328
if (fd == NULL || Ferror(fd)) {
329
rpmlog(RPMLOG_ERR, _("open of %s failed: %s\n"), *eiu->fnp,
335
eiu->numFailed++; *eiu->fnp = NULL;
339
/* Read the header, verifying signatures (if present). */
340
tvsflags = rpmtsSetVSFlags(ts, vsflags);
341
eiu->rpmrc = rpmReadPackageFile(ts, fd, *eiu->fnp, &eiu->h);
342
tvsflags = rpmtsSetVSFlags(ts, tvsflags);
346
/* Honor --nomanifest */
347
if (eiu->rpmrc == RPMRC_NOTFOUND && (giFlags & RPMGI_NOMANIFEST))
348
eiu->rpmrc = RPMRC_FAIL;
350
if(eiu->rpmrc == RPMRC_FAIL) {
351
rpmlog(RPMLOG_ERR, _("%s cannot be installed\n"), *eiu->fnp);
352
eiu->numFailed++; *eiu->fnp = NULL;
359
/* On --freshen, verify package is installed and newer */
360
static int checkFreshenStatus(rpmts ts, struct rpmEIU * eiu)
362
rpmdbMatchIterator mi = NULL;
363
const char * name = headerGetString(eiu->h, RPMTAG_NAME);
368
mi = rpmtsInitIterator(ts, RPMTAG_NAME, name, 0);
369
count = rpmdbGetIteratorCount(mi);
370
while ((oldH = rpmdbNextIterator(mi)) != NULL) {
371
if (rpmVersionCompare(oldH, eiu->h) < 0)
373
/* same or newer package already installed */
377
mi = rpmdbFreeIterator(mi);
379
eiu->h = headerFree(eiu->h);
382
/* Package is newer than those currently installed. */
326
387
/** @todo Generalize --freshen policies. */
327
388
int rpmInstall(rpmts ts, struct rpmInstallArguments_s * ia, ARGV_t fileArgv)
329
390
struct rpmEIU * eiu = xcalloc(1, sizeof(*eiu));
330
391
rpmRelocation * relocations;
331
392
char * fileURL = NULL;
332
rpmVSFlags vsflags, ovsflags, tvsflags;
393
rpmVSFlags vsflags, ovsflags;
337
397
if (fileArgv == NULL) goto exit;
448
508
rpmlog(RPMLOG_DEBUG, "============== %s\n", *eiu->fnp);
449
509
(void) urlPath(*eiu->fnp, &fileName);
451
/* Try to read the header from a package file. */
452
eiu->fd = Fopen(*eiu->fnp, "r.ufdio");
453
if (eiu->fd == NULL || Ferror(eiu->fd)) {
454
rpmlog(RPMLOG_ERR, _("open of %s failed: %s\n"), *eiu->fnp,
456
if (eiu->fd != NULL) {
457
xx = Fclose(eiu->fd);
460
eiu->numFailed++; *eiu->fnp = NULL;
464
/* Read the header, verifying signatures (if present). */
465
tvsflags = rpmtsSetVSFlags(ts, vsflags);
466
eiu->rpmrc = rpmReadPackageFile(ts, eiu->fd, *eiu->fnp, &eiu->h);
467
tvsflags = rpmtsSetVSFlags(ts, tvsflags);
468
xx = Fclose(eiu->fd);
471
/* Honor --nomanifest */
472
if (eiu->rpmrc == RPMRC_NOTFOUND && (giFlags & RPMGI_NOMANIFEST))
473
eiu->rpmrc = RPMRC_FAIL;
475
switch (eiu->rpmrc) {
477
rpmlog(RPMLOG_ERR, _("%s cannot be installed\n"), *eiu->fnp);
478
eiu->numFailed++; *eiu->fnp = NULL;
511
if (tryReadHeader(ts, eiu, vsflags) == RPMRC_FAIL)
514
if (eiu->rpmrc == RPMRC_NOTFOUND) {
482
515
rc = tryReadManifest(eiu);
483
516
if (rc == RPMRC_OK) {
488
case RPMRC_NOTTRUSTED:
495
522
eiu->isSource = headerIsSource(eiu->h);
514
541
eiu->relocations->oldPath = xstrdup(rpmtdGetString(&prefixes));
515
542
rpmtdFreeData(&prefixes);
518
xx = headerNVR(eiu->h, &name, NULL, NULL);
520
_("package %s is not relocatable\n"), name);
544
rpmlog(RPMLOG_ERR, _("package %s is not relocatable\n"),
545
headerGetString(eiu->h, RPMTAG_NAME));
521
546
eiu->numFailed++;
526
/* On --freshen, verify package is installed and newer */
527
if (ia->installInterfaceFlags & INSTALL_FRESHEN) {
528
rpmdbMatchIterator mi;
533
xx = headerNVR(eiu->h, &name, NULL, NULL);
534
mi = rpmtsInitIterator(ts, RPMTAG_NAME, name, 0);
535
count = rpmdbGetIteratorCount(mi);
536
while ((oldH = rpmdbNextIterator(mi)) != NULL) {
537
if (rpmVersionCompare(oldH, eiu->h) < 0)
539
/* same or newer package already installed */
543
mi = rpmdbFreeIterator(mi);
545
eiu->h = headerFree(eiu->h);
548
/* Package is newer than those currently installed. */
551
if (ia->installInterfaceFlags & INSTALL_FRESHEN)
552
if (checkFreshenStatus(ts, eiu) != 1)
551
555
rc = rpmtsAddInstallElement(ts, eiu->h, (fnpyKey)fileName,
552
556
(ia->installInterfaceFlags & INSTALL_UPGRADE) != 0,