From 40e7d25aca1abbe080e00e2bed64b444a5ec7858 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 1 Feb 2010 23:48:27 +0100 Subject: mkXXXX: unify [KBYTES] parameter handling (added it to mkswap) Signed-off-by: Denys Vlasenko --- libbb/get_volsize.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 libbb/get_volsize.c (limited to 'libbb/get_volsize.c') diff --git a/libbb/get_volsize.c b/libbb/get_volsize.c new file mode 100644 index 000000000..5b0270968 --- /dev/null +++ b/libbb/get_volsize.c @@ -0,0 +1,48 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Copyright (C) 2010 Denys Vlasenko + * + * Licensed under GPLv2, see file LICENSE in this tarball for details. + */ +#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; +} -- cgit v1.2.3