/*
This file is part of GNUnet.
- (C) 2008--2013 Christian Grothoff (and other contributing authors)
+ Copyright (C) 2008--2013 GNUnet e.V.
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
- option) any later version.
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
GNUnet is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
+ Affero General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
-*/
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
#include "platform.h"
-#include "gnunet_common.h"
+#include "gnunet_util_lib.h"
/*
* File for parsing top-level /proc entities.
- * Copyright (C) 1992-1998 by Michael K. Johnson, johnsonm@redhat.com
+ * Copyright Copyright (C) 1992-1998 by Michael K. Johnson, johnsonm@redhat.com
* Copyright 1998-2003 Albert Cahalan
* June 2003, Fabian Frederick, disk and slab info
*
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#define BAD_OPEN_MESSAGE \
-"Error: /proc must be mounted\n" \
-" To mount /proc at boot you need an /etc/fstab line like:\n" \
-" proc /proc proc defaults\n" \
-" In the meantime, run \"mount proc /proc -t proc\"\n"
+#define BAD_OPEN_MESSAGE \
+ "Error: /proc must be mounted\n" \
+ " To mount /proc at boot you need an /etc/fstab line like:\n" \
+ " proc /proc proc defaults\n" \
+ " In the meantime, run \"mount proc /proc -t proc\"\n"
#define STAT_FILE "/proc/stat"
-//static int stat_fd = -1;
+// static int stat_fd = -1;
#define UPTIME_FILE "/proc/uptime"
-//static int uptime_fd = -1;
+// static int uptime_fd = -1;
#define LOADAVG_FILE "/proc/loadavg"
-//static int loadavg_fd = -1;
+// static int loadavg_fd = -1;
#define MEMINFO_FILE "/proc/meminfo"
static int meminfo_fd = -1;
#define VMINFO_FILE "/proc/vmstat"
-//static int vminfo_fd = -1;
+// static int vminfo_fd = -1;
// As of 2.6.24 /proc/meminfo seems to need 888 on 64-bit,
// and would need 1258 if the obsolete fields were there.
* that successive calls to the functions are more efficient.
* It also reads the current contents of the file into the global buf.
*/
-#define FILE_TO_BUF(filename, fd) do{ \
- static int local_n; \
- if (fd == -1 && (fd = open(filename, O_RDONLY)) == -1) { \
- fputs(BAD_OPEN_MESSAGE, stderr); \
- fflush(NULL); \
- _exit(102); \
- } \
- lseek(fd, 0L, SEEK_SET); \
- if ((local_n = read(fd, buf, sizeof buf - 1)) < 0) { \
- perror(filename); \
- fflush(NULL); \
- _exit(103); \
- } \
- buf[local_n] = '\0'; \
-}while(0)
+#define FILE_TO_BUF(filename, fd) do { \
+ static int local_n; \
+ if (fd == -1 && (fd = open (filename, O_RDONLY)) == -1) { \
+ fputs (BAD_OPEN_MESSAGE, stderr); \
+ fflush (NULL); \
+ _exit (102); \
+ } \
+ lseek (fd, 0L, SEEK_SET); \
+ if ((local_n = read (fd, buf, sizeof buf - 1)) < 0) { \
+ perror (filename); \
+ fflush (NULL); \
+ _exit (103); \
+ } \
+ buf[local_n] = '\0'; \
+} while (0)
/***********************************************************************/
* GNU Library General Public License for more details.
*/
-typedef struct mem_table_struct {
+typedef struct mem_table_struct
+{
const char *name; /* memory type name */
unsigned long *slot; /* slot in return struct */
} mem_table_struct;
-static int compare_mem_table_structs(const void *a, const void *b){
- return strcmp(((const mem_table_struct*)a)->name,((const mem_table_struct*)b)->name);
+static int
+compare_mem_table_structs (const void *a, const void *b)
+{
+ return strcmp (((const mem_table_struct *) a)->name, ((const
+ mem_table_struct *) b)
+ ->
+ name);
}
+
/* example data, following junk, with comments added:
*
* MemTotal: 61768 kB old
static unsigned long kb_swap_reclaimable;
static unsigned long kb_swap_unreclaimable;
-void meminfo(void){
+void
+meminfo (void)
+{
char namebuf[16]; /* big enough to hold any row name */
- mem_table_struct findme = { namebuf, NULL};
+ mem_table_struct findme = { namebuf, NULL };
mem_table_struct *found;
char *head;
char *tail;
static const mem_table_struct mem_table[] = {
- {"Active", &kb_active}, // important
- {"AnonPages", &kb_anon_pages},
- {"Bounce", &kb_bounce},
- {"Buffers", &kb_main_buffers}, // important
- {"Cached", &kb_main_cached}, // important
- {"CommitLimit", &kb_commit_limit},
- {"Committed_AS", &kb_committed_as},
- {"Dirty", &kb_dirty}, // kB version of vmstat nr_dirty
- {"HighFree", &kb_high_free},
- {"HighTotal", &kb_high_total},
- {"Inact_clean", &kb_inact_clean},
- {"Inact_dirty", &kb_inact_dirty},
- {"Inact_laundry",&kb_inact_laundry},
- {"Inact_target", &kb_inact_target},
- {"Inactive", &kb_inactive}, // important
- {"LowFree", &kb_low_free},
- {"LowTotal", &kb_low_total},
- {"Mapped", &kb_mapped}, // kB version of vmstat nr_mapped
- {"MemFree", &kb_main_free}, // important
- {"MemShared", &kb_main_shared}, // important, but now gone!
- {"MemTotal", &kb_main_total}, // important
- {"NFS_Unstable", &kb_nfs_unstable},
- {"PageTables", &kb_pagetables}, // kB version of vmstat nr_page_table_pages
- {"ReverseMaps", &nr_reversemaps}, // same as vmstat nr_page_table_pages
- {"SReclaimable", &kb_swap_reclaimable}, // "swap reclaimable" (dentry and inode structures)
- {"SUnreclaim", &kb_swap_unreclaimable},
- {"Slab", &kb_slab}, // kB version of vmstat nr_slab
- {"SwapCached", &kb_swap_cached},
- {"SwapFree", &kb_swap_free}, // important
- {"SwapTotal", &kb_swap_total}, // important
- {"VmallocChunk", &kb_vmalloc_chunk},
- {"VmallocTotal", &kb_vmalloc_total},
- {"VmallocUsed", &kb_vmalloc_used},
- {"Writeback", &kb_writeback}, // kB version of vmstat nr_writeback
+ { "Active", &kb_active }, // important
+ { "AnonPages", &kb_anon_pages },
+ { "Bounce", &kb_bounce },
+ { "Buffers", &kb_main_buffers }, // important
+ { "Cached", &kb_main_cached }, // important
+ { "CommitLimit", &kb_commit_limit },
+ { "Committed_AS", &kb_committed_as },
+ { "Dirty", &kb_dirty }, // kB version of vmstat nr_dirty
+ { "HighFree", &kb_high_free },
+ { "HighTotal", &kb_high_total },
+ { "Inact_clean", &kb_inact_clean },
+ { "Inact_dirty", &kb_inact_dirty },
+ { "Inact_laundry", &kb_inact_laundry },
+ { "Inact_target", &kb_inact_target },
+ { "Inactive", &kb_inactive }, // important
+ { "LowFree", &kb_low_free },
+ { "LowTotal", &kb_low_total },
+ { "Mapped", &kb_mapped }, // kB version of vmstat nr_mapped
+ { "MemFree", &kb_main_free }, // important
+ { "MemShared", &kb_main_shared }, // important, but now gone!
+ { "MemTotal", &kb_main_total }, // important
+ { "NFS_Unstable", &kb_nfs_unstable },
+ { "PageTables", &kb_pagetables }, // kB version of vmstat nr_page_table_pages
+ { "ReverseMaps", &nr_reversemaps }, // same as vmstat nr_page_table_pages
+ { "SReclaimable", &kb_swap_reclaimable }, // "swap reclaimable" (dentry and inode structures)
+ { "SUnreclaim", &kb_swap_unreclaimable },
+ { "Slab", &kb_slab }, // kB version of vmstat nr_slab
+ { "SwapCached", &kb_swap_cached },
+ { "SwapFree", &kb_swap_free }, // important
+ { "SwapTotal", &kb_swap_total }, // important
+ { "VmallocChunk", &kb_vmalloc_chunk },
+ { "VmallocTotal", &kb_vmalloc_total },
+ { "VmallocUsed", &kb_vmalloc_used },
+ { "Writeback", &kb_writeback }, // kB version of vmstat nr_writeback
};
- const int mem_table_count = sizeof(mem_table)/sizeof(mem_table_struct);
+ const int mem_table_count = sizeof(mem_table) / sizeof(mem_table_struct);
- FILE_TO_BUF(MEMINFO_FILE,meminfo_fd);
+ FILE_TO_BUF (MEMINFO_FILE, meminfo_fd);
kb_inactive = ~0UL;
head = buf;
- for(;;){
- tail = strchr(head, ':');
- if(!tail) break;
+ for (;;)
+ {
+ tail = strchr (head, ':');
+ if (! tail)
+ break;
*tail = '\0';
- if(strlen(head) >= sizeof(namebuf)){
- head = tail+1;
+ if (strlen (head) >= sizeof(namebuf))
+ {
+ head = tail + 1;
goto nextline;
}
- strcpy(namebuf,head);
- found = bsearch(&findme, mem_table, mem_table_count,
- sizeof(mem_table_struct), compare_mem_table_structs
- );
- head = tail+1;
- if(!found) goto nextline;
- *(found->slot) = (unsigned long)strtoull(head,&tail,10);
+ strcpy (namebuf, head);
+ found = bsearch (&findme, mem_table, mem_table_count,
+ sizeof(mem_table_struct), compare_mem_table_structs
+ );
+ head = tail + 1;
+ if (! found)
+ goto nextline;
+ *(found->slot) = (unsigned long) strtoull (head, &tail, 10);
nextline:
- tail = strchr(head, '\n');
- if(!tail) break;
- head = tail+1;
+ tail = strchr (head, '\n');
+ if (! tail)
+ break;
+ head = tail + 1;
}
- if(!kb_low_total){ /* low==main except with large-memory support */
+ if (! kb_low_total) /* low==main except with large-memory support */
+ {
kb_low_total = kb_main_total;
- kb_low_free = kb_main_free;
+ kb_low_free = kb_main_free;
}
- if(kb_inactive==~0UL){
+ if (kb_inactive == ~0UL)
+ {
kb_inactive = kb_inact_dirty + kb_inact_clean + kb_inact_laundry;
}
kb_swap_used = kb_swap_total - kb_swap_free;