You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
2.8 KiB
C

#include "server.h"
#include "json/layout.h"
#include "controller/cli.h"
#include "process.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define OBJ_TYPE struct app_args
static struct json_object_field app_args_layout[] = {
JSON_FIELD_STRING( domain, true ),
JSON_FIELD_STRING( user_agent, false ),
{
.key = "addr",
.offset = offsetof( OBJ_TYPE, http_settings.bind_address ),
.type = &json_field_string,
},
{
.key = "port",
.offset = offsetof( OBJ_TYPE, http_settings.bind_port ),
.type = &json_field_integer,
},
JSON_FIELD_BOOL( debug, false ),
JSON_FIELD_BOOL( disable_tor, false ),
JSON_FIELD_INTEGER( tor_socks_port, false ),
JSON_FIELD_INTEGER( outbox_discard_limit, false ),
JSON_FIELD_BOOL( develop, false ),
JSON_FIELD_END,
};
#undef OBJ_TYPE
struct app_args* g_server = NULL;
void app_args_refresh_tor_hidden_service()
{
if( !g_server ) { return; }
free( g_server->tor_hidden_service );
g_server->tor_hidden_service = NULL;
FILE* f = fopen("data/tor/hidden_service/hostname","r");
if( !f ) {
return;
}
size_t n;
getline( &g_server->tor_hidden_service, &n, f );
n = strlen( g_server->tor_hidden_service );
if( g_server->tor_hidden_service[n-1] == '\n' ) {
g_server->tor_hidden_service[n-1] = '\0';
}
fclose(f);
}
struct app_args* app_args_new( int argc, char** argv )
{
struct app_args* args = (struct app_args*)malloc( sizeof(struct app_args) );
memset(args,0,sizeof(*args));
if( !args ) { return NULL; }
g_server = args;
args->http_settings.bind_port = 9053;
args->http_settings.bind_address = strdup("0.0.0.0");
args->tor_socks_port = 9123;
args->section = -1;
args->outbox_discard_limit = 5;
args->user_agent = strdup( "Apogee/0.1" );
json_read_object_layout_from_file( "data/server.json", app_args_layout, args );
app_args_refresh_tor_hidden_service();
if( ( argc > 1 ) && ( 0 != strncmp(argv[1],"--",2) ) ) {
handle_command( argv, argc );
free(args);
return NULL;
}
for( int i = 1; i < argc; ++i ) {
const char* arg = argv[i];
// Debug flag
if( 0 == strcmp(argv[i],"--debug") ) { args->debug = true; goto next_arg; }
// Sections by number
if( sscanf(arg,"--section=%d",&args->section) ) { goto next_arg; }
// Sections by name
if( ( argv[i][0] == '-' ) && ( argv[i][1] == '-' ) ) {
for( int i = 0; i <= process_get_max_section(); ++i ) {
if( strcmp( &argv[i][2], process_get_section_name(i) ) ) {
args->section = i;
goto next_arg;
}
}
}
// Development
if( 0 == strcmp(argv[i],"--devel") ) {
args->section = 100;
goto next_arg;
}
// Unknown argument
printf( "Unknown argument: %s\n", argv[i] );
free(args);
return NULL;
next_arg:;
}
return args;
}
void app_args_release( struct app_args* args )
{
free(args->http_settings.bind_address);
free(args->domain);
free(args->tor_hidden_service);
free(args->user_agent);
free(args);
}