X-Git-Url: https://git.wpitchoune.net/gitweb/?p=psensor.git;a=blobdiff_plain;f=src%2Flib%2Fpudisks2.c;h=7111174d06d41956805b6e45c9374a9610cecb65;hp=d4f4492bac5ae3e8da901328426abf3f4399699b;hb=c1e20f2631a1249720e9c75d753eacfcb0f6c7b9;hpb=15d844f17741d30f4f1bc3154c6d74c9a6c5a3b2 diff --git a/src/lib/pudisks2.c b/src/lib/pudisks2.c index d4f4492..7111174 100644 --- a/src/lib/pudisks2.c +++ b/src/lib/pudisks2.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2014 jeanfi@gmail.com + * Copyright (C) 2010-2016 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 @@ -20,20 +20,70 @@ #include #define _(str) gettext(str) +#include #include +#include #include #include #include -const char *PROVIDER_NAME = "udisks2"; +static const char *PROVIDER_NAME = "udisks2"; static GDBusObjectManager *manager; -static void udisks2_err(const char *msg) +static const time_t SMART_UPDATE_INTERVAL = 30; + +struct udisks_data { + char *path; + struct timeval last_smart_update; +}; + +static void udisks_data_free(void *data) +{ + struct udisks_data *u; + + u = (struct udisks_data *)data; + free(u->path); + free(u); +} + +static void smart_update(struct psensor *s, UDisksDriveAta *ata) { - log_err("%s: %s", PROVIDER_NAME, msg); + GVariant *variant; + gboolean ret; + struct timeval t; + struct udisks_data *data; + + data = s->provider_data; + + if (gettimeofday(&t, NULL) != 0) { + log_err("%s: %s", PROVIDER_NAME, _("gettimeofday failed.")); + return; + } + + if (data->last_smart_update.tv_sec + && + (t.tv_sec - data->last_smart_update.tv_sec < SMART_UPDATE_INTERVAL)) + return; + + log_fct("%s: update SMART data for %s", PROVIDER_NAME, data->path); + + variant = g_variant_new_parsed("{'nowakeup': %v}", + g_variant_new_boolean(TRUE)); + + ret = udisks_drive_ata_call_smart_update_sync(ata, + variant, + NULL, + NULL); + + if (!ret) + log_fct("%s: SMART update failed for %s", + PROVIDER_NAME, + data->path); + + data->last_smart_update = t; } void udisks2_psensor_list_update(struct psensor **sensors) @@ -42,31 +92,37 @@ void udisks2_psensor_list_update(struct psensor **sensors) GDBusObject *o; UDisksDriveAta *drive_ata; double v; + struct udisks_data *data; - while (*sensors) { + for (; *sensors; sensors++) { s = *sensors; + if (s->type & SENSOR_TYPE_REMOTE) + continue; + if (s->type & SENSOR_TYPE_UDISKS2) { + data = (struct udisks_data *)s->provider_data; + o = g_dbus_object_manager_get_object(manager, - s->udisks2_path); + data->path); if (!o) continue; g_object_get(o, "drive-ata", &drive_ata, NULL); + smart_update(s, drive_ata); + v = udisks_drive_ata_get_smart_temperature(drive_ata); psensor_set_current_value(s, kelvin_to_celsius(v)); g_object_unref(G_OBJECT(o)); } - - sensors++; } } -void udisks2_psensor_list_add(struct psensor ***sensors, int values_length) +void udisks2_psensor_list_append(struct psensor ***sensors, int values_length) { UDisksClient *client; GList *objects, *cur; @@ -76,13 +132,14 @@ void udisks2_psensor_list_add(struct psensor ***sensors, int values_length) char *id, *name, *chip; const char *path, *drive_id, *drive_model; struct psensor *s; + struct udisks_data *data; log_fct_enter(); client = udisks_client_new_sync(NULL, NULL); if (!client) { - udisks2_err(_("Cannot get the udisks2 client")); + log_err(_("%s: cannot get the udisks2 client"), PROVIDER_NAME); log_fct_exit(); return; } @@ -140,7 +197,13 @@ void udisks2_psensor_list_add(struct psensor ***sensors, int values_length) type = SENSOR_TYPE_TEMP | SENSOR_TYPE_UDISKS2 | SENSOR_TYPE_HDD; s = psensor_create(id, name, chip, type, values_length); - s->udisks2_path = strdup(path); + + data = malloc(sizeof(struct udisks_data)); + data->path = strdup(path); + memset(&data->last_smart_update, 0, sizeof(struct timeval)); + + s->provider_data = data; + s->provider_data_free_fct = &udisks_data_free; psensor_list_append(sensors, s);