Daniel Veillard wrote:
On Fri, Jun 29, 2007 at 03:08:47PM +0100, Daniel P. Berrange wrote:
> On Wed, Jun 27, 2007 at 07:04:00PM +0100, Daniel P. Berrange wrote:
>> The remote_internal.c code is basically a no-op in its remoteNetworkOpen
>> method. This means the remote driver will only handle the networking
>> APIs, if it is also handling the main domain APIs. This works fine if
>> connecting to a remote URI, or if using QEMU URIs, but it does not work
>> if using the test or Xen drivers.
>>
>> To make this work the remoteNetworkOpen method needs to open a connection
>> to the remote daemon IIF the remoteOpen method did not already open one.
>>
>> So the attached patch adds the neccessary logic in remoteNetworkOpen. It
>> also adds code to remoteNetworkClose to make it shutdown& free the
connection
>> IIF it was opened by the remoteNetworkOpen method. This is what the extra
>> 'networkOnly' field in the 'struct private_data' is used to
check.
>>
>> Second, all of the implementations of virNetwork* APIs in the remote_internal.c
>> driver must use the 'struct private_data *' from networkPrivateData
field
>> in virConnectPtr, not the 'privateData' field. This is because the
'privateData'
>> field is probably storing data related to the Xen or Test drivers.
>>
>> Third, this also fixes the qemu_driver.c which incorrectly used the
>> privateData field insteadof the networkPrivateData field for 2 of the
>> networking APIs, and finally makes sure the qemu_driver.c also acccepts
>> the use of qemu:///session APIs for root user.
> A new version of the patch which has all of the above plus:
>
> * Fixed the getType function in the qemu driver to return 'QEMU' instead
> of 'qemu', since the former is what we used to provide.
>
> * Adds in auto-start of the libvirtd if using qemu:///session of
> test://* (needed for networking) urls as non-root
>
> qemu_driver.c | 9 -
> remote_internal.c | 382 +++++++++++++++++++++++++++++++++++++++++++-----------
> 2 files changed, 312 insertions(+), 79 deletions(-)
[...]
[...]
> @@ -60,6 +64,7 @@ struct private_data {
> char *type; /* Cached return from remoteType. */
> int counter; /* Generates serial numbers for RPC. */
> char *uri; /* Original (remote) URI. */
> + int networkOnly; /* Only used for network API */
> };
small suggestion:
mabye the field name could be made more generic and would be reusable
for more flags.
> @@ -72,6 +77,16 @@ struct private_data {
> } \
> assert (priv->magic == MAGIC)
>
> +#define GET_NETWORK_PRIVATE(conn,retcode) \
> + struct private_data *priv = (struct private_data *)
(conn)->networkPrivateData; \
> + assert (priv); \
> + if (priv->magic == DEAD) { \
> + error (conn, VIR_ERR_INVALID_ARG, \
> + "tried to use a closed or uninitialised handle"); \
> + return (retcode); \
> + } \
> + assert (priv->magic == MAGIC)
> +
> static int call (virConnectPtr conn, struct private_data *priv, int in_open, int
proc_nr, xdrproc_t args_filter, char *args, xdrproc_t ret_filter, char *ret);
Hum .... asserts .... Can't we make a normal test/error/exit handling
so that errors there can be chanelled the same way as any other ?
These errors indicate memory corruption - in other words, game over -
the process must stop.
Rich.
--
Emerging Technologies, Red Hat -
http://et.redhat.com/~rjones/
Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod
Street, Windsor, Berkshire, SL4 1TE, United Kingdom. Registered in
England and Wales under Company Registration No. 03798903