[libvirt] [EXAMPLE PATCH 12/13] admin: Add virAdmHello function

2015-06-16 Thread Martin Kletzander
Just one of the simplest functions that returns string Clients: X
where X is the number of connected clients to daemon's first
subserver (the original one), so it can be tested using virsh, ipython,
etc.

The subserver is gathered by incrementing its reference
counter (similarly to getting qemu capabilities), so there is no
deadlock with admin subserver in this API.

Here you can see how functions should be named in the client (virAdm*)
and server (adm*).

There is also a parameter @flags that must be 0, which helps testing
proper error propagation into the client.

Signed-off-by: Martin Kletzander mklet...@redhat.com
---
 daemon/admin_server.c   | 23 +++
 include/libvirt/libvirt-admin.h |  1 +
 po/POTFILES.in  |  1 +
 src/admin/admin_protocol.x  | 16 +++-
 src/admin_protocol-structs  |  7 +++
 src/libvirt-admin.c | 26 ++
 src/libvirt_admin.syms  |  1 +
 7 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/daemon/admin_server.c b/daemon/admin_server.c
index 712a44beca10..76d0b28d7449 100644
--- a/daemon/admin_server.c
+++ b/daemon/admin_server.c
@@ -114,4 +114,27 @@ adminDispatchConnectClose(virNetServerPtr server 
ATTRIBUTE_UNUSED,
 return 0;
 }

+
+static char *
+admHello(virNetDaemonPtr dmn,
+ unsigned int flags)
+{
+char *ret = NULL;
+virNetServerPtr srv = NULL;
+size_t nclients;
+
+virCheckFlags(0, NULL);
+
+if (!(srv = virNetDaemonGetServer(dmn, 0)))
+return NULL;
+
+nclients = virNetServerGetNClients(srv);
+if (virAsprintf(ret, Clients: %zu, nclients)  0)
+goto cleanup;
+
+ cleanup:
+virObjectUnref(srv);
+return ret;
+}
+
 #include admin_dispatch.h
diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
index b3cfc93fcb7d..27178b45efe7 100644
--- a/include/libvirt/libvirt-admin.h
+++ b/include/libvirt/libvirt-admin.h
@@ -54,6 +54,7 @@ virAdmConnectPtr virAdmConnectOpen(const char *name, unsigned 
int flags);
 int virAdmConnectClose(virAdmConnectPtr conn);

 int virAdmConnectRef(virAdmConnectPtr conn);
+char *virAdmHello(virAdmConnectPtr conn, unsigned int flags);

 # ifdef __cplusplus
 }
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 189e2cc2f4d9..31f03d9e449d 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,3 +1,4 @@
+daemon/admin_dispatch.h
 daemon/admin_server.c
 daemon/libvirtd-config.c
 daemon/libvirtd.c
diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
index 1a2e94ee86e7..70954ccb87c2 100644
--- a/src/admin/admin_protocol.x
+++ b/src/admin/admin_protocol.x
@@ -43,6 +43,15 @@ struct admin_connect_open_args {
 unsigned int flags;
 };

+struct admin_hello_args {
+unsigned int flags;
+};
+
+struct admin_hello_ret {
+admin_string greeting;
+};
+
+
 /* Define the program number, protocol version and procedure numbers here. */
 const ADMIN_PROGRAM = 0x06900690;
 const ADMIN_PROTOCOL_VERSION = 1;
@@ -73,5 +82,10 @@ enum admin_procedure {
 /**
  * @generate: client
  */
-ADMIN_PROC_CONNECT_CLOSE = 2
+ADMIN_PROC_CONNECT_CLOSE = 2,
+
+/**
+ * @generate: both
+ */
+ADMIN_PROC_HELLO = 3
 };
diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs
index 3ac31fa2532a..f91f7013ad9b 100644
--- a/src/admin_protocol-structs
+++ b/src/admin_protocol-structs
@@ -2,7 +2,14 @@
 struct admin_connect_open_args {
 u_int  flags;
 };
+struct admin_hello_args {
+u_int  flags;
+};
+struct admin_hello_ret {
+admin_string   greeting;
+};
 enum admin_procedure {
 ADMIN_PROC_CONNECT_OPEN = 1,
 ADMIN_PROC_CONNECT_CLOSE = 2,
+ADMIN_PROC_HELLO = 3,
 };
diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c
index 11b6fe3238b8..107e27e4307c 100644
--- a/src/libvirt-admin.c
+++ b/src/libvirt-admin.c
@@ -384,3 +384,29 @@ virAdmConnectRef(virAdmConnectPtr conn)

 return 0;
 }
+
+
+/**
+ * virAdmHello:
+ * @conn: a connection object
+ * @flags: unused, 0 for now
+ *
+ * Testing function.
+ *
+ * Returns the number of connected clients as a string.  Yes, as a
+ * string.  Because it's just for testing.
+ */
+char *
+virAdmHello(virAdmConnectPtr conn,
+unsigned int flags)
+{
+char *ret = NULL;
+
+virResetLastError();
+
+ret = remoteAdminHello(conn, flags);
+if (!ret)
+virDispatchError(NULL);
+
+return ret;
+}
diff --git a/src/libvirt_admin.syms b/src/libvirt_admin.syms
index 4988dbe05135..4bb9bc4e776c 100644
--- a/src/libvirt_admin.syms
+++ b/src/libvirt_admin.syms
@@ -16,4 +16,5 @@ LIBVIRT_ADMIN_1.3.0 {
 virAdmConnectOpen;
 virAdmConnectClose;
 virAdmConnectRef;
+virAdmHello;
 };
--
2.4.3

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [EXAMPLE PATCH 12/13] admin: Add virAdmHello function

2015-05-21 Thread Michal Privoznik
On 20.05.2015 07:19, Martin Kletzander wrote:
 Just one of the simplest functions that returns string Clients: X
 where X is the number of connected clients to daemon's first
 subserver (the original one), so it can be tested using virsh, ipython,
 etc.
 
 The subserver is gathered by incrementing its reference
 counter (similarly to getting qemu capabilities), so there is no
 deadlock with admin subserver in this API.
 
 Here you can see how functions should be named in the client (virAdm*)
 and server (adm*).
 
 There is also a parameter @flags that must be 0, which helps testing
 proper error propagation into the client.
 
 Signed-off-by: Martin Kletzander mklet...@redhat.com
 ---
  daemon/admin_server.c   | 23 +++
  include/libvirt/libvirt-admin.h |  1 +
  po/POTFILES.in  |  1 +
  src/admin/admin_protocol.x  | 15 ++-
  src/admin_protocol-structs  |  9 +
  src/libvirt-admin.c | 26 ++
  src/libvirt_admin.syms  |  1 +
  7 files changed, 75 insertions(+), 1 deletion(-)
 
 diff --git a/daemon/admin_server.c b/daemon/admin_server.c
 index 810908b..e722757 100644
 --- a/daemon/admin_server.c
 +++ b/daemon/admin_server.c
 @@ -113,4 +113,27 @@ adminDispatchConnectClose(virNetServerPtr server 
 ATTRIBUTE_UNUSED,
  return 0;
  }
 
 +
 +static char *
 +admHello(virNetDaemonPtr dmn,
 + unsigned int flags)
 +{
 +char *ret = NULL;
 +virNetServerPtr srv = NULL;
 +size_t nclients;
 +
 +virCheckFlags(0, NULL);
 +
 +if (!(srv = virNetDaemonGetServer(dmn, 0)))
 +return NULL;
 +
 +nclients = virNetServerGetNClients(srv);
 +if (virAsprintf(ret, Clients: %zu, nclients)  0)
 +goto cleanup;
 +
 + cleanup:
 +virObjectUnref(srv);
 +return ret;
 +}
 +
  #include admin_dispatch.h
 diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
 index b3cfc93..27178b4 100644
 --- a/include/libvirt/libvirt-admin.h
 +++ b/include/libvirt/libvirt-admin.h
 @@ -54,6 +54,7 @@ virAdmConnectPtr virAdmConnectOpen(const char *name, 
 unsigned int flags);
  int virAdmConnectClose(virAdmConnectPtr conn);
 
  int virAdmConnectRef(virAdmConnectPtr conn);
 +char *virAdmHello(virAdmConnectPtr conn, unsigned int flags);
 
  # ifdef __cplusplus
  }
 diff --git a/po/POTFILES.in b/po/POTFILES.in
 index 189e2cc..31f03d9 100644
 --- a/po/POTFILES.in
 +++ b/po/POTFILES.in
 @@ -1,3 +1,4 @@
 +daemon/admin_dispatch.h
  daemon/admin_server.c
  daemon/libvirtd-config.c
  daemon/libvirtd.c
 diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
 index 63f6a53..03b98ec 100644
 --- a/src/admin/admin_protocol.x
 +++ b/src/admin/admin_protocol.x
 @@ -30,6 +30,14 @@ struct admin_connect_open_args {
  unsigned int flags;
  };
 
 +struct admin_hello_args {
 +unsigned int flags;
 +};
 +
 +struct admin_hello_ret {
 +remote_string greeting;

A-ha! Now I see why you wanted to drag in remote_protocol.c (my comment
to 7/13). Well, if you:

const REMOTE_STRING_MAX = 4194304;

/* A long string, which may NOT be NULL. */
typedef string remote_nonnull_stringREMOTE_STRING_MAX;

/* A long string, which may be NULL. */
typedef remote_nonnull_string *remote_string;

then you don't need anymore.

 +};
 +
 

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [EXAMPLE PATCH 12/13] admin: Add virAdmHello function

2015-05-19 Thread Martin Kletzander
Just one of the simplest functions that returns string Clients: X
where X is the number of connected clients to daemon's first
subserver (the original one), so it can be tested using virsh, ipython,
etc.

The subserver is gathered by incrementing its reference
counter (similarly to getting qemu capabilities), so there is no
deadlock with admin subserver in this API.

Here you can see how functions should be named in the client (virAdm*)
and server (adm*).

There is also a parameter @flags that must be 0, which helps testing
proper error propagation into the client.

Signed-off-by: Martin Kletzander mklet...@redhat.com
---
 daemon/admin_server.c   | 23 +++
 include/libvirt/libvirt-admin.h |  1 +
 po/POTFILES.in  |  1 +
 src/admin/admin_protocol.x  | 15 ++-
 src/admin_protocol-structs  |  9 +
 src/libvirt-admin.c | 26 ++
 src/libvirt_admin.syms  |  1 +
 7 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/daemon/admin_server.c b/daemon/admin_server.c
index 810908b..e722757 100644
--- a/daemon/admin_server.c
+++ b/daemon/admin_server.c
@@ -113,4 +113,27 @@ adminDispatchConnectClose(virNetServerPtr server 
ATTRIBUTE_UNUSED,
 return 0;
 }

+
+static char *
+admHello(virNetDaemonPtr dmn,
+ unsigned int flags)
+{
+char *ret = NULL;
+virNetServerPtr srv = NULL;
+size_t nclients;
+
+virCheckFlags(0, NULL);
+
+if (!(srv = virNetDaemonGetServer(dmn, 0)))
+return NULL;
+
+nclients = virNetServerGetNClients(srv);
+if (virAsprintf(ret, Clients: %zu, nclients)  0)
+goto cleanup;
+
+ cleanup:
+virObjectUnref(srv);
+return ret;
+}
+
 #include admin_dispatch.h
diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
index b3cfc93..27178b4 100644
--- a/include/libvirt/libvirt-admin.h
+++ b/include/libvirt/libvirt-admin.h
@@ -54,6 +54,7 @@ virAdmConnectPtr virAdmConnectOpen(const char *name, unsigned 
int flags);
 int virAdmConnectClose(virAdmConnectPtr conn);

 int virAdmConnectRef(virAdmConnectPtr conn);
+char *virAdmHello(virAdmConnectPtr conn, unsigned int flags);

 # ifdef __cplusplus
 }
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 189e2cc..31f03d9 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,3 +1,4 @@
+daemon/admin_dispatch.h
 daemon/admin_server.c
 daemon/libvirtd-config.c
 daemon/libvirtd.c
diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
index 63f6a53..03b98ec 100644
--- a/src/admin/admin_protocol.x
+++ b/src/admin/admin_protocol.x
@@ -30,6 +30,14 @@ struct admin_connect_open_args {
 unsigned int flags;
 };

+struct admin_hello_args {
+unsigned int flags;
+};
+
+struct admin_hello_ret {
+remote_string greeting;
+};
+

 /* Define the program number, protocol version and procedure numbers here. */
 const ADMIN_PROGRAM = 0x06900690;
@@ -61,5 +69,10 @@ enum admin_procedure {
 /**
  * @generate: client
  */
-ADMIN_PROC_CONNECT_CLOSE = 2
+ADMIN_PROC_CONNECT_CLOSE = 2,
+
+/**
+ * @generate: both
+ */
+ADMIN_PROC_HELLO = 3
 };
diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs
index bc1d489..7af66ce 100644
--- a/src/admin_protocol-structs
+++ b/src/admin_protocol-structs
@@ -3,7 +3,16 @@ struct admin_connect_open_args {
 unsigned int flags;
 };

+struct admin_hello_args {
+unsigned int flags;
+};
+
+struct admin_hello_ret {
+remote_string greeting;
+};
+
 enum admin_procedure {
 ADMIN_PROC_CONNECT_OPEN = 1,
 ADMIN_PROC_CONNECT_CLOSE = 2,
+ADMIN_PROC_HELLO = 3,
 };
diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c
index 11b6fe3..107e27e 100644
--- a/src/libvirt-admin.c
+++ b/src/libvirt-admin.c
@@ -384,3 +384,29 @@ virAdmConnectRef(virAdmConnectPtr conn)

 return 0;
 }
+
+
+/**
+ * virAdmHello:
+ * @conn: a connection object
+ * @flags: unused, 0 for now
+ *
+ * Testing function.
+ *
+ * Returns the number of connected clients as a string.  Yes, as a
+ * string.  Because it's just for testing.
+ */
+char *
+virAdmHello(virAdmConnectPtr conn,
+unsigned int flags)
+{
+char *ret = NULL;
+
+virResetLastError();
+
+ret = remoteAdminHello(conn, flags);
+if (!ret)
+virDispatchError(NULL);
+
+return ret;
+}
diff --git a/src/libvirt_admin.syms b/src/libvirt_admin.syms
index ea6a8cc..8d5c3f8 100644
--- a/src/libvirt_admin.syms
+++ b/src/libvirt_admin.syms
@@ -15,4 +15,5 @@ LIBVIRT_ADMIN_1.3.0 {
 virAdmInitialize;
 virAdmConnectOpen;
 virAdmConnectClose;
+virAdmHello;
 };
--
2.4.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list