aboutsummaryrefslogtreecommitdiff
path: root/src/prompt
diff options
context:
space:
mode:
Diffstat (limited to 'src/prompt')
-rw-r--r--src/prompt/user.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/prompt/user.rs b/src/prompt/user.rs
new file mode 100644
index 0000000..9744928
--- /dev/null
+++ b/src/prompt/user.rs
@@ -0,0 +1,48 @@
+use std::io::BufRead;
+
+pub fn hostname() -> std::result::Result<std::string::String, std::io::Error> {
+ let h = std::fs::read_to_string("/proc/sys/kernel/hostname")?;
+ Ok(h.trim().to_string())
+}
+
+#[test]
+fn test_hostname() {
+ let hostname__ = match std::process::Command::new("hostname").output() {
+ Ok(s) => {
+ let output = std::string::String::from_utf8(s.stdout).unwrap();
+ output.trim().to_string()
+ }
+ Err(e) => panic!(e),
+ };
+
+ assert_eq!(hostname__, hostname().unwrap());
+}
+
+pub fn username() -> std::result::Result<std::string::String, std::io::Error> {
+ let uid = unsafe { libc::getuid().to_string() };
+
+ let file = std::fs::File::open("/etc/passwd")?;
+ let reader = std::io::BufReader::new(file);
+
+ for line in reader.lines() {
+ let l = line?;
+ let parts: Vec<&str> = l.split(':').collect();
+ if uid == parts[2] {
+ return Ok(parts[0].to_string());
+ }
+ }
+
+ Ok(uid)
+}
+
+#[test]
+fn test_username() {
+ let username__ = match std::process::Command::new("whoami").output() {
+ Ok(s) => {
+ let output = std::string::String::from_utf8(s.stdout).unwrap();
+ output.trim().to_string()
+ }
+ Err(e) => panic!(e),
+ };
+ assert_eq!(username__, username().unwrap());
+}