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:
parent
a4c0cc75ff
commit
3b622ddd72
|
@ -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
|
||||
|
|
|
@ -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 (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 char *
|
||||
|
|
|
@ -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 */
|
||||
|
|
13
lib/blkdev.c
13
lib/blkdev.c
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue