2 * Copyright (C) 2010-2014 jeanfi@gmail.com
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 #define _(str) gettext(str)
27 #include <udisks/udisks.h>
30 #include <temperature.h>
32 const char *PROVIDER_NAME = "udisks2";
34 static GDBusObjectManager *manager;
36 const time_t SMART_UPDATE_INTERVAL = 30;
40 struct timeval last_smart_update;
43 void udisks_data_free(void *data)
45 struct udisks_data *u;
47 u = (struct udisks_data *)data;
52 static void smart_update(struct psensor *s, UDisksDriveAta *ata)
57 struct udisks_data *data;
59 data = s->provider_data;
61 if (gettimeofday(&t, NULL) != 0) {
62 log_err("%s: %s", PROVIDER_NAME, _("gettimeofday failed."));
66 if (data->last_smart_update.tv_sec
68 (t.tv_sec - data->last_smart_update.tv_sec < SMART_UPDATE_INTERVAL))
71 log_fct("%s: update SMART data for %s", PROVIDER_NAME, data->path);
73 variant = g_variant_new_parsed("{'nowakeup': %v}",
74 g_variant_new_boolean(TRUE));
76 ret = udisks_drive_ata_call_smart_update_sync(ata,
82 log_fct("%s: SMART update failed for %s",
86 data->last_smart_update = t;
89 void udisks2_psensor_list_update(struct psensor **sensors)
93 UDisksDriveAta *drive_ata;
95 struct udisks_data *data;
97 for (; *sensors; sensors++) {
100 if (s->type & SENSOR_TYPE_REMOTE)
103 if (s->type & SENSOR_TYPE_UDISKS2) {
104 data = (struct udisks_data *)s->provider_data;
106 o = g_dbus_object_manager_get_object(manager,
112 g_object_get(o, "drive-ata", &drive_ata, NULL);
114 smart_update(s, drive_ata);
116 v = udisks_drive_ata_get_smart_temperature(drive_ata);
118 psensor_set_current_value(s, kelvin_to_celsius(v));
120 g_object_unref(G_OBJECT(o));
125 void udisks2_psensor_list_append(struct psensor ***sensors, int values_length)
127 UDisksClient *client;
128 GList *objects, *cur;
130 UDisksDriveAta *drive_ata;
132 char *id, *name, *chip;
133 const char *path, *drive_id, *drive_model;
135 struct udisks_data *data;
139 client = udisks_client_new_sync(NULL, NULL);
142 log_err(_("%s: cannot get the udisks2 client"), PROVIDER_NAME);
147 manager = udisks_client_get_object_manager(client);
149 objects = g_dbus_object_manager_get_objects(manager);
152 for (cur = objects; cur; cur = cur->next) {
153 path = g_dbus_object_get_object_path(cur->data);
155 g_object_get(cur->data,
157 "drive-ata", &drive_ata,
161 log_fct("Not a drive: %s", path);
166 log_fct("Not an ATA drive: %s", path);
170 if (!udisks_drive_ata_get_smart_enabled(drive_ata)) {
171 log_fct("SMART not enabled: %s", path);
175 if (!udisks_drive_ata_get_smart_temperature(drive_ata)) {
176 log_fct("No temperature available: %s", path);
180 drive_id = udisks_drive_get_id(drive);
182 id = g_strdup_printf("%s %s", PROVIDER_NAME, drive_id);
184 id = g_strdup_printf("%s %d", PROVIDER_NAME, i);
188 drive_model = udisks_drive_get_model(drive);
190 name = strdup(drive_model);
191 chip = strdup(drive_model);
193 name = strdup(_("Disk"));
194 chip = strdup(_("Disk"));
197 type = SENSOR_TYPE_TEMP | SENSOR_TYPE_UDISKS2 | SENSOR_TYPE_HDD;
199 s = psensor_create(id, name, chip, type, values_length);
201 data = malloc(sizeof(struct udisks_data));
202 data->path = strdup(path);
203 memset(&data->last_smart_update, 0, sizeof(struct timeval));
205 s->provider_data = data;
206 s->provider_data_free_fct = &udisks_data_free;
208 psensor_list_append(sensors, s);
210 g_object_unref(G_OBJECT(cur->data));
213 g_list_free(objects);