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:
parent
69d886c575
commit
48919caa7b
7 changed files with 68 additions and 58 deletions
|
@ -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
35
dupstr.c
Normal 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
6
dupstr.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define cNULL ((const char *)NULL)
|
||||||
|
|
||||||
|
char *dupstr(const char *str);
|
||||||
|
char *dupcat(const char *str, ...);
|
25
fake-lib.c
25
fake-lib.c
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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, ...);
|
|
||||||
|
|
46
fake-msi.c
46
fake-msi.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue