X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fbsd-os.lisp;h=1b1633dd582cfbe89123241f38da1c70bc0d6f4e;hb=2056118835600a7c4e372c796568ddada5824cf6;hp=dca2b6fae41b7b167829e0a52f4c402123b7bfe1;hpb=2b0851c405b494143009f68e2bc7e91017a809d4;p=sbcl.git diff --git a/src/code/bsd-os.lisp b/src/code/bsd-os.lisp index dca2b6f..1b1633d 100644 --- a/src/code/bsd-os.lisp +++ b/src/code/bsd-os.lisp @@ -20,6 +20,14 @@ (newp (* t)) (newlen sb!unix:size-t)) +#!+darwin +(define-alien-routine ("sysctlbyname" %sysctlbyname) int + (name c-string) + (oldp (* t)) + (oldlenp (* sb!unix:size-t)) + (newp (* t)) + (newlen sb!unix:size-t)) + (defun sysctl (type &rest name) #!+sb-doc "Retrieves an integer or string value with the given name." @@ -46,6 +54,25 @@ (free-alien result) (sb!unix::newcharstar-string result))))))))) +#!+darwin +(defun sysctlbyname (type name) + #!+sb-doc + "Retrieves an integer or string value with the given name." + (with-alien ((result-len sb!unix:size-t)) + (ecase type + (:int + (with-alien ((result int)) + (setf result-len (alien-size int :bytes)) + (unless (minusp (%sysctlbyname name (addr result) + (addr result-len) nil 0)) + result))) + (:str + (unless (minusp (%sysctlbyname name nil (addr result-len) nil 0)) + (with-alien ((result (* char) (make-alien char result-len))) + (if (minusp (%sysctlbyname name result (addr result-len) nil 0)) + (free-alien result) + (sb!unix::newcharstar-string result)))))))) + (defun software-type () #!+sb-doc "Return a string describing the supporting software." @@ -76,7 +103,5 @@ ;;; support for CL:MACHINE-VERSION defined OAOO elsewhere (defun get-machine-version () - ;; FIXME: on Darwin we would prefer machdep.cpu.brand_string -- but I can't - ;; seem to grab it using sysctl() -- but the shell tool finds it. When - ;; someone has the time, check out how Darwin shell sysctl does it. - (sysctl :str ctl-hw hw-model)) + (or #!+darwin (sysctlbyname :str "machdep.cpu.brand_string") + (sysctl :str ctl-hw hw-model)))