sandbox-ipc 0.4.0

An IPC implementation with an eye toward enabling privilege separation.
Documentation
use platform::SendableFd;

use std::io;
use std::os::unix::prelude::*;

use serde::{Serialize, Deserialize, Serializer, Deserializer};
use platform::libc;
use platform::mio::{Evented, Poll, Token, Ready, PollOpt};
use platform::mio::unix::EventedFd;

#[derive(Debug)]
pub struct ScopedFd(pub libc::c_int);

impl Drop for ScopedFd {
    fn drop(&mut self) {
        unsafe { libc::close(self.0); }
    }
}

impl FromRawFd for ScopedFd {
    unsafe fn from_raw_fd(fd: libc::c_int) -> Self {
        ScopedFd(fd)
    }
}

impl AsRawFd for ScopedFd {
    fn as_raw_fd(&self) -> libc::c_int {
        self.0
    }
}

impl Serialize for ScopedFd {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
        where S: Serializer
    {
        SendableFd(self.0).serialize(serializer)
    }
}

impl<'de> Deserialize<'de> for ScopedFd {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
        where D: Deserializer<'de>
    {
        Ok(ScopedFd(SendableFd::deserialize(deserializer)?.0))
    }
}

impl Evented for ScopedFd {
    fn register(&self,
                poll: &Poll,
                token: Token,
                events: Ready,
                opts: PollOpt) -> io::Result<()> {
        EventedFd(&self.0).register(poll, token, events, opts)
    }

    fn reregister(&self,
                  poll: &Poll,
                  token: Token,
                  events: Ready,
                  opts: PollOpt) -> io::Result<()> {
        EventedFd(&self.0).reregister(poll, token, events, opts)
    }

    fn deregister(&self, poll: &Poll) -> io::Result<()> {
        EventedFd(&self.0).deregister(poll)
    }
}