Check {fsm,psm} for orphans.
authorjbj <devnull@localhost>
Mon, 8 Apr 2002 20:09:40 +0000 (20:09 +0000)
committerjbj <devnull@localhost>
Mon, 8 Apr 2002 20:09:40 +0000 (20:09 +0000)
CVS patchset: 5381
CVS date: 2002/04/08 20:09:40

lib/fsm.c
lib/psm.c

index d4e567d..0eb92da 100644 (file)
--- a/lib/fsm.c
+++ b/lib/fsm.c
@@ -833,7 +833,9 @@ static int writeFile(/*@special@*/ FSM_t fsm, int writeData)
            rdbuf = fsm->rdbuf;
            fsm->rdbuf = (char *) mapped;
            fsm->rdlen = nmapped = st->st_size;
+#if defined(MADV_DONTNEED)
            xx = madvise(mapped, nmapped, MADV_DONTNEED);
+#endif
        }
 #endif
 
@@ -861,6 +863,9 @@ static int writeFile(/*@special@*/ FSM_t fsm, int writeData)
 #if HAVE_MMAP
        if (mapped != (void *)-1) {
            xx = msync(mapped, nmapped, MS_ASYNC);
+#if defined(MADV_DONTNEED)
+           xx = madvise(mapped, nmapped, MADV_DONTNEED);
+#endif
            /*@-noeffect@*/ xx = munmap(mapped, nmapped) /*@=noeffect@*/;
            fsm->rdbuf = rdbuf;
        }
@@ -1249,6 +1254,12 @@ static int fsmStat(FSM_t fsm)
 }
 #endif
 
+#define        IS_DEV_LOG(_x)  \
+       ((_x) != NULL && strlen(_x) >= (sizeof("/dev/log")-1) && \
+       !strncmp((_x), "/dev/log", sizeof("/dev/log")-1) && \
+       ((_x)[sizeof("/dev/log")-1] == '\0' || \
+        (_x)[sizeof("/dev/log")-1] == ';'))
+
 /*@-compmempass@*/
 int fsmStage(FSM_t fsm, fileStage stage)
 {
@@ -1656,7 +1667,7 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break;
                rc = fsmStage(fsm, FSM_MKNOD);
        } else {
            /* XXX Special case /dev/log, which shouldn't be packaged anyways */
-           if (strncmp(fsm->path, "/dev/log;", sizeof("/dev/log;")-1))
+           if (!IS_DEV_LOG(fsm->path))
                rc = CPIOERR_UNKNOWN_FILETYPE;
        }
        if (!S_ISDIR(st->st_mode) && st->st_nlink > 1) {
@@ -1780,9 +1791,7 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break;
        }
 
        /* XXX Special case /dev/log, which shouldn't be packaged anyways */
-       if (!S_ISSOCK(st->st_mode)
-       &&  strncmp(fsm->path, "/dev/log;", sizeof("/dev/log;")-1))
-       {
+       if (!S_ISSOCK(st->st_mode) && !IS_DEV_LOG(fsm->path)) {
            /* Rename temporary to final file name. */
            if (!S_ISDIR(st->st_mode) &&
                (fsm->subdir || fsm->suffix || fsm->nsuffix))
index 1f6e340..ab16588 100644 (file)
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -1539,6 +1539,13 @@ assert(psm->mi == NULL);
                        (psm->failedFile != NULL ? psm->failedFile : ""),
                        cpioStrerror(rc));
                rc = RPMRC_FAIL;
+
+               /* XXX notify callback on error. */
+               psm->what = RPMCALLBACK_UNPACK_ERROR;
+               psm->amount = 0;
+               psm->total = 0;
+               xx = psmStage(psm, PSM_NOTIFY);
+
                break;
            }
            psm->what = RPMCALLBACK_INST_PROGRESS;
@@ -1728,6 +1735,12 @@ assert(psm->mi == NULL);
            else
                rpmError(RPMERR_CPIO, _("%s failed: %s\n"),
                        psm->stepName, cpioStrerror(rc));
+
+           /* XXX notify callback on error. */
+           psm->what = RPMCALLBACK_CPIO_ERROR;
+           psm->amount = 0;
+           psm->total = 0;
+           xx = psmStage(psm, PSM_NOTIFY);
        }
 
        if (fi->h && (psm->goal == PSM_PKGERASE || psm->goal == PSM_PKGSAVE))