virDomainDriverGenerateMachineName: Factor out embed path hashing

The code that generates "qemu-embed-$hash" is going to be useful
in more places. Separate it out into a function.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Michal Privoznik 2020-03-20 19:52:32 +01:00
parent 8b9488d929
commit 5bc3299447
3 changed files with 33 additions and 14 deletions

View File

@ -28,6 +28,22 @@
#define VIR_FROM_THIS VIR_FROM_DOMAIN
char *
virDomainDriverGenerateRootHash(const char *drivername,
const char *root)
{
g_autofree char *hash = NULL;
if (virCryptoHashString(VIR_CRYPTO_HASH_SHA256, root, &hash) < 0)
return NULL;
/* When two embed drivers start two domains with the same @name and @id
* we would generate a non-unique name. Include parts of hashed @root
* which guarantees uniqueness. The first 8 characters of SHA256 ought
* to be enough for anybody. */
return g_strdup_printf("%s-embed-%.8s", drivername, hash);
}
#define HOSTNAME_CHARS \
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"
@ -72,26 +88,24 @@ virDomainDriverGenerateMachineName(const char *drivername,
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
virBufferAsprintf(&buf, "%s-", drivername);
if (root) {
g_autofree char *hash = NULL;
/* When two embed drivers start two domains with the same @name and @id
* we would generate a non-unique name. Include parts of hashed @root
* which guarantees uniqueness. The first 8 characters of SHA256 ought
* to be enough for anybody. */
if (virCryptoHashString(VIR_CRYPTO_HASH_SHA256, root, &hash) < 0)
if (!(hash = virDomainDriverGenerateRootHash(drivername, root)))
return NULL;
virBufferAsprintf(&buf, "embed-%.8s-", hash);
} else if (!privileged) {
g_autofree char *username = NULL;
if (!(username = virGetUserName(geteuid()))) {
virBufferFreeAndReset(&buf);
return NULL;
virBufferAsprintf(&buf, "%s-", hash);
} else {
virBufferAsprintf(&buf, "%s-", drivername);
if (!privileged) {
g_autofree char *username = NULL;
if (!(username = virGetUserName(geteuid()))) {
virBufferFreeAndReset(&buf);
return NULL;
}
virBufferAsprintf(&buf, "%s-", username);
}
virBufferAsprintf(&buf, "%s-", username);
}
virBufferAsprintf(&buf, "%d-", id);

View File

@ -22,6 +22,10 @@
#include "domain_conf.h"
char *
virDomainDriverGenerateRootHash(const char *drivername,
const char *root);
char *
virDomainDriverGenerateMachineName(const char *drivername,
const char *root,

View File

@ -1403,6 +1403,7 @@ virDomainCgroupSetupMemtune;
# hypervisor/domain_driver.h
virDomainDriverGenerateMachineName;
virDomainDriverGenerateRootHash;
virDomainDriverMergeBlkioDevice;
virDomainDriverParseBlkioDeviceStr;
virDomainDriverSetupPersistentDefBlkioParams;