diff options
| author | Simon Tatham <anakin@pobox.com> | 2017-05-18 07:03:04 +0100 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2017-05-18 07:10:17 +0100 |
| commit | 48919caa7b9fb99ba8196098c0ca2e1b3dae5160 (patch) | |
| tree | 585312e8c0182016e99d8bb35ba12e1c1115ab09 | |
| parent | 69d886c5757e405785ce811d8622f4ff189a9514 (diff) | |
| download | wix-on-linux-48919caa7b9fb99ba8196098c0ca2e1b3dae5160.tar.gz wix-on-linux-48919caa7b9fb99ba8196098c0ca2e1b3dae5160.tar.bz2 wix-on-linux-48919caa7b9fb99ba8196098c0ca2e1b3dae5160.zip | |
Move dupcat out into its own file, and add dupstr.
Also a handy #define to replace all those tedious castings of NULL.
| -rw-r--r-- | Makefile.am | 4 | ||||
| -rw-r--r-- | dupstr.c | 35 | ||||
| -rw-r--r-- | dupstr.h | 6 | ||||
| -rw-r--r-- | fake-lib.c | 25 | ||||
| -rw-r--r-- | fake-lib.h | 1 | ||||
| -rw-r--r-- | fake-msi.c | 46 | ||||
| -rw-r--r-- | fake-winterop.c | 9 |
7 files changed, 68 insertions, 58 deletions
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 | |||
| 5 | lib_LTLIBRARIES = libwinterop.so.la libmsi.so.la libpreload.la | 5 | lib_LTLIBRARIES = libwinterop.so.la libmsi.so.la libpreload.la |
| 6 | 6 | ||
| 7 | libwinterop_so_la_SOURCES = fake-winterop.c fake-lib.c fake-lib.h \ | 7 | libwinterop_so_la_SOURCES = fake-winterop.c fake-lib.c fake-lib.h \ |
| 8 | memory.c memory.h | 8 | memory.c memory.h dupstr.c dupstr.h |
| 9 | 9 | ||
| 10 | libmsi_so_la_SOURCES = fake-msi.c fake-lib.c fake-lib.h md5.c \ | 10 | libmsi_so_la_SOURCES = fake-msi.c fake-lib.c fake-lib.h md5.c \ |
| 11 | memory.c memory.h version.c | 11 | memory.c memory.h version.c dupstr.c dupstr.h |
| 12 | 12 | ||
| 13 | libpreload_la_SOURCES = preload.c | 13 | libpreload_la_SOURCES = preload.c |
| 14 | libpreload_la_LDFLAGS = -ldl | 14 | 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 @@ | |||
| 1 | #include <stdarg.h> | ||
| 2 | #include <string.h> | ||
| 3 | |||
| 4 | #include "memory.h" | ||
| 5 | #include "dupstr.h" | ||
| 6 | |||
| 7 | char *dupcat(const char *str, ...) | ||
| 8 | { | ||
| 9 | va_list ap; | ||
| 10 | const char *p; | ||
| 11 | char *out, *outp; | ||
| 12 | size_t len; | ||
| 13 | |||
| 14 | len = 1; | ||
| 15 | va_start(ap, str); | ||
| 16 | for (p = str; p; p = va_arg(ap, const char *)) | ||
| 17 | len += strlen(p); | ||
| 18 | va_end(ap); | ||
| 19 | |||
| 20 | out = snewn(len, char); | ||
| 21 | outp = out; | ||
| 22 | va_start(ap, str); | ||
| 23 | for (p = str; p; p = va_arg(ap, const char *)) { | ||
| 24 | strcpy(outp, p); | ||
| 25 | outp += strlen(p); | ||
| 26 | } | ||
| 27 | va_end(ap); | ||
| 28 | |||
| 29 | return out; | ||
| 30 | } | ||
| 31 | |||
| 32 | char *dupstr(const char *str) | ||
| 33 | { | ||
| 34 | return dupcat(str, (const char *)NULL); | ||
| 35 | } | ||
diff --git a/dupstr.h b/dupstr.h new file mode 100644 index 0000000..ea152c5 --- /dev/null +++ b/dupstr.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #include <stddef.h> | ||
| 2 | |||
| 3 | #define cNULL ((const char *)NULL) | ||
| 4 | |||
| 5 | char *dupstr(const char *str); | ||
| 6 | char *dupcat(const char *str, ...); | ||
| @@ -88,28 +88,3 @@ void c16cpy(char16_t *out, uint32_t *outsize, char *s) | |||
| 88 | } | 88 | } |
| 89 | *outsize = retlen; | 89 | *outsize = retlen; |
| 90 | } | 90 | } |
| 91 | |||
| 92 | char *dupcat(const char *str, ...) | ||
| 93 | { | ||
| 94 | va_list ap; | ||
| 95 | const char *p; | ||
| 96 | char *out, *outp; | ||
| 97 | size_t len; | ||
| 98 | |||
| 99 | len = 1; | ||
| 100 | va_start(ap, str); | ||
| 101 | for (p = str; p; p = va_arg(ap, const char *)) | ||
| 102 | len += strlen(p); | ||
| 103 | va_end(ap); | ||
| 104 | |||
| 105 | out = snewn(len, char); | ||
| 106 | outp = out; | ||
| 107 | va_start(ap, str); | ||
| 108 | for (p = str; p; p = va_arg(ap, const char *)) { | ||
| 109 | strcpy(outp, p); | ||
| 110 | outp += strlen(p); | ||
| 111 | } | ||
| 112 | va_end(ap); | ||
| 113 | |||
| 114 | return out; | ||
| 115 | } | ||
| @@ -5,4 +5,3 @@ char *ascii(const char16_t *wstr, bool translate_slashes); | |||
| 5 | void system_argv(const char *cmd, ...); | 5 | void system_argv(const char *cmd, ...); |
| 6 | void system_argv_array(char **args); | 6 | void system_argv_array(char **args); |
| 7 | void c16cpy(char16_t *out, uint32_t *outsize, char *s); | 7 | void c16cpy(char16_t *out, uint32_t *outsize, char *s); |
| 8 | char *dupcat(const char *str, ...); | ||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <unistd.h> | 15 | #include <unistd.h> |
| 16 | 16 | ||
| 17 | #include "memory.h" | 17 | #include "memory.h" |
| 18 | #include "dupstr.h" | ||
| 18 | #include "fake-lib.h" | 19 | #include "fake-lib.h" |
| 19 | 20 | ||
| 20 | typedef struct MsiTypePrefix { | 21 | typedef struct MsiTypePrefix { |
| @@ -42,19 +43,18 @@ uint32_t MsiOpenDatabaseW(const char16_t *filename, | |||
| 42 | close(open(ctx->outfile, O_CREAT | O_WRONLY, 0666)); | 43 | close(open(ctx->outfile, O_CREAT | O_WRONLY, 0666)); |
| 43 | ctx->outfile = realpath(ctx->outfile, NULL); | 44 | ctx->outfile = realpath(ctx->outfile, NULL); |
| 44 | unlink(ctx->outfile); | 45 | unlink(ctx->outfile); |
| 45 | ctx->tempdir = dupcat(ctx->outfile, "-msiXXXXXX", (const char *)NULL); | 46 | ctx->tempdir = dupcat(ctx->outfile, "-msiXXXXXX", cNULL); |
| 46 | if (!mkdtemp(ctx->tempdir)) | 47 | if (!mkdtemp(ctx->tempdir)) |
| 47 | err(1, "%s: mkdtemp", ctx->tempdir); | 48 | err(1, "%s: mkdtemp", ctx->tempdir); |
| 48 | ctx->nargs = 0; | 49 | ctx->nargs = 0; |
| 49 | ctx->argsize = 16; | 50 | ctx->argsize = 16; |
| 50 | ctx->args = snewn(ctx->argsize, char *); | 51 | ctx->args = snewn(ctx->argsize, char *); |
| 51 | ctx->args[ctx->nargs++] = dupcat("sh", (const char *)NULL); | 52 | ctx->args[ctx->nargs++] = dupstr("sh"); |
| 52 | ctx->args[ctx->nargs++] = dupcat("-c", (const char *)NULL); | 53 | ctx->args[ctx->nargs++] = dupstr("-c"); |
| 53 | ctx->args[ctx->nargs++] = dupcat("cd \"$0\" && \"$@\"", | 54 | ctx->args[ctx->nargs++] = dupstr("cd \"$0\" && \"$@\""); |
| 54 | (const char *)NULL); | 55 | ctx->args[ctx->nargs++] = dupstr(ctx->tempdir); |
| 55 | ctx->args[ctx->nargs++] = dupcat(ctx->tempdir, (const char *)NULL); | 56 | ctx->args[ctx->nargs++] = dupstr("msibuild"); |
| 56 | ctx->args[ctx->nargs++] = dupcat("msibuild", (const char *)NULL); | 57 | ctx->args[ctx->nargs++] = dupstr(ctx->outfile); |
| 57 | ctx->args[ctx->nargs++] = dupcat(ctx->outfile, (const char *)NULL); | ||
| 58 | *out_ctx = ctx; | 58 | *out_ctx = ctx; |
| 59 | return 0; | 59 | return 0; |
| 60 | } | 60 | } |
| @@ -64,15 +64,14 @@ uint32_t MsiDatabaseImportW(MsiMainCtx *ctx, const char16_t *folder, | |||
| 64 | { | 64 | { |
| 65 | assert(ctx->t.type == MAIN); | 65 | assert(ctx->t.type == MAIN); |
| 66 | system_argv("sh", "-c", "cd \"$0\" && cp \"$1\" \"$2\"", | 66 | system_argv("sh", "-c", "cd \"$0\" && cp \"$1\" \"$2\"", |
| 67 | ascii(folder, true), ascii(file, true), ctx->tempdir, | 67 | ascii(folder, true), ascii(file, true), ctx->tempdir, cNULL); |
| 68 | (const char *)NULL); | ||
| 69 | if (ctx->nargs + 2 >= ctx->argsize) { | 68 | if (ctx->nargs + 2 >= ctx->argsize) { |
| 70 | ctx->argsize = ctx->nargs * 5 / 4 + 16; | 69 | ctx->argsize = ctx->nargs * 5 / 4 + 16; |
| 71 | ctx->args = sresize(ctx->args, ctx->argsize, char *); | 70 | ctx->args = sresize(ctx->args, ctx->argsize, char *); |
| 72 | } | 71 | } |
| 73 | ctx->args[ctx->nargs++] = dupcat("-i", (const char *)NULL); | 72 | ctx->args[ctx->nargs++] = dupstr("-i"); |
| 74 | ctx->args[ctx->nargs++] = dupcat(ctx->tempdir, "/", ascii(file, true), | 73 | ctx->args[ctx->nargs++] = dupcat(ctx->tempdir, "/", ascii(file, true), |
| 75 | (const char *)NULL); | 74 | cNULL); |
| 76 | return 0; | 75 | return 0; |
| 77 | } | 76 | } |
| 78 | 77 | ||
| @@ -96,15 +95,13 @@ uint32_t MsiDatabaseOpenViewW(MsiMainCtx *ctx, const char16_t *query, | |||
| 96 | view->fp = NULL; /* special case */ | 95 | view->fp = NULL; /* special case */ |
| 97 | else { | 96 | else { |
| 98 | if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Binary`")) { | 97 | if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Binary`")) { |
| 99 | view->fp = fopen(dupcat(ctx->tempdir, "/", "Binary.idt", | 98 | view->fp = fopen(dupcat(ctx->tempdir, "/", "Binary.idt", cNULL), |
| 100 | (const char *)NULL), "a"); | 99 | "a"); |
| 101 | view->targetdir = dupcat(ctx->tempdir, "/", "Binary", | 100 | view->targetdir = dupcat(ctx->tempdir, "/", "Binary", cNULL); |
| 102 | (const char *)NULL); | ||
| 103 | } else if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Icon`")) { | 101 | } else if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Icon`")) { |
| 104 | view->fp = fopen(dupcat(ctx->tempdir, "/", "Icon.idt", | 102 | view->fp = fopen(dupcat(ctx->tempdir, "/", "Icon.idt", cNULL), |
| 105 | (const char *)NULL), "a"); | 103 | "a"); |
| 106 | view->targetdir = dupcat(ctx->tempdir, "/", "Icon", | 104 | view->targetdir = dupcat(ctx->tempdir, "/", "Icon", cNULL); |
| 107 | (const char *)NULL); | ||
| 108 | } else | 105 | } else |
| 109 | errx(1, "unrecognised query: %s", cquery); | 106 | errx(1, "unrecognised query: %s", cquery); |
| 110 | if (!view->fp) | 107 | if (!view->fp) |
| @@ -163,8 +160,7 @@ uint32_t MsiViewModify(MsiView *view, uint32_t mode, MsiRecord *rec) | |||
| 163 | assert(rec->t.type == RECORD); | 160 | assert(rec->t.type == RECORD); |
| 164 | if (view->fp) { | 161 | if (view->fp) { |
| 165 | system_argv("sh", "-c", "cp \"$0\" \"$1\"/\"$2\"", | 162 | system_argv("sh", "-c", "cp \"$0\" \"$1\"/\"$2\"", |
| 166 | rec->data, view->targetdir, rec->name, | 163 | rec->data, view->targetdir, rec->name, cNULL); |
| 167 | (const char *)NULL); | ||
| 168 | fprintf(view->fp, "%s\t%s\r\n", rec->name, rec->name); | 164 | fprintf(view->fp, "%s\t%s\r\n", rec->name, rec->name); |
| 169 | } else { | 165 | } else { |
| 170 | MsiMainCtx *ctx = view->ctx; | 166 | MsiMainCtx *ctx = view->ctx; |
| @@ -172,9 +168,9 @@ uint32_t MsiViewModify(MsiView *view, uint32_t mode, MsiRecord *rec) | |||
| 172 | ctx->argsize = ctx->nargs * 5 / 4 + 16; | 168 | ctx->argsize = ctx->nargs * 5 / 4 + 16; |
| 173 | ctx->args = sresize(ctx->args, ctx->argsize, char *); | 169 | ctx->args = sresize(ctx->args, ctx->argsize, char *); |
| 174 | } | 170 | } |
| 175 | ctx->args[ctx->nargs++] = dupcat("-a", (const char *)NULL); | 171 | ctx->args[ctx->nargs++] = dupstr("-a"); |
| 176 | ctx->args[ctx->nargs++] = dupcat(rec->name, (const char *)NULL); | 172 | ctx->args[ctx->nargs++] = dupstr(rec->name); |
| 177 | ctx->args[ctx->nargs++] = dupcat(rec->data, (const char *)NULL); | 173 | ctx->args[ctx->nargs++] = dupstr(rec->data); |
| 178 | } | 174 | } |
| 179 | return 0; | 175 | return 0; |
| 180 | } | 176 | } |
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 @@ | |||
| 12 | #include <unistd.h> | 12 | #include <unistd.h> |
| 13 | 13 | ||
| 14 | #include "memory.h" | 14 | #include "memory.h" |
| 15 | #include "dupstr.h" | ||
| 15 | #include "fake-lib.h" | 16 | #include "fake-lib.h" |
| 16 | 17 | ||
| 17 | uint32_t HashPublicKeyInfo(void *pCertContext, | 18 | uint32_t HashPublicKeyInfo(void *pCertContext, |
| @@ -41,13 +42,11 @@ uint32_t CreateCabBegin(const char16_t *wzCab, const char16_t *wzCabDir, | |||
| 41 | { | 42 | { |
| 42 | CabCreateContext *ctx = snew(CabCreateContext); | 43 | CabCreateContext *ctx = snew(CabCreateContext); |
| 43 | ctx->outdir = ascii(wzCabDir, true); | 44 | ctx->outdir = ascii(wzCabDir, true); |
| 44 | ctx->outfile = dupcat(ctx->outdir, "/", | 45 | ctx->outfile = dupcat(ctx->outdir, "/", ascii(wzCab, true), cNULL); |
| 45 | ascii(wzCab, true), (const char *)NULL); | ||
| 46 | ctx->nargs = 0; | 46 | ctx->nargs = 0; |
| 47 | ctx->argsize = 16; | 47 | ctx->argsize = 16; |
| 48 | ctx->args = snewn(ctx->argsize, char *); | 48 | ctx->args = snewn(ctx->argsize, char *); |
| 49 | ctx->args[ctx->nargs++] = dupcat(getenv("WIX"), "/", "makecab.py", | 49 | ctx->args[ctx->nargs++] = dupcat(getenv("WIX"), "/", "makecab.py", cNULL); |
| 50 | (const char *)NULL); | ||
| 51 | ctx->args[ctx->nargs++] = ctx->outfile; | 50 | ctx->args[ctx->nargs++] = ctx->outfile; |
| 52 | *out_ctx = ctx; | 51 | *out_ctx = ctx; |
| 53 | return 0; | 52 | return 0; |
| @@ -104,7 +103,7 @@ uint32_t ExtractCab(const char16_t *wzCabinet, const char16_t *wzExtractDir) | |||
| 104 | { | 103 | { |
| 105 | char *cab = ascii(wzCabinet, true), *dir = ascii(wzExtractDir, true); | 104 | char *cab = ascii(wzCabinet, true), *dir = ascii(wzExtractDir, true); |
| 106 | fprintf(stderr, "ExtractCab(\"%s\", \"%s\"\n", cab, dir); | 105 | fprintf(stderr, "ExtractCab(\"%s\", \"%s\"\n", cab, dir); |
| 107 | system_argv("cabextract", "-d", dir, cab, (const char *)NULL); | 106 | system_argv("cabextract", "-d", dir, cab, cNULL); |
| 108 | return 0; | 107 | return 0; |
| 109 | } | 108 | } |
| 110 | 109 | ||
