fdisk: do not open device twice. Complain on fdisk -l /dev/bogus.

Made enums UPPERCASE. Removed one global variable.
  Added some FIXMEs.

   text    data     bss     dec     hex filename
 804708     645    7112  812465   c65b1 busybox_old
 804685     641    7112  812438   c6596 busybox_unstripped
This commit is contained in:
Denis Vlasenko 2008-04-17 00:12:10 +00:00
parent aca10f852a
commit 4437d19fb4
5 changed files with 137 additions and 156 deletions

View File

@ -78,13 +78,13 @@ static const char ioctl_error[] ALIGN1 = "BLKGETSIZE ioctl failed on %s";
static void fdisk_fatal(const char *why) ATTRIBUTE_NORETURN; static void fdisk_fatal(const char *why) ATTRIBUTE_NORETURN;
enum label_type { enum label_type {
label_dos, label_sun, label_sgi, label_aix, label_osf LABEL_DOS, LABEL_SUN, LABEL_SGI, LABEL_AIX, LABEL_OSF
}; };
#define LABEL_IS_DOS (label_dos == current_label_type) #define LABEL_IS_DOS (LABEL_DOS == current_label_type)
#if ENABLE_FEATURE_SUN_LABEL #if ENABLE_FEATURE_SUN_LABEL
#define LABEL_IS_SUN (label_sun == current_label_type) #define LABEL_IS_SUN (LABEL_SUN == current_label_type)
#define STATIC_SUN static #define STATIC_SUN static
#else #else
#define LABEL_IS_SUN 0 #define LABEL_IS_SUN 0
@ -92,7 +92,7 @@ enum label_type {
#endif #endif
#if ENABLE_FEATURE_SGI_LABEL #if ENABLE_FEATURE_SGI_LABEL
#define LABEL_IS_SGI (label_sgi == current_label_type) #define LABEL_IS_SGI (LABEL_SGI == current_label_type)
#define STATIC_SGI static #define STATIC_SGI static
#else #else
#define LABEL_IS_SGI 0 #define LABEL_IS_SGI 0
@ -100,7 +100,7 @@ enum label_type {
#endif #endif
#if ENABLE_FEATURE_AIX_LABEL #if ENABLE_FEATURE_AIX_LABEL
#define LABEL_IS_AIX (label_aix == current_label_type) #define LABEL_IS_AIX (LABEL_AIX == current_label_type)
#define STATIC_AIX static #define STATIC_AIX static
#else #else
#define LABEL_IS_AIX 0 #define LABEL_IS_AIX 0
@ -108,14 +108,14 @@ enum label_type {
#endif #endif
#if ENABLE_FEATURE_OSF_LABEL #if ENABLE_FEATURE_OSF_LABEL
#define LABEL_IS_OSF (label_osf == current_label_type) #define LABEL_IS_OSF (LABEL_OSF == current_label_type)
#define STATIC_OSF static #define STATIC_OSF static
#else #else
#define LABEL_IS_OSF 0 #define LABEL_IS_OSF 0
#define STATIC_OSF extern #define STATIC_OSF extern
#endif #endif
enum action { fdisk, require, try_only, create_empty_dos, create_empty_sun }; enum action { OPEN_MAIN, TRY_ONLY, CREATE_EMPTY_DOS, CREATE_EMPTY_SUN };
static void update_units(void); static void update_units(void);
#if ENABLE_FEATURE_FDISK_WRITABLE #if ENABLE_FEATURE_FDISK_WRITABLE
@ -263,14 +263,15 @@ static const char *const i386_sys_types[] = {
NULL NULL
}; };
enum {
dev_fd = 3 /* the disk */
};
/* Globals */ /* Globals */
struct globals { struct globals {
char *line_ptr; char *line_ptr;
const char *disk_device; const char *disk_device;
int fd; /* the disk */
int g_partitions; // = 4; /* maximum partition + 1 */ int g_partitions; // = 4; /* maximum partition + 1 */
unsigned units_per_sector; // = 1; unsigned units_per_sector; // = 1;
unsigned sector_size; // = DEFAULT_SECTOR_SIZE; unsigned sector_size; // = DEFAULT_SECTOR_SIZE;
@ -295,7 +296,6 @@ struct globals {
#define G (*ptr_to_globals) #define G (*ptr_to_globals)
#define line_ptr (G.line_ptr) #define line_ptr (G.line_ptr)
#define disk_device (G.disk_device ) #define disk_device (G.disk_device )
#define fd (G.fd )
#define g_partitions (G.g_partitions ) #define g_partitions (G.g_partitions )
#define units_per_sector (G.units_per_sector ) #define units_per_sector (G.units_per_sector )
#define sector_size (G.sector_size ) #define sector_size (G.sector_size )
@ -323,7 +323,7 @@ struct globals {
/* TODO: move to libbb? */ /* TODO: move to libbb? */
static ullong bb_BLKGETSIZE_sectors(void) static ullong bb_BLKGETSIZE_sectors(int fd)
{ {
uint64_t v64; uint64_t v64;
unsigned long longsectors; unsigned long longsectors;
@ -642,9 +642,6 @@ get_nr_sects(const struct partition *p)
return read4_little_endian(p->size4); return read4_little_endian(p->size4);
} }
/* normally O_RDWR, -l option gives O_RDONLY */
static int type_open = O_RDWR;
static int ext_index; /* the prime extended partition */ static int ext_index; /* the prime extended partition */
static smallint listing; /* no aborts for fdisk -l */ static smallint listing; /* no aborts for fdisk -l */
static smallint dos_compatible_flag = 1; static smallint dos_compatible_flag = 1;
@ -663,7 +660,7 @@ static ullong total_number_of_sectors;
static void fdisk_fatal(const char *why) static void fdisk_fatal(const char *why)
{ {
if (listing) { if (listing) {
close(fd); close(dev_fd);
longjmp(listingbuf, 1); longjmp(listingbuf, 1);
} }
bb_error_msg_and_die(why, disk_device); bb_error_msg_and_die(why, disk_device);
@ -674,11 +671,11 @@ seek_sector(ullong secno)
{ {
secno *= sector_size; secno *= sector_size;
#if ENABLE_FDISK_SUPPORT_LARGE_DISKS #if ENABLE_FDISK_SUPPORT_LARGE_DISKS
if (lseek64(fd, (off64_t)secno, SEEK_SET) == (off64_t) -1) if (lseek64(dev_fd, (off64_t)secno, SEEK_SET) == (off64_t) -1)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
#else #else
if (secno > MAXINT(off_t) if (secno > MAXINT(off_t)
|| lseek(fd, (off_t)secno, SEEK_SET) == (off_t) -1 || lseek(dev_fd, (off_t)secno, SEEK_SET) == (off_t) -1
) { ) {
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
} }
@ -690,7 +687,7 @@ static void
write_sector(ullong secno, char *buf) write_sector(ullong secno, char *buf)
{ {
seek_sector(secno); seek_sector(secno);
if (write(fd, buf, sector_size) != sector_size) if (write(dev_fd, buf, sector_size) != sector_size)
fdisk_fatal(unable_to_write); fdisk_fatal(unable_to_write);
} }
#endif #endif
@ -702,7 +699,7 @@ read_pte(struct pte *pe, ullong offset)
pe->offset = offset; pe->offset = offset;
pe->sectorbuffer = xmalloc(sector_size); pe->sectorbuffer = xmalloc(sector_size);
seek_sector(offset); seek_sector(offset);
if (read(fd, pe->sectorbuffer, sector_size) != sector_size) if (read(dev_fd, pe->sectorbuffer, sector_size) != sector_size)
fdisk_fatal(unable_to_read); fdisk_fatal(unable_to_read);
#if ENABLE_FEATURE_FDISK_WRITABLE #if ENABLE_FEATURE_FDISK_WRITABLE
pe->changed = 0; pe->changed = 0;
@ -1126,7 +1123,7 @@ create_doslabel(void)
printf(msg_building_new_label, "DOS disklabel"); printf(msg_building_new_label, "DOS disklabel");
current_label_type = label_dos; current_label_type = LABEL_DOS;
#if ENABLE_FEATURE_OSF_LABEL #if ENABLE_FEATURE_OSF_LABEL
possibly_osf_label = 0; possibly_osf_label = 0;
@ -1139,7 +1136,7 @@ create_doslabel(void)
extended_offset = 0; extended_offset = 0;
set_all_unchanged(); set_all_unchanged();
set_changed(0); set_changed(0);
get_boot(create_empty_dos); get_boot(CREATE_EMPTY_DOS);
} }
#endif /* FEATURE_FDISK_WRITABLE */ #endif /* FEATURE_FDISK_WRITABLE */
@ -1148,7 +1145,7 @@ get_sectorsize(void)
{ {
if (!user_set_sector_size) { if (!user_set_sector_size) {
int arg; int arg;
if (ioctl(fd, BLKSSZGET, &arg) == 0) if (ioctl(dev_fd, BLKSSZGET, &arg) == 0)
sector_size = arg; sector_size = arg;
if (sector_size != DEFAULT_SECTOR_SIZE) if (sector_size != DEFAULT_SECTOR_SIZE)
printf("Note: sector size is %d (not %d)\n", printf("Note: sector size is %d (not %d)\n",
@ -1161,7 +1158,7 @@ get_kernel_geometry(void)
{ {
struct hd_geometry geometry; struct hd_geometry geometry;
if (!ioctl(fd, HDIO_GETGEO, &geometry)) { if (!ioctl(dev_fd, HDIO_GETGEO, &geometry)) {
kern_heads = geometry.heads; kern_heads = geometry.heads;
kern_sectors = geometry.sectors; kern_sectors = geometry.sectors;
/* never use geometry.cylinders - it is truncated */ /* never use geometry.cylinders - it is truncated */
@ -1224,7 +1221,7 @@ get_geometry(void)
g_sectors = user_sectors ? user_sectors : g_sectors = user_sectors ? user_sectors :
pt_sectors ? pt_sectors : pt_sectors ? pt_sectors :
kern_sectors ? kern_sectors : 63; kern_sectors ? kern_sectors : 63;
total_number_of_sectors = bb_BLKGETSIZE_sectors(); total_number_of_sectors = bb_BLKGETSIZE_sectors(dev_fd);
sector_offset = 1; sector_offset = 1;
if (dos_compatible_flag) if (dos_compatible_flag)
@ -1236,7 +1233,9 @@ get_geometry(void)
} }
/* /*
* Read MBR. Returns: * Opens disk_device and optionally reads MBR.
* FIXME: document what each 'what' value will do!
* Returns:
* -1: no 0xaa55 flag present (possibly entire disk BSD) * -1: no 0xaa55 flag present (possibly entire disk BSD)
* 0: found or created label * 0: found or created label
* 1: I/O error * 1: I/O error
@ -1248,82 +1247,80 @@ static int get_boot(void)
#define get_boot(what) get_boot() #define get_boot(what) get_boot()
#endif #endif
{ {
int i; int i, fd;
g_partitions = 4; g_partitions = 4;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
struct pte *pe = &ptes[i]; struct pte *pe = &ptes[i];
pe->part_table = pt_offset(MBRbuffer, i); pe->part_table = pt_offset(MBRbuffer, i);
pe->ext_pointer = NULL; pe->ext_pointer = NULL;
pe->offset = 0; pe->offset = 0;
pe->sectorbuffer = MBRbuffer; pe->sectorbuffer = MBRbuffer;
#if ENABLE_FEATURE_FDISK_WRITABLE #if ENABLE_FEATURE_FDISK_WRITABLE
pe->changed = (what == create_empty_dos); pe->changed = (what == CREATE_EMPTY_DOS);
#endif #endif
} }
#if ENABLE_FEATURE_SUN_LABEL
if (what == create_empty_sun && check_sun_label())
return 0;
#endif
memset(MBRbuffer, 0, 512);
#if ENABLE_FEATURE_FDISK_WRITABLE #if ENABLE_FEATURE_FDISK_WRITABLE
if (what == create_empty_dos) // ALERT! highly idiotic design!
goto got_dos_table; /* skip reading disk */ // We end up here when we call get_boot() recursively
// via get_boot() [table is bad] -> create_doslabel() -> get_boot(CREATE_EMPTY_DOS).
// or get_boot() [table is bad] -> create_sunlabel() -> get_boot(CREATE_EMPTY_SUN).
// (just factor out re-init of ptes[0,1,2,3] in a separate fn instead?)
// So skip opening device _again_...
if (what == CREATE_EMPTY_DOS USE_FEATURE_SUN_LABEL(|| what == CREATE_EMPTY_SUN))
goto created_table;
fd = open(disk_device, (option_mask32 & OPT_l) ? O_RDONLY : O_RDWR);
fd = open(disk_device, type_open);
if (fd < 0) { if (fd < 0) {
fd = open(disk_device, O_RDONLY); fd = open(disk_device, O_RDONLY);
if (fd < 0) { if (fd < 0) {
if (what == try_only) if (what == TRY_ONLY)
return 1; return 1;
fdisk_fatal(unable_to_open); fdisk_fatal(unable_to_open);
} else }
printf("You will not be able to write " xmove_fd(fd, dev_fd);
"the partition table\n"); printf("'%s' is opened for read only\n", disk_device);
} }
if (512 != read(dev_fd, MBRbuffer, 512)) {
if (512 != read(fd, MBRbuffer, 512)) { if (what == TRY_ONLY) {
if (what == try_only) close(dev_fd);
return 1; return 1;
}
fdisk_fatal(unable_to_read); fdisk_fatal(unable_to_read);
} }
#else #else
fd = open(disk_device, O_RDONLY); fd = open(disk_device, O_RDONLY);
if (fd < 0) if (fd < 0)
return 1; return 1;
if (512 != read(fd, MBRbuffer, 512)) if (512 != read(fd, MBRbuffer, 512)) {
close(fd);
return 1; return 1;
}
xmove_fd(fd, dev_fd);
#endif #endif
get_geometry(); get_geometry();
update_units(); update_units();
#if ENABLE_FEATURE_SUN_LABEL #if ENABLE_FEATURE_SUN_LABEL
if (check_sun_label()) if (check_sun_label())
return 0; return 0;
#endif #endif
#if ENABLE_FEATURE_SGI_LABEL #if ENABLE_FEATURE_SGI_LABEL
if (check_sgi_label()) if (check_sgi_label())
return 0; return 0;
#endif #endif
#if ENABLE_FEATURE_AIX_LABEL #if ENABLE_FEATURE_AIX_LABEL
if (check_aix_label()) if (check_aix_label())
return 0; return 0;
#endif #endif
#if ENABLE_FEATURE_OSF_LABEL #if ENABLE_FEATURE_OSF_LABEL
if (check_osf_label()) { if (check_osf_label()) {
possibly_osf_label = 1; possibly_osf_label = 1;
if (!valid_part_table_flag(MBRbuffer)) { if (!valid_part_table_flag(MBRbuffer)) {
current_label_type = label_osf; current_label_type = LABEL_OSF;
return 0; return 0;
} }
printf("This disk has both DOS and BSD magic.\n" printf("This disk has both DOS and BSD magic.\n"
@ -1331,49 +1328,34 @@ static int get_boot(void)
} }
#endif #endif
#if ENABLE_FEATURE_FDISK_WRITABLE
got_dos_table:
#endif
if (!valid_part_table_flag(MBRbuffer)) {
#if !ENABLE_FEATURE_FDISK_WRITABLE #if !ENABLE_FEATURE_FDISK_WRITABLE
if (!valid_part_table_flag(MBRbuffer))
return -1; return -1;
#else #else
switch (what) { if (!valid_part_table_flag(MBRbuffer)) {
case fdisk: if (what == OPEN_MAIN) {
printf("Device contains neither a valid DOS " printf("Device contains neither a valid DOS "
"partition table, nor Sun, SGI or OSF " "partition table, nor Sun, SGI or OSF "
"disklabel\n"); "disklabel\n");
#ifdef __sparc__ #ifdef __sparc__
#if ENABLE_FEATURE_SUN_LABEL USE_FEATURE_SUN_LABEL(create_sunlabel();)
create_sunlabel();
#endif
#else #else
create_doslabel(); create_doslabel();
#endif #endif
return 0; return 0;
case try_only:
return -1;
case create_empty_dos:
#if ENABLE_FEATURE_SUN_LABEL
case create_empty_sun:
#endif
break;
default:
bb_error_msg_and_die("internal error");
} }
#endif /* FEATURE_FDISK_WRITABLE */ /* TRY_ONLY: */
return -1;
} }
created_table:
#endif /* FEATURE_FDISK_WRITABLE */
#if ENABLE_FEATURE_FDISK_WRITABLE
warn_cylinders(); USE_FEATURE_FDISK_WRITABLE(warn_cylinders();)
#endif
warn_geometry(); warn_geometry();
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
struct pte *pe = &ptes[i]; if (IS_EXTENDED(ptes[i].part_table->sys_ind)) {
if (IS_EXTENDED(pe->part_table->sys_ind)) {
if (g_partitions != 4) if (g_partitions != 4)
printf("Ignoring extra extended " printf("Ignoring extra extended "
"partition %d\n", i + 1); "partition %d\n", i + 1);
@ -1384,16 +1366,13 @@ static int get_boot(void)
for (i = 3; i < g_partitions; i++) { for (i = 3; i < g_partitions; i++) {
struct pte *pe = &ptes[i]; struct pte *pe = &ptes[i];
if (!valid_part_table_flag(pe->sectorbuffer)) { if (!valid_part_table_flag(pe->sectorbuffer)) {
printf("Warning: invalid flag 0x%02x,0x%02x of partition " printf("Warning: invalid flag 0x%02x,0x%02x of partition "
"table %d will be corrected by w(rite)\n", "table %d will be corrected by w(rite)\n",
pe->sectorbuffer[510], pe->sectorbuffer[510],
pe->sectorbuffer[511], pe->sectorbuffer[511],
i + 1); i + 1);
#if ENABLE_FEATURE_FDISK_WRITABLE USE_FEATURE_FDISK_WRITABLE(pe->changed = 1;)
pe->changed = 1;
#endif
} }
} }
@ -2474,7 +2453,7 @@ reread_partition_table(int leave)
printf("Calling ioctl() to re-read partition table\n"); printf("Calling ioctl() to re-read partition table\n");
sync(); sync();
/* sleep(2); Huh? */ /* sleep(2); Huh? */
i = ioctl_or_perror(fd, BLKRRPART, NULL, i = ioctl_or_perror(dev_fd, BLKRRPART, NULL,
"WARNING: rereading partition table " "WARNING: rereading partition table "
"failed, kernel still uses old table"); "failed, kernel still uses old table");
#if 0 #if 0
@ -2487,7 +2466,7 @@ reread_partition_table(int leave)
if (leave) { if (leave) {
if (ENABLE_FEATURE_CLEAN_UP) if (ENABLE_FEATURE_CLEAN_UP)
close(fd); close(dev_fd);
exit(i != 0); exit(i != 0);
} }
} }
@ -2619,7 +2598,8 @@ xselect(void)
x_list_table(0); x_list_table(0);
break; break;
case 'q': case 'q':
close(fd); if (ENABLE_FEATURE_CLEAN_UP)
close(dev_fd);
bb_putchar('\n'); bb_putchar('\n');
exit(0); exit(0);
case 'r': case 'r':
@ -2687,7 +2667,7 @@ is_ide_cdrom_or_tape(const char *device)
static void static void
trydev(const char *device, int user_specified) open_list_and_close(const char *device, int user_specified)
{ {
int gb; int gb;
@ -2697,46 +2677,44 @@ trydev(const char *device, int user_specified)
if (!user_specified) if (!user_specified)
if (is_ide_cdrom_or_tape(device)) if (is_ide_cdrom_or_tape(device))
return; return;
fd = open(disk_device, type_open);
if (fd >= 0) { /* Open disk_device, save file descriptor to dev_fd */
gb = get_boot(try_only); errno = 0;
if (gb > 0) { /* I/O error */ gb = get_boot(TRY_ONLY);
close(fd); if (gb > 0) { /* I/O error */
} else if (gb < 0) { /* no DOS signature */
list_disk_geometry();
if (LABEL_IS_AIX) {
return;
}
#if ENABLE_FEATURE_OSF_LABEL
if (bsd_trydev(device) < 0)
#endif
printf("Disk %s doesn't contain a valid "
"partition table\n", device);
close(fd);
} else {
close(fd);
list_table(0);
#if ENABLE_FEATURE_FDISK_WRITABLE
if (!LABEL_IS_SUN && g_partitions > 4){
delete_partition(ext_index);
}
#endif
}
} else {
/* Ignore other errors, since we try IDE /* Ignore other errors, since we try IDE
and SCSI hard disks which may not be and SCSI hard disks which may not be
installed on the system. */ installed on the system. */
if (errno == EACCES) { if (user_specified || errno == EACCES)
printf("Cannot open %s\n", device); bb_perror_msg("can't open '%s'", device);
return; return;
}
} }
if (gb < 0) { /* no DOS signature */
list_disk_geometry();
if (LABEL_IS_AIX)
goto ret;
#if ENABLE_FEATURE_OSF_LABEL
if (bsd_trydev(device) < 0)
#endif
printf("Disk %s doesn't contain a valid "
"partition table\n", device);
} else {
list_table(0);
#if ENABLE_FEATURE_FDISK_WRITABLE
if (!LABEL_IS_SUN && g_partitions > 4) {
delete_partition(ext_index);
}
#endif
}
ret:
close(dev_fd);
} }
/* for fdisk -l: try all things in /proc/partitions /* for fdisk -l: try all things in /proc/partitions
that look like a partition name (do not end in a digit) */ that look like a partition name (do not end in a digit) */
static void static void
tryprocpt(void) list_devs_in_proc_partititons(void)
{ {
FILE *procpt; FILE *procpt;
char line[100], ptname[100], devname[120], *s; char line[100], ptname[100], devname[120], *s;
@ -2753,7 +2731,7 @@ tryprocpt(void)
if (isdigit(s[-1])) if (isdigit(s[-1]))
continue; continue;
sprintf(devname, "/dev/%s", ptname); sprintf(devname, "/dev/%s", ptname);
trydev(devname, 0); open_list_and_close(devname, 0);
} }
#if ENABLE_FEATURE_CLEAN_UP #if ENABLE_FEATURE_CLEAN_UP
fclose(procpt); fclose(procpt);
@ -2792,6 +2770,8 @@ int fdisk_main(int argc, char **argv)
INIT_G(); INIT_G();
close(dev_fd); /* just in case */
opt_complementary = "b+:C+:H+:S+"; /* numeric params */ opt_complementary = "b+:C+:H+:S+"; /* numeric params */
opt = getopt32(argv, "b:C:H:lS:u" USE_FEATURE_FDISK_BLKSIZE("s"), opt = getopt32(argv, "b:C:H:lS:u" USE_FEATURE_FDISK_BLKSIZE("s"),
&sector_size, &user_cylinders, &user_heads, &user_sectors); &sector_size, &user_cylinders, &user_heads, &user_sectors);
@ -2819,16 +2799,15 @@ int fdisk_main(int argc, char **argv)
if (opt & OPT_l) { if (opt & OPT_l) {
nowarn = 1; nowarn = 1;
#endif #endif
type_open = O_RDONLY;
if (*argv) { if (*argv) {
listing = 1; listing = 1;
do { do {
trydev(*argv, 1); open_list_and_close(*argv, 1);
} while (*++argv); } while (*++argv);
} else { } else {
/* we don't have device names, */ /* we don't have device names, */
/* use /proc/partitions instead */ /* use /proc/partitions instead */
tryprocpt(); list_devs_in_proc_partititons();
} }
return 0; return 0;
#if ENABLE_FEATURE_FDISK_WRITABLE #if ENABLE_FEATURE_FDISK_WRITABLE
@ -2845,7 +2824,7 @@ int fdisk_main(int argc, char **argv)
for (j = 0; j < argc; j++) { for (j = 0; j < argc; j++) {
unsigned long long size; unsigned long long size;
fd = xopen(argv[j], O_RDONLY); fd = xopen(argv[j], O_RDONLY);
size = bb_BLKGETSIZE_sectors() / 2; size = bb_BLKGETSIZE_sectors(fd) / 2;
close(fd); close(fd);
if (argc == 1) if (argc == 1)
printf("%lld\n", size); printf("%lld\n", size);
@ -2861,7 +2840,7 @@ int fdisk_main(int argc, char **argv)
bb_show_usage(); bb_show_usage();
disk_device = argv[0]; disk_device = argv[0];
get_boot(fdisk); get_boot(OPEN_MAIN);
if (LABEL_IS_OSF) { if (LABEL_IS_OSF) {
/* OSF label, and no DOS label */ /* OSF label, and no DOS label */
@ -2869,7 +2848,7 @@ int fdisk_main(int argc, char **argv)
"disklabel mode\n", disk_device); "disklabel mode\n", disk_device);
bsd_select(); bsd_select();
/*Why do we do this? It seems to be counter-intuitive*/ /*Why do we do this? It seems to be counter-intuitive*/
current_label_type = label_dos; current_label_type = LABEL_DOS;
/* If we return we may want to make an empty DOS label? */ /* If we return we may want to make an empty DOS label? */
} }
@ -2954,7 +2933,7 @@ int fdisk_main(int argc, char **argv)
list_table(0); list_table(0);
break; break;
case 'q': case 'q':
close(fd); close(dev_fd);
bb_putchar('\n'); bb_putchar('\n');
return 0; return 0;
case 's': case 's':

View File

@ -62,7 +62,7 @@ check_aix_label(void)
} }
aix_other_endian = (aixlabel->magic == AIX_LABEL_MAGIC_SWAPPED); aix_other_endian = (aixlabel->magic == AIX_LABEL_MAGIC_SWAPPED);
update_units(); update_units();
current_label_type = label_aix; current_label_type = LABEL_AIX;
g_partitions = 1016; g_partitions = 1016;
aix_volumes = 15; aix_volumes = 15;
aix_info(); aix_info();

View File

@ -413,7 +413,8 @@ bsd_select(void)
xbsd_print_disklabel(0); xbsd_print_disklabel(0);
break; break;
case 'q': case 'q':
close(fd); if (ENABLE_FEATURE_CLEAN_UP)
close(dev_fd);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
case 'r': case 'r':
return; return;
@ -627,12 +628,13 @@ xbsd_create_disklabel(void)
#else #else
xbsd_part xbsd_part
#endif #endif
) == 1) { ) == 1) {
xbsd_print_disklabel(1); xbsd_print_disklabel(1);
return 1; return 1;
} else }
return 0; return 0;
} else if (c == 'n') }
if (c == 'n')
return 0; return 0;
} }
} }
@ -766,9 +768,9 @@ xbsd_write_bootstrap(void)
sector = get_start_sect(xbsd_part); sector = get_start_sect(xbsd_part);
#endif #endif
if (lseek(fd, sector * SECTOR_SIZE, SEEK_SET) == -1) if (lseek(dev_fd, sector * SECTOR_SIZE, SEEK_SET) == -1)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
if (BSD_BBSIZE != write(fd, disklabelbuffer, BSD_BBSIZE)) if (BSD_BBSIZE != write(dev_fd, disklabelbuffer, BSD_BBSIZE))
fdisk_fatal(unable_to_write); fdisk_fatal(unable_to_write);
#if defined(__alpha__) #if defined(__alpha__)
@ -939,9 +941,9 @@ xbsd_readlabel(struct partition *p)
sector = 0; sector = 0;
#endif #endif
if (lseek(fd, sector * SECTOR_SIZE, SEEK_SET) == -1) if (lseek(dev_fd, sector * SECTOR_SIZE, SEEK_SET) == -1)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
if (BSD_BBSIZE != read(fd, disklabelbuffer, BSD_BBSIZE)) if (BSD_BBSIZE != read(dev_fd, disklabelbuffer, BSD_BBSIZE))
fdisk_fatal(unable_to_read); fdisk_fatal(unable_to_read);
memmove(d, &disklabelbuffer[BSD_LABELSECTOR * SECTOR_SIZE + BSD_LABELOFFSET], memmove(d, &disklabelbuffer[BSD_LABELSECTOR * SECTOR_SIZE + BSD_LABELOFFSET],
@ -985,14 +987,14 @@ xbsd_writelabel(struct partition *p)
#if defined(__alpha__) && BSD_LABELSECTOR == 0 #if defined(__alpha__) && BSD_LABELSECTOR == 0
alpha_bootblock_checksum(disklabelbuffer); alpha_bootblock_checksum(disklabelbuffer);
if (lseek(fd, 0, SEEK_SET) == -1) if (lseek(dev_fd, 0, SEEK_SET) == -1)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
if (BSD_BBSIZE != write(fd, disklabelbuffer, BSD_BBSIZE)) if (BSD_BBSIZE != write(dev_fd, disklabelbuffer, BSD_BBSIZE))
fdisk_fatal(unable_to_write); fdisk_fatal(unable_to_write);
#else #else
if (lseek(fd, sector * SECTOR_SIZE + BSD_LABELOFFSET, SEEK_SET) == -1) if (lseek(dev_fd, sector * SECTOR_SIZE + BSD_LABELOFFSET, SEEK_SET) == -1)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
if (sizeof(struct xbsd_disklabel) != write(fd, d, sizeof(struct xbsd_disklabel))) if (sizeof(struct xbsd_disklabel) != write(dev_fd, d, sizeof(struct xbsd_disklabel)))
fdisk_fatal(unable_to_write); fdisk_fatal(unable_to_write);
#endif #endif
sync_disks(); sync_disks();

View File

@ -235,7 +235,7 @@ check_sgi_label(void)
if (sgilabel->magic != SGI_LABEL_MAGIC if (sgilabel->magic != SGI_LABEL_MAGIC
&& sgilabel->magic != SGI_LABEL_MAGIC_SWAPPED && sgilabel->magic != SGI_LABEL_MAGIC_SWAPPED
) { ) {
current_label_type = label_dos; current_label_type = LABEL_DOS;
return 0; return 0;
} }
@ -248,7 +248,7 @@ check_sgi_label(void)
printf("Detected sgi disklabel with wrong checksum\n"); printf("Detected sgi disklabel with wrong checksum\n");
} }
update_units(); update_units();
current_label_type = label_sgi; current_label_type = LABEL_SGI;
g_partitions = 16; g_partitions = 16;
sgi_volumes = 15; sgi_volumes = 15;
return 1; return 1;
@ -439,9 +439,9 @@ sgi_write_table(void)
assert(two_s_complement_32bit_sum( assert(two_s_complement_32bit_sum(
(unsigned int*)sgilabel, sizeof(*sgilabel)) == 0); (unsigned int*)sgilabel, sizeof(*sgilabel)) == 0);
if (lseek(fd, 0, SEEK_SET) < 0) if (lseek(dev_fd, 0, SEEK_SET) < 0)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
if (write(fd, sgilabel, SECTOR_SIZE) != SECTOR_SIZE) if (write(dev_fd, sgilabel, SECTOR_SIZE) != SECTOR_SIZE)
fdisk_fatal(unable_to_write); fdisk_fatal(unable_to_write);
if (!strncmp((char*)sgilabel->directory[0].vol_file_name, "sgilabel", 8)) { if (!strncmp((char*)sgilabel->directory[0].vol_file_name, "sgilabel", 8)) {
/* /*
@ -450,9 +450,9 @@ sgi_write_table(void)
*/ */
sgiinfo *info = fill_sgiinfo(); sgiinfo *info = fill_sgiinfo();
int infostartblock = SGI_SSWAP32(sgilabel->directory[0].vol_file_start); int infostartblock = SGI_SSWAP32(sgilabel->directory[0].vol_file_start);
if (lseek(fd, infostartblock*SECTOR_SIZE, SEEK_SET) < 0) if (lseek(dev_fd, infostartblock*SECTOR_SIZE, SEEK_SET) < 0)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
if (write(fd, info, SECTOR_SIZE) != SECTOR_SIZE) if (write(dev_fd, info, SECTOR_SIZE) != SECTOR_SIZE)
fdisk_fatal(unable_to_write); fdisk_fatal(unable_to_write);
free(info); free(info);
} }
@ -782,8 +782,8 @@ create_sgilabel(void)
printf(msg_building_new_label, "SGI disklabel"); printf(msg_building_new_label, "SGI disklabel");
sgi_other_endian = BB_LITTLE_ENDIAN; sgi_other_endian = BB_LITTLE_ENDIAN;
res = ioctl(fd, BLKGETSIZE, &longsectors); res = ioctl(dev_fd, BLKGETSIZE, &longsectors);
if (!ioctl(fd, HDIO_GETGEO, &geometry)) { if (!ioctl(dev_fd, HDIO_GETGEO, &geometry)) {
g_heads = geometry.heads; g_heads = geometry.heads;
g_sectors = geometry.sectors; g_sectors = geometry.sectors;
if (res == 0) { if (res == 0) {
@ -851,7 +851,7 @@ create_sgilabel(void)
//sgilabel->devparam.xylogics_writecont = SGI_SSWAP16(0); //sgilabel->devparam.xylogics_writecont = SGI_SSWAP16(0);
//memset( &(sgilabel->directory), 0, sizeof(struct volume_directory)*15 ); //memset( &(sgilabel->directory), 0, sizeof(struct volume_directory)*15 );
//memset( &(sgilabel->partitions), 0, sizeof(struct sgi_partinfo)*16 ); //memset( &(sgilabel->partitions), 0, sizeof(struct sgi_partinfo)*16 );
current_label_type = label_sgi; current_label_type = LABEL_SGI;
g_partitions = 16; g_partitions = 16;
sgi_volumes = 15; sgi_volumes = 15;
sgi_set_entire(); sgi_set_entire();

View File

@ -42,7 +42,7 @@ guess_device_type(void)
{ {
struct stat bootstat; struct stat bootstat;
if (fstat(fd, &bootstat) < 0) { if (fstat(dev_fd, &bootstat) < 0) {
scsi_disk = 0; scsi_disk = 0;
floppy = 0; floppy = 0;
} else if (S_ISBLK(bootstat.st_mode) } else if (S_ISBLK(bootstat.st_mode)
@ -98,7 +98,7 @@ check_sun_label(void)
if (sunlabel->magic != SUN_LABEL_MAGIC if (sunlabel->magic != SUN_LABEL_MAGIC
&& sunlabel->magic != SUN_LABEL_MAGIC_SWAPPED) { && sunlabel->magic != SUN_LABEL_MAGIC_SWAPPED) {
current_label_type = label_dos; current_label_type = LABEL_DOS;
sun_other_endian = 0; sun_other_endian = 0;
return 0; return 0;
} }
@ -116,7 +116,7 @@ check_sun_label(void)
g_sectors = SUN_SSWAP16(sunlabel->nsect); g_sectors = SUN_SSWAP16(sunlabel->nsect);
} }
update_units(); update_units();
current_label_type = label_sun; current_label_type = LABEL_SUN;
g_partitions = 8; g_partitions = 8;
return 1; return 1;
} }
@ -168,7 +168,7 @@ sun_autoconfigure_scsi(void)
char *q; char *q;
int i; int i;
if (ioctl(fd, SCSI_IOCTL_GET_IDLUN, &id)) if (ioctl(dev_fd, SCSI_IOCTL_GET_IDLUN, &id))
return NULL; return NULL;
sprintf(buffer, sprintf(buffer,
@ -272,7 +272,7 @@ create_sunlabel(void)
} }
} }
if (!p || floppy) { if (!p || floppy) {
if (!ioctl(fd, HDIO_GETGEO, &geometry)) { if (!ioctl(dev_fd, HDIO_GETGEO, &geometry)) {
g_heads = geometry.heads; g_heads = geometry.heads;
g_sectors = geometry.sectors; g_sectors = geometry.sectors;
g_cylinders = geometry.cylinders; g_cylinders = geometry.cylinders;
@ -346,7 +346,7 @@ create_sunlabel(void)
set_all_unchanged(); set_all_unchanged();
set_changed(0); set_changed(0);
get_boot(create_empty_sun); get_boot(CREATE_EMPTY_SUN);
} }
static void static void
@ -722,9 +722,9 @@ sun_write_table(void)
while (ush < (unsigned short *)(&sunlabel->csum)) while (ush < (unsigned short *)(&sunlabel->csum))
csum ^= *ush++; csum ^= *ush++;
sunlabel->csum = csum; sunlabel->csum = csum;
if (lseek(fd, 0, SEEK_SET) < 0) if (lseek(dev_fd, 0, SEEK_SET) < 0)
fdisk_fatal(unable_to_seek); fdisk_fatal(unable_to_seek);
if (write(fd, sunlabel, SECTOR_SIZE) != SECTOR_SIZE) if (write(dev_fd, sunlabel, SECTOR_SIZE) != SECTOR_SIZE)
fdisk_fatal(unable_to_write); fdisk_fatal(unable_to_write);
} }
#endif /* SUN_LABEL */ #endif /* SUN_LABEL */