diff options
author | Thomas Adam <thomas@xteddy.org> | 2018-08-26 11:02:38 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2018-08-26 11:02:38 +0100 |
commit | d64daf874f8ff2366d3e2d4dd91b58fd5f80ae6c (patch) | |
tree | 390c229cc661bc6c9a201dfa0cc4fbd267339bfa /format.c | |
parent | 7fbd2f5498f30383d145653fe5d1e542fbd6ad43 (diff) | |
parent | 1b4402c82369aa0bb93217979a8fd260a3f269cd (diff) | |
download | rtmux-d64daf874f8ff2366d3e2d4dd91b58fd5f80ae6c.tar.gz rtmux-d64daf874f8ff2366d3e2d4dd91b58fd5f80ae6c.tar.bz2 rtmux-d64daf874f8ff2366d3e2d4dd91b58fd5f80ae6c.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'format.c')
-rw-r--r-- | format.c | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -94,6 +94,7 @@ format_job_cmp(struct format_job *fj1, struct format_job *fj2) #define FORMAT_BASENAME 0x2 #define FORMAT_DIRNAME 0x4 #define FORMAT_SUBSTITUTE 0x8 +#define FORMAT_QUOTE 0x10 /* Entry in format tree. */ struct format_entry { @@ -770,6 +771,23 @@ format_add_cb(struct format_tree *ft, const char *key, format_cb cb) fe->value = NULL; } +/* Quote special characters in string. */ +static char * +format_quote(const char *s) +{ + const char *cp; + char *out, *at; + + at = out = xmalloc(strlen(s) * 2 + 1); + for (cp = s; *cp != '\0'; cp++) { + if (strchr("|&;<>()$`\\\"'*?[# =%", *cp) != NULL) + *at++ = '\\'; + *at++ = *cp; + } + *at = '\0'; + return (out); +} + /* Find a format entry. */ static char * format_find(struct format_tree *ft, const char *key, int modifiers) @@ -852,6 +870,11 @@ found: copy = xstrdup(dirname(saved)); free(saved); } + if (modifiers & FORMAT_QUOTE) { + saved = copy; + copy = xstrdup(format_quote(saved)); + free(saved); + } return (copy); } @@ -992,6 +1015,12 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen, modifiers |= FORMAT_TIMESTRING; copy += 2; break; + case 'q': + if (copy[1] != ':') + break; + modifiers |= FORMAT_QUOTE; + copy += 2; + break; case 's': sep = copy[1]; if (sep == ':' || !ispunct((u_char)sep)) |