diff options
author | Greg Banks <gnb@melbourne.sgi.com> | 2009-02-05 20:54:26 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-03-24 19:38:27 -0400 |
commit | 9898abb3d23311fa227a7f46bf4e40fd2954057f (patch) | |
tree | f32e6f1b0422e491bf3db276f6f62467e4a21928 /lib | |
parent | 86151fdf38b3795f292b39defbff39d2684b9c8c (diff) |
Dynamic debug: allow simple quoting of words
Allow simple quoting of words in the dynamic debug control language.
This allows more natural specification when using the control language
to match against printk formats, e.g
#echo -n 'format "Setting node for non-present cpu" +p' >
/mnt/debugfs/dynamic_debug/control
instead of
#echo -n 'format Setting\040node\040for\040non-present\040cpu +p' >
/mnt/debugfs/dynamic_debug/control
Adjust the dynamic debug documention to describe that and provide a
new example. Adjust the existing examples in the documentation to
reflect the current whitespace escaping behaviour when reading the
control file. Fix some minor documentation trailing whitespace.
Signed-off-by: Greg Banks <gnb@melbourne.sgi.com>
Acked-by: Jason Baron <jbaron@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/dynamic_debug.c | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 9e123ae326bc..833139ce1e22 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c | |||
@@ -196,32 +196,45 @@ static void ddebug_change(const struct ddebug_query *query, | |||
196 | } | 196 | } |
197 | 197 | ||
198 | /* | 198 | /* |
199 | * Wrapper around strsep() to collapse the multiple empty tokens | ||
200 | * that it returns when fed sequences of separator characters. | ||
201 | * Now, if we had strtok_r()... | ||
202 | */ | ||
203 | static inline char *nearly_strtok_r(char **p, const char *sep) | ||
204 | { | ||
205 | char *r; | ||
206 | |||
207 | while ((r = strsep(p, sep)) != NULL && *r == '\0') | ||
208 | ; | ||
209 | return r; | ||
210 | } | ||
211 | |||
212 | /* | ||
213 | * Split the buffer `buf' into space-separated words. | 199 | * Split the buffer `buf' into space-separated words. |
214 | * Return the number of such words or <0 on error. | 200 | * Handles simple " and ' quoting, i.e. without nested, |
201 | * embedded or escaped \". Return the number of words | ||
202 | * or <0 on error. | ||
215 | */ | 203 | */ |
216 | static int ddebug_tokenize(char *buf, char *words[], int maxwords) | 204 | static int ddebug_tokenize(char *buf, char *words[], int maxwords) |
217 | { | 205 | { |
218 | int nwords = 0; | 206 | int nwords = 0; |
219 | 207 | ||
220 | while (nwords < maxwords && | 208 | while (*buf) { |
221 | (words[nwords] = nearly_strtok_r(&buf, " \t\r\n")) != NULL) | 209 | char *end; |
222 | nwords++; | 210 | |
223 | if (buf) | 211 | /* Skip leading whitespace */ |
224 | return -EINVAL; /* ran out of words[] before bytes */ | 212 | while (*buf && isspace(*buf)) |
213 | buf++; | ||
214 | if (!*buf) | ||
215 | break; /* oh, it was trailing whitespace */ | ||
216 | |||
217 | /* Run `end' over a word, either whitespace separated or quoted */ | ||
218 | if (*buf == '"' || *buf == '\'') { | ||
219 | int quote = *buf++; | ||
220 | for (end = buf ; *end && *end != quote ; end++) | ||
221 | ; | ||
222 | if (!*end) | ||
223 | return -EINVAL; /* unclosed quote */ | ||
224 | } else { | ||
225 | for (end = buf ; *end && !isspace(*end) ; end++) | ||
226 | ; | ||
227 | BUG_ON(end == buf); | ||
228 | } | ||
229 | /* Here `buf' is the start of the word, `end' is one past the end */ | ||
230 | |||
231 | if (nwords == maxwords) | ||
232 | return -EINVAL; /* ran out of words[] before bytes */ | ||
233 | if (*end) | ||
234 | *end++ = '\0'; /* terminate the word */ | ||
235 | words[nwords++] = buf; | ||
236 | buf = end; | ||
237 | } | ||
225 | 238 | ||
226 | if (verbose) { | 239 | if (verbose) { |
227 | int i; | 240 | int i; |