This patch addresses the following warning output by libvirtd:
warning : virProcessGetStartTime:843 : Process start time of
pid XXXXX not available on this platform
For Mac OS X, we can use similar instructions to FreeBSD
to get the start time of a process. The difference between them
is struct kinfo_proc; kinfo_proc.ki_start is the start time
of a process for FreeBSD while kinfo_proc.kp_proc.p_starttime
for Mac OS X.
Note that this patch works for Lion and Mountain Lion, however,
doesn't work for Snow Leopard for some reason;
sysctlnametomib("kern.proc.pid", ...) fails on Snow Leopard with
the following error:
error : virProcessGetStartTime:822 : Unable to get MIB of
kern.proc.pid: No such file or directory
This is unexpected. man 3 sysctl of Snow Leopard says it
should work...
Anyway libvirtd is able to launch on Snow Leopard regardless of
the error.
Signed-off-by: Ryota Ozaki <ozaki.ryota(a)gmail.com>
---
src/util/virprocess.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/util/virprocess.c b/src/util/virprocess.c
index 9fc3207..5a0ed0d 100644
--- a/src/util/virprocess.c
+++ b/src/util/virprocess.c
@@ -32,7 +32,7 @@
#endif
#include <sched.h>
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__APPLE__)
# include <sys/param.h>
# include <sys/sysctl.h>
# include <sys/user.h>
@@ -809,7 +809,7 @@ cleanup:
VIR_FREE(buf);
return ret;
}
-#elif defined(__FreeBSD__)
+#elif defined(__FreeBSD__) || defined(__APPLE__)
int virProcessGetStartTime(pid_t pid,
unsigned long long *timestamp)
{
@@ -817,7 +817,12 @@ int virProcessGetStartTime(pid_t pid,
int mib[4];
size_t len = 4;
- sysctlnametomib("kern.proc.pid", mib, &len);
+ /* FIXME: It doesn't work on Snow Leopard for some reason */
+ if (sysctlnametomib("kern.proc.pid", mib, &len) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Unable to get MIB of kern.proc.pid"));
+ return -1;
+ }
len = sizeof(struct kinfo_proc);
mib[3] = pid;
@@ -828,7 +833,11 @@ int virProcessGetStartTime(pid_t pid,
return -1;
}
+# if defined(__FreeBSD__)
*timestamp = (unsigned long long)p.ki_start.tv_sec;
+# else
+ *timestamp = (unsigned long long)p.kp_proc.p_starttime.tv_sec;
+# endif
return 0;
--
1.8.4