- if (!rc)
- rc = fsmNext(fsm, FSM_POS);
- break;
- case FSM_EAT:
- for (left = st->st_size; left > 0; left -= fsm->rdnb) {
- fsm->wrlen = (left > fsm->wrsize ? fsm->wrsize : left);
- rc = fsmNext(fsm, FSM_DREAD);
- if (rc)
- break;
- }
- break;
- case FSM_POS:
- left = (modulo - (fsm->cpioPos % modulo)) % modulo;
- if (left) {
- fsm->wrlen = left;
- (void) fsmNext(fsm, FSM_DREAD);
- }
- break;
- case FSM_PAD:
- left = (modulo - (fsm->cpioPos % modulo)) % modulo;
- if (left) {
- memset(fsm->rdbuf, 0, left);
- /* XXX DWRITE uses rdnb for I/O length. */
- fsm->rdnb = left;
- (void) fsmNext(fsm, FSM_DWRITE);
- }
- break;
- case FSM_DREAD:
- fsm->rdnb = Fread(fsm->wrbuf, sizeof(*fsm->wrbuf), fsm->wrlen, fsm->cfd);
- if (_fsm_debug && (stage & FSM_SYSCALL))
- rpmlog(RPMLOG_DEBUG, " %8s (%s, %d, cfd)\trdnb %d\n",
- cur, (fsm->wrbuf == fsm->wrb ? "wrbuf" : "mmap"),
- (int)fsm->wrlen, (int)fsm->rdnb);
- if (fsm->rdnb != fsm->wrlen || Ferror(fsm->cfd))
- rc = CPIOERR_READ_FAILED;
- if (fsm->rdnb > 0)
- fsm->cpioPos += fsm->rdnb;