diff options
Diffstat (limited to 'usr/src/cmd/fdisk/fdisk.c')
-rw-r--r-- | usr/src/cmd/fdisk/fdisk.c | 1776 |
1 files changed, 92 insertions, 1684 deletions
diff --git a/usr/src/cmd/fdisk/fdisk.c b/usr/src/cmd/fdisk/fdisk.c index 80cb7cbef6..b377fce5d3 100644 --- a/usr/src/cmd/fdisk/fdisk.c +++ b/usr/src/cmd/fdisk/fdisk.c @@ -38,6 +38,7 @@ * operations from a supplied menu or from the command line. Diagnostic * options are also available. */ + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -57,37 +58,34 @@ #include <sys/dktp/fdisk.h> #include <sys/dkio.h> #include <sys/vtoc.h> -#ifdef i386 -#include <sys/tty.h> -#include <libfdisk.h> -#endif #define CLR_SCR "[1;1H[0J" #define CLR_LIN "[0K" #define HOME "[1;1H[0K[2;1H[0K[3;1H[0K[4;1H[0K[5;1H[0K" \ "[6;1H[0K[7;1H[0K[8;1H[0K[9;1H[0K[10;1H[0K[1;1H" #define Q_LINE "[22;1H[0K[21;1H[0K[20;1H[0K" - -#ifdef i386 -#define W_LINE "[11;1H[0K" -#else #define W_LINE "[12;1H[0K[11;1H[0K" -#endif - #define E_LINE "[24;1H[0K[23;1H[0K" - -#ifdef i386 -#define M_LINE "[12;1H[0K[13;1H[0K[14;1H[0K[15;1H[0K" \ - "[16;1H[0K[17;1H[0K[18;1H[0K[19;1H[0K[12;1H" -#else #define M_LINE "[13;1H[0K[14;1H[0K[15;1H[0K[16;1H[0K[17;1H" \ "[0K[18;1H[0K[19;1H[0K[13;1H" -#endif - #define T_LINE "[1;1H[0K" #define DEFAULT_PATH "/dev/rdsk/" +/* XXX - should be in fdisk.h, used by sd as well */ + +/* + * the MAX values are the maximum usable values for BIOS chs values + * The MAX_CYL value of 1022 is the maximum usable value + * the value of 1023 is a fence value, + * indicating no CHS geometry exists for the corresponding LBA value. + * HEAD range [ 0 .. MAX_HEAD ], so number of heads is (MAX_HEAD + 1) + * SECT range [ 1 .. MAX_SECT ], so number of sectors is (MAX_SECT) + */ +#define MAX_SECT (63) +#define MAX_CYL (1022) +#define MAX_HEAD (254) + #define DK_MAX_2TB UINT32_MAX /* Max # of sectors in 2TB */ /* for clear_vtoc() */ @@ -100,6 +98,23 @@ #define VTOC_NOTSUP 2 /* operation not supported - EFI label */ #define VTOC_RWERR 3 /* couldn't read or write VTOC */ +/* + * Support for fdisk(1M) on the SPARC platform + * In order to convert little endian values to big endian for SPARC, + * byte/short and long values must be swapped. + * These swapping macros will be used to access information in the + * mboot and ipart structures. + */ + +#ifdef sparc +#define les(val) ((((val)&0xFF)<<8)|(((val)>>8)&0xFF)) +#define lel(val) (((unsigned)(les((val)&0x0000FFFF))<<16) | \ + (les((unsigned)((val)&0xffff0000)>>16))) +#else +#define les(val) (val) +#define lel(val) (val) +#endif + #if defined(_SUNOS_VTOC_16) #define VTOC_OFFSET 1 #elif defined(_SUNOS_VTOC_8) @@ -108,23 +123,6 @@ #error No VTOC format defined. #endif -#ifdef i386 -#define FDISK_KB (1024) -#define FDISK_MB (FDISK_KB * 1024) -#define FDISK_GB (FDISK_MB * 1024) -#define TRUE 1 - -#define FDISK_MAX_VALID_PART_ID 255 -#define FDISK_MAX_VALID_PART_NUM_DIGITS 2 -#define FDISK_MAX_VALID_PART_ID_DIGITS 3 - -/* Maximum number of digits for a valid partition size */ -#define FDISK_MAX_VALID_CYL_NUM_DIGITS 10 - -/* Minimum partition size in cylinders */ -#define FDISK_MIN_PART_SIZE 1 -#endif - static char Usage[] = "Usage: fdisk\n" "[ -A id:act:bhead:bsect:bcyl:ehead:esect:ecyl:rsect:numsect ]\n" "[ -b masterboot ]\n" @@ -216,7 +214,6 @@ static char FAT95str[] = "FAT16 LBA"; static char EXTLstr[] = "EXT LBA"; static char LINUXstr[] = "Linux"; static char CPMstr[] = "CP/M"; -static char NOV2str[] = "Netware 286"; static char NOVstr[] = "Netware 3.x+"; static char QNXstr[] = "QNX 4.x"; static char QNX2str[] = "QNX part 2"; @@ -317,283 +314,6 @@ static int sectsiz; /* sector size */ #define CBUFLEN 80 static char s[CBUFLEN]; -#ifdef i386 -/* - * Complete list of all the 255 partition types. Some are unknown types - * and some entries are known to be unused. - * - * Courtesy of http://www.win.tue.nl/~aeb/partitions/partition_types-1.html - */ -char *fdisk_part_types[] = { - "Empty", /* 0 */ - "FAT12", /* 1 */ - "XENIX /", /* 2 */ - "XENIX /usr", /* 3 */ - "FAT16 (Upto 32M)", /* 4 */ - "DOS Extended", /* 5 */ - "FAT16 (>32M, HUGEDOS)", /* 6 */ - "IFS: NTFS", /* 7 */ - "AIX Boot/QNX(qny)", /* 8 */ - "AIX Data/QNX(qnz)", /* 9 */ - "OS/2 Boot/Coherent swap", /* 10 */ - "WIN95 FAT32(Upto 2047GB)", /* 11 */ - "WIN95 FAT32(LBA)", /* 12 */ - "Unused", /* 13 */ - "WIN95 FAT16(LBA)", /* 14 */ - "WIN95 Extended(LBA)", /* 15 */ - "OPUS", /* 16 */ - "Hidden FAT12", /* 17 */ - "Diagnostic", /* 18 */ - "Unknown", /* 19 */ - "Hidden FAT16(Upto 32M)", /* 20 */ - "Unknown", /* 21 */ - "Hidden FAT16(>=32M)", /* 22 */ - "Hidden IFS: HPFS", /* 23 */ - "AST SmartSleep Partition", /* 24 */ - "Unused/Willowtech Photon", /* 25 */ - "Unknown", /* 26 */ - "Hidden FAT32", /* 27 */ - "Hidden FAT32(LBA)", /* 28 */ - "Unused", /* 29 */ - "Hidden FAT16(LBA)", /* 30 */ - "Unknown", /* 31 */ - "Unused/OSF1", /* 32 */ - "Reserved/FSo2(Oxygen FS)", /* 33 */ - "Unused/(Oxygen EXT)", /* 34 */ - "Reserved", /* 35 */ - "NEC DOS 3.x", /* 36 */ - "Unknown", /* 37 */ - "Reserved", /* 38 */ - "Unknown", /* 39 */ - "Unknown", /* 40 */ - "Unknown", /* 41 */ - "AtheOS File System", /* 42 */ - "SyllableSecure", /* 43 */ - "Unknown", /* 44 */ - "Unknown", /* 45 */ - "Unknown", /* 46 */ - "Unknown", /* 47 */ - "Unknown", /* 48 */ - "Reserved", /* 49 */ - "NOS", /* 50 */ - "Reserved", /* 51 */ - "Reserved", /* 52 */ - "JFS on OS/2", /* 53 */ - "Reserved", /* 54 */ - "Unknown", /* 55 */ - "THEOS 3.2 2GB", /* 56 */ - "Plan9/THEOS 4", /* 57 */ - "THEOS 4 4GB", /* 58 */ - "THEOS 4 Extended", /* 59 */ - "PartitionMagic Recovery", /* 60 */ - "Hidden NetWare", /* 61 */ - "Unknown", /* 62 */ - "Unknown", /* 63 */ - "Venix 80286", /* 64 */ - "MINIX/PPC PReP Boot", /* 65 */ - "Win2K Dynamic Disk/SFS(DOS)", /* 66 */ - "Linux+DRDOS shared", /* 67 */ - "GoBack partition", /* 68 */ - "Boot-US boot manager", /* 69 */ - "EUMEL/Elan", /* 70 */ - "EUMEL/Elan", /* 71 */ - "EUMEL/Elan", /* 72 */ - "Unknown", /* 73 */ - "ALFS/THIN FS for DOS", /* 74 */ - "Unknown", /* 75 */ - "Oberon partition", /* 76 */ - "QNX 4,x", /* 77 */ - "QNX 4,x 2nd Part", /* 78 */ - "QNX 4,x 3rd Part", /* 79 */ - "OnTrack DM R/O, Lynx RTOS", /* 80 */ - "OnTrack DM R/W, Novell", /* 81 */ - "CP/M", /* 82 */ - "Disk Manager 6.0 Aux3", /* 83 */ - "Disk Manager 6.0 DDO", /* 84 */ - "EZ-Drive", /* 85 */ - "Golden Bow VFeature/AT&T MS-DOS", /* 86 */ - "DrivePro", /* 87 */ - "Unknown", /* 88 */ - "Unknown", /* 89 */ - "Unknown", /* 90 */ - "Unknown", /* 91 */ - "Priam EDisk", /* 92 */ - "Unknown", /* 93 */ - "Unknown", /* 94 */ - "Unknown", /* 95 */ - "Unknown", /* 96 */ - "SpeedStor", /* 97 */ - "Unknown", /* 98 */ - "Unix SysV, Mach, GNU Hurd", /* 99 */ - "PC-ARMOUR, Netware 286", /* 100 */ - "Netware 386", /* 101 */ - "Netware SMS", /* 102 */ - "Novell", /* 103 */ - "Novell", /* 104 */ - "Netware NSS", /* 105 */ - "Unknown", /* 106 */ - "Unknown", /* 107 */ - "Unknown", /* 108 */ - "Unknown", /* 109 */ - "Unknown", /* 110 */ - "Unknown", /* 111 */ - "DiskSecure Multi-Boot", /* 112 */ - "Reserved", /* 113 */ - "Unknown", /* 114 */ - "Reserved", /* 115 */ - "Scramdisk partition", /* 116 */ - "IBM PC/IX", /* 117 */ - "Reserved", /* 118 */ - "M2FS/M2CS,Netware VNDI", /* 119 */ - "XOSL FS", /* 120 */ - "Unknown", /* 121 */ - "Unknown", /* 122 */ - "Unknown", /* 123 */ - "Unknown", /* 124 */ - "Unknown", /* 125 */ - "Unused", /* 126 */ - "Unused", /* 127 */ - "MINIX until 1.4a", /* 128 */ - "MINIX since 1.4b, early Linux", /* 129 */ - "Solaris/Linux swap", /* 130 */ - "Linux native", /* 131 */ - "OS/2 hidden,Win Hibernation", /* 132 */ - "Linux extended", /* 133 */ - "Old Linux RAID,NT FAT16 RAID", /* 134 */ - "NTFS volume set", /* 135 */ - "Linux plaintext part table", /* 136 */ - "Unknown", /* 137 */ - "Linux Kernel Partition", /* 138 */ - "Fault Tolerant FAT32 volume", /* 139 */ - "Fault Tolerant FAT32 volume", /* 140 */ - "Free FDISK hidden PDOS FAT12", /* 141 */ - "Linux LVM partition", /* 142 */ - "Unknown", /* 143 */ - "Free FDISK hidden PDOS FAT16", /* 144 */ - "Free FDISK hidden DOS EXT", /* 145 */ - "Free FDISK hidden FAT16 Large", /* 146 */ - "Hidden Linux native, Amoeba", /* 147 */ - "Amoeba Bad Block Table", /* 148 */ - "MIT EXOPC Native", /* 149 */ - "Unknown", /* 150 */ - "Free FDISK hidden PDOS FAT32", /* 151 */ - "Free FDISK hidden FAT32 LBA", /* 152 */ - "DCE376 logical drive", /* 153 */ - "Free FDISK hidden FAT16 LBA", /* 154 */ - "Free FDISK hidden DOS EXT", /* 155 */ - "Unknown", /* 156 */ - "Unknown", /* 157 */ - "Unknown", /* 158 */ - "BSD/OS", /* 159 */ - "Laptop hibernation", /* 160 */ - "Laptop hibernate,HP SpeedStor", /* 161 */ - "Unknown", /* 162 */ - "HP SpeedStor", /* 163 */ - "HP SpeedStor", /* 164 */ - "BSD/386,386BSD,NetBSD,FreeBSD", /* 165 */ - "OpenBSD,HP SpeedStor", /* 166 */ - "NeXTStep", /* 167 */ - "Mac OS-X", /* 168 */ - "NetBSD", /* 169 */ - "Olivetti FAT12 1.44MB Service", /* 170 */ - "Mac OS-X Boot", /* 171 */ - "Unknown", /* 172 */ - "Unknown", /* 173 */ - "ShagOS filesystem", /* 174 */ - "ShagOS swap", /* 175 */ - "BootStar Dummy", /* 176 */ - "HP SpeedStor", /* 177 */ - "Unknown", /* 178 */ - "HP SpeedStor", /* 179 */ - "HP SpeedStor", /* 180 */ - "Unknown", /* 181 */ - "Corrupted FAT16 NT Mirror Set", /* 182 */ - "Corrupted NTFS NT Mirror Set", /* 183 */ - "Old BSDI BSD/386 swap", /* 184 */ - "Unknown", /* 185 */ - "Unknown", /* 186 */ - "Boot Wizard hidden", /* 187 */ - "Unknown", /* 188 */ - "Unknown", /* 189 */ - "Solaris x86 boot", /* 190 */ - "Solaris2", /* 191 */ - "REAL/32 or Novell DOS secured", /* 192 */ - "DRDOS/secured(FAT12)", /* 193 */ - "Hidden Linux", /* 194 */ - "Hidden Linux swap", /* 195 */ - "DRDOS/secured(FAT16,< 32M)", /* 196 */ - "DRDOS/secured(Extended)", /* 197 */ - "NT corrupted FAT16 volume", /* 198 */ - "NT corrupted NTFS volume", /* 199 */ - "DRDOS8.0+", /* 200 */ - "DRDOS8.0+", /* 201 */ - "DRDOS8.0+", /* 202 */ - "DRDOS7.04+ secured FAT32(CHS)", /* 203 */ - "DRDOS7.04+ secured FAT32(LBA)", /* 204 */ - "CTOS Memdump", /* 205 */ - "DRDOS7.04+ FAT16X(LBA)", /* 206 */ - "DRDOS7.04+ secure EXT DOS(LBA)", /* 207 */ - "REAL/32 secure big, MDOS", /* 208 */ - "Old MDOS secure FAT12", /* 209 */ - "Unknown", /* 210 */ - "Unknown", /* 211 */ - "Old MDOS secure FAT16 <32M", /* 212 */ - "Old MDOS secure EXT", /* 213 */ - "Old MDOS secure FAT16 >=32M", /* 214 */ - "Unknown", /* 215 */ - "CP/M-86", /* 216 */ - "Unknown", /* 217 */ - "Non-FS Data", /* 218 */ - "CP/M,Concurrent DOS,CTOS", /* 219 */ - "Unknown", /* 220 */ - "Hidden CTOS memdump", /* 221 */ - "Dell PowerEdge utilities(FAT)", /* 222 */ - "DG/UX virtual disk manager", /* 223 */ - "ST AVFS(STMicroelectronics)", /* 224 */ - "SpeedStor 12-bit FAT EXT", /* 225 */ - "Unknown", /* 226 */ - "SpeedStor", /* 227 */ - "SpeedStor 16-bit FAT EXT", /* 228 */ - "Tandy MSDOS", /* 229 */ - "Storage Dimensions SpeedStor", /* 230 */ - "Unknown", /* 231 */ - "Unknown", /* 232 */ - "Unknown", /* 233 */ - "Unknown", /* 234 */ - "BeOS BFS", /* 235 */ - "SkyOS SkyFS", /* 236 */ - "Unused", /* 237 */ - "EFI Header Indicator", /* 238 */ - "EFI Filesystem", /* 239 */ - "Linux/PA-RISC boot loader", /* 240 */ - "SpeedStor", /* 241 */ - "DOS 3.3+ secondary", /* 242 */ - "SpeedStor Reserved", /* 243 */ - "SpeedStor Large", /* 244 */ - "Prologue multi-volume", /* 245 */ - "SpeedStor", /* 246 */ - "Unused", /* 247 */ - "Unknown", /* 248 */ - "pCache", /* 249 */ - "Bochs", /* 250 */ - "VMware File System", /* 251 */ - "VMware swap", /* 252 */ - "Linux raid autodetect", /* 253 */ - "NT Disk Administrator hidden", /* 254 */ - "Xenix Bad Block Table" /* 255 */ -}; - -/* Allowed extended partition menu options */ -static char ext_part_menu_opts[] = "adhipr"; - -/* - * Structure holding all information about the extended partition - * NOTE : As of now, there will be just one instance of ext_part_t, since most - * known systems allow only one extended dos partition per disk. - */ -static ext_part_t *epp; -#endif - static void update_disk_and_exit(boolean_t table_changed); int main(int argc, char *argv[]); static int read_geom(char *sgeom); @@ -649,41 +369,9 @@ static int lecture_and_query(char *warning, char *devname); static void sanity_check_provided_device(char *devname, int fd); static char *get_node(char *devname); -#ifdef i386 -static void id_to_name(uchar_t sysid, char *buffer); -static void ext_read_input(char *buf); -static int ext_read_options(char *buf); -static int ext_invalid_option(char ch); -static void ext_read_valid_part_num(int *pno); -static void ext_read_valid_part_id(uchar_t *partid); -static int ext_read_valid_partition_start(uint32_t *begsec); -static void ext_read_valid_partition_size(uint32_t begsec, uint32_t *endsec); -static void ext_part_menu(); -static int is_linux_swap(uint32_t part_start, off_t *lsm_offset); -static void add_logical_drive(); -static void delete_logical_drive(); -static void ext_print_help_menu(); -static void ext_change_logical_drive_id(); -static void ext_print_part_types(); -static void ext_print_logical_drive_layout(); -static void preach_and_continue(); -#ifdef DEBUG -static void ext_print_logdrive_layout_debug(); -#endif /* DEBUG */ -#endif /* i386 */ - -/* - * This function is called only during the non-interactive mode. - * It is touchy and does not tolerate any errors. If there are - * mounted logical drives, changes to the partition table - * is disallowed. - */ static void update_disk_and_exit(boolean_t table_changed) { -#ifdef i386 - int rval; -#endif if (table_changed) { /* * Copy the new table back to the sector buffer @@ -693,31 +381,15 @@ update_disk_and_exit(boolean_t table_changed) dev_mboot_write(0, Bootsect, sectsiz); } - /* If the VTOC table is wrong fix it (truncation only) */ if (io_adjt) fix_slice(); -#ifdef i386 - if (!io_readonly) { - rval = fdisk_commit_ext_part(epp); - switch (rval) { - case FDISK_SUCCESS: - /* Success */ - break; - case FDISK_ENOEXTPART: - /* Nothing to do */ - break; - default: - perror("fdisk_commit_ext_part"); - exit(1); - } - } - libfdisk_fini(&epp); -#endif exit(0); } + + /* * main * Process command-line options. @@ -731,10 +403,6 @@ main(int argc, char *argv[]) int errflg = 0; int diag_cnt = 0; int openmode; -#ifdef i386 - int rval; - int lf_op_flag = 0; -#endif setbuf(stderr, 0); /* so all output gets out on exit */ setbuf(stdout, 0); @@ -1124,45 +792,6 @@ main(int argc, char *argv[]) /* save away a copy of Table in Old_Table for sensing changes */ copy_Table_to_Old_Table(); -#ifdef i386 - /* - * Read extended partition only when the fdisk table is not - * supplied from a file - */ - if (!io_ffdisk) { - lf_op_flag |= FDISK_READ_DISK; - } - if ((rval = libfdisk_init(&epp, Dfltdev, &Table[0], lf_op_flag)) - != FDISK_SUCCESS) { - switch (rval) { - /* - * FDISK_EBADLOGDRIVE and FDISK_ENOLOGDRIVE can - * be considered as soft errors and hence - * we do not exit - */ - case FDISK_EBADLOGDRIVE: - break; - case FDISK_ENOLOGDRIVE: - break; - case FDISK_ENOVGEOM: - fprintf(stderr, "Could not get virtual" - " geometry for this device\n"); - exit(1); - case FDISK_ENOPGEOM: - fprintf(stderr, "Could not get physical" - " geometry for this device\n"); - exit(1); - case FDISK_ENOLGEOM: - fprintf(stderr, "Could not get label" - " geometry for this device\n"); - exit(1); - default: - perror("Failed to initialise libfdisk.\n"); - exit(1); - } - } -#endif - /* Load fdisk table from specified file (-F fdisk_file) */ if (io_ffdisk) { /* Load and verify user-specified table parameters */ @@ -1203,10 +832,10 @@ main(int argc, char *argv[]) nulltbl(); /* now set up UNIX System partition */ Table[0].bootid = ACTIVE; - Table[0].relsect = LE_32(heads * sectors); + Table[0].relsect = lel(heads * sectors); Table[0].numsect = - LE_32((ulong_t)((Numcyl_usable - 1) * + lel((ulong_t)((Numcyl_usable - 1) * heads * sectors)); Table[0].systid = SUNIXOS2; /* Solaris */ @@ -1382,57 +1011,6 @@ dev_mboot_write(off_t sect, char *buff, int bootsiz) Table[new_pt].systid != SUNIXOS2) continue; -#ifdef i386 - - /* - * Check if a solaris old partition is there in the new table. - * If so, this could potentially have been a linux swap. - * Check to see if the linux swap magic is there, and destroy - * the magic if there is one. - */ - if (Table[new_pt].systid == SUNIXOS) { - off_t lsmo; - char *lsm_buf; - - if ((lsm_buf = calloc(1, sectsiz)) == NULL) { - fprintf(stderr, "Could not allocate memory\n"); - exit(1); - } - - if (is_linux_swap(Table[new_pt].relsect, &lsmo) == 0) { - if (lseek(Dev, lsmo, SEEK_SET) < 0) { - fprintf(stderr, "Error seeking on " - "%s\n", Dfltdev); - exit(1); - } - - if (read(Dev, lsm_buf, sectsiz) < sectsiz) { - fprintf(stderr, "Error reading on " - "%s\n", Dfltdev); - exit(1); - } - - bzero(lsm_buf + sectsiz - - LINUX_SWAP_MAGIC_LENGTH, - LINUX_SWAP_MAGIC_LENGTH); - - if (lseek(Dev, lsmo, SEEK_SET) < 0) { - fprintf(stderr, "Error seeking on " - "%s\n", Dfltdev); - exit(1); - } - - if (write(Dev, lsm_buf, sectsiz) < sectsiz) { - fprintf(stderr, "Error writing on " - "%s\n", Dfltdev); - exit(1); - } - } - free(lsm_buf); - } - -#endif - /* Does the old table have an exact entry for the new entry? */ for (old_pt = 0; old_pt < FD_NUMPART; old_pt++) { @@ -1576,12 +1154,12 @@ mboot_read(void) } /* Is this really a master boot record? */ - if (LE_16(BootCod.signature) != MBB_MAGIC) { + if (les(BootCod.signature) != MBB_MAGIC) { (void) fprintf(stderr, "fdisk: Invalid master boot file %s.\n", io_mboot); (void) fprintf(stderr, "Bad magic number: is %x, but should be %x.\n", - LE_16(BootCod.signature), MBB_MAGIC); + les(BootCod.signature), MBB_MAGIC); exit(1); } @@ -1763,17 +1341,6 @@ load(int funct, char *file) int i = 0; int j; FILE *fp; -#ifdef i386 - int ext_part_present = 0; - uint32_t begsec, endsec, relsect; - logical_drive_t *temp; - int part_count = 0, ldcnt = 0; - uint32_t ext_beg_sec, ext_end_sec; - uint32_t old_ext_beg_sec = 0, old_ext_num_sec = 0; - uint32_t new_ext_beg_sec = 0, new_ext_num_sec = 0; - int ext_part_inited = 0; - uchar_t systid; -#endif switch (funct) { @@ -1800,125 +1367,6 @@ load(int funct, char *file) &bcyl, &ehead, &esect, &ecyl, &rsect, &numsect)) { continue; } -#ifdef i386 - part_count++; - - if (fdisk_is_dos_extended((uchar_t)id)) { - if (ext_part_present) { - fprintf(stderr, "Extended partition" - " already exists\n"); - fprintf(stderr, "fdisk: Error on" - " entry \"%s\".\n", line); - exit(1); - } - ext_part_present = 1; - /* - * If the existing extended partition's start - * and size matches the new one, do not - * initialize the extended partition EBR - * (Extended Boot Record) because there could - * be existing logical drives. - */ - for (i = 0; i < FD_NUMPART; i++) { - systid = Old_Table[i].systid; - if (fdisk_is_dos_extended(systid)) { - old_ext_beg_sec = - Old_Table[i].relsect; - old_ext_num_sec = - Old_Table[i].numsect; - break; - } - } - new_ext_beg_sec = rsect; - new_ext_num_sec = numsect; - if ((old_ext_beg_sec != new_ext_beg_sec) || - (old_ext_num_sec != new_ext_num_sec)) { - fdisk_init_ext_part(epp, - new_ext_beg_sec, new_ext_num_sec); - ext_part_inited = 1; - } - } - - if (part_count > FD_NUMPART) { - /* This line should be logical drive info */ - int offset = MAX_LOGDRIVE_OFFSET; - if (!ext_part_present) { - /* Erroneous input file */ - fprintf(stderr, "More than 4 primary" - " partitions found in input\n"); - fprintf(stderr, "Exiting...\n"); - exit(1); - } - - if (numsect == 0) { - continue; - } - - /* - * If the start and size of the existing - * extended partition matches the new one and - * new logical drives are being defined via - * the input file, initialize the EBR. - */ - if (!ext_part_inited) { - fdisk_init_ext_part(epp, - new_ext_beg_sec, new_ext_num_sec); - ext_part_inited = 1; - } - - begsec = rsect - offset; - if ((ldcnt = - fdisk_get_logical_drive_count(epp)) == 0) { - /* Adding the first logical drive */ - /* - * Make sure that begsec doesnt wrap - * around. This can happen if rsect is - * less than offset. - */ - if (rsect < offset) { - fprintf(stderr, "Minimum of " - "63 free sectors required " - "before the beginning of " - "a logical drive."); - exit(1); - } - /* - * Check if the first logical drive - * is out of order. In that case, do - * not subtract MAX_LOGDRIVE_OFFSET - * from the given start of partition. - */ - if (begsec != new_ext_beg_sec) { - begsec = rsect; - offset = 0; - } - } - if (ldcnt >= MAX_EXT_PARTS) { - fprintf(stderr, "\nError : Number of " - "logical drives exceeds limit of " - "%d.\n", MAX_EXT_PARTS); - exit(1); - } - endsec = rsect + numsect - 1; - if (fdisk_validate_logical_drive(epp, - begsec, offset, numsect) == 0) { - if (id == EFI_PMBR) { - fprintf(stderr, "EFI " - "partitions not supported " - "inside extended " - "partition\n"); - exit(1); - } - fdisk_add_logical_drive(epp, begsec, - endsec, id); - continue; - } else { - fprintf(stderr, "fdisk: Error on" - " entry \"%s\".\n", line); - exit(1); - } - } -#endif /* * Validate the partition. It cannot start at sector @@ -1934,7 +1382,6 @@ load(int funct, char *file) * Find an unused entry to use and put the entry * in table */ - if (insert_tbl(id, act, bhead, bsect, bcyl, ehead, esect, ecyl, rsect, numsect) < 0) { (void) fprintf(stderr, @@ -1975,8 +1422,8 @@ load(int funct, char *file) Table[i].endsect == ((esect & 0x3f) | (uchar_t)((ecyl>>2) & 0xc0)) && Table[i].endcyl == (uchar_t)(ecyl & 0xff) && - Table[i].relsect == LE_32(rsect) && - Table[i].numsect == LE_32(numsect)) { + Table[i].relsect == lel(rsect) && + Table[i].numsect == lel(numsect)) { /* * Found the entry. Now move rest of @@ -2005,44 +1452,15 @@ load(int funct, char *file) Table[FD_NUMPART - 1].systid = UNUSED; Table[FD_NUMPART - 1].bootid = 0; -#ifdef i386 - if (fdisk_is_dos_extended(id)) { - fdisk_delete_ext_part(epp); - } -#endif return; } } - -#ifdef i386 - ldcnt = FD_NUMPART + 1; - for (temp = fdisk_get_ld_head(epp); temp != NULL; - temp = temp->next) { - relsect = temp->abs_secnum + temp->logdrive_offset; - if (temp->parts[0].systid == id && - temp->parts[0].bootid == act && - temp->parts[0].beghead == bhead && - temp->parts[0].begsect == ((bsect & 0x3f) | - (uchar_t)((bcyl>>2) & 0xc0)) && - temp->parts[0].begcyl == (uchar_t)(bcyl & 0xff) && - temp->parts[0].endhead == ehead && - temp->parts[0].endsect == ((esect & 0x3f) | - (uchar_t)((ecyl>>2) & 0xc0)) && - temp->parts[0].endcyl == (uchar_t)(ecyl & 0xff) && - relsect == LE_32(rsect) && - temp->parts[0].numsect == LE_32(numsect)) { - fdisk_delete_logical_drive(epp, ldcnt); - return; - } - ldcnt++; - } -#endif - (void) fprintf(stderr, "fdisk: Entry does not match any existing partition:\n" " \"%s\"\n", file); exit(1); + /* FALLTHRU */ case LOADADD: @@ -2098,67 +1516,6 @@ load(int funct, char *file) } } -#ifdef i386 - if ((fdisk_ext_part_exists(epp)) && - (fdisk_is_dos_extended(id))) { - (void) fprintf(stderr, - "Extended partition already exists.\n"); - (void) fprintf(stderr, - "fdisk: Invalid entry could not be " - "inserted:\n \"%s\"\n", file); - exit(1); - } - - if (fdisk_ext_part_exists(epp) && - (rsect >= (ext_beg_sec = fdisk_get_ext_beg_sec(epp))) && - (rsect <= (ext_end_sec = fdisk_get_ext_end_sec(epp)))) { - int offset = MAX_LOGDRIVE_OFFSET; - - /* - * Make sure that begsec doesnt wrap around. - * This can happen if rsect is less than offset - */ - if (rsect < offset) { - return; - } - begsec = rsect - offset; - if ((ldcnt = fdisk_get_logical_drive_count(epp)) == 0) { - /* - * Adding the first logical drive - * Check if the first logical drive - * is out of order. In that case, do - * not subtract MAX_LOGDRIVE_OFFSET - * from the given start of partition. - */ - if (begsec != ext_beg_sec) { - begsec = rsect; - offset = 0; - } - } - if (ldcnt >= MAX_EXT_PARTS) { - printf("\nNumber of logical drives exceeds " - "limit of %d.\n", MAX_EXT_PARTS); - printf("Failing further additions.\n"); - exit(1); - } - if (numsect == 0) { - (void) fprintf(stderr, - "fdisk: Partition size cannot be zero:\n" - " \"%s\".\n", - file); - exit(1); - } - endsec = rsect + numsect - 1; - if (fdisk_validate_logical_drive(epp, begsec, - offset, numsect) == 0) { - /* Valid logical drive */ - fdisk_add_logical_drive(epp, begsec, endsec, - id); - return; - } - } -#endif - /* Find unused entry for use and put entry in table */ if (insert_tbl(id, act, bhead, bsect, bcyl, ehead, esect, ecyl, rsect, numsect) < 0) { @@ -2269,8 +1626,8 @@ insert_tbl( Table[i].systid = (uchar_t)id; Table[i].bootid = (uchar_t)act; - Table[i].numsect = LE_32(numsect); - Table[i].relsect = LE_32(rsect); + Table[i].numsect = lel(numsect); + Table[i].relsect = lel(rsect); /* * If we have been called with a valid geometry, use it @@ -2365,8 +1722,8 @@ verify_tbl(void) } /* make sure the partition isn't larger than the disk */ - rsect = LE_32(Table[i].relsect); - numsect = LE_32(Table[i].numsect); + rsect = lel(Table[i].relsect); + numsect = lel(Table[i].numsect); if ((((diskaddr_t)rsect + numsect) > dev_capacity) || (((diskaddr_t)rsect + numsect) > DK_MAX_2TB)) { @@ -2376,9 +1733,9 @@ verify_tbl(void) for (j = i + 1; j < FD_NUMPART; j++) { if (Table[j].systid != UNUSED) { uint32_t t_relsect = - LE_32(Table[j].relsect); + lel(Table[j].relsect); uint32_t t_numsect = - LE_32(Table[j].numsect); + lel(Table[j].numsect); if (noMoreParts) { (void) fprintf(stderr, @@ -2439,10 +1796,10 @@ verify_tbl(void) } if (Table[i].systid != UNUSED) { if (noMoreParts || - (((diskaddr_t)LE_32(Table[i].relsect) + - LE_32(Table[i].numsect)) > dev_capacity) || - (((diskaddr_t)LE_32(Table[i].relsect) + - LE_32(Table[i].numsect)) > DK_MAX_2TB)) { + (((diskaddr_t)lel(Table[i].relsect) + + lel(Table[i].numsect)) > dev_capacity) || + (((diskaddr_t)lel(Table[i].relsect) + + lel(Table[i].numsect)) > DK_MAX_2TB)) { return (-1); } } @@ -2464,10 +1821,6 @@ pars_fdisk( uint32_t *rsect, uint32_t *numsect) { int i; - int64_t test; - char *tok, *p; - char buf[256]; - if (line[0] == '\0' || line[0] == '\n' || line[0] == '*') return (1); line[strlen(line)] = '\0'; @@ -2478,25 +1831,6 @@ pars_fdisk( line[i] = ' '; } } - strncpy(buf, line, 256); - errno = 0; - tok = strtok(buf, ": \t\n"); - while (tok != NULL) { - for (p = tok; *p != '\0'; p++) { - if (!isdigit(*p)) { - printf("Invalid input %s in line %s.\n", - tok, line); - exit(1); - } - } - - test = strtoll(tok, (char **)NULL, 10); - if ((test < 0) || (test > 0xFFFFFFFF) || (errno != 0)) { - printf("Invalid input %s in line %s.\n", tok, line); - exit(1); - } - tok = strtok(NULL, ": \t\n"); - } if (sscanf(line, "%d %d %d %d %d %d %d %d %u %u", id, act, bhead, bsect, bcyl, ehead, esect, ecyl, rsect, numsect) != 10) { @@ -2518,8 +1852,8 @@ validate_part(int id, uint32_t rsect, uint32_t numsect) if ((id != UNUSED) && (rsect == 0)) { for (i = 0; i < FD_NUMPART; i++) { if ((Old_Table[i].systid == id) && - (Old_Table[i].relsect == LE_32(rsect)) && - (Old_Table[i].numsect == LE_32(numsect))) + (Old_Table[i].relsect == lel(rsect)) && + (Old_Table[i].numsect == lel(numsect))) return (0); } (void) fprintf(stderr, @@ -2536,28 +1870,16 @@ validate_part(int id, uint32_t rsect, uint32_t numsect) static void stage0(void) { -#ifdef i386 - int rval; -#endif dispmenu(); for (;;) { (void) printf(Q_LINE); (void) printf("Enter Selection: "); (void) gets(s); rm_blanks(s); -#ifdef i386 - while (!((s[0] > '0') && (s[0] < '8') && (s[1] == 0))) { -#else while (!((s[0] > '0') && (s[0] < '7') && (s[1] == 0))) { -#endif (void) printf(E_LINE); /* Clear any previous error */ -#ifdef i386 - (void) printf( - "Enter a one-digit number between 1 and 7."); -#else (void) printf( "Enter a one-digit number between 1 and 6."); -#endif (void) printf(Q_LINE); (void) printf("Enter Selection: "); (void) gets(s); @@ -2581,61 +1903,12 @@ stage0(void) if (ppartid() == -1) return; break; -#ifdef i386 case '5': - if (fdisk_ext_part_exists(epp)) { - ext_part_menu(); - } else { - printf(Q_LINE); - printf("\nNo extended partition found" - "\n"); - printf("Press enter to continue\n"); - ext_read_input(s); - } - break; - case '6': /* update disk partition table, if changed */ if (TableChanged() == 1) { copy_Table_to_Bootblk(); dev_mboot_write(0, Bootsect, sectsiz); } - - /* - * If the VTOC table is wrong fix it - * (truncate only) - */ - if (io_adjt) { - fix_slice(); - } - if (!io_readonly) { - rval = fdisk_commit_ext_part(epp); - switch (rval) { - case FDISK_SUCCESS: - /* Success */ - /* Fallthrough */ - case FDISK_ENOEXTPART: - /* Nothing to do */ - break; - case FDISK_EMOUNTED: - printf(Q_LINE); - preach_and_continue(); - continue; - default: - perror("Commit failed"); - exit(1); - } - libfdisk_fini(&epp); - } - (void) close(Dev); - exit(0); -#else - case '5': - /* update disk partition table, if changed */ - if (TableChanged() == 1) { - copy_Table_to_Bootblk(); - dev_mboot_write(0, Bootsect, sectsiz); - } - /* * If the VTOC table is wrong fix it * (truncate only) @@ -2646,12 +1919,7 @@ stage0(void) (void) close(Dev); exit(0); /* FALLTHRU */ -#endif -#ifdef i386 - case '7': -#else case '6': -#endif /* * If the VTOC table is wrong fix it * (truncate only) @@ -2682,9 +1950,6 @@ pcreate(void) int i, j; uint32_t numsect; int retCode = 0; -#ifdef i386 - int ext_part_present = 0; -#endif i = 0; for (;;) { @@ -2705,14 +1970,8 @@ pcreate(void) numsect = 0; for (i = 0; i < FD_NUMPART; i++) { if (Table[i].systid != UNUSED) { - numsect += LE_32(Table[i].numsect); + numsect += lel(Table[i].numsect); } -#ifdef i386 - /* Check if an extended partition already exists */ - if (fdisk_is_dos_extended(Table[i].systid)) { - ext_part_present = 1; - } -#endif if (numsect >= chs_capacity) { (void) printf(E_LINE); (void) printf("There is no more room on the disk for" @@ -2770,17 +2029,6 @@ pcreate(void) tsystid = DOSOS16; /* DOS 16 bit fat */ break; case '7': -#ifdef i386 - if (ext_part_present) { - printf(Q_LINE); - printf(E_LINE); - fprintf(stderr, - "Extended partition already exists\n"); - fprintf(stderr, "Press enter to continue\n"); - ext_read_input(s); - continue; - } -#endif tsystid = EXTDOS; break; case '8': @@ -2860,18 +2108,6 @@ pcreate(void) Table[i].bootid = 0; } -#ifdef i386 - /* - * If partition created is an extended partition, null - * out the first sector of the first cylinder of the - * extended partition - */ - if (fdisk_is_dos_extended(Table[i].systid)) { - fdisk_init_ext_part(epp, - LE_32(Table[i].relsect), - LE_32(Table[i].numsect)); - } -#endif /* set up the return code */ i = 1; } @@ -2958,8 +2194,8 @@ specify(uchar_t tsystid) for (j = i + 1; j < FD_NUMPART; j++) { if (partition[j]->systid == UNUSED) break; - if (LE_32(partition[j]->relsect) < - LE_32(partition[i]->relsect)) { + if (lel(partition[j]->relsect) < + lel(partition[i]->relsect)) { struct ipart *temp = partition[i]; partition[i] = partition[j]; partition[j] = temp; @@ -3039,8 +2275,8 @@ specify(uchar_t tsystid) */ if (i) { /* Not an empty table */ - first_free = LE_32(partition[i - 1]->relsect) + - LE_32(partition[i - 1]->numsect); + first_free = lel(partition[i - 1]->relsect) + + lel(partition[i - 1]->numsect); } else { first_free = cyl_size; } @@ -3057,9 +2293,9 @@ specify(uchar_t tsystid) * Make sure free space is not negative. */ size_free = - (LE_32(partition[i]->relsect > first_free)) - ? (LE_32(partition[i]->relsect) - - first_free) : 0; + (lel(partition[i]->relsect > first_free)) ? + (lel(partition[i]->relsect) - first_free) : + 0; } /* save largest free space */ @@ -3133,8 +2369,8 @@ specify(uchar_t tsystid) if (partition[i]->systid == UNUSED) break; - t_relsect = LE_32(partition[i]->relsect); - t_numsect = LE_32(partition[i]->numsect); + t_relsect = lel(partition[i]->relsect); + t_numsect = lel(partition[i]->numsect); if (cyl * cyl_size >= t_relsect && cyl * cyl_size < t_relsect + t_numsect) { @@ -3209,17 +2445,6 @@ static void dispmenu(void) { (void) printf(M_LINE); -#ifdef i386 - (void) printf( - "SELECT ONE OF THE FOLLOWING:\n" - " 1. Create a partition\n" - " 2. Specify the active partition\n" - " 3. Delete a partition\n" - " 4. Change between Solaris and Solaris2 Partition IDs\n" - " 5. Edit/View extended partitions\n" - " 6. Exit (update disk configuration and exit)\n" - " 7. Cancel (exit without updating disk configuration)\n"); -#else (void) printf( "SELECT ONE OF THE FOLLOWING:\n" " 1. Create a partition\n" @@ -3228,7 +2453,6 @@ dispmenu(void) " 4. Change between Solaris and Solaris2 Partition IDs\n" " 5. Exit (update disk configuration and exit)\n" " 6. Cancel (exit without updating disk configuration)\n"); -#endif } /* @@ -3387,46 +2611,16 @@ DEL1: (void) printf(Q_LINE); return (-1); } -#ifdef i386 - if (fdisk_is_dos_extended(Table[i].systid) && - (Table[i].relsect == fdisk_get_ext_beg_sec(epp)) && - fdisk_get_logical_drive_count(epp)) { - (void) printf(Q_LINE); - (void) printf("There are logical drives inside the" - " extended partition\n"); - (void) printf("Are you sure of proceeding with deletion ?" - " (type \"y\" or \"n\") "); - - (void) printf(E_LINE); - if (! yesno()) { - return (1); - } - if (fdisk_mounted_logical_drives(epp) == FDISK_EMOUNTED) { - (void) printf(Q_LINE); - (void) printf("There are mounted logical drives. " - "Committing changes now can cause data loss or " - "corruption. Unmount all logical drives and then " - "try committing the changes again.\n"); - (void) printf("Press enter to continue.\n"); - ext_read_input(s); - return (1); - } - fdisk_delete_ext_part(epp); - } else { -#endif - (void) printf(Q_LINE); - (void) printf("Are you sure you want to delete partition %d?" - " This will make all files and \n", i + 1); - (void) printf("programs in this partition inaccessible (type" - " \"y\" or \"n\"). "); + (void) printf(Q_LINE); + (void) printf("Are you sure you want to delete partition %d?" + " This will make all files and \n", i + 1); + (void) printf("programs in this partition inaccessible (type" + " \"y\" or \"n\"). "); - (void) printf(E_LINE); - if (! yesno()) { - return (1); - } -#ifdef i386 + (void) printf(E_LINE); + if (! yesno()) { + return (1); } -#endif if (Table[i].bootid == ACTIVE) { pactive = 1; @@ -3608,9 +2802,6 @@ disptbl(void) case FDISK_CPM: type = CPMstr; break; - case FDISK_NOVELL2: - type = NOV2str; - break; case FDISK_NOVELL3: type = NOVstr; break; @@ -3646,7 +2837,7 @@ disptbl(void) break; case EFI_PMBR: type = EFIstr; - if (LE_32(Table[i].numsect) == DK_MAX_2TB) + if (lel(Table[i].numsect) == DK_MAX_2TB) is_pmbr = 1; break; @@ -3654,16 +2845,16 @@ disptbl(void) type = Ostr; break; } - startcyl = LE_32(Table[i].relsect) / + startcyl = lel(Table[i].relsect) / (unsigned long)(heads * sectors); - if (LE_32(Table[i].numsect) == DK_MAX_2TB) { + if (lel(Table[i].numsect) == DK_MAX_2TB) { endcyl = Numcyl - 1; length = endcyl - startcyl + 1; } else { - length = LE_32(Table[i].numsect) / + length = lel(Table[i].numsect) / (unsigned long)(heads * sectors); - if (LE_32(Table[i].numsect) % + if (lel(Table[i].numsect) % (unsigned long)(heads * sectors)) length++; endcyl = startcyl + length - 1; @@ -3727,8 +2918,8 @@ print_Table(void) (void) fprintf(stderr, "%-5d ", Table[i].endsect & 0x3f); (void) fprintf(stderr, "%-8d ", (((uint_t)Table[i].endsect & 0xc0) << 2) + Table[i].endcyl); - (void) fprintf(stderr, "%-10u ", LE_32(Table[i].relsect)); - (void) fprintf(stderr, "%-10u\n", LE_32(Table[i].numsect)); + (void) fprintf(stderr, "%-10u ", lel(Table[i].relsect)); + (void) fprintf(stderr, "%-10u\n", lel(Table[i].numsect)); } } @@ -3760,8 +2951,8 @@ nulltbl(void) for (i = 0; i < FD_NUMPART; i++) { Table[i].systid = UNUSED; - Table[i].numsect = LE_32(UNUSED); - Table[i].relsect = LE_32(UNUSED); + Table[i].numsect = lel(UNUSED); + Table[i].relsect = lel(UNUSED); Table[i].bootid = 0; } } @@ -3781,7 +2972,7 @@ copy_Bootblk_to_Table(void) /* Get an aligned copy of the partition tables */ (void) memcpy(iparts, Bootblk->parts, sizeof (iparts)); bootptr = (char *)iparts; /* Points to start of partition table */ - if (LE_16(Bootblk->signature) != MBB_MAGIC) { + if (les(Bootblk->signature) != MBB_MAGIC) { /* Signature is missing */ nulltbl(); (void) memcpy(Bootblk->bootinst, &BootCod, BOOTSZ); @@ -3806,8 +2997,8 @@ copy_Bootblk_to_Table(void) } for (i = j; i < FD_NUMPART; i++) { Table[i].systid = UNUSED; - Table[i].numsect = LE_32(UNUSED); - Table[i].relsect = LE_32(UNUSED); + Table[i].numsect = lel(UNUSED); + Table[i].relsect = lel(UNUSED); Table[i].bootid = 0; } @@ -3891,7 +3082,7 @@ copy_Table_to_Bootblk(void) else (void) memcpy(boot_ptr, tbl_ptr, sizeof (struct ipart)); } - Bootblk->signature = LE_16(MBB_MAGIC); + Bootblk->signature = les(MBB_MAGIC); } /* @@ -3979,7 +3170,6 @@ ffile_write(char *file) (void) fprintf(fp, "* 86: DOSDATA\n"); (void) fprintf(fp, "* 98: OTHEROS\n"); (void) fprintf(fp, "* 99: UNIXOS\n"); - (void) fprintf(fp, "* 100: FDISK_NOVELL2\n"); (void) fprintf(fp, "* 101: FDISK_NOVELL3\n"); (void) fprintf(fp, "* 119: FDISK_QNX4\n"); (void) fprintf(fp, "* 120: FDISK_QNX42\n"); @@ -4002,7 +3192,7 @@ ffile_write(char *file) " Rsect Numsect\n"); for (i = 0; i < FD_NUMPART; i++) { - if (Table[i].systid != UNUSED) { + if (Table[i].systid != UNUSED) (void) fprintf(fp, " %-5d %-4d %-6d %-6d %-7d %-6d %-6d %-7d %-10u" " %-10u\n", @@ -4016,53 +3206,9 @@ ffile_write(char *file) Table[i].endsect & 0x3f, ((Table[i].endcyl & 0xff) | ((Table[i].endsect & 0xc0) << 2)), - LE_32(Table[i].relsect), - LE_32(Table[i].numsect)); -#ifdef i386 - } else { - (void) fprintf(fp, - " %1$-5d %1$-4d %1$-6d %1$-6d %1$-7d %1$-6d" - " %1$-6d %1$-7d %1$-8d %1$-8d\n", 0); -#endif - } - } -#ifdef i386 - if (fdisk_ext_part_exists(epp)) { - struct ipart ext_tab; - logical_drive_t *temp; - uint32_t rsect, numsect, tempsect = 0; - for (temp = fdisk_get_ld_head(epp); temp != NULL; - temp = temp->next) { - ext_tab = temp->parts[0]; - rsect = tempsect + LE_32(ext_tab.relsect) + - fdisk_get_ext_beg_sec(epp); - numsect = LE_32(ext_tab.numsect); - tempsect = LE_32(temp->parts[1].relsect); - if (ext_tab.systid != UNUSED) { - (void) fprintf(fp, - " %-5d %-4d %-6d %-6d %-7d %-6d %-6d " - "%-7d %-8u %-8u\n", - ext_tab.systid, - ext_tab.bootid, - ext_tab.beghead, - ext_tab.begsect & 0x3f, - ((ext_tab.begcyl & 0xff) | - ((ext_tab.begsect & 0xc0) << 2)), - ext_tab.endhead, - ext_tab.endsect & 0x3f, - ((ext_tab.endcyl & 0xff) | - ((ext_tab.endsect & 0xc0) << 2)), - rsect, - numsect); - } else { - (void) fprintf(fp, - " %1$-5d %1$-4d %1$-6d %1$-6d %1$-7d " - "%1$-6d %1$-6d %1$-7d %1$-8d %1$-8d\n", 0); - } - } + lel(Table[i].relsect), + lel(Table[i].numsect)); } -#endif - if (fp != stdout) (void) fclose(fp); } @@ -4090,7 +3236,7 @@ fix_slice(void) * VTOC entries are relative to the start of * the partition. */ - numsect = LE_32(Table[i].numsect); + numsect = lel(Table[i].numsect); break; } } @@ -4454,13 +3600,13 @@ clear_vtoc(int table, int part) (void) memset(&disk_label, 0, sizeof (struct dk_label)); - seek_byte = (off_t)(LE_32(clr_table->relsect) + VTOC_OFFSET) * sectsiz; + seek_byte = (off_t)(lel(clr_table->relsect) + VTOC_OFFSET) * sectsiz; if (io_debug) { (void) fprintf(stderr, "\tClearing primary VTOC at byte %llu (block %llu)\n", (uint64_t)seek_byte, - (uint64_t)(LE_32(clr_table->relsect) + VTOC_OFFSET)); + (uint64_t)(lel(clr_table->relsect) + VTOC_OFFSET)); } if (lseek(Dev, seek_byte, SEEK_SET) == -1) { @@ -4508,8 +3654,8 @@ clear_vtoc(int table, int part) #endif /* DEBUG */ /* Clear backup label */ - pcyl = LE_32(clr_table->numsect) / (heads * sectors); - solaris_offset = LE_32(clr_table->relsect); + pcyl = lel(clr_table->numsect) / (heads * sectors); + solaris_offset = lel(clr_table->relsect); ncyl = pcyl - acyl; backup_block = ((ncyl + acyl - 1) * @@ -4741,741 +3887,3 @@ get_node(char *devname) return (node); } - -#ifdef i386 -static void -preach_and_continue() -{ - (void) fprintf(stderr, "There are mounted logical drives. Committing " - "changes now can lead to inconsistancy in internal system state " - "which can eventually cause data loss or corruption. Unmount all " - "logical drives and try committing the changes again.\n"); - ext_read_input(s); -} - -/* - * Convert a given partition ID to an descriptive string. - * Just an index into the partition types table. - */ -void -id_to_name(uchar_t sysid, char *buffer) -{ - strcpy(buffer, fdisk_part_types[sysid]); -} - -/* - * Procedure to check the validity of the extended partition menu option - * entered by the user - */ -static int -ext_invalid_option(char ch) -{ - char *p; - - p = strchr(ext_part_menu_opts, tolower(ch)); - - if (p == NULL) { - return (1); - } - return (0); -} - -/* - * Read 16 bytes of the input (assuming that no valid user input spans more - * than that). Flush the input stream, so that the next read does not reap - * stale data from the previous input that was not processed. - * Note that fgets also reads the trailing '\n' - */ -static void -ext_read_input(char *buf) -{ - fgets(buf, 16, stdin); - fflush(stdin); -} - -/* - * Procedure to read and validate the user option at the extended partition menu - */ -static int -ext_read_options(char *buf) -{ - ext_read_input(buf); - if ((strlen(buf) != 2) || (ext_invalid_option(buf[0]))) { - printf("\nUnknown Command\n"); - return (-1); - } - return (0); -} - -/* - * Procedure to print the list of known partition types and their IDs - */ -static void -ext_print_part_types() -{ - int i, rowmax, rowcount = 1; - struct winsize ws; - char buf[80]; - - /* Get the current window dimensions */ - if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0) { - perror("ioctl"); - rowmax = 20; - } else { - /* - * Accommodate the initial headings by reducing the number of - * partition IDs being printed. - */ - rowmax = ws.ws_row - 5; - } - - if (rowmax < 3) { - fprintf(stderr, "Window size too small." - " Try resizing the window\n"); - return; - } - - printf("List of known partition types : \n"); - printf("PartID Partition Type\n"); - printf("====== ==============\n"); - for (i = 0; i <= FDISK_MAX_VALID_PART_ID; i++) { - printf("%-3d %s\n", i, fdisk_part_types[i]); - rowcount++; - if (rowcount == rowmax) { - /* - * After the initial screen, use all the rows for - * printing the partition IDs, but one. - */ - rowmax = ws.ws_row - 1; - fprintf(stderr, "\nPress enter to see next page or 'q'" - " to quit : "); - ext_read_input(buf); - if ((strlen(buf) == 2) && (tolower(buf[0]) == 'q')) { - return; - } - rowcount = 1; - } - } -} - -static void -ext_read_valid_part_num(int *pno) -{ - char buf[80]; - int len, i; - - for (;;) { - printf("Enter the partition number : "); - ext_read_input(buf); - - len = strlen(buf); - - /* Check length of the input */ - if ((len < 2) || (len > (FDISK_MAX_VALID_PART_NUM_DIGITS+1))) { - goto print_error_and_continue; - } - - /* Check if there is a non-digit in the input */ - for (i = 0; i < len-1; i++) { - if (!isdigit(buf[i])) { - goto print_error_and_continue; - } - } - - *pno = atoi(buf); - - if ((*pno <= FD_NUMPART) || - *pno > (fdisk_get_logical_drive_count(epp) + FD_NUMPART)) { - goto print_error_and_continue; - } - - break; -print_error_and_continue: - printf("Invalid partition number\n"); - continue; - } -} - -static void -ext_read_valid_part_id(uchar_t *partid) -{ - char buf[80]; - int len, i, id; - - for (;;) { - printf("Enter the ID ( Type I for list of partition IDs ) : "); - ext_read_input(buf); - len = strlen(buf); - - if ((len < 2) || (len > (FDISK_MAX_VALID_PART_ID_DIGITS + 1))) { - printf("Invalid partition ID\n"); - continue; - } - - if ((len == 2) && (toupper(buf[0]) == 'I')) { - ext_print_part_types(); - continue; - } - - /* Check if there is a non-digit in the input */ - for (i = 0; i < len-1; i++) { - if (!isdigit(buf[i])) { - printf("Invalid partition ID\n"); - break; - } - } - - if (i < len - 1) { - continue; - } - - /* Check if the (now) valid number is greater than the limit */ - if ((id = atoi(buf)) > FDISK_MAX_VALID_PART_ID) { - printf("Invalid partition ID\n"); - continue; - } - - *partid = (uchar_t)id; - - /* Disallow multiple extended partitions */ - if (fdisk_is_dos_extended(*partid)) { - printf("Multiple extended partitions not allowed\n"); - continue; - } - - /* Disallow EFI partitions within extended partition */ - if (*partid == EFI_PMBR) { - printf("EFI partitions within an extended partition" - " is not allowed\n"); - continue; - } - - return; /* Valid partition ID is in partid */ - } -} - -static void -delete_logical_drive() -{ - int pno; - - if (!fdisk_get_logical_drive_count(epp)) { - printf("\nNo logical drives defined.\n"); - return; - } - - printf("\n"); - ext_read_valid_part_num(&pno); - fdisk_delete_logical_drive(epp, pno); - printf("Partition %d deleted\n", pno); -} - -static int -ext_read_valid_partition_start(uint32_t *begsec) -{ - char buf[80]; - int ret, len, i; - uint32_t begcyl; - uint32_t first_free_cyl; - uint32_t first_free_sec; - - ret = fdisk_ext_find_first_free_sec(epp, &first_free_sec); - if (ret != FDISK_SUCCESS) { - return (ret); - } - - first_free_cyl = FDISK_SECT_TO_CYL(epp, first_free_sec); - for (;;) { - printf("Enter the beginning cylinder (Default - %d) : ", - first_free_cyl); - ext_read_input(buf); - len = strlen(buf); - if (len == 1) { /* User accepted the default value */ - *begsec = first_free_sec; - return (FDISK_SUCCESS); - } - - if (len > (FDISK_MAX_VALID_CYL_NUM_DIGITS + 1)) { - printf("Input too long\n"); - printf("Invalid beginning cylinder number\n"); - continue; - } - /* Check if there is a non-digit in the input */ - for (i = 0; i < len - 1; i++) { - if (!isdigit(buf[i])) { - printf("Invalid beginning cylinder number\n"); - break; - } - } - if (i < len - 1) { - continue; - } - - begcyl = atoi(buf); - ret = fdisk_ext_validate_part_start(epp, begcyl, begsec); - switch (ret) { - case FDISK_SUCCESS: - /* - * Success. - * Valid beginning sector is in begsec - */ - break; - - case FDISK_EOVERLAP: - printf("Partition boundary overlaps with "); - printf("existing partitions\n"); - printf("Invalid beginning cylinder number\n"); - continue; - - case FDISK_EOOBOUND: - printf("Cylinder boundary beyond the limits\n"); - printf("Invalid beginning cylinder number\n"); - continue; - } - return (FDISK_SUCCESS); - } -} - -/* - * Algorithm : - * 1. Check if the first character is a + - * a) If yes, check if the last character is 'k', 'm' or 'g' - * 2. If not, check if there are any non-digits - * 3. Check for the length of the numeral string - * 4. atoi the numeral string - * 5. In case of data entered in KB, MB or GB, convert it to number of cylinders - * a) Adjust size to be cylinder boundary aligned - * 6. If size specifies is zero, flag error - * 7. Check if the size is less than 1 cylinder - * a) If yes, default the size FDISK_MIN_PART_SIZE - * b) If no, Check if the size is within endcyl - begcyl - */ -static void -ext_read_valid_partition_size(uint32_t begsec, uint32_t *endsec) -{ - char buf[80]; - uint32_t tempcyl; - uint32_t last_free_sec; - uint32_t last_free_cyl; - int i, len, ch, mbgb = 0, scale = FDISK_SECTS_PER_CYL(epp); - uint64_t size = 0; - int copy_len; - char numbuf[FDISK_MAX_VALID_CYL_NUM_DIGITS + 1]; - int sectsize = fdisk_get_disk_geom(epp, PHYSGEOM, SSIZE); - uint32_t remdr, spc, poss_end; - - if (sectsize == EINVAL) { - fprintf(stderr, "Unsupported geometry statistics.\n"); - exit(1); - } - - last_free_sec = fdisk_ext_find_last_free_sec(epp, begsec); - last_free_cyl = FDISK_SECT_TO_CYL(epp, last_free_sec); - - for (;;) { - printf("Enter the size in cylinders (Default End Cylinder -"); - printf(" %u)\n", last_free_cyl); - printf("Type +<size>K, +<size>M or +<size>G to enter size in"); - printf("KB, MB or GB : "); - ext_read_input(buf); - len = strlen(buf); - mbgb = 0; - scale = FDISK_SECTS_PER_CYL(epp); - - if (len == 1) { /* User accepted the default value */ - *endsec = last_free_sec; - return; - } - - copy_len = len - 1; - - if ((buf[0] == '+') && (isdigit(buf[1]))) { - copy_len--; - if ((ch = toupper(buf[len - 2])) == 'B') { - ch = toupper(buf[len - 3]); - copy_len--; - } - - if (!((ch == 'K') || (ch == 'M') || (ch == 'G'))) { - printf("Invalid partition size\n"); - continue; - } - - copy_len--; - mbgb = 1; - scale = ((ch == 'K') ? FDISK_KB : - ((ch == 'M') ? FDISK_MB : FDISK_GB)); - } - - if (copy_len > FDISK_MAX_VALID_CYL_NUM_DIGITS) { - printf("Input too long\n"); - printf("Invalid partition size\n"); - continue; - } - - strncpy(numbuf, &buf[mbgb], copy_len); - numbuf[copy_len] = '\0'; - - for (i = mbgb; i < copy_len + mbgb; i++) { - if (!isdigit(buf[i])) { - break; - } - } - - if (i < copy_len + mbgb) { - printf("Invalid partition size\n"); - continue; - } - - size = (atoll(numbuf) * (scale)); - - if (size == 0) { - printf("Zero size is invalid\n"); - printf("Invalid partition size\n"); - continue; - } - - if (mbgb) { - size /= sectsize; - } - - if (size > (last_free_sec - begsec + 1)) { - printf("Cylinder boundary beyond the limits"); - printf(" or overlaps with existing"); - printf(" partitions\n"); - printf("Invalid partition size\n"); - continue; - } - - /* - * Adjust the ending sector such that there are no partial - * cylinders allocated. But at the same time, make sure it - * doesn't over shoot boundaries. - */ - spc = FDISK_SECTS_PER_CYL(epp); - poss_end = begsec + size - 1; - if (remdr = (poss_end % spc)) { - poss_end += spc - remdr - 1; - } - *endsec = (poss_end > last_free_sec) ? last_free_sec : - poss_end; - - return; - } -} - -/* - * ALGORITHM: - * 1. Get the starting and ending sectors/cylinder of the extended partition. - * 2. Keep track of the first free sector/cylinder - * 3. Allow the user to specify the beginning cylinder of the new partition - * 4. Check for the validity of the entered data - * a) If it is non-numeric - * b) If it is beyond the extended partition limits - * c) If it overlaps with the current logical drives - * 5. Allow the user to specify the size in cylinders/ human readable form - * 6. Check for the validity of the entered data - * a) If it is non-numeric - * b) If it is beyond the extended partition limits - * c) If it overlaps with the current logical drives - * d) If it is a number lesser than the starting cylinder - * 7. Request partition ID for the new partition. - * 8. Update the first free cylinder available - * 9. Display Success message - */ - -static void -add_logical_drive() -{ - uint32_t begsec, endsec; - uchar_t partid; - char buf[80]; - int rval; - - if (fdisk_get_logical_drive_count(epp) >= MAX_EXT_PARTS) { - printf("\nNumber of logical drives exceeds limit of %d.\n", - MAX_EXT_PARTS); - printf("Command did not succeed. Press enter to continue\n"); - ext_read_input(buf); - return; - } - - printf("\n"); - rval = ext_read_valid_partition_start(&begsec); - switch (rval) { - case FDISK_SUCCESS: - break; - - case FDISK_EOOBOUND: - printf("\nNo space left in the extended partition\n"); - printf("Press enter to continue\n"); - ext_read_input(buf); - return; - } - - ext_read_valid_partition_size(begsec, &endsec); - ext_read_valid_part_id(&partid); - fdisk_add_logical_drive(epp, begsec, endsec, partid); - - printf("New partition with ID %d added\n", partid); -} - -static void -ext_change_logical_drive_id() -{ - int pno; - uchar_t partid; - - if (!fdisk_get_logical_drive_count(epp)) { - printf("\nNo logical drives defined.\n"); - return; - } - - printf("\n"); - ext_read_valid_part_num(&pno); - ext_read_valid_part_id(&partid); - fdisk_change_logical_drive_id(epp, pno, partid); - - printf("Partition ID of partition %d changed to %d\n", pno, partid); -} - -#ifdef DEBUG -static void -ext_print_logdrive_layout_debug() -{ - int pno; - char namebuff[255]; - logical_drive_t *head = fdisk_get_ld_head(epp); - logical_drive_t *temp; - - if (!fdisk_get_logical_drive_count(epp)) { - printf("\nNo logical drives defined.\n"); - return; - } - - printf("\n\n"); - puts("# start block end block abs start abs end OSType"); - for (temp = head, pno = 5; temp != NULL; temp = temp->next, pno++) { - /* Print the logical drive details */ - id_to_name(temp->parts[0].systid, namebuff); - printf("%d: %.10u %.10u %.10u %.10u", - pno, - LE_32(temp->parts[0].relsect), - LE_32(temp->parts[0].numsect), - temp->abs_secnum, - temp->abs_secnum + temp->numsect - 1 + - MAX_LOGDRIVE_OFFSET); - printf(" %s\n", namebuff); - /* - * Print the second entry in the EBR which is information - * about the location and the size of the next extended - * partition. - */ - id_to_name(temp->parts[1].systid, namebuff); - printf("%d: %.10u %.10u %.10s %.10s", - pno, - LE_32(temp->parts[1].relsect), - LE_32(temp->parts[1].numsect), - " ", " "); - printf(" %s\n", namebuff); - } -} -#endif - -static void -ext_print_logical_drive_layout() -{ - int sysid; - unsigned int startcyl, endcyl, length, percent, remainder; - logical_drive_t *temp; - struct ipart *fpart; - char namebuff[255]; - int numcyl = fdisk_get_disk_geom(epp, PHYSGEOM, NCYL); - int pno; - - if (numcyl == EINVAL) { - fprintf(stderr, "Unsupported geometry statistics.\n"); - exit(1); - } - - if (!fdisk_get_logical_drive_count(epp)) { - printf("\nNo logical drives defined.\n"); - return; - } - - printf("\n"); - printf("Number of cylinders in disk : %u\n", numcyl); - printf("Beginning cylinder of extended partition : %u\n", - fdisk_get_ext_beg_cyl(epp)); - printf("Ending cylinder of extended partition : %u\n", - fdisk_get_ext_end_cyl(epp)); - printf("\n"); - printf("Part# StartCyl EndCyl Length %% " - "Part ID (Type)\n"); - printf("===== ======== ======== ======= ===" - " ==============\n"); - for (temp = fdisk_get_ld_head(epp), pno = 5; temp != NULL; - temp = temp->next, pno++) { - /* Print the logical drive details */ - fpart = &temp->parts[0]; - sysid = fpart->systid; - id_to_name(sysid, namebuff); - startcyl = temp->begcyl; - endcyl = temp->endcyl; - if (startcyl == endcyl) { - length = 1; - } else { - length = endcyl - startcyl + 1; - } - percent = length * 100 / numcyl; - if ((remainder = (length * 100 % numcyl)) != 0) { - if ((remainder * 100 / numcyl) > 50) { - /* round up */ - percent++; - } - /* Else leave the percent as is since it's already */ - /* rounded down */ - } - if (percent > 100) { - percent = 100; - } - printf("%-5d %-8u %-8u %-7u %-3d %-3d (%-.28s)\n", - pno, startcyl, endcyl, length, percent, sysid, namebuff); - } -#ifdef DEBUG - ext_print_logdrive_layout_debug(); -#endif - printf("\n"); -} - -static void -ext_print_help_menu() -{ - printf("\n"); - printf("a Add a logical drive\n"); - printf("d Delete a logical drive\n"); - printf("h Print this help menu\n"); - printf("i Change the id of the logical drive\n"); - printf("p Print the logical drive layout\n"); - printf("r Return to the main fdisk menu\n"); - printf(" (To commit or cancel the changes)\n"); - printf("\n"); -} - -static void -ext_part_menu() -{ - char buf[80]; - uchar_t *bbsigp; - static int bbsig_disp_flag = 1; - - int i; - - printf(CLR_SCR); - - if (fdisk_corrupt_logical_drives(epp)) { - printf("One or more logical drives seem to be corrupt.\n"); - printf("Displaying only sane logical drives.\n"); - } - - if (bbsig_disp_flag && fdisk_invalid_bb_sig(epp, &bbsigp)) { - printf("The following logical drives have a wrong boot block" - " signature :\n\n"); - for (i = 0; bbsigp[i]; i++) { - printf("%d ", bbsigp[i]); - } - printf("\n\n"); - printf("They will be corrected when you choose to commit\n"); - bbsig_disp_flag = 0; - } - - printf("Extended partition menu\n"); - - for (;;) { - printf("\nEnter Command (Type h for help) : "); - if ((ext_read_options(buf)) < 0) { - printf("\nCommand Options : \n"); - ext_print_help_menu(); - continue; - } - switch (buf[0]) { - case 'a': - add_logical_drive(); - break; - case 'd': - delete_logical_drive(); - break; - case 'h': - ext_print_help_menu(); - break; - case 'i': - ext_change_logical_drive_id(); - break; - case 'p': - ext_print_logical_drive_layout(); - break; - case 'r': - printf(CLR_SCR); - return; - default : /* NOTREACHED */ - break; - } - } -} -#endif - -#ifdef i386 - -static int -is_linux_swap(uint32_t part_start, off_t *lsm_offset) -{ - int i; - int rval = -1; - off_t seek_offset; - uint32_t linux_pg_size; - char *buf, *linux_swap_magic; - /* - * Known linux kernel page sizes - * The linux swap magic is found as the last 10 bytes of a disk chunk - * at the beginning of the linux swap partition whose size is that of - * kernel page size. - */ - uint32_t linux_pg_size_arr[] = {4096, }; - - if ((buf = calloc(1, sectsiz)) == NULL) { - return (ENOMEM); - } - - linux_swap_magic = buf + sectsiz - LINUX_SWAP_MAGIC_LENGTH; - - for (i = 0; i < sizeof (linux_pg_size_arr)/sizeof (uint32_t); i++) { - linux_pg_size = linux_pg_size_arr[i]; - seek_offset = linux_pg_size/sectsiz - 1; - seek_offset += part_start; - seek_offset *= sectsiz; - - if ((rval = lseek(Dev, seek_offset, SEEK_SET)) < 0) { - break; - } - - if ((rval = read(Dev, buf, sectsiz)) < sectsiz) { - rval = EIO; - break; - } - - if ((strncmp(linux_swap_magic, "SWAP-SPACE", - LINUX_SWAP_MAGIC_LENGTH) == 0) || - (strncmp(linux_swap_magic, "SWAPSPACE2", - LINUX_SWAP_MAGIC_LENGTH) == 0)) { - /* Found a linux swap */ - rval = 0; - *lsm_offset = seek_offset; - break; - } - } - - free(buf); - return (rval); -} - -#endif |