blob: 7e67617585974b9ab807c5c1cfaed01cfe9cdf0f [file] [log] [blame]
// Take a look at the license at the top of the repository in the LICENSE file.
#[cfg(not(any(target_os = "macos", target_os = "ios")))]
use crate::Group;
impl crate::GroupInner {
pub(crate) fn new(id: crate::Gid, name: String) -> Self {
Self { id, name }
}
pub(crate) fn id(&self) -> &crate::Gid {
&self.id
}
pub(crate) fn name(&self) -> &str {
&self.name
}
}
// Not used by mac.
#[cfg(not(any(target_os = "macos", target_os = "ios")))]
pub(crate) fn get_groups(groups: &mut Vec<Group>) {
use crate::common::{Gid, GroupInner};
use std::fs::File;
use std::io::Read;
#[inline]
fn parse_id(id: &str) -> Option<u32> {
id.parse::<u32>().ok()
}
groups.clear();
let mut s = String::new();
let _ = File::open("/etc/group").and_then(|mut f| f.read_to_string(&mut s));
for line in s.lines() {
let mut parts = line.split(':');
if let Some(name) = parts.next() {
let mut parts = parts.skip(1);
// Skip the user if the uid cannot be parsed correctly
if let Some(gid) = parts.next().and_then(parse_id) {
groups.push(Group {
inner: GroupInner::new(Gid(gid), name.to_owned()),
});
}
}
}
}
#[cfg(any(target_os = "macos", target_os = "ios"))]
pub(crate) use crate::unix::apple::groups::get_groups;