Skip to content
Snippets Groups Projects
Commit c4da9deb authored by Olivier Dion's avatar Olivier Dion
Browse files

agent: Use scm_schell() for execution of the agent

Change-Id: Ief1fd8fc1058f77784260d5be7a116d13ce06480
parent 8468af34
No related branches found
No related tags found
No related merge requests found
......@@ -31,7 +31,7 @@ stage, Guile must be already available.
cd daemon
./configure --enable-agent # you can other options if needed such as --enable-debug
cd test/agent
make agent
make check
```
# Running the agent
......
......@@ -32,50 +32,30 @@
/* std */
#include <fstream>
/* Guile helpers */
static SCM
main_body(void* path_raw)
static void
fini()
{
const char* path = (const char*)path_raw;
if (0 == strcmp("-", path)) {
scm_c_primitive_load("/dev/stdin");
} else {
scm_c_primitive_load(path);
}
return SCM_UNDEFINED;
Agent::instance().fini();
DRing::fini();
}
static SCM
main_catch(void* nil, SCM key_sym, SCM rest_lst)
{
(void) nil;
SCM fmt_str = scm_from_utf8_string("Guile exception `~a`: ~a");
SCM args_lst = scm_list_2(key_sym, rest_lst);
SCM to_print_str = scm_simple_format(SCM_BOOL_F, fmt_str, args_lst);
char* to_print_raw = scm_to_locale_string(to_print_str);
AGENT_ERR("%s\n", to_print_raw);
free(to_print_raw);
return SCM_UNDEFINED;
}
struct args {
int argc;
char** argv;
};
void*
main_inner(void* agent_config_raw) /* In Guile context */
main_inner(void* args_raw) /* In Guile context */
{
struct args* args = (struct args*)args_raw;
install_scheme_primitives();
Agent::instance().init();
scm_internal_catch(SCM_BOOL_T, main_body, agent_config_raw, main_catch, nullptr);
atexit(fini);
Agent::instance().fini();
scm_shell(args->argc, args->argv);
return nullptr;
}
......@@ -91,12 +71,15 @@ main(int argc, char* argv[])
setenv("GUILE_LOAD_PATH", ".", 1);
/* NOTE! It's very important to initialize the daemon before entering Guile!!! */
DRing::init(DRing::InitFlag(DRing::DRING_FLAG_DEBUG | DRing::DRING_FLAG_CONSOLE_LOG));
DRing::init(DRing::InitFlag(DRing::DRING_FLAG_DEBUG));
AGENT_ASSERT(DRing::start(""), "Failed to start daemon");
/* Entering guile context */
scm_with_guile(main_inner, argv[1]);
struct args args;
DRing::fini();
args.argc = argc;
args.argv = argv;
/* Entering guile context */
scm_with_guile(main_inner, (void*)&args);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment