diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000000000000000000000000000000..85477867ff7703065631f66e97a51ff62f794855 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "libdap-server-core"] + path = libdap-server-core + url = https://gitlab.demlabs.net/cellframe/libdap-server-core.git +[submodule "libdap"] + path = libdap + url = https://gitlab.demlabs.net/cellframe/libdap.git +[submodule "libdap-crypto"] + path = libdap-crypto + url = https://gitlab.demlabs.net/cellframe/libdap-crypto.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..31c5bfe7166bf42669cf4f0dd706ff3c2107afe1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,49 @@ +project(DapServerCore C) +cmake_minimum_required(VERSION 2.8) + +set(CMAKE_VERBOSE_MAKEFILE ON) +set(CMAKE_COLOR_MAKEFILE ON) +set(CMAKE_C_STANDARD 11) +set(SUBMODULES_NO_BUILD ON) + +add_subdirectory(libdap) +add_subdirectory(libdap-crypto) +add_subdirectory(libdap-server-core) + +file(GLOB SERVER_CORE_PYTHON_SRCS src/*.c) +file(GLOB SERVER_CORE_PYTHON_HEADERS include/*.h) + +set(Python_ADDITIONAL_VERSIONS 3.7) +find_package (PythonLibs REQUIRED) +#find_package(PkgConfig) +#pkg_check_modules(PC_JSON-C REQUIRED json-c) +include_directories(${PYTHON_INCLUDE_DIR} include/) + +add_library(${PROJECT_NAME} SHARED ${SERVER_CORE_PYTHON_SRCS} ${SERVER_CORE_PYTHON_HEADERS}) + +target_link_libraries(${PROJECT_NAME}) + +target_compile_options( + dap_server_core PRIVATE + "-fpic" +) + +target_compile_options( + dap_core PRIVATE + "-fpic" +) +target_compile_options( + dap_crypto PRIVATE + "-fpic" +) + + +#target_link_libraries(${PROJECT_NAME} dap_core dap_crypto) +#targat_link_libraries(${PROJECT_NAME} dap_server_core) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core) + +#if(BUILD_DAP_PYTHON_TESTS) +# add_subdirectory(test) +# enable_testing() +#endif() + diff --git a/include/dap_events_python.h b/include/dap_events_python.h new file mode 100644 index 0000000000000000000000000000000000000000..7f652fcc26dd894e78ee945ffc0faa56653cc327 --- /dev/null +++ b/include/dap_events_python.h @@ -0,0 +1,83 @@ +#pragma once + +#include "Python.h" +#include "dap_events.h" +#include "dap_events_socket_python.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PyDapEvents{ + PyObject_HEAD + dap_events_t *t_events; +}PyDapEventsObject; + +void PyDapEventsObject_dealloc(PyDapEventsObject *eventsObject); + +PyObject *PyDapEventsObject_new(PyTypeObject *type_object, PyObject *args, PyObject *kwds); + +//PyObject *dap_events_new_py(); +//PyObject *dap_events_delete_py(PyObject *self, PyObject *args); //dap_events_t * sh ); +//void dap_events_socket_remove_and_delete( dap_events_socket_t* a_es ); +PyObject *dap_events_socket_remove_and_delete_py(PyDapEventsObject *self, PyObject *args); //dap_events_socket_t* a_es, bool preserve_inheritor ); + +PyObject *dap_events_kill_socket_py(PyDapEventsObject *self, PyObject *args); //dap_events_socket_t *a_es ); + +PyObject *dap_events_start_py(PyDapEventsObject *self); //dap_events_t *sh ); +PyObject *dap_events_wait_py(PyDapEventsObject *self); //dap_events_t *sh ); + +static PyMethodDef PyDapEventsObject_methods[] = { + {"start", (PyCFunction)dap_events_start_py, METH_NOARGS, ""}, + {"wait", (PyCFunction)dap_events_wait_py, METH_NOARGS, ""}, + {"killSocket", (PyCFunction)dap_events_kill_socket_py, METH_VARARGS, ""}, + {"removeAndDeleteSocket", (PyCFunction)dap_events_socket_remove_and_delete_py, METH_VARARGS, ""}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static PyTypeObject dapEvents_dapEventsType = { + PyVarObject_HEAD_INIT(NULL, 0) + "libDapServerCore.DapEvents", /* tp_name */ + sizeof(PyDapEventsObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)PyDapEventsObject_dealloc,//(destructor)Noddy_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + "DapEvents objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + PyDapEventsObject_methods,//Noddy_methods, /* tp_methods */ + 0,//Noddy_members, /* tp_members */ + 0,//Noddy_getseters, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0,//(initproc)PyDapEventsObject_init,//(initproc)Noddy_init, /* tp_init */ + 0, /* tp_alloc */ + PyDapEventsObject_new,//Noddy_new, /* tp_new */ +}; + +#ifdef __cplusplus +} +#endif diff --git a/include/dap_events_socket_python.h b/include/dap_events_socket_python.h new file mode 100644 index 0000000000000000000000000000000000000000..9795e7e3ecfc91ada1213b1004df6cd09ca9574d --- /dev/null +++ b/include/dap_events_socket_python.h @@ -0,0 +1,96 @@ +#pragma once + +#include "Python.h" +#include "dap_events_socket.h" +#include "dap_events_python.h" +#include "dap_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PyDapEventsSocket{ + PyObject_HEAD + dap_events_socket_t *t_events_socket; +}PyDapEventsSocketObject; + +PyObject *dap_events_socket_create_after_py(PyDapEventsSocketObject *self);//dap_events_socket_t * a_es); + +//PyObject *dap_events_socket_wrap_no_add_py(PyObject *self, PyObject *args);//struct dap_events * a_events, + // int s, dap_events_socket_callbacks_t * a_callbacks); // Create new client and add it to the list + + +PyObject *dap_events_socket_find_py(PyDapEventsSocketObject *self, PyObject *args);//int sock, struct dap_events * sh); // Find client by socket +//PyObject *dap_events_socket_is_ready_to_read_py(PyDapEventsSocketObject *self);//dap_events_socket_t * sc); +//PyObject *dap_events_socket_is_ready_to_write_py(PyDapEventsSocketObject *self);//dap_events_socket_t * sc); +PyObject *dap_events_socket_set_readable_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t * sc,bool is_ready); +PyObject *dap_events_socket_set_writable_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t * sc,bool is_ready); + +PyObject *dap_events_socket_write_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t *sc, const void * data, size_t data_size); +PyObject *dap_events_socket_write_f_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t *sc, const char * format,...); +PyObject *dap_events_socket_read_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t *sc, void * data, size_t data_size); + +PyObject *dap_events_socket_delete_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t *sc,bool preserve_inheritor); // Removes the client from the list + +PyObject *dap_events_socket_shrink_buf_in_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t * cl, size_t shrink_size); + +static PyMethodDef PyDapEventsObjectSocket_methods[] = { + {"createAfter", (PyCFunction)dap_events_socket_create_after_py, METH_NOARGS, ""}, + {"find", (PyCFunction)dap_events_socket_find_py, METH_VARARGS, ""}, +// {"isReadyToRead", (PyCFunction)dap_events_socket_is_ready_to_read_py, METH_NOARGS, ""}, +// {"isReadyToWrite", (PyCFunction)dap_events_socket_is_ready_to_write_py, METH_NOARGS, ""}, + {"setReadable", (PyCFunction)dap_events_socket_set_readable_py, METH_VARARGS, ""}, + {"setWritable", (PyCFunction)dap_events_socket_set_writable_py, METH_VARARGS, ""}, + {"write", (PyCFunction)dap_events_socket_write_py, METH_VARARGS, ""}, + {"writeF", (PyCFunction)dap_events_socket_write_f_py, METH_VARARGS, ""}, + {"read", (PyCFunction)dap_events_socket_read_py, METH_VARARGS, ""}, + {"delete", (PyCFunction)dap_events_socket_delete_py, METH_VARARGS, ""}, + {"shringBufIn", (PyCFunction)dap_events_socket_shrink_buf_in_py, METH_VARARGS, ""}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +static PyTypeObject dapEventsSocket_dapEventsSocketType = { + PyVarObject_HEAD_INIT(NULL, 0) + "libDapServerCore.DapEventsSocket", /* tp_name */ + sizeof(PyDapEventsSocketObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + 0,//(destructor)Noddy_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + "DapEventsSocket objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + PyDapEventsObjectSocket_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0,//(initproc)PyDapEventsObject_init,//(initproc)Noddy_init, /* tp_init */ + 0, /* tp_alloc */ + PyType_GenericNew,//PyDapEventsObject_new,//Noddy_new, /* tp_new */ +}; + +#ifdef __cplusplus +} +#endif diff --git a/include/libdap-server-core-python.h b/include/libdap-server-core-python.h new file mode 100644 index 0000000000000000000000000000000000000000..047549eaf13d1d165ae58b497a8b6c7eedaf4b64 --- /dev/null +++ b/include/libdap-server-core-python.h @@ -0,0 +1,73 @@ +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#include "dap_server.h" +#include "dap_client_remote.h" +#include "dap_events.h" +#include "dap_common.h" +#include "dap_events_python.h" +#include "dap_events_socket_python.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct PyDapServer { + PyObject_HEAD + dap_server_t *t_server; +}PyDapServerObject; + +PyTypeObject dapServer_dapServerType = { + PyVarObject_HEAD_INIT(NULL, 0) + "libDapServerCore.DapServer", /* tp_name */ + sizeof(PyDapServerObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + 0, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + "DapServer objects", /* tp_doc */ +}; + +#define LOG_TAG "libdap-server-core-python" + +static PyObject *dap_server_core_init(PyObject *self, PyObject *args); +static PyObject *dap_server_core_deinit(); + +static PyObject *dap_server_core_loop(PyObject *self, PyObject *args); +static PyObject *dap_server_core_listen(PyObject *self, PyObject *args); + +static PyMethodDef DapServerCorePythonMethods[] = { + {"init", dap_server_core_init, METH_VARARGS, "Initialization of the DAP (Deus Applicaions Prototypes) server core library"}, + {"deinit", dap_server_core_deinit, METH_NOARGS, "Deinitialization of the DAP (Deus Applicaions Prototypes) server core library"}, + {"loop", dap_server_core_loop, METH_VARARGS, ""}, + {"listen", dap_server_core_listen, METH_VARARGS, ""}, + {NULL, NULL, 0, NULL} +}; + +static struct PyModuleDef dapservercorepythonmodule = { + PyModuleDef_HEAD_INIT, + "libDapServerCore", /* name of module */ + NULL, /* module documentation, may be NULL */ + -1, /* size of per-interpreter state of the module, + or -1 if the module keeps state in global variables. */ + DapServerCorePythonMethods +}; + +PyMODINIT_FUNC PyInit_libDapServerCore(void); + + +#ifdef __cplusplus +} +#endif diff --git a/libdap b/libdap new file mode 160000 index 0000000000000000000000000000000000000000..67993d1f4cec44de464acee32a4d4f71d51c7e7d --- /dev/null +++ b/libdap @@ -0,0 +1 @@ +Subproject commit 67993d1f4cec44de464acee32a4d4f71d51c7e7d diff --git a/libdap-crypto b/libdap-crypto new file mode 160000 index 0000000000000000000000000000000000000000..6249887fdd5c9ed88eb26c1e10f853ea9f7001b6 --- /dev/null +++ b/libdap-crypto @@ -0,0 +1 @@ +Subproject commit 6249887fdd5c9ed88eb26c1e10f853ea9f7001b6 diff --git a/libdap-server-core b/libdap-server-core new file mode 160000 index 0000000000000000000000000000000000000000..6778521f9f646e2985994e63f470067b3e2c1e48 --- /dev/null +++ b/libdap-server-core @@ -0,0 +1 @@ +Subproject commit 6778521f9f646e2985994e63f470067b3e2c1e48 diff --git a/src/dap_events_python.c b/src/dap_events_python.c new file mode 100644 index 0000000000000000000000000000000000000000..aee762b3eb4dc65439aa4878106610c9331e0d4d --- /dev/null +++ b/src/dap_events_python.c @@ -0,0 +1,44 @@ +#include "dap_events_python.h" + +PyObject *PyDapEventsObject_new(PyTypeObject *type_object, PyObject *args, PyObject *kwds){ + PyDapEventsObject *new_EO = (PyDapEventsObject*)PyType_GenericNew(type_object, args, kwds); + new_EO->t_events = dap_events_new(); + return (PyObject *)new_EO; +} + +void PyDapEventsObject_dealloc(PyDapEventsObject *eventsObject){ + dap_events_delete(eventsObject->t_events); + Py_TYPE(eventsObject)->tp_free((PyObject*)eventsObject); +} + +//void dap_events_socket_remove_and_delete( dap_events_socket_t* a_es ); +PyObject *dap_events_socket_remove_and_delete_py(PyDapEventsObject *self, PyObject *args){ + PyObject *in_obj; + PyObject *in_bool; + if (!PyArg_ParseTuple(args, "O|O", &in_obj, &in_bool)){ + return NULL; + } + bool preserve_inheritor = true; + if (in_bool == Py_False) + preserve_inheritor = false; + dap_events_socket_remove_and_delete(((PyDapEventsSocketObject*)in_obj)->t_events_socket, preserve_inheritor); + return PyLong_FromLong(0); +} + +PyObject *dap_events_kill_socket_py(PyDapEventsObject *self, PyObject *args){ + PyObject *in_obj; + if (!PyArg_ParseTuple(args, "O", &in_obj)){ + return NULL; + } + dap_events_kill_socket(((PyDapEventsSocketObject*)in_obj)->t_events_socket); + return PyLong_FromLong(0); +} + +PyObject *dap_events_start_py(PyDapEventsObject *self){ + int32_t result = dap_events_start(self->t_events); + return PyLong_FromLong(result); +} +PyObject *dap_events_wait_py(PyDapEventsObject *self){ + int32_t result = dap_events_wait(self->t_events); + return PyLong_FromLong(result); +} diff --git a/src/dap_events_socket_python.c b/src/dap_events_socket_python.c new file mode 100644 index 0000000000000000000000000000000000000000..f44de06fa7743ef046dcefc29373117d277f7f4b --- /dev/null +++ b/src/dap_events_socket_python.c @@ -0,0 +1,142 @@ +#include "dap_events_socket_python.h" + +PyObject *dap_events_socket_create_after_py(PyDapEventsSocketObject *self){ + if (self->t_events_socket == NULL){ + return NULL; + } + dap_events_socket_create_after(self->t_events_socket); + return PyLong_FromLong(0); +} + +//PyObject *dap_events_socket_wrap_no_add_py(PyObject *self, PyObject *args){ +// return PyLong_FromLong(0); +//} + + +PyObject *dap_events_socket_find_py(PyDapEventsSocketObject *self, PyObject *args){ + if (self->t_events_socket != NULL){ + return NULL; + } + int socket; + PyObject *in_object; + if (!PyArg_ParseTuple(args, "i|O", &socket, &in_object)){ + return NULL; + } + self->t_events_socket = dap_events_socket_find(socket, ((PyDapEventsObject*)in_object)->t_events); + return PyLong_FromLong(0); +} + +//PyObject *dap_events_socket_is_ready_to_read_py(PyDapEventsSocketObject *self){ +// bool result = dap_events_socket_is_ready_to_read(self->t_events_socket); +// if (result) +// return Py_BuildValue("O", Py_True); +// else +// return Py_BuildValue("O", Py_False); +//} +//PyObject *dap_events_socket_is_ready_to_write_py(PyDapEventsSocketObject *self){ +// bool result = dap_events_socket_is_ready_to_write(self->t_events_socket); +// if (result) +// return Py_BuildValue("O", Py_True); +// else +// return Py_BuildValue("O", Py_False); +//} +PyObject *dap_events_socket_set_readable_py(PyDapEventsSocketObject *self, PyObject *args){ + if (self->t_events_socket == NULL){ + return NULL; + } + PyObject *l_is_ready; + if (!PyArg_ParseTuple(args, "O", &l_is_ready)){ + return NULL; + } + bool is_ready = true; + if (l_is_ready == Py_False) + is_ready = false; + dap_events_socket_set_readable(self->t_events_socket, is_ready); + return PyLong_FromLong(0); +} +PyObject *dap_events_socket_set_writable_py(PyDapEventsSocketObject *self, PyObject *args){ + if (self->t_events_socket == NULL){ + return NULL; + } + PyObject *l_is_ready; + if (!PyArg_ParseTuple(args, "O", &l_is_ready)){ + return NULL; + } + bool is_ready = true; + if (l_is_ready == Py_False) + is_ready = false; + dap_events_socket_set_writable(self->t_events_socket, is_ready); + return PyLong_FromLong(0); +} + +PyObject *dap_events_socket_write_py(PyDapEventsSocketObject *self, PyObject *args){ + if (self->t_events_socket == NULL){ + return NULL; + } + PyBytesObject *in_bytes; + size_t in_size; + if (!PyArg_ParseTuple(args, "S|n", &in_bytes, &in_size)){ + return NULL; + } + char *in_v_bytes = PyBytes_AsString((PyObject*)in_bytes); + size_t res_size = dap_events_socket_write(self->t_events_socket, + in_v_bytes, in_size); + return Py_BuildValue("n", res_size); +} +PyObject *dap_events_socket_write_f_py(PyDapEventsSocketObject *self, PyObject *args){ + if (self->t_events_socket == NULL){ + return NULL; + } + const char *format; + PyTupleObject *pto; + if (!PyArg_ParseTuple(args, "s|O", &format, &pto)){ + return NULL; + } + va_list ap; + if (!PyArg_VaParse(args, format, ap)){ + return NULL; + } + size_t res_size = dap_events_socket_write_f(self->t_events_socket, format, ap); + return Py_BuildValue("n", res_size); +} +PyObject *dap_events_socket_read_py(PyDapEventsSocketObject *self, PyObject *args){ + if (self->t_events_socket == NULL){ + return NULL; + } + size_t in_size; + if (!PyArg_ParseTuple(args, "n", &in_size)){ + return NULL; + } + void *res = DAP_NEW_SIZE(void*, in_size); + size_t res_size = dap_events_socket_read(self->t_events_socket, res, in_size); + PyBytesObject *res_obj = (PyBytesObject*)PyBytes_FromString(res); + return Py_BuildValue("nS", res_size, res_obj); +} + +PyObject *dap_events_socket_delete_py(PyDapEventsSocketObject *self, PyObject *args){ + if (self->t_events_socket == NULL){ + return NULL; + } + PyObject *in_bool; + if (!PyArg_ParseTuple(args, "O", &in_bool)){ + return NULL; + } + bool boolean = true; + if (in_bool == Py_False) + boolean = false; + dap_events_socket_delete(self->t_events_socket, boolean); + return PyLong_FromLong(0); +} + +PyObject *dap_events_socket_shrink_buf_in_py(PyDapEventsSocketObject *self, PyObject *args){ + if (self->t_events_socket == NULL){ + return NULL; + } + size_t in_size; + if(!PyArg_ParseTuple(args, "n", &in_size)){ + return NULL; + } + dap_events_socket_shrink_buf_in(self->t_events_socket, in_size); + return PyLong_FromLong(0); +} + diff --git a/src/libdap-server-core-python.c b/src/libdap-server-core-python.c new file mode 100644 index 0000000000000000000000000000000000000000..ab2bf51bc7a2fce231cd213f8208a5d5fca63c86 --- /dev/null +++ b/src/libdap-server-core-python.c @@ -0,0 +1,89 @@ +#include "libdap-server-core-python.h" + + +static PyObject *dap_server_core_init(PyObject *self, PyObject *args){ + uint32_t l_thread_cnt; + size_t conn_t; + dap_common_init("CVNT", "CVNT.log"); + if (!PyArg_ParseTuple(args, "I|n", &l_thread_cnt, &conn_t)){ + return NULL; + } + int32_t result = dap_server_init(l_thread_cnt); + if ( result != 0 ) { + log_it( L_CRITICAL, "Can't init socket server module" ); + } + dap_events_init(l_thread_cnt, conn_t); + dap_client_remote_init(); + return PyLong_FromLong(result); +} +static PyObject *dap_server_core_deinit(){ + dap_client_remote_deinit(); + dap_server_deinit(); + dap_events_deinit(); + return PyLong_FromLong(0); +} + +static PyObject *dap_server_core_loop(PyObject *self, PyObject *args){ + PyObject *obj_server; + if (!PyArg_ParseTuple(args, "O", &obj_server)){ + return NULL; + } + int32_t result = dap_server_loop(((PyDapServerObject*)obj_server)->t_server); + log_it( result ? L_CRITICAL : L_NOTICE, "Server loop stopped with return code %d", ((PyDapServerObject*)obj_server)->t_server ); + return PyLong_FromLong(result); +} + +static PyObject *dap_server_core_listen(PyObject *self, PyObject *args){ + const char *addr; + uint16_t port; + uint16_t type; + if (!PyArg_ParseTuple(args, "s|H|H", &addr, &port, &type)){ + return NULL; + } + if (type > 1) + return NULL; + PyObject *obj = _PyObject_New(&dapServer_dapServerType); + ((PyDapServerObject*)obj)->t_server = dap_server_listen(addr, port, type); + return Py_BuildValue("O", obj); +} + +PyMODINIT_FUNC PyInit_libDapServerCore(void){ + dapServer_dapServerType.tp_new = PyType_GenericNew; + //dapEvents_dapEventsType.tp_new = PyType_GenericNew; + dapEventsSocket_dapEventsSocketType.tp_new = PyType_GenericNew; + if (PyType_Ready(&dapServer_dapServerType) < 0 || PyType_Ready(&dapEvents_dapEventsType) < 0 + || PyType_Ready(&dapEventsSocket_dapEventsSocketType) < 0) + return NULL; + + PyObject *module = PyModule_Create(&dapservercorepythonmodule); + + PyModule_AddObject(module, "DapEvents", (PyObject*)&dapEvents_dapEventsType); + PyModule_AddObject(module, "DapEventsSocket", (PyObject*)&dapEventsSocket_dapEventsSocketType); + + return module; +} + +int main(int argc, char **argv) { + wchar_t *program = Py_DecodeLocale(argv[0], NULL); + if (program == NULL) { + fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); + exit(1); + } + + /* Add a built-in module, before Py_Initialize */ + PyImport_AppendInittab("libDapServerCore", PyInit_libDapServerCore); + + /* Pass argv[0] to the Python interpreter */ + Py_SetProgramName(program); + + /* Initialize the Python interpreter. Required. */ + Py_Initialize(); + + /* Optionally import the module; alternatively, + import can be deferred until the embedded script + imports it. */ + PyImport_ImportModule("libDapServerCore"); + + PyMem_RawFree(program); + return 0; +} diff --git a/test/test.py b/test/test.py new file mode 100644 index 0000000000000000000000000000000000000000..2780abb163e6d8cdd65d2ec4dc757b4af707f65c --- /dev/null +++ b/test/test.py @@ -0,0 +1,6 @@ +import libDapServerCore as server + +print ("Start wrapping libdap server core python module") +res_i = server.init(1, 0) +rc = server.listen("0.0.0.0", 3307, 0) +server.deinit()