#include "configmake.h"
#include "virstring.h"
#include "viraccessapicheck.h"
+#include "secret_event.h"
#define VIR_FROM_THIS VIR_FROM_SECRET
virMutex lock;
virSecretObjListPtr secrets;
char *configDir;
+
+ /* Immutable pointer, self-locking APIs */
+ virObjectEventStatePtr secretEventState;
};
static virSecretDriverStatePtr driver;
virSecretObjPtr secret = NULL;
virSecretDefPtr backup = NULL;
virSecretDefPtr new_attrs;
+ virObjectEventPtr event = NULL;
virCheckFlags(0, NULL);
/* Saved successfully - drop old values */
virSecretDefFree(backup);
+ event = virSecretEventLifecycleNew(new_attrs->uuid,
+ new_attrs->usage_type,
+ new_attrs->usage_id,
+ VIR_SECRET_EVENT_DEFINED,
+ 0);
+
ret = virGetSecret(conn,
new_attrs->uuid,
new_attrs->usage_type,
cleanup:
virSecretDefFree(new_attrs);
virSecretObjEndAPI(&secret);
+ if (event)
+ virObjectEventStateQueue(driver->secretEventState, event);
return ret;
}
int ret = -1;
virSecretObjPtr secret;
virSecretDefPtr def;
+ virObjectEventPtr event = NULL;
if (!(secret = secretObjFromSecret(obj)))
goto cleanup;
if (virSecretObjDeleteConfig(secret) < 0)
goto cleanup;
+ event = virSecretEventLifecycleNew(def->uuid,
+ def->usage_type,
+ def->usage_id,
+ VIR_SECRET_EVENT_UNDEFINED,
+ 0);
+
virSecretObjDeleteData(secret);
virSecretObjListRemove(driver->secrets, secret);
cleanup:
virSecretObjEndAPI(&secret);
+ if (event)
+ virObjectEventStateQueue(driver->secretEventState, event);
return ret;
}
virObjectUnref(driver->secrets);
VIR_FREE(driver->configDir);
+ virObjectUnref(driver->secretEventState);
+
secretDriverUnlock();
virMutexDestroy(&driver->lock);
VIR_FREE(driver);
}
secretDriverLock();
+ driver->secretEventState = virObjectEventStateNew();
+
if (privileged) {
if (VIR_STRDUP(base, SYSCONFDIR "/libvirt") < 0)
goto error;
return 0;
}
+static int
+secretConnectSecretEventRegisterAny(virConnectPtr conn,
+ virSecretPtr secret,
+ int eventID,
+ virConnectSecretEventGenericCallback callback,
+ void *opaque,
+ virFreeCallback freecb)
+{
+ int callbackID = -1;
+
+ if (virConnectSecretEventRegisterAnyEnsureACL(conn) < 0)
+ goto cleanup;
+
+ if (virSecretEventStateRegisterID(conn, driver->secretEventState,
+ secret, eventID, callback,
+ opaque, freecb, &callbackID) < 0)
+ callbackID = -1;
+ cleanup:
+ return callbackID;
+}
+
+static int
+secretConnectSecretEventDeregisterAny(virConnectPtr conn,
+ int callbackID)
+{
+ int ret = -1;
+
+ if (virConnectSecretEventDeregisterAnyEnsureACL(conn) < 0)
+ goto cleanup;
+
+ if (virObjectEventStateDeregisterID(conn,
+ driver->secretEventState,
+ callbackID) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ return ret;
+}
+
+
static virSecretDriver secretDriver = {
.name = "secret",
.connectNumOfSecrets = secretConnectNumOfSecrets, /* 0.7.1 */
.secretSetValue = secretSetValue, /* 0.7.1 */
.secretGetValue = secretGetValue, /* 0.7.1 */
.secretUndefine = secretUndefine, /* 0.7.1 */
+ .connectSecretEventRegisterAny = secretConnectSecretEventRegisterAny, /* 3.0.0 */
+ .connectSecretEventDeregisterAny = secretConnectSecretEventDeregisterAny, /* 3.0.0 */
};
static virStateDriver stateDriver = {