Small regression to a more stable state

This commit is contained in:
Alexei KADIR 2024-02-17 18:10:07 +01:00
parent c1b3f3c262
commit 1cd34dd514
8 changed files with 53 additions and 180 deletions

View File

@ -7,60 +7,3 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #include <sys/stat.h>
bool is_valid_backing_id(const char* backing_id) {
if (backing_id == NULL)
return false;
size_t length = strlen(backing_id);
// Check that the length is valid
if (length == 0 || length > MAX_BACKING_LENGTH)
return false;
// Check that the backing id does not contain any slashes
for (size_t i = 0; i < length; i++)
if (backing_id[i] == '/')
return false;
// Check that the backing id is not a reserved name
if (strcmp(backing_id, ".") == 0 || strcmp(backing_id, "..") == 0)
return false;
return true;
}
Result get_backing_path(const char* backing_id, char** out_path) {
*out_path = NULL;
// Check that the backing id is valid
if (!is_valid_backing_id(backing_id)) {
log_message(LOG_LEVEL_ERROR, "Invalid backing id '%s'.", backing_id);
return FAILURE;
}
return format(out_path, "%s/%s", BACKING_POOL_DIR, backing_id);
}
Result backing_exists(const char* backing_id, bool* out_exists) {
*out_exists = false;
// Get the path of the backing
char* path;
Result result = get_entry_path(backing_id, &path);
if (result != SUCCESS)
return result;
// Check if the backing exists and is a file
struct stat st;
bool exists = stat(path, &st) == 0 && S_ISREG(st.st_mode);
// Free the path
free(path);
// Output the result
*out_exists = exists;
return SUCCESS;
}

View File

@ -8,36 +8,3 @@
#define BACKING_POOL_DIR "/var/lib/sandbox/backings" #define BACKING_POOL_DIR "/var/lib/sandbox/backings"
#define MAX_BACKING_LENGTH 256 #define MAX_BACKING_LENGTH 256
/// @brief Checks whether the given backing disk id is valid.
/// @param backing_id The backing disk id to check.
/// @return True if the backing disk id is valid, false otherwise.
bool is_valid_backing_id(const char* backing_id);
/// @brief Gets the path of the given backing disk.
/// @param backing_id The backing disk id.
/// @param out_path The pointer to the output path string. The caller is responsible for freeing the memory.
/// @return The result of the operation.
Result get_backing_path(const char* backing_id, char** out_path);
/// @brief Checks whether the given backing disk exists in the pool.
/// @param backing_id The backing disk id.
/// @param out_exists The pointer to the output boolean.
/// @return The result of the operation.
Result backing_exists(const char* backing_id, bool* out_exists);
/// @brief Adds a backing disk to the pool from an entry.
/// @param backing_id The backing disk id.
/// @param entry_id The entry id.
/// @return The result of the operation.
Result add_backing_from_entry(const char* backing_id, const char* entry_id);
/// @brief Removes a backing disk from the pool, and removes any backing disks that uses it.
/// @param backing_id The backing disk id.
/// @return The result of the operation.
Result remove_backing(const char* backing_id);
/// @brief Lists the backing disks in the pool.
/// @param out_backings The pointer to the null-terminated array of backing disk ids. The caller is responsible for freeing the memory of the array and its elements.
/// @return The result of the operation.
Result list_backings(char*** out_backings, size_t* out_count);

View File

@ -206,24 +206,6 @@ Result rebase_disk(const char* path, const char* backing_disk) {
return SUCCESS; return SUCCESS;
} }
Result reset_disk(const char* path) {
// Get the backing file of the disk
DiskInfo info;
Result result = get_disk_info(path, &info);
if (result != SUCCESS)
return result;
if (info.backing_file == NULL)
result = create_root_disk(path, info.virtual_size, 0644);
else
result = create_backed_disk(path, info.backing_file, 0644);
// Free the disk info as it is no longer needed
free_disk_info(&info);
return result;
}
Result get_disk_info(const char* path, DiskInfo* out_info) { Result get_disk_info(const char* path, DiskInfo* out_info) {
// Initialize the output // Initialize the output
out_info->backing_file = NULL; out_info->backing_file = NULL;

View File

@ -43,11 +43,6 @@ Result trim_disk(const char* path);
/// @return The result of the operation. /// @return The result of the operation.
Result rebase_disk(const char* path, const char* backing_disk); Result rebase_disk(const char* path, const char* backing_disk);
/// @brief Resets a disk to its original state.
/// @param path The path to the disk to reset.
/// @return The result of the operation.
Result reset_disk(const char* path);
/// @brief Gathers information about a disk. /// @brief Gathers information about a disk.
/// @param path The path to the disk to gather information about. /// @param path The path to the disk to gather information about.
/// @param out_info The information about the disk. /// @param out_info The information about the disk.

View File

@ -63,6 +63,46 @@ Result get_entry_disk_path(const char* entry_id, char** out_path) {
return result; return result;
} }
Result get_entry_backing_id(const char* entry_id, char** out_backing_id) {
*out_backing_id = NULL;
// Get the path of the disk
char* disk_path;
Result result = get_entry_disk_path(entry_id, &disk_path);
if (result != SUCCESS)
return result;
// Get the backing file of the disk
DiskInfo info;
result = get_disk_info(disk_path, &info);
if (result != SUCCESS) {
free(disk_path);
return result;
}
// Free the disk path
free(disk_path);
// Check that the disk is backed
if (info.backing_file == NULL) {
free_disk_info(&info);
return SUCCESS;
}
// Get the backing id
*out_backing_id = strdup(basename(info.backing_file));
if (*out_backing_id == NULL) {
log_message(LOG_LEVEL_ERROR, "Failed to allocate memory for the backing id.");
free_disk_info(&info);
return OUT_OF_MEMORY;
}
// Free the disk info
free_disk_info(&info);
return SUCCESS;
}
Result get_entry_type_path(const char* entry_id, char** out_path) { Result get_entry_type_path(const char* entry_id, char** out_path) {
*out_path = NULL; *out_path = NULL;
@ -412,30 +452,3 @@ Result clear_entries(void) {
return SUCCESS; return SUCCESS;
} }
Result reset_entry(const char* entry_id) {
// Check that it exists
bool exists;
Result result = entry_exists(entry_id, &exists);
if (result != SUCCESS)
return result;
if (!exists) {
log_message(LOG_LEVEL_ERROR, "The entry '%s' does not exist.", entry_id);
return FAILURE;
}
// Get the path of the disk
char* disk_path;
result = get_entry_disk_path(entry_id, &disk_path);
if (result != SUCCESS)
return result;
// Reset the disk
result = reset_disk(disk_path);
// Free the disk path
free(disk_path);
return result;
}

View File

@ -37,6 +37,12 @@ Result get_entry_path(const char* entry_id, char** out_path);
/// @return The result of the operation. /// @return The result of the operation.
Result get_entry_disk_path(const char* entry_id, char** out_path); Result get_entry_disk_path(const char* entry_id, char** out_path);
/// @brief Gets the backing id of the given entry.
/// @param entry_id The entry id.
/// @param out_backing_id The pointer to the output backing id string. The caller is responsible for freeing the memory.
/// @return The result of the operation.
Result get_entry_backing_id(const char* entry_id, char** out_backing_id);
/// @brief Gets the path of the type file of the given entry. /// @brief Gets the path of the type file of the given entry.
/// @param entry_id The entry id. /// @param entry_id The entry id.
/// @param out_path The pointer to the output path string. The caller is responsible for freeing the memory. /// @param out_path The pointer to the output path string. The caller is responsible for freeing the memory.
@ -91,18 +97,3 @@ Result list_entries(char*** out_entries);
/// @brief Clears all the entries from the pool. /// @brief Clears all the entries from the pool.
/// @return The result of the operation. /// @return The result of the operation.
Result clear_entries(void); Result clear_entries(void);
/// @brief Resets an entry to its initial state.
/// @param entry_id The entry id.
/// @return The result of the operation.
Result reset_entry(const char* entry_id);
/// @brief Updates the backing disk of the given entry to the latest available. Warning: This operation resets the entry.
/// @param entry_id The entry id.
/// @return The result of the operation.
Result update_entry(const char* entry_id);
/// @brief Checks whether the given entry needs to be updated, and updates it if needed.
/// @param entry_id The entry id.
/// @return The result of the operation.
Result check_update_entry(const char* entry_id);

View File

@ -1,6 +1,7 @@
#include "sandbox.h" #include "sandbox.h"
#include "utils.h" #include "utils.h"
#include "backing.h"
#include "entry.h" #include "entry.h"
#include "disk.h" #include "disk.h"
@ -9,6 +10,7 @@
#include <string.h> #include <string.h>
#include <pwd.h> #include <pwd.h>
#include <unistd.h> #include <unistd.h>
#include <time.h>
#include <sys/resource.h> #include <sys/resource.h>
const Command COMMANDS[] = { const Command COMMANDS[] = {
@ -30,8 +32,6 @@ const Command COMMANDS[] = {
{command_update_entry, "update-entry", "<entry id>", "Updates the backing disk of the given entry to the latest available.", {command_update_entry, "update-entry", "<entry id>", "Updates the backing disk of the given entry to the latest available.",
"TODO"}, "TODO"},
{}, {},
{command_add_backing, "add-backing", "<entry id> [<backing id>]", "Adds a backing disk to the backing pool, from the given entry.",
"TODO"},
}; };
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
@ -197,7 +197,7 @@ int command_add_entry(int argc, char* argv[]) {
backing_id = argv[i + 1]; backing_id = argv[i + 1];
i++; // Consume the next argument i++; // Consume the next argument
} else { } else {
log_message(LOG_LEVEL_ERROR, "Unknown option '%s'.", argv[i]); log_message(LOG_LEVEL_ERROR, "Too many arguments for 'add-entry' command.");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }
@ -224,8 +224,8 @@ int command_remove_entry(int argc, char* argv[]) {
const char* entry_id = argv[0]; const char* entry_id = argv[0];
for (int i = 1; i < argc; i++) { if (argc > 1) {
log_message(LOG_LEVEL_ERROR, "Unknown option '%s'.", argv[i]); log_message(LOG_LEVEL_ERROR, "Too many arguments for 'remove-entry' command.");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
@ -237,33 +237,17 @@ int command_remove_entry(int argc, char* argv[]) {
} }
int command_list_entries(int argc, char* argv[]) { int command_list_entries(int argc, char* argv[]) {
// TODO: Call list_entries, and display the result in a nice way
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
int command_clear_entries(int argc, char* argv[]) { int command_clear_entries(int argc, char* argv[]) {
// TODO: Ask for confirmation
// TODO: Call clear_entries
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
int command_reset_entry(int argc, char* argv[]) { int command_reset_entry(int argc, char* argv[]) {
// TODO: Call reset_entry
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
int command_update_entry(int argc, char* argv[]) { int command_update_entry(int argc, char* argv[]) {
// TODO: Call update_entry
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
int command_add_backing(int argc, char* argv[]) {
// TODO: Call add_backing
return EXIT_SUCCESS;
}

View File

@ -24,6 +24,4 @@ int command_remove_entry(int argc, char* argv[]);
int command_list_entries(int argc, char* argv[]); int command_list_entries(int argc, char* argv[]);
int command_clear_entries(int argc, char* argv[]); int command_clear_entries(int argc, char* argv[]);
int command_reset_entry(int argc, char* argv[]); int command_reset_entry(int argc, char* argv[]);
int command_update_entry(int argc, char* argv[]); int command_update_entry(int argc, char* argv[]);
int command_add_backing(int argc, char* argv[]);