Everything has been prepared to successfully split parsing and defining logic
to separate operations.
---
src/libvirt_private.syms | 1 +
src/util/virlog.c | 100 +++++++++++++++++++++++------------------------
src/util/virlog.h | 8 ++--
tests/virlogtest.c | 7 ++--
4 files changed, 58 insertions(+), 58 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 608d959..5d6224e 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1786,6 +1786,7 @@ virLockSpaceReleaseResourcesForOwner;
# util/virlog.h
virLogDefineFilters;
virLogDefineOutputs;
+virLogFilterListFree;
virLogFilterNew;
virLogGetDefaultPriority;
virLogGetFilters;
diff --git a/src/util/virlog.c b/src/util/virlog.c
index 369d7dd..0116f56 100644
--- a/src/util/virlog.c
+++ b/src/util/virlog.c
@@ -257,57 +257,36 @@ virLogResetFilters(void)
* The filter defines a rules that will apply only to messages matching
* the pattern (currently if @match is a substring of the message category)
*
- * Returns -1 in case of failure or the filter number if successful
+ * Returns a reference to a newly created filter that needs to be defined using
+ * virLogDefineFiltersm, or NULL in case of an error.
*/
-int
+virLogFilterPtr
virLogFilterNew(const char *match,
virLogPriority priority,
unsigned int flags)
{
- size_t i;
- int ret = -1;
+ virLogFilterPtr ret = NULL;
char *mdup = NULL;
- virLogFilterPtr filter = NULL;
- virCheckFlags(VIR_LOG_STACK_TRACE, -1);
-
- if (virLogInitialize() < 0)
- return -1;
+ virCheckFlags(VIR_LOG_STACK_TRACE, NULL);
if ((match == NULL) || (priority < VIR_LOG_DEBUG) ||
(priority > VIR_LOG_ERROR))
- return -1;
-
- virLogLock();
- for (i = 0; i < virLogNbFilters; i++) {
- if (STREQ(virLogFilters[i]->match, match)) {
- virLogFilters[i]->priority = priority;
- ret = i;
- goto cleanup;
- }
- }
+ return NULL;
if (VIR_STRDUP_QUIET(mdup, match) < 0)
- goto cleanup;
+ return NULL;
- if (VIR_ALLOC_QUIET(filter) < 0) {
+ if (VIR_ALLOC_QUIET(ret) < 0) {
VIR_FREE(mdup);
- goto cleanup;
+ return NULL;
}
- filter->match = mdup;
- filter->priority = priority;
- filter->flags = flags;
-
- if (VIR_APPEND_ELEMENT_QUIET(virLogFilters, virLogNbFilters, filter) < 0)
- goto cleanup;
+ ret->match = mdup;
+ ret->priority = priority;
+ ret->flags = flags;
- virLogFiltersSerial++;
- cleanup:
- virLogUnlock();
- if (ret < 0)
- virReportOOMError();
- return virLogNbFilters;
+ return ret;
}
/**
@@ -1217,10 +1196,10 @@ virLogParseOutputs(const char *src, virLogOutputPtr **outputs)
}
-static int
+static virLogFilterPtr
virLogParseFilter(const char *filter)
{
- int ret = -1;
+ virLogFilterPtr ret = NULL;
size_t count = 0;
virLogPriority prio;
char **tokens = NULL;
@@ -1228,12 +1207,12 @@ virLogParseFilter(const char *filter)
char *ref = NULL;
if (!filter)
- return -1;
+ return NULL;
VIR_DEBUG("filter=%s", filter);
if (!(tokens = virStringSplitCount(filter, ":", 0, &count)))
- return -1;
+ return NULL;
if (count != 2)
goto cleanup;
@@ -1251,12 +1230,11 @@ virLogParseFilter(const char *filter)
if (!*ref)
goto cleanup;
- if (virLogFilterNew(ref, prio, flags) < 0)
+ if (!(ret = virLogFilterNew(ref, prio, flags)))
goto cleanup;
- ret = 0;
cleanup:
- if (ret < 0)
+ if (!ret)
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to parse and define log filter %s"), filter);
virStringFreeList(tokens);
@@ -1282,19 +1260,21 @@ virLogParseFilter(const char *filter)
* Returns the number of filter parsed or -1 in case of error.
*/
int
-virLogParseFilters(const char *filters)
+virLogParseFilters(const char *src, virLogFilterPtr **filters)
{
int ret = -1;
- int count = 0;
+ size_t count = 0;
size_t i;
char **strings = NULL;
+ virLogFilterPtr filter = NULL;
+ virLogFilterPtr *list = NULL;
- if (!filters)
+ if (!src)
return -1;
- VIR_DEBUG("filters=%s", filters);
+ VIR_DEBUG("filters=%s", src);
- if (!(strings = virStringSplit(filters, " ", 0)))
+ if (!(strings = virStringSplit(src, " ", 0)))
goto cleanup;
for (i = 0; strings[i]; i++) {
@@ -1302,14 +1282,22 @@ virLogParseFilters(const char *filters)
if (STREQ(strings[i], ""))
continue;
- if (virLogParseFilter(strings[i]) < 0)
+ if (!(filter = virLogParseFilter(strings[i])))
goto cleanup;
- count++;
+ if (VIR_APPEND_ELEMENT(list, count, filter)) {
+ virLogFilterFree(filter);
+ goto cleanup;
+ }
+
+ virLogFilterFree(filter);
}
ret = count;
+ *filters = list;
cleanup:
+ if (ret < 0)
+ virLogFilterListFree(list, count);
virStringFreeList(strings);
return ret;
}
@@ -1516,12 +1504,22 @@ int
virLogSetFilters(const char *filters)
{
int ret = -1;
+ int count = 0;
+ virLogFilterPtr *list = NULL;
if (virLogInitialize() < 0)
return -1;
- ret = virLogParseFilters(filters);
+ if ((count = virLogParseFilters(filters, &list)) < 0)
+ goto cleanup;
+ if (virLogDefineFilters(list, count) < 0)
+ goto cleanup;
+
+ ret = count;
+ cleanup:
+ if (ret < 0)
+ virLogFilterListFree(list, count);
return ret;
}
@@ -1599,9 +1597,9 @@ virLogDefineFilters(virLogFilterPtr *filters, size_t nfilters)
return -1;
virLogLock();
- virLogResetOutputs();
+ virLogResetFilters();
virLogFilters = filters;
- virLogNbOutputs = nfilters;
+ virLogNbFilters = nfilters;
virLogFiltersSerial++;
virLogUnlock();
diff --git a/src/util/virlog.h b/src/util/virlog.h
index 9b9f643..0102489 100644
--- a/src/util/virlog.h
+++ b/src/util/virlog.h
@@ -185,9 +185,9 @@ extern int virLogSetDefaultPriority(virLogPriority priority);
extern void virLogSetFromEnv(void);
extern int virLogSetFilters(const char *filters);
extern int virLogSetOutputs(const char *outputs);
-extern int virLogFilterNew(const char *match,
- virLogPriority priority,
- unsigned int flags);
+extern virLogFilterPtr virLogFilterNew(const char *match,
+ virLogPriority priority,
+ unsigned int flags);
extern virLogOutputPtr virLogOutputNew(virLogOutputFunc f,
virLogCloseFunc c,
void *data,
@@ -207,7 +207,7 @@ extern void virLogLock(void);
extern void virLogUnlock(void);
extern int virLogReset(void);
extern int virLogParseDefaultPriority(const char *priority);
-extern int virLogParseFilters(const char *filters);
+extern int virLogParseFilters(const char *src, virLogFilterPtr **filters);
extern int virLogParseOutputs(const char *src, virLogOutputPtr **outputs);
extern int virLogPriorityFromSyslog(int priority);
extern void virLogMessage(virLogSourcePtr source,
diff --git a/tests/virlogtest.c b/tests/virlogtest.c
index 02613f5..047013f 100644
--- a/tests/virlogtest.c
+++ b/tests/virlogtest.c
@@ -79,10 +79,11 @@ static int
testLogParseFilters(const void *opaque)
{
int ret = -1;
- int nfilters;
+ int nfilters = -1;
+ virLogFilterPtr *list = NULL;
const struct testLogData *data = opaque;
- nfilters = virLogParseFilters(data->str);
+ nfilters = virLogParseFilters(data->str, &list);
if (nfilters < 0) {
if (!data->pass) {
VIR_TEST_DEBUG("Got expected error: %s\n",
@@ -102,7 +103,7 @@ testLogParseFilters(const void *opaque)
ret = 0;
cleanup:
- virLogReset();
+ virLogFilterListFree(list, nfilters);
return ret;
}
--
2.4.11