On 07/18/2011 01:27 PM, Eric Blake wrote:
On 07/15/2011 05:12 PM, Eric Blake wrote:
> There were two API in driver.c that were silently masking flags
> bits prior to calling out to the drivers, and several others
> that were explicitly masking flags bits. This is not
> forward-compatible - if we ever have that many flags in the
> future, then talking to an old server that masks out the
> flags would be indistinguishable from talking to a new server
> that can honor the flag. In general, libvirt.c should forward
> _all_ flags on to drivers, and only the drivers should reject
> unknown flags.
>
> In the case of virDrvSecretGetValue, the solution is to separate
> the internal driver callback function to have two parameters
> instead of one, with only one parameter affected by the public
> API.
On second thought, I don't like this. It's nicer to have all the driver
callbacks match the public API as much as possible, and to instead
create a new entry point in libvirt_private.syms that qemu can use for
the case where it needs to call the internal API instead of the public
virSecretGetValue. v5 coming up.
Here's the interdiff for v5:
diff --git i/src/driver.h w/src/driver.h
index 9d0d3de..759150d 100644
--- i/src/driver.h
+++ w/src/driver.h
@@ -1258,6 +1258,10 @@ typedef int
typedef unsigned char *
(*virDrvSecretGetValue) (virSecretPtr secret,
size_t *value_size,
+ unsigned int flags);
+typedef unsigned char *
+ (*virDrvSecretGetValueInternal) (virSecretPtr secret,
+ size_t *value_size,
unsigned int flags,
unsigned int internalFlags);
typedef int
@@ -1295,6 +1299,7 @@ struct _virSecretDriver {
virDrvSecretGetXMLDesc getXMLDesc;
virDrvSecretSetValue setValue;
virDrvSecretGetValue getValue;
+ virDrvSecretGetValueInternal getValueInternal;
virDrvSecretUndefine undefine;
};
diff --git i/src/libvirt.c w/src/libvirt.c
index 39e2041..34acede 100644
--- i/src/libvirt.c
+++ w/src/libvirt.c
@@ -12680,7 +12680,7 @@ virSecretGetValue(virSecretPtr secret, size_t
*value_size, unsigned int flags)
if (conn->secretDriver != NULL && conn->secretDriver->getValue !=
NULL) {
unsigned char *ret;
- ret = conn->secretDriver->getValue(secret, value_size, flags, 0);
+ ret = conn->secretDriver->getValue(secret, value_size, flags);
if (ret == NULL)
goto error;
return ret;
diff --git i/src/qemu/qemu_process.c w/src/qemu/qemu_process.c
index 448b06e..cb7575f 100644
--- i/src/qemu/qemu_process.c
+++ w/src/qemu/qemu_process.c
@@ -257,7 +257,7 @@ qemuProcessGetVolumeQcowPassphrase(virConnectPtr conn,
if (conn->secretDriver == NULL ||
conn->secretDriver->lookupByUUID == NULL ||
- conn->secretDriver->getValue == NULL) {
+ conn->secretDriver->getValueInternal == NULL) {
qemuReportError(VIR_ERR_NO_SUPPORT, "%s",
_("secret storage not supported"));
goto cleanup;
@@ -276,8 +276,8 @@ qemuProcessGetVolumeQcowPassphrase(virConnectPtr conn,
enc->secrets[0]->uuid);
if (secret == NULL)
goto cleanup;
- data = conn->secretDriver->getValue(secret, &size, 0,
-
VIR_SECRET_GET_VALUE_INTERNAL_CALL);
+ data = conn->secretDriver->getValueInternal(secret, &size, 0,
+
VIR_SECRET_GET_VALUE_INTERNAL_CALL);
virUnrefSecret(secret);
if (data == NULL)
goto cleanup;
diff --git i/src/remote/remote_driver.c w/src/remote/remote_driver.c
index c2f8bbd..d3b5df9 100644
--- i/src/remote/remote_driver.c
+++ w/src/remote/remote_driver.c
@@ -3174,7 +3174,7 @@ remoteSecretClose (virConnectPtr conn)
static unsigned char *
remoteSecretGetValue (virSecretPtr secret, size_t *value_size,
- unsigned int flags, unsigned int internalFlags)
+ unsigned int flags)
{
unsigned char *rv = NULL;
remote_secret_get_value_args args;
@@ -3183,12 +3183,6 @@ remoteSecretGetValue (virSecretPtr secret, size_t
*value_size,
remoteDriverLock (priv);
- /* internalFlags intentionally do not go over the wire */
- if (internalFlags) {
- remoteError(VIR_ERR_NO_SUPPORT, "%s", _("no internalFlags
support"));
- goto done;
- }
-
make_nonnull_secret (&args.secret, secret);
args.flags = flags;
diff --git i/src/secret/secret_driver.c w/src/secret/secret_driver.c
index 02cdbb9..87e2b83 100644
--- i/src/secret/secret_driver.c
+++ w/src/secret/secret_driver.c
@@ -873,8 +873,9 @@ cleanup:
}
static unsigned char *
-secretGetValue(virSecretPtr obj, size_t *value_size, unsigned int flags,
- unsigned int internalFlags)
+secretGetValueInternal(virSecretPtr obj, size_t *value_size,
+ unsigned int flags,
+ unsigned int internalFlags)
{
virSecretDriverStatePtr driver = obj->conn->secretPrivateData;
unsigned char *ret = NULL;
@@ -921,6 +922,12 @@ cleanup:
return ret;
}
+static unsigned char *
+secretGetValue(virSecretPtr obj, size_t *value_size, unsigned int flags)
+{
+ return secretGetValueInternal(obj, value_size, flags, 0);
+}
+
static int
secretUndefine(virSecretPtr obj)
{
@@ -1078,6 +1085,7 @@ static virSecretDriver secretDriver = {
.getXMLDesc = secretGetXMLDesc, /* 0.7.1 */
.setValue = secretSetValue, /* 0.7.1 */
.getValue = secretGetValue, /* 0.7.1 */
+ .getValueInternal = secretGetValueInternal, /* 0.9.4 */
.undefine = secretUndefine, /* 0.7.1 */
};
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org