Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b

Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/src/sys/sys.c b/src/sys/sys.c
new file mode 100644
index 0000000..a68f377
--- /dev/null
+++ b/src/sys/sys.c
@@ -0,0 +1,233 @@
+/**
+ * @file sys.c  System information
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <re_types.h>
+#include <re_fmt.h>
+#include <re_sys.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_UNAME
+#include <sys/utsname.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#ifdef HAVE_SETRLIMIT
+#include <sys/resource.h>
+#endif
+
+
+/**
+ * Get system release version
+ *
+ * @param rel   Binary encoded release
+ * @param maj   Major version number
+ * @param min   Minor version number
+ * @param patch Patch number
+ *
+ * @return 0 if success, otherwise errorcode
+ */
+int sys_rel_get(uint32_t *rel, uint32_t *maj, uint32_t *min, uint32_t *patch)
+{
+#ifdef HAVE_UNAME
+	struct utsname u;
+	struct pl pl_mj, pl_mn, pl_p;
+	uint32_t mj, mn, p;
+	int err;
+
+	if (0 != uname(&u))
+		return errno;
+
+	err = re_regex(u.release, strlen(u.release),
+		       "[0-9]+.[0-9]+[.\\-]1[0-9]+",
+		       &pl_mj, &pl_mn, NULL, &pl_p);
+	if (err)
+		return err;
+
+	mj = pl_u32(&pl_mj);
+	mn = pl_u32(&pl_mn);
+	p  = pl_u32(&pl_p);
+
+	if (rel)
+		*rel = mj<<16 | mn<<8 | p;
+	if (maj)
+		*maj = mj;
+	if (min)
+		*min = mn;
+	if (patch)
+		*patch = p;
+
+	return 0;
+#else
+	(void)rel;
+	(void)maj;
+	(void)min;
+	(void)patch;
+	return EINVAL;
+#endif
+}
+
+
+/**
+ * Get kernel name and version
+ *
+ * @param pf     Print function for output
+ * @param unused Unused parameter
+ *
+ * @return 0 if success, otherwise errorcode
+ */
+int sys_kernel_get(struct re_printf *pf, void *unused)
+{
+#ifdef HAVE_UNAME
+	struct utsname u;
+
+	(void)unused;
+
+	if (0 != uname(&u))
+		return errno;
+
+	return re_hprintf(pf, "%s %s %s %s %s", u.sysname, u.nodename,
+			  u.release, u.version, u.machine);
+#else
+	const char *str;
+
+	(void)unused;
+
+#if defined(WIN32)
+	str = "Win32";
+#else
+	str = "?";
+#endif
+
+	return re_hprintf(pf, "%s", str);
+#endif
+}
+
+
+/**
+ * Get build info
+ *
+ * @param pf     Print function for output
+ * @param unused Unused parameter
+ *
+ * @return 0 if success, otherwise errorcode
+ */
+int sys_build_get(struct re_printf *pf, void *unused)
+{
+	const unsigned int bus_width = 8*sizeof(void *);
+	const char *endian = "unknown";
+
+	const uint32_t a = 0x12345678;
+	const uint8_t b0 = ((uint8_t *)&a)[0];
+	const uint8_t b1 = ((uint8_t *)&a)[1];
+	const uint8_t b2 = ((uint8_t *)&a)[2];
+	const uint8_t b3 = ((uint8_t *)&a)[3];
+
+	(void)unused;
+
+	if (0x12==b0 && 0x34==b1 && 0x56==b2 && 0x78==b3)
+		endian = "big";
+	else if (0x12==b3 && 0x34==b2 && 0x56==b1 && 0x78==b0)
+		endian = "little";
+
+	return re_hprintf(pf, "%u-bit %s endian", bus_width, endian);
+}
+
+
+/**
+ * Get architecture
+ *
+ * @return Architecture string
+ */
+const char *sys_arch_get(void)
+{
+#ifdef ARCH
+	return ARCH;
+#else
+	return "?";
+#endif
+}
+
+
+/**
+ * Get name of Operating System
+ *
+ * @return Operating System string
+ */
+const char *sys_os_get(void)
+{
+#ifdef OS
+	return OS;
+#else
+	return "?";
+#endif
+}
+
+
+/**
+ * Get libre version
+ *
+ * @return libre version string
+ */
+const char *sys_libre_version_get(void)
+{
+#ifdef VERSION
+	return VERSION;
+#else
+	return "?";
+#endif
+}
+
+
+/**
+ * Return the username (login name) for the current user
+ *
+ * @return Username or NULL if not available
+ */
+const char *sys_username(void)
+{
+#ifdef HAVE_PWD_H
+	char *login;
+
+	login = getenv("LOGNAME");
+	if (!login)
+		login = getenv("USER");
+#ifdef HAVE_UNISTD_H
+	if (!login) {
+		login = getlogin();
+	}
+#endif
+
+	return str_isset(login) ? login : NULL;
+#else
+	return NULL;
+#endif
+}
+
+
+/**
+ * Enable or disable coredump
+ *
+ * @param enable true to enable, false to disable coredump
+ *
+ * @return 0 if success, otherwise errorcode
+ */
+int sys_coredump_set(bool enable)
+{
+#ifdef HAVE_SETRLIMIT
+	const struct rlimit rlim = {
+		enable ? RLIM_INFINITY : 0,
+		enable ? RLIM_INFINITY : 0
+	};
+
+	return 0 == setrlimit(RLIMIT_CORE, &rlim) ? 0 : errno;
+#else
+	(void)enable;
+	return ENOSYS;
+#endif
+}