summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-12-25 10:42:23 -0500
committerAnthony G. Basile <blueness@gentoo.org>2014-12-29 11:30:21 -0500
commit379131ea370954b5bbb6b0962620e4cab5caea6b (patch)
tree5929ca63e8a87b79e220b0e1e2a32d46384829cf
parent3b2aa6c6732d0fead841c7d592adbe19894bb835 (diff)
ata_id: modernize
Signed-off-by: Anthony G. Basile <blueness@gentoo.org>
-rw-r--r--src/ata_id/ata_id.c63
1 files changed, 23 insertions, 40 deletions
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] <device>\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;
}