1use std::path::Path;
4use std::num::ParseIntError;
5use libc::uid_t;
6use libc::gid_t;
7
8use entries::{Entries,Entry};
9
10#[derive(Debug, PartialEq, PartialOrd)]
12pub struct PasswdEntry {
13 pub name: String,
15
16 pub passwd: String,
18
19 pub uid: uid_t,
21
22 pub gid: gid_t,
24
25 pub gecos: String,
27
28 pub dir: String,
30
31 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
54pub 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
61pub 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
68pub 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
75pub fn get_entry_by_name(name: &str) -> Option<PasswdEntry> {
78 get_entry_by_name_from_path(&Path::new("/etc/passwd"), name)
79}
80
81
82pub fn get_all_entries_from_path(path: &Path) -> Vec<PasswdEntry> {
85 Entries::new(path).collect()
86}
87
88
89pub fn get_all_entries() -> Vec<PasswdEntry> {
92 get_all_entries_from_path(&Path::new("/etc/passwd"))
93}