-
-static zip_t *
-read_hole(const char *archive, int flags, zip_error_t *error)
-{
- zip_source_t *src = NULL;
- zip_t *zs = NULL;
-
- if (strcmp(archive, "/dev/stdin") == 0) {
- zip_error_set(error, ZIP_ER_OPNOTSUPP, 0);
- return NULL;
- }
-
- if ((src = source_hole_create(archive, flags, error)) == NULL
- || (zs = zip_open_from_source(src, flags, error)) == NULL) {
- zip_source_free(src);
- }
-
- return zs;
-}
-
-
-static zip_t *
-read_to_memory(const char *archive, int flags, zip_error_t *error, zip_source_t **srcp)
-{
- struct stat st;
- zip_source_t *src;
- zip_t *zb;
-
- if (strcmp(archive, "/dev/stdin") == 0) {
- zip_error_set(error, ZIP_ER_OPNOTSUPP, 0);
- return NULL;
- }
-
- if (stat(archive, &st) < 0) {
- if (errno == ENOENT) {
- src = zip_source_buffer_create(NULL, 0, 0, error);
- }
- else {
- zip_error_set(error, ZIP_ER_OPEN, errno);
- return NULL;
- }
- }
- else {
- char *buf;
- FILE *fp;
- if ((buf=malloc((size_t)st.st_size)) == NULL) {
- zip_error_set(error, ZIP_ER_MEMORY, 0);
- return NULL;
- }
- if ((fp=fopen(archive, "r")) == NULL) {
- free(buf);
- zip_error_set(error, ZIP_ER_READ, errno);
- return NULL;
- }
- if (fread(buf, (size_t)st.st_size, 1, fp) < 1) {
- free(buf);
- fclose(fp);
- zip_error_set(error, ZIP_ER_READ, errno);
- return NULL;
- }
- fclose(fp);
- src = zip_source_buffer_create(buf, (zip_uint64_t)st.st_size, 1, error);
- if (src == NULL) {
- free(buf);
- }
- }
- if (src == NULL) {
- return NULL;
- }
- zb = zip_open_from_source(src, flags, error);
- if (zb == NULL) {
- zip_source_free(src);
- return NULL;
- }
- zip_source_keep(src);
- *srcp = src;
- return zb;
-}
-
-
-typedef struct source_nul {
- zip_error_t error;
- zip_uint64_t length;
- zip_uint64_t offset;
-} source_nul_t;
-
-static zip_int64_t
-source_nul_cb(void *ud, void *data, zip_uint64_t length, zip_source_cmd_t command)
-{
- source_nul_t *ctx = (source_nul_t *)ud;
-
- switch (command) {
- case ZIP_SOURCE_CLOSE:
- return 0;
-
- case ZIP_SOURCE_ERROR:
- return zip_error_to_data(&ctx->error, data, length);
-
- case ZIP_SOURCE_FREE:
- free(ctx);
- return 0;
-
- case ZIP_SOURCE_OPEN:
- ctx->offset = 0;
- return 0;
-
- case ZIP_SOURCE_READ:
- if (length > ZIP_INT64_MAX) {
- zip_error_set(&ctx->error, ZIP_ER_INVAL, 0);
- return -1;
- }
-
- if (length > ctx->length - ctx->offset) {
- length =ctx->length - ctx->offset;
- }
-
- memset(data, 0, length);
- ctx->offset += length;
- return (zip_int64_t)length;
-
- case ZIP_SOURCE_STAT: {
- zip_stat_t *st = ZIP_SOURCE_GET_ARGS(zip_stat_t, data, length, &ctx->error);
-
- if (st == NULL) {
- return -1;
- }
-
- st->valid |= ZIP_STAT_SIZE;
- st->size = ctx->length;
-
- return 0;
- }
-
- case ZIP_SOURCE_SUPPORTS:
- return zip_source_make_command_bitmap(ZIP_SOURCE_CLOSE, ZIP_SOURCE_ERROR, ZIP_SOURCE_FREE, ZIP_SOURCE_OPEN, ZIP_SOURCE_READ, ZIP_SOURCE_STAT, -1);
-
- default:
- zip_error_set(&ctx->error, ZIP_ER_OPNOTSUPP, 0);
- return -1;
- }
-}
-
-static zip_source_t *
-source_nul(zip_t *zs, zip_uint64_t length)
-{
- source_nul_t *ctx;
- zip_source_t *src;
-
- if ((ctx = (source_nul_t *)malloc(sizeof(*ctx))) == NULL) {
- zip_error_set(zip_get_error(zs), ZIP_ER_MEMORY, 0);
- return NULL;
- }
-
- zip_error_init(&ctx->error);
- ctx->length = length;
- ctx->offset = 0;
-
- if ((src = zip_source_function(zs, source_nul_cb, ctx)) == NULL) {
- free(ctx);
- return NULL;
- }
-
- return src;
-}
-
-
-static int
-write_memory_src_to_file(const char *archive, zip_source_t *src)
-{
- zip_stat_t zst;
- char *buf;
- FILE *fp;
-
- if (zip_source_stat(src, &zst) < 0) {
- fprintf(stderr, "zip_source_stat on buffer failed: %s\n", zip_error_strerror(zip_source_error(src)));
- return -1;
- }
- if (zip_source_open(src) < 0) {
- if (zip_error_code_zip(zip_source_error(src)) == ZIP_ER_DELETED) {
- if (unlink(archive) < 0 && errno != ENOENT) {
- fprintf(stderr, "unlink failed: %s\n", strerror(errno));
- return -1;
- }
- return 0;
- }
- fprintf(stderr, "zip_source_open on buffer failed: %s\n", zip_error_strerror(zip_source_error(src)));
- return -1;
- }
- if ((buf=malloc(zst.size)) == NULL) {
- fprintf(stderr, "malloc failed: %s\n", strerror(errno));
- zip_source_close(src);
- return -1;
- }
- if (zip_source_read(src, buf, zst.size) < (zip_int64_t)zst.size) {
- fprintf(stderr, "zip_source_read on buffer failed: %s\n", zip_error_strerror(zip_source_error(src)));
- zip_source_close(src);
- free(buf);
- return -1;
- }
- zip_source_close(src);
- if ((fp=fopen(archive, "wb")) == NULL) {
- fprintf(stderr, "fopen failed: %s\n", strerror(errno));
- free(buf);
- return -1;
- }
- if (fwrite(buf, zst.size, 1, fp) < 1) {
- fprintf(stderr, "fwrite failed: %s\n", strerror(errno));
- free(buf);
- fclose(fp);
- return -1;
- }
- free(buf);
- if (fclose(fp) != 0) {
- fprintf(stderr, "fclose failed: %s\n", strerror(errno));
- return -1;
- }
- return 0;
-}
-