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:
Vlad Meșco 2022-11-05 12:19:33 +02:00 committed by Solene Rapenne
parent 48e0c80864
commit 0d3c032afb
1 changed files with 32 additions and 11 deletions

43
main.c
View File

@ -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':