summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2013-01-13 19:32:06 +0100
committerBastien Nocera <hadess@hadess.net>2013-01-13 23:10:06 +0100
commit8c266685b4e61158b89dcd0e1b17890cb64f6fca (patch)
tree2733922f6ff19a5729c959be9fd8bfe6040b3305 /tools
parent644259516fc82ec7eb0746032496627da8c8e65e (diff)
downloadgnome-session-8c266685b4e61158b89dcd0e1b17890cb64f6fca.tar.gz
tools: Use GRegex in _parse_kcmdline()
Makes the parsing code easier to understand. https://bugzilla.gnome.org/show_bug.cgi?id=688269
Diffstat (limited to 'tools')
-rw-r--r--tools/gnome-session-check-accelerated-helper.c58
1 files changed, 22 insertions, 36 deletions
diff --git a/tools/gnome-session-check-accelerated-helper.c b/tools/gnome-session-check-accelerated-helper.c
index e4aa3dbe..cdf76dd0 100644
--- a/tools/gnome-session-check-accelerated-helper.c
+++ b/tools/gnome-session-check-accelerated-helper.c
@@ -102,47 +102,35 @@ _print_error (const char *str)
static int
_parse_kcmdline (void)
{
- FILE *kcmdline;
- char *line = NULL;
- size_t line_len = 0;
int ret = CMDLINE_UNSET;
+ GRegex *regex;
+ GMatchInfo *match;
+ char *contents;
+ char *word;
+ const char *arg;
- kcmdline = fopen("/proc/cmdline", "r");
- if (kcmdline == NULL)
+ if (!g_file_get_contents ("/proc/cmdline", &contents, NULL, NULL))
return ret;
- while (getline (&line, &line_len, kcmdline) != -1) {
- const char *arg;
- const char *str;
- int key_len = strlen ("gnome.fallback=");
-
- if (line == NULL)
- break;
-
- /* don't break if we found the argument once: last mention wins */
-
- str = line;
- do {
- arg = strstr (str, "gnome.fallback=");
- str = arg + key_len;
-
- if (arg &&
- (arg == line || isspace (arg[-1])) && /* gnome.fallback= is really the beginning of an argument */
- (isdigit (arg[key_len]))) { /* the first character of the value of this argument is an integer */
- if ((arg[key_len+1] == '\0' || isspace (arg[key_len+1]))) /* the value of this argument is only one character long */
- ret = arg[key_len] - '0';
- else /* invalid value */
- ret = 0xDEAD;
+ regex = g_regex_new ("gnome.fallback=(\\S+)", 0, G_REGEX_MATCH_NOTEMPTY, NULL);
+ if (!g_regex_match (regex, contents, G_REGEX_MATCH_NOTEMPTY, &match))
+ goto out;
- }
- } while (arg != NULL);
+ word = g_match_info_fetch (match, 0);
+ g_debug ("Found command-line match '%s'", word);
+ arg = word + strlen ("gnome.fallback=");
+ if (*arg != '0' && *arg != '1')
+ fprintf (stderr, "gnome-session-is-accelerated: Invalid value '%s' for gnome.fallback passed in kernel command line.\n", arg);
+ else
+ ret = atoi (arg);
+ g_free (word);
- free (line);
- line = NULL;
- line_len = 0;
- }
+out:
+ g_match_info_free (match);
+ g_regex_unref (regex);
+ g_free (contents);
- fclose (kcmdline);
+ g_debug ("Command-line parsed to %d", ret);
return ret;
}
@@ -425,8 +413,6 @@ main (int argc, char **argv)
} else if (kcmdline_parsed == CMDLINE_FALLBACK_FORCED) {
_print_error ("Fallback mode forced by kernel command line.");
goto out;
- } else {
- fprintf (stderr, "gnome-session-is-accelerated: Invalid value '%d' for gnome.fallback passed in kernel command line.\n", kcmdline_parsed);
}
}