Skip to content

Commit e7629f3

Browse files
committed
Auto merge of #508 - aidanhs:aphs-major-minor-macros, r=posborne
Implement major/minor macros, correct mkdev It appears that the previous `mkdev` was based on the kernel headers (https://github.com/torvalds/linux/blob/v4.7/include/linux/kdev_t.h#L6) which (I guess) is the internal kernel dev_t. Scrolling down the file you can see some bitshifting operations to do conversions. The new implementation(s) are based on [musl](http://git.musl-libc.org/cgit/musl/tree/include/sys/sysmacros.h?id=dbbb3734d8c0176feabd6c46e2e85bbc3b8a60af) and [glibc](https://github.molgen.mpg.de/git-mirror/glibc/blob/20003c49884422da7ffbc459cdeee768a6fee07b/sysdeps/unix/sysv/linux/sys/sysmacros.h#L38), which are in agreement about how dev_t should be handled. (as it happens I suspect we could omit the shift by 32 since I don't see that in the kernel headers, but doesn't hurt to take the conservative route and mimic the libcs)
2 parents 54e6197 + dbd3b16 commit e7629f3

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
3535
([#491](https://github.com/nix-rust/nix/pull/491))
3636
- Added `fchdir` in `::nix::unistd`
3737
([#497](https://github.com/nix-rust/nix/pull/497))
38+
- Added `major` and `minor` in `::nix::sys::stat` for decomposing `dev_t`
39+
([#508](https://github.com/nix-rust/nix/pull/508))
3840

3941
### Changed
4042
- `epoll_ctl` now could accept None as argument `event`
@@ -91,6 +93,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
9193
([#429](https://github.com/nix-rust/nix/pull/429))
9294
- Fixed clone passing a potentially unaligned stack.
9395
([#490](https://github.com/nix-rust/nix/pull/490))
96+
- Fixed mkdev not creating a `dev_t` the same way as libc.
97+
([#508](https://github.com/nix-rust/nix/pull/508))
9498

9599
## [0.7.0] 2016-09-09
96100

src/sys/stat.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,23 @@ pub fn mknod<P: ?Sized + NixPath>(path: &P, kind: SFlag, perm: Mode, dev: dev_t)
6363
}
6464

6565
#[cfg(target_os = "linux")]
66-
const MINORBITS: usize = 20;
66+
pub fn major(dev: dev_t) -> u64 {
67+
((dev >> 32) & 0xfffff000) |
68+
((dev >> 8) & 0x00000fff)
69+
}
70+
71+
#[cfg(target_os = "linux")]
72+
pub fn minor(dev: dev_t) -> u64 {
73+
((dev >> 12) & 0xffffff00) |
74+
((dev ) & 0x000000ff)
75+
}
6776

6877
#[cfg(target_os = "linux")]
69-
pub fn mkdev(major: u64, minor: u64) -> dev_t {
70-
(major << MINORBITS) | minor
78+
pub fn makedev(major: u64, minor: u64) -> dev_t {
79+
((major & 0xfffff000) << 32) |
80+
((major & 0x00000fff) << 8) |
81+
((minor & 0xffffff00) << 12) |
82+
((minor & 0x000000ff) )
7183
}
7284

7385
pub fn umask(mode: Mode) -> Mode {

0 commit comments

Comments
 (0)