- no point in allocating memory to hold command line arguments.

- allocate memory inside the function used.
This commit is contained in:
christos 2012-12-13 20:06:42 +00:00
parent a16db3405d
commit dd6ce158a9
1 changed files with 22 additions and 32 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: envstat.c,v 1.92 2012/12/13 19:31:25 christos Exp $ */
/* $NetBSD: envstat.c,v 1.93 2012/12/13 20:06:42 christos Exp $ */
/*-
* Copyright (c) 2007, 2008 Juan Romero Pardines.
@ -27,7 +27,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: envstat.c,v 1.92 2012/12/13 19:31:25 christos Exp $");
__RCSID("$NetBSD: envstat.c,v 1.93 2012/12/13 20:06:42 christos Exp $");
#endif /* not lint */
#include <stdio.h>
@ -112,7 +112,7 @@ static int parse_dictionary(int);
static int send_dictionary(FILE *);
static int find_sensors(prop_array_t, const char *, dvprops_t);
static void print_sensors(void);
static int check_sensors(char *);
static int check_sensors(const char *);
static int usage(void);
static int sysmonfd; /* fd of /dev/sysmon */
@ -132,17 +132,13 @@ int main(int argc, char **argv)
while ((c = getopt(argc, argv, "c:Dd:fIi:klrSs:Tw:Wx")) != -1) {
switch (c) {
case 'c': /* configuration file */
configfile = strdup(optarg);
if (configfile == NULL)
err(EXIT_FAILURE, "strdup");
configfile = optarg;
break;
case 'D': /* list registered devices */
flags |= ENVSYS_DFLAG;
break;
case 'd': /* show sensors of a specific device */
mydevname = strdup(optarg);
if (mydevname == NULL)
err(EXIT_FAILURE, "strdup");
mydevname = optarg;
break;
case 'f': /* display temperature in Farenheit */
flags |= ENVSYS_FFLAG;
@ -171,9 +167,7 @@ int main(int argc, char **argv)
flags |= ENVSYS_SFLAG;
break;
case 's': /* only show specified sensors */
sensors = strdup(optarg);
if (sensors == NULL)
err(EXIT_FAILURE, "strdup");
sensors = optarg;
break;
case 'T': /* make statistics */
flags |= ENVSYS_TFLAG;
@ -281,10 +275,6 @@ int main(int argc, char **argv)
rval = parse_dictionary(sysmonfd);
}
if (sensors)
free(sensors);
if (mydevname)
free(mydevname);
(void)prog_close(sysmonfd);
return rval ? EXIT_FAILURE : EXIT_SUCCESS;
@ -438,15 +428,8 @@ parse_dictionary(int fd)
}
/* print sensors now */
if (sensors) {
char *str = strdup(sensors);
if (!str) {
rval = ENOMEM;
goto out;
}
rval = check_sensors(str);
free(str);
}
if (sensors)
rval = check_sensors(sensors);
if ((flags & ENVSYS_LFLAG) == 0 && (flags & ENVSYS_DFLAG) == 0)
print_sensors();
if (interval)
@ -659,30 +642,33 @@ find_sensors(prop_array_t array, const char *dvname, dvprops_t edp)
}
static int
check_sensors(char *str)
check_sensors(const char *str)
{
sensor_t sensor = NULL;
char *dvstring, *sstring, *p, *last;
char *dvstring, *sstring, *p, *last, *s;
bool sensor_found = false;
if ((s = strdup(str)) == NULL)
return errno;
/*
* Parse device name and sensor description and find out
* if the sensor is valid.
*/
for ((p = strtok_r(str, ",", &last)); p;
for ((p = strtok_r(s, ",", &last)); p;
(p = strtok_r(NULL, ",", &last))) {
/* get device name */
dvstring = strtok(p, ":");
if (dvstring == NULL) {
warnx("missing device name");
return EINVAL;
goto out;
}
/* get sensor description */
sstring = strtok(NULL, ":");
if (sstring == NULL) {
warnx("missing sensor description");
return EINVAL;
goto out;
}
SIMPLEQ_FOREACH(sensor, &sensors_list, entries) {
@ -698,17 +684,21 @@ check_sensors(char *str)
if (sensor_found == false) {
warnx("unknown sensor `%s' for device `%s'",
sstring, dvstring);
return EINVAL;
goto out;
}
sensor_found = false;
}
/* check if all sensors were ok, and error out if not */
SIMPLEQ_FOREACH(sensor, &sensors_list, entries)
if (sensor->visible)
if (sensor->visible) {
free(s);
return 0;
}
warnx("no sensors selected to display");
out:
free(s);
return EINVAL;
}