Merge tag 'upstream/1.2.0'
[psensor-pkg-debian.git] / src / lib / hdd_atasmart.c
index 7e99648..402c92e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2013 jeanfi@gmail.com
+ * Copyright (C) 2010-2014 jeanfi@gmail.com
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -25,6 +25,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/ioctl.h>
 #include <atasmart.h>
 #include <linux/fs.h>
 
-#include "pio.h"
-#include "hdd.h"
-#include "log.h"
+#include <pio.h>
+#include <hdd.h>
+#include <plog.h>
+
+static const char *PROVIDER_NAME = "atasmart";
 
 static int filter_sd(const char *p)
 {
        return strlen(p) == 8 && !strncmp(p, "/dev/sd", 7);
 }
 
+static void provider_data_free(void *data)
+{
+       sk_disk_free((SkDisk *)data);
+}
+
+static SkDisk *get_disk(struct psensor *s)
+{
+       return (SkDisk *)s->provider_data;
+}
+
 static struct psensor *
 create_sensor(char *id, char *name, SkDisk *disk, int values_max_length)
 {
@@ -54,11 +67,12 @@ create_sensor(char *id, char *name, SkDisk *disk, int values_max_length)
 
        s = psensor_create(id,
                           strdup(name),
-                          strdup("HDD"),
+                          strdup(_("Disk")),
                           t,
                           values_max_length);
 
-       s->disk = disk;
+       s->provider_data = disk;
+       s->provider_data_free_fct = &provider_data_free;
 
        return s;
 }
@@ -72,43 +86,34 @@ static void analyze_disk(const char *dname)
        struct stat st;
        uint64_t size;
 
-       log_debug("analyze_disk(hdd_atasmart): %s", dname);
+       log_fct("Analyze %s", dname);
 
        f = open(dname, O_RDONLY|O_NOCTTY|O_NONBLOCK|O_CLOEXEC);
 
        if (f < 0) {
-               log_debug("analyze_disk(hdd_atasmart): Could not open file %s: %s",
-                         dname,
-                         strerror(errno));
+               log_fct("Could not open file %s: %s", dname, strerror(errno));
                goto fail;
        }
 
        if (fstat(f, &st) < 0) {
-               log_debug("analyze_disk(hdd_atasmart): fstat fails %s: %s",
-                         dname,
-                         strerror(errno));
+               log_fct("fstat fails %s: %s", dname, strerror(errno));
                goto fail;
        }
 
        if (!S_ISBLK(st.st_mode)) {
-               log_debug("analyze_disk(hdd_atasmart): !S_ISBLK fails %s",
-                         dname);
+               log_fct("!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("analyze_disk(hdd_atasmart): ioctl fails %s: %s",
-                         dname,
-                         strerror(errno));
+               log_fct("ioctl fails %s: %s", dname, strerror(errno));
                goto fail;
        }
 
        if (size <= 0 || size == (uint64_t) -1) {
-               log_debug("analyze_disk(hdd_atasmart): ioctl wrong size %s: %ld",
-                         dname,
-                         size);
+               log_fct("ioctl wrong size %s: %ld", dname, size);
                goto fail;
        }
 
@@ -116,40 +121,37 @@ static void analyze_disk(const char *dname)
        close(f);
 }
 
-struct psensor **hdd_psensor_list_add(struct psensor **sensors,
-                                     int values_max_length)
+void
+atasmart_psensor_list_append(struct psensor ***sensors, int values_max_length)
 {
        char **paths, **tmp, *id;
        SkDisk *disk;
-       struct psensor *sensor, **tmp_sensors, **result;
+       struct psensor *sensor;
 
-       log_debug("hdd_psensor_list_add(hdd_atasmart)");
+       log_fct_enter();
 
        paths = dir_list("/dev", filter_sd);
 
-       result = sensors;
        tmp = paths;
        while (*tmp) {
-               log_debug("hdd_psensor_list_add(hdd_atasmart) open %s", *tmp);
+               log_fct("Open %s", *tmp);
 
                if (!sk_disk_open(*tmp, &disk)) {
-                       id = malloc(strlen("hdd at") + strlen(*tmp) + 1);
-                       strcpy(id, "hdd at");
-                       strcat(id, *tmp);
+                       id = malloc(strlen(PROVIDER_NAME)
+                                   + 1
+                                   + strlen(*tmp)
+                                   + 1);
+                       sprintf(id, "%s %s", PROVIDER_NAME, *tmp);
 
                        sensor = create_sensor(id,
                                               *tmp,
                                               disk,
                                               values_max_length);
 
-                       tmp_sensors = psensor_list_add(result, sensor);
-
-                       if (result != sensors)
-                               free(result);
-
-                       result = tmp_sensors;
+                       psensor_list_append(sensors, sensor);
                } else {
-                       log_err(_("atasmart: sk_disk_open() failure: %s."),
+                       log_err(_("%s: sk_disk_open() failure: %s."),
+                               PROVIDER_NAME,
                                *tmp);
                        analyze_disk(*tmp);
                }
@@ -159,33 +161,37 @@ struct psensor **hdd_psensor_list_add(struct psensor **sensors,
 
        paths_free(paths);
 
-       return result;
+       log_fct_exit();
 }
 
-void hdd_psensor_list_update(struct psensor **sensors)
+void atasmart_psensor_list_update(struct psensor **sensors)
 {
        struct psensor **cur, *s;
        uint64_t kelvin;
        int ret;
        double c;
+       SkDisk *disk;
+
+       if (!sensors)
+               return;
 
        cur = sensors;
        while (*cur) {
                s = *cur;
                if (!(s->type & SENSOR_TYPE_REMOTE)
                    && s->type & SENSOR_TYPE_ATASMART) {
-                       ret = sk_disk_smart_read_data(s->disk);
+                       disk = get_disk(s);
+
+                       ret = sk_disk_smart_read_data(disk);
 
                        if (!ret) {
-                               ret = sk_disk_smart_get_temperature(s->disk,
+                               ret = sk_disk_smart_get_temperature(disk,
                                                                    &kelvin);
 
                                if (!ret) {
                                        c = (kelvin - 273150) / 1000;
                                        psensor_set_current_value(s, c);
-                                       log_debug("hdd_psensor_list_update(hdd_atasmart): %s %.2f",
-                                                 s->id,
-                                                 c);
+                                       log_fct("%s %.2f", s->id, c);
                                }
                        }
                }