-
Notifications
You must be signed in to change notification settings - Fork 290
Expand file tree
/
Copy pathugid.rs
More file actions
193 lines (171 loc) · 4.59 KB
/
Copy pathugid.rs
File metadata and controls
193 lines (171 loc) · 4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
//! User and Group ID types.
use core::fmt;
use crate::backend::c;
use crate::ffi;
/// A group identifier as a raw integer.
pub type RawGid = ffi::c_uint;
/// A user identifier as a raw integer.
pub type RawUid = ffi::c_uint;
/// `uid_t`—A Unix user ID.
#[repr(transparent)]
#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash)]
pub struct Uid(RawUid);
/// `gid_t`—A Unix group ID.
#[repr(transparent)]
#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash)]
pub struct Gid(RawGid);
impl Uid {
/// A `Uid` corresponding to the root user (uid 0).
pub const ROOT: Self = Self(0);
/// Converts a `RawUid` into a `Uid`.
///
/// `raw` must be the value of a valid Unix user ID, and not `-1`.
#[inline]
pub fn from_raw(raw: RawUid) -> Self {
debug_assert_ne!(raw, !0);
Self(raw)
}
/// Converts a `RawUid` into a `Uid`.
///
/// `raw` must be the value of a valid Unix user ID, and not `-1`.
#[inline]
pub const fn from_raw_unchecked(raw: RawUid) -> Self {
Self(raw)
}
/// Converts a `Uid` into a `RawUid`.
#[inline]
pub const fn as_raw(self) -> RawUid {
self.0
}
/// Test whether this uid represents the root user ([`Uid::ROOT`]).
#[inline]
pub const fn is_root(self) -> bool {
self.0 == Self::ROOT.0
}
}
impl Gid {
/// A `Gid` corresponding to the root group (gid 0).
pub const ROOT: Self = Self(0);
/// Converts a `RawGid` into a `Gid`.
///
/// `raw` must be the value of a valid Unix group ID, and not `-1`.
#[inline]
pub fn from_raw(raw: RawGid) -> Self {
debug_assert_ne!(raw, !0);
Self(raw)
}
/// Converts a `RawGid` into a `Gid`.
///
/// `raw` must be the value of a valid Unix group ID, and not `-1`.
#[inline]
pub const fn from_raw_unchecked(raw: RawGid) -> Self {
Self(raw)
}
/// Converts a `Gid` into a `RawGid`.
#[inline]
pub const fn as_raw(self) -> RawGid {
self.0
}
/// Test whether this gid represents the root group ([`Gid::ROOT`]).
#[inline]
pub const fn is_root(self) -> bool {
self.0 == Self::ROOT.0
}
}
impl fmt::Display for Uid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::Binary for Uid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::Octal for Uid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::LowerHex for Uid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::UpperHex for Uid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::LowerExp for Uid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::UpperExp for Uid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::Display for Gid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::Binary for Gid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::Octal for Gid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::LowerHex for Gid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::UpperHex for Gid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::LowerExp for Gid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl fmt::UpperExp for Gid {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
// Return the raw value of the IDs. In case of `None` it returns `!0` since it
// has the same bit pattern as `-1` indicating no change to the owner/group ID.
pub(crate) fn translate_fchown_args(
owner: Option<Uid>,
group: Option<Gid>,
) -> (c::uid_t, c::gid_t) {
let ow = match owner {
Some(o) => o.as_raw(),
None => !0,
};
let gr = match group {
Some(g) => g.as_raw(),
None => !0,
};
(ow as c::uid_t, gr as c::gid_t)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sizes() {
static_assertions::assert_eq_size!(RawUid, u32);
static_assertions::assert_eq_size!(RawGid, u32);
static_assertions::assert_eq_size!(RawUid, libc::uid_t);
static_assertions::assert_eq_size!(RawGid, libc::gid_t);
}
}