| /* 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_simple_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_simple_error_msg_and_die("image is too small"); |
| |
| return result; |
| } |