]> err.no Git - util-linux/commitdiff
fdisk: cleanup full disk detection code
authorKarel Zak <kzak@redhat.com>
Wed, 30 May 2007 15:57:30 +0000 (17:57 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 31 May 2007 13:02:13 +0000 (15:02 +0200)
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>
fdisk/common.h
fdisk/disksize.c
fdisk/fdisk.c
fdisk/sfdisk.c

index 7c1c3cd381852fcaef3ada24a29eb5f4860d94a4..71eecc4e773b018373ca5604d754a9889bee890f 100644 (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 */
index 28b8df0a5d5d5e7b446917527044a94f507df6b8..cc00e9338557b6a00a3b5dc32a8607fdc7a8808f 100644 (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]);
+}
+
index abc0e1106f7d1beeced256d4666cd5a4efbb544c..c4f6458c33e6a17aa5b5aae3b3b286d12fbd3229 100644 (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;
index 6e9e5697ad01ce9b1756004509be0f2e262719a3..d2155357590e366729ad12a95e78f4ac0069ecc1 100644 (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;