chiark / gitweb /
release 126
[elogind.git] / extras / ata_id / ata_id.c
index a97cc284cc515765ba111ccaf67ad993d0c82d7e..125c3f3dd7d7209833fe8bfbacd75d478705f894 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 #include <ctype.h>
+#include <string.h>
 #include <errno.h>
+#include <getopt.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <linux/types.h>
 #include <linux/hdreg.h>
 
-#include "../../logging.h"
-#include "../../udev_utils.h"
+#include "../../udev/udev.h"
 
 #ifdef USE_LOG
 void log_message(int priority, const char *format, ...)
@@ -91,37 +92,60 @@ int main(int argc, char *argv[])
        char serial[21];
        char revision[9];
        const char *node = NULL;
-       int i;
        int export = 0;
        int fd;
        int rc = 0;
+       static const struct option options[] = {
+               { "export", 0, NULL, 'x' },
+               { "help", 0, NULL, 'h' },
+               {}
+       };
 
        logging_init("ata_id");
 
-       for (i = 1 ; i < argc; i++) {
-               char *arg = argv[i];
+       while (1) {
+               int option;
 
-               if (strcmp(arg, "--export") == 0) {
+               option = getopt_long(argc, argv, "xh", options, NULL);
+               if (option == -1)
+                       break;
+
+               switch (option) {
+               case 'x':
                        export = 1;
-               } else
-                       node = arg;
+                       break;
+               case 'h':
+                       printf("Usage: ata_id [--export] [--help] <device>\n"
+                              "  --export    print values as environemt keys\n"
+                              "  --help      print this help text\n\n");
+               default:
+                       rc = 1;
+                       goto exit;
+               }
        }
-       if (!node) {
-               err("no node specified");
+
+       node = argv[optind];
+       if (node == NULL) {
+               err("no node specified\n");
                rc = 1;
                goto exit;
        }
 
        fd = open(node, O_RDONLY|O_NONBLOCK);
        if (fd < 0) {
-               err("unable to open '%s'", node);
+               err("unable to open '%s'\n", node);
                rc = 1;
                goto exit;
        }
 
        if (ioctl(fd, HDIO_GET_IDENTITY, &id)) {
-               err("HDIO_GET_IDENTITY failed for '%s'", node);
-               rc = 3;
+               if (errno == ENOTTY) {
+                       info("HDIO_GET_IDENTITY unsupported for '%s'\n", node);
+                       rc = 2;
+               } else {
+                       err("HDIO_GET_IDENTITY failed for '%s'\n", node);
+                       rc = 3;
+               }
                goto close;
        }