fdisk: cleanup full disk detection code

The full disk (e.g. /dev/hda) detection code is duplicated on two places and
the code doesn't work correctly with devices which don't support HDIO_GETGEO.

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2007-05-30 17:57:30 +02:00
parent bf8df99191
commit 121dba8508
4 changed files with 39 additions and 34 deletions

View File

@ -1,3 +1,6 @@
#ifndef FDISK_COMMON_H
#define FDISK_COMMON_H
/* common stuff for fdisk, cfdisk, sfdisk */
/* including <linux/fs.h> fails */
@ -19,7 +22,6 @@ struct hd_geometry {
#define HDIO_GETGEO 0x0301 /* get device geometry */
struct systypes {
unsigned char type;
char *name;
@ -28,5 +30,8 @@ struct systypes {
extern struct systypes i386_sys_types[];
extern char *partname(char *dev, int pno, int lth);
extern int is_probably_full_disk(char *name);
int disksize(int fd, unsigned long long *sectors);
#endif /* FDISK_COMMON_H */

View File

@ -1,3 +1,9 @@
#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include "common.h"
@ -19,3 +25,30 @@ int disksize(int fd, unsigned long long *sectors) {
*sectors = (b >> 9);
return 0;
}
int
is_probably_full_disk(char *name) {
#ifdef HDIO_GETGEO
struct hd_geometry geometry;
int fd, i = 0;
fd = open(name, O_RDONLY);
if (fd >= 0) {
i = ioctl(fd, HDIO_GETGEO, &geometry);
close(fd);
}
if (i==0)
return (fd >= 0 && geometry.start == 0);
#endif
/*
* The "silly heuristic" is still sexy for us, because
* for example Xen doesn't implement HDIO_GETGEO for virtual
* block devices (/dev/xvda).
*
* -- kzak@redhat.com (23-Feb-2006)
*/
while (*name)
name++;
return !isdigit(name[-1]);
}

View File

@ -786,26 +786,6 @@ get_kernel_geometry(int fd) {
#endif
}
static int
is_probably_full_disk(char *name) {
#ifdef HDIO_GETGEO
struct hd_geometry geometry;
int fd, i = 0;
fd = open(name, O_RDONLY);
if (fd >= 0) {
i = ioctl(fd, HDIO_GETGEO, &geometry);
close(fd);
}
return (fd >= 0 && i == 0 && geometry.start == 0);
#else
/* silly heuristic */
while (*name)
name++;
return !isdigit(name[-1]);
#endif
}
static void
get_partition_table_geometry(void) {
unsigned char *bufp = MBRbuffer;

View File

@ -2411,19 +2411,6 @@ is_ide_cdrom_or_tape(char *device) {
return is_ide;
}
static int
is_probably_full_disk(char *name) {
struct hd_geometry geometry;
int fd, i = 0;
fd = open(name, O_RDONLY);
if (fd >= 0) {
i = ioctl(fd, HDIO_GETGEO, &geometry);
close(fd);
}
return (fd >= 0 && i == 0 && geometry.start == 0);
}
#define PROC_PARTITIONS "/proc/partitions"
static FILE *procf = NULL;