breezed is a fan speed control daemon for Linux computers.
- Copyright (c) 2008, 2009 Francois Fleuret
+ Copyright (c) 2008, 2009, 2010 Francois Fleuret
Written by Francois Fleuret <francois@fleuret.org>
This file is part of breezed.
#include <string.h>
const int major_version_number = 1;
-const int minor_version_number = 3;
+const int minor_version_number = 4;
const int buffer_size = 1024;
int nb_temperature_thresholds;
int *temperature_thresholds = 0;
+char **speed_names = 0;
int nb_file_thermal = 0;
char **file_thermal = 0;
char *configuration_file;
+/********************************************************************/
+
+/* malloc with error checking. */
+
+void *safe_malloc(size_t n) {
+ void *p = malloc(n);
+ if (!p && n != 0) {
+ fprintf(stderr, "Can not allocate memory: %s\n", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ return p;
+}
+
/******************************************************************/
char *next_word(char *buffer, char *r, int buffer_size) {
void set_fan_level(int fan_fd, int f, int max_fan_level) {
char buffer[buffer_size];
if(f < 0 || f > max_fan_level) f = max_fan_level;
- sprintf(buffer, "level %d\n", f);
+ sprintf(buffer, "level %s\n", speed_names[f]);
if(write(fan_fd, buffer, strlen(buffer)) < 0) {
fprintf(stderr, "Error in setting the fan level (%s).\n",
strerror(errno));
nb_file_thermal++;
}
- file_thermal = (char **) malloc(nb_file_thermal * sizeof(char *));
- file_thermal_fd = (int *) malloc(nb_file_thermal * sizeof(int));
+ file_thermal = safe_malloc(nb_file_thermal * sizeof(char *));
+ file_thermal_fd = safe_malloc(nb_file_thermal * sizeof(int));
s = definition;
int k = 0;
while(s) {
nb_temperature_thresholds = 1;
- char *s;
+ char *s, *u;
+
s = definition;
while(s) {
s = next_word(token, s, buffer_size);
}
temperature_thresholds =
- (int *) malloc(nb_temperature_thresholds * sizeof(int));
+ safe_malloc(nb_temperature_thresholds * sizeof(int));
+
+ speed_names =
+ safe_malloc(nb_temperature_thresholds * sizeof(char *));
temperature_thresholds[0] = -1;
int k = 1;
while(s) {
s = next_word(token, s, buffer_size);
- temperature_thresholds[k] = atoi(token);
+ u = token;
+ while(*u && *u != ':') u++;
+ if(*u) {
+ *u = '\0';
+ temperature_thresholds[k] = atoi(token);
+ u++;
+ speed_names[k] = strdup(u);
+ } else {
+ temperature_thresholds[k] = atoi(token);
+ snprintf(token, buffer_size, "%d", k);
+ speed_names[k] = strdup(token);
+ }
+
if(k > 0 &&
temperature_thresholds[k] < temperature_thresholds[k-1]) {
fprintf(stderr, "The temperature thresholds have to be increasing.\n");
printf("file_fan %s\n", file_fan);
for(t = 0; t < nb_temperature_thresholds; t++) {
- printf("temperature_thresholds[%d] %d",
- t, temperature_thresholds[t]);
+ printf("temperature_thresholds[%d] = %d speed_names[%d] = \"%s\"\n",
+ t, temperature_thresholds[t],
+ t, speed_names[t]);
}
}
nb_rounds_since_last_change = 0;
last_level = new_level;
if(debug) {
- printf("Temperature is %dC setting the fan level to %d.",
+ printf("Temperature is %dC setting the fan level to %d.\n",
temperature, new_level);
}
}