Index: funcs/func_sysinfo.c =================================================================== --- funcs/func_sysinfo.c (revision 129844) +++ funcs/func_sysinfo.c (working copy) @@ -57,21 +57,32 @@ snprintf(buf, len, "%d", ast_active_calls()); } #if defined(HAVE_SYSINFO) +/*! + * This defines a SYSINFO_BYTES macro that ensures we + * get the correct number of bytes for sysinfo on kernels + * < 2.3.23 on i386 or < 2.3.48 for all other archs + */ +# ifdef HAVE_SYSINFO_MEMUNIT +# define SYSINFO_BYTES(a) ((sys_info.a * sys_info.mem_unit) >> 10) +# else +# define SYSINFO_BYTES(a) (a >> 10) +# endif else if (!strcasecmp("uptime", data)) { /* in hours */ snprintf(buf, len, "%ld", sys_info.uptime/3600); } else if (!strcasecmp("totalram", data)) { /* in KiB */ - snprintf(buf, len, "%ld",(sys_info.totalram / sys_info.mem_unit)/1024); + snprintf(buf, len, "%ld",SYSINFO_BYTES(totalram)); } else if (!strcasecmp("freeram", data)) { /* in KiB */ - snprintf(buf, len, "%ld",(sys_info.freeram / sys_info.mem_unit)/1024); + snprintf(buf, len, "%ld",SYSINFO_BYTES(freeram)); } else if (!strcasecmp("bufferram", data)) { /* in KiB */ - snprintf(buf, len, "%ld",(sys_info.bufferram / sys_info.mem_unit)/1024); + snprintf(buf, len, "%ld",SYSINFO_BYTES(bufferram)); } else if (!strcasecmp("totalswap", data)) { /* in KiB */ - snprintf(buf, len, "%ld",(sys_info.totalswap / sys_info.mem_unit)/1024); + snprintf(buf, len, "%ld",SYSINFO_BYTES(totalswap)); } else if (!strcasecmp("freeswap", data)) { /* in KiB */ - snprintf(buf, len, "%ld",(sys_info.freeswap / sys_info.mem_unit)/1024); + snprintf(buf, len, "%ld",SYSINFO_BYTES(freeswap)); } else if (!strcasecmp("numprocs", data)) { snprintf(buf, len, "%d", sys_info.procs); } +#undef SYSINFO_BYTES #endif else { ast_log(LOG_ERROR, "Unknown sysinfo parameter type '%s'.\n", data);