|
5 | 5 | #include <archive_entry.h> |
6 | 6 | #include <emscripten.h> |
7 | 7 |
|
| 8 | +typedef struct { |
| 9 | + char* filename; |
| 10 | + uint8_t* data; |
| 11 | + size_t data_size; |
| 12 | +} FileData; |
| 13 | + |
8 | 14 | EMSCRIPTEN_KEEPALIVE |
9 | | -char* extract_archive(uint8_t* inputData, size_t inputSize, size_t* outputSize) { |
| 15 | +FileData* extract_archive(uint8_t* inputData, size_t inputSize, size_t* outputSize, size_t* fileCount) { |
10 | 16 | struct archive* archive; |
11 | 17 | struct archive_entry* entry; |
12 | | - char* outputBuffer = NULL; |
13 | | - size_t bufferCapacity = 0; |
14 | | - size_t totalBytes = 0; |
| 18 | + FileData* files = NULL; |
| 19 | + size_t files_count = 0; |
15 | 20 |
|
16 | 21 | archive = archive_read_new(); |
17 | | - archive_read_support_filter_all(archive); |
18 | | - archive_read_support_format_all(archive); |
19 | | - |
| 22 | + archive_read_support_filter_all(archive); |
| 23 | + archive_read_support_format_all(archive); |
| 24 | + |
20 | 25 | if (archive_read_open_memory(archive, inputData, inputSize) != ARCHIVE_OK) { |
21 | 26 | fprintf(stderr, "Error opening archive: %s\n", archive_error_string(archive)); |
22 | 27 | archive_read_free(archive); |
23 | 28 | return NULL; |
24 | 29 | } |
| 30 | + printf("Archive opened successfully.\n"); |
25 | 31 |
|
26 | 32 | while (archive_read_next_header(archive, &entry) == ARCHIVE_OK) { |
27 | 33 | const char* filename = archive_entry_pathname(entry); |
28 | 34 | size_t entrySize = archive_entry_size(entry); |
| 35 | + printf("Extracting file: %s, size: %zu\n", filename, entrySize); |
| 36 | + |
| 37 | + files = realloc(files, sizeof(FileData) * (files_count + 1)); |
| 38 | + if (!files) { |
| 39 | + fprintf(stderr, "Memory allocation error for FileData array.\n"); |
| 40 | + archive_read_free(archive); |
| 41 | + return NULL; |
| 42 | + } |
29 | 43 |
|
30 | | - if (totalBytes + entrySize > bufferCapacity) { |
31 | | - bufferCapacity = totalBytes + entrySize + 1024; |
32 | | - outputBuffer = realloc(outputBuffer, bufferCapacity); |
| 44 | + files[files_count].filename = strdup(filename); |
| 45 | + files[files_count].data = malloc(entrySize); |
| 46 | + printf("Setting data_size for file: %s, size: %zu\n", filename, entrySize); |
| 47 | + files[files_count].data_size = entrySize; |
| 48 | + |
| 49 | + if (!files[files_count].data) { |
| 50 | + fprintf(stderr, "Memory allocation error for file data.\n"); |
| 51 | + free(files[files_count].filename); |
| 52 | + archive_read_free(archive); |
| 53 | + return NULL; |
33 | 54 | } |
34 | 55 |
|
35 | 56 | size_t bytesRead = 0; |
36 | 57 | while (bytesRead < entrySize) { |
37 | | - ssize_t ret = archive_read_data(archive, outputBuffer + totalBytes, entrySize - bytesRead); |
| 58 | + ssize_t ret = archive_read_data(archive, files[files_count].data + bytesRead, entrySize - bytesRead); |
38 | 59 | if (ret < 0) { |
39 | | - fprintf(stderr, "Error reading data: %s\n", archive_error_string(archive)); |
40 | | - free(outputBuffer); |
| 60 | + fprintf(stderr, "Error reading data for %s: %s\n", filename, archive_error_string(archive)); |
| 61 | + for (size_t i = 0; i <= files_count; i++) { |
| 62 | + free(files[i].filename); |
| 63 | + free(files[i].data); |
| 64 | + } |
| 65 | + free(files); |
41 | 66 | archive_read_free(archive); |
42 | 67 | return NULL; |
43 | 68 | } |
44 | 69 | bytesRead += ret; |
45 | | - totalBytes += ret; |
| 70 | + printf("Read %zd bytes for file: %s\n", ret, filename); |
46 | 71 | } |
47 | | - |
48 | | - printf("Extracted file: %s, Size: %zu bytes\n", filename, entrySize); |
| 72 | + files_count++; |
49 | 73 | } |
50 | 74 |
|
51 | 75 | archive_read_free(archive); |
| 76 | + *outputSize = files_count; |
| 77 | + *fileCount = files_count; |
52 | 78 |
|
53 | | - *outputSize = totalBytes; |
54 | | - return outputBuffer; |
| 79 | + return files; |
55 | 80 | } |
56 | 81 |
|
| 82 | + |
| 83 | + |
0 commit comments