This is a C plugin for Cap'n Proto, an efficient protocol for sharing data and capabilities.
This project is currently NOT MAINTAINED. If you are interested in taking over maintenance and/or need this for some project, please look at issue #55
No releases will be made. PRs may sit unreviewed for multiple years. PRs MAY get merged WITHOUT ANY REVIEW, as a last ditch attempt to not waste people's efforts on PRs. This means things may break completely.
The generated code assumes all input to be trusted. Do NOT use with untrusted input! There is currently no code in place to check if structures/pointers are within bounds.
This is only the code generator plugin, to properly make use of it you need to download, build and install capnpc and then build and install this project and then you can utilize it as:
capnpc compiler/test.capnp -oc
git clone --recurse-submodules https://github.com/opensourcerouting/c-capnproto
cd c-capnproto
autoreconf -f -i -s
./configure
make
make check
git clone --recurse-submodules https://github.com/opensourcerouting/c-capnproto
cd c-capnproto
meson setup build
meson compile -C build
build/capn-test
The compiler
directory contains the C language plugin (capnpc-c
) for use with the capnp
tool: https://capnproto.org/capnp-tool.html.
capnp
will by default search $PATH
for capnpc-c
- if it's on your PATH, you can generate code for your schema as follows:
capnp compile -o c myschema.capnp
Otherwise, you can specify the path to the c plugin:
capnp compile -o ./capnpc-c myschema.capnp
capnp
generates a C struct that corresponds to each capn proto struct, along with read/write functions that convert to/from capn proto form.
If you want accessor functions for struct members, use attribute fieldgetset
in your .capnp
file as follows:
using C = import "${c-capnproto}/compiler/c.capnp";
$C.fieldgetset;
struct MyStruct {}
See the unit tests in tests/example-test.cpp
.
The example schema file is tests/addressbook.capnp
.
The tests are written in C++, but only use C features.
You need to compile these runtime library files and link them into your own project's binaries:
Your include path must contain the runtime library directory
lib
. Header file lib/capnp_c.h
contains
the public interfaces of the library.
Using make-based builds, make may try to compile ${x}.capnp
from
${x}.capnp.c
using its built-in rule for compiling ${y}
from
${y}.c
. You can either disable make's built-in compile rules or just
this specific case with the no-op rule: %.capnp: ;
.
For further reference, please see the other unit tests in tests
, and header file lib/capnp_c.h
.
The project quagga-capnproto
uses c-capnproto
and contains some good examples, as found with this github repository search:
- Serialization in function
bgp_notify_send()
in filequagga-capnproto/bgpd/bgp_zmq.c
- Deserialization in function
qzc_callback()
in filequagga-capnproto/lib/qzc.c
This is a merge of 3 forks of James McKaskill's great work, which has been untouched for a while: