#include "cache.h" #include "quote.h" /* Help to copy the thing properly quoted for the shell safety. * any single quote is replaced with '\'', any exclamation point * is replaced with '\!', and the whole thing is enclosed in a * * E.g. * original sq_quote result * name ==> name ==> 'name' * a b ==> a b ==> 'a b' * a'b ==> a'\''b ==> 'a'\''b' * a!b ==> a'\!'b ==> 'a'\!'b' */ #define EMIT(x) ( (++len < n) && (*bp++ = (x)) ) size_t sq_quote_buf(char *dst, size_t n, const char *src) { char c; char *bp = dst; size_t len = 0; EMIT('\''); while ((c = *src++)) { if (c == '\'' || c == '!') { EMIT('\''); EMIT('\\'); EMIT(c); EMIT('\''); } else { EMIT(c); } } EMIT('\''); if ( n ) *bp = 0; return len; } char *sq_quote(const char *src) { char *buf; size_t cnt; cnt = sq_quote_buf(NULL, 0, src) + 1; buf = xmalloc(cnt); sq_quote_buf(buf, cnt, src); return buf; }