Support for getting memory size on FreeBSD.

diff --git a/memory/global.c b/memory/global.c
index b91137f..ffa2b89 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -28,6 +28,9 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <string.h>
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
 
 #include "wine/winbase16.h"
 #include "wine/exception.h"
@@ -1524,13 +1527,22 @@
 #ifdef linux
     FILE *f;
 #endif
-
+#ifdef __FreeBSD__
+    int *tmp;
+    int size_sys;
+#endif
     if (time(NULL)==cache_lastchecked) {
 	memcpy(lpmem,&cached_memstatus,sizeof(MEMORYSTATUS));
 	return;
     }
     cache_lastchecked = time(NULL);
 
+    lpmem->dwMemoryLoad    = 0;
+    lpmem->dwTotalPhys     = 16*1024*1024;
+    lpmem->dwAvailPhys     = 16*1024*1024;
+    lpmem->dwTotalPageFile = 16*1024*1024;
+    lpmem->dwAvailPageFile = 16*1024*1024;
+
 #ifdef linux
     f = fopen( "/proc/meminfo", "r" );
     if (f)
@@ -1578,16 +1590,36 @@
             lpmem->dwMemoryLoad = (TotalPhysical-AvailPhysical)
                                       / (TotalPhysical / 100);
         }
-    } else
-#endif
-    {
-	/* FIXME: should do something for other systems */
-	lpmem->dwMemoryLoad    = 0;
-	lpmem->dwTotalPhys     = 16*1024*1024;
-	lpmem->dwAvailPhys     = 16*1024*1024;
-	lpmem->dwTotalPageFile = 16*1024*1024;
-	lpmem->dwAvailPageFile = 16*1024*1024;
     }
+#elif defined(__FreeBSD__)
+    sysctlbyname("hw.physmem", NULL, &size_sys, NULL, 0);
+    tmp = malloc(size_sys * sizeof(int));
+    sysctlbyname("hw.physmem", tmp, &size_sys, NULL, 0);
+    if (tmp && *tmp)
+    {
+        lpmem->dwTotalPhys = *tmp;
+	free(tmp);
+	sysctlbyname("hw.usermem", NULL, &size_sys, NULL, 0);
+	tmp = malloc(size_sys * sizeof(int));
+	sysctlbyname("hw.usermem", tmp, &size_sys, NULL, 0);
+	if (tmp && *tmp)
+	{
+	    lpmem->dwAvailPhys = *tmp;
+            lpmem->dwTotalPageFile = *tmp;
+	    lpmem->dwAvailPageFile = *tmp;
+	    lpmem->dwMemoryLoad = lpmem->dwTotalPhys - lpmem->dwAvailPhys;
+	} else
+	{
+	    lpmem->dwAvailPhys = lpmem->dwTotalPhys;
+	    lpmem->dwTotalPageFile = lpmem->dwTotalPhys;
+	    lpmem->dwAvailPageFile = lpmem->dwTotalPhys;
+	    lpmem->dwMemoryLoad = 0;
+	}
+	free(tmp);
+	
+    }
+#endif
+    /* FIXME: should do something for other systems */
     GetSystemInfo(&si);
     lpmem->dwTotalVirtual  = si.lpMaximumApplicationAddress-si.lpMinimumApplicationAddress;
     /* FIXME: we should track down all the already allocated VM pages and substract them, for now arbitrarily remove 64KB so that it matches NT */