return
+def uptime_bsd():
+ # Get sysctlbyname("kern.boottime")
+ try:
+ import _testcapi
+ except ImportError:
+ return None
+ try:
+ return _testcapi.uptime_bsd()
+ except (AttributeError, OSError):
+ return None
+
+
def uptime_windows():
try:
import _winapi
def get_uptime():
- for func in (uptime_boottime, uptime_linux, uptime_windows):
+ for func in (uptime_boottime, uptime_linux, uptime_bsd, uptime_windows):
uptime = func()
if uptime is not None:
return uptime
if machine_guid:
return machine_guid
- machine_id = read_first_line("/etc/machine-id")
- if machine_id:
- return machine_id
+ for filename in (
+ # https://www.freedesktop.org/software/systemd/man/latest/machine-id.html
+ "/etc/machine-id",
+ # BSD
+ "/etc/hostid",
+ ):
+ machine_id = read_first_line(filename)
+ if machine_id:
+ return machine_id
return None
if boot_id:
info_add('system.boot_id', boot_id)
- # https://www.freedesktop.org/software/systemd/man/latest/machine-id.html
machine_id = get_machine_id()
if machine_id:
info_add('system.machine_id', machine_id)
#ifdef HAVE_SYS_WAIT_H
# include <sys/wait.h> // W_STOPCODE
#endif
+#ifdef HAVE_SYS_SYSCTL_H
+# include <sys/sysctl.h> // sysctlbyname()
+#endif
#ifdef bool
# error "The public headers should not include <stdbool.h>, see gh-48924"
Py_RETURN_NONE;
}
+
+#ifdef HAVE_SYSCTLBYNAME
+static PyObject*
+uptime_bsd(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args))
+{
+ struct timeval tv;
+ size_t size = sizeof(tv);
+ int res = sysctlbyname("kern.boottime", &tv, &size, NULL, 0);
+ if (res != 0) {
+ return PyErr_SetFromErrno(PyExc_OSError);
+ }
+ double boottime = (double)tv.tv_sec + tv.tv_usec * 1e-6;
+
+ PyTime_t now_t;
+ if (PyTime_Time(&now_t) < 0) {
+ return NULL;
+ }
+ double now = PyTime_AsSecondsDouble(now_t);
+
+ double uptime = now - boottime;
+ return PyFloat_FromDouble(uptime);
+}
+#endif
+
+
static PyMethodDef TestMethods[] = {
{"set_errno", set_errno, METH_VARARGS},
{"test_config", test_config, METH_NOARGS},
{"test_atexit", test_atexit, METH_NOARGS},
{"code_offset_to_line", _PyCFunction_CAST(code_offset_to_line), METH_FASTCALL},
{"toggle_reftrace_printer", toggle_reftrace_printer, METH_O},
+#ifdef HAVE_SYSCTLBYNAME
+ {"uptime_bsd", uptime_bsd, METH_NOARGS},
+#endif
{NULL, NULL} /* sentinel */
};
then :
printf "%s\n" "#define HAVE_SYS_SYSCALL_H 1" >>confdefs.h
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_sysctl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_SYSCTL_H 1" >>confdefs.h
+
fi
ac_fn_c_check_header_compile "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_sysmacros_h" = xyes
then :
printf "%s\n" "#define HAVE_SYSCONF 1" >>confdefs.h
+fi
+ac_fn_c_check_func "$LINENO" "sysctlbyname" "ac_cv_func_sysctlbyname"
+if test "x$ac_cv_func_sysctlbyname" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYSCTLBYNAME 1" >>confdefs.h
+
fi
ac_fn_c_check_func "$LINENO" "tcgetpgrp" "ac_cv_func_tcgetpgrp"
if test "x$ac_cv_func_tcgetpgrp" = xyes
sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \
sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/pidfd.h sys/poll.h \
sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \
- sys/statvfs.h sys/sys_domain.h sys/syscall.h sys/sysmacros.h sys/termio.h sys/time.h sys/times.h sys/timerfd.h \
+ sys/statvfs.h sys/sys_domain.h sys/syscall.h sys/sysctl.h \
+ sys/sysmacros.h sys/termio.h sys/time.h sys/times.h sys/timerfd.h \
sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h sys/xattr.h sysexits.h syslog.h \
termios.h util.h utime.h utmp.h \
])
setresuid setreuid setsid setuid setvbuf shutdown sigaction sigaltstack \
sigfillset siginterrupt sigpending sigrelse sigtimedwait sigwait \
sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \
- sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile \
+ sysconf sysctlbyname tcgetpgrp tcsetpgrp tempnam timegm times tmpfile \
tmpnam tmpnam_r truncate ttyname_r umask uname unlinkat unlockpt utimensat utimes vfork \
wait wait3 wait4 waitid waitpid wcscoll wcsftime wcsxfrm wmemcmp writev \
])
/* Define to 1 if you have the 'sysconf' function. */
#undef HAVE_SYSCONF
+/* Define to 1 if you have the 'sysctlbyname' function. */
+#undef HAVE_SYSCTLBYNAME
+
/* Define to 1 if you have the <sysexits.h> header file. */
#undef HAVE_SYSEXITS_H
/* Define to 1 if you have the <sys/syscall.h> header file. */
#undef HAVE_SYS_SYSCALL_H
+/* Define to 1 if you have the <sys/sysctl.h> header file. */
+#undef HAVE_SYS_SYSCTL_H
+
/* Define to 1 if you have the <sys/sysmacros.h> header file. */
#undef HAVE_SYS_SYSMACROS_H