code improvement
1) in get_temp, check temperature_sensor_found to avoid a bogus sysctl if a temperature sensor was not found 2) fix checks for min_freq and max_freq (were improperly checked, resulting in a failed sysctl if passing e.g. -m 1600) 3) preserve contents of argv[] because kvm_getargv grabs whatever is in the program's argv[], making ps report a different command line compared to how the program was started when parsing `,'
This commit is contained in:
parent
48e0c80864
commit
0d3c032afb
43
main.c
43
main.c
|
@ -144,6 +144,11 @@ int get_temp() {
|
||||||
int value = 0;
|
int value = 0;
|
||||||
size_t len = sizeof(sensor);
|
size_t len = sizeof(sensor);
|
||||||
|
|
||||||
|
if (!temperature_sensor_found) {
|
||||||
|
errno = ENOENT;
|
||||||
|
err(1, "no temperature sensor");
|
||||||
|
}
|
||||||
|
|
||||||
if (sysctl(temperature_mib, 5, &sensor, &len, NULL, 0) == -1)
|
if (sysctl(temperature_mib, 5, &sensor, &len, NULL, 0) == -1)
|
||||||
err(1, "failed to read temperature");
|
err(1, "failed to read temperature");
|
||||||
|
|
||||||
|
@ -202,9 +207,15 @@ void switch_batt() {
|
||||||
/* assign values to variable if comma separated
|
/* assign values to variable if comma separated
|
||||||
* if not, assign value to two variables
|
* if not, assign value to two variables
|
||||||
*/
|
*/
|
||||||
void assign_values_from_param(char* parameter, int* charging, int* battery) {
|
void assign_values_from_param(char* parameterk, int* charging, int* battery) {
|
||||||
|
char *parameter = strdup(parameterk);
|
||||||
int count = 0;
|
int count = 0;
|
||||||
char *token = strtok(parameter, ",");
|
char *token = NULL;
|
||||||
|
|
||||||
|
if(parameter == NULL)
|
||||||
|
err(1, "malloc failed");
|
||||||
|
|
||||||
|
token = strtok(parameter, ",");
|
||||||
|
|
||||||
while (token != NULL) {
|
while (token != NULL) {
|
||||||
if(count == 0)
|
if(count == 0)
|
||||||
|
@ -224,6 +235,8 @@ void assign_values_from_param(char* parameter, int* charging, int* battery) {
|
||||||
|
|
||||||
if(count == 1)
|
if(count == 1)
|
||||||
*battery = *charging;
|
*battery = *charging;
|
||||||
|
|
||||||
|
free(parameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse optarg for a sensor path, sysctl style;
|
/* parse optarg for a sensor path, sysctl style;
|
||||||
|
@ -232,7 +245,7 @@ void assign_values_from_param(char* parameter, int* charging, int* battery) {
|
||||||
* IFF it's a valid path, else sets errno to something
|
* IFF it's a valid path, else sets errno to something
|
||||||
* relevant.
|
* relevant.
|
||||||
*/
|
*/
|
||||||
void parse_sensor_path(char* path) {
|
void parse_sensor_path(char* pathk) {
|
||||||
const struct ctlnameconst ctlnames[] = CTL_NAMES;
|
const struct ctlnameconst ctlnames[] = CTL_NAMES;
|
||||||
const struct ctlnameconst ctlhwnames[] = CTL_HW_NAMES;
|
const struct ctlnameconst ctlhwnames[] = CTL_HW_NAMES;
|
||||||
const size_t prefix_len =
|
const size_t prefix_len =
|
||||||
|
@ -240,7 +253,8 @@ void parse_sensor_path(char* path) {
|
||||||
/*.*/1 +
|
/*.*/1 +
|
||||||
/*sensors*/strlen(ctlhwnames[HW_SENSORS].ctl_name) +
|
/*sensors*/strlen(ctlhwnames[HW_SENSORS].ctl_name) +
|
||||||
/*.*/1;
|
/*.*/1;
|
||||||
char* prefix = malloc(prefix_len + 1);
|
char* path = NULL;
|
||||||
|
char* prefix = NULL;
|
||||||
/* these are pointers into optarg */
|
/* these are pointers into optarg */
|
||||||
char* sensordevname = NULL, *sensortype = NULL, *sensornumts = NULL;
|
char* sensordevname = NULL, *sensortype = NULL, *sensornumts = NULL;
|
||||||
int sensornumt = -1;
|
int sensornumt = -1;
|
||||||
|
@ -248,10 +262,14 @@ void parse_sensor_path(char* path) {
|
||||||
const char* errstr = NULL;
|
const char* errstr = NULL;
|
||||||
int dev = 0;
|
int dev = 0;
|
||||||
|
|
||||||
if(prefix == NULL) {
|
path = strdup(pathk);
|
||||||
errno = ENOMEM;
|
if(path == NULL)
|
||||||
return;
|
err(1, "malloc failed");
|
||||||
}
|
|
||||||
|
prefix = malloc(prefix_len + 1);
|
||||||
|
if(prefix == NULL)
|
||||||
|
err(1, "malloc failed");
|
||||||
|
|
||||||
memset(prefix, 0, prefix_len + 1);
|
memset(prefix, 0, prefix_len + 1);
|
||||||
strcpy(prefix, ctlnames[CTL_HW].ctl_name);
|
strcpy(prefix, ctlnames[CTL_HW].ctl_name);
|
||||||
strcat(prefix, ".");
|
strcat(prefix, ".");
|
||||||
|
@ -300,7 +318,7 @@ void parse_sensor_path(char* path) {
|
||||||
if(verbose)
|
if(verbose)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"%s does not look like a temperature sensor\n",
|
"%s does not look like a temperature sensor\n",
|
||||||
path);
|
pathk);
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
goto badprefix;
|
goto badprefix;
|
||||||
}
|
}
|
||||||
|
@ -364,6 +382,7 @@ void parse_sensor_path(char* path) {
|
||||||
|
|
||||||
badprefix:
|
badprefix:
|
||||||
free(prefix);
|
free(prefix);
|
||||||
|
free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -421,12 +440,14 @@ int main(int argc, char *argv[]) {
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
assign_values_from_param(optarg, &wall_min, &batt_min);
|
assign_values_from_param(optarg, &wall_min, &batt_min);
|
||||||
if(hard_min_freq > 100 || hard_min_freq < 0)
|
if(wall_min > 100 || wall_min < 0 ||
|
||||||
|
batt_min > 100 || batt_min < 0)
|
||||||
err(1, "minimum frequency must be between 0 and 100");
|
err(1, "minimum frequency must be between 0 and 100");
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
assign_values_from_param(optarg, &wall_max, &batt_max);
|
assign_values_from_param(optarg, &wall_max, &batt_max);
|
||||||
if(hard_max_freq > 100 || hard_max_freq < 0)
|
if(wall_max > 100 || wall_max < 0 ||
|
||||||
|
batt_max > 100 || batt_max < 0)
|
||||||
err(1, "maximum frequency must be between 0 and 100");
|
err(1, "maximum frequency must be between 0 and 100");
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
|
|
Reference in New Issue