Hi.

This is my first mail to this list, so hello all. I am doing C++
during daytime for a small company in Germany since nearly 4 years now
but I wrestle with that language a bit longer (since the Visual Studio
6.0 days, uh), well, and never really did a lot of C. There are a few
things about Rust I must say I really like. I am poking around with
rustc since a few weeks, having some fun in the late hours after work.
So much for the introduction.

The question: I have a typical C function that takes a pointer to a
struct as argument. Since a Rust record is binary compatible with a C
struct I can do something like this:


type stat = {
   st_dev: dev_t,         // ID of device containing file
   st_ino: ino_t,         // inode number
   st_mode: mode_t,       // protection
   st_nlink: nlink_t,     // number of hard links
   st_uid: uid_t,         // user ID of owner
   st_gid: gid_t,         // group ID of owner
   st_rdev: dev_t,        // device ID (if special file)
   st_size: off_t,        // total size, in bytes
   st_blksize: blksize_t, // block size for file system I/O
   st_blocks: blkcnt_t,   // number of blocks allocated
   st_atime: time_t,      // time of last access
   st_mtime: time_t,      // time of last modification
   st_ctime: time_t       // time of last status change
};

#[link_name = "c"]
native mod sys {

   // standard C library is already linked with Rust programs
   #[nolink]
   fn stat(filename: *c_char, buf: *stat) -> c_int;
}


This might compile and link fine on a POSIX system. However, since I
don't have to include any header like <sys/stat.h> with Rust I can do
something like this:


type stat = {
    garbage: c_int,         // something wrong here
};

fn create_stat() -> stat {
    ret {
        garbage: 0 as c_int
    }
}

#[link_name = "c"]
native mod sys {
    #[nolink]
    fn stat(filename: *c_char, buf: *stat) -> c_int;
}

fn main() {
    let s = "README.txt";
    let buf = create_stat();
    str::as_c_str(s, {|nbuf|
        sys::stat(nbuf, ptr::addr_of(buf))
    });
}


Which will compile and run ...and probably segfault very soon.

While declaring a record in a Rust program is very straightforward it
is cumbersome to retype all the information already present in C
header files, if not dangerous when the structures are not as expected
at runtime. Is there any way to actually get the declaration from a C
header in Rust, i.e. by using a  #include statement or to get any
compile time error when the types are not as expected? Am I missing
something?

Benjamin
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to