Contents of /trunk/mkinitrd-magellan/busybox/libbb/get_volsize.c
Parent Directory | Revision Log
Revision 1123 -
(show annotations)
(download)
Wed Aug 18 21:56:57 2010 UTC (14 years, 1 month ago) by niro
File MIME type: text/plain
File size: 1167 byte(s)
Wed Aug 18 21:56:57 2010 UTC (14 years, 1 month ago) by niro
File MIME type: text/plain
File size: 1167 byte(s)
-updated to busybox-1.17.1
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * Utility routines. |
4 | * |
5 | * Copyright (C) 2010 Denys Vlasenko |
6 | * |
7 | * Licensed under GPLv2, see file LICENSE in this tarball for details. |
8 | */ |
9 | #include "libbb.h" |
10 | |
11 | uoff_t FAST_FUNC get_volume_size_in_bytes(int fd, |
12 | const char *override, |
13 | unsigned override_units, |
14 | int extend) |
15 | { |
16 | uoff_t result; |
17 | |
18 | if (override) { |
19 | result = XATOOFF(override); |
20 | if (result >= (uoff_t)(MAXINT(off_t)) / override_units) |
21 | bb_error_msg_and_die("image size is too big"); |
22 | result *= override_units; |
23 | /* seek past end fails on block devices but works on files */ |
24 | if (lseek(fd, result - 1, SEEK_SET) != (off_t)-1) { |
25 | if (extend) |
26 | xwrite(fd, "", 1); /* file grows if needed */ |
27 | } |
28 | //else { |
29 | // bb_error_msg("warning, block device is smaller"); |
30 | //} |
31 | } else { |
32 | /* more portable than BLKGETSIZE[64] */ |
33 | result = xlseek(fd, 0, SEEK_END); |
34 | } |
35 | |
36 | xlseek(fd, 0, SEEK_SET); |
37 | |
38 | /* Prevent things like this: |
39 | * $ dd if=/dev/zero of=foo count=1 bs=1024 |
40 | * $ mkswap foo |
41 | * Setting up swapspace version 1, size = 18446744073709548544 bytes |
42 | * |
43 | * Picked 16k arbitrarily: */ |
44 | if (result < 16*1024) |
45 | bb_error_msg_and_die("image is too small"); |
46 | |
47 | return result; |
48 | } |