aboutsummaryrefslogtreecommitdiff
path: root/src/librc
diff options
context:
space:
mode:
Diffstat (limited to 'src/librc')
-rw-r--r--src/librc/librc.c47
1 files changed, 40 insertions, 7 deletions
diff --git a/src/librc/librc.c b/src/librc/librc.c
index f323d0fd..12d31348 100644
--- a/src/librc/librc.c
+++ b/src/librc/librc.c
@@ -147,6 +147,43 @@ static bool rm_dir (const char *pathname, bool top)
return (true);
}
+/* Other systems may need this at some point, but for now it's Linux only */
+#ifdef __linux__
+static bool file_regex (const char *file, const char *regex)
+{
+ FILE *fp;
+ char *line;
+ regex_t re;
+ bool retval = false;
+ int result;
+
+ if (! (fp = fopen (file, "r")))
+ return (false);
+
+ if ((result = regcomp (&re, regex, REG_EXTENDED | REG_NOSUB)) != 0) {
+ fclose (fp);
+ line = xmalloc (sizeof (char) * BUFSIZ);
+ regerror (result, &re, line, BUFSIZ);
+ fprintf (stderr, "file_regex: %s", line);
+ free (line);
+ return (false);
+ }
+
+ while ((line = rc_getline (fp))) {
+ if (regexec (&re, line, 0, NULL, 0) == 0)
+ retval = true;
+ free (line);
+ if (retval)
+ break;
+ }
+ fclose (fp);
+ regfree (&re);
+
+ return (retval);
+}
+#endif
+
+
const char *rc_sys (void)
{
#ifdef __FreeBSD__
@@ -160,13 +197,9 @@ const char *rc_sys (void)
#ifdef __linux__
if (exists ("/proc/xen")) {
- if ((fp = fopen ("/proc/xen/capabilities", "r"))) {
- fclose (fp);
- if (file_regex ("/proc/xen/capabilities", "control_d"))
- return (RC_SYS_XEN0);
- }
- if (! sys[0])
- return (RC_SYS_XENU);
+ if (file_regex ("/proc/xen/capabilities", "control_d"))
+ return (RC_SYS_XEN0);
+ return (RC_SYS_XENU);
} else if (file_regex ("/proc/cpuinfo", "UML"))
return (RC_SYS_UML);
else if (file_regex ("/proc/self/status",