]> git.proxmox.com Git - pxar.git/blobdiff - src/format.rs
fix hardlink format
[pxar.git] / src / format.rs
index d1635ecc0b0e975cf99969d76dbd93bd87c5560c..e731ce9ab881e506cb45e1d7c74732cd71195db9 100644 (file)
@@ -178,6 +178,16 @@ impl Entry {
 
 /// Convenience methods.
 impl Entry {
+    /// Get the file type (`mode & mode::IFMT`).
+    pub fn file_type(&self) -> u64 {
+        self.mode & mode::IFMT
+    }
+
+    /// Get the file mode bits (`mode & !mode::IFMT`).
+    pub fn file_mode(&self) -> u64 {
+        self.mode & !mode::IFMT
+    }
+
     /// Check whether this is a directory.
     pub fn is_dir(&self) -> bool {
         (self.mode & mode::IFMT) == mode::IFDIR
@@ -194,6 +204,18 @@ impl Entry {
         fmt == mode::IFCHR || fmt == mode::IFBLK
     }
 
+    /// Check whether this is a block device node.
+    pub fn is_blockdev(&self) -> bool {
+        let fmt = self.mode & mode::IFMT;
+        fmt == mode::IFBLK
+    }
+
+    /// Check whether this is a character device node.
+    pub fn is_chardev(&self) -> bool {
+        let fmt = self.mode & mode::IFMT;
+        fmt == mode::IFCHR
+    }
+
     /// Check whether this is a regular file.
     pub fn is_regular_file(&self) -> bool {
         (self.mode & mode::IFMT) == mode::IFREG
@@ -311,9 +333,7 @@ impl XAttr {
     }
 
     pub fn name(&self) -> &CStr {
-        unsafe {
-            CStr::from_bytes_with_nul_unchecked(&self.data[..self.name_len+1])
-        }
+        unsafe { CStr::from_bytes_with_nul_unchecked(&self.data[..self.name_len + 1]) }
     }
 
     pub fn value(&self) -> &[u8] {
@@ -357,6 +377,26 @@ impl Device {
          (self.minor & 0x0000_00ff) |
         ((self.minor & 0xffff_ff00) << 12)
     }
+
+    /// Get a `Device` from a `dev_t` value.
+    #[rustfmt::skip]
+    pub fn from_dev_t(dev: u64) -> Self {
+        // see to_dev_t
+        Self {
+            major: (dev >>  8) & 0x0000_0fff |
+                   (dev >> 32) & 0xffff_f000,
+            minor:  dev        & 0x0000_00ff |
+                   (dev >> 12) & 0xffff_ff00,
+        }
+    }
+}
+
+#[cfg(all(test, target_os = "linux"))]
+#[test]
+fn test_linux_devices() {
+    let c_dev = unsafe { ::libc::makedev(0xabcd_1234, 0xdcba_5678) };
+    let dev = Device::from_dev_t(c_dev);
+    assert_eq!(dev.to_dev_t(), c_dev);
 }
 
 #[derive(Clone, Debug)]