mirror of https://github.com/dswd/vpncloud.git
Remove C code
This commit is contained in:
parent
29fe0911f2
commit
12c899b04d
|
@ -259,11 +259,6 @@ name = "percent-encoding"
|
|||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.8"
|
||||
|
@ -704,13 +699,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
name = "vpncloud"
|
||||
version = "1.4.0"
|
||||
dependencies = [
|
||||
"cc 1.0.58 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"daemonize 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"igd 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"privdrop 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ring 0.16.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -863,7 +856,6 @@ dependencies = [
|
|||
"checksum nix 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dd0eaf8df8bab402257e0a5c17a254e4cc1f72a93588a1ddfb5d356c801aa7cb"
|
||||
"checksum once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
|
||||
"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
|
||||
"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
|
||||
"checksum ppv-lite86 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
|
||||
"checksum privdrop 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "939fa7cbfef9c15c65cf2fb3ed57f3f2a14dca1757a556aa1ba4a7f998b2b479"
|
||||
"checksum proc-macro-error 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fc175e9777c3116627248584e8f8b3e2987405cabe1c0adf7d1dd28f09dc7880"
|
||||
|
|
|
@ -29,10 +29,6 @@ daemonize = "0.4"
|
|||
ring = "0.16"
|
||||
privdrop = "0.3"
|
||||
|
||||
[build-dependencies]
|
||||
cc = "^1"
|
||||
pkg-config = "0.3"
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = "3"
|
||||
|
||||
|
|
6
build.rs
6
build.rs
|
@ -2,17 +2,11 @@
|
|||
// Copyright (C) 2015-2020 Dennis Schwerdel
|
||||
// This software is licensed under GPL-3 or newer (see LICENSE.md)
|
||||
|
||||
extern crate cc;
|
||||
|
||||
use std::{env, fs, path::Path, process::Command};
|
||||
|
||||
fn main() {
|
||||
let out_dir = env::var("OUT_DIR").unwrap();
|
||||
|
||||
// Compile tun/tap C code
|
||||
println!("cargo:rerun-if-changed=src/c/tuntap.c");
|
||||
cc::Build::new().file("src/c/tuntap.c").include("src").compile("libtuntap.a");
|
||||
|
||||
// Process manpage using asciidoctor command
|
||||
println!("cargo:rerun-if-changed=vpncloud.adoc");
|
||||
fs::copy("vpncloud.adoc", Path::new(&out_dir).join("vpncloud.adoc")).unwrap();
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
default: libtuntap.a
|
||||
|
||||
tapdev.o: tuntap.c
|
||||
gcc -Os -c tuntap.c
|
||||
|
||||
libtapdev.a: tuntap.o
|
||||
ar rcs libtuntap.a tuntap.o
|
|
@ -1,27 +0,0 @@
|
|||
// VpnCloud - Peer-to-Peer VPN
|
||||
// Copyright (C) 2015-2020 Dennis Schwerdel
|
||||
// This software is licensed under GPL-3 or newer (see LICENSE.md)
|
||||
|
||||
#include <stdint.h>
|
||||
#include <net/if.h>
|
||||
#include <linux/if_tun.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
int32_t setup_device(int32_t fd, char *ifname, int32_t flags) {
|
||||
struct ifreq ifr;
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
ifr.ifr_flags = flags;
|
||||
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
|
||||
if (ioctl(fd, TUNSETIFF, (void *)&ifr) < 0) return 1;
|
||||
strncpy(ifname, ifr.ifr_name, IFNAMSIZ);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t setup_tap_device(int32_t fd, char *ifname) {
|
||||
return setup_device(fd, ifname, IFF_TAP | IFF_NO_PI);
|
||||
}
|
||||
|
||||
int32_t setup_tun_device(int32_t fd, char *ifname) {
|
||||
return setup_device(fd, ifname, IFF_TUN | IFF_NO_PI);
|
||||
}
|
|
@ -2,19 +2,40 @@
|
|||
// Copyright (C) 2015-2020 Dennis Schwerdel
|
||||
// This software is licensed under GPL-3 or newer (see LICENSE.md)
|
||||
|
||||
use libc::{c_short, c_ulong, ioctl, IFF_NO_PI, IFF_TAP, IFF_TUN, IF_NAMESIZE};
|
||||
use std::{
|
||||
collections::VecDeque,
|
||||
fmt, fs,
|
||||
io::{self, Error as IoError, ErrorKind, Read, Write},
|
||||
os::unix::io::{AsRawFd, RawFd},
|
||||
str,
|
||||
str::FromStr
|
||||
};
|
||||
|
||||
use super::types::Error;
|
||||
|
||||
extern "C" {
|
||||
fn setup_tap_device(fd: i32, ifname: *mut u8) -> i32;
|
||||
fn setup_tun_device(fd: i32, ifname: *mut u8) -> i32;
|
||||
static TUNSETIFF: c_ulong = 1074025674;
|
||||
|
||||
|
||||
#[repr(C)]
|
||||
union IfReqData {
|
||||
flags: c_short,
|
||||
_dummy: [u8; 24]
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
struct IfReq {
|
||||
ifr_name: [u8; IF_NAMESIZE],
|
||||
data: IfReqData
|
||||
}
|
||||
|
||||
impl IfReq {
|
||||
fn new(name: &str, flags: c_short) -> Self {
|
||||
assert!(name.len() < IF_NAMESIZE);
|
||||
let mut ifr_name = [0 as u8; IF_NAMESIZE];
|
||||
ifr_name[..name.len()].clone_from_slice(name.as_bytes());
|
||||
Self { ifr_name, data: IfReqData { flags } }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -120,24 +141,18 @@ impl TunTapDevice {
|
|||
return Self::dummy(ifname, path, type_)
|
||||
}
|
||||
let fd = fs::OpenOptions::new().read(true).write(true).open(path)?;
|
||||
// Add trailing \0 to interface name
|
||||
let mut ifname_string = String::with_capacity(32);
|
||||
ifname_string.push_str(ifname);
|
||||
ifname_string.push('\0');
|
||||
assert!(ifname_string.len() <= 32);
|
||||
let mut ifname_c = ifname_string.into_bytes();
|
||||
let res = match type_ {
|
||||
Type::Tun => unsafe { setup_tun_device(fd.as_raw_fd(), ifname_c.as_mut_ptr()) },
|
||||
Type::Tap => unsafe { setup_tap_device(fd.as_raw_fd(), ifname_c.as_mut_ptr()) },
|
||||
let flags = match type_ {
|
||||
Type::Tun => IFF_TUN | IFF_NO_PI,
|
||||
Type::Tap => IFF_TAP | IFF_NO_PI,
|
||||
Type::Dummy => unreachable!()
|
||||
};
|
||||
let mut ifreq = IfReq::new(ifname, flags as c_short);
|
||||
let res = unsafe { ioctl(fd.as_raw_fd(), TUNSETIFF, &mut ifreq) };
|
||||
match res {
|
||||
0 => {
|
||||
// Remove trailing \0 from name
|
||||
while ifname_c.last() == Some(&0) {
|
||||
ifname_c.pop();
|
||||
}
|
||||
Ok(Self { fd, ifname: String::from_utf8(ifname_c).unwrap(), type_ })
|
||||
let nul_range_end = ifreq.ifr_name.iter().position(|&c| c == b'\0').unwrap_or(ifreq.ifr_name.len());
|
||||
let ifname = unsafe { str::from_utf8_unchecked(&ifreq.ifr_name[0..nul_range_end]) }.to_string();
|
||||
Ok(Self { fd, ifname, type_ })
|
||||
}
|
||||
_ => Err(IoError::last_os_error())
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue