Skip to content

Commit

Permalink
detects presence of udev_hwdb_* functions in build script
Browse files Browse the repository at this point in the history
  • Loading branch information
dcuddeback committed May 7, 2015
1 parent c43b18a commit 5ba10b9
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 16 deletions.
45 changes: 44 additions & 1 deletion build.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,48 @@
extern crate pkg_config;

use std::fs::{self,File};
use std::path::Path;
use std::process::Command;

use std::io::prelude::*;

fn check_func(function_name: &str) -> bool {
let test_file_path = format!("target/build/check_{}.rs", function_name);
let test_file_name = Path::new(&test_file_path[..]);

fs::create_dir_all("target/build").unwrap();

{
let mut test_file = File::create(test_file_name).unwrap();

writeln!(&mut test_file, "extern \"C\" {{").unwrap();
writeln!(&mut test_file, " fn {}();", function_name).unwrap();
writeln!(&mut test_file, "}}").unwrap();
writeln!(&mut test_file, "").unwrap();
writeln!(&mut test_file, "fn main() {{").unwrap();
writeln!(&mut test_file, " unsafe {{").unwrap();
writeln!(&mut test_file, " {}();", function_name).unwrap();
writeln!(&mut test_file, " }}").unwrap();
writeln!(&mut test_file, "}}").unwrap();
}

let output = Command::new("rustc").
arg(test_file_name).
arg("--out-dir").arg("target/build/").
arg("-l").arg("udev").
output().unwrap();

output.status.success()
}

fn main() {
pkg_config::find_library("libudev").unwrap();
pkg_config::find_library("libudev").unwrap();

if check_func("udev_hwdb_new") {
println!("cargo:rustc-cfg=hwdb");
println!("cargo:hwdb=true");
}
else {
println!("cargo:hwdb=false");
}
}
20 changes: 15 additions & 5 deletions examples/hwdb_query.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
extern crate libudev_sys as udev;
extern crate libc;

use std::env;
use std::str;

use std::ffi::{CString,CStr};

use libc::c_char;
#[cfg(hwdb)] use std::env;
#[cfg(hwdb)] use std::str;
#[cfg(hwdb)] use std::ffi::{CString,CStr};
#[cfg(hwdb)] use libc::c_char;

#[cfg(hwdb)]
fn main() {

let args = env::args().collect::<Vec<_>>();

if args.len() != 2 {
Expand All @@ -34,6 +35,7 @@ fn main() {
}
}

#[cfg(hwdb)]
unsafe fn query_hwdb(hwdb: *mut udev::udev_hwdb, query: &CString) {
println!("{:>30}: {:?}", "query", query);

Expand All @@ -42,6 +44,7 @@ unsafe fn query_hwdb(hwdb: *mut udev::udev_hwdb, query: &CString) {
udev::udev_hwdb_unref(hwdb);
}

#[cfg(hwdb)]
unsafe fn print_results(list_entry: *mut udev::udev_list_entry) {
if list_entry.is_null() {
return;
Expand All @@ -55,6 +58,13 @@ unsafe fn print_results(list_entry: *mut udev::udev_list_entry) {
print_results(udev::udev_list_entry_get_next(list_entry));
}

#[cfg(hwdb)]
unsafe fn unwrap_str<'a>(ptr: *const c_char) -> &'a str {
str::from_utf8(CStr::from_ptr(ptr).to_bytes()).unwrap()
}


#[cfg(not(hwdb))]
fn main() {
println!("hwdb is not supported by native libudev");
}
31 changes: 21 additions & 10 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

extern crate libc;

use libc::{c_void,c_int,c_uint,c_char,c_ulonglong,size_t,dev_t};
use libc::{c_void,c_int,c_char,c_ulonglong,size_t,dev_t};

#[cfg(hwdb)]
pub use hwdb::*;


#[repr(C)]
Expand All @@ -23,9 +26,6 @@ pub struct udev_enumerate;
#[repr(C)]
pub struct udev_queue;

#[repr(C)]
pub struct udev_hwdb;

extern "C" {
// udev
pub fn udev_new() -> *mut udev;
Expand Down Expand Up @@ -116,12 +116,23 @@ extern "C" {
pub fn udev_queue_get_fd(udev_queue: *mut udev_queue) -> c_int;
pub fn udev_queue_flush(udev_queue: *mut udev_queue) -> c_int;

// udev_hwdb
pub fn udev_hwdb_ref(hwdb: *mut udev_hwdb) -> *mut udev_hwdb;
pub fn udev_hwdb_unref(hwdb: *mut udev_hwdb) -> *mut udev_hwdb;
pub fn udev_hwdb_new(udev: *mut udev) -> *mut udev_hwdb;
pub fn udev_hwdb_get_properties_list_entry(hwdb: *mut udev_hwdb, modalias: *const c_char, flags: c_uint) -> *mut udev_list_entry;

// udev_util
pub fn udev_util_encode_string(str: *const c_char, str_enc: *mut c_char, len: size_t) -> c_int;
}


#[cfg(hwdb)]
mod hwdb {
use super::libc::{c_uint,c_char};
use super::{udev,udev_list_entry};

#[repr(C)]
pub struct udev_hwdb;

extern "C" {
pub fn udev_hwdb_ref(hwdb: *mut udev_hwdb) -> *mut udev_hwdb;
pub fn udev_hwdb_unref(hwdb: *mut udev_hwdb) -> *mut udev_hwdb;
pub fn udev_hwdb_new(udev: *mut udev) -> *mut udev_hwdb;
pub fn udev_hwdb_get_properties_list_entry(hwdb: *mut udev_hwdb, modalias: *const c_char, flags: c_uint) -> *mut udev_list_entry;
}
}

0 comments on commit 5ba10b9

Please sign in to comment.