From a4449a01fe65c9e8c5cae44d769ca6a24e83462c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Sun, 25 Mar 2012 09:38:23 +0000 Subject: [PATCH] add analyze disk tests --- src/lib/hdd_atasmart.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/lib/hdd_atasmart.c b/src/lib/hdd_atasmart.c index 8c781bb..cd8c72b 100644 --- a/src/lib/hdd_atasmart.c +++ b/src/lib/hdd_atasmart.c @@ -24,10 +24,13 @@ #include #include #include +#include +#include +#include #include - #include +#include #include "pio.h" #include "hdd.h" @@ -55,15 +58,42 @@ create_sensor(char *id, char *name, SkDisk *disk, int values_max_length) static void analyze_disk(const char *dname) { int f; + struct stat st; + uint64_t size; log_debug("analyze_disk(hdd_atasmart): %s", dname); f = open(dname, O_RDONLY|O_NOCTTY|O_NONBLOCK|O_CLOEXEC); - if (f != -1) - close(f); - else + if (f < 0) { log_debug("Could not open file %s: %s", dname, strerror(errno)); + goto fail; + } + + if (fstat(f, &st) < 0) { + log_debug("fstat fails %s: %s", dname, strerror(errno)); + goto fail; + } + + if (!S_ISBLK(st.st_mode)) { + log_debug("!S_ISBLK fails %s", dname); + goto fail; + } + + size = (uint64_t)-1; + /* So, it's a block device. Let's make sure the ioctls work */ + if (ioctl(f, BLKGETSIZE64, &size) < 0) { + log_debug("ioctl fails %s: %s", dname, strerror(errno)); + goto fail; + } + + if (size <= 0 || size == (uint64_t) -1) { + log_debug("ioctl wrong size %s: %ld", dname, size); + goto fail; + } + + fail: + close(f); } -- 2.7.4