+
+bool
+os_get_available_system_memory(uint64_t *size)
+{
+#if DETECT_OS_LINUX
+ char *meminfo = os_read_file("/proc/meminfo", NULL);
+ if (!meminfo)
+ return false;
+
+ char *str = strstr(meminfo, "MemAvailable:");
+ if (!str) {
+ free(meminfo);
+ return false;
+ }
+
+ uint64_t kb_mem_available;
+ if (sscanf(str, "MemAvailable: %" PRIx64, &kb_mem_available) == 1) {
+ free(meminfo);
+ *size = kb_mem_available << 10;
+ return true;
+ }
+
+ free(meminfo);
+ return false;
+#elif DETECT_OS_OPENBSD
+ struct rlimit rl;
+ int mib[] = { CTL_HW, HW_USERMEM64 };
+ int64_t mem_available;
+ size_t len = sizeof(mem_available);
+
+ /* physmem - wired */
+ if (sysctl(mib, 2, &mem_available, &len, NULL, 0) == -1)
+ return false;
+
+ /* static login.conf limit */
+ if (getrlimit(RLIMIT_DATA, &rl) == -1)
+ return false;
+
+ *size = MIN2(mem_available, rl.rlim_cur);
+ return true;
+#else
+ return false;
+#endif
+}