Commit 4dfd532fcd672fde1e91d967d9348ed358dc0036

Thomas de Grivel 2025-01-03T01:11:36

wip fix sysctl

diff --git a/.ikc3_history b/.ikc3_history
index 4e0874a..465529a 100644
--- a/.ikc3_history
+++ b/.ikc3_history
@@ -1,6 +1,3 @@
-(F64) 0.0000002 + (F64) 0.0000002
-(F64) 0.0000001 + (F64) 0.0000001
-(F64) 0.000001 + (F64) 0.000003
 (F64) 0.3 + (F64) 0.3
 type(0.1)
 0.1 + 0.1
@@ -97,4 +94,6 @@ s = Serialize.tag_to_str(12)
 Deserialize.str_to_tag(s)
 s = Serialize.tag_to_str(12)
 Deserialize.str_to_tag(s)
-
+sysctl([:hw, :ncpu])
+sysctl([:hw])
+sysctl([:hw, :ncpu, :a])
diff --git a/libkc3/kc3.c b/libkc3/kc3.c
index 8594901..211e3e8 100644
--- a/libkc3/kc3.c
+++ b/libkc3/kc3.c
@@ -18,6 +18,10 @@
 #include <stdlib.h>
 #include <string.h>
 
+#ifdef __OpenBSD__
+# include <sys/sysctl.h>
+#endif
+
 #ifndef WIN32
 # include <sys/wait.h>
 #endif
@@ -756,32 +760,126 @@ s_tag * kc3_struct_put (s_tag *s, const s_sym * const *key,
 
 s_tag * kc3_sysctl (s_tag *dest, const s_list * const *list)
 {
+  s32 e;
+  const s_list *l;
   s32 mib[64];
   s32 mib_len = 0;
-  s32 i;
-  const s_list *l;
+  s_tag  tmp = {0};
+  size_t tmp_data_size;
   l = *list;
-  while (l) {
-    if (l->tag.type != TAG_SYM) {
-      err_puts("kc3_sysctl: argument is not a Sym list");
-      assert(! "kc3_sysctl: argument is not a Sym list");
-    }
-    if (l->tag.data.sym == sym_1("hw"))
-      mib[mib_len] = CTL_HW;
-    else if (l->tag.data.sym == sym_1("kern"))
-      mib[mib_len] = CTL_KERN;
-    else {
-      err_write_1("kc3_sysctl: invalid argument: ");
-      err_inspect_sym(l->tag.data.sym);
-      err_write_1("\n");
-      assert("kc3_sysctl: invalid argument")
-      return NULL;
+  if (! l ||
+      l->tag.type != TAG_SYM) {
+    err_puts("kc3_sysctl: argument is not a Sym list");
+    assert(! "kc3_sysctl: argument is not a Sym list");
+  }
+  if (l->tag.data.sym == sym_1("ddb")) {
+    mib[mib_len] = CTL_DDB;
+    mib_len++;
+    l = list_next(l);
+    
+  }
+  else if (l->tag.data.sym == sym_1("debug")) {
+    mib[mib_len] = CTL_DEBUG;
+    mib_len++;
+    l = list_next(l);
+    
+  }
+  else if (l->tag.data.sym == sym_1("fs")) {
+    mib[mib_len] = CTL_FS;
+    mib_len++;
+    l = list_next(l);
+    
+  }
+  else if (l->tag.data.sym == sym_1("hw")) {
+    mib[mib_len] = CTL_HW;
+    mib_len++;
+    if ((l = list_next(l))) {
+      if (l->tag.data.sym == sym_1("ncpu")) {
+        mib[mib_len] = HW_NCPU;
+        mib_len++;
+        l = list_next(l);
+        if (! l)
+          tmp.type = TAG_S32;
+      }
+      else if (l->tag.data.sym == sym_1("ncpufound")) {
+        mib[mib_len] = HW_NCPUFOUND;
+        mib_len++;
+        l = list_next(l);
+        if (! l)
+          tmp.type = TAG_S32;
+      }
+      else if (l->tag.data.sym == sym_1("ncpuonline")) {
+        mib[mib_len] = HW_NCPUONLINE;
+        mib_len++;
+        l = list_next(l);
+        if (! l)
+          tmp.type = TAG_S32;
+      }
+      else if (l->tag.data.sym == sym_1("pagesize")) {
+        mib[mib_len] = HW_PAGESIZE;
+        mib_len++;
+        l = list_next(l);
+        if (! l)
+          tmp.type = TAG_S32;
+      }
+      else if (l->tag.data.sym == sym_1("physmem64")) {
+        mib[mib_len] = HW_PHYSMEM64;
+        mib_len++;
+        l = list_next(l);
+        if (! l)
+          tmp.type = TAG_S64;
+      }
     }
+  }
+  else if (l->tag.data.sym == sym_1("kern")) {
+    mib[mib_len] = CTL_KERN;
+    mib_len++;
+    l = list_next(l);
+  }
+  else if (l->tag.data.sym == sym_1("machdep")) {
+    mib[mib_len] = CTL_MACHDEP;
+    mib_len++;
+    l = list_next(l);
+  }
+  else if (l->tag.data.sym == sym_1("net")) {
+    mib[mib_len] = CTL_NET;
+    mib_len++;
+    l = list_next(l);
+  }
+  else if (l->tag.data.sym == sym_1("vfs")) {
+    mib[mib_len] = CTL_VFS;
+    mib_len++;
+    l = list_next(l);
+  }
+  else if (l->tag.data.sym == sym_1("vm")) {
+    mib[mib_len] = CTL_VM;
     mib_len++;
     l = list_next(l);
   }
-  if (sysctl(mib, mib_len,
+  if (! tmp.type) {
+    err_write_1("kc3_sysctl: invalid argument: ");
+    if (l)
+      err_inspect_sym(&l->tag.data.sym);
+    else
+      err_inspect_list(*list);
+    err_write_1("\n");
+    assert("kc3_sysctl: invalid argument");
+    return NULL;
+  }
+  tmp_data_size = sizeof(tmp.data);
+  if (sysctl(mib, mib_len, &tmp.data, &tmp_data_size, NULL, 0) < 0) {
+    e = errno;
+    err_write_1("kc3_sysctl: sysctl: ");
+    err_write_1(strerror(e));
+    err_write_1("\n");
+    assert("kc3_sysctl: sysctl");
+    return NULL;
+  }
+  assert(tmp_data_size <= sizeof(tmp.data));
+  *dest = tmp;
+  return dest;
 }
+
 s_str * kc3_system (const s_list * const *list, s_str *dest)
 {
 #ifdef WIN32