]>
Commit | Line | Data |
---|---|---|
89a7d726 | 1 | /* blocklist.c - print the block list of a file */ |
2 | /* | |
3 | * GRUB -- GRand Unified Bootloader | |
5a79f472 | 4 | * Copyright (C) 2006,2007 Free Software Foundation, Inc. |
89a7d726 | 5 | * |
5a79f472 | 6 | * GRUB is free software: you can redistribute it and/or modify |
89a7d726 | 7 | * it under the terms of the GNU General Public License as published by |
5a79f472 | 8 | * the Free Software Foundation, either version 3 of the License, or |
89a7d726 | 9 | * (at your option) any later version. |
10 | * | |
5a79f472 | 11 | * GRUB is distributed in the hope that it will be useful, |
89a7d726 | 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
5a79f472 | 17 | * along with GRUB. If not, see <http://www.gnu.org/licenses/>. |
89a7d726 | 18 | */ |
19 | ||
89a7d726 | 20 | #include <grub/dl.h> |
89a7d726 | 21 | #include <grub/misc.h> |
22 | #include <grub/file.h> | |
23 | #include <grub/mm.h> | |
24 | #include <grub/disk.h> | |
524a1e6a | 25 | #include <grub/partition.h> |
b1b797cb | 26 | #include <grub/command.h> |
77a79592 | 27 | #include <grub/i18n.h> |
89a7d726 | 28 | |
29 | static grub_err_t | |
b1b797cb | 30 | grub_cmd_blocklist (grub_command_t cmd __attribute__ ((unused)), |
89a7d726 | 31 | int argc, char **args) |
32 | { | |
33 | grub_file_t file; | |
34 | char buf[GRUB_DISK_SECTOR_SIZE]; | |
35 | unsigned long start_sector = 0; | |
36 | unsigned num_sectors = 0; | |
37 | int num_entries = 0; | |
524a1e6a | 38 | grub_disk_addr_t part_start = 0; |
9959f7db | 39 | auto void NESTED_FUNC_ATTR read_blocklist (grub_disk_addr_t sector, unsigned offset, |
89a7d726 | 40 | unsigned length); |
9959f7db | 41 | auto void NESTED_FUNC_ATTR print_blocklist (grub_disk_addr_t sector, unsigned num, |
89a7d726 | 42 | unsigned offset, unsigned length); |
b39f9d20 | 43 | |
9959f7db | 44 | void NESTED_FUNC_ATTR read_blocklist (grub_disk_addr_t sector, unsigned offset, |
89a7d726 | 45 | unsigned length) |
46 | { | |
47 | if (num_sectors > 0) | |
48 | { | |
49 | if (start_sector + num_sectors == sector | |
50 | && offset == 0 && length == GRUB_DISK_SECTOR_SIZE) | |
51 | { | |
52 | num_sectors++; | |
53 | return; | |
54 | } | |
b39f9d20 | 55 | |
89a7d726 | 56 | print_blocklist (start_sector, num_sectors, 0, 0); |
57 | num_sectors = 0; | |
58 | } | |
59 | ||
60 | if (offset == 0 && length == GRUB_DISK_SECTOR_SIZE) | |
61 | { | |
62 | start_sector = sector; | |
63 | num_sectors++; | |
64 | } | |
65 | else | |
66 | print_blocklist (sector, 0, offset, length); | |
67 | } | |
b39f9d20 | 68 | |
9959f7db | 69 | void NESTED_FUNC_ATTR print_blocklist (grub_disk_addr_t sector, unsigned num, |
89a7d726 | 70 | unsigned offset, unsigned length) |
71 | { | |
72 | if (num_entries++) | |
73 | grub_printf (","); | |
74 | ||
e4e8eaa5 | 75 | grub_printf ("%llu", (unsigned long long) (sector - part_start)); |
89a7d726 | 76 | if (num > 0) |
77 | grub_printf ("+%u", num); | |
78 | if (offset != 0 || length != 0) | |
79 | grub_printf ("[%u-%u]", offset, offset + length); | |
80 | } | |
b39f9d20 | 81 | |
89a7d726 | 82 | if (argc < 1) |
83 | return grub_error (GRUB_ERR_BAD_ARGUMENT, "no file specified"); | |
84 | ||
85 | file = grub_file_open (args[0]); | |
86 | if (! file) | |
87 | return grub_errno; | |
88 | ||
524a1e6a | 89 | if (! file->device->disk) |
90 | return grub_error (GRUB_ERR_BAD_DEVICE, | |
7fd0baee | 91 | "this command is available only for disk devices"); |
524a1e6a | 92 | |
15cb7d43 | 93 | part_start = grub_partition_get_start (file->device->disk->partition); |
b39f9d20 | 94 | |
89a7d726 | 95 | file->read_hook = read_blocklist; |
96 | ||
97 | while (grub_file_read (file, buf, sizeof (buf)) > 0) | |
98 | ; | |
99 | ||
100 | if (num_sectors > 0) | |
101 | print_blocklist (start_sector, num_sectors, 0, 0); | |
b39f9d20 | 102 | |
89a7d726 | 103 | grub_file_close (file); |
104 | ||
105 | return grub_errno; | |
106 | } | |
107 | ||
b1b797cb | 108 | static grub_command_t cmd; |
89a7d726 | 109 | \f |
110 | GRUB_MOD_INIT(blocklist) | |
111 | { | |
b1b797cb | 112 | cmd = grub_register_command ("blocklist", grub_cmd_blocklist, |
77a79592 | 113 | N_("FILE"), N_("Print a block list.")); |
89a7d726 | 114 | } |
115 | ||
116 | GRUB_MOD_FINI(blocklist) | |
117 | { | |
b1b797cb | 118 | grub_unregister_command (cmd); |
89a7d726 | 119 | } |