aboutsummaryrefslogtreecommitdiff
path: root/lib/tar/read_sparse_map_new.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-01-31 11:21:30 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-01-31 13:51:49 +0100
commitcdccc69c62579b0c13b35fad0728079652b8f3c9 (patch)
tree9fa54c710f73c5e08a9c8466e7a712eb63ee07ac /lib/tar/read_sparse_map_new.c
parent2182129c8f359c4fa1390eaba7a65b595ccd4182 (diff)
Move library source into src sub-directory
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/tar/read_sparse_map_new.c')
-rw-r--r--lib/tar/read_sparse_map_new.c115
1 files changed, 0 insertions, 115 deletions
diff --git a/lib/tar/read_sparse_map_new.c b/lib/tar/read_sparse_map_new.c
deleted file mode 100644
index de1b6a4..0000000
--- a/lib/tar/read_sparse_map_new.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * read_sparse_map_new.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "config.h"
-#include "internal.h"
-
-#include <ctype.h>
-#include <string.h>
-#include <stdlib.h>
-
-static int decode(const char *str, size_t len, size_t *out)
-{
- size_t count = 0;
-
- *out = 0;
-
- while (count < len && isdigit(*str)) {
- if (SZ_MUL_OV(*out, 10, out))
- return -1;
- if (SZ_ADD_OV(*out, (*(str++) - '0'), out))
- return -1;
- ++count;
- }
-
- if (count == 0 || count == len)
- return 0;
-
- return (*str == '\n') ? ((int)count + 1) : -1;
-}
-
-sparse_map_t *read_gnu_new_sparse(istream_t *fp, tar_header_decoded_t *out)
-{
- sparse_map_t *last = NULL, *list = NULL, *ent = NULL;
- size_t i, count, value;
- char buffer[1024];
- int diff, ret;
-
- if (out->record_size < 512)
- goto fail_format;
-
- ret = istream_read(fp, buffer, 512);
- if (ret < 0)
- goto fail;
-
- if (ret < 512)
- goto fail_format;
-
- diff = decode(buffer, 512, &count);
- if (diff <= 0)
- goto fail_format;
-
- out->record_size -= 512;
-
- if (count == 0 || count > TAR_MAX_SPARSE_ENT)
- goto fail_format;
-
- for (i = 0; i < (count * 2); ++i) {
- ret = decode(buffer + diff, 512 - diff, &value);
- if (ret < 0)
- goto fail_format;
-
- if (ret > 0) {
- diff += ret;
- } else {
- if (out->record_size < 512)
- goto fail_format;
-
- ret = istream_read(fp, buffer + 512, 512);
- if (ret < 0)
- goto fail;
-
- if (ret < 512)
- goto fail_format;
-
- ret = decode(buffer + diff, 1024 - diff, &value);
- if (ret <= 0)
- goto fail_format;
-
- memcpy(buffer, buffer + 512, 512);
- diff = diff + ret - 512;
- out->record_size -= 512;
- }
-
- if ((i & 0x01) == 0) {
- ent = calloc(1, sizeof(*ent));
- if (ent == NULL)
- goto fail_errno;
-
- if (list == NULL) {
- list = last = ent;
- } else {
- last->next = ent;
- last = ent;
- }
-
- ent->offset = value;
- } else {
- ent->count = value;
- }
- }
-
- return list;
-fail_errno:
- perror("parsing GNU 1.0 style sparse file record");
- goto fail;
-fail_format:
- fputs("Malformed GNU 1.0 style sparse file map.\n", stderr);
- goto fail;
-fail:
- free_sparse_list(list);
- return NULL;
-}