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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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, &sectors) == 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 }