diff options
-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 | ||