diff options
author | Junio C Hamano <junkio@cox.net> | 2005-07-07 23:58:32 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-08 11:01:10 -0700 |
commit | 6fb737be5e4803feabe0d1b6169de36131936368 (patch) | |
tree | f9aa1d13875b921bff9dcf27692c90ef7223a90b /quote.c | |
parent | b33e9666082ce692e64ccfd688dc2a5075566f75 (diff) | |
download | git-6fb737be5e4803feabe0d1b6169de36131936368.tar.gz |
[PATCH] Make sq_expand() available as sq_quote().
A useful shell safety helper sq_expand() was hidden as a static
function in diff.c. Extract it out and make it available as
sq_quote().
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'quote.c')
-rw-r--r-- | quote.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/quote.c b/quote.c new file mode 100644 index 0000000000..5e6fda311c --- /dev/null +++ b/quote.c @@ -0,0 +1,41 @@ +#include "cache.h" +#include "quote.h" + +/* Help to copy the thing properly quoted for the shell safety. + * any single quote is replaced with '\'', and the caller is + * expected to enclose the result within a single quote pair. + * + * E.g. + * original sq_quote result + * name ==> name ==> 'name' + * a b ==> a b ==> 'a b' + * a'b ==> a'\''b ==> 'a'\''b' + */ +char *sq_quote(const char *src) +{ + static char *buf = NULL; + int cnt, c; + const char *cp; + char *bp; + + /* count bytes needed to store the quoted string. */ + for (cnt = 3, cp = src; *cp; cnt++, cp++) + if (*cp == '\'') + cnt += 3; + + buf = xmalloc(cnt); + bp = buf; + *bp++ = '\''; + while ((c = *src++)) { + if (c != '\'') + *bp++ = c; + else { + bp = strcpy(bp, "'\\''"); + bp += 4; + } + } + *bp++ = '\''; + *bp = 0; + return buf; +} + |