From f99d78f674887b2fe0d7a6114954d2318b2845b7 Mon Sep 17 00:00:00 2001 From: Nathan Wagner Date: Sun, 23 Sep 2018 08:01:32 +0000 Subject: [PATCH] add zpm-quote option to shell quoting Add -s to shell quote, and -q to add single quotes around the quoted string. Default behavior is to quote for sqlite and not add quotes. add sql identifier quoting --- Makefile | 4 +-- zpm-quote.c | 97 ++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index c876ce1..e850606 100644 --- a/Makefile +++ b/Makefile @@ -132,8 +132,8 @@ zpm-findpkg: zpm-findpkg.o libzpm.a zpm-parse: zpm-parse.o libzpm.a $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lzpm -lelf -zpm-quote: zpm-quote.o libzpm.a - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lzpm -lelf +zpm-quote: zpm-quote.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< newdb.c: db.sql echo "char createdb[] = {" > $@ diff --git a/zpm-quote.c b/zpm-quote.c index ea306b4..97e4fe6 100644 --- a/zpm-quote.c +++ b/zpm-quote.c @@ -1,28 +1,93 @@ -#include +#define _POSIX_C_SOURCE 2 -#include "zpm.h" +#include +#include +#include +#include /* for quoting against the shell replace ' with '\'' and surround with * single quotes */ -int main(int ac, char **av) { - size_t n = 0; - size_t bufsize = 0; - char *buffer = 0; - int i; - for (i=1;i bufsize) { - buffer = realloc(buffer, n+1); - if (buffer) { - bufsize = n+1; +char *quote(char *s, int chi, char *repl, int addquotes) { + size_t size = 0, rsize = 0; + char *d, *q, *r; + char ch = chi; + + if (!s) return NULL; + if (!repl) return NULL; + + rsize = strlen(repl); + + for (d = s; *d; d++) { + if (*d == ch) { + size += rsize-1; + } + size++; + } + + if (addquotes) { + size += 2; + } + + d = q = malloc(size+1); + + if (q) { + if (addquotes) { + *d++ = ch; + } + + while (*s) { + if (*s == ch) { + r = repl; + while (*r) { + *d++ = *r++; + } + s++; } else { - exit(EXIT_FAILURE); + *d++ = *s++; } + *d = 0; } - zpm_quote(av[i], buffer, bufsize); - printf("%s\n", buffer); + + if (addquotes) { + *d++ = ch; + } + *d = 0; + } + + return q; +} + +int main(int ac, char **av) { + char *quoted; + int i; + int ch = '\''; + int opt, shellmode = 0, addquotes = 0, ident = 0; + char *repl = "''"; + + while ((opt = getopt(ac, av, "sqi")) != -1) { + switch (opt) { + case 's': shellmode = 1; break; + case 'q': addquotes = 1; break; + case 'i': ident = 1; break; + default: + exit(EXIT_FAILURE); + break; + } + } + int argn = optind; + + if (shellmode) { + repl = "'\\''"; + } else if (ident) { + ch = '"'; + repl = "\"\""; + } + + for (i=argn;i