summaryrefslogtreecommitdiff
path: root/src/ata_id
diff options
context:
space:
mode:
authorShawn Paul Landden <shawn@churchofgit.com>2014-12-23 15:04:37 -0800
committerAnthony G. Basile <blueness@gentoo.org>2014-12-29 11:06:48 -0500
commit3b2aa6c6732d0fead841c7d592adbe19894bb835 (patch)
tree91e0c91789f96efbd0b83d7b0d1ae26c0906a915 /src/ata_id
parent96ce74918fc9f535fc04d53e960862cdeb995222 (diff)
udev: fix another strict aliasing issue
Signed-off-by: Anthony G. Basile <blueness@gentoo.org>
Diffstat (limited to 'src/ata_id')
-rw-r--r--src/ata_id/ata_id.c62
1 files changed, 30 insertions, 32 deletions
diff --git a/src/ata_id/ata_id.c b/src/ata_id/ata_id.c
index 626547725a..48f3c5a11d 100644
--- a/src/ata_id/ata_id.c
+++ b/src/ata_id/ata_id.c
@@ -413,7 +413,11 @@ int main(int argc, char *argv[])
{
struct udev *udev;
struct hd_driveid id;
- uint8_t identify[512];
+ union {
+ uint8_t byte[512];
+ uint16_t wyde[256];
+ uint64_t octa[64];
+ } identify;
uint16_t *identify_words;
char model[41];
char model_enc[256];
@@ -470,30 +474,30 @@ int main(int argc, char *argv[])
goto exit;
}
- if (disk_identify(udev, fd, identify, &is_packet_device) == 0) {
+ if (disk_identify(udev, fd, identify.byte, &is_packet_device) == 0) {
/*
* fix up only the fields from the IDENTIFY data that we are going to
* use and copy it into the hd_driveid struct for convenience
*/
- disk_identify_fixup_string(identify, 10, 20); /* serial */
- disk_identify_fixup_string(identify, 23, 8); /* fwrev */
- disk_identify_fixup_string(identify, 27, 40); /* model */
- disk_identify_fixup_uint16(identify, 0); /* configuration */
- disk_identify_fixup_uint16(identify, 75); /* queue depth */
- disk_identify_fixup_uint16(identify, 75); /* SATA capabilities */
- disk_identify_fixup_uint16(identify, 82); /* command set supported */
- disk_identify_fixup_uint16(identify, 83); /* command set supported */
- disk_identify_fixup_uint16(identify, 84); /* command set supported */
- disk_identify_fixup_uint16(identify, 85); /* command set supported */
- disk_identify_fixup_uint16(identify, 86); /* command set supported */
- disk_identify_fixup_uint16(identify, 87); /* command set supported */
- disk_identify_fixup_uint16(identify, 89); /* time required for SECURITY ERASE UNIT */
- disk_identify_fixup_uint16(identify, 90); /* time required for enhanced SECURITY ERASE UNIT */
- disk_identify_fixup_uint16(identify, 91); /* current APM values */
- disk_identify_fixup_uint16(identify, 94); /* current AAM value */
- disk_identify_fixup_uint16(identify, 128); /* device lock function */
- disk_identify_fixup_uint16(identify, 217); /* nominal media rotation rate */
- memcpy(&id, identify, sizeof id);
+ disk_identify_fixup_string(identify.byte, 10, 20); /* serial */
+ disk_identify_fixup_string(identify.byte, 23, 8); /* fwrev */
+ disk_identify_fixup_string(identify.byte, 27, 40); /* model */
+ disk_identify_fixup_uint16(identify.byte, 0); /* configuration */
+ disk_identify_fixup_uint16(identify.byte, 75); /* queue depth */
+ disk_identify_fixup_uint16(identify.byte, 75); /* SATA capabilities */
+ disk_identify_fixup_uint16(identify.byte, 82); /* command set supported */
+ disk_identify_fixup_uint16(identify.byte, 83); /* command set supported */
+ disk_identify_fixup_uint16(identify.byte, 84); /* command set supported */
+ disk_identify_fixup_uint16(identify.byte, 85); /* command set supported */
+ disk_identify_fixup_uint16(identify.byte, 86); /* command set supported */
+ disk_identify_fixup_uint16(identify.byte, 87); /* command set supported */
+ disk_identify_fixup_uint16(identify.byte, 89); /* time required for SECURITY ERASE UNIT */
+ disk_identify_fixup_uint16(identify.byte, 90); /* time required for enhanced SECURITY ERASE UNIT */
+ disk_identify_fixup_uint16(identify.byte, 91); /* current APM values */
+ disk_identify_fixup_uint16(identify.byte, 94); /* current AAM value */
+ disk_identify_fixup_uint16(identify.byte, 128); /* device lock function */
+ disk_identify_fixup_uint16(identify.byte, 217); /* nominal media rotation rate */
+ memcpy(&id, identify.byte, sizeof id);
} else {
/* If this fails, then try HDIO_GET_IDENTITY */
if (ioctl(fd, HDIO_GET_IDENTITY, &id) != 0) {
@@ -502,7 +506,7 @@ int main(int argc, char *argv[])
goto close;
}
}
- identify_words = (uint16_t *) identify;
+ identify_words = &identify.wyde;
memcpy (model, id.model, 40);
model[40] = '\0';
@@ -616,7 +620,7 @@ int main(int argc, char *argv[])
* the device does not claim compliance with the Serial ATA specification and words
* 76 through 79 are not valid and shall be ignored.
*/
- word = *((uint16_t *) identify + 76);
+ word = identify_words[76];
if (word != 0x0000 && word != 0xffff) {
printf("ID_ATA_SATA=1\n");
/*
@@ -633,7 +637,7 @@ int main(int argc, char *argv[])
}
/* Word 217 indicates the nominal media rotation rate of the device */
- word = *((uint16_t *) identify + 217);
+ word = identify_words[217];
if (word != 0x0000) {
if (word == 0x0001) {
printf ("ID_ATA_ROTATION_RATE_RPM=0\n"); /* non-rotating e.g. SSD */
@@ -647,17 +651,11 @@ int main(int argc, char *argv[])
* format. Word 108 bits (15:12) shall contain 5h, indicating that the naming authority is IEEE.
* All other values are reserved.
*/
- word = *((uint16_t *) identify + 108);
+ word = identify_words[108];
if ((word & 0xf000) == 0x5000) {
uint64_t wwwn;
- wwwn = *((uint16_t *) identify + 108);
- wwwn <<= 16;
- wwwn |= *((uint16_t *) identify + 109);
- wwwn <<= 16;
- wwwn |= *((uint16_t *) identify + 110);
- wwwn <<= 16;
- wwwn |= *((uint16_t *) identify + 111);
+ wwwn = identify.octa[108/4];
printf("ID_WWN=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);