From 48919caa7b9fb99ba8196098c0ca2e1b3dae5160 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Thu, 18 May 2017 07:03:04 +0100 Subject: Move dupcat out into its own file, and add dupstr. Also a handy #define to replace all those tedious castings of NULL. --- Makefile.am | 4 ++-- dupstr.c | 35 +++++++++++++++++++++++++++++++++++ dupstr.h | 6 ++++++ fake-lib.c | 25 ------------------------- fake-lib.h | 1 - fake-msi.c | 46 +++++++++++++++++++++------------------------- fake-winterop.c | 9 ++++----- 7 files changed, 68 insertions(+), 58 deletions(-) create mode 100644 dupstr.c create mode 100644 dupstr.h diff --git a/Makefile.am b/Makefile.am index 668425e..b0141dc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,10 +5,10 @@ ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libwinterop.so.la libmsi.so.la libpreload.la libwinterop_so_la_SOURCES = fake-winterop.c fake-lib.c fake-lib.h \ -memory.c memory.h +memory.c memory.h dupstr.c dupstr.h libmsi_so_la_SOURCES = fake-msi.c fake-lib.c fake-lib.h md5.c \ -memory.c memory.h version.c +memory.c memory.h version.c dupstr.c dupstr.h libpreload_la_SOURCES = preload.c libpreload_la_LDFLAGS = -ldl diff --git a/dupstr.c b/dupstr.c new file mode 100644 index 0000000..d3a5f53 --- /dev/null +++ b/dupstr.c @@ -0,0 +1,35 @@ +#include +#include + +#include "memory.h" +#include "dupstr.h" + +char *dupcat(const char *str, ...) +{ + va_list ap; + const char *p; + char *out, *outp; + size_t len; + + len = 1; + va_start(ap, str); + for (p = str; p; p = va_arg(ap, const char *)) + len += strlen(p); + va_end(ap); + + out = snewn(len, char); + outp = out; + va_start(ap, str); + for (p = str; p; p = va_arg(ap, const char *)) { + strcpy(outp, p); + outp += strlen(p); + } + va_end(ap); + + return out; +} + +char *dupstr(const char *str) +{ + return dupcat(str, (const char *)NULL); +} diff --git a/dupstr.h b/dupstr.h new file mode 100644 index 0000000..ea152c5 --- /dev/null +++ b/dupstr.h @@ -0,0 +1,6 @@ +#include + +#define cNULL ((const char *)NULL) + +char *dupstr(const char *str); +char *dupcat(const char *str, ...); diff --git a/fake-lib.c b/fake-lib.c index 36c6198..cf6be49 100644 --- a/fake-lib.c +++ b/fake-lib.c @@ -88,28 +88,3 @@ void c16cpy(char16_t *out, uint32_t *outsize, char *s) } *outsize = retlen; } - -char *dupcat(const char *str, ...) -{ - va_list ap; - const char *p; - char *out, *outp; - size_t len; - - len = 1; - va_start(ap, str); - for (p = str; p; p = va_arg(ap, const char *)) - len += strlen(p); - va_end(ap); - - out = snewn(len, char); - outp = out; - va_start(ap, str); - for (p = str; p; p = va_arg(ap, const char *)) { - strcpy(outp, p); - outp += strlen(p); - } - va_end(ap); - - return out; -} diff --git a/fake-lib.h b/fake-lib.h index de0960f..c71b977 100644 --- a/fake-lib.h +++ b/fake-lib.h @@ -5,4 +5,3 @@ char *ascii(const char16_t *wstr, bool translate_slashes); void system_argv(const char *cmd, ...); void system_argv_array(char **args); void c16cpy(char16_t *out, uint32_t *outsize, char *s); -char *dupcat(const char *str, ...); diff --git a/fake-msi.c b/fake-msi.c index 2223211..12b1489 100644 --- a/fake-msi.c +++ b/fake-msi.c @@ -15,6 +15,7 @@ #include #include "memory.h" +#include "dupstr.h" #include "fake-lib.h" typedef struct MsiTypePrefix { @@ -42,19 +43,18 @@ uint32_t MsiOpenDatabaseW(const char16_t *filename, close(open(ctx->outfile, O_CREAT | O_WRONLY, 0666)); ctx->outfile = realpath(ctx->outfile, NULL); unlink(ctx->outfile); - ctx->tempdir = dupcat(ctx->outfile, "-msiXXXXXX", (const char *)NULL); + ctx->tempdir = dupcat(ctx->outfile, "-msiXXXXXX", cNULL); if (!mkdtemp(ctx->tempdir)) err(1, "%s: mkdtemp", ctx->tempdir); ctx->nargs = 0; ctx->argsize = 16; ctx->args = snewn(ctx->argsize, char *); - ctx->args[ctx->nargs++] = dupcat("sh", (const char *)NULL); - ctx->args[ctx->nargs++] = dupcat("-c", (const char *)NULL); - ctx->args[ctx->nargs++] = dupcat("cd \"$0\" && \"$@\"", - (const char *)NULL); - ctx->args[ctx->nargs++] = dupcat(ctx->tempdir, (const char *)NULL); - ctx->args[ctx->nargs++] = dupcat("msibuild", (const char *)NULL); - ctx->args[ctx->nargs++] = dupcat(ctx->outfile, (const char *)NULL); + ctx->args[ctx->nargs++] = dupstr("sh"); + ctx->args[ctx->nargs++] = dupstr("-c"); + ctx->args[ctx->nargs++] = dupstr("cd \"$0\" && \"$@\""); + ctx->args[ctx->nargs++] = dupstr(ctx->tempdir); + ctx->args[ctx->nargs++] = dupstr("msibuild"); + ctx->args[ctx->nargs++] = dupstr(ctx->outfile); *out_ctx = ctx; return 0; } @@ -64,15 +64,14 @@ uint32_t MsiDatabaseImportW(MsiMainCtx *ctx, const char16_t *folder, { assert(ctx->t.type == MAIN); system_argv("sh", "-c", "cd \"$0\" && cp \"$1\" \"$2\"", - ascii(folder, true), ascii(file, true), ctx->tempdir, - (const char *)NULL); + ascii(folder, true), ascii(file, true), ctx->tempdir, cNULL); if (ctx->nargs + 2 >= ctx->argsize) { ctx->argsize = ctx->nargs * 5 / 4 + 16; ctx->args = sresize(ctx->args, ctx->argsize, char *); } - ctx->args[ctx->nargs++] = dupcat("-i", (const char *)NULL); + ctx->args[ctx->nargs++] = dupstr("-i"); ctx->args[ctx->nargs++] = dupcat(ctx->tempdir, "/", ascii(file, true), - (const char *)NULL); + cNULL); return 0; } @@ -96,15 +95,13 @@ uint32_t MsiDatabaseOpenViewW(MsiMainCtx *ctx, const char16_t *query, view->fp = NULL; /* special case */ else { if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Binary`")) { - view->fp = fopen(dupcat(ctx->tempdir, "/", "Binary.idt", - (const char *)NULL), "a"); - view->targetdir = dupcat(ctx->tempdir, "/", "Binary", - (const char *)NULL); + view->fp = fopen(dupcat(ctx->tempdir, "/", "Binary.idt", cNULL), + "a"); + view->targetdir = dupcat(ctx->tempdir, "/", "Binary", cNULL); } else if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Icon`")) { - view->fp = fopen(dupcat(ctx->tempdir, "/", "Icon.idt", - (const char *)NULL), "a"); - view->targetdir = dupcat(ctx->tempdir, "/", "Icon", - (const char *)NULL); + view->fp = fopen(dupcat(ctx->tempdir, "/", "Icon.idt", cNULL), + "a"); + view->targetdir = dupcat(ctx->tempdir, "/", "Icon", cNULL); } else errx(1, "unrecognised query: %s", cquery); if (!view->fp) @@ -163,8 +160,7 @@ uint32_t MsiViewModify(MsiView *view, uint32_t mode, MsiRecord *rec) assert(rec->t.type == RECORD); if (view->fp) { system_argv("sh", "-c", "cp \"$0\" \"$1\"/\"$2\"", - rec->data, view->targetdir, rec->name, - (const char *)NULL); + rec->data, view->targetdir, rec->name, cNULL); fprintf(view->fp, "%s\t%s\r\n", rec->name, rec->name); } else { MsiMainCtx *ctx = view->ctx; @@ -172,9 +168,9 @@ uint32_t MsiViewModify(MsiView *view, uint32_t mode, MsiRecord *rec) ctx->argsize = ctx->nargs * 5 / 4 + 16; ctx->args = sresize(ctx->args, ctx->argsize, char *); } - ctx->args[ctx->nargs++] = dupcat("-a", (const char *)NULL); - ctx->args[ctx->nargs++] = dupcat(rec->name, (const char *)NULL); - ctx->args[ctx->nargs++] = dupcat(rec->data, (const char *)NULL); + ctx->args[ctx->nargs++] = dupstr("-a"); + ctx->args[ctx->nargs++] = dupstr(rec->name); + ctx->args[ctx->nargs++] = dupstr(rec->data); } return 0; } diff --git a/fake-winterop.c b/fake-winterop.c index b367831..6f7e3d3 100644 --- a/fake-winterop.c +++ b/fake-winterop.c @@ -12,6 +12,7 @@ #include #include "memory.h" +#include "dupstr.h" #include "fake-lib.h" uint32_t HashPublicKeyInfo(void *pCertContext, @@ -41,13 +42,11 @@ uint32_t CreateCabBegin(const char16_t *wzCab, const char16_t *wzCabDir, { CabCreateContext *ctx = snew(CabCreateContext); ctx->outdir = ascii(wzCabDir, true); - ctx->outfile = dupcat(ctx->outdir, "/", - ascii(wzCab, true), (const char *)NULL); + ctx->outfile = dupcat(ctx->outdir, "/", ascii(wzCab, true), cNULL); ctx->nargs = 0; ctx->argsize = 16; ctx->args = snewn(ctx->argsize, char *); - ctx->args[ctx->nargs++] = dupcat(getenv("WIX"), "/", "makecab.py", - (const char *)NULL); + ctx->args[ctx->nargs++] = dupcat(getenv("WIX"), "/", "makecab.py", cNULL); ctx->args[ctx->nargs++] = ctx->outfile; *out_ctx = ctx; return 0; @@ -104,7 +103,7 @@ uint32_t ExtractCab(const char16_t *wzCabinet, const char16_t *wzExtractDir) { char *cab = ascii(wzCabinet, true), *dir = ascii(wzExtractDir, true); fprintf(stderr, "ExtractCab(\"%s\", \"%s\"\n", cab, dir); - system_argv("cabextract", "-d", dir, cab, (const char *)NULL); + system_argv("cabextract", "-d", dir, cab, cNULL); return 0; } -- cgit v1.2.3-55-g6feb