aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am4
-rw-r--r--dupstr.c35
-rw-r--r--dupstr.h6
-rw-r--r--fake-lib.c25
-rw-r--r--fake-lib.h1
-rw-r--r--fake-msi.c46
-rw-r--r--fake-winterop.c9
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
5lib_LTLIBRARIES = libwinterop.so.la libmsi.so.la libpreload.la 5lib_LTLIBRARIES = libwinterop.so.la libmsi.so.la libpreload.la
6 6
7libwinterop_so_la_SOURCES = fake-winterop.c fake-lib.c fake-lib.h \ 7libwinterop_so_la_SOURCES = fake-winterop.c fake-lib.c fake-lib.h \
8memory.c memory.h 8memory.c memory.h dupstr.c dupstr.h
9 9
10libmsi_so_la_SOURCES = fake-msi.c fake-lib.c fake-lib.h md5.c \ 10libmsi_so_la_SOURCES = fake-msi.c fake-lib.c fake-lib.h md5.c \
11memory.c memory.h version.c 11memory.c memory.h version.c dupstr.c dupstr.h
12 12
13libpreload_la_SOURCES = preload.c 13libpreload_la_SOURCES = preload.c
14libpreload_la_LDFLAGS = -ldl 14libpreload_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
7char *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
32char *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
5char *dupstr(const char *str);
6char *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)
88 } 88 }
89 *outsize = retlen; 89 *outsize = retlen;
90} 90}
91
92char *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}
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);
5void system_argv(const char *cmd, ...); 5void system_argv(const char *cmd, ...);
6void system_argv_array(char **args); 6void system_argv_array(char **args);
7void c16cpy(char16_t *out, uint32_t *outsize, char *s); 7void c16cpy(char16_t *out, uint32_t *outsize, char *s);
8char *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 @@
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
20typedef struct MsiTypePrefix { 21typedef 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
17uint32_t HashPublicKeyInfo(void *pCertContext, 18uint32_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