annotate toys/pending/fdisk.c @ 1389:e59d4322331b draft

fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong. fsck: memory leak/segfault resolved. ftpget : warning for unused variable 'ptr' removed.
author Ashwini Sharma <ak.ashwini1981@gmail.com>
date Mon, 14 Jul 2014 05:44:29 -0500
parents 0752b2d58909
children
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 {
1389
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
246 if (num_parts >= 60) {
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
247 xprintf("Warning: deleting partitions after 60\n");
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
248 memset(q, 0, sizeof(struct partition)); //clear_partition
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
249 partitions[num_parts-1].modified = 1;
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
250 break;
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
251 }
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
252
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
253 sec_buf = xzalloc(g_sect_size);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
254 partitions[num_parts].part = part_offset(sec_buf, 0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
255 partitions[num_parts].sec_buffer = sec_buf;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
256 offset = swap_le32toh(q->start4);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
257
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
258 if (num_parts > 4) offset += local_start_off;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
259 partitions[num_parts].start_offset = offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
260 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
261
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
262 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
263 close(dev_fd);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
264 error_exit("Couldn't read sector zero\n");
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 num_parts++; //extended partions present.
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
267 q = part_offset(sec_buf, 1);
1389
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
268 } while (!is_partition_clear(q) && IS_EXTENDED(q->sys_ind));
989
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
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
271 static void physical_HS(int* h, int *s)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
272 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
273 struct partition *p;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
274 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
275 const unsigned char *bufp = (const unsigned char *)MBRbuf;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
276
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
277 if (!(validate_part_buff((char*)bufp))) return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
278
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
279 for (i = 0; i < 4; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
280 p = part_offset((char*)bufp, i);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
281 if (p->sys_ind) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
282 end_h = p->end_head + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
283 end_s = (p->end_sector & 077);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
284 if (ini) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
285 e_hh = end_h;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
286 e_ss = end_s;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
287 ini = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
288 } 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
289 dirty = 1;
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 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
292 if (!dirty && !ini) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
293 *h = e_hh;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
294 *s = e_ss;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
295 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
296 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
297
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
298 //Reset the primary partition table
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
299 static void reset_boot(int change)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
300 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
301 int i;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
302 for(i = 0; i < 4; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
303 struct part_entry *pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
304 pe->part = part_offset(MBRbuf, i);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
305 pe->start_offset = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
306 pe->sec_buffer = MBRbuf;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
307 pe->modified = change;
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
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
311 static inline void write_table_flag(char *buf)
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 buf[510] = 0x55;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
314 buf[511] = 0xaa;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
315 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
316
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
317 /* free the buffers used for holding details of
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
318 * extended logical partions
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
319 */
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
320 static void free_bufs(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
321 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
322 int i = 4;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
323 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
324 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
325
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
326 static void create_empty_doslabel(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
327 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
328 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
329 "remain in memory only, until you write it.\n");
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 num_parts = 4;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
332 extended_offset = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
333 memset(&MBRbuf[510 - 4*16], 0, 4*16);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
334 write_table_flag(MBRbuf);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
335 partitions[0].modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
336 reset_boot(1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
337 }
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 /* 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
340 * partition table entries/details.
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
341 * 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
342 * for logical partition details
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
343 */
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
344 static int read_mbr(char *device, int validate)
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 int fd, sector_fac, i, h = 0, s = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
347 struct hd_geometry disk;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
348 fd = open(device, O_RDWR);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
349 if(fd < 0) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
350 perror_msg("can't open '%s'",device);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
351 return 1;
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
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
354 disk_device = strdup(device);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
355 if(fd != dev_fd) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
356 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
357 close(fd);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
358 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
359
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
360 //read partition table - MBR
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
361 if (SECTOR_SIZE != readall(dev_fd, MBRbuf, SECTOR_SIZE)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
362 close(dev_fd);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
363 perror_exit("Couldn't read sector zero\n");
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 if (validate && !validate_part_buff(MBRbuf)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
366 xprintf("Device contains neither a valid DOS "
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
367 "partition table, nor Sun, SGI, OSF or GPT "
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
368 "disklabel\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
369 create_empty_doslabel();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
370 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
371
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
372 disk.heads = disk.sectors = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
373 read_geometry(&disk); //CHS values
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
374 total_number_sectors = read_size(); //Device size
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
375 read_sec_sz();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
376 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
377 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
378 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
379 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
380 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
381
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
382 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
383 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
384 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
385 "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
386 "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
387 for (i = 0; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
388 if (IS_EXTENDED(partitions[i].part->sys_ind)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
389 read_ebr(i);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
390 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
391 }
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 chs_warn();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
394
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
395 return 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
396 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
397
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
398 static char* get_type(int sys_ind)
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 int i, size = ARRAY_LEN(sys_types);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
401 for (i = 0; i < size; i++)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
402 if (sys_ind == sys_types[i].id)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
403 return sys_types[i].type;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
404 return "Unknown";
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
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
407 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
408 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
409 unsigned physbc, physbh, physbs, physec, physeh, physes;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
410 unsigned lbc, lbh, lbs, lec, leh, les;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
411 sector_t start, end;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
412
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
413 if (!g_heads || !g_sectors || (partition >= 4)) return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
414 // physical beginning c, h, s
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
415 physbc = cylinder(p->sector,p->cyl);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
416 physbh = p->head;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
417 physbs = sector(p->sector);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
418 // physical ending c, h, s
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
419 physec = cylinder(p->end_sector, p->end_cyl);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
420 physeh = p->end_head;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
421 physes = sector(p->end_sector);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
422 // logical begin and end CHS values
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
423 start = swap_le32toh((unsigned char*)(p->start4));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
424 end = start + swap_le32toh((unsigned char*)(p->size4)) -1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
425
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
426 lbc = start/(g_sectors * g_heads);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
427 lbh = (start/g_sectors) % g_heads;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
428 lbs = (start % g_sectors) + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
429
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
430 lec = end/(g_sectors * g_heads);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
431 leh = (end/g_sectors) % g_heads;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
432 les = (end % g_sectors) + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
433
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
434 //Logical and Physical diff
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
435 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
436 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
437 xprintf("phys = (%u %u %u) ",physbc, physbh, physbs);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
438 xprintf("logical = (%u %u %u)\n", lbc, lbh, lbs);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
439 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
440 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
441 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
442 xprintf("phys = (%u %u %u) ",physec, physeh, physes);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
443 xprintf("logical = (%u %u %u)\n", lec, leh, les);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
444 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
445 // Ending on cylinder boundary?
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
446 if (physeh != (g_heads - 1) || physes != g_sectors)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
447 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
448 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
449
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
450 // List the partition details
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
451 static void list_partitions(int validate)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
452 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
453 struct partition *p;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
454 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
455 char boot, lastchar = '\0', *dev = disk_device;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
456 int i = 0, len = strlen(disk_device), odds = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
457
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
458 if (validate && !validate_part_buff(MBRbuf)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
459 close(dev_fd);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
460 toys.exitval = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
461 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
462 return;
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 if (isdigit(dev[len - 1])) lastchar = 'p';
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
465
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
466 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
467 for (i = 0; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
468 p = partitions[i].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
469 if (is_partition_clear(p)) continue;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
470
1389
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
471 boot = ((p->boot_ind == 0x80)?'*':(!p->boot_ind)?' ':'?');
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
472 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
473 secs = swap_le32toh(p->size4);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
474
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
475 if ((start_sec + secs) == 0) end_sec = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
476 else end_sec = start_sec + secs -1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
477 start_cyl = start_sec/(g_heads * g_sectors) + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
478 end_cyl = end_sec/(g_heads * g_sectors) + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
479 blocks = secs;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
480 if (g_sect_size < ONE_K) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
481 blocks /= (ONE_K/g_sect_size);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
482 odds = secs %(ONE_K/g_sect_size);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
483 } 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
484
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
485 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
486 else xprintf("%s%d",dev, i+1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
487
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
488 xprintf(" %c %11u %11u %11u%c %2x %s\n",
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
489 boot,
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
490 disp_unit_cyl == 0? start_sec: start_cyl,
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
491 disp_unit_cyl == 0? end_sec: end_cyl,
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
492 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
493
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
494 consistency_check(p, i);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
495 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
496 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
497 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
498
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
499 //Print device details
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
500 static void print_mbr(int validate)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
501 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
502 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
503 long mbytes = bytes/1000000;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
504
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
505 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
506 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
507 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
508 if (!disp_unit_cyl) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
509 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
510 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
511 } 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
512 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
513 list_partitions(validate);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
514 xputc('\n');
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
515 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
516
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
517 static void init_members(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
518 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
519 int i = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
520 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
521 disp_unit_cyl = dos_flag = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
522 extended_offset = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
523 g_sect_size = SECTOR_SIZE;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
524 for (i = 0; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
525 partitions[i].part = part_offset(MBRbuf, i);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
526 partitions[i].sec_buffer = MBRbuf;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
527 partitions[i].modified = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
528 partitions[i].start_offset = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
529 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
530 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
531
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
532 static int read_input(char *mesg, char *outp)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
533 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
534 char *p;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
535 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
536 do {
72bbeccf4565 fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents: 997
diff changeset
537 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
538 p = fgets(toybuf, 80, stdin);
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
539
998
72bbeccf4565 fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents: 997
diff changeset
540 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
541 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
542 } while (!size);
989
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 while (*p != '\0' && *p <= ' ') p++;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
545 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
546 return *p;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
547 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
548
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
549 static int read_hex(char *mesg)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
550 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
551 int val;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
552 char input[80], *endp;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
553 while (1) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
554 read_input(mesg, input);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
555 if ((*input | 0x20) == 'l') {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
556 list_types();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
557 memset(input, 0, 80);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
558 continue;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
559 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
560 val = strtoul(input, &endp, 16);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
561 if (endp && *endp) continue;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
562 if (val <= 0xff) return val;
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 }
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 /* Delete an exiting partition,
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
567 * if its primary, then just clear the partition details
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
568 * 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
569 * 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
570 */
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
571 void delete_partition(int i)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
572 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
573 int sys_id, looper = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
574 struct partition *p, *q, *ext_p, *ext_q;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
575 sector_t new_start;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
576 struct part_entry *pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
577
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
578 if (chs_warn()) return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
579 p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
580 sys_id = p->sys_ind;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
581 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
582
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
583 if (i < 4 && !IS_EXTENDED(sys_id)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
584 memset(p, 0, sizeof(struct partition)); //clear_partition
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
585 pe->modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
586 } else if (i < 4 && IS_EXTENDED(sys_id)) {
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 for (looper = 4; looper < num_parts; looper++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
590 pe = &partitions[looper];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
591 p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
592 if (is_partition_clear(p)) break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
593 else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
594 memset(p, 0, sizeof(struct partition)); //clear_partition
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
595 pe->modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
596 free(pe->sec_buffer);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
597 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
598 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
599 extended_offset = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
600 num_parts = 4;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
601 } else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
602 //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
603 if (i == 4) { //move partiton# 6 to 5.
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
604 partitions[i].modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
605 if (num_parts > i+1) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
606 q = partitions[i + 1].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
607 *p = *q; //copy the part table
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
608 ext_p = part_offset(partitions[i].sec_buffer, 1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
609 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
610 *ext_p = *ext_q; //copy the extended info pointer
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
611 // change the start of the 4th partiton.
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
612 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
613 new_start = SWAP_LE32(new_start);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
614 memcpy(p->start4, (void *)&new_start, 4);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
615 } else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
616 memset(partitions[i].part, 0, sizeof(struct partition));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
617 return; //only logical
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
618 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
619 } else if (i > 4) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
620 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
621 ext_q = part_offset(partitions[i].sec_buffer, 1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
622 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
623 partitions[i-1].modified = 1;
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 if (i == 4) looper = i+2;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
626 else if (i > 4) looper = i+1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
627 for (; looper < num_parts; looper++)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
628 partitions[looper-1] = partitions[looper];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
629 num_parts--;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
630 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
631 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
632
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
633 static int ask_partition(int num_parts)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
634 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
635 int val;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
636 while (1) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
637 do {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
638 xprintf("Partition (%u - %u):", 1, num_parts);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
639 fgets(toybuf, 80, stdin);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
640 } while (!isdigit(*toybuf));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
641 val = atoi(toybuf);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
642 if (val > 0 && val <= num_parts) return val;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
643 else xprintf("Invalid number entered\n");
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 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
646
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
647 static void toggle_active_flag(int i)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
648 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
649 struct partition *p = partitions[i].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
650 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
651
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
652 if (IS_EXTENDED(p->sys_ind) && !p->boot_ind)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
653 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
654 p->boot_ind = p->boot_ind == 0x80?0 : 0x80;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
655 partitions[i].modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
656 }
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 //Write the partition details from Buffer to Disk.
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
659 void write_table(void)
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 int i =0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
662 struct part_entry *pe;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
663 sector_t offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
664
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
665 for (i = 0; i < 4; i++)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
666 if (partitions[i].modified) partitions[3].modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
667
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
668 for (i = 3; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
669 pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
670 write_table_flag(pe->sec_buffer);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
671 offset = pe->start_offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
672 if (pe->modified == 1) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
673 xlseek(dev_fd, offset * g_sect_size, SEEK_SET);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
674 xwrite(dev_fd, pe->sec_buffer, g_sect_size);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
675 }
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 xprintf("The partition table has been altered.\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
678 xprintf("Calling ioctl() to re-read partition table\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
679 sync();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
680 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
681 if(ioctl(dev_fd, BLKRRPART, NULL) < 0)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
682 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
683
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
684 }
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 /* try to find a partition for deletion, if only
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
687 * one, then select the same, else ask from USER
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
688 */
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
689 static int get_non_free_partition(int max)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
690 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
691 int num = -1, i = 0;
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 for (i = 0; i < max; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
694 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
695 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
696 return ask_partition(num_parts)-1;
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
697 num = i;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
698 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
699 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
700 (num >= 0) ? xprintf("Selected partition %d\n",num+1):
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
701 xprintf("No partition is defined yet!\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
702 return num;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
703 }
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 /* a try at autodetecting an empty partition table entry,
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
706 * if multiple options then get USER's choce.
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
707 */
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
708 static int get_free_partition(int max)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
709 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
710 int num = -1, i = 0;
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 for (i = 0; i < max; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
713 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
714 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
715 return ask_partition(4)-1;
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
716 num = i;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
717 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
718 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
719 (num >= 0) ? xprintf("Selected partition %d\n",num+1):
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
720 xprintf("All primary partitions have been defined already!\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
721 return num;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
722 }
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 //taking user input for partition start/end sectors/cyinders
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
725 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
726 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
727 char *str = toybuf;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
728 uint32_t val;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
729 int use_default = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
730
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
731 while (1) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
732 use_default = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
733 do {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
734 xprintf("%s",mesg);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
735 fgets(str, 80, stdin);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
736 } while (!isdigit(*str) && (*str != '\n')
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
737 && (*str != '-') && (*str != '+') && (!isblank(*str)));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
738 while (isblank(*str)) str++; //remove leading white spaces
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
739 if (*str == '+' || *str == '-') {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
740 int minus = (*str == '-');
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
741 int absolute = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
742
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
743 val = atoi(str + 1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
744 while (isdigit(*++str)) use_default = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
745
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
746 switch (*str) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
747 case 'c':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
748 case 'C':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
749 if (!disp_unit_cyl) val *= g_heads * g_sectors;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
750 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
751 case 'K':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
752 absolute = ONE_K;
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 'k':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
755 absolute = 1000;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
756 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
757 case 'm':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
758 case 'M':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
759 absolute = 1000000;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
760 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
761 case 'g':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
762 case 'G':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
763 absolute = 1000000000;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
764 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
765 default:
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
766 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
767 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
768 if (absolute) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
769 unsigned long long bytes = (unsigned long long) val * absolute;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
770 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
771
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
772 unit = unit * g_sect_size;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
773 bytes += unit/2; // rounding
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
774 bytes /= unit;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
775 val = bytes;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
776 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
777 if (minus)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
778 val = -val;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
779 val += left;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
780 } else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
781 val = atoi(str);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
782 while (isdigit(*str)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
783 str++;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
784 use_default = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
785 }
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 if(use_default) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
788 val = defalt;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
789 xprintf("Using default value %lld\n", defalt);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
790 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
791 if (val >= left && val <= right) return val;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
792 else xprintf("Value out of range\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
793 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
794 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
795
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
796 //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
797 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
798 , int asked)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
799 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
800 int i, valid = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
801 for (i = start_index; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
802 if (start >= begin[i] && start <= end[i]) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
803 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
804 valid = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
805 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
806 } else valid = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
807 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
808 return valid;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
809 }
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 //get the start sector/cylinder of a new partition
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
812 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
813 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
814 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
815 char mesg[256];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
816 int i, asked = 0, valid = 0, start_index = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
817
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
818 if (dos_flag) offset = g_sectors;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
819 start = offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
820 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
821 else limit = total_number_sectors - 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
822
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
823 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
824 for (i = 0; i < num_parts; i++)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
825 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
826
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
827 if (idx >= 4) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
828 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
829 start = begin[ext_idx] + offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
830 limit = end[ext_idx];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
831 start_index = 4;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
832 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
833 do {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
834 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
835 if (valid) break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
836
998
72bbeccf4565 fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents: 997
diff changeset
837 do {
72bbeccf4565 fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents: 997
diff changeset
838 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
839 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
840 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
841 } while (!validate(start_index, begin, end, start, 0));
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
842
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
843 start_cyl = start/(g_sectors * g_heads) + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
844 limit_cyl = limit/(g_sectors * g_heads) + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
845
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
846 if (start > limit) break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
847 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
848 (long long int)(disp_unit_cyl? start_cyl : start),
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
849 (long long int)(disp_unit_cyl? limit_cyl : limit),
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
850 (long long int)(disp_unit_cyl? start_cyl : start));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
851 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
852 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
853 asked = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
854
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
855 if (disp_unit_cyl) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
856 // point to the cylinder start sector
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
857 temp = (temp-1) * g_heads * g_sectors;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
858 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
859 temp = start;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
860 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
861 start = temp;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
862 } while (asked && !valid);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
863 return start;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
864 }
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 //get the end sector/cylinder of a new partition
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
867 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
868 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
869 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
870 char mesg[256];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
871 int i;
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 (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
874 else limit = total_number_sectors - 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
875
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
876 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
877 for (i = 0; i < num_parts; i++)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
878 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
879
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
880 if (idx >= 4) limit = end[ext_idx];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
881
1389
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
882 for (i = 0; i < num_parts; i++) {
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
883 struct part_entry *pe = &partitions[i];
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
884 if (start < pe->start_offset && limit >= pe->start_offset) limit = pe->start_offset - 1;
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
885 if (start < begin[i] && limit >= begin[i]) limit = begin[i] - 1;
1389
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
886 }
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
887
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
888 start_cyl = start/(g_sectors * g_heads) + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
889 limit_cyl = limit/(g_sectors * g_heads) + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
890 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
891 xprintf("No Free sectors available\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
892 return 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
893 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
894 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
895 disp_unit_cyl? "cylinder" : "sector",
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
896 (long long int)(disp_unit_cyl? start_cyl : start),
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
897 (long long int)(disp_unit_cyl? limit_cyl : limit),
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
898 (long long int)(disp_unit_cyl? limit_cyl : limit));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
899 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
900 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
901
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
902 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
903 temp = temp * g_heads * g_sectors - 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
904 if (temp > limit) temp = limit;
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 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
907 xprintf("No Free sectors available\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
908 return 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
909 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
910 return temp;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
911 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
912
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
913 // add a new partition to the partition table
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
914 static int add_partition(int idx, int sys_id)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
915 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
916 int i, ext_idx = -1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
917 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
918 struct part_entry *pe = &partitions[idx];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
919 struct partition *p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
920
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
921 if (p && !is_partition_clear(p)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
922 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
923 return 0;
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 for (i = 0; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
926 pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
927 p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
928 if (is_partition_clear(p)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
929 begin_sec[i] = 0xffffffff;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
930 end_sec[i] = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
931 } else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
932 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
933 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
934 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
935 if (IS_EXTENDED(p->sys_ind)) ext_idx = i;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
936 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
937 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
938 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
939 if (!end) return 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
940 //Populate partition table entry - 16 bytes
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
941 pe = &partitions[idx];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
942 p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
943
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
944 if (idx > 4) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
945 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
946 else pe->start_offset = start - 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
947 if (pe->start_offset == extended_offset) pe->start_offset++;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
948 if (!dos_flag) start++;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
949 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
950
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
951 set_levalue(p->start4, start - pe->start_offset);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
952 set_levalue(p->size4, end - start + 1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
953 set_hsc(p, start, end);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
954 p->boot_ind = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
955 p->sys_ind = sys_id;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
956 pe->modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
957
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
958 if (idx > 4) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
959 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
960 set_levalue(p->start4, pe->start_offset - extended_offset);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
961 set_levalue(p->size4, end - start + 1 + (dos_flag? g_sectors: 1));
1389
e59d4322331b fdisk : partitions > 60, are deleted, offset entry for extended partitions was wrong.
Ashwini Sharma <ak.ashwini1981@gmail.com>
parents: 1183
diff changeset
962 set_hsc(p, pe->start_offset, end);
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
963 p->boot_ind = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
964 p->sys_ind = EXTENDED;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
965 partitions[idx-1].modified = 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 if (IS_EXTENDED(sys_id)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
968 pe = &partitions[4];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
969 pe->modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
970 pe->sec_buffer = xzalloc(g_sect_size);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
971 pe->part = part_offset(pe->sec_buffer, 0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
972 pe->start_offset = extended_offset = start;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
973 num_parts = 5;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
974 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
975 return 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
976 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
977
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
978 static void add_logical_partition(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
979 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
980 struct part_entry *pe;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
981 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
982 pe = &partitions[num_parts];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
983 pe->modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
984 pe->sec_buffer = xzalloc(g_sect_size);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
985 pe->part = part_offset(pe->sec_buffer, 0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
986 pe->start_offset = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
987 num_parts++;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
988 if (!add_partition(num_parts - 1, LINUX_NATIVE)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
989 num_parts--;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
990 free(pe->sec_buffer);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
991 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
992 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
993 else add_partition(num_parts -1, LINUX_NATIVE);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
994 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
995
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
996 /* Add a new partiton to the partition table.
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
997 * 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
998 */
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
999 static void add_new_partition(void)
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 int choice, idx, i, free_part = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1002 char *msg = NULL;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1003
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1004 if (chs_warn()) return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1005 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
1006
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1007 if (!free_part && num_parts >= 60) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1008 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
1009 return;
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 if (!free_part) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1012 if (extended_offset) add_logical_partition();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1013 else xprintf("You must delete some partition and add "
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1014 "an extended partition first\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1015 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1016 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1017
1183
0752b2d58909 Rename xmsprintf() to just xmprintf().
Rob Landley <rob@landley.net>
parents: 998
diff changeset
1018 msg = xmprintf(" %s\n p primary partition(1-4)\n",
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1019 extended_offset? "l logical (5 or over)" : "e extended");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1020
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1021 choice = 0x20 | read_input(msg, NULL);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1022 free(msg);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1023 if (choice == 'p') {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1024 idx = get_free_partition(4);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1025 if (idx >= 0) add_partition(idx, LINUX_NATIVE);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1026 return;
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 if (choice =='l' && extended_offset) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1029 add_logical_partition();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1030 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1031 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1032 if (choice == 'e' && !extended_offset) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1033 idx = get_free_partition(4);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1034 if (idx >= 0) add_partition(idx, EXTENDED);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1035 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1036 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1037 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1038
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1039 static void change_systype(void )
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1040 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1041 int i, sys_id;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1042 struct partition *p;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1043 struct part_entry *pe;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1044
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1045 i = ask_partition(num_parts);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1046 pe = &partitions[i-1];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1047 p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1048 if (is_partition_clear(p)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1049 xprintf("Partition %d doesn't exist yet!\n", i);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1050 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1051 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1052 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
1053 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
1054 (!IS_EXTENDED(p->sys_ind) && IS_EXTENDED(sys_id))) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1055 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
1056 return;
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
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1059 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
1060 p->sys_ind = sys_id;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1061 pe->modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1062 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1063
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1064 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
1065 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1066 sector_t total, real_s, real_c;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1067
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1068 real_s = sector(s) - 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1069 real_c = cylinder(s, c);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1070 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
1071 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
1072 if (h >= g_heads)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1073 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
1074 if (real_s >= g_sectors)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1075 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
1076 if (real_c >= g_cylinders)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1077 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
1078 if (g_cylinders <= ONE_K && start != total)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1079 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
1080 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1081
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1082 static void verify_table(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1083 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1084 int i, j, ext_idx = -1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1085 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
1086 struct part_entry *pe;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1087 struct partition *p;
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 for (i = 0; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1090 pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1091 p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1092 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
1093 begin_sec[i] = 0xffffffff;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1094 end_sec[i] = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1095 } else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1096 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
1097 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
1098 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1099 if (IS_EXTENDED(p->sys_ind)) ext_idx = i;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1100 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1101 for (i = 0; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1102 pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1103 p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1104 if (p->sys_ind && !IS_EXTENDED(p->sys_ind)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1105 consistency_check(p, i);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1106 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
1107 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
1108 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
1109 total += end_sec[i] + 1 - begin_sec[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1110 for (j = 0; j < i; j++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1111 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
1112 || ((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
1113 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
1114 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
1115 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
1116 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1117 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1118 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1119 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1120 if (extended_offset) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1121 struct part_entry *pex = &partitions[ext_idx];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1122 sector_t e_last = swap_le32toh(pex->part->start4) +
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1123 swap_le32toh(pex->part->size4) - 1;
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 for (i = 4; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1126 total++;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1127 p = partitions[i].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1128 if (!p->sys_ind) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1129 if (i != 4 || i + 1 < num_parts)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1130 xprintf("Warning: partition %u is empty\n", i + 1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1131 } 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
1132 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
1133 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1134 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1135 if (total > g_heads * g_sectors * g_cylinders)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1136 xprintf("Total allocated sectors %lld greater than the maximum "
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1137 "%lu\n", total, g_heads * g_sectors * g_cylinders);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1138 else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1139 total = g_heads * g_sectors * g_cylinders - total;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1140 if (total) xprintf("%lld unallocated sectors\n", total);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1141 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1142 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1143
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1144 static void move_begning(int idx)
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 sector_t start, num, new_start, end;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1147 char mesg[256];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1148 struct part_entry *pe = &partitions[idx];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1149 struct partition *p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1150
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1151 if (chs_warn()) return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1152 start = swap_le32toh(p->start4) + pe->start_offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1153 num = swap_le32toh(p->size4);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1154 end = start + num -1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1155
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1156 if (!num || IS_EXTENDED(p->sys_ind)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1157 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
1158 return;
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 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
1161 (long long int)(end), (long long int)(start));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1162 new_start = ask_value(mesg, 0, end, start);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1163 if (new_start != start) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1164 set_levalue(p->start4, new_start - pe->start_offset);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1165 set_levalue(p->size4, end - new_start +1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1166 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
1167 set_hsc(p, new_start, end);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1168 pe->modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1169 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1170 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1171
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1172 static void print_raw_sectors()
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 int i, j;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1175 struct part_entry *pe;
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 xprintf("Device: %s\n", disk_device);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1178 for (i = 3; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1179 pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1180 for (j = 0; j < g_sect_size; j++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1181 if (!(j % 16)) xprintf("\n0x%03X: ",j);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1182 xprintf("%02X ",pe->sec_buffer[j]);
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 xputc('\n');
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1185 }
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
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1188 static void print_partitions_list(int ext)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1189 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1190 int i;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1191 struct part_entry *pe;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1192 struct partition *p;
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("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
1195 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
1196
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1197 for (i = 0; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1198 pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1199 p = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1200 if (p) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1201 if (ext && (i >= 4)) p = pe->part + 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1202 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
1203
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1204 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
1205 i+1, p->boot_ind, p->head,
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1206 sector(p->sector), cylinder(p->sector, p->cyl),
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1207 p->end_head,
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1208 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
1209 swap_le32toh(p->start4),
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1210 swap_le32toh(p->size4),
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1211 p->sys_ind);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1212 if (p->sys_ind) consistency_check(p, i);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1213 }
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 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1216
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1217 //fix the partition table order to ascending
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1218 static void fix_order(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1219 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1220 sector_t first[num_parts], min;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1221 int i, j, oj, ojj, sj, sjj;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1222 struct part_entry *pe;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1223 struct partition *px, *py, temp, *pj, *pjj, tmp;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1224
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1225 for (i = 0; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1226 pe = &partitions[i];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1227 px = pe->part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1228 if (is_partition_clear(px)) first[i] = 0xffffffff;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1229 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
1230 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1231
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1232 if (!check_order()) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1233 xprintf("Ordering is already correct\n\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1234 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1235 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1236 for (i = 0; i < 4; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1237 for (j = 0; j < 3; j++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1238 if (first[j] > first[j+1]) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1239 py = partitions[j+1].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1240 px = partitions[j].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1241 memcpy(&temp, py, sizeof(struct partition));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1242 memcpy(py, px, sizeof(struct partition));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1243 memcpy(px, &temp, sizeof(struct partition));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1244 min = first[j+1];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1245 first[j+1] = first[j];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1246 first[j] = min;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1247 partitions[j].modified = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1248 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1249 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1250 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1251 for (i = 5; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1252 for (j = 5; j < num_parts - 1; j++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1253 oj = partitions[j].start_offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1254 ojj = partitions[j+1].start_offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1255 if (oj > ojj) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1256 partitions[j].start_offset = ojj;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1257 partitions[j+1].start_offset = oj;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1258 pj = partitions[j].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1259 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
1260 pjj = partitions[j+1].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1261 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
1262 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
1263 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
1264 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1265 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1266 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1267 for (i = 4; i < num_parts; i++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1268 for (j = 4; j < num_parts - 1; j++) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1269 pj = partitions[j].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1270 pjj = partitions[j+1].part;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1271 sj = swap_le32toh(pj->start4);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1272 sjj = swap_le32toh(pjj->start4);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1273 oj = partitions[j].start_offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1274 ojj = partitions[j+1].start_offset;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1275 if (oj+sj > ojj+sjj) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1276 tmp = *pj;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1277 *pj = *pjj;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1278 *pjj = tmp;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1279 set_levalue(pj->start4, ojj+sjj-oj);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1280 set_levalue(pjj->start4, oj+sj-ojj);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1281 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1282 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1283 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1284 // If anything changed
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1285 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
1286 xprintf("Done!\n");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1287 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1288
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1289 static void print_menu(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1290 {
998
72bbeccf4565 fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents: 997
diff changeset
1291 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
1292 "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
1293 "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
1294 "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
1295 "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
1296 "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
1297 "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
1298 "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
1299 "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
1300 "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
1301 "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
1302 "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
1303 "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
1304 "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
1305 "x\textra functionality (experts only)\n");
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1306 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1307
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1308 static void print_xmenu(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1309 {
998
72bbeccf4565 fdisk: remove goto; inline valid(); merge xprintf() calls; shrink sys_types
Isaac Dunham <ibid.ag@gmail.com>
parents: 997
diff changeset
1310 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
1311 "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
1312 "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
1313 "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
1314 "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
1315 "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
1316 "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
1317 "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
1318 "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
1319 "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
1320 "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
1321 "w\twrite table to disk and exit\n");
989
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1322 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1323
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1324 static void expert_menu(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1325 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1326 int choice, idx;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1327 sector_t value;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1328 char mesg[256];
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1329
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1330 while (1) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1331 xputc('\n');
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1332 char *msg = "Expert Command ('m' for help): ";
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1333 choice = 0x20 | read_input(msg, NULL);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1334 switch (choice) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1335 case 'b': //move data begining in partition
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1336 idx = ask_partition(num_parts);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1337 move_begning(idx - 1);
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 'c': //change cylinders
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1340 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
1341 value = ask_value(mesg, 1, 1048576, g_cylinders);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1342 g_cylinders = TT.cylinders = value;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1343 toys.optflags |= FLAG_C;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1344 if(g_cylinders > ONE_K)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1345 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
1346 "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
1347 "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
1348 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1349 case 'd': //print raw data in part tables
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1350 print_raw_sectors();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1351 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1352 case 'e': //list extended partitions
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1353 print_partitions_list(1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1354 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1355 case 'f': //fix part order
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1356 fix_order();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1357 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1358 case 'h': //change number of heads
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1359 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
1360 value = ask_value(mesg, 1, 256, g_heads);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1361 g_heads = TT.heads = value;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1362 toys.optflags |= FLAG_H;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1363 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1364 case 'p': //print partition table
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1365 print_partitions_list(0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1366 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1367 case 'q':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1368 free_bufs();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1369 close(dev_fd);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1370 xputc('\n');
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1371 exit(0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1372 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1373 case 'r':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1374 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1375 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1376 case 's': //change sector/track
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1377 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
1378 value = ask_value(mesg, 1, 63, g_sectors);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1379 g_sectors = TT.sectors = value;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1380 toys.optflags |= FLAG_H;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1381 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1382 case 'v':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1383 verify_table();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1384 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1385 case 'w':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1386 write_table();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1387 toys.exitval = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1388 exit(0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1389 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1390 case 'm':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1391 print_xmenu();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1392 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1393 default:
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1394 xprintf("Unknown command '%c'\n",choice);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1395 print_xmenu();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1396 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1397 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1398 } //while(1)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1399 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1400
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1401 static int disk_proper(const char *device)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1402 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1403 unsigned length;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1404 int fd = open(device, O_RDONLY);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1405
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1406 if (fd != -1) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1407 struct hd_geometry dev_geo;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1408 dev_geo.heads = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1409 dev_geo.sectors = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1410 int err = ioctl(fd, HDIO_GETGEO, &dev_geo);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1411 close(fd);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1412 if (!err) return (dev_geo.start == 0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1413 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1414 length = strlen(device);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1415 if (length != 0 && isdigit(device[length - 1])) return 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1416 return 1;
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
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1419 static void reset_entries()
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 i;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1422
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1423 memset(MBRbuf, 0, sizeof(MBRbuf));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1424 for (i = 4; i < num_parts; i++)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1425 memset(&partitions[i], 0, sizeof(struct part_entry));
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 //this will keep dev_fd = 3 always alive
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1429 static void move_fd()
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 int fd = xopen("/dev/null", O_RDONLY);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1432 if(fd != dev_fd) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1433 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
1434 close(fd);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1435 }
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
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1438 /* Read proc/partitions and then print the details
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1439 * for partitions on each device
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1440 */
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1441 static void read_and_print_parts()
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1442 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1443 unsigned int ma, mi, sz;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1444 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
1445 FILE* fp = xfopen("/proc/partitions", "r");
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1446
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1447 while (fgets(buffer, ONE_K, fp)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1448 reset_entries();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1449 num_parts = 4;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1450 memset(name, 0, sizeof(name));
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1451 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
1452 continue;
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 sprintf(device,"/dev/%s",name);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1455 if (disk_proper(device)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1456 if (read_mbr(device, 0)) continue;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1457 print_mbr(1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1458 move_fd();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1459 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1460 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1461 fclose(fp);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1462 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1463
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1464 void fdisk_main(void)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1465 {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1466 int choice, p;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1467
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1468 init_members();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1469 move_fd();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1470 if (TT.heads >= 256) TT.heads = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1471 if (TT.sectors >= 64) TT.sectors = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1472 if (toys.optflags & FLAG_u) disp_unit_cyl = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1473 if (toys.optflags & FLAG_l) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1474 if (!toys.optc) read_and_print_parts();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1475 else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1476 while(*toys.optargs){
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1477 if (read_mbr(*toys.optargs, 0)) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1478 toys.optargs++;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1479 continue;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1480 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1481 print_mbr(1);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1482 move_fd();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1483 toys.optargs++;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1484 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1485 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1486 toys.exitval = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1487 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1488 } else {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1489 if (!toys.optc || toys.optc > 1 ) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1490 toys.exitval = toys.exithelp = 1;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1491 show_help();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1492 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1493 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1494 if (read_mbr(toys.optargs[0], 1)) return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1495 while (1) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1496 xputc('\n');
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1497 char *msg = "Command ('m' for help): ";
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1498 choice = 0x20 | read_input(msg, NULL);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1499 switch (choice) {
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1500 case 'a':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1501 p = ask_partition(num_parts);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1502 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
1503 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1504 case 'b':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1505 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1506 case 'c':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1507 dos_flag = !dos_flag;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1508 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
1509 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1510 case 'd':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1511 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
1512 if(p >= 0) delete_partition(p);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1513 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1514 case 'l':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1515 list_types();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1516 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1517 case 'n': //add new partition
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1518 add_new_partition();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1519 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1520 case 'o':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1521 create_empty_doslabel();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1522 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1523 case 'p':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1524 print_mbr(0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1525 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1526 case 'q':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1527 free_bufs();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1528 close(dev_fd);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1529 xputc('\n');
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1530 exit(0);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1531 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1532 case 's':
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 't':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1535 change_systype();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1536 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1537 case 'u':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1538 disp_unit_cyl = !disp_unit_cyl;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1539 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
1540 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1541 case 'v':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1542 verify_table();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1543 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1544 case 'w':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1545 write_table();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1546 toys.exitval = 0;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1547 return;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1548 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1549 case 'x':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1550 expert_menu();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1551 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1552 case 'm':
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1553 print_menu();
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1554 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1555 default:
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1556 xprintf("%c: Unknown command\n",choice);
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1557 break;
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1558 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1559 } //while(1)
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1560 }
8ff8b1befcdf I have implemented FDISK command.
Ashwini Sharma <ak.ashwini@gmail.com>
parents:
diff changeset
1561 }