Fix some minor issues:

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 not being 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
This commit is contained in:
Vlad Meșco 2022-11-05 11:53:11 +02:00
parent 89a2fe9a91
commit 89c822d677
1 changed files with 32 additions and 11 deletions

43
main.c
View File

@ -144,6 +144,11 @@ int get_temp() {
int value = 0;
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)
err(1, "failed to read temperature");
@ -202,9 +207,15 @@ void switch_batt() {
/* assign values to variable if comma separated
* 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;
char *token = strtok(parameter, ",");
char *token = NULL;
if(parameter == NULL)
err(1, "malloc failed");
token = strtok(parameter, ",");
while (token != NULL) {
if(count == 0)
@ -224,6 +235,8 @@ void assign_values_from_param(char* parameter, int* charging, int* battery) {
if(count == 1)
*battery = *charging;
free(parameter);
}
/* 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
* relevant.
*/
void parse_sensor_path(char* path) {
void parse_sensor_path(char* pathk) {
const struct ctlnameconst ctlnames[] = CTL_NAMES;
const struct ctlnameconst ctlhwnames[] = CTL_HW_NAMES;
const size_t prefix_len =
@ -240,7 +253,8 @@ void parse_sensor_path(char* path) {
/*.*/1 +
/*sensors*/strlen(ctlhwnames[HW_SENSORS].ctl_name) +
/*.*/1;
char* prefix = malloc(prefix_len + 1);
char* path = NULL;
char* prefix = NULL;
/* these are pointers into optarg */
char* sensordevname = NULL, *sensortype = NULL, *sensornumts = NULL;
int sensornumt = -1;
@ -248,10 +262,14 @@ void parse_sensor_path(char* path) {
const char* errstr = NULL;
int dev = 0;
if(prefix == NULL) {
errno = ENOMEM;
return;
}
path = strdup(pathk);
if(path == NULL)
err(1, "malloc failed");
prefix = malloc(prefix_len + 1);
if(prefix == NULL)
err(1, "malloc failed");
memset(prefix, 0, prefix_len + 1);
strcpy(prefix, ctlnames[CTL_HW].ctl_name);
strcat(prefix, ".");
@ -300,7 +318,7 @@ void parse_sensor_path(char* path) {
if(verbose)
fprintf(stderr,
"%s does not look like a temperature sensor\n",
path);
pathk);
errno = EINVAL;
goto badprefix;
}
@ -364,6 +382,7 @@ void parse_sensor_path(char* path) {
badprefix:
free(prefix);
free(path);
}
@ -421,12 +440,14 @@ int main(int argc, char *argv[]) {
break;
case 'l':
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");
break;
case 'm':
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");
break;
case 'v':