tAdd the Zenroom dependency and implement a ZenroomExec wrapper. - tordam - A library for peer discovery inside the Tor network
 (HTM) git clone https://git.parazyd.org/tordam
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit fed0429355edea309d795101fa670b12d81a3ece
 (DIR) parent c1244f4e38f1d46d25d10688a8ea921cac7cc8ba
 (HTM) Author: parazyd <parazyd@dyne.org>
       Date:   Mon, 29 Oct 2018 14:23:00 +0100
       
       Add the Zenroom dependency and implement a ZenroomExec wrapper.
       
       Diffstat:
         M README.md                           |      13 +++++++++++++
         M pkg/damlib/helpers.go               |      11 +++++++++++
         A pkg/damlib/zenroom.h                |     103 +++++++++++++++++++++++++++++++
       
       3 files changed, 127 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/README.md b/README.md
       t@@ -25,6 +25,7 @@ github.com/go-redis/redis
        ```
        
        #### Python 3
       +
        ```
        https://stem.torproject.org/
        ```
       t@@ -46,3 +47,15 @@ to create hidden services and retrieve hidden service descriptors.
        Redis is our storage backend where information about nodes is held.
        
        Working configurations are provided in the `contrib` directory.
       +
       +
       +#### Zenroom
       +
       +```
       +https://github.com/decodeproject/zenroom
       +```
       +
       +The shared library can be acquired by cloning the above repository and
       +running `make linux-go`, which will compile a `.so` located in
       +`build/go/libzenroomgo.so`. You will then need to install it on your
       +system to a place such as `/usr/lib/`.
 (DIR) diff --git a/pkg/damlib/helpers.go b/pkg/damlib/helpers.go
       t@@ -20,6 +20,12 @@ package damlib
         * along with this source code. If not, see <http://www.gnu.org/licenses/>.
         */
        
       +// #cgo LDFLAGS: -lzenroomgo
       +//
       +// #include <stdlib.h>
       +// #include "zenroom.h"
       +import "C"
       +
        import (
                "bytes"
                "compress/gzip"
       t@@ -79,3 +85,8 @@ func ParseDirs(sl []string, data []byte) []string {
                }
                return sl
        }
       +
       +func ZenroomExec(script, conf, keys, data string, verbosity int) int {
       +        return int(C.zenroom_exec(C.CString(script), C.CString(conf),
       +                C.CString(keys), C.CString(data), C.int(verbosity)))
       +}
 (DIR) diff --git a/pkg/damlib/zenroom.h b/pkg/damlib/zenroom.h
       t@@ -0,0 +1,103 @@
       +/*  Zenroom (DECODE project)
       + *
       + *  (c) Copyright 2017-2018 Dyne.org foundation
       + *  designed, written and maintained by Denis Roio <jaromil@dyne.org>
       + *
       + * This source code is free software; you can redistribute it and/or
       + * modify it under the terms of the GNU Public License as published
       + * by the Free Software Foundation; either version 3 of the License,
       + * or (at your option) any later version.
       + *
       + * This source code is distributed in the hope that it will be useful,
       + * but WITHOUT ANY WARRANTY; without even the implied warranty of
       + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
       + * Please refer to the GNU Public License for more details.
       + *
       + * You should have received a copy of the GNU Public License along
       + * with this source code; if not, write to: Free Software Foundation,
       + * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
       + */
       +
       +#ifndef __ZENROOM_H__
       +#define __ZENROOM_H__
       +
       +/////////////////////////////////////////
       +// high level api: one simple call
       +
       +int zenroom_exec(char *script, char *conf, char *keys,
       +                 char *data, int verbosity);
       +
       +// in case buffers should be used instead of stdout/err file
       +// descriptors, this call defines where to print out the output and
       +// the maximum sizes allowed for it. Output is NULL terminated.
       +int zenroom_exec_tobuf(char *script, char *conf, char *keys,
       +                       char *data, int verbosity,
       +                       char *stdout_buf, size_t stdout_len,
       +                       char *stderr_buf, size_t stderr_len);
       +
       +// to obtain the Abstract Syntax Tree (AST) of a script
       +// (output is in metalua formatted as JSON)
       +int zenroom_parse_ast(char *script, int verbosity,
       +                      char *stdout_buf, size_t stdout_len,
       +                      char *stderr_buf, size_t stderr_len);
       +
       +void set_debug(int lev);
       +
       +////////////////////////////////////////
       +
       +
       +// lower level api: init (exec_line*) teardown
       +
       +// heap initialised by the memory manager
       +typedef struct {
       +        void* (*malloc)(size_t size);
       +        void* (*realloc)(void *ptr, size_t size);
       +        void  (*free)(void *ptr);
       +        void* (*sys_malloc)(size_t size);
       +        void* (*sys_realloc)(void *ptr, size_t size);
       +        void  (*sys_free)(void *ptr);
       +        char  *heap;
       +        size_t heap_size;
       +} zen_mem_t;
       +
       +// zenroom context, also available as "_Z" global in lua space
       +// contents are opaque in lua and available only as lightuserdata
       +typedef struct {
       +        void *lua; // (lua_State*)
       +        zen_mem_t *mem; // memory manager heap
       +
       +        char *stdout_buf;
       +        size_t stdout_len;
       +        size_t stdout_pos;
       +        char *stderr_buf;
       +        size_t stderr_len;
       +        size_t stderr_pos;
       +
       +        int errorlevel;
       +        void *userdata; // anything passed at init (reserved for caller)
       +} zenroom_t;
       +
       +
       +zenroom_t *zen_init(const char *conf, char *keys, char *data);
       +int  zen_exec_script(zenroom_t *Z, const char *script);
       +void zen_teardown(zenroom_t *zenroom);
       +
       +#define UMM_HEAP (64*1024) // 64KiB (masked with 0x7fff)
       +#define MAX_FILE (64*1024) // load max 64KiB files
       +#ifndef MAX_STRING
       +#define MAX_STRING 4097 // max 4KiB strings
       +#endif
       +#define MAX_OCTET 2049 // max 2KiB octets
       +
       +#define LUA_BASELIBNAME "_G"
       +
       +#define ZEN_BITS 8
       +#ifndef SIZE_MAX
       +#if ZEN_BITS == 32
       +#define SIZE_MAX 4294967296
       +#elif ZEN_BITS == 8
       +#define SIZE_MAX 65536
       +#endif
       +#endif
       +
       +#endif