aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--c_implementation/Makefile.am46
-rw-r--r--c_implementation/include/libakdatetime.h14
-rw-r--r--c_implementation/include/libakfs.h29
-rw-r--r--c_implementation/include/libaksettings.h5
-rw-r--r--c_implementation/src/ak_datetime.c70
-rw-r--r--c_implementation/src/ak_fs.c (renamed from c_implementation/src/akfs.c)174
-rw-r--r--c_implementation/src/ak_fs_defuse.c (renamed from c_implementation/src/akfs_defuse.c)35
-rw-r--r--c_implementation/src/ak_fs_main.c43
-rw-r--r--c_implementation/src/ak_fs_map_v3.c232
-rw-r--r--c_implementation/src/ak_fs_map_v4.c (renamed from c_implementation/src/akfs_map_v4.c)0
-rw-r--r--c_implementation/src/ak_fs_maps_v3.c63
-rw-r--r--c_implementation/src/ak_fs_sha512sum.c (renamed from c_implementation/src/akfs_sha512sum.c)2
-rw-r--r--c_implementation/src/ak_log.c (renamed from c_implementation/src/aklog.c)46
-rw-r--r--c_implementation/src/ak_log_main.c32
-rw-r--r--c_implementation/src/ak_logcatter.c (renamed from c_implementation/src/aklogcatter.c)0
-rw-r--r--c_implementation/src/ak_settings.c (renamed from c_implementation/src/aksettings.c)0
-rw-r--r--c_implementation/src/ak_utils.c (renamed from c_implementation/src/akutils.c)0
-rw-r--r--c_implementation/src/akfs_map_v3.c140
-rw-r--r--c_implementation/src/aklog_main.c6
-rw-r--r--c_implementation/tests/test_aksettings.c17
20 files changed, 594 insertions, 360 deletions
diff --git a/c_implementation/Makefile.am b/c_implementation/Makefile.am
index 57fd80a..9b6cd65 100644
--- a/c_implementation/Makefile.am
+++ b/c_implementation/Makefile.am
@@ -3,45 +3,57 @@ 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
-libaklog_la_SOURCES = $(top_srcdir)/src/aklog.c
-libaksettings_la_SOURCES = $(top_srcdir)/src/aksettings.c
+libaklog_la_SOURCES = $(top_srcdir)/src/ak_log.c $(top_srcdir)/src/ak_log_main.c
-libakfs_LDADD = libaksettings.la
-libakfs_la_SOURCES = $(top_srcdir)/src/akfs.c $(top_srcdir)/src/aksettings.c $(top_srcdir)/src/akfs_sha512sum.c $(top_srcdir)/src/akfs_map_v3.c $(top_srcdir)/src/akfs_map_v4.c $(top_srcdir)/src/akfs_main.c
+libaksettings_la_SOURCES = $(top_srcdir)/src/ak_settings.c
-libakutils_la_SOURCES = $(top_srcdir)/src/akutils.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_sha512sum.c
-libakdatetime_la_SOURCES = $(top_srcdir)/src/akdatetime.c
+libakutils_la_SOURCES = $(top_srcdir)/src/ak_utils.c
-include_HEADERS = include/libaklog.h include/libaksettings.h include/libakfs.h
+libakdatetime_la_SOURCES = $(top_srcdir)/src/ak_datetime.c
-bin_PROGRAMS = akt akdefuse aklog akfs
+#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/akfs_main.c
-akt_SOURCES = src/ak.c
+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/akfs_defuse.c
+akdefuse_SOURCES = src/ak_fs_defuse.c
+
aklog_LDADD = libaklog.la
-aklog_SOURCES = src/aklog_main.c
+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/akdatetime.c
+test_akdatetime_SOURCES = ./tests/test_akdatetime.c ./src/ak_datetime.c
test_akdatetime_LDADD = libakdatetime.la
-test_akutils_SOURCES = ./tests/test_akutils.c ./src/akutils.c
+test_akutils_SOURCES = ./tests/test_akutils.c ./src/ak_utils.c
test_akutils_LDADD = libakutils.la
-test_aklog_SOURCES = ./tests/test_aklog.c ./src/aklog.c
+test_aklog_SOURCES = ./tests/test_aklog.c ./src/ak_log.c
test_aklog_LDADD = libaklog.la
-test_akfs_SOURCES = ./tests/test_akfs.c ./src/akfs.c
+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/aksettings.c ./src/aklog.c
+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
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 d8d8c85..455baa7 100644
--- a/c_implementation/include/libakfs.h
+++ b/c_implementation/include/libakfs.h
@@ -161,7 +161,12 @@ void ak_fs_sha512sum_struct_to_string(const sha512sum*, char*);
/**
* Opens a map file to an akfs_map_v3 struct
*/
-int ak_fs_open_map_v3_file(char*, akfs_map_v3*);
+int ak_fs_map_v3_open_from_file(akfs_map_v3*);
+
+/**
+ * Prints filenames from a map_store
+ */
+void ak_fs_print_filenames_from_map_store(akfs_map_v3**, size_t);
/**
* Unused
@@ -196,12 +201,19 @@ void ak_fs_map_v3_print_filename(akfs_map_v3*);
/**
* Unused
*/
+void ak_fs_maps_v3_print_filenames(akfs_map_v3**, size_t);
+
+void ak_fs_map_v3_print_as_json(akfs_map_v3*);
+
+/**
+ * Unused
+ */
void ak_fs_map_v3_print(akfs_map_v3*);
/**
* Takes an array of sha512sums (maps) and puts it in an array of maps (v3)
*/
-int ak_fs_load_available_maps(sha512sum**, size_t, akfs_map_v3**, size_t);
+int ak_fs_map_v3_resolve_maps(akfs_map_v3**, size_t);
/**
* Unused
@@ -211,7 +223,7 @@ void ak_fs_print_available_maps(sha512sum**, size_t);
/**
* Unused
*/
-void ak_fs_print_loaded_maps(akfs_map_v3**, size_t);
+void ak_fs_maps_v3_print(akfs_map_v3**, size_t);
/**
* Reads maps_dir and outputs it in an array of sha512sum
@@ -263,7 +275,7 @@ void ak_fs_map_v3_init(akfs_map_v3*);
/**
* Initializes an array of akfs_map_v3
*/
-void ak_fs_map_v3_init_store(akfs_map_v3**, size_t);
+void ak_fs_maps_v3_init(akfs_map_v3**, size_t);
/**
* returns: boolean
@@ -281,11 +293,11 @@ sha512sum* ak_fs_map_v3_get_map_hash(akfs_map_v3*);
/**
* Unused
*/
-sha512sum* ak_fs_map_v3_get_root_hash(akfs_map_v3*);
+char* ak_fs_map_v3_get_root_hash(akfs_map_v3*);
/**
* Unused
*/
-sha512sum* ak_fs_map_v3_get_orig_hash(akfs_map_v3*);
+char* ak_fs_map_v3_get_orig_hash(akfs_map_v3*);
/**
* Unused
*/
@@ -334,6 +346,11 @@ sha512sum* ak_fs_map_v4_get_root_hash(akfs_map_v4*);
sha512sum* ak_fs_map_v4_get_orig_hash(akfs_map_v4*);
/**
+ * Returns number of files found in maps fs location
+ */
+size_t ak_fs_maps_v3_found_in_fs();
+
+/**
* Unused
*/
int ak_fs_ls();
diff --git a/c_implementation/include/libaksettings.h b/c_implementation/include/libaksettings.h
index 0f53218..505e502 100644
--- a/c_implementation/include/libaksettings.h
+++ b/c_implementation/include/libaksettings.h
@@ -8,15 +8,14 @@ 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();
-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);
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(&timestamp);
+ if (tm == NULL) {
+ return false;
+ }
+
+ strftime(buffer, size, "%Y%m%d_%H%M%S", tm);
+ return true;
+}
+
diff --git a/c_implementation/src/akfs.c b/c_implementation/src/ak_fs.c
index f9abc34..1d30744 100644
--- a/c_implementation/src/akfs.c
+++ b/c_implementation/src/ak_fs.c
@@ -10,11 +10,6 @@
#include <sys/stat.h>
#include <dirent.h>
-const char* ak_fs_maps_v3_get_dir()
-{
- return getenv("AK_MAPSDIR");
-}
-
char* ak_fs_return_hash_path(const char* str)
{
if ( ak_fs_verify_input_is_hash(str) )
@@ -185,13 +180,13 @@ int ak_fs_convert_map_v3_string_to_struct(const char *str, size_t ssize, akfs_ma
{
if ( str[i] == ' ' )
{
- spaces_found++;
- sa[spaces_found] = i;
+ // spaces_found++;
+ sa[++spaces_found] = i;
}
if ( str[i] == '\n' )
{
- newlines_found++;
- na[newlines_found] = i;
+ // newlines_found++;
+ na[++newlines_found] = i;
}
}
int si = 0;
@@ -260,67 +255,37 @@ void ak_fs_get_available_maps_from_fs(sha512sum **ma, size_t length)
closedir(d);
}
-int ak_fs_load_available_maps(sha512sum **ma, size_t ma_len, akfs_map_v3 **ms, size_t ms_len)
+int ak_fs_map_v3_resolve_maps(akfs_map_v3 **ms, size_t ms_len)
{
- sha512sum *ptr = NULL;
- akfs_map_v3 *mptr = NULL;
- mptr = *ms;
- (void)ms_len;
- for ( ptr = *ma; ptr < *ma+ma_len; ++ptr)
+ akfs_map_v3 *ptr = NULL;
+ for ( ptr = *ms; ptr < *ms+ms_len; ++ptr)
{
- if ( ak_fs_sha512sum_is_null(ptr))
+ if ( ak_fs_sha512sum_is_null(&(ptr->mh)) )
{
continue;
}
- if( ak_fs_open_map_v3_file(ak_fs_sha512sum_struct_read_as_string(ptr), mptr) != 2)
+ if( ak_fs_map_v3_open_from_file(ptr) != 2)
{
- ++(mptr);
+ ++(ptr);
continue;
}
else
{
- ++(mptr);
+ ++(ptr);
// return 1;
}
}
return 0;
}
-void ak_fs_print_loaded_maps(akfs_map_v3 **map_store, size_t length)
-{
- akfs_map_v3 *ptr = NULL;
- for ( ptr = *map_store; ptr < *map_store + length; ++ptr)
- {
- if ( !ak_fs_map_v3_is_null(ptr) ) ak_fs_map_v3_print(ptr);
- }
-}
-
-bool ak_fs_map_v3_compare(akfs_map_v3* a, akfs_map_v3* b)
-{
- return (
- (ak_fs_sha512sum_compare(&a->oh, &b->oh) == true) &&
- (ak_fs_sha512sum_compare(&a->rh, &b->rh) == true) &&
- (ak_fs_sha512sum_compare(&a->mh, &b->mh) == true) &&
- (strcmp(a->filename, b->filename) == 0)
- );
-}
-
-bool ak_fs_map_v3_is_null(akfs_map_v3* m)
-{
- akfs_map_v3 n;
- ak_fs_map_v3_init(&n);
- return ak_fs_map_v3_compare(m, &n);
-}
-
-void ak_fs_print_available_maps(sha512sum **ma, size_t ma_len)
-{
- sha512sum *ptr = NULL;
- for ( ptr = *ma; ptr < *ma+ma_len; ++ptr)
- {
- ak_log_debug(__func__, ak_fs_sha512sum_struct_read_as_string(ptr));
- }
-
-}
+// void ak_fs_print_available_maps(sha512sum **ma, size_t ma_len)
+// {
+// sha512sum *ptr = NULL;
+// for ( ptr = *ma; ptr < *ma+ma_len; ++ptr)
+// {
+// ak_log_debug(__func__, ak_fs_sha512sum_struct_read_as_string(ptr));
+// }
+// }
void ak_fs_init_string(char *str, size_t len)
{
@@ -330,97 +295,38 @@ void ak_fs_init_string(char *str, size_t len)
}
}
-
-void ak_fs_print_map_avail(const sha512sum* m)
-{
- printf(" .MA: %s\n", ak_fs_sha512sum_struct_read_as_string(m));
-}
-
-void ak_fs_print_map_all_avail(sha512sum** m, size_t s)
-{
- sha512sum *ptr = NULL;
- for (ptr = *m; ptr < *m+s; ++ptr)
- {
- ak_fs_print_map_avail(ptr);
- }
-}
-
-void ak_fs_print_filenames_from_map_store(akfs_map_v3** m, size_t s)
-{
- akfs_map_v3 *ptr = NULL;
- for (ptr = *m; ptr < *m+s; ++ptr)
- {
- if ( !ak_fs_map_v3_is_null(ptr) ) ak_fs_map_v3_print_filename(ptr);
- }
-}
-
-// char* ak_fs_fuse_list_filenames_from_map_store(akfs_map_v3** m, size_t s)
+// void ak_fs_print_map_avail(const sha512sum* m)
// {
-// akfs_map_v3 *ptr = NULL;
+// printf(" .MA: %s\n", ak_fs_sha512sum_struct_read_as_string(m));
+// }
+//
+// void ak_fs_print_map_all_avail(sha512sum** m, size_t s)
+// {
+// sha512sum *ptr = NULL;
// for (ptr = *m; ptr < *m+s; ++ptr)
// {
-// if ( !ak_fs_map_v3_is_null(ptr) ) ak_fs_map_v3_get_filename(ptr);
+// ak_fs_print_map_avail(ptr);
// }
// }
-void ak_fs_print_all_maps_from_map_store(akfs_map_v3** m, size_t s)
-{
- akfs_map_v3 *ptr = NULL;
- for (ptr = *m; ptr < *m+s; ++ptr)
- {
- if (!ak_fs_map_v3_is_null(ptr)) ak_fs_map_v3_print(ptr);
- }
-}
-
int ak_fs_ls()
{
- size_t ms_len = 100;
- size_t ma_len = 100;
- akfs_map_v3 map_store[ms_len];
- akfs_map_v3* mps_ptr = &map_store[0];
+ size_t len = ak_fs_maps_v3_found_in_fs();
+ printf("Found: %lu\n", len);
+ akfs_map_v3 map_store[len];
+ akfs_map_v3* maps_ptr = &map_store[0];
void* mps_start = &map_store[0];
(void)mps_start;
- sha512sum maps_avail[ma_len];
- sha512sum *mav_ptr = &maps_avail[0];
- void* mav_start = &map_store[0];
- (void)mav_start;
- ak_fs_map_v3_init_store(&mps_ptr, ms_len);
- ak_fs_sha512sum_init_avail(&mav_ptr, ma_len);
- ak_fs_print_all_maps_from_map_store(&mps_ptr, ms_len);
- ak_fs_get_available_maps_from_fs(&mav_ptr, ma_len);
- ak_fs_load_available_maps(&mav_ptr, ma_len, &mps_ptr, ms_len);
- ak_fs_print_loaded_maps(&mps_ptr, ms_len);
- ak_fs_print_filenames_from_map_store(&mps_ptr, ms_len);
- return 0;
-}
+ ak_fs_maps_v3_init(&maps_ptr, len);
+ ak_fs_maps_v3_print(&maps_ptr, len);
-int ak_fs_usage()
-{
- ak_log_debug(__func__, "Available commands:");
- ak_log_debug(__func__, "ak fs --list");
- return 1;
-}
+ // TODO Rename the following to "ak_fs_resolve_map_v3_array" or close to it
+ ak_fs_map_v3_resolve_maps(&maps_ptr, len);
-int ak_fs_main(int c, char** v)
-{
- (void)c;
- (void)v;
- int option;
- while ( (option = getopt(c, v, ":h|:help")) != -1 )
- {
- printf("%d\n", option);
- switch(option)
- {
- case 'h':
- return ak_fs_usage();
- case ':':
- printf("kek\n");
- return 1;
- case '?':
- printf("lol\n");
- return 2;
- }
- }
+ // TODO Decide what we should be printing
+ // Possibly, something like "maphex(6)_filename" so we can put multiple
+ // files with the same name into the list
+ ak_fs_maps_v3_print(&maps_ptr, len);
+ ak_fs_maps_v3_print_filenames(&maps_ptr, len);
return 0;
}
-
diff --git a/c_implementation/src/akfs_defuse.c b/c_implementation/src/ak_fs_defuse.c
index da0c3d0..10617cc 100644
--- a/c_implementation/src/akfs_defuse.c
+++ b/c_implementation/src/ak_fs_defuse.c
@@ -37,36 +37,37 @@ static int akfs_fuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler
if (strcmp(path, "/") != 0) // Only support root dir
return -ENOENT;
- filler(buf, ".", NULL, 0, 0); // Current dir
- filler(buf, "..", NULL, 0, 0); // Parent dir
- filler(buf, "hello", NULL, 0, 0); // Our file
- size_t ms_len = 100;
- size_t ma_len = 100;
+ filler(buf, ".", NULL, 0, 0);
+ filler(buf, "..", NULL, 0, 0);
+
+ // example file
+ filler(buf, "hello", NULL, 0, 0);
+
+ // ak fs integration
+ size_t ms_len = ak_fs_maps_v3_found_in_fs();
akfs_map_v3 map_store[ms_len];
akfs_map_v3* mps_ptr = &map_store[0];
void* mps_start = &map_store[0];
(void)mps_start;
- sha512sum maps_avail[ma_len];
- sha512sum *mav_ptr = &maps_avail[0];
- void* mav_start = &map_store[0];
- (void)mav_start;
- ak_fs_map_v3_init_store(&mps_ptr, ms_len);
- ak_fs_sha512sum_init_avail(&mav_ptr, ma_len);
- ak_fs_get_available_maps_from_fs(&mav_ptr, ma_len);
- ak_fs_load_available_maps(&mav_ptr, ma_len, &mps_ptr, ms_len);
+ ak_fs_maps_v3_init(&mps_ptr, ms_len);
+ ak_fs_map_v3_resolve_maps(&mps_ptr, ms_len);
akfs_map_v3 *ptr = NULL;
for (ptr = mps_ptr; ptr < mps_ptr + ms_len; ++ptr)
{
- if ( !ak_fs_map_v3_is_null(ptr) ) ak_fs_map_v3_print_filename(ptr);
- filler(buf, ak_fs_map_v3_get_filename(ptr), NULL, 0, 0);
+ if ( ak_fs_map_v3_is_null(ptr) )
+ {
+ ak_fs_map_v3_print_filename(ptr);
+ filler(buf, ak_fs_map_v3_get_filename(ptr), NULL, 0, 0);
+ }
}
- return 0;
+
+ return 0;
}
// Called to get file attributes (metadata)
static int akfs_fuse_getattr(const char *path, struct stat *st, struct fuse_file_info *fi)
{
- (void) fi; // Unused
+ (void) fi;
st->st_uid = getuid();
st->st_gid = getgid();
st->st_atime = st->st_mtime = time(NULL);
diff --git a/c_implementation/src/ak_fs_main.c b/c_implementation/src/ak_fs_main.c
new file mode 100644
index 0000000..f1660cf
--- /dev/null
+++ b/c_implementation/src/ak_fs_main.c
@@ -0,0 +1,43 @@
+#include <getopt.h>
+#include <stdio.h>
+#include <libaklog.h>
+#include <libakfs.h>
+
+static int ak_fs_usage()
+{
+ ak_log_debug(__func__, "Available commands:");
+ ak_log_debug(__func__, "ak fs --list");
+ return 1;
+}
+
+int ak_fs_main(int argc, char** argv)
+{
+ int option;
+ int logind = 0;
+ static struct option long_options[] = {
+ {"help", no_argument, 0, 'h'},
+ {"list", no_argument, 0, 'l'},
+ {0,0,0,0}
+ };
+ while(1)
+ {
+ option = getopt_long(argc, argv, "hl", long_options, &logind);
+ if ( option == -1 ) return ak_fs_usage();
+ switch(option)
+ {
+ case 'h':
+ return ak_fs_usage();
+ case 'l':
+ return ak_fs_ls();
+ default:
+ printf("double lol\n");
+ return 4;
+ }
+ }
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ return ak_fs_main(argc, argv);
+}
diff --git a/c_implementation/src/ak_fs_map_v3.c b/c_implementation/src/ak_fs_map_v3.c
new file mode 100644
index 0000000..1b26d89
--- /dev/null
+++ b/c_implementation/src/ak_fs_map_v3.c
@@ -0,0 +1,232 @@
+#include <stdio.h>
+#include <string.h>
+#include <libakfs.h>
+#include <libaklog.h>
+#include <sys/stat.h>
+
+// const char maps_dir[] = "/home/kaotisk/.arching-kaos/akfs/maps/";
+
+void ak_fs_map_v3_init(akfs_map_v3 *map)
+{
+ ak_fs_sha512sum_init(&map->oh);
+ ak_fs_sha512sum_init(&map->rh);
+ ak_fs_sha512sum_init(&map->mh);
+ ak_fs_init_string(map->filename, 256);
+}
+
+bool ak_fs_map_v3_compare(akfs_map_v3* a, akfs_map_v3* b)
+{
+ return (
+ (ak_fs_sha512sum_compare(&a->oh, &b->oh) == true) &&
+ (ak_fs_sha512sum_compare(&a->rh, &b->rh) == true) &&
+ (ak_fs_sha512sum_compare(&a->mh, &b->mh) == true) &&
+ (strcmp(a->filename, b->filename) == 0)
+ );
+}
+
+
+bool ak_fs_map_v3_is_null(akfs_map_v3* m)
+{
+ akfs_map_v3 n;
+ ak_fs_map_v3_init(&n);
+ if ( ak_fs_map_v3_compare(m, &n) )
+ {
+ ak_log_debug(__func__, "true");
+ }
+ else
+ {
+ ak_log_debug(__func__, "false");
+ }
+ return ak_fs_map_v3_compare(m, &n);
+}
+
+void ak_fs_map_v3_print_map_hash(akfs_map_v3 *map)
+{
+ if( !ak_fs_sha512sum_is_null(&(map->mh)) )
+ {
+ char str[129] = {0};
+ char* s = &str[0];
+ ak_fs_sha512sum_struct_to_string(&(map->mh), s);
+ printf("%s", s);
+ }
+ else
+ {
+ ak_log_debug(__func__,"hash is null");
+ }
+}
+
+void ak_fs_map_v3_print_original_hash(akfs_map_v3 *map)
+{
+ if (!ak_fs_sha512sum_is_null(&(map->oh)))
+ {
+ printf("%s", ak_fs_sha512sum_struct_read_as_string(&(map->oh)));
+ }
+ else
+ {
+ ak_log_debug(__func__,"hash is null");
+ }
+}
+
+void ak_fs_map_v3_print_root_hash(akfs_map_v3 *map)
+{
+ if (!ak_fs_sha512sum_is_null(&(map->rh)))
+ {
+ printf("%s", ak_fs_sha512sum_struct_read_as_string(&(map->rh)));
+ }
+ else
+ {
+ ak_log_debug(__func__,"hash is null");
+ }
+}
+
+sha512sum* ak_fs_map_v3_get_map_hash(akfs_map_v3 *map)
+{
+ return &(map->mh);
+}
+
+char* ak_fs_map_v3_get_root_hash(akfs_map_v3 *map)
+{
+ if (!ak_fs_sha512sum_is_null(&(map->rh)))
+ {
+ return ak_fs_sha512sum_struct_read_as_string(&(map->rh));
+ }
+ else
+ {
+ return "";
+ }
+}
+
+char* ak_fs_map_v3_get_filename(akfs_map_v3 *map)
+{
+ return map->filename;
+}
+
+void ak_fs_map_v3_print_filename(akfs_map_v3 *map)
+{
+ printf(" .fn: %s\n", ak_fs_map_v3_get_filename(map));
+}
+
+void ak_fs_map_v3_print(akfs_map_v3 *map)
+{
+ printf("map_v3 {\n");
+ printf("\n .mh: ");
+ ak_fs_map_v3_print_map_hash(map);
+ printf("\n .oh: ");
+ ak_fs_map_v3_print_original_hash(map);
+ printf("\n .rh: ");
+ ak_fs_map_v3_print_root_hash(map);
+ printf("\n .fn: ");
+ ak_fs_map_v3_print_filename(map);
+ printf("\n}\n");
+}
+
+void ak_fs_map_v3_print_as_json(akfs_map_v3 *map)
+{
+ printf("{\"type\":\"map_v3\",");
+ printf("\"map\":\"");
+ ak_fs_map_v3_print_map_hash(map);
+ printf("\",");
+ printf("{\"original\":\"");
+ ak_fs_map_v3_print_original_hash(map);
+ printf("\",");
+ printf("{\"root\":\"");
+ ak_fs_map_v3_print_root_hash(map);
+ printf("\",");
+ printf("{\"filename\":\"");
+ ak_fs_map_v3_print_filename(map);
+ printf("\"");
+ printf("}\n");
+}
+
+int ak_fs_map_v3_open_from_file(akfs_map_v3 * map)
+{
+ ak_log_debug(__func__, "Started");
+ if (map==0x0)
+ {
+ ak_log_debug(__func__, "Zeropointer");
+ return 1;
+ }
+ FILE *fd;
+ char *full_path = {0};
+ asprintf(&full_path,
+ "%s/%s",
+ ak_fs_maps_v3_get_dir(),
+ ak_fs_sha512sum_struct_read_as_string(ak_fs_map_v3_get_map_hash(map))
+ );
+ // printf("Trying path: %s\n", full_path);
+ fd = fopen(full_path, "rb");
+ if (!fd)
+ {
+ // perror("fopen");
+ ak_log_debug(__func__, "File not found or other error");
+ return 1;
+ }
+ struct stat sb;
+ if (stat(full_path, &sb) == -1) {
+ perror("stat");
+ fclose(fd);
+ return 2;
+ }
+ // File size: %lld in bytes: (long long) sb.st_size);
+ char buffer[(long long) sb.st_size+1];
+ fread(&buffer, sizeof(buffer), (long long) sb.st_size, fd);
+ // ak_fs_sha512sum_string_to_struct(maphash, &(map->mh));
+ if ( ak_fs_convert_map_v3_string_to_struct(buffer, strlen(buffer), map) != 0 )
+ {
+ ak_log_debug(__func__,"conversion failed");
+ fclose(fd);
+ return 1;
+ }
+ fclose(fd);
+ return 0;
+}
+
+int ak_fs_open_map_v3_file(char* maphash, akfs_map_v3 * map)
+{
+ ak_log_debug(__func__, "Started");
+ if (map==0x0)
+ {
+ ak_log_debug(__func__, "Zeropointer");
+ return 1;
+ }
+ if ( !ak_fs_verify_input_is_hash(maphash) )
+ {
+ ak_log_debug(__func__,"not a hash");
+ return 1;
+ }
+ FILE *fd;
+ char *full_path = {0};
+ asprintf(&full_path, "%s/%s", ak_fs_maps_v3_get_dir(), maphash);
+ printf("Trying path: %s\n", full_path);
+ fd = fopen(full_path, "rb");
+ if (!fd)
+ {
+ // perror("fopen");
+ ak_log_debug(__func__, "file not found");
+ return 1;
+ }
+ struct stat sb;
+ if (stat(full_path, &sb) == -1) {
+ perror("stat");
+ fclose(fd);
+ return 2;
+ }
+ // File size: %lld in bytes: (long long) sb.st_size);
+ char buffer[(long long) sb.st_size+1];
+ fread(&buffer, sizeof(buffer), (long long) sb.st_size, fd);
+ ak_fs_sha512sum_string_to_struct(maphash, &(map->mh));
+ if ( ak_fs_convert_map_v3_string_to_struct(buffer, strlen(buffer), map) != 0 )
+ {
+ ak_log_debug(__func__,"conversion failed");
+ fclose(fd);
+ return 1;
+ }
+ fclose(fd);
+ return 0;
+}
+
+int ak_fs_map_v3_to_file(akfs_map_v3 maphash)
+{
+ (void)maphash;
+ return 0;
+}
diff --git a/c_implementation/src/akfs_map_v4.c b/c_implementation/src/ak_fs_map_v4.c
index 3fea244..3fea244 100644
--- a/c_implementation/src/akfs_map_v4.c
+++ b/c_implementation/src/ak_fs_map_v4.c
diff --git a/c_implementation/src/ak_fs_maps_v3.c b/c_implementation/src/ak_fs_maps_v3.c
new file mode 100644
index 0000000..9b047b0
--- /dev/null
+++ b/c_implementation/src/ak_fs_maps_v3.c
@@ -0,0 +1,63 @@
+#include <libakfs.h>
+#include <stdlib.h>
+#include <dirent.h>
+
+const char* ak_fs_maps_v3_get_dir()
+{
+ return getenv("AK_MAPSDIR");
+}
+
+void ak_fs_maps_v3_init(akfs_map_v3** ms, size_t l)
+{
+ akfs_map_v3 *m = NULL;
+ for (m = *ms; m < *ms+l; ++m)
+ {
+ ak_fs_map_v3_init(m);
+ }
+}
+
+void ak_fs_maps_v3_print_map_hashes(akfs_map_v3** m, size_t s)
+{
+ akfs_map_v3 *ptr = NULL;
+ for (ptr = *m; ptr < *m+s; ++ptr)
+ {
+ if ( !ak_fs_map_v3_is_null(ptr) ) ak_fs_map_v3_print_map_hash(ptr);
+ }
+}
+
+void ak_fs_maps_v3_print_filenames(akfs_map_v3** m, size_t s)
+{
+ akfs_map_v3 *ptr = NULL;
+ for (ptr = *m; ptr < *m+s; ++ptr)
+ {
+ if ( ptr != NULL ) ak_fs_map_v3_print_filename(ptr);
+ }
+}
+
+void ak_fs_maps_v3_print(akfs_map_v3 **map_store, size_t length)
+{
+ akfs_map_v3 *ptr = NULL;
+ for ( ptr = *map_store; ptr < *map_store + length; ++ptr)
+ {
+ ak_fs_map_v3_print(ptr);
+ ak_fs_map_v3_print_as_json(ptr);
+ }
+}
+
+
+size_t ak_fs_maps_v3_found_in_fs()
+{
+ DIR *d;
+ size_t counter = 0;
+ d = opendir(ak_fs_maps_v3_get_dir());
+ if (d)
+ {
+ const struct dirent *dir;
+ while ((dir = readdir(d)) != NULL )
+ {
+ if (ak_fs_verify_input_is_hash(dir->d_name)) counter++;
+ }
+ }
+ closedir(d);
+ return counter;
+}
diff --git a/c_implementation/src/akfs_sha512sum.c b/c_implementation/src/ak_fs_sha512sum.c
index 6db6397..2e10544 100644
--- a/c_implementation/src/akfs_sha512sum.c
+++ b/c_implementation/src/ak_fs_sha512sum.c
@@ -1,4 +1,5 @@
#include <libakfs.h>
+#include <libaklog.h>
#include <stdlib.h>
#include <assert.h>
@@ -40,6 +41,7 @@ char* ak_fs_sha512sum_struct_read_as_string(const sha512sum *ptr)
{
char *str = malloc(129*sizeof(char));
ak_fs_sha512sum_struct_to_string(ptr, str);
+ ak_log_debug(__func__, str);
return str;
}
diff --git a/c_implementation/src/aklog.c b/c_implementation/src/ak_log.c
index 260621c..e3af865 100644
--- a/c_implementation/src/aklog.c
+++ b/c_implementation/src/ak_log.c
@@ -85,24 +85,24 @@ void ak_log_print_log_line(const char* line)
}
timeInfo = localtime(&ts);
strftime(ts_string, sizeof(ts_string), "%Y%m%d_%H%M%S", timeInfo);
- printf("%s", ts_string);
- printf(" \033[1;32m");
+ fprintf(stderr, "%s", ts_string);
+ fprintf(stderr, " \033[1;32m");
for ( int k = sa[1]+1; k < s