2024-02-15 00:17:20 +01:00
# include "sandbox.h"
# include "utils.h"
2024-02-17 00:40:09 +01:00
# include "entry.h"
2024-02-15 00:17:20 +01:00
# include <stdio.h>
2024-02-15 19:42:22 +01:00
# include <stdlib.h>
2024-02-16 17:13:52 +01:00
# include <string.h>
2024-02-15 00:17:20 +01:00
2024-02-17 00:40:09 +01:00
const Command COMMANDS [ ] = {
{ command_help , " help " , " [command] " , " Prints the help message. " ,
" Prints the help message for the given command. If no command is given, prints the help message for all commands. " } ,
{ command_version , " version " , " " , " Prints the version. " ,
" Prints the version of the program. " } ,
{ } ,
{ command_add_entry , " add-entry " , " <entry id> [--root|-r <size>] [--backed|-b <backing id>] " , " Adds an entry to the entry pool. " ,
" Adds an entry to the entry pool with the given id. The entry can either be a root entry or a backed entry. If the entry is a root entry, the size of the entry must be specified. If the entry is a backed entry, the backing id must be specified. By default, the entry is backed by the latest backing disk available. " } ,
} ;
2024-02-15 00:17:20 +01:00
int main ( int argc , char * argv [ ] ) {
2024-02-17 00:40:09 +01:00
if ( argc < 2 )
return command_help ( 0 , NULL ) ;
size_t input_length = strlen ( argv [ 1 ] ) ;
const Command * command = NULL ;
for ( int i = 0 ; i < ARRAY_SIZE ( COMMANDS ) ; i + + ) {
if ( COMMANDS [ i ] . name = = NULL )
continue ;
// Check that the length of the input is equal or less than the length of the command name
if ( input_length > strlen ( COMMANDS [ i ] . name ) )
continue ;
// Check that the input matches the command name
if ( strncmp ( argv [ 1 ] , COMMANDS [ i ] . name , input_length ) = = 0 ) {
// Check for multiple matches
if ( command ! = NULL ) {
log_message ( LOG_LEVEL_ERROR , " Ambiguous command '%s'. " , argv [ 1 ] ) ;
return EXIT_FAILURE ;
}
command = & COMMANDS [ i ] ;
}
2024-02-16 17:13:52 +01:00
}
2024-02-16 16:53:02 +01:00
2024-02-17 00:40:09 +01:00
// Check if the command is NULL (no matches)
2024-02-16 17:13:52 +01:00
if ( command = = NULL ) {
2024-02-17 00:40:09 +01:00
log_message ( LOG_LEVEL_ERROR , " Unknown command '%s'. " , argv [ 1 ] ) ;
return EXIT_FAILURE ;
2024-02-16 17:13:52 +01:00
}
2024-02-16 16:53:02 +01:00
2024-02-17 00:40:09 +01:00
return command - > handler ( argc - 2 , argv + 2 ) ;
}
int command_help ( int argc , char * argv [ ] ) {
// Check the number of arguments
if ( argc = = 0 ) {
fprintf ( stdout , " Usage: sandbox [command] [arguments] \n \n " ) ;
fprintf ( stdout , " Commands: \n " ) ;
for ( int i = 0 ; i < ARRAY_SIZE ( COMMANDS ) ; i + + )
if ( COMMANDS [ i ] . name = = NULL )
printf ( " \n " ) ;
else
fprintf ( stdout , " %s %s - %s \n " , COMMANDS [ i ] . name , COMMANDS [ i ] . arguments , COMMANDS [ i ] . description ) ;
fprintf ( stdout , " \n Run 'sandbox help [command]' for more information on a command. \n " ) ;
return EXIT_SUCCESS ;
} else if ( argc = = 1 ) {
// Find the command that matches the given name
const Command * command = NULL ;
for ( int i = 0 ; i < ARRAY_SIZE ( COMMANDS ) ; i + + ) {
if ( COMMANDS [ i ] . name = = NULL )
continue ;
2024-02-16 18:26:02 +01:00
2024-02-17 00:40:09 +01:00
if ( strcmp ( argv [ 0 ] , COMMANDS [ i ] . name ) = = 0 ) {
command = & COMMANDS [ i ] ;
break ;
}
}
2024-02-16 23:26:29 +01:00
2024-02-17 00:40:09 +01:00
// Check if the command is NULL (no matches)
if ( command = = NULL ) {
log_message ( LOG_LEVEL_ERROR , " Unknown command '%s'. " , argv [ 0 ] ) ;
return EXIT_FAILURE ;
}
2024-02-16 17:19:56 +01:00
2024-02-17 00:40:09 +01:00
// Print the help message for the command
fprintf ( stdout , " Usage: sandbox %s %s \n \n " , command - > name , command - > arguments ) ;
fprintf ( stdout , " %s \n " , command - > details ) ;
return EXIT_SUCCESS ;
} else {
log_message ( LOG_LEVEL_ERROR , " Too many arguments for 'help' command. " ) ;
return EXIT_FAILURE ;
2024-02-16 17:13:52 +01:00
}
2024-02-17 00:40:09 +01:00
}
2024-02-16 16:53:02 +01:00
2024-02-17 00:40:09 +01:00
int command_version ( int argc , char * argv [ ] ) {
fprintf ( stdout , " Sandbox manager v%s \n " , VERSION ) ;
return EXIT_SUCCESS ;
2024-02-16 16:53:02 +01:00
}
2024-02-17 00:40:09 +01:00
int command_add_entry ( int argc , char * argv [ ] ) {
if ( argc < 1 ) {
log_message ( LOG_LEVEL_ERROR , " Missing entry id. " ) ;
return EXIT_FAILURE ;
}
// Extract the entry id
const char * entry_id = argv [ 0 ] ;
// Create the entry
2024-02-17 00:57:30 +01:00
Result result = add_entry ( entry_id ) ;
if ( result ! = SUCCESS )
return result ;
2024-02-17 00:40:09 +01:00
// Add the disk to the entry
// TODO
// If this fails, remove the entry
return EXIT_SUCCESS ;
}