mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
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:
parent
a74d283a77
commit
368afd0bb6
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user