// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#![deny(warnings)]

use fdio::{fdio_sys, ioctl_raw, make_ioctl};
use fuchsia_zircon::{self as zx, HandleBased};
use std::fs::File;
use std::os::raw;
use std::os::unix::io::AsRawFd;

pub fn connect_wlanphy_device(device: &File) -> Result<zx::Channel, zx::Status> {
    let (local, remote) = zx::Channel::create()?;
    let hnd = remote.into_raw();

    // This call is safe because the handle is never used after this call, and the output buffer is
    // null.
    unsafe {
        match ioctl_raw(
            device.as_raw_fd(),
            IOCTL_WLANPHY_CONNECT,
            &hnd as *const _ as *const raw::c_void,
            ::std::mem::size_of::<zx::sys::zx_handle_t>(),
            ::std::ptr::null_mut(),
            0,
        ) as i32
        {
            e if e < 0 => Err(zx::Status::from_raw(e)),
            e => Ok(e),
        }?;
    }
    Ok(local)
}

pub fn connect_wlaniface_device(device: &File) -> Result<zx::Channel, zx::Status> {
    let mut hnd: zx::sys::zx_handle_t = zx::sys::ZX_HANDLE_INVALID;

    // This call is safe because the callee does not retain any data from the call, and the return
    // value ensures that the handle is a valid handle to a zx::channel.
    unsafe {
        match ioctl_raw(
            device.as_raw_fd(),
            IOCTL_WLAN_GET_CHANNEL,
            ::std::ptr::null(),
            0,
            &mut hnd as *mut _ as *mut raw::c_void,
            ::std::mem::size_of::<zx::sys::zx_handle_t>(),
        ) as i32
        {
            e if e < 0 => Err(zx::Status::from_raw(e)),
            e => Ok(e),
        }?;
        Ok(From::from(zx::Handle::from_raw(hnd)))
    }
}

const IOCTL_WLANPHY_CONNECT: raw::c_int =
    make_ioctl(fdio_sys::IOCTL_KIND_SET_HANDLE, fdio_sys::IOCTL_FAMILY_WLANPHY, 0);

const IOCTL_WLAN_GET_CHANNEL: raw::c_int =
    make_ioctl(fdio_sys::IOCTL_KIND_GET_HANDLE, fdio_sys::IOCTL_FAMILY_WLAN, 0);
