Move dupcat out into its own file, and add dupstr.

Also a handy #define to replace all those tedious castings of NULL.
This commit is contained in:
Simon Tatham 2017-05-18 07:03:04 +01:00
parent 69d886c575
commit 48919caa7b
7 changed files with 68 additions and 58 deletions

View file

@ -5,10 +5,10 @@ ACLOCAL_AMFLAGS = -I m4
lib_LTLIBRARIES = libwinterop.so.la libmsi.so.la libpreload.la lib_LTLIBRARIES = libwinterop.so.la libmsi.so.la libpreload.la
libwinterop_so_la_SOURCES = fake-winterop.c fake-lib.c fake-lib.h \ libwinterop_so_la_SOURCES = fake-winterop.c fake-lib.c fake-lib.h \
memory.c memory.h memory.c memory.h dupstr.c dupstr.h
libmsi_so_la_SOURCES = fake-msi.c fake-lib.c fake-lib.h md5.c \ libmsi_so_la_SOURCES = fake-msi.c fake-lib.c fake-lib.h md5.c \
memory.c memory.h version.c memory.c memory.h version.c dupstr.c dupstr.h
libpreload_la_SOURCES = preload.c libpreload_la_SOURCES = preload.c
libpreload_la_LDFLAGS = -ldl libpreload_la_LDFLAGS = -ldl

35
dupstr.c Normal file
View file

@ -0,0 +1,35 @@
#include <stdarg.h>
#include <string.h>
#include "memory.h"
#include "dupstr.h"
char *dupcat(const char *str, ...)
{
va_list ap;
const char *p;
char *out, *outp;
size_t len;
len = 1;
va_start(ap, str);
for (p = str; p; p = va_arg(ap, const char *))
len += strlen(p);
va_end(ap);
out = snewn(len, char);
outp = out;
va_start(ap, str);
for (p = str; p; p = va_arg(ap, const char *)) {
strcpy(outp, p);
outp += strlen(p);
}
va_end(ap);
return out;
}
char *dupstr(const char *str)
{
return dupcat(str, (const char *)NULL);
}

6
dupstr.h Normal file
View file

@ -0,0 +1,6 @@
#include <stddef.h>
#define cNULL ((const char *)NULL)
char *dupstr(const char *str);
char *dupcat(const char *str, ...);

View file

@ -88,28 +88,3 @@ void c16cpy(char16_t *out, uint32_t *outsize, char *s)
} }
*outsize = retlen; *outsize = retlen;
} }
char *dupcat(const char *str, ...)
{
va_list ap;
const char *p;
char *out, *outp;
size_t len;
len = 1;
va_start(ap, str);
for (p = str; p; p = va_arg(ap, const char *))
len += strlen(p);
va_end(ap);
out = snewn(len, char);
outp = out;
va_start(ap, str);
for (p = str; p; p = va_arg(ap, const char *)) {
strcpy(outp, p);
outp += strlen(p);
}
va_end(ap);
return out;
}

View file

@ -5,4 +5,3 @@ char *ascii(const char16_t *wstr, bool translate_slashes);
void system_argv(const char *cmd, ...); void system_argv(const char *cmd, ...);
void system_argv_array(char **args); void system_argv_array(char **args);
void c16cpy(char16_t *out, uint32_t *outsize, char *s); void c16cpy(char16_t *out, uint32_t *outsize, char *s);
char *dupcat(const char *str, ...);

View file

@ -15,6 +15,7 @@
#include <unistd.h> #include <unistd.h>
#include "memory.h" #include "memory.h"
#include "dupstr.h"
#include "fake-lib.h" #include "fake-lib.h"
typedef struct MsiTypePrefix { typedef struct MsiTypePrefix {
@ -42,19 +43,18 @@ uint32_t MsiOpenDatabaseW(const char16_t *filename,
close(open(ctx->outfile, O_CREAT | O_WRONLY, 0666)); close(open(ctx->outfile, O_CREAT | O_WRONLY, 0666));
ctx->outfile = realpath(ctx->outfile, NULL); ctx->outfile = realpath(ctx->outfile, NULL);
unlink(ctx->outfile); unlink(ctx->outfile);
ctx->tempdir = dupcat(ctx->outfile, "-msiXXXXXX", (const char *)NULL); ctx->tempdir = dupcat(ctx->outfile, "-msiXXXXXX", cNULL);
if (!mkdtemp(ctx->tempdir)) if (!mkdtemp(ctx->tempdir))
err(1, "%s: mkdtemp", ctx->tempdir); err(1, "%s: mkdtemp", ctx->tempdir);
ctx->nargs = 0; ctx->nargs = 0;
ctx->argsize = 16; ctx->argsize = 16;
ctx->args = snewn(ctx->argsize, char *); ctx->args = snewn(ctx->argsize, char *);
ctx->args[ctx->nargs++] = dupcat("sh", (const char *)NULL); ctx->args[ctx->nargs++] = dupstr("sh");
ctx->args[ctx->nargs++] = dupcat("-c", (const char *)NULL); ctx->args[ctx->nargs++] = dupstr("-c");
ctx->args[ctx->nargs++] = dupcat("cd \"$0\" && \"$@\"", ctx->args[ctx->nargs++] = dupstr("cd \"$0\" && \"$@\"");
(const char *)NULL); ctx->args[ctx->nargs++] = dupstr(ctx->tempdir);
ctx->args[ctx->nargs++] = dupcat(ctx->tempdir, (const char *)NULL); ctx->args[ctx->nargs++] = dupstr("msibuild");
ctx->args[ctx->nargs++] = dupcat("msibuild", (const char *)NULL); ctx->args[ctx->nargs++] = dupstr(ctx->outfile);
ctx->args[ctx->nargs++] = dupcat(ctx->outfile, (const char *)NULL);
*out_ctx = ctx; *out_ctx = ctx;
return 0; return 0;
} }
@ -64,15 +64,14 @@ uint32_t MsiDatabaseImportW(MsiMainCtx *ctx, const char16_t *folder,
{ {
assert(ctx->t.type == MAIN); assert(ctx->t.type == MAIN);
system_argv("sh", "-c", "cd \"$0\" && cp \"$1\" \"$2\"", system_argv("sh", "-c", "cd \"$0\" && cp \"$1\" \"$2\"",
ascii(folder, true), ascii(file, true), ctx->tempdir, ascii(folder, true), ascii(file, true), ctx->tempdir, cNULL);
(const char *)NULL);
if (ctx->nargs + 2 >= ctx->argsize) { if (ctx->nargs + 2 >= ctx->argsize) {
ctx->argsize = ctx->nargs * 5 / 4 + 16; ctx->argsize = ctx->nargs * 5 / 4 + 16;
ctx->args = sresize(ctx->args, ctx->argsize, char *); ctx->args = sresize(ctx->args, ctx->argsize, char *);
} }
ctx->args[ctx->nargs++] = dupcat("-i", (const char *)NULL); ctx->args[ctx->nargs++] = dupstr("-i");
ctx->args[ctx->nargs++] = dupcat(ctx->tempdir, "/", ascii(file, true), ctx->args[ctx->nargs++] = dupcat(ctx->tempdir, "/", ascii(file, true),
(const char *)NULL); cNULL);
return 0; return 0;
} }
@ -96,15 +95,13 @@ uint32_t MsiDatabaseOpenViewW(MsiMainCtx *ctx, const char16_t *query,
view->fp = NULL; /* special case */ view->fp = NULL; /* special case */
else { else {
if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Binary`")) { if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Binary`")) {
view->fp = fopen(dupcat(ctx->tempdir, "/", "Binary.idt", view->fp = fopen(dupcat(ctx->tempdir, "/", "Binary.idt", cNULL),
(const char *)NULL), "a"); "a");
view->targetdir = dupcat(ctx->tempdir, "/", "Binary", view->targetdir = dupcat(ctx->tempdir, "/", "Binary", cNULL);
(const char *)NULL);
} else if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Icon`")) { } else if (!strcmp(cquery, "SELECT `Name`, `Data` FROM `Icon`")) {
view->fp = fopen(dupcat(ctx->tempdir, "/", "Icon.idt", view->fp = fopen(dupcat(ctx->tempdir, "/", "Icon.idt", cNULL),
(const char *)NULL), "a"); "a");
view->targetdir = dupcat(ctx->tempdir, "/", "Icon", view->targetdir = dupcat(ctx->tempdir, "/", "Icon", cNULL);
(const char *)NULL);
} else } else
errx(1, "unrecognised query: %s", cquery); errx(1, "unrecognised query: %s", cquery);
if (!view->fp) if (!view->fp)
@ -163,8 +160,7 @@ uint32_t MsiViewModify(MsiView *view, uint32_t mode, MsiRecord *rec)
assert(rec->t.type == RECORD); assert(rec->t.type == RECORD);
if (view->fp) { if (view->fp) {
system_argv("sh", "-c", "cp \"$0\" \"$1\"/\"$2\"", system_argv("sh", "-c", "cp \"$0\" \"$1\"/\"$2\"",
rec->data, view->targetdir, rec->name, rec->data, view->targetdir, rec->name, cNULL);
(const char *)NULL);
fprintf(view->fp, "%s\t%s\r\n", rec->name, rec->name); fprintf(view->fp, "%s\t%s\r\n", rec->name, rec->name);
} else { } else {
MsiMainCtx *ctx = view->ctx; MsiMainCtx *ctx = view->ctx;
@ -172,9 +168,9 @@ uint32_t MsiViewModify(MsiView *view, uint32_t mode, MsiRecord *rec)
ctx->argsize = ctx->nargs * 5 / 4 + 16; ctx->argsize = ctx->nargs * 5 / 4 + 16;
ctx->args = sresize(ctx->args, ctx->argsize, char *); ctx->args = sresize(ctx->args, ctx->argsize, char *);
} }
ctx->args[ctx->nargs++] = dupcat("-a", (const char *)NULL); ctx->args[ctx->nargs++] = dupstr("-a");
ctx->args[ctx->nargs++] = dupcat(rec->name, (const char *)NULL); ctx->args[ctx->nargs++] = dupstr(rec->name);
ctx->args[ctx->nargs++] = dupcat(rec->data, (const char *)NULL); ctx->args[ctx->nargs++] = dupstr(rec->data);
} }
return 0; return 0;
} }

View file

@ -12,6 +12,7 @@
#include <unistd.h> #include <unistd.h>
#include "memory.h" #include "memory.h"
#include "dupstr.h"
#include "fake-lib.h" #include "fake-lib.h"
uint32_t HashPublicKeyInfo(void *pCertContext, uint32_t HashPublicKeyInfo(void *pCertContext,
@ -41,13 +42,11 @@ uint32_t CreateCabBegin(const char16_t *wzCab, const char16_t *wzCabDir,
{ {
CabCreateContext *ctx = snew(CabCreateContext); CabCreateContext *ctx = snew(CabCreateContext);
ctx->outdir = ascii(wzCabDir, true); ctx->outdir = ascii(wzCabDir, true);
ctx->outfile = dupcat(ctx->outdir, "/", ctx->outfile = dupcat(ctx->outdir, "/", ascii(wzCab, true), cNULL);
ascii(wzCab, true), (const char *)NULL);
ctx->nargs = 0; ctx->nargs = 0;
ctx->argsize = 16; ctx->argsize = 16;
ctx->args = snewn(ctx->argsize, char *); ctx->args = snewn(ctx->argsize, char *);
ctx->args[ctx->nargs++] = dupcat(getenv("WIX"), "/", "makecab.py", ctx->args[ctx->nargs++] = dupcat(getenv("WIX"), "/", "makecab.py", cNULL);
(const char *)NULL);
ctx->args[ctx->nargs++] = ctx->outfile; ctx->args[ctx->nargs++] = ctx->outfile;
*out_ctx = ctx; *out_ctx = ctx;
return 0; return 0;
@ -104,7 +103,7 @@ uint32_t ExtractCab(const char16_t *wzCabinet, const char16_t *wzExtractDir)
{ {
char *cab = ascii(wzCabinet, true), *dir = ascii(wzExtractDir, true); char *cab = ascii(wzCabinet, true), *dir = ascii(wzExtractDir, true);
fprintf(stderr, "ExtractCab(\"%s\", \"%s\"\n", cab, dir); fprintf(stderr, "ExtractCab(\"%s\", \"%s\"\n", cab, dir);
system_argv("cabextract", "-d", dir, cab, (const char *)NULL); system_argv("cabextract", "-d", dir, cab, cNULL);
return 0; return 0;
} }