diff --git a/strbuf_helpers.c b/strbuf_helpers.c index 0d7d3d08..d444eaca 100644 --- a/strbuf_helpers.c +++ b/strbuf_helpers.c @@ -70,6 +70,19 @@ static int is_shellmeta(char c) return !(isalnum(c) || c == '.' || c == '-' || c == '/' || c == ':' || c == '+' || c == '_' || c == ','); } +strbuf strbuf_append_shell_quote(strbuf sb, const char *word) +{ + strbuf_putc(sb, '\''); + const char *p; + for (p = word; *p; ++p) + if (*p == '\'') + strbuf_puts(sb, "'\\''"); + else + strbuf_putc(sb, *p); + strbuf_putc(sb, '\''); + return sb; +} + strbuf strbuf_append_shell_quotemeta(strbuf sb, const char *word) { const char *p; @@ -77,17 +90,10 @@ strbuf strbuf_append_shell_quotemeta(strbuf sb, const char *word) for (p = word; *p && !hasmeta; ++p) if (is_shellmeta(*p)) hasmeta = 1; - if (hasmeta) { - strbuf_putc(sb, '\''); - for (p = word; *p; ++p) - if (*p == '\'') - strbuf_puts(sb, "'\\''"); - else - strbuf_putc(sb, *p); - strbuf_putc(sb, '\''); - } else { + if (!word[0] || hasmeta) + strbuf_append_shell_quote(sb, word); + else strbuf_puts(sb, word); - } return sb; } diff --git a/strbuf_helpers.h b/strbuf_helpers.h index 05ff4e99..43bc026b 100644 --- a/strbuf_helpers.h +++ b/strbuf_helpers.h @@ -27,7 +27,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ strbuf strbuf_append_poll_events(strbuf sb, short events); -/* Append a string with shell metacharacters and spaces quoted. +/* Append a string as a quoted shell word. + * @author Andrew Bettison + */ +strbuf strbuf_append_shell_quote(strbuf sb, const char *word); + +/* Append a string as a shell word, quoted if it contains shell metacharacters + * or spaces. * @author Andrew Bettison */ strbuf strbuf_append_shell_quotemeta(strbuf sb, const char *word);