From fbddb38d93f7f55ac59ae27f0c7235ad0b91230b Mon Sep 17 00:00:00 2001 From: pjd Date: Thu, 14 Dec 2006 14:32:59 +0000 Subject: [PATCH] Add support for _SC_PHYS_PAGES, which is not standard, but can be found in Solaris and Linux. --- lib/libc/gen/sysconf.3 | 13 +++++++++++++ lib/libc/gen/sysconf.c | 15 ++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/libc/gen/sysconf.3 b/lib/libc/gen/sysconf.3 index 847651a3ca6e..85343c7122e8 100644 --- a/lib/libc/gen/sysconf.3 +++ b/lib/libc/gen/sysconf.3 @@ -167,6 +167,19 @@ otherwise \-1. Return 1 if the system supports the User Portability Utilities Option, otherwise \-1. .El +.Pp +These values also exist, but may not be standard: +.Pp +.Bl -tag -width 6n +.Pp +.It Li _SC_PHYS_PAGES +The number of pages of physical memory. +Note that it is possible that the product of this value and the value of +.Li _SC_PAGESIZE +will overflow a +.Vt long +in some configurations on a 32bit machine. +.El .Sh RETURN VALUES If the call to .Fn sysconf diff --git a/lib/libc/gen/sysconf.c b/lib/libc/gen/sysconf.c index 27729a6fa9d4..fc844ccee902 100644 --- a/lib/libc/gen/sysconf.c +++ b/lib/libc/gen/sysconf.c @@ -79,9 +79,11 @@ sysconf(name) int mib[2], sverrno, value; long defaultresult; const char *path; + const char *sname; len = sizeof(value); defaultresult = -1; + sname = NULL; switch (name) { case _SC_ARG_MAX: @@ -574,9 +576,20 @@ yesno: if (sysctl(mib, 2, &value, &len, NULL, 0) == -1) mib[1] = HW_NCPU; break; + case _SC_PHYS_PAGES: + sname = "hw.availpages"; + break; + default: errno = EINVAL; return (-1); } - return (sysctl(mib, 2, &value, &len, NULL, 0) == -1 ? -1 : value); + if (sname == NULL) { + if (sysctl(mib, 2, &value, &len, NULL, 0) == -1) + value = -1; + } else { + if (sysctlbyname(sname, &value, &len, NULL, 0) == -1) + value = -1; + } + return (value); }