From d0261ebb355cbb5bd6acaafefe38013127933d7d Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Thu, 17 Jan 2019 19:56:51 -0700
Subject: [PATCH] Move db to crate root

---
 src/db.rs               | 56 +++++++++++++++++++++++++++++++++++++++++
 src/header/netdb/db.rs  | 31 -----------------------
 src/header/netdb/mod.rs | 13 +++-------
 src/lib.rs              |  1 +
 4 files changed, 61 insertions(+), 40 deletions(-)
 create mode 100644 src/db.rs
 delete mode 100644 src/header/netdb/db.rs

diff --git a/src/db.rs b/src/db.rs
new file mode 100644
index 00000000..67f4d75b
--- /dev/null
+++ b/src/db.rs
@@ -0,0 +1,56 @@
+use alloc::string::String;
+use alloc::vec::Vec;
+
+use c_str::CStr;
+use fs::File;
+use header::fcntl;
+use io::{self, BufRead, BufReader};
+
+pub enum Separator {
+    Character(char),
+    Whitespace,
+}
+
+pub struct Db<R: BufRead> {
+    reader: R,
+    separator: Separator,
+}
+
+impl<R: BufRead> Db<R> {
+    pub fn new(reader: R, separator: Separator) -> Self {
+        Db {
+            reader,
+            separator
+        }
+    }
+
+    pub fn read(&mut self) -> io::Result<Option<Vec<String>>> {
+        let mut line = String::new();
+        if self.reader.read_line(&mut line)? == 0 {
+            return Ok(None);
+        }
+
+        let vec = if let Some(not_comment) = line.trim().split('#').next() {
+            match self.separator {
+                Separator::Character(c) => not_comment.split(c).map(String::from).collect(),
+                Separator::Whitespace => not_comment.split_whitespace().map(String::from).collect(),
+            }
+        } else {
+            Vec::new()
+        };
+
+        Ok(Some(vec))
+    }
+}
+
+pub type FileDb = Db<BufReader<File>>;
+
+impl FileDb {
+    pub fn open(path: &CStr, separator: Separator) -> io::Result<Self> {
+        let file = File::open(path, fcntl::O_RDONLY | fcntl::O_CLOEXEC)?;
+        Ok(Db::new(
+            BufReader::new(file),
+            separator
+        ))
+    }
+}
diff --git a/src/header/netdb/db.rs b/src/header/netdb/db.rs
deleted file mode 100644
index 77bca020..00000000
--- a/src/header/netdb/db.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-use alloc::string::{String, ToString};
-use alloc::vec::Vec;
-
-use c_str::CStr;
-use fs::File;
-use header::fcntl;
-use io::{self, BufRead, BufReader};
-
-pub struct Db(BufReader<File>);
-
-impl Db {
-    pub fn new(path: &CStr) -> io::Result<Self> {
-        File::open(path, fcntl::O_RDONLY)
-            .map(BufReader::new)
-            .map(Db)
-    }
-
-    pub fn read(&mut self) -> io::Result<Vec<String>> {
-        let mut parts = Vec::new();
-
-        let mut line = String::new();
-        self.0.read_line(&mut line)?;
-        if let Some(not_comment) = line.split('#').next() {
-            for part in not_comment.split_whitespace() {
-                parts.push(part.to_string());
-            }
-        }
-
-        Ok(parts)
-    }
-}
diff --git a/src/header/netdb/mod.rs b/src/header/netdb/mod.rs
index f8a0813c..e4ddb548 100644
--- a/src/header/netdb/mod.rs
+++ b/src/header/netdb/mod.rs
@@ -10,12 +10,6 @@ use alloc::str::SplitWhitespace;
 use alloc::vec::Vec;
 
 use c_str::{CStr, CString};
-
-use platform;
-use platform::rlb::{Line, RawLineBuffer};
-use platform::types::*;
-use platform::{Pal, Sys};
-
 use header::arpa_inet::{htons, inet_aton};
 use header::errno::*;
 use header::fcntl::O_RDONLY;
@@ -25,6 +19,10 @@ use header::strings::strcasecmp;
 use header::sys_socket::constants::AF_INET;
 use header::sys_socket::{sockaddr, socklen_t};
 use header::unistd::SEEK_SET;
+use platform;
+use platform::rlb::{Line, RawLineBuffer};
+use platform::types::*;
+use platform::{Pal, Sys};
 
 #[cfg(target_os = "linux")]
 #[path = "linux.rs"]
@@ -34,9 +32,6 @@ pub mod sys;
 #[path = "redox.rs"]
 pub mod sys;
 
-//TODO: use self::db::Db;
-pub mod db;
-
 use self::lookup::{lookup_addr, lookup_host};
 pub mod lookup;
 
diff --git a/src/lib.rs b/src/lib.rs
index ddff3401..7cc40f81 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -45,6 +45,7 @@ extern crate spin;
 mod macros;
 pub mod c_str;
 pub mod cxa;
+pub mod db;
 pub mod fs;
 pub mod header;
 pub mod io;
-- 
GitLab