2023-04-27 21:01:05 +02:00
/*
* Copyright ( c ) 2023 , Fabian Dellwing < fabian @ dellwing . net >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# include <AK/JsonObject.h>
# include <AK/JsonParser.h>
# include <LibCore/ConfigFile.h>
# include <LibCore/System.h>
# include <LibMain/Main.h>
# include <unistd.h>
ErrorOr < int > serenity_main ( Main : : Arguments )
{
TRY ( Core : : System : : pledge ( " stdio rpath wpath cpath recvfd sendfd proc exec " ) ) ;
TRY ( Core : : System : : unveil ( " /bin/NetworkServer " , " x " ) ) ;
TRY ( Core : : System : : unveil ( " /etc/Network.ini " , " rwc " ) ) ;
TRY ( Core : : System : : unveil ( nullptr , nullptr ) ) ;
auto infile = TRY ( Core : : File : : standard_input ( ) ) ;
auto input_bytes = TRY ( infile - > read_until_eof ( ) ) ;
StringView json_data = input_bytes ;
if ( json_data . is_empty ( ) | | json_data . is_whitespace ( ) )
return Error : : from_errno ( EINVAL ) ;
auto json = TRY ( JsonParser ( json_data ) . parse ( ) ) ;
if ( ! json . is_object ( ) )
return Error : : from_errno ( EINVAL ) ;
auto json_object = json . as_object ( ) ;
auto config_file = TRY ( Core : : ConfigFile : : open_for_system ( " Network " , Core : : ConfigFile : : AllowWriting : : Yes ) ) ;
2023-12-16 17:49:34 +03:30
json_object . for_each_member ( [ & ] ( ByteString const & adapter_name , JsonValue const & adapter_data ) {
2024-04-18 15:32:56 -04:00
adapter_data . as_object ( ) . for_each_member ( [ & ] ( ByteString const & key , JsonValue const & value ) {
2023-04-27 21:01:05 +02:00
switch ( value . type ( ) ) {
case JsonValue : : Type : : String :
config_file - > write_entry ( adapter_name , key , value . as_string ( ) ) ;
break ;
case JsonValue : : Type : : Bool :
config_file - > write_bool_entry ( adapter_name , key , value . as_bool ( ) ) ;
break ;
case JsonValue : : Type : : Null :
break ;
default :
dbgln ( " Extend switch/case key={}, value={} " , key , value ) ;
VERIFY_NOT_REACHED ( ) ;
}
} ) ;
} ) ;
TRY ( config_file - > sync ( ) ) ;
// FIXME: This should be done in a nicer way, but for that out NetworkServer implementation needs to actually be a server that we can talk to and not just a oneshot binary.
auto command = Vector < StringView > ( ) ;
TRY ( command . try_append ( " /bin/NetworkServer " sv ) ) ;
TRY ( Core : : System : : exec_command ( command , true ) ) ;
return 0 ;
}