char move_mode;
char show_progress;
-static void lseek_error_and_exit(int errnum)
-{
- fprintf(stderr, "seek: %s\n", error_message(errnum));
- exit(1);
-}
-
static blk64_t align_offset(blk64_t offset, int n)
{
return (offset + n - 1) & ~(n - 1);
exit (1);
}
+static ext2_loff_t seek_relative(int fd, int offset)
+{
+ ext2_loff_t ret = ext2fs_llseek(fd, offset, SEEK_CUR);
+ if (ret < 0) {
+ perror("seek_relative");
+ exit(1);
+ }
+ return ret;
+}
+
+static ext2_loff_t seek_set(int fd, ext2_loff_t offset)
+{
+ ext2_loff_t ret = ext2fs_llseek(fd, offset, SEEK_SET);
+ if (ret < 0) {
+ perror("seek_set");
+ exit(1);
+ }
+ return ret;
+}
+
static void generic_write(int fd, void *buf, int blocksize, blk64_t block)
{
int count, free_buf = 0;
exit(1);
}
- if (ext2fs_llseek(fd, 0, SEEK_SET) < 0) {
- perror("ext2fs_llseek while writing header");
- exit(1);
- }
+ seek_set(fd, 0);
memset(header_buf, 0, wrt_size);
if (hdr)
write_header(fd, NULL, sizeof(struct ext2_image_hdr), fs->blocksize);
memset(&hdr, 0, sizeof(struct ext2_image_hdr));
- hdr.offset_super = ext2fs_llseek(fd, 0, SEEK_CUR);
+ hdr.offset_super = seek_relative(fd, 0);
retval = ext2fs_image_super_write(fs, fd, 0);
if (retval) {
com_err(program_name, retval, "%s",
exit(1);
}
- hdr.offset_inode = ext2fs_llseek(fd, 0, SEEK_CUR);
+ hdr.offset_inode = seek_relative(fd, 0);
retval = ext2fs_image_inode_write(fs, fd,
(fd != 1) ? IMAGER_FLAG_SPARSEWRITE : 0);
if (retval) {
exit(1);
}
- hdr.offset_blockmap = ext2fs_llseek(fd, 0, SEEK_CUR);
+ hdr.offset_blockmap = seek_relative(fd, 0);
retval = ext2fs_image_bitmap_write(fs, fd, 0);
if (retval) {
com_err(program_name, retval, "%s",
exit(1);
}
- hdr.offset_inodemap = ext2fs_llseek(fd, 0, SEEK_CUR);
+ hdr.offset_inodemap = seek_relative(fd, 0);
retval = ext2fs_image_bitmap_write(fs, fd, IMAGER_FLAG_INODEMAP);
if (retval) {
com_err(program_name, retval, "%s",
return 1;
}
-static void write_block(int fd, char *buf, int sparse_offset,
- int blocksize, blk64_t block)
-{
- ext2_loff_t ret = 0;
-
- if (sparse_offset)
- ret = ext2fs_llseek(fd, sparse_offset, SEEK_CUR);
-
- if (ret < 0)
- lseek_error_and_exit(errno);
- generic_write(fd, buf, blocksize, block);
-}
-
static int name_id[256];
#define EXT4_MAX_REC_LEN ((1<<16)-1)
signal (SIGINT, sigint_handler);
more_blocks:
if (distance)
- ext2fs_llseek (fd, (start * fs->blocksize) + dest_offset, SEEK_SET);
+ seek_set(fd, (start * fs->blocksize) + dest_offset);
for (blk = start; blk < end; blk++) {
if (got_sigint) {
if (distance) {
scramble_dir_block(fs, blk, buf);
if ((fd != 1) && check_zero_block(buf, fs->blocksize))
goto sparse_write;
- write_block(fd, buf, sparse, fs->blocksize, blk);
+ if (sparse)
+ seek_relative(fd, sparse);
+ generic_write(fd, buf, fs->blocksize, blk);
sparse = 0;
} else {
sparse_write:
if (fd == 1) {
- write_block(fd, zero_buf, 0,
- fs->blocksize, blk);
+ generic_write(fd, zero_buf, fs->blocksize, blk);
continue;
}
sparse += fs->blocksize;
if (sparse > 1024*1024) {
- write_block(fd, 0, 1024*1024, 0, 0);
+ seek_relative(fd, 1024*1024);
sparse -= 1024*1024;
}
}
if (sparse) {
ext2_loff_t offset;
if (distance)
- offset = ext2fs_llseek(
- fd,
- fs->blocksize * ext2fs_blocks_count(fs->super) + dest_offset,
- SEEK_SET);
- else offset = ext2fs_llseek(fd, sparse, SEEK_CUR);
+ offset = seek_set(fd,
+ fs->blocksize * ext2fs_blocks_count(fs->super) + dest_offset);
+ else
+ offset = seek_relative(fd, sparse);
- if (offset < 0)
- lseek_error_and_exit(errno);
- if (ftruncate64(fd, offset) < 0)
- write_block(fd, zero_buf, -1, 1, -1);
+ if (ftruncate64(fd, offset) < 0) {
+ seek_relative(fd, -1);
+ generic_write(fd, zero_buf, 1, -1);
+ }
}
#else
- if (sparse && !distance)
- write_block(fd, zero_buf, sparse-1, 1, -1);
+ if (sparse && !distance) {
+ seek_relative(fd, sparse-1);
+ generic_write(fd, zero_buf, 1, -1);
+ }
#endif
ext2fs_free_mem(&zero_buf);
ext2fs_free_mem(&buf);
int fd = image->fd;
/* Store current position */
- if ((offset = ext2fs_llseek(fd, 0, SEEK_CUR)) < 0)
- lseek_error_and_exit(errno);
+ offset = seek_relative(fd, 0);
assert(table);
while (cache->free < cache->count) {
if (seek != table->offset) {
- if (ext2fs_llseek(fd, table->offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, table->offset);
seek = table->offset;
}
}
/* Restore previous position */
- if (ext2fs_llseek(fd, offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, offset);
}
/**
*/
if (table_index != ref->refcount_table_index) {
- if (ext2fs_llseek(fd, ref->refcount_block_offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, ref->refcount_block_offset);
generic_write(fd, (char *)ref->refcount_block,
img->cluster_size, 0);
ref->refcount_table[ref->refcount_table_index] =
ext2fs_cpu_to_be64(ref->refcount_block_offset);
- if (ext2fs_llseek(fd, ref->refcount_table_offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, ref->refcount_table_offset);
generic_write(fd, (char *)ref->refcount_table,
ref->refcount_table_clusters << img->cluster_bits, 0);
- if (ext2fs_llseek(fd, ref->refcount_block_offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, ref->refcount_block_offset);
generic_write(fd, (char *)ref->refcount_block, img->cluster_size, 0);
return 0;
}
/* Refcount all qcow2 related metadata up to refcount_block_offset */
end = img->refcount.refcount_block_offset;
- if (ext2fs_llseek(fd, end, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, end);
blk = end + img->cluster_size;
for (offset = 0; offset <= end; offset += img->cluster_size) {
if (update_refcount(fd, img, offset, blk)) {
end += img->cluster_size;
}
}
- if (ext2fs_llseek(fd, offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, offset);
retval = ext2fs_get_mem(fs->blocksize, &buf);
if (retval) {
if (update_refcount(fd, img, offset, offset)) {
/* Make space for another refcount block */
offset += img->cluster_size;
- if (ext2fs_llseek(fd, offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, offset);
/*
* We have created the new refcount block, this
* means that we need to refcount it as well.
}
}
offset += img->cluster_size;
- if (ext2fs_llseek(fd, offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, offset);
continue;
}
sync_refcount(fd, img);
/* Write l1_table*/
- if (ext2fs_llseek(fd, img->l1_offset, SEEK_SET) < 0)
- lseek_error_and_exit(errno);
+ seek_set(fd, img->l1_offset);
size = img->l1_size * sizeof(__u64);
generic_write(fd, (char *)img->l1_table, size, 0);
ext2fs_rewrite_to_io(fs, io);
- if (ext2fs_llseek(fd, fs->image_header->offset_inode, SEEK_SET) < 0) {
- perror("ext2fs_llseek");
- exit(1);
- }
+ seek_set(fd, fs->image_header->offset_inode);
retval = ext2fs_image_inode_read(fs, fd, 0);
if (retval) {
}
}
if (dest_offset)
- if (ext2fs_llseek (fd, dest_offset, SEEK_SET) < 0) {
- perror("ext2fs_llseek");
- exit(1);
- }
+ seek_set(fd, dest_offset);
if ((img_type & E2IMAGE_QCOW2) && (fd == 1)) {
com_err(program_name, 0, "QCOW2 image can not be written to "