static int testCryptoHash(const void *opaque) { const struct testCryptoHashData *data = opaque; char *actual = NULL; int ret = -1; if (virCryptoHashString(data->hash, data->input, &actual) < 0) { fprintf(stderr, "Failed to generate crypto hash\n"); goto cleanup; } if (STRNEQ_NULLABLE(data->output, actual)) { fprintf(stderr, "Expected hash '%s' but got '%s'\n", data->output, NULLSTR(actual)); goto cleanup; } ret = 0; cleanup: VIR_FREE(actual); return ret; }
static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock, unsigned int type, const char *name, size_t nparams, virLockManagerParamPtr params, unsigned int flags) { virLockManagerLockDaemonPrivatePtr priv = lock->privateData; char *newName = NULL; char *newLockspace = NULL; bool autoCreate = false; virCheckFlags(VIR_LOCK_MANAGER_RESOURCE_READONLY | VIR_LOCK_MANAGER_RESOURCE_SHARED, -1); if (flags & VIR_LOCK_MANAGER_RESOURCE_READONLY) return 0; switch (type) { case VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK: if (params || nparams) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unexpected parameters for disk resource")); return -1; } if (!driver->autoDiskLease) { if (!(flags & (VIR_LOCK_MANAGER_RESOURCE_SHARED | VIR_LOCK_MANAGER_RESOURCE_READONLY))) priv->hasRWDisks = true; return 0; } /* XXX we should somehow pass in TYPE=BLOCK info * from the domain_lock code, instead of assuming /dev */ if (STRPREFIX(name, "/dev") && driver->lvmLockSpaceDir) { VIR_DEBUG("Trying to find an LVM UUID for %s", name); if (virStorageFileGetLVMKey(name, &newName) < 0) goto error; if (newName) { VIR_DEBUG("Got an LVM UUID %s for %s", newName, name); if (VIR_STRDUP(newLockspace, driver->lvmLockSpaceDir) < 0) goto error; autoCreate = true; break; } virResetLastError(); /* Fallback to generic non-block code */ } if (STRPREFIX(name, "/dev") && driver->scsiLockSpaceDir) { VIR_DEBUG("Trying to find an SCSI ID for %s", name); if (virStorageFileGetSCSIKey(name, &newName) < 0) goto error; if (newName) { VIR_DEBUG("Got an SCSI ID %s for %s", newName, name); if (VIR_STRDUP(newLockspace, driver->scsiLockSpaceDir) < 0) goto error; autoCreate = true; break; } virResetLastError(); /* Fallback to generic non-block code */ } if (driver->fileLockSpaceDir) { if (VIR_STRDUP(newLockspace, driver->fileLockSpaceDir) < 0) goto error; if (virCryptoHashString(VIR_CRYPTO_HASH_SHA256, name, &newName) < 0) goto error; autoCreate = true; VIR_DEBUG("Using indirect lease %s for %s", newName, name); } else { if (VIR_STRDUP(newLockspace, "") < 0) goto error; if (VIR_STRDUP(newName, name) < 0) goto error; VIR_DEBUG("Using direct lease for %s", name); } break; case VIR_LOCK_MANAGER_RESOURCE_TYPE_LEASE: { size_t i; char *path = NULL; char *lockspace = NULL; for (i = 0; i < nparams; i++) { if (STREQ(params[i].key, "offset")) { if (params[i].value.ul != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Offset must be zero for this lock manager")); return -1; } } else if (STREQ(params[i].key, "lockspace")) { lockspace = params[i].value.str; } else if (STREQ(params[i].key, "path")) { path = params[i].value.str; } else { virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected parameter %s for lease resource"), params[i].key); return -1; } } if (!path || !lockspace) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing path or lockspace for lease resource")); return -1; } if (virAsprintf(&newLockspace, "%s/%s", path, lockspace) < 0) return -1; if (VIR_STRDUP(newName, name) < 0) goto error; } break; default: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unknown lock manager object type %d"), type); return -1; } if (VIR_EXPAND_N(priv->resources, priv->nresources, 1) < 0) goto error; priv->resources[priv->nresources-1].lockspace = newLockspace; priv->resources[priv->nresources-1].name = newName; if (flags & VIR_LOCK_MANAGER_RESOURCE_SHARED) priv->resources[priv->nresources-1].flags |= VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED; if (autoCreate) priv->resources[priv->nresources-1].flags |= VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE; return 0; error: VIR_FREE(newLockspace); VIR_FREE(newName); return -1; }