Function nc::msgsnd[][src]

pub fn msgsnd(
    msqid: i32,
    msgq: usize,
    msgsz: size_t,
    msgflg: i32
) -> Result<(), Errno>
Expand description

Append the message to a System V message queue.

const MAX_MTEXT: usize = 1024;

const MTYPE_NULL: isize = 0;
const MTYPE_CLIENT: isize = 1;
const _MTYPE_SERVER: isize = 2;

#[derive(Debug, Clone, Copy)]
struct Message {
    pub mtype: isize,
    pub mtext: [u8; MAX_MTEXT],
}

impl Default for Message {
    fn default() -> Self {
        Message {
            mtype: MTYPE_NULL,
            mtext: [0; MAX_MTEXT],
        }
    }
}

fn main() {
    let key = nc::IPC_PRIVATE;
    let flags = nc::IPC_CREAT | nc::IPC_EXCL | (nc::S_IRUSR | nc::S_IWUSR) as i32;
    let ret = nc::msgget(key, flags);
    assert!(ret.is_ok());
    let msq_id = ret.unwrap();

    // Write to message queue.
    let msg = "Hello, Rust";
    let mut client_msg = Message {
        mtype: MTYPE_CLIENT,
        mtext: [0; MAX_MTEXT],
    };
    let msg_len = msg.len();
    unsafe {
        let src_ptr = msg.as_ptr();
        let dst_ptr = client_msg.mtext.as_mut_ptr();
        core::ptr::copy_nonoverlapping(src_ptr, dst_ptr, msg_len);
    }

    let ret = nc::msgsnd(msq_id, &client_msg as *const Message as usize, msg_len, 0);
    assert!(ret.is_ok());

    // Read from message queue.
    let mut recv_msg = Message::default();
    let ret = nc::msgrcv(
        msq_id,
        &mut recv_msg as *mut Message as usize,
        MAX_MTEXT,
        MTYPE_CLIENT,
        0,
    );
    assert!(ret.is_ok());
    let recv_msg_len = ret.unwrap() as usize;
    assert_eq!(recv_msg_len, msg_len);
    let recv_text = core::str::from_utf8(&recv_msg.mtext[..recv_msg_len]);
    assert!(recv_text.is_ok());
    let recv_text = recv_text.unwrap();
    assert_eq!(recv_text, msg);
    println!("recv text: {}", recv_text);

    let mut buf = nc::msqid_ds_t::default();
    let ret = nc::msgctl(msq_id, nc::IPC_RMID, &mut buf);
    assert!(ret.is_ok());
}