pgs_files/
passwd.rs

1//! Fuctions and Structs for dealing with /etc/passwd
2
3use std::path::Path;
4use std::num::ParseIntError;
5use libc::uid_t;
6use libc::gid_t;
7
8use entries::{Entries,Entry};
9
10/// An entry from /etc/passwd
11#[derive(Debug, PartialEq, PartialOrd)]
12pub struct PasswdEntry {
13    /// Username
14    pub name: String,
15
16    /// User Password
17    pub passwd: String,
18
19    /// User ID
20    pub uid: uid_t,
21
22    /// Group ID
23    pub gid: gid_t,
24
25    /// User Information
26    pub gecos: String,
27
28    /// Home Directory
29    pub dir: String,
30
31    /// User's Shell
32    pub shell: String,
33}
34
35
36impl Entry for PasswdEntry {
37    fn from_line(line: &str) -> Result<PasswdEntry, ParseIntError> {
38
39        let parts: Vec<&str> = line.split(":").map(|part| part.trim()).collect();
40
41        Ok(PasswdEntry {
42            name: parts[0].to_string(),
43            passwd: parts[1].to_string(),
44            uid: try!(parts[2].parse()),
45            gid: try!(parts[3].parse()),
46            gecos: parts[4].to_string(),
47            dir: parts[5].to_string(),
48            shell: parts[6].to_string(),
49        })
50    }
51}
52
53
54/// Return a [`PasswdEntry`](struct.PasswdEntry.html)
55/// for a given `uid` and `&Path`
56pub fn get_entry_by_uid_from_path(path: &Path, uid: uid_t) -> Option<PasswdEntry> {
57    Entries::<PasswdEntry>::new(path).find(|x| x.uid == uid)
58}
59
60
61/// Return a [`PasswdEntry`](struct.PasswdEntry.html)
62/// for a given `uid` from `/etc/passwd`
63pub fn get_entry_by_uid(uid: uid_t) -> Option<PasswdEntry> {
64    get_entry_by_uid_from_path(&Path::new("/etc/passwd"), uid)
65}
66
67
68/// Return a [`PasswdEntry`](struct.PasswdEntry.html)
69/// for a given `name` and `&Path`
70pub fn get_entry_by_name_from_path(path: &Path, name: &str) -> Option<PasswdEntry> {
71    Entries::<PasswdEntry>::new(path).find(|x| x.name == name)
72}
73
74
75/// Return a [`PasswdEntry`](struct.PasswdEntry.html)
76/// for a given `name` from `/etc/passwd`
77pub fn get_entry_by_name(name: &str) -> Option<PasswdEntry> {
78    get_entry_by_name_from_path(&Path::new("/etc/passwd"), name)
79}
80
81
82/// Return a `Vec<`[`PasswdEntry`](struct.PasswdEntry.html)`>` containing all
83/// [`PasswdEntry`](struct.PasswdEntry.html)'s for a given `&Path`
84pub fn get_all_entries_from_path(path: &Path) -> Vec<PasswdEntry> {
85    Entries::new(path).collect()
86}
87
88
89/// Return a `Vec<`[`PasswdEntry`](struct.PasswdEntry.html)`>` containing all
90/// [`PasswdEntry`](struct.PasswdEntry.html)'s from `/etc/passwd`
91pub fn get_all_entries() -> Vec<PasswdEntry> {
92    get_all_entries_from_path(&Path::new("/etc/passwd"))
93}