+ if ( GETSYSCTL("hw.physmem", memory_tmp1) == 0 )
+ m->physmem = memory_tmp1;
+}
+
+
+#elif defined Linux /* end FreeBSD */
+
+#define MEMBUFSIZE 256
+
+static char*
+cmpPattern( char *str, char *pattern ) {
+ while( *str != '\0' && *str == *pattern ) {
+ str++;
+ pattern++;
+ }
+
+ if ( *pattern == '\0' ) {
+ if ( *str == '\0' )
+ return NULL;
+
+ /*
+ * str matches by pattern, so skip leading spaces
+ * before actual value
+ */
+ while( *str != '\0' ) {
+ if ( isspace( *str ) )
+ str++;
+ else
+ return str;
+ }
+ }
+
+ return NULL;
+}
+
+static void
+getmeminfo(TCMsgTop *m) {
+ FILE *fh;
+ static char buf[MEMBUFSIZE];
+ char *ptr;
+
+ fh=fopen("/proc/meminfo", "r");
+ if (fh == NULL) {
+ tlog(TL_ALARM, "fopen(\"/proc/meminfo\", ...) failed: %s", strerror(errno));
+ return;
+ }
+
+ while( fgets(buf, MEMBUFSIZE, fh) && (m->physmem == 0 || m->freemem == 0) ) {
+ if ( (ptr = cmpPattern(buf, "MemTotal:")) != NULL ) {
+ m->physmem = atoll(ptr) * 1024; /* mem in Kb */
+ } else if ( (ptr = cmpPattern(buf, "MemFree:")) != NULL ) {
+ m->freemem = atoll(ptr) * 1024; /* mem in Kb */
+ }
+ }
+
+ fclose(fh);
+}
+
+#else /* end Linux*/
+#error No memory stat for current OS
+#endif
+
+#define NITEM 0
+
+static void
+fillMsgTop(TCMsgTop *m) {
+ double lll[3];
+
+ memset(m,0,sizeof(TCMsgTop));
+ if ( getloadavg(lll,3) >= NITEM+1 )
+ m->load=lll[NITEM];
+ else
+ m->load=-1.0;
+
+ m->freemem = 0;
+ m->physmem = 0;
+ getmeminfo(m);