diff options
Diffstat (limited to 'src/librc/librc.c')
-rw-r--r-- | src/librc/librc.c | 47 |
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", |