diff --git a/CMakeLists.txt b/CMakeLists.txt index dca31b269..bfa16da18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,7 @@ add_library(${SHARED_LIB} SHARED ${LIB_SRC}) add_executable(${EXE} ${EXE_SRC}) target_link_libraries(${EXE} ${STATIC_LIB} ${LIBS}) +target_link_libraries(${SHARED_LIB} ${LIBS}) add_executable(rcutil daemon/rcutil.cpp) target_link_libraries(rcutil ${STATIC_LIB} ${LIBS}) diff --git a/contrib/py/ffi-example/llarp.py b/contrib/py/ffi-example/llarp.py new file mode 100644 index 000000000..55c50a44e --- /dev/null +++ b/contrib/py/ffi-example/llarp.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + + +from ctypes import * +import signal +import time +import threading + +class LLARP(threading.Thread): + + lib = None + ctx = None + + def signal(self, sig): + if self.ctx and self.lib: + self.lib.llarp_main_signal(self.ctx, int(sig)) + + def run(self): + code = self.lib.llarp_main_run(self.ctx) + print ("llarp_main_run exited with status {}".format(code)) + + +def main(): + llarp = LLARP() + llarp.lib = CDLL("./libllarp.so") + llarp.ctx = llarp.lib.llarp_main_init(b'daemon.ini') + if llarp.ctx: + llarp.start() + try: + while True: + print("busy loop") + time.sleep(1) + except KeyboardInterrupt: + llarp.signal(signal.SIGINT) + finally: + llarp.lib.llarp_main_free(llarp.ctx) + return + +if __name__ == '__main__': + main() + diff --git a/daemon/main.cpp b/daemon/main.cpp index 62ac253b6..3c8f930a8 100644 --- a/daemon/main.cpp +++ b/daemon/main.cpp @@ -17,10 +17,13 @@ main(int argc, char *argv[]) const char *conffname = "daemon.ini"; if(argc > 1) conffname = argv[1]; - - if(llarp_main_init(&ctx, conffname)) + ctx = llarp_main_init(conffname); + int code = 1; + if(ctx) { signal(SIGINT, handle_signal); - return llarp_main_run(ctx); + code = llarp_main_run(ctx); + llarp_main_free(ctx); } + return code; } diff --git a/include/llarp.h b/include/llarp.h index 4daadc5f7..35bd9381f 100644 --- a/include/llarp.h +++ b/include/llarp.h @@ -15,8 +15,8 @@ extern "C" { struct llarp_main; /** initialize application context and load config */ -bool -llarp_main_init(struct llarp_main **ptr, const char *fname); +struct llarp_main * +llarp_main_init(const char *fname); /** handle signal for main context */ void @@ -27,7 +27,7 @@ int llarp_main_run(struct llarp_main *ptr); void -llarp_main_free(struct llarp_main **ptr); +llarp_main_free(struct llarp_main *ptr); #ifdef __cplusplus } diff --git a/llarp/context.cpp b/llarp/context.cpp index d0f7b4f5a..8a5cb8cdd 100644 --- a/llarp/context.cpp +++ b/llarp/context.cpp @@ -211,11 +211,11 @@ struct llarp_main std::unique_ptr< llarp::Context > ctx; }; -bool -llarp_main_init(struct llarp_main **ptr, const char *fname) +struct llarp_main * +llarp_main_init(const char *fname) { if(!fname) - return false; + return nullptr; llarp_main *m = new llarp_main; m->ctx.reset(new llarp::Context(std::cout)); @@ -223,10 +223,9 @@ llarp_main_init(struct llarp_main **ptr, const char *fname) { m->ctx->Close(); delete m; - return false; + return nullptr; } - *ptr = m; - return true; + return m; } void @@ -238,16 +237,13 @@ llarp_main_signal(struct llarp_main *ptr, int sig) int llarp_main_run(struct llarp_main *ptr) { - auto code = ptr->ctx->Run(); - ptr->ctx->Close(); - return code; + return ptr->ctx->Run(); } void -llarp_main_free(struct llarp_main **ptr) +llarp_main_free(struct llarp_main *ptr) { - if(*ptr) - delete *ptr; - *ptr = nullptr; + ptr->ctx->Close(); + delete ptr; } }