/* vi: set sw=4 ts=4: */ /* * Utility routines. * * Copyright (C) 2010 Denys Vlasenko * * Licensed under GPLv2, see file LICENSE in this source tree. */ #include "libbb.h" uoff_t FAST_FUNC get_volume_size_in_bytes(int fd, const char *override, unsigned override_units, int extend) { uoff_t result; if (override) { result = XATOOFF(override); if (result >= (uoff_t)(MAXINT(off_t)) / override_units) bb_error_msg_and_die("image size is too big"); result *= override_units; /* seek past end fails on block devices but works on files */ if (lseek(fd, result - 1, SEEK_SET) != (off_t)-1) { if (extend) xwrite(fd, "", 1); /* file grows if needed */ } //else { // bb_error_msg("warning, block device is smaller"); //} } else { /* more portable than BLKGETSIZE[64] */ result = xlseek(fd, 0, SEEK_END); } xlseek(fd, 0, SEEK_SET); /* Prevent things like this: * $ dd if=/dev/zero of=foo count=1 bs=1024 * $ mkswap foo * Setting up swapspace version 1, size = 18446744073709548544 bytes * * Picked 16k arbitrarily: */ if (result < 16*1024) bb_error_msg_and_die("image is too small"); return result; }