chiark / gitweb /
Revert special casing 0xD8 to latitude XT only
[elogind.git] / extras / cdrom_id / cdrom_id.c
index 371d6a2dbd197898c69d381d2cee4fe5267662b5..e485768de41154488a3b4d659dbfb8fd47e629bd 100644 (file)
@@ -37,7 +37,8 @@
 #include <sys/ioctl.h>
 #include <linux/cdrom.h>
 
-#include "../../udev/udev.h"
+#include "libudev.h"
+#include "libudev-private.h"
 
 static int debug;
 
@@ -111,6 +112,30 @@ static unsigned long long int cd_media_session_last_offset;
 #define ASC(errcode)   (((errcode) >> 8) & 0xFF)
 #define ASCQ(errcode)  ((errcode) & 0xFF)
 
+static int is_mounted(const char *device)
+{
+       struct stat statbuf;
+       FILE *fp;
+       int maj, min;
+       int mounted = 0;
+
+       if (stat(device, &statbuf) < 0)
+               return -ENODEV;
+
+       fp = fopen("/proc/self/mountinfo", "r");
+       if (fp == NULL)
+               return -ENOSYS;
+       while (fscanf(fp, "%*s %*s %i:%i %*[^\n]", &maj, &min) == 2) {
+               printf("got %u %u\n", maj, min);
+               if (makedev(maj, min) == statbuf.st_rdev) {
+                       mounted = 1;
+                       break;
+               }
+       }
+       fclose(fp);
+       return mounted;
+}
+
 static void info_scsi_cmd_err(struct udev *udev, char *cmd, int err)
 {
        if (err == -1) {
@@ -172,31 +197,41 @@ static int scsi_cmd_run(struct udev *udev, struct scsi_cmd *cmd, int fd, unsigne
 
 static int cd_capability_compat(struct udev *udev, int fd)
 {
-       int capabilty;
+       int capability;
 
-       capabilty = ioctl(fd, CDROM_GET_CAPABILITY, NULL);
-       if (capabilty < 0) {
+       capability = ioctl(fd, CDROM_GET_CAPABILITY, NULL);
+       if (capability < 0) {
                info(udev, "CDROM_GET_CAPABILITY failed\n");
                return -1;
        }
 
-       if (capabilty & CDC_CD_R)
+       if (capability & CDC_CD_R)
                cd_cd_r = 1;
-       if (capabilty & CDC_CD_RW)
+       if (capability & CDC_CD_RW)
                cd_cd_rw = 1;
-       if (capabilty & CDC_DVD)
+       if (capability & CDC_DVD)
                cd_dvd_rom = 1;
-       if (capabilty & CDC_DVD_R)
+       if (capability & CDC_DVD_R)
                cd_dvd_r = 1;
-       if (capabilty & CDC_DVD_RAM)
+       if (capability & CDC_DVD_RAM)
                cd_dvd_ram = 1;
-       if (capabilty & CDC_MRW)
+       if (capability & CDC_MRW)
                cd_mrw = 1;
-       if (capabilty & CDC_MRW_W)
+       if (capability & CDC_MRW_W)
                cd_mrw_w = 1;
        return 0;
 }
 
+static int cd_media_compat(struct udev *udev, int fd)
+{
+       if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) != CDS_DISC_OK) {
+               info(udev, "CDROM_DRIVE_STATUS != CDS_DISC_OK\n");
+               return -1;
+       }
+       cd_media = 1;
+       return 0;
+}
+
 static int cd_inquiry(struct udev *udev, int fd) {
        struct scsi_cmd sc;
        unsigned char inq[128];
@@ -416,8 +451,10 @@ static int cd_media_info(struct udev *udev, int fd)
 
        info(udev, "disk type %02x\n", header[8]);
 
-       if ((header[2] & 3) < 4)
+       /* exclude plain CDROM, some fake cdroms return 0 for "blank" media here */
+       if (!cd_media_cd_rom && (header[2] & 3) < 4)
                cd_media_state = media_status[header[2] & 3];
+
        if ((header[2] & 3) != 2)
                cd_media_session_next = header[10] << 8 | header[5];
        cd_media_session_count = header[9] << 8 | header[4];
@@ -516,7 +553,7 @@ int main(int argc, char *argv[])
        if (udev == NULL)
                goto exit;
 
-       logging_init("cdrom_id");
+       udev_log_init("cdrom_id");
        udev_set_log_fn(udev, log_fn);
 
        while (1) {
@@ -555,9 +592,10 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       fd = open(node, O_RDONLY | O_NONBLOCK);
+       fd = open(node, O_RDONLY|O_NONBLOCK|(is_mounted(node) ? 0 : O_EXCL));
        if (fd < 0) {
                info(udev, "unable to open '%s'\n", node);
+               fprintf(stderr, "unable to open '%s'\n", node);
                rc = 1;
                goto exit;
        }
@@ -569,7 +607,11 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       /* check drive */
+       /* check for media - don't bail if there's no media as we still need to
+         * to read profiles */
+       cd_media_compat(udev, fd);
+
+       /* check if drive talks MMC */
        if (cd_inquiry(udev, fd) < 0)
                goto print;
 
@@ -689,7 +731,7 @@ exit:
        if (fd >= 0)
                close(fd);
        udev_unref(udev);
-       logging_close();
+       udev_log_close();
        return rc;
 }