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:
parent
bf8df99191
commit
121dba8508
|
@ -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 */
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue