aboutsummaryrefslogtreecommitdiff
path: root/makecab.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2017-05-18 08:17:57 +0100
committerSimon Tatham <anakin@pobox.com>2017-05-18 08:19:55 +0100
commit7ca5ab5ef2eb8bb0f65aedf11eb74ad2ada78a19 (patch)
tree592d68de8ae1edf910d9f4e783fecacb35df05cd /makecab.c
parent39faf94ea2fa54f6791641142ad03e7e4f884a69 (diff)
downloadwix-on-linux-7ca5ab5ef2eb8bb0f65aedf11eb74ad2ada78a19.tar.gz
wix-on-linux-7ca5ab5ef2eb8bb0f65aedf11eb74ad2ada78a19.tar.bz2
wix-on-linux-7ca5ab5ef2eb8bb0f65aedf11eb74ad2ada78a19.zip
Move CAB-creation routines into their own file.
Also tidy up some of the memory management, while I'm here.
Diffstat (limited to 'makecab.c')
-rw-r--r--makecab.c86
1 files changed, 86 insertions, 0 deletions
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}