From eb1bbc245dd6554a8fbe879a4efb903f6e7788cb Mon Sep 17 00:00:00 2001
From: Rob Landley <rob@landley.net>
Date: Sun, 25 Oct 2015 16:50:03 -0500
Subject: Add xcount_cpus()

---
 lib/lib.h   |  1 +
 lib/xwrap.c | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+)

(limited to 'lib')

diff --git a/lib/lib.h b/lib/lib.h
index 90f44dcb..04e81e8a 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -136,6 +136,7 @@ void xpidfile(char *name);
 void xregcomp(regex_t *preg, char *rexec, int cflags);
 char *xtzset(char *new);
 void xsignal(int signal, void *handler);
+unsigned xcount_cpus(void);
 
 // lib.c
 void verror_msg(char *msg, int err, va_list va);
diff --git a/lib/xwrap.c b/lib/xwrap.c
index 4880bbe0..69f891b9 100644
--- a/lib/xwrap.c
+++ b/lib/xwrap.c
@@ -723,3 +723,21 @@ void xsignal(int signal, void *handler)
 
   if (sigaction(signal, sa, 0)) perror_exit("xsignal %d", signal);
 }
+
+unsigned xcount_cpus(void)
+{
+  int len = 0, i, fd = xopen("/proc/stat", O_RDONLY);
+  unsigned cpus = 0;
+
+  for (;;) {
+    if (1>(i = xread(fd, libbuf, sizeof(libbuf)-len))) break;
+    len += i;
+    // Each cpu# line has data after it, so last 5 bytes of file can't match
+    for (i = 0; i<len-5; i++)
+      if (!strncmp(libbuf+i, "\ncpu", 4) && isdigit(libbuf[i+4])) cpus++;
+    memmove(libbuf, libbuf+i, 5);
+  }
+  close(fd);
+
+  return cpus;
+}
-- 
cgit v1.2.3