From 379131ea370954b5bbb6b0962620e4cab5caea6b Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Thu, 25 Dec 2014 10:42:23 -0500 Subject: ata_id: modernize Signed-off-by: Anthony G. Basile --- src/ata_id/ata_id.c | 63 +++++++++++++++++++---------------------------------- 1 file changed, 23 insertions(+), 40 deletions(-) (limited to 'src/ata_id') diff --git a/src/ata_id/ata_id.c b/src/ata_id/ata_id.c index 48f3c5a11d..dc9b9534fd 100644 --- a/src/ata_id/ata_id.c +++ b/src/ata_id/ata_id.c @@ -47,6 +47,7 @@ #include "libudev.h" #include "libudev-private.h" +#include "udev-util.h" #include "log.h" #define COMMAND_TIMEOUT_MSEC (30 * 1000) @@ -411,7 +412,7 @@ out: int main(int argc, char *argv[]) { - struct udev *udev; + _cleanup_udev_unref_ struct udev *udev = NULL; struct hd_driveid id; union { uint8_t byte[512]; @@ -425,9 +426,8 @@ int main(int argc, char *argv[]) char revision[9]; const char *node = NULL; int export = 0; - int fd; + _cleanup_close_ int fd = -1; uint16_t word; - int rc = 0; int is_packet_device = 0; static const struct option options[] = { { "export", no_argument, NULL, 'x' }, @@ -439,7 +439,7 @@ int main(int argc, char *argv[]) udev = udev_new(); if (udev == NULL) - goto exit; + return 0; while (1) { int option; @@ -456,22 +456,20 @@ int main(int argc, char *argv[]) printf("Usage: ata_id [--export] [--help] \n" " --export print values as environment keys\n" " --help print this help text\n\n"); - goto exit; + return 0; } } node = argv[optind]; if (node == NULL) { log_error("no node specified"); - rc = 1; - goto exit; + return 1; } fd = open(node, O_RDONLY|O_NONBLOCK|O_CLOEXEC); if (fd < 0) { log_error("unable to open '%s'", node); - rc = 1; - goto exit; + return 1; } if (disk_identify(udev, fd, identify.byte, &is_packet_device) == 0) { @@ -502,8 +500,7 @@ int main(int argc, char *argv[]) /* If this fails, then try HDIO_GET_IDENTITY */ if (ioctl(fd, HDIO_GET_IDENTITY, &id) != 0) { log_debug_errno(errno, "HDIO_GET_IDENTITY failed for '%s': %m", node); - rc = 2; - goto close; + return 2; } } identify_words = &identify.wyde; @@ -556,8 +553,8 @@ int main(int argc, char *argv[]) } if (id.command_set_1 & (1<<5)) { - printf ("ID_ATA_WRITE_CACHE=1\n"); - printf ("ID_ATA_WRITE_CACHE_ENABLED=%d\n", (id.cfs_enable_1 & (1<<5)) ? 1 : 0); + printf("ID_ATA_WRITE_CACHE=1\n"); + printf("ID_ATA_WRITE_CACHE_ENABLED=%d\n", (id.cfs_enable_1 & (1<<5)) ? 1 : 0); } if (id.command_set_1 & (1<<10)) { printf("ID_ATA_FEATURE_SET_HPA=1\n"); @@ -638,13 +635,10 @@ int main(int argc, char *argv[]) /* Word 217 indicates the nominal media rotation rate of the device */ word = identify_words[217]; - if (word != 0x0000) { - if (word == 0x0001) { - printf ("ID_ATA_ROTATION_RATE_RPM=0\n"); /* non-rotating e.g. SSD */ - } else if (word >= 0x0401 && word <= 0xfffe) { - printf ("ID_ATA_ROTATION_RATE_RPM=%d\n", word); - } - } + if (word == 0x0001) + printf ("ID_ATA_ROTATION_RATE_RPM=0\n"); /* non-rotating e.g. SSD */ + else if (word >= 0x0401 && word <= 0xfffe) + printf ("ID_ATA_ROTATION_RATE_RPM=%d\n", word); /* * Words 108-111 contain a mandatory World Wide Name (WWN) in the NAA IEEE Registered identifier @@ -652,33 +646,22 @@ int main(int argc, char *argv[]) * All other values are reserved. */ word = identify_words[108]; - if ((word & 0xf000) == 0x5000) { - uint64_t wwwn; - - 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); - } + if ((word & 0xf000) == 0x5000) + printf("ID_WWN=0x%1$"PRIu64"x\n" + "ID_WWN_WITH_EXTENSION=0x%1$"PRIu64"x\n", + identify.octa[108/4]); /* from Linux's include/linux/ata.h */ - if (identify_words[0] == 0x848a || identify_words[0] == 0x844a) { + if (identify_words[0] == 0x848a || + identify_words[0] == 0x844a || + (identify_words[83] & 0xc004) == 0x4004) 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 printf("%s\n", model); } -close: - close(fd); -exit: - udev_unref(udev); - log_close(); - return rc; + + return 0; } -- cgit v1.2.3-54-g00ecf