fdisk: use CDROM_GET_CAPABILITY ioctl

And replace the current archaic logic of is_ide_cdrom_or_tape().

Signed-off-by: Davidlohr Bueso <dave@gnu.org>
This commit is contained in:
Davidlohr Bueso 2011-12-20 14:42:10 +01:00 committed by Karel Zak
parent a4c0cc75ff
commit 3b622ddd72
4 changed files with 38 additions and 56 deletions

View File

@ -2746,37 +2746,16 @@ expert_command_prompt(void)
}
}
static int
is_ide_cdrom_or_tape(char *device) {
FILE *procf;
char buf[100];
struct stat statbuf;
int is_ide = 0;
static int is_ide_cdrom_or_tape(char *device)
{
int fd, ret;
/* No device was given explicitly, and we are trying some
likely things. But opening /dev/hdc may produce errors like
"hdc: tray open or drive not ready"
if it happens to be a CD-ROM drive. It even happens that
the process hangs on the attempt to read a music CD.
So try to be careful. This only works since 2.1.73. */
if (strncmp("/dev/hd", device, 7))
if (fd = open(device, O_RDONLY) < 0)
return 0;
ret = blkdev_is_cdrom(fd);
snprintf(buf, sizeof(buf), "/proc/ide/%s/media", device+5);
procf = fopen(buf, "r");
if (procf != NULL && fgets(buf, sizeof(buf), procf))
is_ide = (!strncmp(buf, "cdrom", 5) ||
!strncmp(buf, "tape", 4));
else
/* Now when this proc file does not exist, skip the
device when it is read-only. */
if (stat(device, &statbuf) == 0)
is_ide = ((statbuf.st_mode & 0222) == 0);
if (procf)
fclose(procf);
return is_ide;
close(fd);
return ret;
}
static void

View File

@ -57,6 +57,7 @@
#include "gpt.h"
#include "pathnames.h"
#include "canonicalize.h"
#include "blkdev.h"
/*
* Table of contents:
@ -2532,36 +2533,16 @@ static const struct option long_opts[] = {
{ NULL, 0, NULL, 0 }
};
static int
is_ide_cdrom_or_tape(char *device) {
FILE *procf;
char buf[100];
struct stat statbuf;
int is_ide = 0;
static int is_ide_cdrom_or_tape(char *device)
{
int fd, ret;
/* No device was given explicitly, and we are trying some
likely things. But opening /dev/hdc may produce errors like
"hdc: tray open or drive not ready"
if it happens to be a CD-ROM drive. It even happens that
the process hangs on the attempt to read a music CD.
So try to be careful. This only works since 2.1.73. */
if (fd = open(device, O_RDONLY) < 0)
return 0;
ret = blkdev_is_cdrom(fd);
if (strncmp("/dev/hd", device, 7))
return 0;
snprintf(buf, sizeof(buf), "/proc/ide/%s/media", device + 5);
procf = fopen(buf, "r");
if (procf != NULL && fgets(buf, sizeof(buf), procf))
is_ide = (!strncmp(buf, "cdrom", 5) || !strncmp(buf, "tape", 4));
else
/* Now when this proc file does not exist, skip the
device when it is read-only. */
if (stat(device, &statbuf) == 0)
is_ide = ((statbuf.st_mode & 0222) == 0);
if (procf)
fclose(procf);
return is_ide;
close(fd);
return ret;
}
static char *

View File

@ -72,6 +72,12 @@
# ifdef __linux__
# define HDIO_GETGEO 0x0301
# endif
/* uniform CD-ROM information */
#ifndef CDROM_GET_CAPABILITY
# define CDROM_GET_CAPABILITY 0x5331
#endif
struct hd_geometry {
unsigned char heads;
unsigned char sectors;
@ -98,4 +104,7 @@ int blkdev_is_misaligned(int fd);
/* get physical block device size */
int blkdev_get_physector_size(int fd, int *sector_size);
/* is the device cdrom capable? */
int blkdev_is_cdrom(int fd);
#endif /* BLKDEV_H */

View File

@ -243,6 +243,19 @@ int blkdev_is_misaligned(int fd)
#endif
}
int blkdev_is_cdrom(int fd)
{
#ifdef CDROM_GET_CAPABILITY
int ret;
if ((ret = ioctl(fd, CDROM_GET_CAPABILITY, NULL)) < 0)
return 0;
else
return ret;
#else
return 0;
#endif
}
#ifdef TEST_PROGRAM
#include <stdio.h>