commandhelper: Use automatic memory management in parseArguments

Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
Tim Wiederhake 2021-02-01 12:28:00 +01:00 committed by Peter Krempa
parent a74d283a77
commit 368afd0bb6

View File

@ -24,7 +24,9 @@
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
#define VIR_NO_GLIB_STDIO /* This file intentionally does not link to libvirt/glib */ /* This file intentionally does not link to libvirt/glib */
#define VIR_NO_GLIB_STDIO
#define cleanup(T, F) __attribute__((cleanup(F))) T
#include "testutils.h" #include "testutils.h"
#ifndef WIN32 #ifndef WIN32
@ -42,17 +44,27 @@ struct Arguments {
bool close_stdin; bool close_stdin;
}; };
static void cleanupArguments(struct Arguments **ptr)
{
struct Arguments *args = *ptr;
if (args)
free(args->readfds);
free(args);
}
static struct Arguments *parseArguments(int argc, char** argv) static struct Arguments *parseArguments(int argc, char** argv)
{ {
struct Arguments* args = NULL; cleanup(struct Arguments *, cleanupArguments) args = NULL;
int ret = -1; struct Arguments *ret;
size_t i; size_t i;
if (!(args = calloc(1, sizeof(*args)))) if (!(args = calloc(1, sizeof(*args))))
goto cleanup; return NULL;
if (!(args->readfds = calloc(1, sizeof(*args->readfds)))) if (!(args->readfds = calloc(1, sizeof(*args->readfds))))
goto cleanup; return NULL;
args->numreadfds = 1; args->numreadfds = 1;
args->readfds[0] = STDIN_FILENO; args->readfds[0] = STDIN_FILENO;
@ -65,12 +77,12 @@ static struct Arguments *parseArguments(int argc, char** argv)
(args->numreadfds + 1) * (args->numreadfds + 1) *
sizeof(*args->readfds)); sizeof(*args->readfds));
if (!args->readfds) if (!args->readfds)
goto cleanup; return NULL;
if (1 != sscanf(argv[i], "%u%c", if (1 != sscanf(argv[i], "%u%c",
&args->readfds[args->numreadfds++], &c)) { &args->readfds[args->numreadfds++], &c)) {
printf("Could not parse fd %s\n", argv[i]); printf("Could not parse fd %s\n", argv[i]);
goto cleanup; return NULL;
} }
} else if (STREQ(argv[i], "--check-daemonize")) { } else if (STREQ(argv[i], "--check-daemonize")) {
args->daemonize_check = true; args->daemonize_check = true;
@ -79,19 +91,9 @@ static struct Arguments *parseArguments(int argc, char** argv)
} }
} }
ret = 0; ret = args;
args = NULL;
cleanup: return ret;
if (ret == 0)
return args;
if (args) {
if (args->readfds)
free(args->readfds);
free(args);
}
return NULL;
} }
static void printArguments(FILE *log, int argc, char** argv) static void printArguments(FILE *log, int argc, char** argv)