X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Fata_id%2Fata_id.c;h=a4f73b8dfd8d6719ade449147a6fa58f7669fb88;hp=2840e914579c4118a0d6941ec91bd1c8522bae9a;hb=d4f687c013a18010fdc2ddf937fad064343e635a;hpb=70721db6d7ba0d4f3ac5c17f2cedac056065ad8a diff --git a/extras/ata_id/ata_id.c b/extras/ata_id/ata_id.c index 2840e9145..a4f73b8df 100644 --- a/extras/ata_id/ata_id.c +++ b/extras/ata_id/ata_id.c @@ -1,21 +1,20 @@ /* * ata_id - reads product/serial number from ATA drives * - * Copyright (C) 2005 Kay Sievers + * Copyright (C) 2005-2008 Kay Sievers * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef _GNU_SOURCE @@ -27,40 +26,23 @@ #include #include #include +#include #include +#include #include #include #include #include #include -#include "../../logging.h" -#include "../../udev_utils.h" +#include "../../udev/udev.h" -#ifdef USE_LOG -void log_message(int priority, const char *format, ...) +static void log_fn(struct udev *udev, int priority, + const char *file, int line, const char *fn, + const char *format, va_list args) { - va_list args; - static int udev_log = -1; - - if (udev_log == -1) { - const char *value; - - value = getenv("UDEV_LOG"); - if (value) - udev_log = log_priority(value); - else - udev_log = LOG_ERR; - } - - if (priority > udev_log) - return; - - va_start(args, format); vsyslog(priority, format, args); - va_end(args); } -#endif static void set_str(char *to, const char *from, size_t count) { @@ -68,7 +50,7 @@ static void set_str(char *to, const char *from, size_t count) /* strip trailing whitespace */ len = strnlen(from, count); - while (isspace(from[len-1])) + while (len && isspace(from[len-1])) len--; /* strip leading whitespace */ @@ -96,45 +78,71 @@ static void set_str(char *to, const char *from, size_t count) int main(int argc, char *argv[]) { + struct udev *udev; struct hd_driveid id; char model[41]; 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", no_argument, NULL, 'x' }, + { "help", no_argument, NULL, 'h' }, + {} + }; + + udev = udev_new(); + if (udev == NULL) + goto exit; logging_init("ata_id"); + udev_set_log_fn(udev, log_fn); + + while (1) { + int option; - for (i = 1 ; i < argc; i++) { - char *arg = argv[i]; + option = getopt_long(argc, argv, "xh", options, NULL); + if (option == -1) + break; - if (strcmp(arg, "--export") == 0) { + switch (option) { + case 'x': export = 1; - } else - node = arg; + break; + case 'h': + printf("Usage: ata_id [--export] [--help] \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(udev, "no node specified\n"); rc = 1; goto exit; } - fd = open(node, O_RDONLY); - if (fd < 0) - if (errno == ENOMEDIUM) - fd = open(node, O_RDONLY|O_NONBLOCK); + fd = open(node, O_RDONLY|O_NONBLOCK); if (fd < 0) { - err("unable to open '%s'", node); + err(udev, "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(udev, "HDIO_GET_IDENTITY unsupported for '%s'\n", node); + rc = 2; + } else { + err(udev, "HDIO_GET_IDENTITY failed for '%s'\n", node); + rc = 3; + } goto close; } @@ -179,6 +187,7 @@ int main(int argc, char *argv[]) close: close(fd); exit: + udev_unref(udev); logging_close(); return rc; }