1 /* partition table tools
2 Copyright (C) 2008-2010 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 #include <parted/parted.h>
23 #include <parted/debug.h>
29 # define _(String) dgettext (PACKAGE, String)
31 # define _(String) (String)
32 #endif /* ENABLE_NLS */
34 static char zero[16 * 1024];
36 /* Write a single sector to DISK, filling the first BUFLEN
37 bytes of that sector with data from BUF, and NUL-filling
38 any remaining bytes. Return nonzero to indicate success,
41 ptt_write_sector (PedDisk const *disk, void const *buf, size_t buflen)
43 PED_ASSERT (buflen <= disk->dev->sector_size, return 0);
44 /* Allocate a big enough buffer for ped_device_write. */
45 char *s0 = ped_malloc (disk->dev->sector_size);
48 /* Copy boot_code into the first part. */
49 memcpy (s0, buf, buflen);
50 char *p = s0 + buflen;
51 /* Fill the rest with zeros. */
52 memset (p, 0, disk->dev->sector_size - buflen);
53 int write_ok = ped_device_write (disk->dev, s0, 0, 1);
59 /* Read N sectors, starting with sector SECTOR_NUM (which has length
60 DEV->sector_size) into malloc'd storage. If the read fails, free
61 the memory and return zero without modifying *BUF. Otherwise, set
62 *BUF to the new buffer and return 1. */
64 ptt_read_sectors (PedDevice const *dev, PedSector start_sector,
65 PedSector n_sectors, void **buf)
67 char *b = ped_malloc (n_sectors * dev->sector_size);
68 PED_ASSERT (b != NULL, return 0);
69 if (!ped_device_read (dev, b, start_sector, n_sectors)) {
77 /* Read sector, SECTOR_NUM (which has length DEV->sector_size) into malloc'd
78 storage. If the read fails, free the memory and return zero without
79 modifying *BUF. Otherwise, set *BUF to the new buffer and return 1. */
81 ptt_read_sector (PedDevice const *dev, PedSector sector_num, void **buf)
83 return ptt_read_sectors (dev, sector_num, 1, buf);
86 /* Zero N sectors of DEV, starting with START.
87 Return nonzero to indicate success, zero otherwise. */
89 ptt_clear_sectors (PedDevice *dev, PedSector start, PedSector n)
91 PED_ASSERT (dev->sector_size <= sizeof zero, return 0);
92 PedSector n_z_sectors = sizeof zero / dev->sector_size;
93 PedSector n_full = n / n_z_sectors;
95 for (i = 0; i < n_full; i++)
97 if (!ped_device_write (dev, zero, start + n_z_sectors * i, n_z_sectors))
101 PedSector rem = n - n_z_sectors * i;
103 ? 1 : ped_device_write (dev, zero, start + n_z_sectors * i, rem));
106 #include "pt-limit.c"
108 /* Throw an exception and return 0 if PART's starting sector number or
109 its length is greater than the maximum allowed value for LABEL_TYPE.
110 Otherwise, return 1. */
112 ptt_partition_max_start_len (char const *pt_type, const PedPartition *part)
114 struct partition_limit const *pt_lim
115 = pt_limit_lookup (pt_type, strlen (pt_type));
117 /* If we don't have info on the type, return "true". */
121 /* If the length in sectors exceeds the limit, you lose. */
122 if (part->geom.length > pt_lim->max_length)
124 ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
125 _("partition length of %jd sectors exceeds"
126 " the %s-partition-table-imposed maximum"
134 /* If the starting sector exceeds the limit, you lose. */
135 if (part->geom.start > pt_lim->max_start_sector) {
136 ped_exception_throw (
137 PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
138 _("starting sector number, %jd exceeds"
139 " the %s-partition-table-imposed maximum"
150 /* Set *MAX to the largest representation-imposed starting sector number
151 of a partition of type PT_TYPE and return 0. If PT_TYPE is not
152 recognized, return -1. */
154 ptt_partition_max_start_sector (char const *pt_type, PedSector *max)
156 struct partition_limit const *pt_lim
157 = pt_limit_lookup (pt_type, strlen (pt_type));
161 *max = pt_lim->max_start_sector;
165 /* Set *MAX to the maximum representable length of a partition of type
166 PT_TYPE and return 0. If PT_TYPE is not recognized, return -1. */
168 ptt_partition_max_length (char const *pt_type, PedSector *max)
170 struct partition_limit const *pt_lim
171 = pt_limit_lookup (pt_type, strlen (pt_type));
175 *max = pt_lim->max_length;