chiark / gitweb /
ata_id: Check for Compact Flash card
authorDavid Zeuthen <davidz@redhat.com>
Wed, 31 Aug 2011 14:00:11 +0000 (10:00 -0400)
committerKay Sievers <kay.sievers@vrfy.org>
Thu, 1 Sep 2011 19:15:29 +0000 (21:15 +0200)
Automounters may need information like this to e.g. allow unprivileged
applications to mount filesystems from a CF card but not from
other ATA devices. See https://bugzilla.redhat.com/show_bug.cgi?id=734191

Signed-off-by: David Zeuthen <davidz@redhat.com>
extras/ata_id/ata_id.c

index 1e93fde4bf49362b48a2462b762ea70d148746c4..cadadfc27fa422d86c40f784778ba34192cc68d5 100644 (file)
@@ -448,6 +448,7 @@ int main(int argc, char *argv[])
        struct udev *udev;
        struct hd_driveid id;
        uint8_t identify[512];
        struct udev *udev;
        struct hd_driveid id;
        uint8_t identify[512];
+       uint16_t *identify_words;
        char model[41];
        char model_enc[256];
        char serial[21];
        char model[41];
        char model_enc[256];
        char serial[21];
@@ -541,6 +542,7 @@ int main(int argc, char *argv[])
                        goto close;
                }
        }
                        goto close;
                }
        }
+       identify_words = (uint16_t *) identify;
 
        memcpy (model, id.model, 40);
        model[40] = '\0';
 
        memcpy (model, id.model, 40);
        model[40] = '\0';
@@ -700,6 +702,15 @@ int main(int argc, char *argv[])
                        /* ATA devices have no vendor extension */
                        printf("ID_WWN_WITH_EXTENSION=0x%llx\n", (unsigned long long int) wwwn);
                }
                        /* ATA devices have no vendor extension */
                        printf("ID_WWN_WITH_EXTENSION=0x%llx\n", (unsigned long long int) wwwn);
                }
+
+               /* from Linux's include/linux/ata.h */
+               if (identify_words[0] == 0x848a || identify_words[0] == 0x844a) {
+                       printf("ID_ATA_CFA=1\n");
+               } else {
+                       if ((identify_words[83] & 0xc004) == 0x4004) {
+                               printf("ID_ATA_CFA=1\n");
+                       }
+               }
        } else {
                if (serial[0] != '\0')
                        printf("%s_%s\n", model, serial);
        } else {
                if (serial[0] != '\0')
                        printf("%s_%s\n", model, serial);