10 个版本 (6 个重大更改)

使用旧 Rust 2015

0.7.0 2020年11月11日
0.6.3 2020年3月5日
0.6.2 2019年1月8日
0.6.1 2018年5月26日
0.4.0 2016年3月3日

#321解析器实现

Download history 262333/week @ 2024-03-25 286718/week @ 2024-04-01 281781/week @ 2024-04-08 268748/week @ 2024-04-15 282722/week @ 2024-04-22 267807/week @ 2024-04-29 247401/week @ 2024-05-06 282807/week @ 2024-05-13 287296/week @ 2024-05-20 270522/week @ 2024-05-27 291957/week @ 2024-06-03 307559/week @ 2024-06-10 272628/week @ 2024-06-17 292701/week @ 2024-06-24 269983/week @ 2024-07-01 297041/week @ 2024-07-08

1,145,251 每月下载量
721 个crate中 使用 (12 个直接使用)

MIT/Apache 许可

34KB
573

Resolv-conf

状态:测试版

Rust 的 /etc/resolv.conf 解析器 crate。

为什么?

  1. 目前 crates.io 上没有裸文件解析器
  2. 我需要一个来为 rotor 创建 DNS 解析器

许可

根据您选择以下任一许可

供您选择。

贡献

除非您明确声明,否则任何有意提交以包含在作品中的贡献,根据 Apache-2.0 许可证定义,应按照上述方式双重许可,不附加任何其他条款或条件。


lib.rs:

该 crate 仅解析 /etc/resolv.conf 文件并创建一个配置对象

示例

从字符串解析配置

extern crate resolv_conf;

use std::net::{Ipv4Addr, Ipv6Addr};
use resolv_conf::{ScopedIp, Config, Network};

fn main() {
    let config_str = "
options ndots:8 timeout:8 attempts:8

domain example.com
search example.com sub.example.com

nameserver 2001:4860:4860::8888
nameserver 2001:4860:4860::8844
nameserver 8.8.8.8
nameserver 8.8.4.4

options rotate
options inet6 no-tld-query

sortlist 130.155.160.0/255.255.240.0 130.155.0.0";

    // Parse the config.
    let parsed_config = Config::parse(&config_str).expect("Failed to parse config");

    // We can build configs manually as well, either directly or with Config::new()
    let mut expected_config = Config::new();
    expected_config.nameservers = vec![
        ScopedIp::V6(Ipv6Addr::new(0x2001, 0x4860, 0x4860, 0, 0, 0, 0, 0x8888), None),
        ScopedIp::V6(Ipv6Addr::new(0x2001, 0x4860, 0x4860, 0, 0, 0, 0, 0x8844), None),
        ScopedIp::V4(Ipv4Addr::new(8, 8, 8, 8)),
        ScopedIp::V4(Ipv4Addr::new(8, 8, 4, 4)),
    ];
    expected_config.sortlist = vec![
        Network::V4(Ipv4Addr::new(130, 155, 160, 0), Ipv4Addr::new(255, 255, 240, 0)),
        Network::V4(Ipv4Addr::new(130, 155, 0, 0), Ipv4Addr::new(255, 255, 0, 0)),
    ];
    expected_config.debug = false;
    expected_config.ndots = 8;
    expected_config.timeout = 8;
    expected_config.attempts = 8;
    expected_config.rotate = true;
    expected_config.no_check_names = false;
    expected_config.inet6 = true;
    expected_config.ip6_bytestring = false;
    expected_config.ip6_dotint = false;
    expected_config.edns0 = false;
    expected_config.single_request = false;
    expected_config.single_request_reopen = false;
    expected_config.no_tld_query = true;
    expected_config.use_vc = false;
    expected_config.set_domain(String::from("example.com"));
    expected_config.set_search(vec![
        String::from("example.com"),
        String::from("sub.example.com")
    ]);

    // We can compare configurations, since resolv_conf::Config implements Eq
    assert_eq!(parsed_config, expected_config);
}

解析文件

use std::io::Read;
use std::fs::File;

extern crate resolv_conf;

fn main() {
    // Read the file
    let mut buf = Vec::with_capacity(4096);
    let mut f = File::open("/etc/resolv.conf").unwrap();
    f.read_to_end(&mut buf).unwrap();

    // Parse the buffer
    let cfg = resolv_conf::Config::parse(&buf).unwrap();

    // Print the config
    println!("---- Parsed /etc/resolv.conf -----\n{:#?}\n", cfg);
}

依赖

~225KB