| From 6c709b57a36a92db4ea78e821464aa2e1c547c85 Mon Sep 17 00:00:00 2001 |
| From: Petr Uzel <petr.uzel@suse.cz> |
| Date: Mon, 19 Sep 2011 15:29:14 +0200 |
| Subject: [PATCH] sfdisk: use unsigned long long to internally represent sector |
| number |
| |
| Unsigned long is only 4 bytes long on i586, which is not enough to |
| represent sector number on todays large disks. Use unsigned long long, |
| which is 8 bytes long, to store the sector numbers internally, so that |
| we could later make some sanity checks and warn the user if the sector |
| numbers exceed the limits imposed by DOS partition table format. |
| |
| Signed-off-by: Petr Uzel <petr.uzel@suse.cz> |
| --- |
| fdisk/sfdisk.c | 58 +++++++++++++++++++++++++++++----------------------------- |
| 1 file changed, 29 insertions(+), 29 deletions(-) |
| |
| diff --git a/fdisk/sfdisk.c b/fdisk/sfdisk.c |
| index fe51908..d1ba9d6 100644 |
| --- a/fdisk/sfdisk.c |
| +++ b/fdisk/sfdisk.c |
| @@ -186,7 +186,7 @@ sseek(char *dev, int fd, unsigned long s) { |
| */ |
| struct sector { |
| struct sector *next; |
| - unsigned long sectornumber; |
| + unsigned long long sectornumber; |
| int to_be_written; |
| char data[512]; |
| } *sectorhead; |
| @@ -203,7 +203,7 @@ free_sectors(void) { |
| } |
| |
| static struct sector * |
| -get_sector(char *dev, int fd, unsigned long sno) { |
| +get_sector(char *dev, int fd, unsigned long long sno) { |
| struct sector *s; |
| |
| for (s = sectorhead; s; s = s->next) |
| @@ -739,9 +739,9 @@ copy_from_part(struct partition *p, char *cp) { |
| for equality with EXTENDED_PARTITION (and these Disk Manager types). */ |
| |
| struct part_desc { |
| - unsigned long start; |
| - unsigned long size; |
| - unsigned long sector, offset; /* disk location of this info */ |
| + unsigned long long start; |
| + unsigned long long size; |
| + unsigned long long sector, offset; /* disk location of this info */ |
| struct partition p; |
| struct part_desc *ep; /* extended partition containing this one */ |
| int ptype; |
| @@ -980,27 +980,27 @@ out_partition_header(char *dev, int format, struct geometry G) { |
| } |
| |
| static void |
| -out_rounddown(int width, unsigned long n, unsigned long unit, int inc) { |
| - printf("%*lu", width, inc + n / unit); |
| +out_rounddown(int width, unsigned long long n, unsigned long unit, int inc) { |
| + printf("%*llu", width, inc + n / unit); |
| if (unit != 1) |
| putchar((n % unit) ? '+' : ' '); |
| putchar(' '); |
| } |
| |
| static void |
| -out_roundup(int width, unsigned long n, unsigned long unit, int inc) { |
| - if (n == (unsigned long)(-1)) |
| +out_roundup(int width, unsigned long long n, unsigned long unit, int inc) { |
| + if (n == (unsigned long long)(-1)) |
| printf("%*s", width, "-"); |
| else |
| - printf("%*lu", width, inc + n / unit); |
| + printf("%*llu", width, inc + n / unit); |
| if (unit != 1) |
| putchar(((n + 1) % unit) ? '-' : ' '); |
| putchar(' '); |
| } |
| |
| static void |
| -out_roundup_size(int width, unsigned long n, unsigned long unit) { |
| - printf("%*lu", width, (n + unit - 1) / unit); |
| +out_roundup_size(int width, unsigned long long n, unsigned long unit) { |
| + printf("%*llu", width, (n + unit - 1) / unit); |
| if (unit != 1) |
| putchar((n % unit) ? '-' : ' '); |
| putchar(' '); |
| @@ -1047,7 +1047,7 @@ get_fdisk_geometry(struct disk_desc *z) { |
| static void |
| out_partition(char *dev, int format, struct part_desc *p, |
| struct disk_desc *z, struct geometry G) { |
| - unsigned long start, end, size; |
| + unsigned long long start, end, size; |
| int pno, lpno; |
| |
| if (!format && !(format = specified_format)) |
| @@ -1068,8 +1068,8 @@ out_partition(char *dev, int format, struct part_desc *p, |
| size = p->size; |
| |
| if (dump) { |
| - printf(" start=%9lu", start); |
| - printf(", size=%9lu", size); |
| + printf(" start=%9llu", start); |
| + printf(", size=%9llu", size); |
| if (p->ptype == DOS_TYPE) { |
| printf(", Id=%2x", p->p.sys_type); |
| if (p->p.bootable == 0x80) |
| @@ -1258,7 +1258,7 @@ partitions_ok(struct disk_desc *z) { |
| if (is_extended(q->p.sys_type)) |
| if (p->start <= q->start && p->start + p->size > q->start) { |
| my_warn(_("Warning: partition %s contains part of " |
| - "the partition table (sector %lu),\n" |
| + "the partition table (sector %llu),\n" |
| "and will destroy it when filled\n"), |
| PNO(p), q->start); |
| return 0; |
| @@ -1391,7 +1391,7 @@ static void |
| extended_partition(char *dev, int fd, struct part_desc *ep, struct disk_desc *z) { |
| char *cp; |
| struct sector *s; |
| - unsigned long start, here, next; |
| + unsigned long long start, here, next; |
| int i, moretodo = 1; |
| struct partition p; |
| struct part_desc *partitions = &(z->partitions[0]); |
| @@ -1489,7 +1489,7 @@ static void |
| bsd_partition(char *dev, int fd, struct part_desc *ep, struct disk_desc *z) { |
| struct bsd_disklabel *l; |
| struct bsd_partition *bp, *bp0; |
| - unsigned long start = ep->start; |
| + unsigned long long start = ep->start; |
| struct sector *s; |
| struct part_desc *partitions = &(z->partitions[0]); |
| size_t pno = z->partno; |
| @@ -1916,10 +1916,10 @@ int all_logicals_inside_outermost_extended = 1; |
| enum { NESTED, CHAINED, ONESECTOR } boxes = NESTED; |
| |
| /* find the default value for <start> - assuming entire units */ |
| -static unsigned long |
| +static unsigned long long |
| first_free(int pno, int is_extended, struct part_desc *ep, int format, |
| - unsigned long mid, struct disk_desc *z) { |
| - unsigned long ff, fff; |
| + unsigned long long mid, struct disk_desc *z) { |
| + unsigned long long ff, fff; |
| unsigned long unit = unitsize(format); |
| struct part_desc *partitions = &(z->partitions[0]), *pp = 0; |
| |
| @@ -1960,9 +1960,9 @@ first_free(int pno, int is_extended, struct part_desc *ep, int format, |
| } |
| |
| /* find the default value for <size> - assuming entire units */ |
| -static unsigned long |
| +static unsigned long long |
| max_length(int pno, int is_extended, struct part_desc *ep, int format, |
| - unsigned long start, struct disk_desc *z) { |
| + unsigned long long start, struct disk_desc *z) { |
| unsigned long long fu; |
| unsigned long unit = unitsize(format); |
| struct part_desc *partitions = &(z->partitions[0]), *pp = 0; |
| @@ -1992,7 +1992,7 @@ max_length(int pno, int is_extended, struct part_desc *ep, int format, |
| /* ep is 0 or points to surrounding extended partition */ |
| static int |
| compute_start_sect(struct part_desc *p, struct part_desc *ep) { |
| - unsigned long base; |
| + unsigned long long base; |
| int inc = (DOS && B.sectors) ? B.sectors : 1; |
| int delta; |
| |
| @@ -2004,7 +2004,7 @@ compute_start_sect(struct part_desc *p, struct part_desc *ep) { |
| delta = 0; |
| |
| if (delta < 0) { |
| - unsigned long old_size = p->size; |
| + unsigned long long old_size = p->size; |
| p->start -= delta; |
| p->size += delta; |
| if (is_extended(p->p.sys_type) && boxes == ONESECTOR) |
| @@ -2073,7 +2073,7 @@ read_line(int pno, struct part_desc *ep, char *dev, int interactive, |
| char *fields[11]; |
| int fno, pct = pno % 4; |
| struct part_desc p, *orig; |
| - unsigned long ff, ff1, ul, ml, ml1, def; |
| + unsigned long long ff, ff1, ul, ml, ml1, def; |
| int format, lpno, is_extd; |
| |
| if (eof || eob) |
| @@ -2144,7 +2144,7 @@ read_line(int pno, struct part_desc *ep, char *dev, int interactive, |
| ul = EXTENDED_PARTITION; |
| else if (!strcmp(fields[2], "X")) |
| ul = LINUX_EXTENDED; |
| - else if (get_ul(fields[2], &ul, LINUX_NATIVE, 16)) |
| + else if (get_ull(fields[2], &ul, LINUX_NATIVE, 16)) |
| return 0; |
| if (ul > 255) { |
| my_warn(_("Illegal type\n")); |
| @@ -2160,7 +2160,7 @@ read_line(int pno, struct part_desc *ep, char *dev, int interactive, |
| if (fno < 1 || !*(fields[0])) |
| p.start = def; |
| else { |
| - if (get_ul(fields[0], &ul, def / unitsize(0), 0)) |
| + if (get_ull(fields[0], &ul, def / unitsize(0), 0)) |
| return 0; |
| p.start = ul * unitsize(0); |
| p.start -= (p.start % unitsize(format)); |
| @@ -2175,7 +2175,7 @@ read_line(int pno, struct part_desc *ep, char *dev, int interactive, |
| else if (!strcmp(fields[1], "+")) |
| p.size = ml1; |
| else { |
| - if (get_ul(fields[1], &ul, def / unitsize(0), 0)) |
| + if (get_ull(fields[1], &ul, def / unitsize(0), 0)) |
| return 0; |
| p.size = ul * unitsize(0) + unitsize(format) - 1; |
| p.size -= (p.size % unitsize(format)); |
| -- |
| 1.8.1.5-x20-1 |
| |