Skip to content

Instantly share code, notes, and snippets.

@mnogu
Last active November 23, 2022 23:27
Show Gist options
  • Save mnogu/3d6d762a646a045a7ed960a96b21517d to your computer and use it in GitHub Desktop.
Save mnogu/3d6d762a646a045a7ed960a96b21517d to your computer and use it in GitHub Desktop.
Assign 192.0.2.1 to tap0 on Ubuntu 22.04.1 LTS with Rust (mkdir src && mv main.rs src && sudo cargo run)
[package]
name = "pareiodon"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nix = "0.25.0"
use std::{mem, os::raw::c_char};
use nix::{
ioctl_write_ptr_bad, libc,
sys::socket::{socket, AddressFamily, SockFlag, SockType, SockaddrIn},
};
ioctl_write_ptr_bad!(siocsifaddr, libc::SIOCSIFADDR, libc::ifreq);
fn main() {
let sock = socket(
AddressFamily::Inet,
SockType::Datagram,
SockFlag::empty(),
None,
)
.unwrap();
let mut ifr_name: [c_char; libc::IF_NAMESIZE] = [0; libc::IF_NAMESIZE];
let name = b"tap0\0";
ifr_name[..name.len()].copy_from_slice(&name.map(|c| c as i8)[..]);
let ifru_addr = unsafe { mem::transmute(SockaddrIn::new(192, 0, 2, 1, 0).as_ref().clone()) };
let ifr_ifru = libc::__c_anonymous_ifr_ifru { ifru_addr };
let ifreq = libc::ifreq { ifr_name, ifr_ifru };
unsafe { siocsifaddr(sock, &ifreq) }.unwrap();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment