[libvirt] [PATCH 32/38] admin: Introduce virAdmConnectGetLoggingFilters

Erik Skultety eskultet at redhat.com
Thu Mar 31 17:49:05 UTC 2016


Enable libvirt users to query logging filter settings.
---
 daemon/admin.c                  | 45 +++++++++++++++++++++++++++++++++++++++++
 include/libvirt/libvirt-admin.h |  4 ++++
 src/admin/admin_protocol.x      | 16 ++++++++++++++-
 src/admin/admin_remote.c        | 43 +++++++++++++++++++++++++++++++++++++++
 src/admin_protocol-structs      |  8 ++++++++
 src/libvirt-admin.c             | 40 ++++++++++++++++++++++++++++++++++++
 src/libvirt_admin_private.syms  |  2 ++
 src/libvirt_admin_public.syms   |  1 +
 8 files changed, 158 insertions(+), 1 deletion(-)

diff --git a/daemon/admin.c b/daemon/admin.c
index ed07988..5098286 100644
--- a/daemon/admin.c
+++ b/daemon/admin.c
@@ -141,4 +141,49 @@ adminConnectGetLoggingLevel(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
 
     return virLogGetDefaultPriority();
 }
+
+static int
+adminConnectGetLoggingFilters(char **filters, unsigned int flags)
+{
+    char *tmp = NULL;
+    int ret = -1;
+
+    virCheckFlags(0, -1);
+
+    if (!(tmp = virLogGetFilters()))
+        return -1;
+
+    ret = virLogGetNbFilters();
+
+    *filters = tmp;
+    return ret;
+}
+
+static int
+adminDispatchConnectGetLoggingFilters(virNetServerPtr server ATTRIBUTE_UNUSED,
+                                      virNetServerClientPtr client ATTRIBUTE_UNUSED,
+                                      virNetMessagePtr msg ATTRIBUTE_UNUSED,
+                                      virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
+                                      admin_connect_get_logging_filters_args *args,
+                                      admin_connect_get_logging_filters_ret *ret)
+{
+    char *filters = NULL;
+    int nfilters = 0;
+    int rv = -1;
+
+    if ((nfilters = adminConnectGetLoggingFilters(&filters, args->flags)) < 0)
+        goto cleanup;
+
+    if (VIR_STRDUP(ret->filters, filters) < 0)
+        goto cleanup;
+
+    ret->nfilters = nfilters;
+    rv = 0;
+
+ cleanup:
+    if (rv < 0)
+        virNetMessageSaveError(rerr);
+    VIR_FREE(filters);
+    return rv;
+}
 #include "admin_dispatch.h"
diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
index c1aba01..27e1f0b 100644
--- a/include/libvirt/libvirt-admin.h
+++ b/include/libvirt/libvirt-admin.h
@@ -111,6 +111,10 @@ virAdmServerPtr virAdmConnectLookupServer(virAdmConnectPtr conn,
                                           unsigned int flags);
 
 int virAdmConnectGetLoggingLevel(virAdmConnectPtr conn, unsigned int flags);
+
+int virAdmConnectGetLoggingFilters(virAdmConnectPtr conn,
+                                   char **logFilters,
+                                   unsigned int flags);
 # ifdef __cplusplus
 }
 # endif
diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
index 268c81e..60ebe03 100644
--- a/src/admin/admin_protocol.x
+++ b/src/admin/admin_protocol.x
@@ -82,6 +82,15 @@ struct admin_connect_get_logging_level_ret {
     int level;
 };
 
+struct admin_connect_get_logging_filters_args {
+    unsigned int flags;
+};
+
+struct admin_connect_get_logging_filters_ret {
+    admin_nonnull_string filters;
+    unsigned int nfilters;
+};
+
 /* Define the program number, protocol version and procedure numbers here. */
 const ADMIN_PROGRAM = 0x06900690;
 const ADMIN_PROTOCOL_VERSION = 1;
@@ -132,5 +141,10 @@ enum admin_procedure {
     /**
      * @generate: both
      */
-    ADMIN_PROC_CONNECT_GET_LOGGING_LEVEL = 6
+    ADMIN_PROC_CONNECT_GET_LOGGING_LEVEL = 6,
+
+    /**
+     * @generate: none
+     */
+    ADMIN_PROC_CONNECT_GET_LOGGING_FILTERS = 7
 };
diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c
index 21e0dd3..17954e6 100644
--- a/src/admin/admin_remote.c
+++ b/src/admin/admin_remote.c
@@ -224,3 +224,46 @@ remoteAdminPrivNew(const char *sock_path)
     virObjectUnref(priv);
     return NULL;
 }
+
+static int
+remoteAdminConnectGetLoggingFilters(virAdmConnectPtr conn,
+                                    char **filters,
+                                    unsigned int flags)
+{
+    int rv = -1;
+    char *tmp_filters = NULL;
+    remoteAdminPrivPtr priv = conn->privateData;
+    admin_connect_get_logging_filters_args args;
+    admin_connect_get_logging_filters_ret ret;
+
+    args.flags = flags;
+
+    memset(&ret, 0, sizeof(ret));
+    virObjectLock(priv);
+
+    if (call(conn,
+             0,
+             ADMIN_PROC_CONNECT_GET_LOGGING_FILTERS,
+             (xdrproc_t) xdr_admin_connect_get_logging_filters_args,
+             (char *) &args,
+             (xdrproc_t) xdr_admin_connect_get_logging_filters_ret,
+             (char *) &ret) == -1)
+        goto done;
+
+    if (filters) {
+        if (VIR_STRDUP(tmp_filters, ret.filters) < 0)
+            goto cleanup;
+
+        *filters = tmp_filters;
+        tmp_filters = NULL;
+    }
+
+    rv = ret.nfilters;
+
+ cleanup:
+    xdr_free((xdrproc_t) xdr_admin_connect_get_logging_filters_ret, (char *) &ret);
+
+ done:
+    virObjectUnlock(priv);
+    return rv;
+}
diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs
index 9d0397c..b7d5fa1 100644
--- a/src/admin_protocol-structs
+++ b/src/admin_protocol-structs
@@ -32,6 +32,13 @@ struct admin_connect_get_logging_level_args {
 struct admin_connect_get_logging_level_ret {
         int                        level;
 };
+struct admin_connect_get_logging_filters_args {
+        u_int                      flags;
+};
+struct admin_connect_get_logging_filters_ret {
+        admin_nonnull_string       filters;
+        u_int                      nfilters;
+};
 enum admin_procedure {
         ADMIN_PROC_CONNECT_OPEN = 1,
         ADMIN_PROC_CONNECT_CLOSE = 2,
@@ -39,4 +46,5 @@ enum admin_procedure {
         ADMIN_PROC_CONNECT_LIST_SERVERS = 4,
         ADMIN_PROC_CONNECT_LOOKUP_SERVER = 5,
         ADMIN_PROC_CONNECT_GET_LOGGING_LEVEL = 6,
+        ADMIN_PROC_CONNECT_GET_LOGGING_FILTERS = 7,
 };
diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c
index f29c83d..2c7548c 100644
--- a/src/libvirt-admin.c
+++ b/src/libvirt-admin.c
@@ -707,3 +707,43 @@ virAdmConnectGetLoggingLevel(virAdmConnectPtr conn,
     virDispatchError(NULL);
     return -1;
 }
+
+/**
+ * virAdmConnectGetLoggingFilters:
+ * @conn: pointer to an active admin connection
+ * @filters: pointer to a variable to store a NULL-terminated list of
+ *           currently defined logging filters;
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * Retrieves a list of currently installed logging filters. Filters returned
+ * are contained within a string and delimited by spaces. The format of each
+ * filter conforms to the format described in daemon's configuration file
+ * (e.g. libvirtd.conf).
+ * To retrieve individual filters, additional parsing needs to be done by the
+ * caller. Caller is also responsible for freeing @filters correctly.
+ *
+ * Returns the number of filters returned in @filters, or -1 in case of
+ * an error.
+ */
+int
+virAdmConnectGetLoggingFilters(virAdmConnectPtr conn,
+                               char **filters,
+                               unsigned int flags)
+{
+    int ret = -1;
+
+    VIR_DEBUG("conn=%p, flags=%x", conn, flags);
+
+    virResetLastError();
+    virCheckAdmConnectReturn(conn, -1);
+    virCheckNonNullArgGoto(filters, error);
+
+    if ((ret = remoteAdminConnectGetLoggingFilters(conn, filters,
+                                                   flags)) < 0)
+        goto error;
+
+    return ret;
+ error:
+    virDispatchError(NULL);
+    return -1;
+}
diff --git a/src/libvirt_admin_private.syms b/src/libvirt_admin_private.syms
index d2e2292..341f896 100644
--- a/src/libvirt_admin_private.syms
+++ b/src/libvirt_admin_private.syms
@@ -7,6 +7,8 @@
 
 # admin/admin_protocol.x
 xdr_admin_connect_get_lib_version_ret;
+xdr_admin_connect_get_logging_filters_args;
+xdr_admin_connect_get_logging_filters_ret;
 xdr_admin_connect_get_logging_level_args;
 xdr_admin_connect_get_logging_level_ret;
 xdr_admin_connect_list_servers_args;
diff --git a/src/libvirt_admin_public.syms b/src/libvirt_admin_public.syms
index 37d534e..41c858f 100644
--- a/src/libvirt_admin_public.syms
+++ b/src/libvirt_admin_public.syms
@@ -23,6 +23,7 @@ LIBVIRT_ADMIN_1.3.0 {
         virAdmConnectUnregisterCloseCallback;
         virAdmConnectListServers;
         virAdmConnectGetLoggingLevel;
+        virAdmConnectGetLoggingFilters;
         virAdmServerGetName;
         virAdmServerFree;
         virAdmConnectLookupServer;
-- 
2.4.3




More information about the libvir-list mailing list