Coverage Report

Created: 2025-12-28 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/nix-0.30.1/src/sys/statfs.rs
Line
Count
Source
1
//! Get filesystem statistics, non-portably
2
//!
3
//! See [`statvfs`](crate::sys::statvfs) for a portable alternative.
4
#[cfg(not(any(linux_android, target_os = "cygwin")))]
5
use std::ffi::CStr;
6
use std::fmt::{self, Debug};
7
use std::mem;
8
use std::os::unix::io::{AsFd, AsRawFd};
9
10
use cfg_if::cfg_if;
11
12
#[cfg(all(feature = "mount", bsd))]
13
use crate::mount::MntFlags;
14
#[cfg(target_os = "linux")]
15
use crate::sys::statvfs::FsFlags;
16
use crate::{errno::Errno, NixPath, Result};
17
18
/// Identifies a mounted file system
19
#[cfg(target_os = "android")]
20
pub type fsid_t = libc::__fsid_t;
21
/// Identifies a mounted file system
22
#[cfg(not(any(target_os = "android", target_os = "cygwin")))]
23
pub type fsid_t = libc::fsid_t;
24
/// Identifies a mounted file system
25
#[cfg(target_os = "cygwin")]
26
pub type fsid_t = libc::c_long;
27
28
cfg_if! {
29
    if #[cfg(any(linux_android, target_os = "fuchsia"))] {
30
        type type_of_statfs = libc::statfs64;
31
        const LIBC_FSTATFS: unsafe extern "C" fn
32
            (fd: libc::c_int, buf: *mut type_of_statfs) -> libc::c_int
33
            = libc::fstatfs64;
34
        const LIBC_STATFS: unsafe extern "C" fn
35
            (path: *const libc::c_char, buf: *mut type_of_statfs) -> libc::c_int
36
            = libc::statfs64;
37
    } else {
38
        type type_of_statfs = libc::statfs;
39
        const LIBC_FSTATFS: unsafe extern "C" fn
40
            (fd: libc::c_int, buf: *mut type_of_statfs) -> libc::c_int
41
            = libc::fstatfs;
42
        const LIBC_STATFS: unsafe extern "C" fn
43
            (path: *const libc::c_char, buf: *mut type_of_statfs) -> libc::c_int
44
            = libc::statfs;
45
    }
46
}
47
48
/// Describes a mounted file system
49
#[derive(Clone, Copy)]
50
#[repr(transparent)]
51
pub struct Statfs(type_of_statfs);
52
53
#[cfg(target_os = "freebsd")]
54
type fs_type_t = u32;
55
#[cfg(target_os = "android")]
56
type fs_type_t = libc::c_ulong;
57
#[cfg(all(
58
    target_os = "linux",
59
    target_arch = "s390x",
60
    not(target_env = "musl")
61
))]
62
type fs_type_t = libc::c_uint;
63
#[cfg(all(target_os = "linux", any(target_env = "musl", target_env = "ohos")))]
64
type fs_type_t = libc::c_ulong;
65
#[cfg(all(target_os = "linux", target_env = "uclibc"))]
66
type fs_type_t = libc::c_int;
67
#[cfg(all(
68
    target_os = "linux",
69
    not(any(
70
        target_arch = "s390x",
71
        target_env = "musl",
72
        target_env = "ohos",
73
        target_env = "uclibc"
74
    ))
75
))]
76
type fs_type_t = libc::__fsword_t;
77
#[cfg(target_os = "cygwin")]
78
type fs_type_t = libc::c_long;
79
80
/// Describes the file system type as known by the operating system.
81
#[cfg(any(
82
    target_os = "freebsd",
83
    target_os = "android",
84
    all(target_os = "linux", target_arch = "s390x"),
85
    all(target_os = "linux", target_env = "musl"),
86
    all(target_os = "linux", target_env = "ohos"),
87
    all(
88
        target_os = "linux",
89
        not(any(target_arch = "s390x", target_env = "musl"))
90
    ),
91
    target_os = "cygwin",
92
))]
93
#[derive(Eq, Copy, Clone, PartialEq, Debug)]
94
pub struct FsType(pub fs_type_t);
95
96
// These constants are defined without documentation in the Linux headers, so we
97
// can't very well document them here.
98
#[cfg(linux_android)]
99
#[allow(missing_docs)]
100
pub const ADFS_SUPER_MAGIC: FsType =
101
    FsType(libc::ADFS_SUPER_MAGIC as fs_type_t);
102
#[cfg(linux_android)]
103
#[allow(missing_docs)]
104
pub const AFFS_SUPER_MAGIC: FsType =
105
    FsType(libc::AFFS_SUPER_MAGIC as fs_type_t);
106
#[cfg(linux_android)]
107
#[allow(missing_docs)]
108
pub const AFS_SUPER_MAGIC: FsType = FsType(libc::AFS_SUPER_MAGIC as fs_type_t);
109
#[cfg(linux_android)]
110
#[allow(missing_docs)]
111
pub const AUTOFS_SUPER_MAGIC: FsType =
112
    FsType(libc::AUTOFS_SUPER_MAGIC as fs_type_t);
113
#[cfg(linux_android)]
114
#[allow(missing_docs)]
115
pub const BPF_FS_MAGIC: FsType = FsType(libc::BPF_FS_MAGIC as fs_type_t);
116
#[cfg(linux_android)]
117
#[allow(missing_docs)]
118
pub const BTRFS_SUPER_MAGIC: FsType =
119
    FsType(libc::BTRFS_SUPER_MAGIC as fs_type_t);
120
#[cfg(linux_android)]
121
#[allow(missing_docs)]
122
pub const CGROUP2_SUPER_MAGIC: FsType =
123
    FsType(libc::CGROUP2_SUPER_MAGIC as fs_type_t);
124
#[cfg(linux_android)]
125
#[allow(missing_docs)]
126
pub const CGROUP_SUPER_MAGIC: FsType =
127
    FsType(libc::CGROUP_SUPER_MAGIC as fs_type_t);
128
#[cfg(linux_android)]
129
#[allow(missing_docs)]
130
pub const CODA_SUPER_MAGIC: FsType =
131
    FsType(libc::CODA_SUPER_MAGIC as fs_type_t);
132
#[cfg(linux_android)]
133
#[allow(missing_docs)]
134
pub const CRAMFS_MAGIC: FsType = FsType(libc::CRAMFS_MAGIC as fs_type_t);
135
#[cfg(linux_android)]
136
#[allow(missing_docs)]
137
pub const DEBUGFS_MAGIC: FsType = FsType(libc::DEBUGFS_MAGIC as fs_type_t);
138
#[cfg(linux_android)]
139
#[allow(missing_docs)]
140
pub const DEVPTS_SUPER_MAGIC: FsType =
141
    FsType(libc::DEVPTS_SUPER_MAGIC as fs_type_t);
142
#[cfg(linux_android)]
143
#[allow(missing_docs)]
144
pub const ECRYPTFS_SUPER_MAGIC: FsType =
145
    FsType(libc::ECRYPTFS_SUPER_MAGIC as fs_type_t);
146
#[cfg(linux_android)]
147
#[allow(missing_docs)]
148
pub const EFS_SUPER_MAGIC: FsType = FsType(libc::EFS_SUPER_MAGIC as fs_type_t);
149
#[cfg(linux_android)]
150
#[allow(missing_docs)]
151
pub const EXT2_SUPER_MAGIC: FsType =
152
    FsType(libc::EXT2_SUPER_MAGIC as fs_type_t);
153
#[cfg(linux_android)]
154
#[allow(missing_docs)]
155
pub const EXT3_SUPER_MAGIC: FsType =
156
    FsType(libc::EXT3_SUPER_MAGIC as fs_type_t);
157
#[cfg(linux_android)]
158
#[allow(missing_docs)]
159
pub const EXT4_SUPER_MAGIC: FsType =
160
    FsType(libc::EXT4_SUPER_MAGIC as fs_type_t);
161
#[cfg(linux_android)]
162
#[allow(missing_docs)]
163
pub const F2FS_SUPER_MAGIC: FsType =
164
    FsType(libc::F2FS_SUPER_MAGIC as fs_type_t);
165
#[cfg(linux_android)]
166
#[allow(missing_docs)]
167
pub const FUSE_SUPER_MAGIC: FsType =
168
    FsType(libc::FUSE_SUPER_MAGIC as fs_type_t);
169
#[cfg(linux_android)]
170
#[allow(missing_docs)]
171
pub const FUTEXFS_SUPER_MAGIC: FsType =
172
    FsType(libc::FUTEXFS_SUPER_MAGIC as fs_type_t);
173
#[cfg(linux_android)]
174
#[allow(missing_docs)]
175
pub const HOSTFS_SUPER_MAGIC: FsType =
176
    FsType(libc::HOSTFS_SUPER_MAGIC as fs_type_t);
177
#[cfg(linux_android)]
178
#[allow(missing_docs)]
179
pub const HPFS_SUPER_MAGIC: FsType =
180
    FsType(libc::HPFS_SUPER_MAGIC as fs_type_t);
181
#[cfg(linux_android)]
182
#[allow(missing_docs)]
183
pub const HUGETLBFS_MAGIC: FsType = FsType(libc::HUGETLBFS_MAGIC as fs_type_t);
184
#[cfg(linux_android)]
185
#[allow(missing_docs)]
186
pub const ISOFS_SUPER_MAGIC: FsType =
187
    FsType(libc::ISOFS_SUPER_MAGIC as fs_type_t);
188
#[cfg(linux_android)]
189
#[allow(missing_docs)]
190
pub const JFFS2_SUPER_MAGIC: FsType =
191
    FsType(libc::JFFS2_SUPER_MAGIC as fs_type_t);
192
#[cfg(linux_android)]
193
#[allow(missing_docs)]
194
pub const MINIX2_SUPER_MAGIC2: FsType =
195
    FsType(libc::MINIX2_SUPER_MAGIC2 as fs_type_t);
196
#[cfg(linux_android)]
197
#[allow(missing_docs)]
198
pub const MINIX2_SUPER_MAGIC: FsType =
199
    FsType(libc::MINIX2_SUPER_MAGIC as fs_type_t);
200
#[cfg(linux_android)]
201
#[allow(missing_docs)]
202
pub const MINIX3_SUPER_MAGIC: FsType =
203
    FsType(libc::MINIX3_SUPER_MAGIC as fs_type_t);
204
#[cfg(linux_android)]
205
#[allow(missing_docs)]
206
pub const MINIX_SUPER_MAGIC2: FsType =
207
    FsType(libc::MINIX_SUPER_MAGIC2 as fs_type_t);
208
#[cfg(linux_android)]
209
#[allow(missing_docs)]
210
pub const MINIX_SUPER_MAGIC: FsType =
211
    FsType(libc::MINIX_SUPER_MAGIC as fs_type_t);
212
#[cfg(linux_android)]
213
#[allow(missing_docs)]
214
pub const MSDOS_SUPER_MAGIC: FsType =
215
    FsType(libc::MSDOS_SUPER_MAGIC as fs_type_t);
216
#[cfg(linux_android)]
217
#[allow(missing_docs)]
218
pub const NCP_SUPER_MAGIC: FsType = FsType(libc::NCP_SUPER_MAGIC as fs_type_t);
219
#[cfg(linux_android)]
220
#[allow(missing_docs)]
221
pub const NFS_SUPER_MAGIC: FsType = FsType(libc::NFS_SUPER_MAGIC as fs_type_t);
222
#[cfg(linux_android)]
223
#[allow(missing_docs)]
224
pub const NILFS_SUPER_MAGIC: FsType =
225
    FsType(libc::NILFS_SUPER_MAGIC as fs_type_t);
226
#[cfg(linux_android)]
227
#[allow(missing_docs)]
228
pub const OCFS2_SUPER_MAGIC: FsType =
229
    FsType(libc::OCFS2_SUPER_MAGIC as fs_type_t);
230
#[cfg(linux_android)]
231
#[allow(missing_docs)]
232
pub const OPENPROM_SUPER_MAGIC: FsType =
233
    FsType(libc::OPENPROM_SUPER_MAGIC as fs_type_t);
234
#[cfg(linux_android)]
235
#[allow(missing_docs)]
236
pub const OVERLAYFS_SUPER_MAGIC: FsType =
237
    FsType(libc::OVERLAYFS_SUPER_MAGIC as fs_type_t);
238
#[cfg(linux_android)]
239
#[allow(missing_docs)]
240
pub const PROC_SUPER_MAGIC: FsType =
241
    FsType(libc::PROC_SUPER_MAGIC as fs_type_t);
242
#[cfg(linux_android)]
243
#[allow(missing_docs)]
244
pub const QNX4_SUPER_MAGIC: FsType =
245
    FsType(libc::QNX4_SUPER_MAGIC as fs_type_t);
246
#[cfg(linux_android)]
247
#[allow(missing_docs)]
248
pub const QNX6_SUPER_MAGIC: FsType =
249
    FsType(libc::QNX6_SUPER_MAGIC as fs_type_t);
250
#[cfg(linux_android)]
251
#[allow(missing_docs)]
252
pub const RDTGROUP_SUPER_MAGIC: FsType =
253
    FsType(libc::RDTGROUP_SUPER_MAGIC as fs_type_t);
254
#[cfg(linux_android)]
255
#[allow(missing_docs)]
256
pub const REISERFS_SUPER_MAGIC: FsType =
257
    FsType(libc::REISERFS_SUPER_MAGIC as fs_type_t);
258
#[cfg(linux_android)]
259
#[allow(missing_docs)]
260
pub const SECURITYFS_MAGIC: FsType =
261
    FsType(libc::SECURITYFS_MAGIC as fs_type_t);
262
#[cfg(linux_android)]
263
#[allow(missing_docs)]
264
pub const SELINUX_MAGIC: FsType = FsType(libc::SELINUX_MAGIC as fs_type_t);
265
#[cfg(linux_android)]
266
#[allow(missing_docs)]
267
pub const SMACK_MAGIC: FsType = FsType(libc::SMACK_MAGIC as fs_type_t);
268
#[cfg(linux_android)]
269
#[allow(missing_docs)]
270
pub const SMB_SUPER_MAGIC: FsType = FsType(libc::SMB_SUPER_MAGIC as fs_type_t);
271
#[cfg(linux_android)]
272
#[allow(missing_docs)]
273
pub const SYSFS_MAGIC: FsType = FsType(libc::SYSFS_MAGIC as fs_type_t);
274
#[cfg(linux_android)]
275
#[allow(missing_docs)]
276
pub const TMPFS_MAGIC: FsType = FsType(libc::TMPFS_MAGIC as fs_type_t);
277
#[cfg(linux_android)]
278
#[allow(missing_docs)]
279
pub const TRACEFS_MAGIC: FsType = FsType(libc::TRACEFS_MAGIC as fs_type_t);
280
#[cfg(linux_android)]
281
#[allow(missing_docs)]
282
pub const UDF_SUPER_MAGIC: FsType = FsType(libc::UDF_SUPER_MAGIC as fs_type_t);
283
#[cfg(linux_android)]
284
#[allow(missing_docs)]
285
pub const USBDEVICE_SUPER_MAGIC: FsType =
286
    FsType(libc::USBDEVICE_SUPER_MAGIC as fs_type_t);
287
#[cfg(linux_android)]
288
#[allow(missing_docs)]
289
pub const XENFS_SUPER_MAGIC: FsType =
290
    FsType(libc::XENFS_SUPER_MAGIC as fs_type_t);
291
#[cfg(linux_android)]
292
#[allow(missing_docs)]
293
pub const NSFS_MAGIC: FsType = FsType(libc::NSFS_MAGIC as fs_type_t);
294
#[cfg(all(linux_android, not(target_env = "musl"), not(target_env = "ohos")))]
295
#[allow(missing_docs)]
296
pub const XFS_SUPER_MAGIC: FsType = FsType(libc::XFS_SUPER_MAGIC as fs_type_t);
297
298
impl Statfs {
299
    /// Magic code defining system type
300
    #[cfg(not(any(
301
        target_os = "openbsd",
302
        target_os = "dragonfly",
303
        apple_targets,
304
    )))]
305
0
    pub fn filesystem_type(&self) -> FsType {
306
0
        FsType(self.0.f_type)
307
0
    }
308
309
    /// Magic code defining system type
310
    #[cfg(not(any(linux_android, target_os = "cygwin")))]
311
    pub fn filesystem_type_name(&self) -> &str {
312
        let c_str = unsafe { CStr::from_ptr(self.0.f_fstypename.as_ptr()) };
313
        c_str.to_str().unwrap()
314
    }
315
316
    /// Optimal transfer block size
317
    #[cfg(apple_targets)]
318
    pub fn optimal_transfer_size(&self) -> i32 {
319
        self.0.f_iosize
320
    }
321
322
    /// Optimal transfer block size
323
    #[cfg(target_os = "openbsd")]
324
    pub fn optimal_transfer_size(&self) -> u32 {
325
        self.0.f_iosize
326
    }
327
328
    /// Optimal transfer block size
329
    #[cfg(all(
330
        target_os = "linux",
331
        target_arch = "s390x",
332
        not(target_env = "musl")
333
    ))]
334
    pub fn optimal_transfer_size(&self) -> u32 {
335
        self.0.f_bsize
336
    }
337
338
    /// Optimal transfer block size
339
    #[cfg(any(
340
        target_os = "android",
341
        all(target_os = "linux", target_env = "musl"),
342
        all(target_os = "linux", target_env = "ohos")
343
    ))]
344
    pub fn optimal_transfer_size(&self) -> libc::c_ulong {
345
        self.0.f_bsize
346
    }
347
348
    /// Optimal transfer block size
349
    #[cfg(all(
350
        target_os = "linux",
351
        not(any(
352
            target_arch = "s390x",
353
            target_env = "musl",
354
            target_env = "ohos",
355
            target_env = "uclibc"
356
        ))
357
    ))]
358
0
    pub fn optimal_transfer_size(&self) -> libc::__fsword_t {
359
0
        self.0.f_bsize
360
0
    }
361
362
    /// Optimal transfer block size
363
    #[cfg(all(target_os = "linux", target_env = "uclibc"))]
364
    pub fn optimal_transfer_size(&self) -> libc::c_int {
365
        self.0.f_bsize
366
    }
367
368
    /// Optimal transfer block size
369
    #[cfg(target_os = "dragonfly")]
370
    pub fn optimal_transfer_size(&self) -> libc::c_long {
371
        self.0.f_iosize
372
    }
373
374
    /// Optimal transfer block size
375
    #[cfg(target_os = "freebsd")]
376
    pub fn optimal_transfer_size(&self) -> u64 {
377
        self.0.f_iosize
378
    }
379
380
    /// Size of a block
381
    #[cfg(any(apple_targets, target_os = "openbsd"))]
382
    pub fn block_size(&self) -> u32 {
383
        self.0.f_bsize
384
    }
385
386
    /// Size of a block
387
    // f_bsize on linux: https://github.com/torvalds/linux/blob/master/fs/nfs/super.c#L471
388
    #[cfg(all(
389
        target_os = "linux",
390
        target_arch = "s390x",
391
        not(target_env = "musl")
392
    ))]
393
    pub fn block_size(&self) -> u32 {
394
        self.0.f_bsize
395
    }
396
397
    /// Size of a block
398
    // f_bsize on linux: https://github.com/torvalds/linux/blob/master/fs/nfs/super.c#L471
399
    #[cfg(all(target_os = "linux", target_env = "musl"))]
400
    pub fn block_size(&self) -> libc::c_ulong {
401
        self.0.f_bsize
402
    }
403
404
    /// Size of a block
405
    // f_bsize on linux: https://github.com/torvalds/linux/blob/master/fs/nfs/super.c#L471
406
    #[cfg(all(target_os = "linux", target_env = "ohos"))]
407
    pub fn block_size(&self) -> libc::c_ulong {
408
        self.0.f_bsize
409
    }
410
411
    /// Size of a block
412
    // f_bsize on linux: https://github.com/torvalds/linux/blob/master/fs/nfs/super.c#L471
413
    #[cfg(all(target_os = "linux", target_env = "uclibc"))]
414
    pub fn block_size(&self) -> libc::c_int {
415
        self.0.f_bsize
416
    }
417
418
    /// Size of a block
419
    // f_bsize on linux: https://github.com/torvalds/linux/blob/master/fs/nfs/super.c#L471
420
    #[cfg(all(
421
        target_os = "linux",
422
        not(any(
423
            target_arch = "s390x",
424
            target_env = "musl",
425
            target_env = "ohos",
426
            target_env = "uclibc"
427
        ))
428
    ))]
429
0
    pub fn block_size(&self) -> libc::__fsword_t {
430
0
        self.0.f_bsize
431
0
    }
432
433
    /// Size of a block
434
    #[cfg(target_os = "freebsd")]
435
    pub fn block_size(&self) -> u64 {
436
        self.0.f_bsize
437
    }
438
439
    /// Size of a block
440
    #[cfg(target_os = "android")]
441
    pub fn block_size(&self) -> libc::c_ulong {
442
        self.0.f_bsize
443
    }
444
445
    /// Size of a block
446
    #[cfg(any(target_os = "dragonfly", target_os = "cygwin"))]
447
    pub fn block_size(&self) -> libc::c_long {
448
        self.0.f_bsize
449
    }
450
451
    /// Get the mount flags
452
    #[cfg(all(feature = "mount", bsd))]
453
    #[allow(clippy::unnecessary_cast)] // Not unnecessary on all arches
454
    pub fn flags(&self) -> MntFlags {
455
        MntFlags::from_bits_truncate(self.0.f_flags as i32)
456
    }
457
458
    /// Get the mount flags
459
    // The f_flags field exists on Android and Fuchsia too, but without man
460
    // pages I can't tell if it can be cast to FsFlags.
461
    #[cfg(target_os = "linux")]
462
0
    pub fn flags(&self) -> FsFlags {
463
0
        FsFlags::from_bits_truncate(self.0.f_flags as libc::c_ulong)
464
0
    }
465
466
    /// Maximum length of filenames
467
    #[cfg(any(target_os = "freebsd", target_os = "openbsd"))]
468
    pub fn maximum_name_length(&self) -> u32 {
469
        self.0.f_namemax
470
    }
471
472
    /// Maximum length of filenames
473
    #[cfg(all(
474
        target_os = "linux",
475
        target_arch = "s390x",
476
        not(target_env = "musl")
477
    ))]
478
    pub fn maximum_name_length(&self) -> u32 {
479
        self.0.f_namelen
480
    }
481
482
    /// Maximum length of filenames
483
    #[cfg(all(target_os = "linux", target_env = "musl"))]
484
    pub fn maximum_name_length(&self) -> libc::c_ulong {
485
        self.0.f_namelen
486
    }
487
488
    /// Maximum length of filenames
489
    #[cfg(all(target_os = "linux", target_env = "uclibc"))]
490
    pub fn maximum_name_length(&self) -> libc::c_int {
491
        self.0.f_namelen
492
    }
493
494
    /// Maximum length of filenames
495
    #[cfg(all(
496
        target_os = "linux",
497
        not(any(
498
            target_arch = "s390x",
499
            target_env = "musl",
500
            target_env = "ohos",
501
            target_env = "uclibc"
502
        ))
503
    ))]
504
0
    pub fn maximum_name_length(&self) -> libc::__fsword_t {
505
0
        self.0.f_namelen
506
0
    }
507
508
    /// Maximum length of filenames
509
    #[cfg(target_os = "android")]
510
    pub fn maximum_name_length(&self) -> libc::c_ulong {
511
        self.0.f_namelen
512
    }
513
514
    /// Total data blocks in filesystem
515
    #[cfg(any(
516
        apple_targets,
517
        linux_android,
518
        target_os = "freebsd",
519
        target_os = "fuchsia",
520
        target_os = "openbsd",
521
    ))]
522
0
    pub fn blocks(&self) -> u64 {
523
0
        self.0.f_blocks
524
0
    }
525
526
    /// Total data blocks in filesystem
527
    #[cfg(any(target_os = "dragonfly", target_os = "cygwin"))]
528
    pub fn blocks(&self) -> libc::c_long {
529
        self.0.f_blocks
530
    }
531
532
    /// Total data blocks in filesystem
533
    #[cfg(target_os = "emscripten")]
534
    pub fn blocks(&self) -> u32 {
535
        self.0.f_blocks
536
    }
537
538
    /// Free blocks in filesystem
539
    #[cfg(any(
540
        apple_targets,
541
        linux_android,
542
        target_os = "freebsd",
543
        target_os = "fuchsia",
544
        target_os = "openbsd",
545
    ))]
546
0
    pub fn blocks_free(&self) -> u64 {
547
0
        self.0.f_bfree
548
0
    }
549
550
    /// Free blocks in filesystem
551
    #[cfg(any(target_os = "dragonfly", target_os = "cygwin"))]
552
    pub fn blocks_free(&self) -> libc::c_long {
553
        self.0.f_bfree
554
    }
555
556
    /// Free blocks in filesystem
557
    #[cfg(target_os = "emscripten")]
558
    pub fn blocks_free(&self) -> u32 {
559
        self.0.f_bfree
560
    }
561
562
    /// Free blocks available to unprivileged user
563
    #[cfg(any(apple_targets, linux_android, target_os = "fuchsia"))]
564
0
    pub fn blocks_available(&self) -> u64 {
565
0
        self.0.f_bavail
566
0
    }
567
568
    /// Free blocks available to unprivileged user
569
    #[cfg(any(target_os = "dragonfly", target_os = "cygwin"))]
570
    pub fn blocks_available(&self) -> libc::c_long {
571
        self.0.f_bavail
572
    }
573
574
    /// Free blocks available to unprivileged user
575
    #[cfg(any(target_os = "freebsd", target_os = "openbsd"))]
576
    pub fn blocks_available(&self) -> i64 {
577
        self.0.f_bavail
578
    }
579
580
    /// Free blocks available to unprivileged user
581
    #[cfg(target_os = "emscripten")]
582
    pub fn blocks_available(&self) -> u32 {
583
        self.0.f_bavail
584
    }
585
586
    /// Total file nodes in filesystem
587
    #[cfg(any(
588
        apple_targets,
589
        linux_android,
590
        target_os = "freebsd",
591
        target_os = "fuchsia",
592
        target_os = "openbsd",
593
    ))]
594
0
    pub fn files(&self) -> u64 {
595
0
        self.0.f_files
596
0
    }
597
598
    /// Total file nodes in filesystem
599
    #[cfg(any(target_os = "dragonfly", target_os = "cygwin"))]
600
    pub fn files(&self) -> libc::c_long {
601
        self.0.f_files
602
    }
603
604
    /// Total file nodes in filesystem
605
    #[cfg(target_os = "emscripten")]
606
    pub fn files(&self) -> u32 {
607
        self.0.f_files
608
    }
609
610
    /// Free file nodes in filesystem
611
    #[cfg(any(
612
        apple_targets,
613
        linux_android,
614
        target_os = "fuchsia",
615
        target_os = "openbsd",
616
    ))]
617
0
    pub fn files_free(&self) -> u64 {
618
0
        self.0.f_ffree
619
0
    }
620
621
    /// Free file nodes in filesystem
622
    #[cfg(any(target_os = "dragonfly", target_os = "cygwin"))]
623
    pub fn files_free(&self) -> libc::c_long {
624
        self.0.f_ffree
625
    }
626
627
    /// Free file nodes in filesystem
628
    #[cfg(target_os = "freebsd")]
629
    pub fn files_free(&self) -> i64 {
630
        self.0.f_ffree
631
    }
632
633
    /// Free file nodes in filesystem
634
    #[cfg(target_os = "emscripten")]
635
    pub fn files_free(&self) -> u32 {
636
        self.0.f_ffree
637
    }
638
639
    /// Filesystem ID
640
0
    pub fn filesystem_id(&self) -> fsid_t {
641
0
        self.0.f_fsid
642
0
    }
643
}
644
645
impl Debug for Statfs {
646
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
647
0
        let mut ds = f.debug_struct("Statfs");
648
        #[cfg(not(target_os = "cygwin"))]
649
0
        ds.field("optimal_transfer_size", &self.optimal_transfer_size());
650
0
        ds.field("block_size", &self.block_size());
651
0
        ds.field("blocks", &self.blocks());
652
0
        ds.field("blocks_free", &self.blocks_free());
653
0
        ds.field("blocks_available", &self.blocks_available());
654
0
        ds.field("files", &self.files());
655
0
        ds.field("files_free", &self.files_free());
656
0
        ds.field("filesystem_id", &self.filesystem_id());
657
        #[cfg(all(feature = "mount", bsd))]
658
        ds.field("flags", &self.flags());
659
0
        ds.finish()
660
0
    }
661
}
662
663
/// Describes a mounted file system.
664
///
665
/// The result is OS-dependent.  For a portable alternative, see
666
/// [`statvfs`](crate::sys::statvfs::statvfs).
667
///
668
/// # Arguments
669
///
670
/// `path` - Path to any file within the file system to describe
671
0
pub fn statfs<P: ?Sized + NixPath>(path: &P) -> Result<Statfs> {
672
    unsafe {
673
0
        let mut stat = mem::MaybeUninit::<type_of_statfs>::uninit();
674
0
        let res = path.with_nix_path(|path| {
675
0
            LIBC_STATFS(path.as_ptr(), stat.as_mut_ptr())
676
0
        })?;
677
0
        Errno::result(res).map(|_| Statfs(stat.assume_init()))
678
    }
679
0
}
680
681
/// Describes a mounted file system.
682
///
683
/// The result is OS-dependent.  For a portable alternative, see
684
/// [`fstatvfs`](crate::sys::statvfs::fstatvfs).
685
///
686
/// # Arguments
687
///
688
/// `fd` - File descriptor of any open file within the file system to describe
689
0
pub fn fstatfs<Fd: AsFd>(fd: Fd) -> Result<Statfs> {
690
    unsafe {
691
0
        let mut stat = mem::MaybeUninit::<type_of_statfs>::uninit();
692
0
        Errno::result(LIBC_FSTATFS(fd.as_fd().as_raw_fd(), stat.as_mut_ptr()))
693
0
            .map(|_| Statfs(stat.assume_init()))
Unexecuted instantiation: nix::sys::statfs::fstatfs::<&std::os::fd::owned::OwnedFd>::{closure#0}
Unexecuted instantiation: nix::sys::statfs::fstatfs::<_>::{closure#0}
694
    }
695
0
}
Unexecuted instantiation: nix::sys::statfs::fstatfs::<&std::os::fd::owned::OwnedFd>
Unexecuted instantiation: nix::sys::statfs::fstatfs::<_>