Enable libvirt users to modify logging filters of a daemon from outside.
---
daemon/admin.c | 10 ++++++++++
include/libvirt/libvirt-admin.h | 4 ++++
src/admin/admin_protocol.x | 12 +++++++++++-
src/admin_protocol-structs | 5 +++++
src/libvirt-admin.c | 36 ++++++++++++++++++++++++++++++++++++
src/libvirt_admin_private.syms | 1 +
src/libvirt_admin_public.syms | 1 +
7 files changed, 68 insertions(+), 1 deletion(-)
diff --git a/daemon/admin.c b/daemon/admin.c
index 866717a..663e818 100644
--- a/daemon/admin.c
+++ b/daemon/admin.c
@@ -187,6 +187,16 @@ adminConnectGetLoggingOutputs(char **outputs, unsigned int flags)
}
static int
+adminConnectSetLoggingFilters(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
+ const char *filters,
+ unsigned int flags)
+{
+ virCheckFlags(0, -1);
+
+ return virLogSetFilters(filters);
+}
+
+static int
adminDispatchConnectGetLoggingFilters(virNetServerPtr server ATTRIBUTE_UNUSED,
virNetServerClientPtr client ATTRIBUTE_UNUSED,
virNetMessagePtr msg ATTRIBUTE_UNUSED,
diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
index 8f26778..284a8f3 100644
--- a/include/libvirt/libvirt-admin.h
+++ b/include/libvirt/libvirt-admin.h
@@ -124,6 +124,10 @@ int virAdmConnectSetLoggingLevel(virAdmConnectPtr conn,
unsigned int level,
unsigned int flags);
+int virAdmConnectSetLoggingFilters(virAdmConnectPtr conn,
+ const char *filters,
+ unsigned int flags);
+
# ifdef __cplusplus
}
# endif
diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
index c62319c..aefebd4 100644
--- a/src/admin/admin_protocol.x
+++ b/src/admin/admin_protocol.x
@@ -105,6 +105,11 @@ struct admin_connect_set_logging_level_args {
unsigned int flags;
};
+struct admin_connect_set_logging_filters_args {
+ admin_nonnull_string filters;
+ unsigned int flags;
+};
+
/* Define the program number, protocol version and procedure numbers here. */
const ADMIN_PROGRAM = 0x06900690;
const ADMIN_PROTOCOL_VERSION = 1;
@@ -170,5 +175,10 @@ enum admin_procedure {
/**
* @generate: both
*/
- ADMIN_PROC_CONNECT_SET_LOGGING_LEVEL = 9
+ ADMIN_PROC_CONNECT_SET_LOGGING_LEVEL = 9,
+
+ /**
+ * @generate: both
+ */
+ ADMIN_PROC_CONNECT_SET_LOGGING_FILTERS = 10
};
diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs
index e6741c3..70b1b0e 100644
--- a/src/admin_protocol-structs
+++ b/src/admin_protocol-structs
@@ -50,6 +50,10 @@ struct admin_connect_set_logging_level_args {
u_int level;
u_int flags;
};
+struct admin_connect_set_logging_filters_args {
+ admin_nonnull_string filters;
+ u_int flags;
+};
enum admin_procedure {
ADMIN_PROC_CONNECT_OPEN = 1,
ADMIN_PROC_CONNECT_CLOSE = 2,
@@ -60,4 +64,5 @@ enum admin_procedure {
ADMIN_PROC_CONNECT_GET_LOGGING_FILTERS = 7,
ADMIN_PROC_CONNECT_GET_LOGGING_OUTPUTS = 8,
ADMIN_PROC_CONNECT_SET_LOGGING_LEVEL = 9,
+ ADMIN_PROC_CONNECT_SET_LOGGING_FILTERS = 10,
};
diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c
index 7b50dcb..3888fb9 100644
--- a/src/libvirt-admin.c
+++ b/src/libvirt-admin.c
@@ -821,3 +821,39 @@ virAdmConnectSetLoggingLevel(virAdmConnectPtr conn,
virDispatchError(NULL);
return -1;
}
+
+/**
+ * virAdmConnectSetLoggingFilters:
+ * @conn: pointer to an active admin connection
+ * @filters: list of filters, the format must conform to the format described in
+ * daemon's configuration file (e.g. libvirtd.conf)
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * Redefines the existing (set of) filter(s) with a new one specified in
+ * @filters. If multiple filters are specified, they need to be delimited by
+ * spaces.
+ *
+ * Returns 0 if a new set of filters has been successfully defined, or -1 in
+ * case of an error.
+ */
+int
+virAdmConnectSetLoggingFilters(virAdmConnectPtr conn,
+ const 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 = remoteAdminConnectSetLoggingFilters(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 f94e3f6..f78649e 100644
--- a/src/libvirt_admin_private.syms
+++ b/src/libvirt_admin_private.syms
@@ -18,6 +18,7 @@ xdr_admin_connect_list_servers_ret;
xdr_admin_connect_lookup_server_args;
xdr_admin_connect_lookup_server_ret;
xdr_admin_connect_open_args;
+xdr_admin_connect_set_logging_filters_args;
xdr_admin_connect_set_logging_level_args;
# datatypes.h
diff --git a/src/libvirt_admin_public.syms b/src/libvirt_admin_public.syms
index 0feadee..0a46cb7 100644
--- a/src/libvirt_admin_public.syms
+++ b/src/libvirt_admin_public.syms
@@ -29,4 +29,5 @@ LIBVIRT_ADMIN_1.3.0 {
virAdmServerFree;
virAdmConnectLookupServer;
virAdmConnectSetLoggingLevel;
+ virAdmConnectSetLoggingFilters;
};
--
2.4.3