From 17ff2c7b0b5b877b11358315c19fa0943f62de66 Mon Sep 17 00:00:00 2001 From: Moritz Angermann Date: Wed, 12 Jan 2022 07:03:07 +0000 Subject: [PATCH] Add cardano-node-capi This adds a basic foreign export library for the node. Providing the `void runNode(int argc, char ** argv)` as the c entry point. Arguments are parsed the same as the command line cardano-node. --- cabal.project | 1 + cardano-node-capi/CHANGELOG.md | 5 ++++ cardano-node-capi/cardano-node-capi.cabal | 19 ++++++++++++ cardano-node-capi/src/Node.hs | 35 +++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 cardano-node-capi/CHANGELOG.md create mode 100644 cardano-node-capi/cardano-node-capi.cabal create mode 100644 cardano-node-capi/src/Node.hs diff --git a/cabal.project b/cabal.project index 01cfb61940c..4413015c96b 100644 --- a/cabal.project +++ b/cabal.project @@ -5,6 +5,7 @@ packages: cardano-cli cardano-client-demo cardano-node + cardano-node-capi cardano-node-chairman cardano-submit-api cardano-testnet diff --git a/cardano-node-capi/CHANGELOG.md b/cardano-node-capi/CHANGELOG.md new file mode 100644 index 00000000000..8ad773b084e --- /dev/null +++ b/cardano-node-capi/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for cardano-node-c + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/cardano-node-capi/cardano-node-capi.cabal b/cardano-node-capi/cardano-node-capi.cabal new file mode 100644 index 00000000000..650fd4028ba --- /dev/null +++ b/cardano-node-capi/cardano-node-capi.cabal @@ -0,0 +1,19 @@ +cabal-version: 3.0 + +name: cardano-node-capi +version: 0.1.0.0 +description: ffi c library around the full node +author: IOHK +maintainer: operations@iohk.io + +extra-source-files: CHANGELOG.md + +library + exposed-modules: Node + build-depends: base + , aeson + , bytestring + , cardano-node + , optparse-applicative-fork + hs-source-dirs: src + default-language: Haskell2010 diff --git a/cardano-node-capi/src/Node.hs b/cardano-node-capi/src/Node.hs new file mode 100644 index 00000000000..7b8682708b6 --- /dev/null +++ b/cardano-node-capi/src/Node.hs @@ -0,0 +1,35 @@ +module Node where + +import Data.Aeson (eitherDecodeStrict) +import Cardano.Node.Run (runNode) + +import Foreign.Ptr (Ptr) +import Foreign.C (CString, peekCString) +import Foreign.Marshal.Array (peekArray) +import Data.ByteString.Char8 (pack) + +import System.IO (hSetBuffering, BufferMode (LineBuffering), stdout) + +import Options.Applicative +import Cardano.Node.Parsers (nodeCLIParser, parserHelpHeader, parserHelpOptions, + renderHelpDoc) + +-- allow setting stdout to linebuffering if needed +foreign export ccall setLineBuffering :: IO () +setLineBuffering :: IO () +setLineBuffering = hSetBuffering stdout LineBuffering + +-- | @crunNode@ is an exported C entry point to start a node. +-- We parese the same arguments as the node CLI, but allow to +-- pass the argumnets as @char *argv[]@ from C. +foreign export ccall "runNode" crunNode :: Int -> Ptr CString -> IO () +crunNode :: Int -> Ptr CString -> IO () +crunNode argc argv = peekArray argc argv >>= mapM peekCString >>= \args -> + case execParserPure pref opts args of + Success pnc -> runNode pnc + Failure f -> print f + CompletionInvoked _ -> putStrLn "Completion Invoked?" + where + pref = prefs showHelpOnEmpty + opts = info nodeCLIParser + ( fullDesc <> progDesc "Start node of the Cardano blockchain." )