[PATCH 2/4] rvi-sota-client_git: add RVI SOTA client

leon.anavi at konsulko.com leon.anavi at konsulko.com
Thu Mar 31 09:39:33 EDT 2016


From: Leon Anavi <leon.anavi at konsulko.com>

Build and deploy sota_client and a systemd service.
Fix run.sh and force sota_client to listen anywhere instead
of possible unknown host sota-client if SOTA_CLIENT_ADDR
is not set. Use crate dbus-rs version 0.1.2 with fixed
casts of c_char raw pointers for ARM. The recipe depends
on meta-rust.

Signed-off-by: Leon Anavi <leon.anavi at konsulko.com>
---
 ...ast-correctly-c_char-raw-pointers-for-ARM.patch | 146 +++++++++++++++++++++
 ...en-anywhere-if-SOTA_CLIENT_ADDR-is-not-se.patch |  32 +++++
 .../rvi-sota-client/rvi-sota-client.service        |   9 ++
 .../rvi-sota-client/rvi-sota-client_git.bb         |  46 +++++++
 4 files changed, 233 insertions(+)
 create mode 100644 meta-genivi-demo/recipes-sota/rvi-sota-client/files/dbus-rs/0001-Cast-correctly-c_char-raw-pointers-for-ARM.patch
 create mode 100644 meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client/0001-run.sh-Listen-anywhere-if-SOTA_CLIENT_ADDR-is-not-se.patch
 create mode 100644 meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client/rvi-sota-client.service
 create mode 100644 meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb

diff --git a/meta-genivi-demo/recipes-sota/rvi-sota-client/files/dbus-rs/0001-Cast-correctly-c_char-raw-pointers-for-ARM.patch b/meta-genivi-demo/recipes-sota/rvi-sota-client/files/dbus-rs/0001-Cast-correctly-c_char-raw-pointers-for-ARM.patch
new file mode 100644
index 0000000..2d3dbed
--- /dev/null
+++ b/meta-genivi-demo/recipes-sota/rvi-sota-client/files/dbus-rs/0001-Cast-correctly-c_char-raw-pointers-for-ARM.patch
@@ -0,0 +1,146 @@
+From 768202d3223813e71848758ecafcfeab276d9101 Mon Sep 17 00:00:00 2001
+From: Leon Anavi <leon.anavi at konsulko.com>
+Date: Sat, 12 Mar 2016 17:52:02 +0200
+Subject: [PATCH] Cast correctly c_char raw pointers for ARM
+
+Fix the build of crate dbus-rs (version 0.1.2) for ARM
+with correct casts of c_char raw pointers.
+
+Signed-off-by: Leon Anavi <leon.anavi at konsulko.com>
+---
+ src/lib.rs     | 18 +++++++++---------
+ src/message.rs | 10 +++++-----
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/src/lib.rs b/src/lib.rs
+index aac9c0f..8134dc4 100644
+--- a/src/lib.rs
++++ b/src/lib.rs
+@@ -60,7 +60,7 @@ unsafe impl Send for Error {}
+ 
+ fn c_str_to_slice(c: & *const libc::c_char) -> Option<&str> {
+     if *c == ptr::null() { None }
+-    else { std::str::from_utf8( unsafe { CStr::from_ptr(*c).to_bytes() }).ok() }
++    else { std::str::from_utf8( unsafe { CStr::from_ptr(*c as *const _).to_bytes() }).ok() }
+ }
+ 
+ fn to_c_str(n: &str) -> CString { CString::new(n.as_bytes()).unwrap() }
+@@ -72,7 +72,7 @@ impl Error {
+         let m = to_c_str(&message.replace("%","%%"));
+         let mut e = Error::empty();
+ 
+-        unsafe { ffi::dbus_set_error(e.get_mut(), n.as_ptr(), m.as_ptr()) };
++        unsafe { ffi::dbus_set_error(e.get_mut(), n.as_ptr()  as *const _, m.as_ptr()  as *const _) };
+         e
+     }
+ 
+@@ -272,21 +272,21 @@ impl Connection {
+         };
+         let r = unsafe {
+             let user_data: *mut libc::c_void = std::mem::transmute(&*self.i);
+-            ffi::dbus_connection_try_register_object_path(self.conn(), p.as_ptr(), &vtable, user_data, e.get_mut())
++            ffi::dbus_connection_try_register_object_path(self.conn(), p.as_ptr() as *const _, &vtable, user_data, e.get_mut())
+         };
+         if r == 0 { Err(e) } else { Ok(()) }
+     }
+ 
+     pub fn unregister_object_path(&self, path: &str) {
+         let p = to_c_str(path);
+-        let r = unsafe { ffi::dbus_connection_unregister_object_path(self.conn(), p.as_ptr()) };
++        let r = unsafe { ffi::dbus_connection_unregister_object_path(self.conn(), p.as_ptr() as *const _) };
+         if r == 0 { panic!("Out of memory"); }
+     }
+ 
+     pub fn list_registered_object_paths(&self, path: &str) -> Vec<String> {
+         let p = to_c_str(path);
+         let mut clist: *mut *mut libc::c_char = ptr::null_mut();
+-        let r = unsafe { ffi::dbus_connection_list_registered(self.conn(), p.as_ptr(), &mut clist) };
++        let r = unsafe { ffi::dbus_connection_list_registered(self.conn(), p.as_ptr() as *const _, &mut clist) };
+         if r == 0 { panic!("Out of memory"); }
+         let mut v = Vec::new();
+         let mut i = 0;
+@@ -306,28 +306,28 @@ impl Connection {
+     pub fn register_name(&self, name: &str, flags: u32) -> Result<RequestNameReply, Error> {
+         let mut e = Error::empty();
+         let n = to_c_str(name);
+-        let r = unsafe { ffi::dbus_bus_request_name(self.conn(), n.as_ptr(), flags, e.get_mut()) };
++        let r = unsafe { ffi::dbus_bus_request_name(self.conn(), n.as_ptr() as *const _, flags, e.get_mut()) };
+         if r == -1 { Err(e) } else { Ok(unsafe { std::mem::transmute(r) }) }
+     }
+ 
+     pub fn release_name(&self, name: &str) -> Result<ReleaseNameReply, Error> {
+         let mut e = Error::empty();
+         let n = to_c_str(name);
+-        let r = unsafe { ffi::dbus_bus_release_name(self.conn(), n.as_ptr(), e.get_mut()) };
++        let r = unsafe { ffi::dbus_bus_release_name(self.conn(), n.as_ptr() as *const _, e.get_mut()) };
+         if r == -1 { Err(e) } else { Ok(unsafe { std::mem::transmute(r) }) }
+     }
+ 
+     pub fn add_match(&self, rule: &str) -> Result<(), Error> {
+         let mut e = Error::empty();
+         let n = to_c_str(rule);
+-        unsafe { ffi::dbus_bus_add_match(self.conn(), n.as_ptr(), e.get_mut()) };
++        unsafe { ffi::dbus_bus_add_match(self.conn(), n.as_ptr() as *const _, e.get_mut()) };
+         if e.name().is_some() { Err(e) } else { Ok(()) }
+     }
+ 
+     pub fn remove_match(&self, rule: &str) -> Result<(), Error> {
+         let mut e = Error::empty();
+         let n = to_c_str(rule);
+-        unsafe { ffi::dbus_bus_remove_match(self.conn(), n.as_ptr(), e.get_mut()) };
++        unsafe { ffi::dbus_bus_remove_match(self.conn(), n.as_ptr() as *const _, e.get_mut()) };
+         if e.name().is_some() { Err(e) } else { Ok(()) }
+     }
+ 
+diff --git a/src/message.rs b/src/message.rs
+index 23871f8..e3dd021 100644
+--- a/src/message.rs
++++ b/src/message.rs
+@@ -126,7 +126,7 @@ fn iter_append_array(i: &mut ffi::DBusMessageIter, a: &[MessageItem], t: TypeSig
+     let mut subiter = new_dbus_message_iter();
+     let atype = to_c_str(&t);
+ 
+-    assert!(unsafe { ffi::dbus_message_iter_open_container(i, ffi::DBUS_TYPE_ARRAY, atype.as_ptr(), &mut subiter) } != 0);
++    assert!(unsafe { ffi::dbus_message_iter_open_container(i, ffi::DBUS_TYPE_ARRAY, atype.as_ptr() as *const _, &mut subiter) } != 0);
+     for item in a.iter() {
+ //        assert!(item.type_sig() == t);
+         item.iter_append(&mut subiter);
+@@ -148,7 +148,7 @@ fn iter_append_struct(i: &mut ffi::DBusMessageIter, a: &[MessageItem]) {
+ fn iter_append_variant(i: &mut ffi::DBusMessageIter, a: &MessageItem) {
+     let mut subiter = new_dbus_message_iter();
+     let atype = to_c_str(&format!("{}", a.array_type() as u8 as char));
+-    assert!(unsafe { ffi::dbus_message_iter_open_container(i, ffi::DBUS_TYPE_VARIANT, atype.as_ptr(), &mut subiter) } != 0);
++    assert!(unsafe { ffi::dbus_message_iter_open_container(i, ffi::DBUS_TYPE_VARIANT, atype.as_ptr()  as *const _, &mut subiter) } != 0);
+     a.iter_append(&mut subiter);
+     assert!(unsafe { ffi::dbus_message_iter_close_container(i, &mut subiter) } != 0);
+ }
+@@ -481,7 +481,7 @@ impl Message {
+         init_dbus();
+         let (d, p, i, m) = (to_c_str(destination), to_c_str(path), to_c_str(iface), to_c_str(method));
+         let ptr = unsafe {
+-            ffi::dbus_message_new_method_call(d.as_ptr(), p.as_ptr(), i.as_ptr(), m.as_ptr())
++            ffi::dbus_message_new_method_call(d.as_ptr() as *const _, p.as_ptr() as *const _, i.as_ptr() as *const _, m.as_ptr() as *const _)
+         };
+         if ptr == ptr::null_mut() { None } else { Some(Message { msg: ptr} ) }
+     }
+@@ -490,7 +490,7 @@ impl Message {
+         init_dbus();
+         let (p, i, m) = (to_c_str(path), to_c_str(iface), to_c_str(method));
+         let ptr = unsafe {
+-            ffi::dbus_message_new_signal(p.as_ptr(), i.as_ptr(), m.as_ptr())
++            ffi::dbus_message_new_signal(p.as_ptr() as *const _, i.as_ptr() as *const _, m.as_ptr() as *const _)
+         };
+         if ptr == ptr::null_mut() { None } else { Some(Message { msg: ptr} ) }
+     }
+@@ -502,7 +502,7 @@ impl Message {
+ 
+     pub fn new_error(m: &Message, error_name: &str, error_message: &str) -> Option<Message> {
+         let (en, em) = (to_c_str(error_name), to_c_str(error_message));
+-        let ptr = unsafe { ffi::dbus_message_new_error(m.msg, en.as_ptr(), em.as_ptr()) };
++        let ptr = unsafe { ffi::dbus_message_new_error(m.msg, en.as_ptr() as *const _, em.as_ptr() as *const _) };
+         if ptr == ptr::null_mut() { None } else { Some(Message { msg: ptr} ) }
+     }
+ 
+-- 
+2.1.4
+
diff --git a/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client/0001-run.sh-Listen-anywhere-if-SOTA_CLIENT_ADDR-is-not-se.patch b/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client/0001-run.sh-Listen-anywhere-if-SOTA_CLIENT_ADDR-is-not-se.patch
new file mode 100644
index 0000000..78017dd
--- /dev/null
+++ b/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client/0001-run.sh-Listen-anywhere-if-SOTA_CLIENT_ADDR-is-not-se.patch
@@ -0,0 +1,32 @@
+From d24c8daad6af49fa9851f6658086cd017bd4d548 Mon Sep 17 00:00:00 2001
+From: Leon Anavi <leon.anavi at konsulko.com>
+Date: Sat, 12 Mar 2016 17:16:04 +0200
+Subject: [PATCH] run.sh: Listen anywhere if SOTA_CLIENT_ADDR is not set
+
+Force sota_client to listen anywhere instead of
+on the possibly unknown host sota-client if
+SOTA_CLIENT_ADDR is not set.
+
+Signed-off-by: Leon Anavi <leon.anavi at konsulko.com>
+---
+ docker/run.sh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/docker/run.sh b/docker/run.sh
+index 995ac8b..250ca82 100755
+--- a/docker/run.sh
++++ b/docker/run.sh
+@@ -9,8 +9,8 @@ export DBUS_SESSION_BUS_ADDRESS
+ export DBUS_SESSION_BUS_PID
+ 
+ LOGLEVEL=${LOGLEVEL:-"info"}
+-SOTA_CLIENT="${SOTA_CLIENT_ADDR:-sota-client}:${SOTA_CLIENT_PORT:-9080}"
++SOTA_CLIENT="${SOTA_CLIENT_ADDR:-0.0.0.0}:${SOTA_CLIENT_PORT:-9080}"
+ RVI="${RVI:-http://rvi-client:8901}"
+ 
+ export RUST_LOG=${RUST_LOG:-"sota_client=$LOGLEVEL"}
+-/bin/sota_client -c /var/sota/client.toml -r "$RVI" -e "$SOTA_CLIENT"
++/usr/bin/sota_client -c /var/sota/client.toml -r "$RVI" -e "$SOTA_CLIENT"
+-- 
+2.1.4
+
diff --git a/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client/rvi-sota-client.service b/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client/rvi-sota-client.service
new file mode 100644
index 0000000..d99f9d6
--- /dev/null
+++ b/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client/rvi-sota-client.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=RVI SOTA Client
+
+[Service]
+User=root
+ExecStart=/usr/bin/run.sh
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb b/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb
new file mode 100644
index 0000000..07386bf
--- /dev/null
+++ b/meta-genivi-demo/recipes-sota/rvi-sota-client/rvi-sota-client_git.bb
@@ -0,0 +1,46 @@
+DESCRIPTION = "SOTA Reference Implementation project - Client"
+HOMEPAGE = "https://github.com/advancedtelematic/rvi_sota_client"
+LICENSE = "MPL-2.0"
+
+inherit cargo systemd
+
+SRC_URI = "git://github.com/advancedtelematic/rvi_sota_client.git;protocol=https \
+           file://rvi-sota-client.service \
+           file://0001-run.sh-Listen-anywhere-if-SOTA_CLIENT_ADDR-is-not-se.patch \
+          "
+SRCREV="57e803803691acab8e443f1631767edaec9da10f"
+LIC_FILES_CHKSUM="file://LICENSE;md5=65d26fcc2f35ea6a181ac777e42db1ea"
+
+S = "${WORKDIR}/git"
+
+BBCLASSEXTEND = "native"
+
+DEPENDS += "dbus"
+RDEPENDS_${PN} += "dbus-lib libcrypto libssl"
+
+SYSTEMD_SERVICE_${PN} = "rvi-sota-client.service"
+
+do_install_append() {
+ install -m 0755 -p -D ${S}/docker/client.toml ${D}/var/sota/client.toml
+ install -m 0755 -p -D ${S}/docker/run.sh ${D}${prefix}/bin/run.sh
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+  install -p -D ${WORKDIR}/rvi-sota-client.service ${D}${systemd_unitdir}/system/rvi-sota-client.service
+ fi
+}
+
+FILES_${PN} += "/var/sota/"
+FILES_${PN} += "/var/sota/client.toml"
+FILES_${PN} += "${prefix}/bin/"
+FILES_${PN} += "${prefix}/bin/run.sh"
+
+## dbus-rs
+SRC_URI += "\
+        git://github.com/diwic/dbus-rs.git;protocol=https;name=dbus-rs;destsuffix=dbus-rs \
+        file://dbus-rs/0001-Cast-correctly-c_char-raw-pointers-for-ARM.patch;patchdir=../dbus-rs \
+"
+
+# 0.1.2
+SRCREV_dbus-rs = "c2c4c98adcf9949992ac5b0050bf17afe10868c9"
+
+SRCREV_FORMAT .= "_dbus-rs"
+EXTRA_OECARGO_PATHS += "${WORKDIR}/dbus-rs"
-- 
2.1.4




More information about the genivi-projects mailing list