Added disk operation signatures
This commit is contained in:
parent
044f15dc3c
commit
f92c3c6a1e
32
src/disk.h
Normal file
32
src/disk.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/// @brief Creates an empty disk at the given path, with the given size and with the given permissions.
|
||||||
|
/// @param path The path to the disk to create.
|
||||||
|
/// @param size The size of the disk to create.
|
||||||
|
/// @param permissions The permissions to set on the disk.
|
||||||
|
/// @return The result of the operation.
|
||||||
|
Result create_empty_disk(const char* path, uint64_t size, mode_t permissions);
|
||||||
|
|
||||||
|
/// @brief Creates a backed disk at the given path, with the given backing disk and with the given permissions.
|
||||||
|
/// @param path The path to the disk to create.
|
||||||
|
/// @param backing_disk The disk to back the new disk with.
|
||||||
|
/// @param permissions The permissions to set on the disk.
|
||||||
|
/// @return The result of the operation.
|
||||||
|
Result create_backed_disk(const char* path, const char* backing_disk, mode_t permissions);
|
||||||
|
|
||||||
|
/// @brief Trims a disk to remove any unused space.
|
||||||
|
/// @param path The path to the disk to trim.
|
||||||
|
/// @return The result of the operation.
|
||||||
|
Result trim_disk(const char* path);
|
||||||
|
|
||||||
|
/// @brief Moves a disk's backing file to the given path.
|
||||||
|
/// @param path The path to the disk to move.
|
||||||
|
/// @param backing_disk The new path to the backing disk.
|
||||||
|
/// @return The result of the operation.
|
||||||
|
Result rebase_disk(const char* path, const char* backing_disk);
|
47
src/entry.c
47
src/entry.c
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
bool is_entry_id_valid(const char* entry_id) {
|
bool is_entry_id_valid(const char* entry_id) {
|
||||||
@ -12,21 +13,30 @@ bool is_entry_id_valid(const char* entry_id) {
|
|||||||
|
|
||||||
size_t length = strlen(entry_id);
|
size_t length = strlen(entry_id);
|
||||||
|
|
||||||
|
// Check that the length is valid
|
||||||
if (length == 0 || length > MAX_ENTRY_LENGTH)
|
if (length == 0 || length > MAX_ENTRY_LENGTH)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Check that the entry id does not contain any slashes
|
||||||
for (size_t i = 0; i < length; i++)
|
for (size_t i = 0; i < length; i++)
|
||||||
if (entry_id[i] == '/')
|
if (entry_id[i] == '/')
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Check that the entry id is not a reserved name
|
||||||
|
if (strcmp(entry_id, ".") == 0 || strcmp(entry_id, "..") == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result get_entry_path(const char* entry_id, char** out_path) {
|
Result get_entry_path(const char* entry_id, char** out_path) {
|
||||||
*out_path = NULL;
|
*out_path = NULL;
|
||||||
|
|
||||||
if (!is_entry_id_valid(entry_id))
|
// Check that the entry id is valid
|
||||||
|
if (!is_entry_id_valid(entry_id)) {
|
||||||
|
log_message(LOG_LEVEL_ERROR, "Invalid entry id '%s'.", entry_id);
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
return format(out_path, "%s/%s", ENTRY_POOL_DIR, entry_id);
|
return format(out_path, "%s/%s", ENTRY_POOL_DIR, entry_id);
|
||||||
}
|
}
|
||||||
@ -34,17 +44,52 @@ Result get_entry_path(const char* entry_id, char** out_path) {
|
|||||||
Result entry_exists(const char* entry_id, bool* out_exists) {
|
Result entry_exists(const char* entry_id, bool* out_exists) {
|
||||||
*out_exists = false;
|
*out_exists = false;
|
||||||
|
|
||||||
|
// Get the path of the entry
|
||||||
char* path;
|
char* path;
|
||||||
Result result = get_entry_path(entry_id, &path);
|
Result result = get_entry_path(entry_id, &path);
|
||||||
if (result != SUCCESS)
|
if (result != SUCCESS)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
// Check if the entry exists and is a directory
|
||||||
struct stat st;
|
struct stat st;
|
||||||
bool exists = stat(path, &st) == 0 && S_ISDIR(st.st_mode);
|
bool exists = stat(path, &st) == 0 && S_ISDIR(st.st_mode);
|
||||||
|
|
||||||
|
// Free the path
|
||||||
free(path);
|
free(path);
|
||||||
|
|
||||||
|
// Output the result
|
||||||
*out_exists = exists;
|
*out_exists = exists;
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result add_entry(const char* entry_id) {
|
||||||
|
// Check if the entry already exists
|
||||||
|
bool exists;
|
||||||
|
Result result = entry_exists(entry_id, &exists);
|
||||||
|
if (result != SUCCESS)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
if (exists) {
|
||||||
|
log_message(LOG_LEVEL_ERROR, "Entry '%s' already exists.", entry_id);
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the entry directory
|
||||||
|
char* path;
|
||||||
|
result = get_entry_path(entry_id, &path);
|
||||||
|
if (result != SUCCESS)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
int result_code = mkdir(path, 0755);
|
||||||
|
|
||||||
|
free(path);
|
||||||
|
|
||||||
|
// Check if the operation failed
|
||||||
|
if (result_code != 0) {
|
||||||
|
log_message(LOG_LEVEL_ERROR, "Failed to create entry '%s' (%s).", entry_id, strerror(errno));
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
@ -25,3 +25,7 @@ Result get_entry_path(const char* entry_id, char** out_path);
|
|||||||
/// @return The result of the operation.
|
/// @return The result of the operation.
|
||||||
Result entry_exists(const char* entry_id, bool* out_exists);
|
Result entry_exists(const char* entry_id, bool* out_exists);
|
||||||
|
|
||||||
|
/// @brief Adds an entry to the entry pool.
|
||||||
|
/// @param entry_id The entry id.
|
||||||
|
/// @return The result of the operation.
|
||||||
|
Result add_entry(const char* entry_id);
|
@ -112,24 +112,10 @@ int command_add_entry(int argc, char* argv[]) {
|
|||||||
// Extract the entry id
|
// Extract the entry id
|
||||||
const char* entry_id = argv[0];
|
const char* entry_id = argv[0];
|
||||||
|
|
||||||
// Check if the entry id is valid
|
|
||||||
if (!is_entry_id_valid(entry_id)) {
|
|
||||||
log_message(LOG_LEVEL_ERROR, "Invalid entry id '%s'.", entry_id);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the entry already exists
|
|
||||||
bool exists;
|
|
||||||
if (entry_exists(entry_id, &exists) != SUCCESS)
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
|
|
||||||
if (exists) {
|
|
||||||
log_message(LOG_LEVEL_ERROR, "Entry '%s' already exists.", entry_id);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the entry
|
// Create the entry
|
||||||
// TODO
|
Result result = add_entry(entry_id);
|
||||||
|
if (result != SUCCESS)
|
||||||
|
return result;
|
||||||
|
|
||||||
// Add the disk to the entry
|
// Add the disk to the entry
|
||||||
// TODO
|
// TODO
|
||||||
|
Loading…
Reference in New Issue
Block a user