Everything has been prepared to successfully split parsing and defining logic
to separate operations.
---
src/util/virlog.c | 160 +++++++++++++++++++++++++++++------------------------
src/util/virlog.h | 15 +++--
tests/testutils.c | 19 ++++++-
tests/virlogtest.c | 5 +-
4 files changed, 114 insertions(+), 85 deletions(-)
diff --git a/src/util/virlog.c b/src/util/virlog.c
index 7e0936c..369d7dd 100644
--- a/src/util/virlog.c
+++ b/src/util/virlog.c
@@ -343,64 +343,50 @@ virLogOutputFree(virLogOutputPtr output)
* @c: the function to call to close the output (or NULL)
* @data: extra data passed as first arg to the function
* @priority: minimal priority for this filter, use 0 for none
- * @dest: where to send output of this priority
+ * @dest: where to send output of this priority (see virLogDestination)
* @name: optional name data associated with an output
- * @flags: extra flag, currently unused
*
* Defines an output function for log messages. Each message once
- * gone though filtering is emitted through each registered output.
+ * gone through filtering is emitted through each registered output.
*
- * Returns -1 in case of failure or the output number if successful
+ * Returns reference to a newly created object or NULL in case of failure.
*/
-int
+virLogOutputPtr
virLogOutputNew(virLogOutputFunc f,
virLogCloseFunc c,
void *data,
virLogPriority priority,
virLogDestination dest,
- const char *name,
- unsigned int flags)
+ const char *name)
{
+ virLogOutputPtr ret = NULL;
char *ndup = NULL;
- virLogOutputPtr output = NULL;
-
- virCheckFlags(0, -1);
-
- if (virLogInitialize() < 0)
- return -1;
- if (f == NULL)
- return -1;
+ if (!f)
+ return NULL;
if (dest == VIR_LOG_TO_SYSLOG || dest == VIR_LOG_TO_FILE) {
- if (!name) {
- virReportOOMError();
- return -1;
- }
+ if (!name)
+ return NULL;
+
if (VIR_STRDUP(ndup, name) < 0)
- return -1;
+ return NULL;
}
- if (VIR_ALLOC_QUIET(output) < 0) {
+ if (VIR_ALLOC_QUIET(ret) < 0) {
VIR_FREE(ndup);
- return -1;
+ return NULL;
}
- output->logInitMessage = true;
- output->f = f;
- output->c = c;
- output->data = data;
- output->priority = priority;
- output->dest = dest;
- output->name = ndup;
+ ret->logInitMessage = true;
+ ret->f = f;
+ ret->c = c;
+ ret->data = data;
+ ret->priority = priority;
+ ret->dest = dest;
+ ret->name = ndup;
- virLogLock();
- if (VIR_APPEND_ELEMENT_QUIET(virLogOutputs, virLogNbOutputs, output))
- goto cleanup;
-
- cleanup:
- virLogUnlock();
- return virLogNbOutputs;
+ return ret;
}
@@ -717,32 +703,32 @@ virLogCloseFd(void *data)
}
-static int
+static virLogOutputPtr
virLogNewOutputToStderr(virLogPriority priority)
{
- if (virLogOutputNew(virLogOutputToFd, NULL, (void *)2L, priority,
- VIR_LOG_TO_STDERR, NULL, 0) < 0)
- return -1;
- return 0;
+ return virLogOutputNew(virLogOutputToFd, NULL, (void *)2L, priority,
+ VIR_LOG_TO_STDERR, NULL);
}
-static int
+static virLogOutputPtr
virLogNewOutputToFile(virLogPriority priority,
const char *file)
{
int fd;
+ virLogOutputPtr ret = NULL;
fd = open(file, O_CREAT | O_APPEND | O_WRONLY, S_IRUSR | S_IWUSR);
if (fd < 0)
- return -1;
- if (virLogOutputNew(virLogOutputToFd, virLogCloseFd,
- (void *)(intptr_t)fd,
- priority, VIR_LOG_TO_FILE, file, 0) < 0) {
- VIR_FORCE_CLOSE(fd);
- return -1;
+ return NULL;
+
+ if (!(ret = virLogOutputNew(virLogOutputToFd, virLogCloseFd,
+ (void *)(intptr_t)fd,
+ priority, VIR_LOG_TO_FILE, file))) {
+ VIR_LOG_CLOSE(fd);
+ return NULL;
}
- return 0;
+ return ret;
}
@@ -811,25 +797,28 @@ virLogCloseSyslog(void *data ATTRIBUTE_UNUSED)
}
-static int
+static virLogOutputPtr
virLogNewOutputToSyslog(virLogPriority priority,
const char *ident)
{
+ virLogOutputPtr ret = NULL;
+
/*
* ident needs to be kept around on Solaris
*/
VIR_FREE(current_ident);
if (VIR_STRDUP(current_ident, ident) < 0)
- return -1;
+ return NULL;
openlog(current_ident, 0, 0);
- if (virLogOutputNew(virLogOutputToSyslog, virLogCloseSyslog, NULL,
- priority, VIR_LOG_TO_SYSLOG, ident, 0) < 0) {
+ if (!(ret = virLogOutputNew(virLogOutputToSyslog, virLogCloseSyslog,
+ NULL, priority, VIR_LOG_TO_SYSLOG,
+ ident))) {
closelog();
VIR_FREE(current_ident);
- return -1;
+ return NULL;
}
- return 0;
+ return ret;
}
@@ -1035,19 +1024,25 @@ static void virLogCloseJournald(void *data ATTRIBUTE_UNUSED)
}
-static int virLogNewOutputToJournald(int priority)
+static virLogOutputPtr virLogNewOutputToJournald(int priority)
{
+ virLogOutputPtr ret = NULL;
+
if ((journalfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
- return -1;
+ return NULL;
if (virSetInherit(journalfd, false) < 0) {
VIR_LOG_CLOSE(journalfd);
- return -1;
+ return NULL;
}
- if (virLogOutputNew(virLogOutputToJournald, virLogCloseJournald, NULL,
- priority, VIR_LOG_TO_JOURNALD, NULL, 0) < 0) {
- return -1;
+
+ if (!(ret = virLogOutputNew(virLogOutputToJournald,
+ virLogCloseJournald, NULL,
+ priority, VIR_LOG_TO_JOURNALD, NULL))) {
+ VIR_LOG_CLOSE(journalfd);
+ return NULL;
}
- return 0;
+
+ return ret;
}
# endif /* USE_JOURNALD */
@@ -1081,11 +1076,10 @@ int virLogPriorityFromSyslog(int priority ATTRIBUTE_UNUSED)
((*cur == ' ') || (*cur == '\t') || (*cur == '\n') ||
\
(*cur == '\r') || (*cur == '\\'))
-
-static int
+static virLogOutputPtr
virLogParseOutput(const char *src)
{
- int ret = -1;
+ virLogOutputPtr ret = NULL;
char **tokens = NULL;
char *abspath = NULL;
size_t count = 0;
@@ -1094,7 +1088,7 @@ virLogParseOutput(const char *src)
bool isSUID = virIsSUID();
if (!src)
- return -1;
+ return NULL;
VIR_DEBUG("output=%s", src);
@@ -1102,7 +1096,7 @@ virLogParseOutput(const char *src)
* them individually
*/
if (!(tokens = virStringSplitCount(src, ":", 0, &count)))
- return -1;
+ return NULL;
if (virStrToLong_uip(tokens[0], NULL, 10, &prio) < 0 ||
(prio < VIR_LOG_DEBUG) || (prio > VIR_LOG_ERROR))
@@ -1146,7 +1140,7 @@ virLogParseOutput(const char *src)
}
cleanup:
- if (ret < 0)
+ if (!ret)
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to parse and define log output %s"), src);
virStringFreeList(tokens);
@@ -1180,12 +1174,14 @@ virLogParseOutput(const char *src)
* Returns the number of output parsed or -1 in case of error.
*/
int
-virLogParseOutputs(const char *src)
+virLogParseOutputs(const char *src, virLogOutputPtr **outputs)
{
int ret = -1;
- int count = 0;
+ size_t count = 0;
size_t i;
char **strings = NULL;
+ virLogOutputPtr output = NULL;
+ virLogOutputPtr *list = NULL;
if (!src)
return -1;
@@ -1200,14 +1196,22 @@ virLogParseOutputs(const char *src)
if (STREQ(strings[i], ""))
continue;
- if (virLogParseOutput(strings[i]) < 0)
+ if (!(output = virLogParseOutput(strings[i])))
goto cleanup;
- count++;
+ if (VIR_APPEND_ELEMENT(list, count, output) < 0) {
+ virLogOutputFree(output);
+ goto cleanup;
+ }
+
+ virLogOutputFree(output);
}
ret = count;
+ *outputs = list;
cleanup:
+ if (ret < 0)
+ virLogOutputListFree(list, count);
virStringFreeList(strings);
return ret;
}
@@ -1535,12 +1539,22 @@ int
virLogSetOutputs(const char *outputs)
{
int ret = -1;
+ int count = 0;
+ virLogOutputPtr *list = NULL;
if (virLogInitialize() < 0)
return -1;
- ret = virLogParseOutputs(outputs);
+ if ((count = virLogParseOutputs(outputs, &list)) < 0)
+ goto cleanup;
+ if (virLogDefineOutputs(list, count) < 0)
+ goto cleanup;
+
+ ret = count;
+ cleanup:
+ if (ret < 0)
+ virLogOutputListFree(list, count);
return ret;
}
diff --git a/src/util/virlog.h b/src/util/virlog.h
index eca7894..9b9f643 100644
--- a/src/util/virlog.h
+++ b/src/util/virlog.h
@@ -188,13 +188,12 @@ extern int virLogSetOutputs(const char *outputs);
extern int virLogFilterNew(const char *match,
virLogPriority priority,
unsigned int flags);
-extern int virLogOutputNew(virLogOutputFunc f,
- virLogCloseFunc c,
- void *data,
- virLogPriority priority,
- virLogDestination dest,
- const char *name,
- unsigned int flags);
+extern virLogOutputPtr virLogOutputNew(virLogOutputFunc f,
+ virLogCloseFunc c,
+ void *data,
+ virLogPriority priority,
+ virLogDestination dest,
+ const char *name);
extern void virLogOutputFree(virLogOutputPtr output);
extern void virLogFilterFree(virLogFilterPtr filter);
extern void virLogOutputListFree(virLogOutputPtr *list, int count);
@@ -209,7 +208,7 @@ extern void virLogUnlock(void);
extern int virLogReset(void);
extern int virLogParseDefaultPriority(const char *priority);
extern int virLogParseFilters(const char *filters);
-extern int virLogParseOutputs(const char *output);
+extern int virLogParseOutputs(const char *src, virLogOutputPtr **outputs);
extern int virLogPriorityFromSyslog(int priority);
extern void virLogMessage(virLogSourcePtr source,
virLogPriority priority,
diff --git a/tests/testutils.c b/tests/testutils.c
index 1b31eca..e679116 100644
--- a/tests/testutils.c
+++ b/tests/testutils.c
@@ -838,6 +838,9 @@ int virtTestMain(int argc,
{
int ret;
char *testRange = NULL;
+ size_t count = 0;
+ virLogOutputPtr output = NULL;
+ virLogOutputPtr *list = NULL;
#ifdef TEST_OOM
char *oomstr;
#endif
@@ -869,9 +872,21 @@ int virtTestMain(int argc,
virLogSetFromEnv();
if (!getenv("LIBVIRT_DEBUG") && !virLogGetNbOutputs()) {
- if (virLogOutputNew(virtTestLogOutput, virtTestLogClose, &testLog,
- VIR_LOG_DEBUG, VIR_LOG_TO_STDERR, NULL, 0) < 0)
+ if (!(output = virLogOutputNew(virtTestLogOutput, virtTestLogClose,
+ &testLog, VIR_LOG_DEBUG,
+ VIR_LOG_TO_STDERR, NULL)))
return EXIT_FAILURE;
+
+ if (VIR_APPEND_ELEMENT(list, count, output) < 0) {
+ virLogOutputFree(output);
+ return EXIT_FAILURE;
+ }
+
+ if (virLogDefineOutputs(list, count) < 0) {
+ virLogOutputListFree(list, count);
+ return EXIT_FAILURE;
+ }
+
}
if ((testRange = getenv("VIR_TEST_RANGE")) != NULL) {
diff --git a/tests/virlogtest.c b/tests/virlogtest.c
index 6abd4ae..02613f5 100644
--- a/tests/virlogtest.c
+++ b/tests/virlogtest.c
@@ -48,9 +48,10 @@ testLogParseOutputs(const void *opaque)
{
int ret = -1;
int noutputs;
+ virLogOutputPtr *list = NULL;
const struct testLogData *data = opaque;
- noutputs = virLogParseOutputs(data->str);
+ noutputs = virLogParseOutputs(data->str, &list);
if (noutputs < 0) {
if (!data->pass) {
VIR_TEST_DEBUG("Got expected error: %s\n",
@@ -70,7 +71,7 @@ testLogParseOutputs(const void *opaque)
ret = 0;
cleanup:
- virLogReset();
+ virLogOutputListFree(list, noutputs);
return ret;
}
--
2.4.11