Skip to content

Commit c69a015

Browse files
committed
Initial commit
0 parents  commit c69a015

File tree

7 files changed

+216
-0
lines changed

7 files changed

+216
-0
lines changed

Cargo.toml

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
[package]
2+
name = "runng-sys"
3+
version = "1.1.1-rc.2"
4+
authors = ["Jake W <[email protected]>"]
5+
6+
description = "Bindings to nng (Nanomsg-Next-Generation) aka Nanomsg2"
7+
keywords = ["nng", "nanomsg", "zeromq"]
8+
categories = ["network-programming", "external-ffi-bindings", "os"]
9+
license = "MIT"
10+
repository = "https://github.com/jeikabu/runng"
11+
readme = "README.md"
12+
edition = "2018"
13+
14+
[badges]
15+
appveyor = { repository = "jake-ruyi/runng", branch = "master", service = "github" }
16+
travis-ci = { repository = "jeikabu/runng", branch = "master" }
17+
18+
[features]
19+
default = ["stats"]
20+
# Use ninja for cmake generator
21+
ninja = []
22+
# Enable NNG stats
23+
stats = []
24+
# Enable TLS (requires mbedTLS)
25+
tls = []
26+
27+
[build-dependencies]
28+
cmake = "0.1"
29+
bindgen = "0.40"
30+
31+
[package.metadata.docs.rs]
32+
all-features = false

README.md

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
2+
# runng-sys
3+
4+
Rust FFI bindings to [NNG](https://github.com/nanomsg/nng).
5+
6+
## Usage
7+
8+
Version of this crate tracks NNG: `<NNG_version>-rc.<crate_version>` (e.g. `1.1.1-rc.2`).
9+
10+
To use the __latest crate__ for the most recent __stable version of NNG__ (1.1.1), in `Cargo.toml`:
11+
```toml
12+
runng-sys = "1.1.1-rc"
13+
```
14+
15+
For a more ergonomic API to NNG see [runng](https://crates.io/crates/runng).
16+
17+
## Examples
18+
```rust
19+
use runng_sys::*;
20+
use std::ffi::CString;
21+
22+
#[test]
23+
fn it_works() {
24+
unsafe {
25+
let url = CString::new("inproc://test").unwrap();
26+
let url = url.as_bytes_with_nul().as_ptr() as *const i8;
27+
28+
// Reply socket
29+
let mut rep_socket = nng_socket { id: 0 };
30+
assert_eq!(0, nng_rep0_open(&mut rep_socket));
31+
assert_eq!(0, nng_listen(rep_socket, url, std::ptr::null_mut(), 0));
32+
33+
// Request socket
34+
let mut req_socket = nng_socket { id: 0 };
35+
assert_eq!(0, nng_req0_open(&mut req_socket));
36+
assert_eq!(0, nng_dial(req_socket, url, std::ptr::null_mut(), 0));
37+
38+
// Send message
39+
let mut req_msg: *mut nng_msg = std::ptr::null_mut();
40+
assert_eq!(0, nng_msg_alloc(&mut req_msg, 0));
41+
// Add a value to the body of the message
42+
let val = 0x12345678;
43+
assert_eq!(0, nng_msg_append_u32(req_msg, val));
44+
assert_eq!(0, nng_sendmsg(req_socket, req_msg, 0));
45+
46+
// Receive it
47+
let mut recv_msg: *mut nng_msg = std::ptr::null_mut();
48+
assert_eq!(0, nng_recvmsg(rep_socket, &mut recv_msg, 0));
49+
// Remove our value from the body of the received message
50+
let mut recv_val: u32 = 0;
51+
assert_eq!(0, nng_msg_trim_u32(recv_msg, &mut recv_val));
52+
assert_eq!(val, recv_val);
53+
// Can't do this because nng uses network order (big-endian)
54+
//assert_eq!(val, *(nng_msg_body(recv_msg) as *const u32));
55+
56+
nng_close(req_socket);
57+
nng_close(rep_socket);
58+
}
59+
}
60+
```

build.rs

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use cmake::Config;
2+
use std::{env, path::PathBuf};
3+
4+
fn main() {
5+
// Compile-time features
6+
let generator = if cfg!(feature = "ninja") {
7+
"Ninja"
8+
} else {
9+
"Unix Makefiles"
10+
};
11+
let stats = if cfg!(feature = "stats") { "ON" } else { "OFF" };
12+
let tls = if cfg!(feature = "tls") { "ON" } else { "OFF" };
13+
14+
// Run cmake to build nng
15+
let dst = Config::new("nng")
16+
.generator(generator)
17+
.define("CMAKE_BUILD_TYPE", "Release")
18+
.define("NNG_TESTS", "OFF")
19+
.define("NNG_TOOLS", "OFF")
20+
.define("NNG_ENABLE_STATS", stats)
21+
.define("NNG_ENABLE_TLS", tls)
22+
.build();
23+
24+
// Check output of `cargo build --verbose`, should see something like:
25+
// -L native=/path/runng/target/debug/build/runng-sys-abc1234/out
26+
// That contains output from cmake
27+
println!(
28+
"cargo:rustc-link-search=native={}",
29+
dst.join("lib").display()
30+
);
31+
// Tell rustc to use nng static library
32+
println!("cargo:rustc-link-lib=static=nng");
33+
34+
// https://rust-lang-nursery.github.io/rust-bindgen
35+
// https://docs.rs/bindgen
36+
let bindings = bindgen::Builder::default()
37+
.header("wrapper.h")
38+
// This is needed if use `#include <nng.h>` instead of `#include "path/nng.h"`
39+
//.clang_arg("-Inng/src/")
40+
.generate()
41+
.expect("Unable to generate bindings");
42+
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
43+
bindings
44+
.write_to_file(out_path.join("bindings.rs"))
45+
.expect("Couldn't write bindings");
46+
}

nng

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 8a9fd805d96201c780610b765f9e6dd9f2eda642

src/lib.rs

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Suppress the flurry of warnings caused by using "C" naming conventions
2+
#![allow(non_upper_case_globals)]
3+
#![allow(non_camel_case_types)]
4+
#![allow(non_snake_case)]
5+
// Disable clippy since this is all bindgen generated code
6+
#![allow(clippy::all)]
7+
8+
// This matches bindgen::Builder output
9+
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));

tests/tests.rs

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#[cfg(test)]
2+
mod tests {
3+
4+
use runng_sys::*;
5+
use std::ffi::CString;
6+
7+
#[test]
8+
fn it_works() {
9+
unsafe {
10+
let url = CString::new("inproc://test").unwrap();
11+
let url = url.as_bytes_with_nul().as_ptr() as *const i8;
12+
13+
// Reply socket
14+
let mut rep_socket = nng_socket { id: 0 };
15+
assert_eq!(0, nng_rep0_open(&mut rep_socket));
16+
assert_eq!(0, nng_listen(rep_socket, url, std::ptr::null_mut(), 0));
17+
18+
// Request socket
19+
let mut req_socket = nng_socket { id: 0 };
20+
assert_eq!(0, nng_req0_open(&mut req_socket));
21+
assert_eq!(0, nng_dial(req_socket, url, std::ptr::null_mut(), 0));
22+
23+
// Send message
24+
let mut req_msg: *mut nng_msg = std::ptr::null_mut();
25+
assert_eq!(0, nng_msg_alloc(&mut req_msg, 0));
26+
// Add a value to the body of the message
27+
let val = 0x12345678;
28+
assert_eq!(0, nng_msg_append_u32(req_msg, val));
29+
assert_eq!(0, nng_sendmsg(req_socket, req_msg, 0));
30+
31+
// Receive it
32+
let mut recv_msg: *mut nng_msg = std::ptr::null_mut();
33+
assert_eq!(0, nng_recvmsg(rep_socket, &mut recv_msg, 0));
34+
// Remove our value from the body of the received message
35+
let mut recv_val: u32 = 0;
36+
assert_eq!(0, nng_msg_trim_u32(recv_msg, &mut recv_val));
37+
assert_eq!(val, recv_val);
38+
// Can't do this because nng uses network order (big-endian)
39+
//assert_eq!(val, *(nng_msg_body(recv_msg) as *const u32));
40+
41+
nng_close(req_socket);
42+
nng_close(rep_socket);
43+
}
44+
}
45+
46+
}

wrapper.h

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "nng/src/nng.h"
2+
3+
// protocols
4+
#include "nng/src/protocol/bus0/bus.h"
5+
#include "nng/src/protocol/pair0/pair.h"
6+
#include "nng/src/protocol/pair1/pair.h"
7+
#include "nng/src/protocol/pipeline0/pull.h"
8+
#include "nng/src/protocol/pipeline0/push.h"
9+
#include "nng/src/protocol/pubsub0/pub.h"
10+
#include "nng/src/protocol/pubsub0/sub.h"
11+
#include "nng/src/protocol/reqrep0/rep.h"
12+
#include "nng/src/protocol/reqrep0/req.h"
13+
#include "nng/src/protocol/survey0/respond.h"
14+
#include "nng/src/protocol/survey0/survey.h"
15+
16+
// transports
17+
#include "nng/src/transport/inproc/inproc.h"
18+
#include "nng/src/transport/ipc/ipc.h"
19+
#include "nng/src/transport/tcp/tcp.h"
20+
#include "nng/src/transport/tls/tls.h"
21+
#include "nng/src/transport/ws/websocket.h"
22+
#include "nng/src/transport/zerotier/zerotier.h"

0 commit comments

Comments
 (0)