Mercurial > hg > toybox
annotate toys/pending/fdisk.c @ 998:72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
sys_types had used char[_PATH_MAX] for 22-char max strings.
When this is done 48 times, it nearly doubles the size of toybox.
goto should only be used when it is the easiest way to bail out.
That does not mean "when we need to fall back to returning a one-liner
that asks user input", nor is it suitable for looping:
C has while () and do { } while (); for a reason.
valid was called once. As such, it belonged inline.
print_*menu could probably be inlined, but I did not do this yet
in case a table-driven approach works better.
This uses C string concatenation to break an overly long message up,
while not wasting function calls.
author | Isaac Dunham <ibid.ag@gmail.com> |
---|---|
date | Sun, 11 Aug 2013 22:00:36 -0500 |
parents | 8b1814e4c987 |
children | 0752b2d58909 |
rev | line source |
---|---|
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1 /* fdisk.c - fdisk program to modify partitions on disk. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
2 * |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
3 * Copyright 2012 Ashwini Kumar <ak.ashwini@gmail.com> |
997
8b1814e4c987
Ashwini Sharma said that Kyungwan Han should be in the contact info for the commands he sent recently.
Rob Landley <rob@landley.net>
parents:
989
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
5 * |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
6 * No Standard. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
7 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
8 USE_FDISK(NEWTOY(fdisk, "C#<0H#<0S#<0b#<512ul", TOYFLAG_SBIN)) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
9 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
10 config FDISK |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
11 bool "fdisk" |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
12 default n |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
13 help |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
14 usage: fdisk [-lu] [-C CYLINDERS] [-H HEADS] [-S SECTORS] [-b SECTSZ] DISK |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
15 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
16 Change partition table |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
17 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
18 -u Start and End are in sectors (instead of cylinders) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
19 -l Show partition table for each DISK, then exit |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
20 -b size sector size (512, 1024, 2048 or 4096) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
21 -C CYLINDERS Set number of cylinders/heads/sectors |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
22 -H HEADS |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
23 -S SECTORS |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
24 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
25 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
26 #define FOR_fdisk |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
27 #include "toys.h" |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
28 #include <linux/hdreg.h> |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
29 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
30 GLOBALS( |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
31 long sect_sz; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
32 long sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
33 long heads; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
34 long cylinders; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
35 ) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
36 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
37 #define EXTENDED 0x05 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
38 #define WIN98_EXTENDED 0x0f |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
39 #define LINUX_NATIVE 0x83 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
40 #define LINUX_EXTENDED 0x85 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
41 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
42 #define SECTOR_SIZE 512 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
43 #define ONE_K 1024 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
44 #define PARTITION_MAX 60 //partition max is modifiable |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
45 #define IS_EXTENDED(i) ((i) == EXTENDED || (i) == WIN98_EXTENDED || (i) == LINUX_EXTENDED) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
46 #define sector(s) ((s) & 0x3f) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
47 #define cylinder(s, c) ((c) | (((s) & 0xc0) << 2)) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
48 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
49 typedef off_t sector_t; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
50 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
51 struct partition { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
52 unsigned char boot_ind, head, sector, cyl, sys_ind, end_head, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
53 end_sector, end_cyl, start4[4], size4[4]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
54 }; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
55 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
56 struct part_entry { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
57 struct partition *part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
58 char *sec_buffer; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
59 sector_t start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
60 int modified; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
61 }; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
62 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
63 struct part_types { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
64 int id; |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
65 char type[24]; |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
66 } sys_types[] = { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
67 {0x00, "Empty"}, {0x01, "FAT12"}, {0x04, "FAT16 <32M"}, {0x05, "Extended"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
68 {0x06, "FAT16"}, {0x07, "HPFS/NTFS"}, {0x0a, "OS/2 Boot Manager"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
69 {0x0b, "Win95 FAT32"}, {0x0c, "Win95 FAT32 (LBA)"}, {0x0e, "Win95 FAT16 (LBA)"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
70 {0x0f, "Win95 Ext'd (LBA)"}, {0x11, "Hidden FAT12"}, {0x12, "Compaq diagnostics"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
71 {0x14, "Hidden FAT16 <32M"}, {0x16, "Hidden FAT16"}, {0x17, "Hidden HPFS/NTFS"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
72 {0x1b, "Hidden Win95 FAT32"}, {0x1c, "Hidden W95 FAT32 (LBA)"}, {0x1e, "Hidden W95 FAT16 (LBA)"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
73 {0x3c, "Part.Magic recovery"}, {0x41, "PPC PReP Boot"}, {0x42, "SFS"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
74 {0x63, "GNU HURD or SysV"}, {0x80, "Old Minix"}, {0x81, "Minix / old Linux"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
75 {0x82, "Linux swap"}, {0x83, "Linux"}, {0x84, "OS/2 hidden C: drive"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
76 {0x85, "Linux extended"}, {0x86, "NTFS volume set"}, {0x87, "NTFS volume set"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
77 {0x8e, "Linux LVM"}, {0x9f, "BSD/OS"}, {0xa0, "Thinkpad hibernation"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
78 {0xa5, "FreeBSD"}, {0xa6, "OpenBSD"}, {0xa8, "Darwin UFS"}, {0xa9, "NetBSD"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
79 {0xab, "Darwin boot"}, {0xb7, "BSDI fs"}, {0xb8, "BSDI swap"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
80 {0xbe, "Solaris boot"}, {0xeb, "BeOS fs"}, {0xee, "EFI GPT"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
81 {0xef, "EFI (FAT-12/16/32)"}, {0xf0, "Linux/PA-RISC boot"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
82 {0xf2, "DOS secondary"}, {0xfd, "Linux raid autodetect"}, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
83 }; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
84 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
85 static int num_parts, disp_unit_cyl, dos_flag, dev_fd = 3; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
86 static long g_cylinders, g_heads, g_sectors, g_sect_size; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
87 static sector_t total_number_sectors, extended_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
88 static char MBRbuf[2048], *disk_device; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
89 struct part_entry partitions[PARTITION_MAX]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
90 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
91 static struct partition* part_offset(char *secbuf, int i) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
92 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
93 return (struct partition*)(secbuf + 0x1be + i*(sizeof(struct partition))); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
94 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
95 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
96 static void set_levalue(unsigned char *cp, sector_t value ) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
97 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
98 uint32_t val = SWAP_LE32(value); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
99 memcpy(cp, (void*)&val, 4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
100 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
101 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
102 static void set_hsc(struct partition *p, sector_t start, sector_t end) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
103 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
104 if (dos_flag && (start / (g_sectors * g_heads) > 1023)) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
105 start = g_heads * g_sectors * ONE_K - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
106 p->sector = (start % g_sectors) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
107 start /= g_sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
108 p->head = start % g_heads; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
109 start /= g_heads; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
110 p->cyl = start & 0xFF; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
111 p->sector |= (start >> 2) & 0xc0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
112 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
113 if (dos_flag && (end / (g_sectors * g_heads) > 1023)) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
114 end = g_heads * g_sectors * ONE_K - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
115 p->end_sector = (end % g_sectors) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
116 end /= g_sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
117 p->end_head = end % g_heads; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
118 end /= g_heads; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
119 p->end_cyl = end & 0xFF; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
120 p->end_sector |= (end >> 2) & 0xc0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
121 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
122 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
123 static int chs_warn(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
124 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
125 if (g_heads && g_sectors && g_cylinders) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
126 return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
127 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
128 printf("Unknown value(s) for:"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
129 if (!g_heads) printf(" heads"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
130 if (!g_sectors) printf(" sectors"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
131 if (!g_cylinders) printf(" cylinders"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
132 printf(". can set in the expert menu.\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
133 return 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
134 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
135 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
136 static void list_types(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
137 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
138 int i, adjust = 0, size = ARRAY_LEN(sys_types); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
139 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
140 if(size % 2) adjust = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
141 for (i = 0; i < (size - adjust); i+=2) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
142 xprintf("%2x %-22s\t\t%2x %-22.22s\n", sys_types[i].id, sys_types[i].type, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
143 sys_types[i+1].id, sys_types[i+1].type); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
144 if (adjust) xprintf("%2x %-22s\n",sys_types[size-1].id, sys_types[size-1].type); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
145 xputc('\n'); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
146 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
147 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
148 static void read_sec_sz() |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
149 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
150 int arg; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
151 if (ioctl(dev_fd, BLKSSZGET, &arg) == 0) g_sect_size = arg; |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
152 if (toys.optflags & FLAG_b) { |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
153 if (TT.sect_sz != 512 && TT.sect_sz != 1024 && TT.sect_sz != 2048 && |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
154 TT.sect_sz != 4096) { |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
155 toys.exithelp++; |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
156 error_exit("bad sector size"); |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
157 } |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
158 g_sect_size = TT.sect_sz; |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
159 } |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
160 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
161 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
162 static sector_t read_size() |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
163 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
164 uint64_t sec64 = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
165 unsigned long sectors = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
166 if (ioctl(dev_fd, BLKGETSIZE64, &sec64) == 0) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
167 sec64 = sec64 >> 9; //convert to 512 block size. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
168 if (sec64 != (uint32_t) sec64) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
169 perror_msg("device has more than 2^32 sectors, can't use all of them"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
170 sec64 = (uint32_t) - 1L; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
171 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
172 return sec64; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
173 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
174 if (ioctl(dev_fd, BLKGETSIZE, §ors) == 0) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
175 if (sizeof(long) > sizeof(sector_t) && sectors != (sector_t)sectors) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
176 sectors = (uint32_t) - 1L; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
177 return sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
178 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
179 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
180 static int validate_part_buff(char *buffer) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
181 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
182 if ((buffer[510] != 0x55) || (buffer[511] != 0xAA)) return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
183 return 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
184 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
185 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
186 static int is_partition_clear(struct partition* p) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
187 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
188 int i = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
189 unsigned char res = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
190 const char *ptr = (const char*)p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
191 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
192 for (i = 0; i < sizeof(struct partition); i++) res |= (unsigned char)ptr[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
193 return (res == 0x00); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
194 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
195 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
196 static uint32_t swap_le32toh(unsigned char *cp) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
197 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
198 uint32_t val; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
199 memcpy((void*)&val, cp, 4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
200 return le32toh(val); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
201 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
202 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
203 static int check_order(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
204 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
205 sector_t first[num_parts], last_seen_val = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
206 int i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
207 struct part_entry *pe; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
208 struct partition *px; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
209 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
210 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
211 if (i == 4) last_seen_val = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
212 pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
213 px = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
214 if (px->sys_ind) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
215 first[i] = swap_le32toh(px->start4) + pe->start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
216 if (last_seen_val > first[i]) return 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
217 last_seen_val = first[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
218 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
219 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
220 return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
221 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
222 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
223 static void read_geometry(struct hd_geometry *disk) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
224 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
225 struct hd_geometry geometry; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
226 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
227 if (ioctl(dev_fd, HDIO_GETGEO, &geometry)) return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
228 disk->heads = geometry.heads; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
229 disk->sectors = geometry.sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
230 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
231 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
232 /* Read the extended boot record for the |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
233 * logical partion details. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
234 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
235 static void read_ebr(int idx) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
236 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
237 char *sec_buf = NULL; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
238 sector_t offset = 0, local_start_off = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
239 struct partition *p, *q; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
240 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
241 q = p = partitions[idx].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
242 local_start_off = swap_le32toh(p->start4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
243 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
244 if (!extended_offset) extended_offset = local_start_off; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
245 do { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
246 sec_buf = xzalloc(g_sect_size); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
247 partitions[num_parts].part = part_offset(sec_buf, 0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
248 partitions[num_parts].sec_buffer = sec_buf; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
249 offset = swap_le32toh(q->start4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
250 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
251 if (num_parts > 4) offset += local_start_off; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
252 partitions[num_parts].start_offset = offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
253 xlseek(dev_fd, (off_t)(offset * g_sect_size), SEEK_SET); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
254 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
255 if (g_sect_size != readall(dev_fd, sec_buf, g_sect_size)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
256 close(dev_fd); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
257 error_exit("Couldn't read sector zero\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
258 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
259 num_parts++; //extended partions present. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
260 q = part_offset(sec_buf, 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
261 } while (!is_partition_clear(q)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
262 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
263 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
264 static void physical_HS(int* h, int *s) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
265 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
266 struct partition *p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
267 int i, end_h, end_s, e_hh = 0, e_ss = 0, ini = 1, dirty = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
268 const unsigned char *bufp = (const unsigned char *)MBRbuf; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
269 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
270 if (!(validate_part_buff((char*)bufp))) return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
271 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
272 for (i = 0; i < 4; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
273 p = part_offset((char*)bufp, i); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
274 if (p->sys_ind) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
275 end_h = p->end_head + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
276 end_s = (p->end_sector & 077); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
277 if (ini) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
278 e_hh = end_h; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
279 e_ss = end_s; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
280 ini = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
281 } else if (e_hh !=end_h || e_ss != end_s) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
282 dirty = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
283 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
284 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
285 if (!dirty && !ini) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
286 *h = e_hh; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
287 *s = e_ss; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
288 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
289 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
290 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
291 //Reset the primary partition table |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
292 static void reset_boot(int change) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
293 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
294 int i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
295 for(i = 0; i < 4; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
296 struct part_entry *pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
297 pe->part = part_offset(MBRbuf, i); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
298 pe->start_offset = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
299 pe->sec_buffer = MBRbuf; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
300 pe->modified = change; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
301 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
302 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
303 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
304 static inline void write_table_flag(char *buf) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
305 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
306 buf[510] = 0x55; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
307 buf[511] = 0xaa; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
308 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
309 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
310 /* free the buffers used for holding details of |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
311 * extended logical partions |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
312 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
313 static void free_bufs(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
314 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
315 int i = 4; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
316 for (; i < num_parts; i++) free(partitions[i].sec_buffer); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
317 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
318 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
319 static void create_empty_doslabel(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
320 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
321 xprintf("Building a new DOS Disklabel. The changes will\n" |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
322 "remain in memory only, until you write it.\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
323 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
324 num_parts = 4; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
325 extended_offset = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
326 memset(&MBRbuf[510 - 4*16], 0, 4*16); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
327 write_table_flag(MBRbuf); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
328 partitions[0].modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
329 reset_boot(1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
330 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
331 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
332 /* Read the Master Boot sector of the device for the |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
333 * partition table entries/details. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
334 * If any extended partition is found then read the EBR |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
335 * for logical partition details |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
336 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
337 static int read_mbr(char *device, int validate) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
338 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
339 int fd, sector_fac, i, h = 0, s = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
340 struct hd_geometry disk; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
341 fd = open(device, O_RDWR); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
342 if(fd < 0) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
343 perror_msg("can't open '%s'",device); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
344 return 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
345 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
346 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
347 disk_device = strdup(device); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
348 if(fd != dev_fd) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
349 if(dup2(fd, dev_fd) != dev_fd) perror_exit("Can't dup2"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
350 close(fd); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
351 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
352 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
353 //read partition table - MBR |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
354 if (SECTOR_SIZE != readall(dev_fd, MBRbuf, SECTOR_SIZE)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
355 close(dev_fd); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
356 perror_exit("Couldn't read sector zero\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
357 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
358 if (validate && !validate_part_buff(MBRbuf)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
359 xprintf("Device contains neither a valid DOS " |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
360 "partition table, nor Sun, SGI, OSF or GPT " |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
361 "disklabel\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
362 create_empty_doslabel(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
363 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
364 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
365 disk.heads = disk.sectors = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
366 read_geometry(&disk); //CHS values |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
367 total_number_sectors = read_size(); //Device size |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
368 read_sec_sz(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
369 sector_fac = g_sect_size/SECTOR_SIZE; //512 is hardware sector size. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
370 physical_HS(&h, &s); //physical dimensions may be diferent from HDIO_GETGEO |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
371 g_sectors = (toys.optflags & FLAG_S && TT.sectors)? TT.sectors : s? s : disk.sectors?disk.sectors : 63; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
372 g_heads = (toys.optflags & FLAG_H && TT.heads)? TT.heads : h? h : disk.heads? disk.heads : 255; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
373 g_cylinders = total_number_sectors/(g_heads * g_sectors * sector_fac); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
374 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
375 if (!g_cylinders) g_cylinders = toys.optflags & FLAG_C? TT.cylinders : 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
376 if ((g_cylinders > ONE_K) && !(toys.optflags & (FLAG_l | FLAG_S))) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
377 xprintf("\nThe number of cylinders for this disk is set to %lu.\n" |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
378 "There is nothing wrong with that, but this is larger than 1024,\n" |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
379 "and could in certain setups cause problems.\n", g_cylinders); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
380 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
381 if (IS_EXTENDED(partitions[i].part->sys_ind)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
382 read_ebr(i); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
383 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
384 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
385 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
386 chs_warn(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
387 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
388 return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
389 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
390 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
391 static char* get_type(int sys_ind) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
392 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
393 int i, size = ARRAY_LEN(sys_types); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
394 for (i = 0; i < size; i++) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
395 if (sys_ind == sys_types[i].id) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
396 return sys_types[i].type; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
397 return "Unknown"; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
398 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
399 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
400 static void consistency_check(const struct partition *p, int partition) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
401 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
402 unsigned physbc, physbh, physbs, physec, physeh, physes; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
403 unsigned lbc, lbh, lbs, lec, leh, les; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
404 sector_t start, end; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
405 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
406 if (!g_heads || !g_sectors || (partition >= 4)) return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
407 // physical beginning c, h, s |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
408 physbc = cylinder(p->sector,p->cyl); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
409 physbh = p->head; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
410 physbs = sector(p->sector); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
411 // physical ending c, h, s |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
412 physec = cylinder(p->end_sector, p->end_cyl); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
413 physeh = p->end_head; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
414 physes = sector(p->end_sector); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
415 // logical begin and end CHS values |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
416 start = swap_le32toh((unsigned char*)(p->start4)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
417 end = start + swap_le32toh((unsigned char*)(p->size4)) -1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
418 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
419 lbc = start/(g_sectors * g_heads); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
420 lbh = (start/g_sectors) % g_heads; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
421 lbs = (start % g_sectors) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
422 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
423 lec = end/(g_sectors * g_heads); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
424 leh = (end/g_sectors) % g_heads; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
425 les = (end % g_sectors) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
426 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
427 //Logical and Physical diff |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
428 if (g_cylinders <= ONE_K && (physbc != lbc || physbh != lbh || physbs != lbs)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
429 xprintf("Partition %u has different physical/logical beginings (Non-Linux?): \n", partition+1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
430 xprintf("phys = (%u %u %u) ",physbc, physbh, physbs); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
431 xprintf("logical = (%u %u %u)\n", lbc, lbh, lbs); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
432 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
433 if (g_cylinders <= ONE_K && (physec != lec || physeh != leh || physes != les)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
434 xprintf("Partition %u has different physical/logical endings: \n", partition+1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
435 xprintf("phys = (%u %u %u) ",physec, physeh, physes); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
436 xprintf("logical = (%u %u %u)\n", lec, leh, les); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
437 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
438 // Ending on cylinder boundary? |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
439 if (physeh != (g_heads - 1) || physes != g_sectors) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
440 xprintf("Partition %u does not end on cylinder boundary\n", partition + 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
441 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
442 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
443 // List the partition details |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
444 static void list_partitions(int validate) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
445 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
446 struct partition *p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
447 uint32_t start_cyl, end_cyl, start_sec, end_sec, blocks, secs; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
448 char boot, lastchar = '\0', *dev = disk_device; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
449 int i = 0, len = strlen(disk_device), odds = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
450 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
451 if (validate && !validate_part_buff(MBRbuf)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
452 close(dev_fd); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
453 toys.exitval = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
454 xprintf("Device %s: doesn't contain a valid partition table\n", disk_device); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
455 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
456 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
457 if (isdigit(dev[len - 1])) lastchar = 'p'; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
458 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
459 xprintf("%*s Boot Start End Blocks Id System\n", len+1, "Device"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
460 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
461 p = partitions[i].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
462 if (is_partition_clear(p)) continue; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
463 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
464 boot = p->boot_ind == 0x80?'*':' '; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
465 start_sec = swap_le32toh(p->start4) + partitions[i].start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
466 secs = swap_le32toh(p->size4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
467 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
468 if ((start_sec + secs) == 0) end_sec = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
469 else end_sec = start_sec + secs -1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
470 start_cyl = start_sec/(g_heads * g_sectors) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
471 end_cyl = end_sec/(g_heads * g_sectors) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
472 blocks = secs; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
473 if (g_sect_size < ONE_K) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
474 blocks /= (ONE_K/g_sect_size); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
475 odds = secs %(ONE_K/g_sect_size); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
476 } else if (g_sect_size > ONE_K) blocks *= (g_sect_size/ONE_K); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
477 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
478 if (lastchar) xprintf("%s%c%d",dev, lastchar, i+1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
479 else xprintf("%s%d",dev, i+1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
480 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
481 xprintf(" %c %11u %11u %11u%c %2x %s\n", |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
482 boot, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
483 disp_unit_cyl == 0? start_sec: start_cyl, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
484 disp_unit_cyl == 0? end_sec: end_cyl, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
485 blocks,odds?'+':' ', p->sys_ind, get_type(p->sys_ind)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
486 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
487 consistency_check(p, i); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
488 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
489 if (check_order()) xprintf("\nPartition table entries are not in disk order"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
490 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
491 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
492 //Print device details |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
493 static void print_mbr(int validate) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
494 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
495 unsigned long long bytes = ((unsigned long long)total_number_sectors << 9); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
496 long mbytes = bytes/1000000; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
497 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
498 if (mbytes < 10000) xprintf("Disk %s: %lu MB, %llu bytes\n", disk_device, mbytes, bytes); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
499 else xprintf("Disk %s: %lu.%lu GB, %llu bytes\n", disk_device, mbytes/1000, (mbytes/100)%10, bytes); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
500 xprintf("%ld heads, %ld sectors/track, %ld cylinders", g_heads, g_sectors, g_cylinders); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
501 if (!disp_unit_cyl) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
502 xprintf(", total %lld sectors\n", total_number_sectors/(g_sect_size/SECTOR_SIZE)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
503 xprintf("Units = sectors of 1 * %ld = %ld bytes\n",g_sect_size, g_sect_size); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
504 } else xprintf("\nUnits = cylinders of %ld * %ld = %ld bytes\n\n", |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
505 g_heads * g_sectors, g_sect_size, g_heads * g_sectors * g_sect_size); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
506 list_partitions(validate); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
507 xputc('\n'); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
508 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
509 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
510 static void init_members(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
511 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
512 int i = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
513 num_parts = 4; //max of primaries in a part table |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
514 disp_unit_cyl = dos_flag = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
515 extended_offset = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
516 g_sect_size = SECTOR_SIZE; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
517 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
518 partitions[i].part = part_offset(MBRbuf, i); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
519 partitions[i].sec_buffer = MBRbuf; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
520 partitions[i].modified = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
521 partitions[i].start_offset = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
522 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
523 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
524 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
525 static int read_input(char *mesg, char *outp) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
526 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
527 char *p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
528 int size = 0; |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
529 do { |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
530 xprintf("%s", mesg); |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
531 p = fgets(toybuf, 80, stdin); |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
532 |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
533 if (!p || !(size = strlen(p))) exit(0); |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
534 if (p[size-1] == '\n') p[--size] = '\0'; |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
535 } while (!size); |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
536 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
537 while (*p != '\0' && *p <= ' ') p++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
538 if (outp) memcpy(outp, p, strlen(p) + 1); //1 for nul |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
539 return *p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
540 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
541 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
542 static int read_hex(char *mesg) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
543 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
544 int val; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
545 char input[80], *endp; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
546 while (1) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
547 read_input(mesg, input); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
548 if ((*input | 0x20) == 'l') { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
549 list_types(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
550 memset(input, 0, 80); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
551 continue; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
552 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
553 val = strtoul(input, &endp, 16); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
554 if (endp && *endp) continue; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
555 if (val <= 0xff) return val; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
556 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
557 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
558 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
559 /* Delete an exiting partition, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
560 * if its primary, then just clear the partition details |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
561 * if extended, then clear the partition details, also for logical |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
562 * if only logical, then move the later partitions backwards 1 step |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
563 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
564 void delete_partition(int i) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
565 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
566 int sys_id, looper = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
567 struct partition *p, *q, *ext_p, *ext_q; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
568 sector_t new_start; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
569 struct part_entry *pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
570 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
571 if (chs_warn()) return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
572 p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
573 sys_id = p->sys_ind; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
574 if (!sys_id) xprintf("Partition %u is empty\n", i+1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
575 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
576 if (i < 4 && !IS_EXTENDED(sys_id)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
577 memset(p, 0, sizeof(struct partition)); //clear_partition |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
578 pe->modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
579 } else if (i < 4 && IS_EXTENDED(sys_id)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
580 memset(p, 0, sizeof(struct partition)); //clear_partition |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
581 pe->modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
582 for (looper = 4; looper < num_parts; looper++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
583 pe = &partitions[looper]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
584 p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
585 if (is_partition_clear(p)) break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
586 else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
587 memset(p, 0, sizeof(struct partition)); //clear_partition |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
588 pe->modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
589 free(pe->sec_buffer); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
590 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
591 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
592 extended_offset = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
593 num_parts = 4; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
594 } else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
595 //only logical is delete, need to move the rest of them backwards |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
596 if (i == 4) { //move partiton# 6 to 5. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
597 partitions[i].modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
598 if (num_parts > i+1) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
599 q = partitions[i + 1].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
600 *p = *q; //copy the part table |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
601 ext_p = part_offset(partitions[i].sec_buffer, 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
602 ext_q = part_offset(partitions[i + 1].sec_buffer, 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
603 *ext_p = *ext_q; //copy the extended info pointer |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
604 // change the start of the 4th partiton. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
605 new_start = partitions[i + 1].start_offset + swap_le32toh(q->start4) - extended_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
606 new_start = SWAP_LE32(new_start); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
607 memcpy(p->start4, (void *)&new_start, 4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
608 } else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
609 memset(partitions[i].part, 0, sizeof(struct partition)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
610 return; //only logical |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
611 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
612 } else if (i > 4) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
613 ext_p = part_offset(partitions[i-1].sec_buffer, 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
614 ext_q = part_offset(partitions[i].sec_buffer, 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
615 memcpy((void*)ext_p, (void *)ext_q, sizeof(struct partition)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
616 partitions[i-1].modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
617 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
618 if (i == 4) looper = i+2; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
619 else if (i > 4) looper = i+1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
620 for (; looper < num_parts; looper++) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
621 partitions[looper-1] = partitions[looper]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
622 num_parts--; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
623 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
624 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
625 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
626 static int ask_partition(int num_parts) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
627 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
628 int val; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
629 while (1) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
630 do { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
631 xprintf("Partition (%u - %u):", 1, num_parts); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
632 fgets(toybuf, 80, stdin); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
633 } while (!isdigit(*toybuf)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
634 val = atoi(toybuf); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
635 if (val > 0 && val <= num_parts) return val; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
636 else xprintf("Invalid number entered\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
637 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
638 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
639 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
640 static void toggle_active_flag(int i) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
641 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
642 struct partition *p = partitions[i].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
643 if (is_partition_clear(p)) xprintf("Partition %u is empty\n", i+1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
644 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
645 if (IS_EXTENDED(p->sys_ind) && !p->boot_ind) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
646 xprintf("WARNING: Partition %u is an extended partition\n", i + 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
647 p->boot_ind = p->boot_ind == 0x80?0 : 0x80; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
648 partitions[i].modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
649 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
650 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
651 //Write the partition details from Buffer to Disk. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
652 void write_table(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
653 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
654 int i =0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
655 struct part_entry *pe; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
656 sector_t offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
657 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
658 for (i = 0; i < 4; i++) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
659 if (partitions[i].modified) partitions[3].modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
660 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
661 for (i = 3; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
662 pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
663 write_table_flag(pe->sec_buffer); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
664 offset = pe->start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
665 if (pe->modified == 1) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
666 xlseek(dev_fd, offset * g_sect_size, SEEK_SET); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
667 xwrite(dev_fd, pe->sec_buffer, g_sect_size); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
668 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
669 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
670 xprintf("The partition table has been altered.\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
671 xprintf("Calling ioctl() to re-read partition table\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
672 sync(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
673 for (i = 4; i < num_parts; i++) free(partitions[i].sec_buffer); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
674 if(ioctl(dev_fd, BLKRRPART, NULL) < 0) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
675 perror_exit("WARNING: rereading partition table failed, kernel still uses old table"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
676 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
677 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
678 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
679 /* try to find a partition for deletion, if only |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
680 * one, then select the same, else ask from USER |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
681 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
682 static int get_non_free_partition(int max) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
683 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
684 int num = -1, i = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
685 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
686 for (i = 0; i < max; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
687 if (!is_partition_clear(partitions[i].part)) { |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
688 if (num >= 0) |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
689 return ask_partition(num_parts)-1; |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
690 num = i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
691 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
692 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
693 (num >= 0) ? xprintf("Selected partition %d\n",num+1): |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
694 xprintf("No partition is defined yet!\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
695 return num; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
696 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
697 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
698 /* a try at autodetecting an empty partition table entry, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
699 * if multiple options then get USER's choce. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
700 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
701 static int get_free_partition(int max) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
702 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
703 int num = -1, i = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
704 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
705 for (i = 0; i < max; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
706 if (is_partition_clear(partitions[i].part)) { |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
707 if (num >= 0) |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
708 return ask_partition(4)-1; |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
709 num = i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
710 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
711 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
712 (num >= 0) ? xprintf("Selected partition %d\n",num+1): |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
713 xprintf("All primary partitions have been defined already!\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
714 return num; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
715 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
716 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
717 //taking user input for partition start/end sectors/cyinders |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
718 static uint32_t ask_value(char *mesg, sector_t left, sector_t right, sector_t defalt) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
719 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
720 char *str = toybuf; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
721 uint32_t val; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
722 int use_default = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
723 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
724 while (1) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
725 use_default = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
726 do { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
727 xprintf("%s",mesg); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
728 fgets(str, 80, stdin); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
729 } while (!isdigit(*str) && (*str != '\n') |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
730 && (*str != '-') && (*str != '+') && (!isblank(*str))); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
731 while (isblank(*str)) str++; //remove leading white spaces |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
732 if (*str == '+' || *str == '-') { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
733 int minus = (*str == '-'); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
734 int absolute = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
735 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
736 val = atoi(str + 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
737 while (isdigit(*++str)) use_default = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
738 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
739 switch (*str) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
740 case 'c': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
741 case 'C': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
742 if (!disp_unit_cyl) val *= g_heads * g_sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
743 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
744 case 'K': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
745 absolute = ONE_K; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
746 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
747 case 'k': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
748 absolute = 1000; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
749 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
750 case 'm': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
751 case 'M': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
752 absolute = 1000000; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
753 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
754 case 'g': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
755 case 'G': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
756 absolute = 1000000000; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
757 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
758 default: |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
759 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
760 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
761 if (absolute) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
762 unsigned long long bytes = (unsigned long long) val * absolute; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
763 unsigned long unit = (disp_unit_cyl && (g_heads * g_sectors))? g_heads * g_sectors : 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
764 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
765 unit = unit * g_sect_size; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
766 bytes += unit/2; // rounding |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
767 bytes /= unit; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
768 val = bytes; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
769 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
770 if (minus) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
771 val = -val; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
772 val += left; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
773 } else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
774 val = atoi(str); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
775 while (isdigit(*str)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
776 str++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
777 use_default = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
778 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
779 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
780 if(use_default) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
781 val = defalt; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
782 xprintf("Using default value %lld\n", defalt); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
783 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
784 if (val >= left && val <= right) return val; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
785 else xprintf("Value out of range\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
786 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
787 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
788 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
789 //validating if the start given falls in a limit or not |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
790 static int validate(int start_index, sector_t* begin,sector_t* end, sector_t start |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
791 , int asked) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
792 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
793 int i, valid = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
794 for (i = start_index; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
795 if (start >= begin[i] && start <= end[i]) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
796 if (asked) xprintf("Sector %lld is already allocated\n",start); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
797 valid = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
798 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
799 } else valid = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
800 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
801 return valid; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
802 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
803 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
804 //get the start sector/cylinder of a new partition |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
805 static sector_t ask_start_sector(int idx, sector_t* begin, sector_t* end, int ext_idx) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
806 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
807 sector_t start, limit, temp = 0, start_cyl, limit_cyl, offset = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
808 char mesg[256]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
809 int i, asked = 0, valid = 0, start_index = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
810 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
811 if (dos_flag) offset = g_sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
812 start = offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
813 if (disp_unit_cyl) limit = (sector_t)g_sectors * g_heads * g_cylinders - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
814 else limit = total_number_sectors - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
815 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
816 if (disp_unit_cyl) //make the begin of every partition to cylnder boundary |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
817 for (i = 0; i < num_parts; i++) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
818 begin[i] = (begin[i]/(g_heads* g_sectors)) * (g_heads* g_sectors); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
819 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
820 if (idx >= 4) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
821 if (!begin[ext_idx] && extended_offset) begin[ext_idx] = extended_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
822 start = begin[ext_idx] + offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
823 limit = end[ext_idx]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
824 start_index = 4; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
825 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
826 do { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
827 if (asked) valid = validate(start_index, begin, end, start, asked); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
828 if (valid) break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
829 |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
830 do { |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
831 for (i = start_index; i < num_parts; i++) |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
832 if (start >= begin[i] && start <= end[i]) |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
833 start = end[i] + 1 + ((idx >= 4)? offset : 0); |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
834 } while (!validate(start_index, begin, end, start, 0)); |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
835 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
836 start_cyl = start/(g_sectors * g_heads) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
837 limit_cyl = limit/(g_sectors * g_heads) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
838 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
839 if (start > limit) break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
840 sprintf(mesg, "First %s (%lld - %lld, default %lld): ", disp_unit_cyl? "cylinder" : "sector", |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
841 (long long int)(disp_unit_cyl? start_cyl : start), |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
842 (long long int)(disp_unit_cyl? limit_cyl : limit), |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
843 (long long int)(disp_unit_cyl? start_cyl : start)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
844 temp = ask_value(mesg, disp_unit_cyl? start_cyl : start, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
845 disp_unit_cyl? limit_cyl : limit, disp_unit_cyl? start_cyl : start); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
846 asked = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
847 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
848 if (disp_unit_cyl) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
849 // point to the cylinder start sector |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
850 temp = (temp-1) * g_heads * g_sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
851 if (temp < start) //the boundary is falling in the already used sectors. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
852 temp = start; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
853 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
854 start = temp; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
855 } while (asked && !valid); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
856 return start; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
857 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
858 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
859 //get the end sector/cylinder of a new partition |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
860 static sector_t ask_end_sector(int idx, sector_t* begin, sector_t* end, int ext_idx, sector_t start_sec) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
861 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
862 sector_t limit, temp = 0, start_cyl, limit_cyl, start = start_sec; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
863 char mesg[256]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
864 int i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
865 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
866 if (disp_unit_cyl) limit = (sector_t)g_sectors * g_heads * g_cylinders - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
867 else limit = total_number_sectors - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
868 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
869 if (disp_unit_cyl) //make the begin of every partition to cylnder boundary |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
870 for (i = 0; i < num_parts; i++) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
871 begin[i] = (begin[i]/(g_heads* g_sectors)) * (g_heads* g_sectors); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
872 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
873 if (idx >= 4) limit = end[ext_idx]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
874 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
875 for (i = 0; i < num_parts; i++) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
876 if (start < begin[i] && limit >= begin[i]) limit = begin[i] - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
877 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
878 start_cyl = start/(g_sectors * g_heads) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
879 limit_cyl = limit/(g_sectors * g_heads) + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
880 if (limit < start) { //the boundary is falling in the already used sectors. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
881 xprintf("No Free sectors available\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
882 return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
883 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
884 sprintf(mesg, "Last %s or +size or +sizeM or +sizeK (%lld - %lld, default %lld): ", |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
885 disp_unit_cyl? "cylinder" : "sector", |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
886 (long long int)(disp_unit_cyl? start_cyl : start), |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
887 (long long int)(disp_unit_cyl? limit_cyl : limit), |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
888 (long long int)(disp_unit_cyl? limit_cyl : limit)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
889 temp = ask_value(mesg, disp_unit_cyl? start_cyl : start, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
890 disp_unit_cyl? limit_cyl : limit, disp_unit_cyl? limit_cyl : limit); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
891 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
892 if (disp_unit_cyl) { // point to the cylinder start sector |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
893 temp = temp * g_heads * g_sectors - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
894 if (temp > limit) temp = limit; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
895 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
896 if (temp < start) { //the boundary is falling in the already used sectors. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
897 xprintf("No Free sectors available\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
898 return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
899 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
900 return temp; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
901 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
902 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
903 // add a new partition to the partition table |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
904 static int add_partition(int idx, int sys_id) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
905 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
906 int i, ext_idx = -1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
907 sector_t start, end, begin_sec[num_parts], end_sec[num_parts]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
908 struct part_entry *pe = &partitions[idx]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
909 struct partition *p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
910 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
911 if (p && !is_partition_clear(p)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
912 xprintf("Partition %u is already defined, delete it to re-add\n", idx+1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
913 return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
914 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
915 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
916 pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
917 p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
918 if (is_partition_clear(p)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
919 begin_sec[i] = 0xffffffff; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
920 end_sec[i] = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
921 } else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
922 begin_sec[i] = swap_le32toh(p->start4) + pe->start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
923 end_sec[i] = begin_sec[i] + swap_le32toh(p->size4) - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
924 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
925 if (IS_EXTENDED(p->sys_ind)) ext_idx = i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
926 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
927 start = ask_start_sector(idx, begin_sec, end_sec, ext_idx); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
928 end = ask_end_sector(idx, begin_sec, end_sec, ext_idx, start); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
929 if (!end) return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
930 //Populate partition table entry - 16 bytes |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
931 pe = &partitions[idx]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
932 p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
933 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
934 if (idx > 4) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
935 if (dos_flag) pe->start_offset = start - (sector_t)g_sectors; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
936 else pe->start_offset = start - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
937 if (pe->start_offset == extended_offset) pe->start_offset++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
938 if (!dos_flag) start++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
939 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
940 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
941 set_levalue(p->start4, start - pe->start_offset); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
942 set_levalue(p->size4, end - start + 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
943 set_hsc(p, start, end); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
944 p->boot_ind = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
945 p->sys_ind = sys_id; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
946 pe->modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
947 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
948 if (idx > 4) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
949 p = partitions[idx-1].part + 1; //extended pointer for logical partitions |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
950 set_levalue(p->start4, pe->start_offset - extended_offset); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
951 set_levalue(p->size4, end - start + 1 + (dos_flag? g_sectors: 1)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
952 set_hsc(p, start, end); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
953 p->boot_ind = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
954 p->sys_ind = EXTENDED; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
955 partitions[idx-1].modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
956 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
957 if (IS_EXTENDED(sys_id)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
958 pe = &partitions[4]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
959 pe->modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
960 pe->sec_buffer = xzalloc(g_sect_size); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
961 pe->part = part_offset(pe->sec_buffer, 0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
962 pe->start_offset = extended_offset = start; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
963 num_parts = 5; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
964 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
965 return 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
966 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
967 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
968 static void add_logical_partition(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
969 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
970 struct part_entry *pe; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
971 if (num_parts > 5 || !is_partition_clear(partitions[4].part)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
972 pe = &partitions[num_parts]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
973 pe->modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
974 pe->sec_buffer = xzalloc(g_sect_size); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
975 pe->part = part_offset(pe->sec_buffer, 0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
976 pe->start_offset = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
977 num_parts++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
978 if (!add_partition(num_parts - 1, LINUX_NATIVE)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
979 num_parts--; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
980 free(pe->sec_buffer); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
981 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
982 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
983 else add_partition(num_parts -1, LINUX_NATIVE); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
984 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
985 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
986 /* Add a new partiton to the partition table. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
987 * MAX partitions limit is taken to be 60, can be changed |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
988 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
989 static void add_new_partition(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
990 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
991 int choice, idx, i, free_part = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
992 char *msg = NULL; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
993 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
994 if (chs_warn()) return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
995 for (i = 0; i < 4; i++) if(is_partition_clear(partitions[i].part)) free_part++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
996 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
997 if (!free_part && num_parts >= 60) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
998 xprintf("The maximum number of partitions has been created\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
999 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1000 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1001 if (!free_part) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1002 if (extended_offset) add_logical_partition(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1003 else xprintf("You must delete some partition and add " |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1004 "an extended partition first\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1005 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1006 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1007 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1008 msg = xmsprintf(" %s\n p primary partition(1-4)\n", |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1009 extended_offset? "l logical (5 or over)" : "e extended"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1010 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1011 choice = 0x20 | read_input(msg, NULL); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1012 free(msg); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1013 if (choice == 'p') { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1014 idx = get_free_partition(4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1015 if (idx >= 0) add_partition(idx, LINUX_NATIVE); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1016 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1017 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1018 if (choice =='l' && extended_offset) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1019 add_logical_partition(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1020 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1021 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1022 if (choice == 'e' && !extended_offset) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1023 idx = get_free_partition(4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1024 if (idx >= 0) add_partition(idx, EXTENDED); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1025 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1026 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1027 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1028 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1029 static void change_systype(void ) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1030 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1031 int i, sys_id; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1032 struct partition *p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1033 struct part_entry *pe; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1034 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1035 i = ask_partition(num_parts); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1036 pe = &partitions[i-1]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1037 p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1038 if (is_partition_clear(p)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1039 xprintf("Partition %d doesn't exist yet!\n", i); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1040 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1041 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1042 sys_id = read_hex("Hex code (L to list codes): "); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1043 if ((IS_EXTENDED(p->sys_ind) && !IS_EXTENDED(sys_id)) || |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1044 (!IS_EXTENDED(p->sys_ind) && IS_EXTENDED(sys_id))) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1045 xprintf("you can't change a partition to an extended or vice-versa\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1046 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1047 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1048 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1049 xprintf("Changed system type of partition %u to %0x (%s)\n",i, sys_id, get_type(sys_id)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1050 p->sys_ind = sys_id; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1051 pe->modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1052 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1053 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1054 static void check(int n, unsigned h, unsigned s, unsigned c, sector_t start) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1055 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1056 sector_t total, real_s, real_c; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1057 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1058 real_s = sector(s) - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1059 real_c = cylinder(s, c); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1060 total = (real_c * g_sectors + real_s) * g_heads + h; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1061 if (!total) xprintf("Partition %u contains sector 0\n", n); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1062 if (h >= g_heads) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1063 xprintf("Partition %u: head %u greater than maximum %lu\n", n, h + 1, g_heads); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1064 if (real_s >= g_sectors) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1065 xprintf("Partition %u: sector %u greater than maximum %lu\n", n, s, g_sectors); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1066 if (real_c >= g_cylinders) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1067 xprintf("Partition %u: cylinder %lld greater than maximum %lu\n", n, real_c + 1, g_cylinders); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1068 if (g_cylinders <= ONE_K && start != total) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1069 xprintf("Partition %u: previous sectors %lld disagrees with total %lld\n", n, start, total); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1070 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1071 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1072 static void verify_table(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1073 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1074 int i, j, ext_idx = -1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1075 sector_t begin_sec[num_parts], end_sec[num_parts], total = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1076 struct part_entry *pe; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1077 struct partition *p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1078 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1079 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1080 pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1081 p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1082 if (is_partition_clear(p) || IS_EXTENDED(p->sys_ind)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1083 begin_sec[i] = 0xffffffff; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1084 end_sec[i] = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1085 } else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1086 begin_sec[i] = swap_le32toh(p->start4) + pe->start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1087 end_sec[i] = begin_sec[i] + swap_le32toh(p->size4) - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1088 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1089 if (IS_EXTENDED(p->sys_ind)) ext_idx = i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1090 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1091 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1092 pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1093 p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1094 if (p->sys_ind && !IS_EXTENDED(p->sys_ind)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1095 consistency_check(p, i); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1096 if ((swap_le32toh(p->start4) + pe->start_offset) < begin_sec[i]) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1097 xprintf("Warning: bad start-of-data in partition %u\n", i + 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1098 check(i + 1, p->end_head, p->end_sector, p->end_cyl, end_sec[i]); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1099 total += end_sec[i] + 1 - begin_sec[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1100 for (j = 0; j < i; j++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1101 if ((begin_sec[i] >= begin_sec[j] && begin_sec[i] <= end_sec[j]) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1102 || ((end_sec[i] <= end_sec[j] && end_sec[i] >= begin_sec[j]))) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1103 xprintf("Warning: partition %u overlaps partition %u\n", j + 1, i + 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1104 total += begin_sec[i] >= begin_sec[j] ? begin_sec[i] : begin_sec[j]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1105 total -= end_sec[i] <= end_sec[j] ? end_sec[i] : end_sec[j]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1106 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1107 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1108 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1109 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1110 if (extended_offset) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1111 struct part_entry *pex = &partitions[ext_idx]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1112 sector_t e_last = swap_le32toh(pex->part->start4) + |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1113 swap_le32toh(pex->part->size4) - 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1114 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1115 for (i = 4; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1116 total++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1117 p = partitions[i].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1118 if (!p->sys_ind) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1119 if (i != 4 || i + 1 < num_parts) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1120 xprintf("Warning: partition %u is empty\n", i + 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1121 } else if (begin_sec[i] < extended_offset || end_sec[i] > e_last) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1122 xprintf("Logical partition %u not entirely in partition %u\n", i + 1, ext_idx + 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1123 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1124 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1125 if (total > g_heads * g_sectors * g_cylinders) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1126 xprintf("Total allocated sectors %lld greater than the maximum " |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1127 "%lu\n", total, g_heads * g_sectors * g_cylinders); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1128 else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1129 total = g_heads * g_sectors * g_cylinders - total; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1130 if (total) xprintf("%lld unallocated sectors\n", total); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1131 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1132 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1133 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1134 static void move_begning(int idx) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1135 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1136 sector_t start, num, new_start, end; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1137 char mesg[256]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1138 struct part_entry *pe = &partitions[idx]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1139 struct partition *p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1140 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1141 if (chs_warn()) return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1142 start = swap_le32toh(p->start4) + pe->start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1143 num = swap_le32toh(p->size4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1144 end = start + num -1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1145 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1146 if (!num || IS_EXTENDED(p->sys_ind)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1147 xprintf("Partition %u doesn't have data area\n", idx+1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1148 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1149 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1150 sprintf(mesg, "New begining of data (0 - %lld, default %lld): ", |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1151 (long long int)(end), (long long int)(start)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1152 new_start = ask_value(mesg, 0, end, start); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1153 if (new_start != start) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1154 set_levalue(p->start4, new_start - pe->start_offset); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1155 set_levalue(p->size4, end - new_start +1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1156 if ((read_input("Recalculate C/H/S (Y/n): ", NULL) | 0x20) == 'y') |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1157 set_hsc(p, new_start, end); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1158 pe->modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1159 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1160 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1161 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1162 static void print_raw_sectors() |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1163 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1164 int i, j; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1165 struct part_entry *pe; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1166 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1167 xprintf("Device: %s\n", disk_device); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1168 for (i = 3; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1169 pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1170 for (j = 0; j < g_sect_size; j++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1171 if (!(j % 16)) xprintf("\n0x%03X: ",j); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1172 xprintf("%02X ",pe->sec_buffer[j]); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1173 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1174 xputc('\n'); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1175 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1176 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1177 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1178 static void print_partitions_list(int ext) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1179 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1180 int i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1181 struct part_entry *pe; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1182 struct partition *p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1183 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1184 xprintf("Disk %s: %lu heads, %lu sectors, %lu cylinders\n\n", disk_device, g_heads, g_sectors, g_cylinders); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1185 xprintf("Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1186 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1187 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1188 pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1189 p = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1190 if (p) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1191 if (ext && (i >= 4)) p = pe->part + 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1192 if(ext && i < 4 && !IS_EXTENDED(p->sys_ind)) continue; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1193 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1194 xprintf("%2u %02x%4u%4u%5u%4u%4u%5u%11u%11u %02x\n", |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1195 i+1, p->boot_ind, p->head, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1196 sector(p->sector), cylinder(p->sector, p->cyl), |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1197 p->end_head, |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1198 sector(p->end_sector), cylinder(p->end_sector, p->end_cyl), |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1199 swap_le32toh(p->start4), |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1200 swap_le32toh(p->size4), |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1201 p->sys_ind); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1202 if (p->sys_ind) consistency_check(p, i); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1203 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1204 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1205 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1206 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1207 //fix the partition table order to ascending |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1208 static void fix_order(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1209 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1210 sector_t first[num_parts], min; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1211 int i, j, oj, ojj, sj, sjj; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1212 struct part_entry *pe; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1213 struct partition *px, *py, temp, *pj, *pjj, tmp; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1214 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1215 for (i = 0; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1216 pe = &partitions[i]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1217 px = pe->part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1218 if (is_partition_clear(px)) first[i] = 0xffffffff; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1219 else first[i] = swap_le32toh(px->start4) + pe->start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1220 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1221 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1222 if (!check_order()) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1223 xprintf("Ordering is already correct\n\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1224 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1225 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1226 for (i = 0; i < 4; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1227 for (j = 0; j < 3; j++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1228 if (first[j] > first[j+1]) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1229 py = partitions[j+1].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1230 px = partitions[j].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1231 memcpy(&temp, py, sizeof(struct partition)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1232 memcpy(py, px, sizeof(struct partition)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1233 memcpy(px, &temp, sizeof(struct partition)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1234 min = first[j+1]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1235 first[j+1] = first[j]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1236 first[j] = min; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1237 partitions[j].modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1238 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1239 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1240 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1241 for (i = 5; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1242 for (j = 5; j < num_parts - 1; j++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1243 oj = partitions[j].start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1244 ojj = partitions[j+1].start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1245 if (oj > ojj) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1246 partitions[j].start_offset = ojj; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1247 partitions[j+1].start_offset = oj; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1248 pj = partitions[j].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1249 set_levalue(pj->start4, swap_le32toh(pj->start4)+oj-ojj); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1250 pjj = partitions[j+1].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1251 set_levalue(pjj->start4, swap_le32toh(pjj->start4)+ojj-oj); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1252 set_levalue((partitions[j-1].part+1)->start4, ojj-extended_offset); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1253 set_levalue((partitions[j].part+1)->start4, oj-extended_offset); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1254 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1255 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1256 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1257 for (i = 4; i < num_parts; i++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1258 for (j = 4; j < num_parts - 1; j++) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1259 pj = partitions[j].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1260 pjj = partitions[j+1].part; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1261 sj = swap_le32toh(pj->start4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1262 sjj = swap_le32toh(pjj->start4); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1263 oj = partitions[j].start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1264 ojj = partitions[j+1].start_offset; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1265 if (oj+sj > ojj+sjj) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1266 tmp = *pj; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1267 *pj = *pjj; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1268 *pjj = tmp; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1269 set_levalue(pj->start4, ojj+sjj-oj); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1270 set_levalue(pjj->start4, oj+sj-ojj); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1271 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1272 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1273 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1274 // If anything changed |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1275 for (j = 4; j < num_parts; j++) partitions[j].modified = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1276 xprintf("Done!\n"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1277 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1278 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1279 static void print_menu(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1280 { |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1281 xprintf("a\ttoggle a bootable flag\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1282 "b\tedit bsd disklabel\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1283 "c\ttoggle the dos compatibility flag\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1284 "d\tdelete a partition\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1285 "l\tlist known partition types\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1286 "n\tadd a new partition\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1287 "o\tcreate a new empty DOS partition table\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1288 "p\tprint the partition table\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1289 "q\tquit without saving changes\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1290 "s\tcreate a new empty Sun disklabel\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1291 "t\tchange a partition's system id\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1292 "u\tchange display/entry units\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1293 "v\tverify the partition table\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1294 "w\twrite table to disk and exit\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1295 "x\textra functionality (experts only)\n"); |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1296 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1297 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1298 static void print_xmenu(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1299 { |
998
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1300 xprintf("b\tmove beginning of data in a partition\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1301 "c\tchange number of cylinders\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1302 "d\tprint the raw data in the partition table\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1303 "e\tlist extended partitions\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1304 "f\tfix partition order\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1305 "h\tchange number of heads\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1306 "p\tprint the partition table\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1307 "q\tquit without saving changes\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1308 "r\treturn to main menu\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1309 "s\tchange number of sectors/track\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1310 "v\tverify the partition table\n" |
72bbeccf4565
fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents:
997
diff
changeset
|
1311 "w\twrite table to disk and exit\n"); |
989
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1312 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1313 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1314 static void expert_menu(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1315 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1316 int choice, idx; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1317 sector_t value; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1318 char mesg[256]; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1319 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1320 while (1) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1321 xputc('\n'); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1322 char *msg = "Expert Command ('m' for help): "; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1323 choice = 0x20 | read_input(msg, NULL); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1324 switch (choice) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1325 case 'b': //move data begining in partition |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1326 idx = ask_partition(num_parts); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1327 move_begning(idx - 1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1328 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1329 case 'c': //change cylinders |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1330 sprintf(mesg, "Number of cylinders (1 - 1048576, default %lu): ", g_cylinders); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1331 value = ask_value(mesg, 1, 1048576, g_cylinders); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1332 g_cylinders = TT.cylinders = value; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1333 toys.optflags |= FLAG_C; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1334 if(g_cylinders > ONE_K) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1335 xprintf("\nThe number of cylinders for this disk is set to %lu.\n" |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1336 "There is nothing wrong with that, but this is larger than 1024,\n" |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1337 "and could in certain setups cause problems.\n", g_cylinders); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1338 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1339 case 'd': //print raw data in part tables |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1340 print_raw_sectors(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1341 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1342 case 'e': //list extended partitions |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1343 print_partitions_list(1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1344 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1345 case 'f': //fix part order |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1346 fix_order(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1347 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1348 case 'h': //change number of heads |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1349 sprintf(mesg, "Number of heads (1 - 256, default %lu): ", g_heads); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1350 value = ask_value(mesg, 1, 256, g_heads); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1351 g_heads = TT.heads = value; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1352 toys.optflags |= FLAG_H; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1353 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1354 case 'p': //print partition table |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1355 print_partitions_list(0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1356 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1357 case 'q': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1358 free_bufs(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1359 close(dev_fd); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1360 xputc('\n'); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1361 exit(0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1362 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1363 case 'r': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1364 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1365 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1366 case 's': //change sector/track |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1367 sprintf(mesg, "Number of sectors (1 - 63, default %lu): ", g_sectors); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1368 value = ask_value(mesg, 1, 63, g_sectors); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1369 g_sectors = TT.sectors = value; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1370 toys.optflags |= FLAG_H; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1371 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1372 case 'v': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1373 verify_table(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1374 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1375 case 'w': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1376 write_table(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1377 toys.exitval = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1378 exit(0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1379 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1380 case 'm': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1381 print_xmenu(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1382 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1383 default: |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1384 xprintf("Unknown command '%c'\n",choice); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1385 print_xmenu(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1386 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1387 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1388 } //while(1) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1389 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1390 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1391 static int disk_proper(const char *device) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1392 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1393 unsigned length; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1394 int fd = open(device, O_RDONLY); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1395 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1396 if (fd != -1) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1397 struct hd_geometry dev_geo; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1398 dev_geo.heads = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1399 dev_geo.sectors = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1400 int err = ioctl(fd, HDIO_GETGEO, &dev_geo); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1401 close(fd); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1402 if (!err) return (dev_geo.start == 0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1403 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1404 length = strlen(device); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1405 if (length != 0 && isdigit(device[length - 1])) return 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1406 return 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1407 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1408 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1409 static void reset_entries() |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1410 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1411 int i; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1412 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1413 memset(MBRbuf, 0, sizeof(MBRbuf)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1414 for (i = 4; i < num_parts; i++) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1415 memset(&partitions[i], 0, sizeof(struct part_entry)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1416 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1417 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1418 //this will keep dev_fd = 3 always alive |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1419 static void move_fd() |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1420 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1421 int fd = xopen("/dev/null", O_RDONLY); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1422 if(fd != dev_fd) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1423 if(dup2(fd, dev_fd) != dev_fd) perror_exit("Can't dup2"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1424 close(fd); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1425 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1426 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1427 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1428 /* Read proc/partitions and then print the details |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1429 * for partitions on each device |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1430 */ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1431 static void read_and_print_parts() |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1432 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1433 unsigned int ma, mi, sz; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1434 char *name = toybuf, *buffer = toybuf + ONE_K, *device = toybuf + 2048; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1435 FILE* fp = xfopen("/proc/partitions", "r"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1436 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1437 while (fgets(buffer, ONE_K, fp)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1438 reset_entries(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1439 num_parts = 4; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1440 memset(name, 0, sizeof(name)); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1441 if (sscanf(buffer, " %u %u %u %[^\n ]", &ma, &mi, &sz, name) != 4) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1442 continue; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1443 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1444 sprintf(device,"/dev/%s",name); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1445 if (disk_proper(device)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1446 if (read_mbr(device, 0)) continue; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1447 print_mbr(1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1448 move_fd(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1449 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1450 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1451 fclose(fp); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1452 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1453 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1454 void fdisk_main(void) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1455 { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1456 int choice, p; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1457 |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1458 init_members(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1459 move_fd(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1460 if (TT.heads >= 256) TT.heads = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1461 if (TT.sectors >= 64) TT.sectors = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1462 if (toys.optflags & FLAG_u) disp_unit_cyl = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1463 if (toys.optflags & FLAG_l) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1464 if (!toys.optc) read_and_print_parts(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1465 else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1466 while(*toys.optargs){ |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1467 if (read_mbr(*toys.optargs, 0)) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1468 toys.optargs++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1469 continue; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1470 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1471 print_mbr(1); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1472 move_fd(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1473 toys.optargs++; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1474 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1475 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1476 toys.exitval = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1477 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1478 } else { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1479 if (!toys.optc || toys.optc > 1 ) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1480 toys.exitval = toys.exithelp = 1; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1481 show_help(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1482 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1483 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1484 if (read_mbr(toys.optargs[0], 1)) return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1485 while (1) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1486 xputc('\n'); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1487 char *msg = "Command ('m' for help): "; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1488 choice = 0x20 | read_input(msg, NULL); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1489 switch (choice) { |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1490 case 'a': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1491 p = ask_partition(num_parts); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1492 toggle_active_flag(p - 1); //partition table index start from 0. |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1493 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1494 case 'b': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1495 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1496 case 'c': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1497 dos_flag = !dos_flag; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1498 xprintf("Dos compatible flag is %s\n", dos_flag?"Set" : "Not set"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1499 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1500 case 'd': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1501 p = get_non_free_partition(num_parts); //4 was here |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1502 if(p >= 0) delete_partition(p); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1503 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1504 case 'l': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1505 list_types(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1506 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1507 case 'n': //add new partition |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1508 add_new_partition(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1509 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1510 case 'o': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1511 create_empty_doslabel(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1512 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1513 case 'p': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1514 print_mbr(0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1515 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1516 case 'q': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1517 free_bufs(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1518 close(dev_fd); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1519 xputc('\n'); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1520 exit(0); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1521 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1522 case 's': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1523 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1524 case 't': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1525 change_systype(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1526 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1527 case 'u': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1528 disp_unit_cyl = !disp_unit_cyl; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1529 xprintf("Changing Display/Entry units to %s\n",disp_unit_cyl?"cylinders" : "sectors"); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1530 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1531 case 'v': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1532 verify_table(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1533 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1534 case 'w': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1535 write_table(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1536 toys.exitval = 0; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1537 return; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1538 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1539 case 'x': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1540 expert_menu(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1541 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1542 case 'm': |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1543 print_menu(); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1544 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1545 default: |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1546 xprintf("%c: Unknown command\n",choice); |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1547 break; |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1548 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1549 } //while(1) |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1550 } |
8ff8b1befcdf
I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff
changeset
|
1551 } |