aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am4
-rw-r--r--fake-winterop.c67
-rw-r--r--makecab.c86
3 files changed, 88 insertions, 69 deletions
diff --git a/Makefile.am b/Makefile.am
index b23c901..a113320 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4,8 +4,8 @@ ACLOCAL_AMFLAGS = -I m4
4 4
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 memory.c memory.h \ 7libwinterop_so_la_SOURCES = fake-winterop.c makecab.c memory.c \
8dupstr.c dupstr.h subproc.c subproc.h uchars.c uchars.h 8memory.h dupstr.c dupstr.h subproc.c subproc.h uchars.c uchars.h
9 9
10libmsi_so_la_SOURCES = fake-msi.c md5.c memory.c memory.h version.c \ 10libmsi_so_la_SOURCES = fake-msi.c md5.c memory.c memory.h version.c \
11dupstr.c dupstr.h subproc.c subproc.h uchars.c uchars.h 11dupstr.c dupstr.h subproc.c subproc.h uchars.c uchars.h
diff --git a/fake-winterop.c b/fake-winterop.c
index d238784..755853f 100644
--- a/fake-winterop.c
+++ b/fake-winterop.c
@@ -28,73 +28,6 @@ uint32_t ResetAcls(const char16_t **pwzFiles, uint32_t cFiles)
28 return 0; 28 return 0;
29} 29}
30 30
31typedef struct CabCreateContext {
32 char *outdir;
33 char *outfile;
34
35 char **args;
36 int nargs, argsize;
37} CabCreateContext;
38
39uint32_t CreateCabBegin(const char16_t *wzCab, const char16_t *wzCabDir,
40 uint32_t dwMaxFiles, uint32_t dwMaxSize,
41 uint32_t dwMaxThresh, int compression,
42 CabCreateContext **out_ctx)
43{
44 CabCreateContext *ctx = snew(CabCreateContext);
45 ctx->outdir = ascii(wzCabDir, true);
46 ctx->outfile = dupcat(ctx->outdir, "/", ascii(wzCab, true), cNULL);
47 ctx->nargs = 0;
48 ctx->argsize = 16;
49 ctx->args = snewn(ctx->argsize, char *);
50 ctx->args[ctx->nargs++] = dupcat(getenv("WIX"), "/", "makecab.py", cNULL);
51 ctx->args[ctx->nargs++] = ctx->outfile;
52 *out_ctx = ctx;
53 return 0;
54}
55
56uint32_t CreateCabAddFile(const char16_t *wzFile, const char16_t *wzToken,
57 void *pmfHash, CabCreateContext *ctx)
58{
59 char *file = ascii(wzFile, true);
60 char *file_abs = realpath(file, NULL);
61 char *cabname = ascii(wzToken, true);
62 printf("CreateCabAddFile: %s :: %s <- %s\n", ctx->outfile,
63 cabname, file_abs);
64 if (ctx->nargs + 1 >= ctx->argsize) {
65 ctx->argsize = ctx->nargs * 5 / 4 + 16;
66 ctx->args = sresize(ctx->args, ctx->argsize, char *);
67 }
68 ctx->args[ctx->nargs++] = cabname;
69 ctx->args[ctx->nargs++] = file_abs;
70 return 0;
71}
72
73uint32_t CreateCabAddFiles(const char16_t *const *pwzFiles,
74 const char16_t *const *pwzTokens,
75 void *pmfHash, uint32_t cFiles,
76 CabCreateContext *ctx)
77{
78 for (uint32_t i = 0; i < cFiles; i++)
79 CreateCabAddFile(pwzFiles[i], pwzTokens[i], pmfHash, ctx);
80 return 0;
81}
82
83uint32_t CreateCabFinish(CabCreateContext *ctx, void (*split_callback)(void))
84{
85 if (ctx->nargs + 1 >= ctx->argsize) {
86 ctx->argsize = ctx->nargs * 5 / 4 + 16;
87 ctx->args = sresize(ctx->args, ctx->argsize, char *);
88 }
89 ctx->args[ctx->nargs++] = NULL;
90 system_argv_array(ctx->args);
91 return 0;
92}
93
94void CreateCabCancel(void *hContext)
95{
96}
97
98uint32_t ExtractCabBegin(void) 31uint32_t ExtractCabBegin(void)
99{ 32{
100 return 0; 33 return 0;
diff --git a/makecab.c b/makecab.c
new file mode 100644
index 0000000..ec4ba05
--- /dev/null
+++ b/makecab.c
@@ -0,0 +1,86 @@
1#include <stdint.h>
2
3#include <err.h>
4
5#include "memory.h"
6#include "dupstr.h"
7#include "subproc.h"
8#include "uchars.h"
9
10typedef struct CabCreateContext {
11 char *outfile;
12
13 char **args;
14 int nargs, argsize;
15} CabCreateContext;
16
17uint32_t CreateCabBegin(const char16_t *wzCab, const char16_t *wzCabDir,
18 uint32_t dwMaxFiles, uint32_t dwMaxSize,
19 uint32_t dwMaxThresh, int compression,
20 CabCreateContext **out_ctx)
21{
22 CabCreateContext *ctx = snew(CabCreateContext);
23 char *outdir = ascii(wzCabDir, true);
24 char *cab = ascii(wzCab, true);
25 ctx->outfile = dupcat(outdir, "/", cab, cNULL);
26 sfree(cab);
27 sfree(outdir);
28 ctx->nargs = 0;
29 ctx->argsize = 16;
30 ctx->args = snewn(ctx->argsize, char *);
31 ctx->args[ctx->nargs++] = dupcat(getenv("WIX"), "/", "makecab.py", cNULL);
32 ctx->args[ctx->nargs++] = ctx->outfile;
33 *out_ctx = ctx;
34 return 0;
35}
36
37uint32_t CreateCabAddFile(const char16_t *wzFile, const char16_t *wzToken,
38 void *pmfHash, CabCreateContext *ctx)
39{
40 char *file = ascii(wzFile, true);
41 char *file_abs = realpath(file, NULL);
42 char *cabname = ascii(wzToken, true);
43 warnx("CreateCabAddFile: %s :: %s <- %s", ctx->outfile,
44 cabname, file_abs);
45 if (ctx->nargs + 1 >= ctx->argsize) {
46 ctx->argsize = ctx->nargs * 5 / 4 + 16;
47 ctx->args = sresize(ctx->args, ctx->argsize, char *);
48 }
49 ctx->args[ctx->nargs++] = cabname;
50 ctx->args[ctx->nargs++] = file_abs;
51 sfree(file);
52 return 0;
53}
54
55uint32_t CreateCabAddFiles(const char16_t *const *pwzFiles,
56 const char16_t *const *pwzTokens,
57 void *pmfHash, uint32_t cFiles,
58 CabCreateContext *ctx)
59{
60 for (uint32_t i = 0; i < cFiles; i++)
61 CreateCabAddFile(pwzFiles[i], pwzTokens[i], pmfHash, ctx);
62 return 0;
63}
64
65void CreateCabCancel(CabCreateContext *ctx)
66{
67 for (int i = 0; i < ctx->nargs; i++)
68 sfree(ctx->args[i]);
69 sfree(ctx->args);
70 sfree(ctx->outfile);
71 sfree(ctx);
72}
73
74uint32_t CreateCabFinish(CabCreateContext *ctx, void (*split_callback)(void))
75{
76 if (ctx->nargs + 1 >= ctx->argsize) {
77 ctx->argsize = ctx->nargs * 5 / 4 + 16;
78 ctx->args = sresize(ctx->args, ctx->argsize, char *);
79 }
80 ctx->args[ctx->nargs++] = NULL;
81 system_argv_array(ctx->args);
82
83 CreateCabCancel(ctx); /* free everything */
84
85 return 0;
86}