#include #include #include #include #include #include #include #include #include #include #include #include "fake-lib.h" uint32_t HashPublicKeyInfo(void *pCertContext, void *rgbSubjectKeyIdentifier, uint32_t *pcbSubjectKeyIndentifier) { errx(1, "HashPublicKeyInfo NYI"); } uint32_t ResetAcls(const char16_t **pwzFiles, uint32_t cFiles) { return 0; } typedef struct CabCreateContext { char *tempdir; char *outdir; char *outfile; } CabCreateContext; uint32_t CreateCabBegin(const char16_t *wzCab, const char16_t *wzCabDir, uint32_t dwMaxFiles, uint32_t dwMaxSize, uint32_t dwMaxThresh, int compression, CabCreateContext **out_ctx) { CabCreateContext *ctx = snew(CabCreateContext); ctx->outdir = ascii(wzCabDir, true); ctx->outfile = dupcat(ctx->outdir, "/", ascii(wzCab, true), (const char *)NULL); ctx->tempdir = snewn(20 + strlen(ctx->outdir), char); sprintf(ctx->tempdir, "%s/cabXXXXXX", ctx->outdir); if (!mkdtemp(ctx->tempdir)) err(1, "mkdtemp"); *out_ctx = ctx; return 0; } uint32_t CreateCabAddFile(const char16_t *wzFile, const char16_t *wzToken, void *pmfHash, CabCreateContext *ctx) { char *file = ascii(wzFile, true); char *file_abs = realpath(file, NULL); char *cabname = ascii(wzToken, true); char *cab_abs = dupcat(ctx->tempdir, "/", cabname, (const char *)NULL); printf("CreateCabAddFile: %s <- %s\n", ctx->outfile, file_abs); if (symlink(file_abs, cab_abs) < 0) err(1, "symlink"); return 0; } uint32_t CreateCabAddFiles(const char16_t *const *pwzFiles, const char16_t *const *pwzTokens, void *pmfHash, uint32_t cFiles, CabCreateContext *ctx) { for (uint32_t i = 0; i < cFiles; i++) CreateCabAddFile(pwzFiles[i], pwzTokens[i], pmfHash, ctx); return 0; } uint32_t CreateCabFinish(CabCreateContext *ctx, void (*split_callback)(void)) { system_argv("lcab", "-r", "-n", ctx->tempdir, ctx->outfile, (const char *)NULL); return 0; } void CreateCabCancel(void *hContext) { } uint32_t ExtractCabBegin(void) { return 0; } uint32_t ExtractCab(const char16_t *wzCabinet, const char16_t *wzExtractDir) { char *cab = ascii(wzCabinet, true), *dir = ascii(wzExtractDir, true); fprintf(stderr, "ExtractCab(\"%s\", \"%s\"\n", cab, dir); system_argv("cabextract", "-d", dir, cab, (const char *)NULL); return 0; } void ExtractCabFinish(void) { } uint32_t EnumerateCabBegin(void) { return 0; } uint32_t EnumerateCab(const char16_t *wzCabinet, void *pfnNotify) { /* FIXME: pfnNotify looks like a fn ptr again */ fprintf(stderr, "EnumerateCab!\n"); return 0; } void EnumerateCabFinish(void) { }