65 #include <sys/resource.h>
79 return (stat(filename, &buffer) == 0);
83 amxd_object_t* root) {
84 const char* odl_str = NULL;
87 odl_str = amxc_var_constcast(cstring_t, GET_ARG(&parser->config,
AMXRT_COPT_ODL));
89 retval = amxo_parser_parse_string(parser, odl_str, root);
102 amxc_string_t opt_include;
104 amxc_string_init(&opt_include, 0);
105 when_str_empty(ext_dir, exit);
107 amxc_string_setf(&opt_include,
"#include '%s';", ext_dir);
109 retval = amxo_parser_parse_string(parser, amxc_string_get(&opt_include, 0), root);
112 amxc_string_clean(&opt_include);
117 char* name = amxc_var_dyncast(cstring_t, GET_ARG(&parser->config,
AMXRT_COPT_NAME));
119 char* cfg_dir = amxc_var_dyncast(cstring_t, GET_ARG(&parser->config,
AMXRT_COPT_CFG_DIR));
123 amxc_string_t include;
124 amxc_string_init(&include, 32);
125 amxc_string_appendf(&include,
"%s/%s/%s/%s.odl", prefix, cfg_dir, name, name);
127 if(stat(amxc_string_get(&include, 0), &sb) == 0) {
128 retval = amxo_parser_parse_file(parser, amxc_string_get(&include, 0), root);
133 amxc_string_clean(&include);
146 amxd_object_t* root) {
152 while(index < argc) {
153 retval = amxo_parser_parse_file(parser, argv[index++], root);
165 amxc_string_t pidfile;
169 amxc_string_init(&pidfile, 64);
172 amxc_string_appendf(&pidfile,
"/var/run/%s.pid", name);
173 pf = fopen(amxc_string_get(&pidfile, 0),
"w");
174 if((pf == NULL) && (errno == EACCES)) {
175 amxc_string_reset(&pidfile);
176 amxc_string_appendf(&pidfile,
"/var/run/%s/%s.pid", name, name);
177 pf = fopen(amxc_string_get(&pidfile, 0),
"w");
180 fprintf(pf,
"%d", pid);
188 amxc_string_clean(&pidfile);
193 amxc_string_t pidfile;
194 amxc_string_init(&pidfile, 64);
196 amxc_string_appendf(&pidfile,
"/var/run/%s.pid", name);
198 amxc_string_reset(&pidfile);
199 amxc_string_appendf(&pidfile,
"/var/run/%s/%s.pid", name, name);
203 unlink(amxc_string_get(&pidfile, 0));
206 amxc_string_clean(&pidfile);
213 char* name = amxc_var_dyncast(cstring_t, GET_ARG(&parser->config,
AMXRT_COPT_NAME));
218 retval = setpriority(PRIO_PROCESS, pid, priority);
219 when_failed(retval, leave);
221 if(pidfile && (name != NULL)) {
227 openlog(GET_CHAR(&parser->config,
AMXRT_COPT_NAME), LOG_CONS | LOG_PID, LOG_USER);
228 syslog(LOG_USER | LOG_INFO,
"** MARK **");
242 when_failed(retval, leave);
244 if(parser->post_includes != NULL) {
245 retval = amxo_parser_invoke_entry_points(parser, dm, AMXO_START);
246 when_failed(retval, leave);
247 retval = amxo_parser_invoke_entry_points(parser, dm, AMXO_ODL_LOADED);
248 when_failed(retval, leave);
250 retval = amxo_parser_invoke_entry_points(parser, dm, AMXO_START);
251 when_failed(retval, leave);
254 retval = amxo_parser_start_synchronize(parser);
256 amxrt_print_error(
"Runtime - synchronizations failed to start (nr failed = %d)\n", retval);
268 while(amxp_signal_read() == 0) {
271 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
275 UNUSED
const amxc_var_t*
const d,
276 UNUSED
void*
const p) {
282 amxc_var_set_type(req, AMXC_VAR_ID_LIST);
286 amxp_sigmngr_resume(&dm->sigmngr);
314 amxd_dm_init(&
rt.
dm);
327 amxp_sigmngr_add_signal(NULL,
"config:changed");
328 amxp_sigmngr_add_signal(NULL,
"wait:done");
329 amxp_sigmngr_add_signal(NULL,
"wait:cancel");
338 when_failed(retval, leave);
340 when_failed(retval, leave);
351 amxc_var_t* syssigs = NULL;
356 when_failed_status(retval, leave, retval = 10);
358 when_failed_status(retval, leave, retval = 11);
364 when_failed_status(retval, leave, retval = 12);
366 syssigs = GET_ARG(&
rt.
parser.config,
"system-signals");
367 if(syssigs != NULL) {
372 when_failed_status(retval, leave, retval = -13);
379 amxd_dm_clean(&
rt.
dm);
380 amxo_resolver_import_close_all();
381 amxb_be_remove_all();
391 amxc_var_t* req = NULL;
392 const amxc_llist_t* lreq = NULL;
395 lreq = amxc_var_constcast(amxc_llist_t, req);
397 if((lreq == NULL) || amxc_llist_is_empty(lreq)) {
399 when_failed_status(retval, leave, retval = -14);
403 amxp_sigmngr_suspend(&
rt.
dm.sigmngr);
406 amxc_var_for_each(path, req) {
407 const char* txt_path = GET_CHAR(path, NULL);
408 if(amxd_dm_findf(&
rt.
dm,
"%s", txt_path) == NULL) {
410 retval = amxb_wait_for_object(txt_path);
411 if(retval != AMXB_STATUS_OK) {
419 when_failed_status(retval, leave, retval = -14);
443 char* name = amxc_var_dyncast(cstring_t, GET_ARG(&parser->config,
AMXRT_COPT_NAME));
448 amxo_parser_stop_synchronize(parser);
450 if((req == NULL) || amxc_llist_is_empty(amxc_var_constcast(amxc_llist_t, req))) {
451 amxo_parser_rinvoke_entry_points(parser, dm, AMXO_STOP);
454 amxb_set_config(NULL);
468 amxd_object_t* root = NULL;
469 bool dm_eventing_enabled =
false;
472 amxp_sigmngr_enable(&
rt.
dm.sigmngr, dm_eventing_enabled);
473 root = amxd_dm_get_root(&
rt.
dm);
475 when_failed(retval, leave);
477 when_failed(retval, leave);
479 when_failed(retval, leave);
481 amxo_parser_scan_mib_dirs(&
rt.
parser, NULL);
482 amxp_sigmngr_enable(&
rt.
dm.sigmngr,
true);
492 when_failed(retval, leave);
501 retval = daemon(1, 0);
502 when_failed(retval, leave);
506 when_failed(retval, leave);
508 when_failed(retval, leave);
510 when_failed(retval, leave);
517 if(amxc_var_type_of(syssigs) == AMXC_VAR_ID_LIST) {
518 amxc_var_for_each(var, syssigs) {
519 uint32_t sigid = amxc_var_dyncast(uint32_t, var);
521 ( sigid != SIGALRM) &&
522 ( sigid != SIGTERM) &&
523 ( sigid != SIGINT)) {
524 amxp_syssig_enable(sigid,
true);
528 uint32_t sigid = amxc_var_dyncast(uint32_t, syssigs);
530 ( sigid != SIGALRM) &&
531 ( sigid != SIGTERM) &&
532 ( sigid != SIGINT)) {
533 amxp_syssig_enable(sigid,
true);
static int amxrt_try_default_odl(amxo_parser_t *parser, amxd_object_t *root)
static int amxrt_register(amxo_parser_t *parser, amxd_dm_t *dm)
static int amxrt_parse_odl_extensions(amxo_parser_t *parser, amxd_object_t *root)
static void amxrt_handle_events(amxd_dm_t *dm, amxo_parser_t *parser)
static int amxrt_apply_process_settings(amxo_parser_t *parser)
static void amxrt_wait_done(UNUSED const char *const s, UNUSED const amxc_var_t *const d, UNUSED void *const p)
static int amxrt_parse_odl_string(amxo_parser_t *parser, amxd_object_t *root)
static void amxrt_remove_pid_file(const char *name)
static bool amxrt_file_exists(const char *filename)
static int amxrt_create_pid_file(pid_t pid, const char *name)
static int amxrt_parse_odl_files(amxo_parser_t *parser, int argc, char *argv[], int index, amxd_object_t *root)
amxrt_t * amxrt_get(void)
#define AMXRT_COPT_PID_FILE
#define AMXRT_COPT_EXT_DIR
#define AMXRT_COPT_SUSPEND
int(* amxrt_arg_fn_t)(amxc_var_t *config, int arg_id, const char *value)
#define AMXRT_COPT_CFG_DIR
#define AMXRT_COPT_DUMP_CONFIG
#define AMXRT_COPT_PRIORITY
#define AMXRT_COPT_PREFIX_PATH
#define AMXRT_COPT_DUMP_CAPS
#define AMXRT_COPT_REQUIRES
#define AMXRT_COPT_HANDLE_EVENTS
#define AMXRT_COPT_DAEMON
PRIVATE void amxrt_print_failure(amxo_parser_t *parser, const char *string)
PRIVATE void amxrt_cmd_line_add_default_options(void)
PRIVATE int amxrt_connection_connect_all(amxo_parser_t *parser)
PRIVATE void amxrt_config_add_options(amxo_parser_t *parser)
PRIVATE void amxrt_print_message(const char *fmt,...)
PRIVATE int amxrt_connection_load_backends(amxc_var_t *config)
PRIVATE void amxrt_connection_detect_sockets(amxc_var_t *config)
PRIVATE int amxrt_connection_listen_all(amxo_parser_t *parser)
PRIVATE void amxrt_print_error(const char *fmt,...)
PRIVATE int amxrt_connection_register_dm(amxo_parser_t *parser, amxd_dm_t *dm)
PRIVATE void amxrt_print_configuration(void)
void amxrt_cmd_line_options_reset(void)
Removes all default options.
int amxrt_el_destroy(void)
Cleans-up the event loop components.
int amxrt_el_start(void)
Starts the event loop.
int amxrt_el_stop(void)
Stops the event loop.
int amxrt_el_create(void)
Creates and initializes all needed event loop components.
void amxrt_caps_dump(void)
Dumps the capabilities of the process.
int amxrt_caps_apply(void)
Apply the user, group and capabilities as defined in the configuration.
void amxrt_config_scan_backend_dirs(void)
Scan backend directories for available backends.
amxc_var_t * amxrt_get_config(void)
Gets the htable variant containing the configuration options.
int amxrt_connect(void)
Connects to all bus sockets.
int amxrt_init(int argc, char *argv[], amxrt_arg_fn_t fn)
Initializes the ambiorix runtime.
int amxrt(int argc, char *argv[], amxrt_arg_fn_t fn)
This function can create full ambiorix application (data model provider or client).
int amxrt_dm_save_load_main(int reason, amxd_dm_t *dm, amxo_parser_t *parser)
The data model auto load and save module.
void amxrt_delete(void)
Clean-up ambiorix runtime.
int amxrt_load_odl_files(int argc, char *argv[], int index)
Load odls files mentioned on the command line or the default odl file.
int amxrt_run(void)
Starts the event loop.
amxd_dm_t * amxrt_get_dm(void)
Gets the runtime data model storage.
void amxrt_new(void)
Create the ambiorix runtime.
void amxrt_stop(void)
Stops the runtime.
amxo_parser_t * amxrt_get_parser(void)
Gets runtime odl parser.
void amxrt_enable_syssigs(amxc_var_t *syssigs)
Enables system signals that should be monitored by the eventloop.
int amxrt_register_or_wait(void)
Register the data model or wait for required data model objects.
int amxrt_config_init(int argc, char *argv[], int *index, amxrt_arg_fn_t fn)
Initializes the default runtime configuration.
amxc_llist_t cmd_line_args
amxc_llist_t event_sources
amxc_var_t forced_options
static void handle_events(void)