[libvirt] [PATCH v2 10/20] virlog: Introduce virLogParseFilter
John Ferlan
jferlan at redhat.com
Wed Sep 21 18:35:52 UTC 2016
On 08/18/2016 07:47 AM, Erik Skultety wrote:
> Same as for outputs, introduce a new method, that is basically the same as
> virLogParseAndDefineFilter with the difference that it does not define the
> filter. It rather returns a newly created object that needs to be inserted into
> a list and then defined separately.
>
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
> src/libvirt_private.syms | 1 +
> src/util/virlog.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> src/util/virlog.h | 1 +
> 3 files changed, 47 insertions(+)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 79a6adc..1dfd7c8 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1867,6 +1867,7 @@ virLogOutputNew;
> virLogParseAndDefineFilters;
> virLogParseAndDefineOutputs;
> virLogParseDefaultPriority;
> +virLogParseFilter;
> virLogParseOutput;
> virLogPriorityFromSyslog;
> virLogProbablyLogMessage;
> diff --git a/src/util/virlog.c b/src/util/virlog.c
> index 7a6e639..43b3d75 100644
> --- a/src/util/virlog.c
> +++ b/src/util/virlog.c
> @@ -1921,3 +1921,48 @@ virLogParseOutput(const char *src)
> virStringFreeList(tokens);
> return ret;
> }
Again some intro comments would be nice. See patch 12 for your text...
> +
> +virLogFilterPtr
> +virLogParseFilter(const char *filter)
> +{
> + virLogFilterPtr ret = NULL;
> + size_t count = 0;
> + virLogPriority prio;
> + char **tokens = NULL;
> + unsigned int flags = 0;
> + char *ref = NULL;
> +
> + if (!filter)
> + return NULL;
Make use of ATTRIBUTE_NONNULL(1) in the prototype
> +
> + VIR_DEBUG("filter=%s", filter);
> +
How about a comment like the previous patch w/r/t what the expected
format is...
> + if (!(tokens = virStringSplitCount(filter, ":", 0, &count)))
> + return NULL;
> +
> + if (count != 2)
> + goto cleanup;
!! Here you check count, but previous patch you did not !!
Still requires some sort of error message to indicate why there's a
failure. That way the message below becomes unnecessary [1]
> +
> + if (virStrToLong_uip(tokens[0], NULL, 10, &prio) < 0 ||
> + (prio < VIR_LOG_DEBUG) || (prio > VIR_LOG_ERROR))
> + goto cleanup;
Similar to previous, split the checks and be sure provide error message
on prio failure...
> +
> + ref = tokens[1];
> + if (ref[0] == '+') {
> + flags |= VIR_LOG_STACK_TRACE;
> + ref++;
> + }
> +
> + if (!*ref)
> + goto cleanup;
Hmmmm... I know this is just a cut-n-paste of previous code, so is this
just a way to make sure that some string was provided and not some empty
string or not just "+"?
I guess it just seems odd - but could use an error message in any case.
> +
> + if (!(ret = virLogFilterNew(ref, prio, flags)))
> + goto cleanup;
> +
> + cleanup:
> + if (!ret)
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to parse and define log filter %s"), filter);
[1]
Rather than a catch-all error message which will/could overwrite some
previous valid ones, I think you should avoid printing this and stick to
setting error messages within the checks above.
> + virStringFreeList(tokens);
> + return ret;
> +}
> diff --git a/src/util/virlog.h b/src/util/virlog.h
> index af26e30..e7f6b85 100644
> --- a/src/util/virlog.h
> +++ b/src/util/virlog.h
> @@ -246,5 +246,6 @@ virLogOutputPtr virLogNewOutputToSyslog(virLogPriority priority,
> const char *ident);
> virLogOutputPtr virLogNewOutputToJournald(int priority);
> virLogOutputPtr virLogParseOutput(const char *src);
> +virLogFilterPtr virLogParseFilter(const char *src);
s/;/ATTRIBUTE_NONNULL(1);
ACK w/ adjustments
John
>
> #endif
>
More information about the libvir-list
mailing list