X-Git-Url: http://wpitchoune.net/gitweb/?p=psensor-pkg-debian.git;a=blobdiff_plain;f=src%2Flib%2Fhdd_hddtemp.c;h=68797e19dc4a698b154ad24fdd6bddc78777dff7;hp=3e692f008d11d56ee252533424c8be1a94b8892d;hb=bd7036af56a4b61b2b473dccbeac5e26f78b57da;hpb=e248180cc4ebc258fdd5778a26c08287089165b1 diff --git a/src/lib/hdd_hddtemp.c b/src/lib/hdd_hddtemp.c index 3e692f0..68797e1 100644 --- a/src/lib/hdd_hddtemp.c +++ b/src/lib/hdd_hddtemp.c @@ -16,14 +16,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ + +/* Part of the code in this file is based on GNOME sensors applet code + * hddtemp-plugin.c see http://sensors-applet.sourceforge.net/ + */ + #include #include #define _(str) gettext(str) -/* - * Following code is based on GNOME sensors applet code - * hddtemp-plugin.c see http://sensors-applet.sourceforge.net/ - */ #include #include #include @@ -33,30 +34,32 @@ #include #include -#include "hdd.h" -#include "psensor.h" +#include +#include -#define HDDTEMP_SERVER_IP_ADDRESS "127.0.0.1" -#define HDDTEMP_PORT_NUMBER 7634 -#define HDDTEMP_OUTPUT_BUFFER_LENGTH 4048 +static const char *PROVIDER_NAME = "hddtemp"; + +static const char *HDDTEMP_SERVER_IP_ADDRESS = "127.0.0.1"; +static const int HDDTEMP_PORT_NUMBER = 7634; +static const int HDDTEMP_OUTPUT_BUFFER_LENGTH = 4048; struct hdd_info { char *name; int temp; }; -static char *fetch() +static char *fetch(void) { - int sockfd; + int sockfd, output_length; ssize_t n = 1; - int output_length = 0; - char *pc; - char *buffer; + char *pc, *buffer; struct sockaddr_in address; + output_length = 0; + sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { - log_err(_("hddtemp: failed to open socket.")); + log_err(_("%s: failed to open socket."), PROVIDER_NAME); return NULL; } @@ -69,7 +72,7 @@ static char *fetch() if (connect(sockfd, (struct sockaddr *)&address, (socklen_t) sizeof(address)) == -1) { - log_err(_("hddtemp: failed to open connection.")); + log_err(_("%s: failed to open connection."), PROVIDER_NAME); } else { buffer = malloc(HDDTEMP_OUTPUT_BUFFER_LENGTH); @@ -171,78 +174,89 @@ static char *next_hdd_info(char *string, struct hdd_info *info) return c; } -struct psensor **hddtemp_psensor_list_add(struct psensor **sensors, - int values_max_length) +void +hddtemp_psensor_list_append(struct psensor ***sensors, int values_max_length) { - char *hddtemp_output = fetch(); - char *c; + char *hddtemp_output, *c, *id; struct hdd_info info; - struct psensor **result; + struct psensor *sensor; + + hddtemp_output = fetch(); if (!hddtemp_output) - return sensors; + return; if (hddtemp_output[0] != '|') { - log_err(_("hddtemp: wrong string: %s."), hddtemp_output); + log_err(_("%s: wrong string: %s."), + PROVIDER_NAME, + hddtemp_output); free(hddtemp_output); - return sensors; + return; } c = hddtemp_output; - result = sensors; - while (c && (c = next_hdd_info(c, &info))) { - struct psensor *sensor; - struct psensor **tmp_sensors; - - char *id = malloc(strlen("hdd ") + strlen(info.name) + 1); - strcpy(id, "hdd "); - strcat(id, info.name); + id = malloc(strlen(PROVIDER_NAME) + 1 + strlen(info.name) + 1); + sprintf(id, "%s %s", PROVIDER_NAME, info.name); sensor = create_sensor(id, info.name, values_max_length); - tmp_sensors = psensor_list_add(result, sensor); - - if (result != sensors) - free(result); - - result = tmp_sensors; + psensor_list_append(sensors, sensor); } free(hddtemp_output); - - return result; } static void update(struct psensor **sensors, struct hdd_info *info) { - struct psensor **sensor_cur = sensors; + while (*sensors) { + if (!((*sensors)->type & SENSOR_TYPE_REMOTE) + && (*sensors)->type & SENSOR_TYPE_HDDTEMP + && !strcmp((*sensors)->id + 8, info->name)) + psensor_set_current_value(*sensors, + (double)info->temp); + + sensors++; + } +} + +static bool contains_hddtemp_sensor(struct psensor **sensors) +{ + struct psensor *s; - while (*sensor_cur) { - if (!((*sensor_cur)->type & SENSOR_TYPE_REMOTE) - && (*sensor_cur)->type & SENSOR_TYPE_HDDTEMP - && !strcmp((*sensor_cur)->id + 4, info->name)) - psensor_set_current_value(*sensor_cur, - (float)info->temp); + if (!sensors) + return false; - sensor_cur++; + while (*sensors) { + s = *sensors; + if (!(s->type & SENSOR_TYPE_REMOTE) + && (s->type & SENSOR_TYPE_HDDTEMP)) + return true; + sensors++; } + + return false; } void hddtemp_psensor_list_update(struct psensor **sensors) { - char *hddtemp_output = fetch(); + char *hddtemp_output; + + if (!contains_hddtemp_sensor(sensors)) + return; + + hddtemp_output = fetch(); if (!hddtemp_output) return; if (hddtemp_output[0] == '|') { - char *c = hddtemp_output; struct hdd_info info; + info.name = NULL; info.temp = 0; @@ -253,7 +267,9 @@ void hddtemp_psensor_list_update(struct psensor **sensors) free(info.name); } } else { - log_err(_("hddtemp: wrong string: %s."), hddtemp_output); + log_err(_("%s: wrong string: %s."), + PROVIDER_NAME, + hddtemp_output); } free(hddtemp_output);