diff --git a/meson.build b/meson.build index 297fbfae48..4c6e5a088e 100644 --- a/meson.build +++ b/meson.build @@ -954,6 +954,11 @@ if blkid_dep.found() conf.set('WITH_BLKID', 1) endif +libbsd_dep = dependency('libbsd', required: false) +if libbsd_dep.found() + conf.set('WITH_LIBBSD', 1) +endif + capng_dep = dependency('libcap-ng', required: get_option('capng')) if capng_dep.found() conf.set('WITH_CAPNG', 1) @@ -2335,6 +2340,7 @@ libs_summary = { 'dlopen': dlopen_dep.found(), 'fuse': fuse_dep.found(), 'glusterfs': glusterfs_dep.found(), + 'libbsd': libbsd_dep.found(), 'libiscsi': libiscsi_dep.found(), 'libkvm': libkvm_dep.found(), 'libnbd': libnbd_dep.found(), diff --git a/src/util/meson.build b/src/util/meson.build index 896c795150..54db542957 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -194,6 +194,7 @@ virt_util_lib = static_library( devmapper_dep, gnutls_dep, intl_dep, + libbsd_dep, libm_dep, libnl_dep, libutil_dep, diff --git a/src/util/virutil.c b/src/util/virutil.c index 6c89a48e51..bf6008fdfb 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -31,6 +31,10 @@ # include #endif /* WIN32 */ +#ifdef WITH_LIBBSD +# include +#endif + #ifdef __linux__ # include #endif @@ -1773,6 +1777,19 @@ char *virGetPassword(void) } return g_string_free(pw, FALSE); +#elif WITH_LIBBSD /* !WIN32 */ +# ifndef PASS_MAX +# define PASS_MAX 1024 +# endif + char *pass = NULL; + g_autofree char *buffer = g_new0(char, PASS_MAX); + + pass = readpassphrase("", buffer, PASS_MAX, 0); + if (pass == NULL) { + return NULL; + } + + return g_steal_pointer(&buffer); #else /* !WIN32 */ return g_strdup(getpass("")); #endif /* ! WIN32 */