[libvirt] [PATCH] virhostuptime: Add linux stub for musl
Cole Robinson
crobinso at redhat.com
Thu Nov 14 00:47:44 UTC 2019
On 10/14/19 10:57 AM, Michal Privoznik wrote:
> When we want to know the boot timestamp of the host, we can call
> virHostGetBootTime(). Under the hood, it uses getutxid() which is
> defined by POSIX and properly check for in configure. However,
> musl took a path where it declares the function but instead of
> providing any useful implementation it returns NULL meaning "no
> record found". If that's the case, use our second best option -
> /proc/uptime and a bit of maths.
>
> https://bugzilla.redhat.com/show_bug.cgi?id=1760885
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/util/virhostuptime.c | 64 ++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 61 insertions(+), 3 deletions(-)
>
> diff --git a/src/util/virhostuptime.c b/src/util/virhostuptime.c
> index 62b781acd5..3189074d3d 100644
> --- a/src/util/virhostuptime.c
> +++ b/src/util/virhostuptime.c
> @@ -25,16 +25,68 @@
> #endif
>
> #include "virhostuptime.h"
> +#include "viralloc.h"
> +#include "virfile.h"
> +#include "virlog.h"
> +#include "virstring.h"
> +#include "virtime.h"
> #include "virthread.h"
>
> +#define VIR_FROM_THIS VIR_FROM_NONE
> +
> +VIR_LOG_INIT("util.virhostuptime");
> +
> static unsigned long long bootTime;
> static int bootTimeErrno;
> static virOnceControl virHostGetBootTimeOnce = VIR_ONCE_CONTROL_INITIALIZER;
>
> -#ifdef HAVE_GETUTXID
> +#if defined(__linux__)
> +# define UPTIME_FILE "/proc/uptime"
> +static int
> +virHostGetBootTimeProcfs(unsigned long long *btime)
> +{
> + unsigned long long now;
> + double up;
> + g_autofree char *buf = NULL;
> + char *tmp;
> +
> + if (virTimeMillisNow(&now) < 0)
> + return -errno;
> +
> + /* 1KiB limit is more than enough. */
> + if (virFileReadAll(UPTIME_FILE, 1024, &buf) < 0)
> + return -errno;
> +
> + /* buf contains two doubles now:
> + * $uptime $idle_time
> + * We're interested only in the first one */
> + if (!(tmp = strchr(buf, ' '))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("uptime file has unexpected format '%s'"),
> + buf);
> + return -EINVAL;
> + }
> +
> + *tmp = '\0';
> +
> + if (virStrToDouble(buf, NULL, &up) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Unable to parse sched info value '%s'"),
> + buf);
> + return -EINVAL;
> + }
> +
error message here is a copy+paste mistake. syntax-check says you need
to extend POTFILES.in too. With those fixed:
Reviewed-by: Cole Robinson <crobinso at redhat.com>
- Cole
More information about the libvir-list
mailing list