aboutsummaryrefslogtreecommitdiff
path: root/c_implementation/include/libakfs.h
diff options
context:
space:
mode:
Diffstat (limited to 'c_implementation/include/libakfs.h')
-rw-r--r--c_implementation/include/libakfs.h434
1 files changed, 434 insertions, 0 deletions
diff --git a/c_implementation/include/libakfs.h b/c_implementation/include/libakfs.h
new file mode 100644
index 0000000..3eb0ba3
--- /dev/null
+++ b/c_implementation/include/libakfs.h
@@ -0,0 +1,434 @@
+#ifndef AKFS
+#define AKFS
+
+#include <stdbool.h>
+#include <stddef.h>
+
+/**
+ * This struct represents a HEX output of the SHA-512 algorithm.
+ *
+ */
+typedef struct {
+ /**
+ * The array below has size of 8, which can store the 128 characters into
+ * 16 digit length variables.
+ *
+ * While 512bits/8bits=64bytes, into converting to characters, we use 2bytes
+ * per one digit, which gives us the 128 characters.
+ *
+ */
+ long unsigned int sum[8];
+} sha512sum;
+
+/**
+ * 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.
+ *
+ */
+typedef struct {
+ /**
+ * Hash of the thing
+ */
+ sha512sum root;
+ /**
+ * Hash of head
+ */
+ sha512sum head;
+ /**
+ * Hash of tail
+ */
+ sha512sum tail;
+} mt_branch;
+
+/**
+ * This is the current structure of an akfs_map. Due to potential short-comings
+ * of it, akfs_map_v4 was introduced. Versions v1 and v2 won't be appearing in
+ * this header file, since they were long abandoned. Version v0, on the other
+ * hand, is what is called now as a root_hash. Refer to it for more.
+ *
+ */
+typedef struct {
+ /**
+ * Original file's hash
+ *
+ */
+ sha512sum oh;
+ /**
+ * Original file's name
+ *
+ */
+ char filename[256];
+ /**
+ * Root hash
+ *
+ */
+ sha512sum rh;
+ /**
+ * Map hash
+ *
+ */
+ sha512sum mh;
+ /**
+ * Should be "level.1.map" at all times
+ *
+ */
+ char *root_name;
+} akfs_map_v3;
+
+/**
+ * This is a proposed structure for akfs_map. It is called after its version.
+ * Previous versions have been mostly abandoned, except v3 which is where v4
+ * was derived from. See akfs_map_v3 for more.
+ *
+ */
+typedef struct {
+ /**
+ * Original file's hash
+ *
+ */
+ sha512sum oh;
+ /**
+ * Original filename's AKFS maphash
+ *
+ */
+ sha512sum fn;
+ /**
+ * Root hash
+ *
+ */
+ sha512sum rh;
+ /**
+ * Map hash
+ *
+ */
+ sha512sum mh;
+} akfs_map_v4;
+
+/**
+ * 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);
+
+/**
+ * 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*);
+
+/**
+ * Initializes a sha512sum struct
+ * @param sha512sum*
+ */
+void ak_fs_sha512sum_init(sha512sum*);
+
+/**
+ * Unused
+ */
+void ak_fs_sha512sum_init_avail(sha512sum**, size_t);
+
+/**
+ * Initialize an akfs_map_v3
+ */
+void ak_fs_map_v3_init(akfs_map_v3*);
+
+/**
+ * Initializes an array of akfs_map_v3
+ */
+void ak_fs_maps_v3_init(akfs_map_v3**, size_t);
+
+/**
+ * @param akfs_map_v3
+ * @return boolean
+ */
+bool ak_fs_map_v3_is_null(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
+