From: Panu Matilainen Date: Tue, 17 Jan 2012 09:03:27 +0000 (+0200) Subject: Eliminate FSM_WOPEN, FSM_WRITE and FSM_WCLOSE stages X-Git-Tag: rpm-4.10.0-beta1~107 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0b163b65a99845da0d2f2092a1a65c826de40124;p=platform%2Fupstream%2Frpm.git Eliminate FSM_WOPEN, FSM_WRITE and FSM_WCLOSE stages - These are nothing but unnecessarily specialized Fopen(), Fwrite() and Fclose() for what is a purely local need in expandRegular(). Move the local stuff where it belongs. --- diff --git a/lib/fsm.c b/lib/fsm.c index 04ef599..4b3754b 100644 --- a/lib/fsm.c +++ b/lib/fsm.c @@ -763,15 +763,18 @@ static int fsmMapAttrs(FSM_t fsm) */ static int expandRegular(FSM_t fsm) { + FD_t wfd = NULL; const struct stat * st = &fsm->sb; rpm_loff_t left = st->st_size; const unsigned char * fidigest = NULL; pgpHashAlgo digestalgo = 0; int rc = 0; - rc = fsmNext(fsm, FSM_WOPEN); - if (rc) + wfd = Fopen(fsm->path, "w.ufdio"); + if (Ferror(wfd)) { + rc = CPIOERR_OPEN_FAILED; goto exit; + } if (!(rpmtsFlags(fsmGetTs(fsm)) & RPMTRANS_FLAG_NOFILEDIGEST)) { rpmfi fi = fsmGetFi(fsm); @@ -780,7 +783,7 @@ static int expandRegular(FSM_t fsm) } if (st->st_size > 0 && fidigest) - fdInitDigest(fsm->wfd, digestalgo, 0); + fdInitDigest(wfd, digestalgo, 0); while (left) { @@ -789,9 +792,11 @@ static int expandRegular(FSM_t fsm) if (rc) goto exit; - rc = fsmNext(fsm, FSM_WRITE); - if (rc) + fsm->wrnb = Fwrite(fsm->wrbuf, sizeof(*fsm->wrbuf), fsm->rdnb, wfd); + if (fsm->rdnb != fsm->wrnb || Ferror(wfd)) { + rc = CPIOERR_WRITE_FAILED; goto exit; + } left -= fsm->wrnb; @@ -803,8 +808,8 @@ static int expandRegular(FSM_t fsm) if (st->st_size > 0 && fidigest) { void * digest = NULL; - (void) Fflush(fsm->wfd); - fdFiniDigest(fsm->wfd, digestalgo, &digest, NULL, 0); + (void) Fflush(wfd); + fdFiniDigest(wfd, digestalgo, &digest, NULL, 0); if (digest != NULL && fidigest != NULL) { size_t diglen = rpmDigestLength(digestalgo); @@ -817,7 +822,13 @@ static int expandRegular(FSM_t fsm) } exit: - (void) fsmNext(fsm, FSM_WCLOSE); + if (wfd) { + int myerrno = errno; + rpmswAdd(rpmtsOp(fsmGetTs(fsm), RPMTS_OP_DIGEST), + fdOp(wfd, FDSTAT_DIGEST)); + Fclose(wfd); + errno = myerrno; + } return rc; } @@ -2091,36 +2102,6 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break; if (fsm->wrnb > 0) fsm->cpioPos += fsm->wrnb; break; - case FSM_WOPEN: - fsm->wfd = Fopen(fsm->path, "w.ufdio"); - if (fsm->wfd == NULL || Ferror(fsm->wfd)) { - if (fsm->wfd != NULL) (void) fsmNext(fsm, FSM_WCLOSE); - fsm->wfd = NULL; - rc = CPIOERR_OPEN_FAILED; - } - if (_fsm_debug && (stage & FSM_SYSCALL)) - rpmlog(RPMLOG_DEBUG, " %8s (%s, \"w\") wfd %p wrbuf %p\n", cur, - fsm->path, fsm->wfd, fsm->wrbuf); - break; - case FSM_WRITE: - fsm->wrnb = Fwrite(fsm->wrbuf, sizeof(*fsm->wrbuf), fsm->rdnb, fsm->wfd); - if (_fsm_debug && (stage & FSM_SYSCALL)) - rpmlog(RPMLOG_DEBUG, " %8s (wrbuf, %d, wfd)\twrnb %d\n", - cur, (int)fsm->rdnb, (int)fsm->wrnb); - if (fsm->rdnb != fsm->wrnb || Ferror(fsm->wfd)) - rc = CPIOERR_WRITE_FAILED; - break; - case FSM_WCLOSE: - if (fsm->wfd != NULL) { - if (_fsm_debug && (stage & FSM_SYSCALL)) - rpmlog(RPMLOG_DEBUG, " %8s (%p)\n", cur, fsm->wfd); - (void) rpmswAdd(rpmtsOp(fsmGetTs(fsm), RPMTS_OP_DIGEST), - fdOp(fsm->wfd, FDSTAT_DIGEST)); - (void) Fclose(fsm->wfd); - errno = saveerrno; - } - fsm->wfd = NULL; - break; default: break; @@ -2215,10 +2196,6 @@ static const char * fileStageString(fileStage a) case FSM_DREAD: return "Fread"; case FSM_DWRITE: return "Fwrite"; - case FSM_WOPEN: return "Fopen"; - case FSM_WRITE: return "Fwrite"; - case FSM_WCLOSE: return "Fclose"; - default: return "???"; } } diff --git a/lib/fsm.h b/lib/fsm.h index ee3f1a3..f44840c 100644 --- a/lib/fsm.h +++ b/lib/fsm.h @@ -73,10 +73,6 @@ typedef enum fileStage_e { FSM_HWRITE = _fd(71), FSM_DREAD = _fs(72), FSM_DWRITE = _fs(73), - - FSM_WOPEN = _fs(132), - FSM_WRITE = _fs(133), - FSM_WCLOSE = _fs(134) } fileStage; #undef _fv #undef _fi @@ -115,7 +111,6 @@ struct fsm_s { char * rdb; /*!< read: Buffer allocated. */ size_t rdsize; /*!< read: Buffer allocated size. */ size_t rdnb; /*!< read: Number of bytes returned. */ - FD_t wfd; /*!< write: File handle. */ char * wrbuf; /*!< write: Buffer. */ char * wrb; /*!< write: Buffer allocated. */ size_t wrsize; /*!< write: Buffer allocated size. */