# Adds support for hddtemp to torsmo. # HDD temperatures are provided by the hddtemp daemon. diff -Naurp torsmo-0.18-orig/hddtemp.c torsmo-0.18/hddtemp.c --- torsmo-0.18-orig/hddtemp.c 1970-01-01 01:00:00.000000000 +0100 +++ torsmo-0.18/hddtemp.c 2005-09-18 20:25:29.000000000 +0200 @@ -0,0 +1,143 @@ +#include "torsmo.h" +#include +#include +#include +#include +#include +#include +#include +#include +#define BUFLEN 512 +#define PORT 7634 + +char buf[BUFLEN]; + +int scan_hddtemp(const char *arg, char **dev, char **addr, int *port) +{ + char buf1[32], buf2[64]; + int n, ret; + + ret = sscanf(arg, "%31s %63s %d", buf1, buf2, &n); + + if (ret < 1) + return -1; + + *dev = strdup(buf1); + if (ret >= 2) + *addr = strdup(buf2); + else + *addr = strdup("127.0.0.1"); + + if (ret == 3) + *port = n; + else + *port = PORT; + + return 0; +} + +char *get_hddtemp_info(char *dev, char *hostaddr, int port, char *unit) +{ + int sockfd = 0; + struct hostent *he; + struct sockaddr_in addr; + struct timeval tv; + fd_set rfds; + int len, i, devlen = strlen(dev); + char sep; + char *p, *out, *r = NULL; + + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + perror("socket"); + return NULL; + } + + he = gethostbyname(hostaddr); + if (!he) { + perror("gethostbyname"); + goto out; + } + + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr = *((struct in_addr *)he->h_addr); + memset(&(addr.sin_zero), 0, 8); + + if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) { + perror("connect"); + goto out; + } + + FD_ZERO(&rfds); + FD_SET(sockfd, &rfds); + + /* We're going to wait up to a quarter a second to see whether + * there's any data available. Polling with timeout set to 0 + * doesn't seem to work with hddtemp. */ + tv.tv_sec = 0; + tv.tv_usec = 250000; + + i = select(sockfd+1, &rfds, NULL, NULL, &tv); + if (i == -1) + perror("select"); + + /* No data available */ + if (i <= 0) + goto out; + + p = buf; + len = 0; + do { + i = recv(sockfd, p, BUFLEN - (p-buf), 0); + if (i < 0) { + perror("recv"); + goto out; + } + len += i; + p += i; + } while (i > 0 && p < buf + BUFLEN - 1); + + if (len < 2) { + goto out; + } + + buf[len] = 0; + + /* The first character read is the separator. */ + sep = buf[0]; + p = buf+1; + + while (*p) { + if (!strncmp(p, dev, devlen)) { + p += devlen + 1; + p = strchr(p, sep); + if (!p) + goto out; + p++; + out = p; + p = strchr(p, sep); + if (!p) + goto out; + *p = '\0'; + p++; + *unit = *p; + if (!strncmp(out, "NA", 2)) { + strcpy(buf, "N/A"); + r = buf; + } else { + r = out; + } + goto out; + } else { + for (i = 0; i < 5; i++) { + p = strchr(p, sep); + if (!p) + goto out; + p++; + } + } + } +out: close(sockfd); + return r; +} + diff -Naurp torsmo-0.18-orig/Makefile.am torsmo-0.18/Makefile.am --- torsmo-0.18-orig/Makefile.am 2005-09-18 18:55:27.000000000 +0200 +++ torsmo-0.18/Makefile.am 2005-09-18 18:55:55.000000000 +0200 @@ -25,7 +25,7 @@ nvctrl = nvctrl.c endif torsmo_SOURCES = common.c fs.c $(linux) mail.c mixer.c $(nvctrl) $(seti) \ -$(solaris) $(freebsd) $(netbsd) torsmo.c torsmo.h x11.c +$(solaris) $(freebsd) $(netbsd) torsmo.c torsmo.h x11.c hddtemp.c torsmo_LDFLAGS = $(X11_LIBS) $(XFT_LIBS) diff -Naurp torsmo-0.18-orig/README torsmo-0.18/README --- torsmo-0.18-orig/README 2005-09-18 18:55:27.000000000 +0200 +++ torsmo-0.18/README 2005-09-18 18:55:55.000000000 +0200 @@ -140,6 +140,9 @@ system available for users. fs_size (fs) File system size fs_used (fs) File system used space + hddtemp dev, (host,(port)) Display temperature for selected device + as reported by the hddtemp daemon + running on host:port. hr (height) Horizontal line, height is the height in pixels i2c (dev), type, n I2C sensor from sysfs (Linux 2.6). diff -Naurp torsmo-0.18-orig/torsmo.c torsmo-0.18/torsmo.c --- torsmo-0.18-orig/torsmo.c 2005-09-18 18:55:27.000000000 +0200 +++ torsmo-0.18/torsmo.c 2005-09-18 18:55:55.000000000 +0200 @@ -303,6 +303,7 @@ enum text_object_type { OBJ_fs_size, OBJ_fs_used, OBJ_fs_used_perc, + OBJ_hddtemp, OBJ_hr, OBJ_i2c, OBJ_kernel, @@ -396,6 +397,12 @@ struct text_object { } nvctrl; /* 1 */ #endif + struct { + char *addr; + int port; + char *dev; + } hddtemp; /* 2 */ + } data; }; @@ -438,6 +445,10 @@ static void free_text_objects() { free(text_objects[i].data.execi.cmd); free(text_objects[i].data.execi.buffer); break; + case OBJ_hddtemp: + free(text_objects[i].data.hddtemp.dev); + free(text_objects[i].data.hddtemp.addr); + break; } } @@ -588,6 +599,15 @@ static void construct_text_object(const if (!arg) arg = "/"; obj->data.fs = prepare_fs_stat(arg); END + OBJ(hddtemp, 0) + if (!arg || scan_hddtemp(arg, &obj->data.hddtemp.dev, &obj->data.hddtemp.addr, + &obj->data.hddtemp.port)) { + ERR("hddtemp needs arguments"); + obj->type = OBJ_text; + obj->data.s = strdup("${hddtemp}"); + return; + } + END OBJ(hr, 0) obj->data.i = arg ? atoi(arg) : 1; END @@ -1026,6 +1046,20 @@ static void generate_text() { else if (obj->data.loadavg[0]) snprintf(p, n, "%.2f", v[obj->data.loadavg[0] - 1]); } + OBJ(hddtemp) { + char *temp; + char unit; + + temp = get_hddtemp_info(obj->data.hddtemp.dev, obj->data.hddtemp.addr, + obj->data.hddtemp.port, &unit); + if (!temp) + snprintf(p, n, "N/A"); + else if (unit == '*') + snprintf(p, n, "%s", temp); + else { + snprintf(p, n, "%s°%c", temp, unit); + } + } OBJ(hr) { new_hr(p, obj->data.i); } diff -Naurp torsmo-0.18-orig/torsmo.h torsmo-0.18/torsmo.h --- torsmo-0.18-orig/torsmo.h 2005-09-18 18:55:27.000000000 +0200 +++ torsmo-0.18/torsmo.h 2005-09-18 18:55:55.000000000 +0200 @@ -50,6 +50,7 @@ enum { INFO_LOADAVG = 12, INFO_UNAME = 13, INFO_FREQ = 14, + INFO_HDDTEMP = 15, }; struct information { @@ -217,4 +218,9 @@ extern char *seti_dir; void update_seti(); #endif +/* in hddtemp.c */ + +int scan_hddtemp(const char *arg, char **dev, char **addr, int *port); +char *get_hddtemp_info(char *dev, char *addr, int port, char *unit); + #endif