diff options
Diffstat (limited to 'c_implementation')
35 files changed, 2227 insertions, 802 deletions
diff --git a/c_implementation/Makefile.am b/c_implementation/Makefile.am index 507550f..f1834d5 100644 --- a/c_implementation/Makefile.am +++ b/c_implementation/Makefile.am @@ -1,27 +1,67 @@ ACLOCAL_AMFLAGS = -I m4 -AM_CPPFLAGS = -I$(top_srcdir)/include +AM_CPPFLAGS = -Wall -Werror -Wextra -Wpedantic -ggdb -I$(top_srcdir)/include +#AM_CFLAGS = -Wall -Werror -Wextra -Wpedantic -ggdb -I$(top_srcdir)/include +lib_LTLIBRARIES = libaklog.la libaksettings.la libakfs.la libakdatetime.la libakutils.la -# Link each test to the library -#$(test_programs): % : %.c -# $(CC) $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) -o $@ $< $(LDFLAGS) libmylib.la -# -# -# Build shared library from root dir sources +libaklog_la_SOURCES = $(top_srcdir)/src/ak_log.c $(top_srcdir)/src/ak_log_main.c -lib_LTLIBRARIES = libaklog.la -libaklog_la_SOURCES = $(top_srcdir)/src/aklog.c -include_HEADERS = include/libaklog.h +libaksettings_la_SOURCES = $(top_srcdir)/src/ak_settings.c -## Build tests (no SUBDIRS needed) -check_PROGRAMS = test_aklog -test_aklog_SOURCES = ./tests/test_aklog.c +libakfs_LDADD = libaksettings.la libaklog.la +libakfs_la_SOURCES = $(top_srcdir)/src/ak_fs.c \ + $(top_srcdir)/src/ak_fs_main.c \ + $(top_srcdir)/src/ak_fs_maps_v3.c \ + $(top_srcdir)/src/ak_fs_map_v3.c \ + $(top_srcdir)/src/ak_fs_map_v4.c \ + $(top_srcdir)/src/ak_fs_mt.c \ + $(top_srcdir)/src/ak_fs_sha512sum.c + +libakutils_la_SOURCES = $(top_srcdir)/src/ak_utils.c + +libakdatetime_la_SOURCES = $(top_srcdir)/src/ak_datetime.c + +#include_HEADERS = "$(wildcard include/*.h)" +include_HEADERS = $(top_srcdir)/include/libaklog.h \ + $(top_srcdir)/include/libaksettings.h \ + $(top_srcdir)/include/libakfs.h \ + $(top_srcdir)/include/libak.h + +bin_PROGRAMS = akfs akdefuse #akt akdefuse aklog +akfs_LDADD = libaklog.la libakfs.la libaksettings.la +akfs_SOURCES = src/ak_fs_main.c + +akt_LDADD = libaklog.la libakfs.la libaksettings.la +akt_SOURCES = src/ak.c + +akdefuse_CFLAGS = -I/usr/include/fuse3 -lfuse3 -lpthread +akdefuse_LDADD = libaklog.la libakfs.la +akdefuse_SOURCES = src/ak_fs_defuse.c + +aklog_LDADD = libaklog.la +aklog_SOURCES = src/ak_log_main.c + +check_PROGRAMS = test_aklog test_aksettings test_akfs test_akutils test_akdatetime +test_akdatetime_SOURCES = ./tests/test_akdatetime.c ./src/ak_datetime.c +test_akdatetime_LDADD = libakdatetime.la + +test_akutils_SOURCES = ./tests/test_akutils.c ./src/ak_utils.c +test_akutils_LDADD = libakutils.la + +test_aklog_SOURCES = ./tests/test_aklog.c ./src/ak_log.c test_aklog_LDADD = libaklog.la -tests_test_main_CPPFLAGS = -I$(top_srcdir)/include # For tests too -# Enable 'make check' to run tests +test_akfs_SOURCES = ./tests/test_akfs.c ./src/ak_fs.c +test_akfs_LDADD = libakfs.la libaklog.la + +test_aksettings_SOURCES = ./tests/test_aksettings.c ./src/ak_settings.c ./src/ak_log.c +test_aksettings_LDADD = libaksettings.la + +tests_test_main_CPPFLAGS = -I$(top_srcdir)/include + TESTS = $(check_PROGRAMS) -# Optional: Clean test binaries aggressively CLEANFILES = $(TESTS) +cppcheck: + cppcheck --std=c99 --force --enable=all --check-library -I $(top_srcdir)/include/*.h $(top_srcdir)/include/*.h $(top_srcdir)/src/*.c $(top_srcdir)/tests/test*.c diff --git a/c_implementation/build_tree/ak_fs_build.sh b/c_implementation/build_tree/ak_fs_build.sh index a18b824..7be2322 100755 --- a/c_implementation/build_tree/ak_fs_build.sh +++ b/c_implementation/build_tree/ak_fs_build.sh @@ -1,15 +1,16 @@ #!/usr/bin/env bash echo "Building lib/akfs.so" && \ -gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include akfs.c -o lib/akfs.so && \ +gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include ./src/aklog.c -o lib/libaklog.so && \ +gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include ./src/akfs.c -o lib/libakfs.so && \ echo "Building tests/test_akfs" && \ -gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_akfs.c lib/akfs.so -o tests/test_akfs && \ +gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_akfs.c lib/libakfs.so lib/libaklog.so -o x_test_akfs && \ echo "Running test_akfs" && \ -time ./tests/test_akfs && \ -rm ./tests/test_akfs +time ./x_test_akfs && \ +rm ./x_test_akfs -echo "Building tests/test_akfs_mkdir.c" && \ -gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_akfs_mkdir.c lib/akfs.so -o tests/test_akfs_mkdir && \ -echo "Running test_akfs_mkdir" && \ -time ./tests/test_akfs_mkdir && \ -rm ./tests/test_akfs_mkdir +# echo "Building tests/test_akfs_mkdir.c" && \ +# gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_akfs_mkdir.c lib/libakfs.so -o tests/test_akfs_mkdir && \ +# echo "Running test_akfs_mkdir" && \ +# time ./tests/test_akfs_mkdir && \ +# rm ./tests/test_akfs_mkdir diff --git a/c_implementation/build_tree/ak_log_build.sh b/c_implementation/build_tree/ak_log_build.sh index 713b915..76a4113 100755 --- a/c_implementation/build_tree/ak_log_build.sh +++ b/c_implementation/build_tree/ak_log_build.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash echo "Building lib/aklog.so" && \ -gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include aklog.c -o lib/aklog.so && \ +gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include src/aklog.c -o lib/libaklog.so && \ echo "Building tests/test_aklog" && \ -gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aklog.c lib/aklog.so -o tests/test_aklog && \ +gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aklog.c lib/libaklog.so -o tests/test_aklog && \ echo "Running test_aklog" && \ time ./tests/test_aklog # && \ # rm ./tests/test_aklog -gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aklogwrite.c lib/aklog.so -o tests/test_aklogwrite && \ +gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aklogwrite.c lib/libaklog.so -o tests/test_aklogwrite && \ echo "Running test_aklogwrite" && \ time ./tests/test_aklogwrite && \ rm ./tests/test_aklogwrite diff --git a/c_implementation/build_tree/ak_logcatter_build.sh b/c_implementation/build_tree/ak_logcatter_build.sh index 5038073..aa321cb 100755 --- a/c_implementation/build_tree/ak_logcatter_build.sh +++ b/c_implementation/build_tree/ak_logcatter_build.sh @@ -1,7 +1,7 @@ echo "Building lib/aklogcatter.so" && \ -gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include aklogcatter.c -o lib/aklogcatter.so && \ +gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include src/aklogcatter.c -o lib/libaklogcatter.so && \ echo "Building tests/test_aklogcatter" && \ -gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aklogcatter.c lib/aklog.so lib/aklogcatter.so -o tests/test_aklogcatter && \ +gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aklogcatter.c lib/libaklog.so lib/libaklogcatter.so -o tests/test_aklogcatter && \ echo "Running test_aklogcatter" && \ time ./tests/test_aklogcatter && \ rm ./tests/test_aklogcatter diff --git a/c_implementation/build_tree/ak_settings_build.sh b/c_implementation/build_tree/ak_settings_build.sh index 09009a8..f5137f9 100755 --- a/c_implementation/build_tree/ak_settings_build.sh +++ b/c_implementation/build_tree/ak_settings_build.sh @@ -1,11 +1,11 @@ echo "Building lib/aksettings.so" && \ -gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include aksettings.c -o lib/aksettings.so && \ +gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include src/aksettings.c -o lib/libaksettings.so && \ echo "Building tests/test_aksettings" && \ -gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aksettings.c lib/aklog.so lib/aksettings.so -o tests/test_aksettings && \ +gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aksettings.c lib/libaklog.so lib/libaksettings.so -o tests/test_aksettings && \ echo "Running test_aksettings" && \ time ./tests/test_aksettings && \ rm ./tests/test_aksettings -gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aksettings_read.c lib/aklog.so lib/aksettings.so -o tests/test_aksettings_read && \ +gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_aksettings_read.c lib/libaklog.so lib/libaksettings.so -o tests/test_aksettings_read && \ echo "Running test_aksettings_read" && \ time ./tests/test_aksettings_read && \ rm ./tests/test_aksettings_read diff --git a/c_implementation/build_tree/ak_utils_build.sh b/c_implementation/build_tree/ak_utils_build.sh index 4300307..178519a 100755 --- a/c_implementation/build_tree/ak_utils_build.sh +++ b/c_implementation/build_tree/ak_utils_build.sh @@ -1,2 +1,7 @@ -echo "Building lib/akutils.so" && gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include akutils.c -o lib/akutils.so && echo "Building tests/test_akutils" && gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_akutils.c lib/akutils.so -o tests/test_akutils && echo "Running test_akutils" && time ./tests/test_akutils -rm ./tests/test_akutils +echo "Building lib/akutils.so" && \ + gcc -c -shared -Wextra -Wall -Werror -pedantic -ggdb -fPIC -I./include src/akutils.c -o lib/libakutils.so && \ + echo "Building tests/test_akutils" && \ + gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include tests/test_akutils.c lib/libakutils.so -o tests/test_akutils && \ + echo "Running test_akutils" && \ + time ./tests/test_akutils && \ + rm ./tests/test_akutils diff --git a/c_implementation/build_tree/libsodium_test_build.sh b/c_implementation/build_tree/libsodium_test_build.sh index 0897835..f427873 100755 --- a/c_implementation/build_tree/libsodium_test_build.sh +++ b/c_implementation/build_tree/libsodium_test_build.sh @@ -1 +1 @@ -gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include -lsodium tests/libsodium.c lib/aklog.so -o watah +gcc -Wextra -Wall -Werror -pedantic -ggdb -Wl,-rpath=lib -I./include -lsodium tests/libsodium.c lib/libaklog.so -o watah diff --git a/c_implementation/configure.ac b/c_implementation/configure.ac index 477ec5c..0cedf54 100644 --- a/c_implementation/configure.ac +++ b/c_implementation/configure.ac @@ -1,9 +1,10 @@ -AC_INIT([akt], [0.0.0]) +AC_INIT([akt],[0.0.0]) AM_INIT_AUTOMAKE([foreign subdir-objects]) AC_CONFIG_MACRO_DIRS([m4]) LT_INIT([shared]) AC_PROG_CC +AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile]) AC_CHECK_HEADERS([stdlib.h stdio.h]) diff --git a/c_implementation/include/libakdatetime.h b/c_implementation/include/libakdatetime.h new file mode 100644 index 0000000..435c3d8 --- /dev/null +++ b/c_implementation/include/libakdatetime.h @@ -0,0 +1,14 @@ +#include <stdbool.h> +#include <stddef.h> +#ifndef AK_DATETIME_H +#define AK_DATETIME_H + +long ak_datetime_unix(); +void ak_datetime_unix_nanosecs(char *buffer, size_t size); +void ak_datetime_human(char *buffer, size_t size); +void ak_datetime_human_date_only(char *buffer, size_t size); +void ak_datetime_human_date_only_yesterday(char *buffer, size_t size); +//static bool is_digits_only(const char *str); +bool ak_datetime_unix_to_human(const char *timestamp_str, char *buffer, size_t size); + +#endif // AK_DATETIME_H diff --git a/c_implementation/include/libakfs.h b/c_implementation/include/libakfs.h index bc5703c..3eb0ba3 100644 --- a/c_implementation/include/libakfs.h +++ b/c_implementation/include/libakfs.h @@ -2,6 +2,7 @@ #define AKFS #include <stdbool.h> +#include <stddef.h> /** * This struct represents a HEX output of the SHA-512 algorithm. @@ -20,10 +21,9 @@ typedef struct { } sha512sum; /** - * This struct describes explicitly the structure of a root_hash. It is the root - * of a hash merkle tree. Note, that this structure can be used for roots and - * branches. Possibly, the name will change to something more generic in the - * future. + * This struct describes explicitly the structure of a mt_branch. Note, + * that this structure can be used for roots and branches. + * * Another note is that instead of approaching this as left and right, as seen * in other codebases, we do a head-tail naming. That's because of the BASH * implementation that you can find at lib/_ak_fs. @@ -42,7 +42,7 @@ typedef struct { * Hash of tail */ sha512sum tail; -} root_hash; +} mt_branch; /** * This is the current structure of an akfs_map. Due to potential short-comings @@ -61,17 +61,22 @@ typedef struct { * Original file's name * */ - char* filename; + char filename[256]; /** * Root hash * */ sha512sum rh; /** + * Map hash + * + */ + sha512sum mh; + /** * Should be "level.1.map" at all times * */ - char* root_name; + char *root_name; } akfs_map_v3; /** @@ -96,24 +101,334 @@ typedef struct { * */ sha512sum rh; + /** + * Map hash + * + */ + sha512sum mh; } akfs_map_v4; -//typedef char[64] sha512sum_as_string; +/** + * Gets maps_dir + * return char* + */ +const char* ak_fs_maps_v3_get_dir(); + +/** + * Experimental + */ +char* ak_fs_return_hash_path(const char*); + +/** + * Experimental + */ +char* ak_fs_return_hash_dir(const char*); + +/** + * Verify that string looks like a SHA512 hash + * + * param char* string to be checked + * @return boolean + */ +bool ak_fs_verify_input_is_hash(const char*, size_t); + +/** + * Unused + */ +int ak_fs_create_dir_for_hash(const char*); + +/** + * Converts string hash to struct + * @param char* Hash as string + * @param sha512sum* Pointer to a sha512sum + * @return int Status of exit + */ +int ak_fs_sha512sum_string_to_struct(const char*, sha512sum*); + +/** + * Returns struct from string hash + * @param char* Hash as string + * @return sha512sum* Pointer to a sha512sum + */ +sha512sum* ak_fs_sha512sum_from_string(char*); + +/** + * Converts hash struct to string + * @param sha512sum* Pointer to a sha512sum + * @param char* Hash as string + */ +void ak_fs_sha512sum_struct_to_string(const sha512sum*, char*); + +/** + * Opens a map file to an akfs_map_v3 struct + * @param akfs_map_v3* + * @return int + */ +int ak_fs_map_v3_open_from_file(akfs_map_v3*); + +/** + * Unused + */ +int ak_fs_map_v3_to_file(akfs_map_v3); + +/** + * Converts a string to an akfs_map_v3 struct + * @param char* + * @param size_t + * @param akfs_map_v3* + * @return int + */ +int ak_fs_convert_map_v3_string_to_struct(const char *, size_t, akfs_map_v3*); + +/** + * Prints an akfs_map_v3 in struct-like format + * @param akfs_map_v3* + */ +void ak_fs_map_v3_print(akfs_map_v3*); + +/** + * Prints an array of akfs_map_v3 in struct-like format + * @param akfs_map_v3* + * @param size_t + */ +void ak_fs_maps_v3_print(akfs_map_v3**, size_t); + +/** + * Prints the map hash out of a akfs_map_v3 + * @param akfs_map_v3* + */ +void ak_fs_map_v3_print_map_hash(akfs_map_v3*); + +/** + * Prints the original hash out of a akfs_map_v3 + * @param akfs_map_v3* + */ +void ak_fs_map_v3_print_original_hash(akfs_map_v3*); + +/** + * Prints the root hash out of a akfs_map_v3 + * @param akfs_map_v3* + */ +void ak_fs_map_v3_print_root_hash(akfs_map_v3*); + +/** + * Prints the filename out of a akfs_map_v3 + * @param akfs_map_v3* + */ +void ak_fs_map_v3_print_filename(akfs_map_v3*); + +/** + * Prints the filenames out of an array of akfs_map_v3 + * @param akfs_map_v3** + * @param size_t + */ +void ak_fs_maps_v3_print_filenames(akfs_map_v3**, size_t); + +/** + * Prints an array of akfs_map_v3 in JSON format + * @param akfs_map_v3** + * @param size_t + */ +void ak_fs_maps_v3_print_as_json(akfs_map_v3**, size_t); + +/** + * Prints an akfs_map_v3 in JSON format + * @param akfs_map_v3* + */ +void ak_fs_map_v3_print_as_json(akfs_map_v3*); + +/** + * Prints an array of akfs_map_v3 in bif format + * @param akfs_map_v3** + * @param size_t + */ +void ak_fs_maps_v3_print_bif(akfs_map_v3**, size_t); + +/** + * Prints an akfs_map_v3 in bif format + * @param akfs_map_v3* + */ +void ak_fs_map_v3_print_bif(akfs_map_v3*); + +/** + * Takes an array of sha512sums (maps) and puts it in an array of maps (v3) + * @param akfs_map_v3** Pointer to an array of akfs_map_v3 + * @param size_t Length of the array + * @return int Exit code (0 on success) + */ +int ak_fs_maps_v3_resolve(akfs_map_v3**, size_t); + +/** + * Unused + */ +char* ak_fs_sha512sum_struct_read_as_string(const sha512sum *); + +/** + * Unused + */ +void ak_fs_init_string(char *, size_t); -char* ak_fs_return_hash_path(char*); +/** + * Compares two sha512sum structs + * @param sha512sum* + * @param sha512sum* + * @return bool + */ +bool ak_fs_sha512sum_compare(const sha512sum*, const sha512sum*); + +/** + * Checks if an sha512sum struct is NULL + * @param sha512sum* + * @return bool + */ +bool ak_fs_sha512sum_is_null(const sha512sum*); -char* ak_fs_return_hash_dir(char*); +/** + * Initializes a sha512sum struct + * @param sha512sum* + */ +void ak_fs_sha512sum_init(sha512sum*); -bool ak_fs_verify_input_is_hash(char*); +/** + * Unused + */ +void ak_fs_sha512sum_init_avail(sha512sum**, size_t); -int ak_fs_create_dir_for_hash(char*); +/** + * Initialize an akfs_map_v3 + */ +void ak_fs_map_v3_init(akfs_map_v3*); -sha512sum ak_fs_sha512sum_string_to_struct(char*); +/** + * Initializes an array of akfs_map_v3 + */ +void ak_fs_maps_v3_init(akfs_map_v3**, size_t); -void ak_fs_sha512sum_struct_to_string(sha512sum, char*); +/** + * @param akfs_map_v3 + * @return boolean + */ +bool ak_fs_map_v3_is_null(akfs_map_v3*); -int ak_fs_open_map_v3(char*); -int ak_fs_from_map_v3_to_file(akfs_map_v3); +/** + * Gets filename out of the akfs_map_v3 + * @param akfs_map_v3* + * @return pointer to char + */ +char* ak_fs_map_v3_get_filename(akfs_map_v3*); + +/** + * Gets map hash out of the akfs_map_v3 + * @param akfs_map_v3 + * @return pointer to sha512sum + */ +sha512sum* ak_fs_map_v3_get_map_hash(akfs_map_v3*); + +/** + * Gets root hash out of the akfs_map_v3 + * @param akfs_map_v3 + * @return pointer to sha512sum + */ +sha512sum* ak_fs_map_v3_get_root_hash(akfs_map_v3*); + +/** + * Gets original hash out of the akfs_map_v3 + * @param akfs_map_v3 + * @return pointer to sha512sum + */ +sha512sum* ak_fs_map_v3_get_orig_hash(akfs_map_v3*); + +/** + * Compares two akfs_map_v3 structs + * @param akfs_map_v3* + * @param akfs_map_v3* + * @return bool + */ +bool ak_fs_map_v3_compare(akfs_map_v3*, akfs_map_v3*); + +/** + * Initializes an array of akfs_map_v4 + */ +void ak_fs_init_map_v4_store(akfs_map_v4**, size_t); + +/** + * Unused + */ +void ak_fs_map_v4_init(akfs_map_v4*); + +/** + * Unused + */ +bool ak_fs_map_v4_compare(akfs_map_v4*, akfs_map_v4*); +/** + * Unused + */ +bool ak_fs_map_v4_is_null(akfs_map_v4*); +/** + * Unused + */ +char* ak_fs_map_v4_get_filename(akfs_map_v4*); +/** + * Unused + */ +sha512sum* ak_fs_map_v4_get_map_hash(akfs_map_v4*); +/** + * Unused + */ +sha512sum* ak_fs_map_v4_get_root_hash(akfs_map_v4*); +/** + * Unused + */ +sha512sum* ak_fs_map_v4_get_orig_hash(akfs_map_v4*); + +/** + * + * @return size_t Number of files found in maps fs location + */ +size_t ak_fs_maps_v3_found_in_fs(); + +/** + * Prints a list of the maps (version 3 format) available on the local fs along + * with their root hash and file name. + * + * @return int Status value + */ +int ak_fs_ls(); + +/** + * Main function for call from other programs + * + * @return int Exit value + */ +int ak_fs_main(int, char**); + +/** + * Compares an mt_branch with a NULL one + * @param mt_branch* + * @return boolean + */ +bool ak_fs_mt_branch_is_null(mt_branch*); + +/** + * Compares two mt_branch between them + * @param mt_branch* + * @return boolean + */ +bool ak_fs_mt_branch_compare(mt_branch*, mt_branch*); + +/** + * Concatenates a file from a root hash. + * @param sha512sum* + * @return int status + */ +int ak_fs_cat_file_from_root_hash(const sha512sum*); + +/** + * Concatenates a file from a akfs_map_v3 map + * @param akfs_map_v3* + * @return int status + */ +int ak_fs_cfm(akfs_map_v3*); #endif // AKFS diff --git a/c_implementation/include/libaklog.h b/c_implementation/include/libaklog.h index 31478a7..fa441a4 100644 --- a/c_implementation/include/libaklog.h +++ b/c_implementation/include/libaklog.h @@ -2,23 +2,26 @@ #define AKLOG typedef enum { + TEST, INFO, WARNING, ERROR, EXIT, - DEBUG + DEBUG, } LogMessageType; -void ak_log_print_log_line(char* line); +void ak_log_print_log_line(const char*); void ak_log_follow(); -void ak_log_grep(char* string); +void ak_log_grep(char*); void ak_log_rotate(); -int ak_log_write_to_file(char* message); -void ak_log_message(const char* program, LogMessageType lmtype, char* message); -void ak_log_exit(const char* program, char* message); -void ak_log_warning(const char* program, char* message); -void ak_log_debug(const char* program, char* message); -void ak_log_error(const char* program, char* message); -void ak_log_info(const char* program, char* message); +int ak_log_write_to_file(const char*); +void ak_log_message(const char*, LogMessageType, char*); +void ak_log_exit(const char*, char*); +void ak_log_warning(const char*, char*); +void ak_log_debug(const char*, char*); +void ak_log_error(const char*, char*); +void ak_log_info(const char*, char*); +void ak_log_test(const char*, char*); +int ak_log_main(int, char**); #endif // AKLOG diff --git a/c_implementation/include/libaksettings.h b/c_implementation/include/libaksettings.h index e95f37d..505e502 100644 --- a/c_implementation/include/libaksettings.h +++ b/c_implementation/include/libaksettings.h @@ -8,18 +8,19 @@ typedef struct { char *value; } AKSetting; -int ak_settings(); void ak_settings_print_setting(AKSetting); int ak_settings_from_file(); int ak_setting_to_file(AKSetting); +AKSetting* ak_settings_get_all(); -const char *ak_settings_get_setting(const char *key); -bool ak_settings_set_setting(const char *key, const char *value); +char *ak_settings_get_setting(const char*); +bool ak_settings_set_setting(const char*, const char*); bool ak_settings_save_settings(); bool ak_settings_load_settings_binary(); int ak_settings_find_setting(const char *key); void ak_settings_free_settings(); bool ak_settings_save_settings_binary(); +void ak_settings_import_from_environment(); #endif // AK_SETTINGS_H diff --git a/c_implementation/src/ak_datetime.c b/c_implementation/src/ak_datetime.c new file mode 100644 index 0000000..71dcb18 --- /dev/null +++ b/c_implementation/src/ak_datetime.c @@ -0,0 +1,70 @@ +#include <libakdatetime.h> +#include <stdio.h> +#include <time.h> +#include <string.h> +#include <stdbool.h> +#include <ctype.h> +#include <stdlib.h> + +// Returns Unix timestamp (seconds since epoch) +long ak_datetime_unix() { + return time(NULL); +} + +// Returns Unix timestamp with nanoseconds +void ak_datetime_unix_nanosecs(char *buffer, size_t size) { + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + snprintf(buffer, size, "%ld.%09ld", ts.tv_sec, ts.tv_nsec); +} + +// Returns human-readable datetime in format YYYYMMDD_HHMMSS +void ak_datetime_human(char *buffer, size_t size) { + time_t now = time(NULL); + const struct tm *tm = gmtime(&now); + strftime(buffer, size, "%Y%m%d_%H%M%S", tm); +} + +// Returns human-readable date in format YYYYMMDD +void ak_datetime_human_date_only(char *buffer, size_t size) { + time_t now = time(NULL); + const struct tm *tm = gmtime(&now); + strftime(buffer, size, "%Y%m%d", tm); +} + +// Returns yesterday's date in format YYYYMMDD +void ak_datetime_human_date_only_yesterday(char *buffer, size_t size) { + time_t now = time(NULL); + now -= 24 * 60 * 60; // Subtract one day + const struct tm *tm = gmtime(&now); + strftime(buffer, size, "%Y%m%d", tm); +} + +// Checks if string contains only digits +static bool is_digits_only(const char *str) { + while (*str) { + if (!isdigit(*str)) { + return false; + } + str++; + } + return true; +} + +// Converts Unix timestamp to human-readable format YYYYMMDD_HHMMSS +bool ak_datetime_unix_to_human(const char *timestamp_str, char *buffer, size_t size) { + // Check if input is valid (10-digit number) + if (timestamp_str == NULL || strlen(timestamp_str) != 10 || !is_digits_only(timestamp_str)) { + return false; + } + + time_t timestamp = (time_t)atol(timestamp_str); + const struct tm *tm = gmtime(×tamp); + if (tm == NULL) { + return fals |