shithub: mc

Download patch

ref: cb693d6d5d0f10028a65f97ca8cbd2d7de814c2b
parent: 62b6bf19b4d9f5412934bc0debed9c21769327f0
author: Ori Bernstein <[email protected]>
date: Tue Sep 10 20:36:33 EDT 2013

Add sysctl() and uname() functions.

--- a/libstd/sys-osx.myr
+++ b/libstd/sys-osx.myr
@@ -469,6 +469,7 @@
 
 	/* system information */
 	const uname 	: (buf : utsname# -> int)
+	const sysctl	: (mib : int[:], old : byte[:]#, new : byte[:] -> int)
 ;;
 
 /* process control */
@@ -519,4 +520,74 @@
 }
 
 /* system information */
-const uname	= {buf;	-> syscall(Sysuname, buf) castto(int)}
+const uname	= {buf;	
+	var mib : int[2]
+	var ret
+	var sys
+	var nod
+	var rel
+	var ver
+	var mach
+
+	ret = 0
+	mib[0] = 1 /* CTL_KERN */
+	mib[1] = 1 /* KERN_OSTYPE */
+	sys = buf.system[:]
+	if sysctl(mib[:], &sys, [][:]) < 0
+		ret = -1
+	;;
+
+	mib[0] = 1 /* CTL_KERN */
+	mib[1] = 10 /* KERN_HOSTNAME */
+	nod = buf.node[:]
+	if sysctl(mib[:], &nod, [][:]) < 0
+		ret = -1
+	;;
+
+	mib[0] = 1 /* CTL_KERN */
+	mib[1] = 2 /* KERN_OSRELEASE */
+	rel = buf.release[:]
+	if sysctl(mib[:], &rel, [][:]) < 0
+		ret = -1
+	;;
+
+	mib[0] = 1 /* CTL_KERN */
+	mib[1] = 4 /* KERN_VERSION */
+	ver = buf.version[:]
+	if sysctl(mib[:], &ver, [][:]) < 0
+		ret = -1
+	;;
+
+	mib[0] = 6 /* CTL_HW */
+	mib[1] = 1 /* HW_MACHINE */
+	mach = buf.machine[:]
+	if sysctl(mib[:], &mach, [][:]) < 0
+		ret = -1
+	;;
+
+	-> ret
+}
+
+const sysctl = {mib, old, new
+	var mibp
+	var mibsz
+	var o
+	var oldp
+	var oldsz
+	var newp
+	var newsz
+	var ret
+
+	mibp = mib castto(byte#)
+	mibsz = mib.len castto(uint64)
+	o = old#
+	oldp = o castto(byte#)
+	oldsz = o.len castto(uint64)
+	newp = new castto(byte#)
+	newsz = new castto(uint64)
+
+	ret = syscall(Sys__sysctl, mibp, mibsz, oldp, &oldsz, newp, newsz) castto(int)
+
+	old# = o[:oldsz]
+	-> ret
+}