int rpmcpioStrippedHeaderWrite(rpmcpio_t cpio, int fx, off_t fsize) { struct cpioStrippedPhysicalHeader hdr_s; struct cpioStrippedPhysicalHeader * hdr = &hdr_s; char field[64]; size_t written; int rc = 0; if ((cpio->mode & O_ACCMODE) != O_WRONLY) { return RPMERR_WRITE_FAILED; } if (cpio->fileend != cpio->offset) { return RPMERR_WRITE_FAILED; } rc = rpmcpioWritePad(cpio, 4); if (rc) { return rc; } SET_NUM_FIELD(hdr->fx, fx, field); written = Fwrite(CPIO_STRIPPED_MAGIC, 6, 1, cpio->fd); cpio->offset += written; if (written != 6) { return RPMERR_WRITE_FAILED; } written = Fwrite(hdr, STRIPPED_PHYS_HDR_SIZE, 1, cpio->fd); cpio->offset += written; if (written != STRIPPED_PHYS_HDR_SIZE) { return RPMERR_WRITE_FAILED; } rc = rpmcpioWritePad(cpio, 4); cpio->fileend = cpio->offset + fsize; return rc; }
int cpioHeaderWrite(FSM_t fsm, struct stat * st) { struct cpioCrcPhysicalHeader * hdr = (struct cpioCrcPhysicalHeader *)fsm->rdbuf; char field[64]; size_t len; dev_t dev; int rc = 0; memcpy(hdr->magic, CPIO_NEWC_MAGIC, sizeof(hdr->magic)); SET_NUM_FIELD(hdr->inode, st->st_ino, field); SET_NUM_FIELD(hdr->mode, st->st_mode, field); SET_NUM_FIELD(hdr->uid, st->st_uid, field); SET_NUM_FIELD(hdr->gid, st->st_gid, field); SET_NUM_FIELD(hdr->nlink, st->st_nlink, field); SET_NUM_FIELD(hdr->mtime, st->st_mtime, field); SET_NUM_FIELD(hdr->filesize, st->st_size, field); dev = major(st->st_dev); SET_NUM_FIELD(hdr->devMajor, dev, field); dev = minor(st->st_dev); SET_NUM_FIELD(hdr->devMinor, dev, field); dev = major(st->st_rdev); SET_NUM_FIELD(hdr->rdevMajor, dev, field); dev = minor(st->st_rdev); SET_NUM_FIELD(hdr->rdevMinor, dev, field); len = strlen(fsm->path) + 1; SET_NUM_FIELD(hdr->namesize, len, field); memcpy(hdr->checksum, "00000000", 8); memcpy(fsm->rdbuf + PHYS_HDR_SIZE, fsm->path, len); /* XXX DWRITE uses rdnb for I/O length. */ fsm->rdnb = PHYS_HDR_SIZE + len; rc = fsmNext(fsm, FSM_DWRITE); if (!rc && fsm->rdnb != fsm->wrnb) rc = CPIOERR_WRITE_FAILED; if (!rc) rc = fsmNext(fsm, FSM_PAD); return rc; }
int rpmcpioHeaderWrite(rpmcpio_t cpio, char * path, struct stat * st) { struct cpioCrcPhysicalHeader hdr_s; struct cpioCrcPhysicalHeader * hdr = &hdr_s; char field[64]; size_t len, written; dev_t dev; int rc = 0; if ((cpio->mode & O_ACCMODE) != O_WRONLY) { return RPMERR_WRITE_FAILED; } if (cpio->fileend != cpio->offset) { return RPMERR_WRITE_FAILED; } if (st->st_size >= CPIO_FILESIZE_MAX) { return RPMERR_FILE_SIZE; } rc = rpmcpioWritePad(cpio, 4); if (rc) { return rc; } SET_NUM_FIELD(hdr->inode, st->st_ino, field); SET_NUM_FIELD(hdr->mode, st->st_mode, field); SET_NUM_FIELD(hdr->uid, st->st_uid, field); SET_NUM_FIELD(hdr->gid, st->st_gid, field); SET_NUM_FIELD(hdr->nlink, st->st_nlink, field); SET_NUM_FIELD(hdr->mtime, st->st_mtime, field); SET_NUM_FIELD(hdr->filesize, st->st_size, field); dev = major(st->st_dev); SET_NUM_FIELD(hdr->devMajor, dev, field); dev = minor(st->st_dev); SET_NUM_FIELD(hdr->devMinor, dev, field); dev = major(st->st_rdev); SET_NUM_FIELD(hdr->rdevMajor, dev, field); dev = minor(st->st_rdev); SET_NUM_FIELD(hdr->rdevMinor, dev, field); len = strlen(path) + 1; SET_NUM_FIELD(hdr->namesize, len, field); memcpy(hdr->checksum, "00000000", 8); written = Fwrite(CPIO_NEWC_MAGIC, 6, 1, cpio->fd); cpio->offset += written; if (written != 6) { return RPMERR_WRITE_FAILED; } written = Fwrite(hdr, PHYS_HDR_SIZE, 1, cpio->fd); cpio->offset += written; if (written != PHYS_HDR_SIZE) { return RPMERR_WRITE_FAILED; } written = Fwrite(path, len, 1, cpio->fd); cpio->offset += written; if (written != len) { return RPMERR_WRITE_FAILED; } rc = rpmcpioWritePad(cpio, 4); cpio->fileend = cpio->offset + st->st_size; return rc; }