feat(tree): added a simple function to save tree snapshots compressed to the disk
This commit is contained in:
parent
e52740a03b
commit
b7710d02a9
3 changed files with 43 additions and 0 deletions
|
|
@ -54,3 +54,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||||
|
|
||||||
|
# Find and link zlib
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
target_link_libraries(${TARGET_NAME} PRIVATE ZLIB::ZLIB)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char** paths;
|
char** paths;
|
||||||
|
|
@ -20,5 +22,6 @@ void add_path(PathBuffer*, char*);
|
||||||
void free_path_buffer(PathBuffer*);
|
void free_path_buffer(PathBuffer*);
|
||||||
char* find_root(char*);
|
char* find_root(char*);
|
||||||
void walk(const char*, const char*, const char*, PathBuffer*);
|
void walk(const char*, const char*, const char*, PathBuffer*);
|
||||||
|
void save_tree(const char*, PathBuffer*);
|
||||||
|
|
||||||
#endif // TREE_H
|
#endif // TREE_H
|
||||||
|
|
|
||||||
36
src/tree.c
36
src/tree.c
|
|
@ -231,3 +231,39 @@ void walk(const char* base, const char* base_rel, const char* rel, PathBuffer* p
|
||||||
|
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void save_tree(const char* path, PathBuffer* tree) {
|
||||||
|
char tmp[1024];
|
||||||
|
size_t offset = 0;
|
||||||
|
|
||||||
|
FILE* fp = fopen(path, "wb");
|
||||||
|
if (!fp) { perror("ERROR: cannot open path in save_tree!\n"); return; }
|
||||||
|
|
||||||
|
offset += snprintf(tmp, sizeof(tmp), "%zu:", tree->len);
|
||||||
|
|
||||||
|
for (size_t idx = 0; idx < tree->len; idx++) {
|
||||||
|
size_t remaining = sizeof(tmp) - offset;
|
||||||
|
|
||||||
|
int written = snprintf(tmp + offset, remaining, "%s:", tree->paths[idx]);
|
||||||
|
if (written < 0 || (size_t)written >= remaining) {
|
||||||
|
perror("ERROR: buffer overflow in save_tree!\n");
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += (size_t)written;
|
||||||
|
}
|
||||||
|
|
||||||
|
uLong originalLen = strlen(tmp) + 1;
|
||||||
|
|
||||||
|
uLong compressedLen = compressBound(originalLen);
|
||||||
|
Bytef compressed[compressedLen];
|
||||||
|
|
||||||
|
if (compress(compressed, &compressedLen, (const Bytef*)tmp, originalLen) != Z_OK) {
|
||||||
|
perror("ERROR: compression failed in save_tree!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fwrite(compressed, sizeof(Bytef), compressedLen, fp);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue