Reference

sg_free_fs_stats(3)

get file system statistics

NAME

sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point - get file system statistics

SYNOPSIS

FC#include <statgrab.h>F[0]

FCsg_fs_stats *sg_get_fs_statsF[0] FC(size_t *entries);F[0]

FCsg_fs_stats *sg_get_fs_stats_rF[0] FC(size_t *entries);F[0]

FCsg_fs_stats *sg_get_fs_stats_diffF[0] FC(size_t *entries);F[0]

FCsg_fs_stats *sg_get_fs_stats_diff_betweenF[0] FC(const sg_fs_stats *cur, const sg_fs_stats *last, size_t *entries);F[0]

FCsg_error sg_free_fs_statsF[0] FC(sg_fs_stats *data);F[0]

FCconst char **sg_get_valid_filesystemsF[0] FC(size_t *entries);F[0]

FCsg_error sg_set_valid_filesystemsF[0] FC(const char *valid_fs[]);F[0]

FCint sg_fs_compare_device_nameF[0] FC(const void *va, const void *vb);F[0]

FCint sg_fs_compare_mnt_pointF[0] FC(const void *va, const void *vb);F[0]

DESCRIPTION

The FCsg_get_fs_statsF[0] functions provide statistics of mounted file systems. Both functions take an optional FCentriesF[0] parameter, which points (when given) to a size_t to take the number of returned vector entries.

The FCsg_get_fs_statsF[0]() and FCsg_get_fs_stats_rF[0]() functions deliver the file system statistics of the moment the function is called. The FCsg_get_fs_stats_diffF[0]() and FCsg_get_fs_stats_diff_betweenF[0]() deliver the difference between two calls of FCsg_get_fs_statsF[0]() or FCsg_get_fs_stats_rF[0](), respectively.

API Shortcut

functionreturnsdata owner
sg_get_fs_statsFCsg_fs_statsF[0] *libstatgrab (thread local)
sg_get_fs_stats_rFCsg_fs_statsF[0] *caller
sg_get_fs_stats_diffFCsg_fs_statsF[0] *libstatgrab (thread local)
sg_get_fs_stats_diff_betweenFCsg_fs_statsF[0] *caller
sg_get_valid_filesystemschar **libstatgrab (global)

The FCsg_fs_statsF[0] vectors received from FCsg_get_fs_stats_rF[0]() or FCsg_get_fs_stats_diff_betweenF[0]() must be freed using FCsg_free_fs_statsF[0]() when not needed anymore. The caller is responsible for doing it.

The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc.

To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the FCsg_get_valid_filesystemsF[0]() and the FCsg_set_valid_filesystemsF[0](). The list of FCchar *F[0] parameters both functions work with is always finished with an element pointing to NULL.

The returned list of FCsg_get_valid_filesystemsF[0]() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list:

Remove Network FS Example

FC
int compare_fs_type(const void *va, const void *vb) {
    const char **a = (const char **)va;
    const char **b = (const char **)vb;
    return strcmp( *a, *b );
}
void filter_network_fs_types(void) {
    /* known network file system names on different platforms */
    const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" };
    const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0])
    size_t fs_entries = 0;
    const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries);
    /* duplicate into own memory to modify list */
    char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) );
    memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) );
    size_t i;
    for( i = 0; i < nfs_types_count; ++i ) {
        char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0],
                                 fs_entries, sizeof(valid_fs[0]),
                                 compare_fs_type );
        if( NULL != inv_fs ) {
            /* copy including trailing NULL pointer */
            memmove( inv_fs, inv_fs + 1, fs_entries - (inv_fs - valid_fs) );
            --fs_entries;
        }
    }
    sg_set_valid_filesystems( valid_fs );
    free( valid_fs );
}
        F[0]

Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified.

The list returned by FCsg_get_valid_filesystemsF[0]() might become invalid when used while the process makes calls to FCsg_set_valid_filesystemsF[0](). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics.

Additionally two support functions for FCqsortF[0](3) are available: FCsg_fs_compare_device_nameF[0]() and FCsg_fs_compare_mnt_pointF[0]().

Sort Example

FC
size_t entries;
sg_fs_stats *fs_stats = NULL;
while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) {
    /* order entries alphabetically using the mountpoint */
    qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point );
    show_fs_stats( fs_stats );
}
        F[0]

RETURN VALUES

FCsg_get_fs_statsF[0] returns a pointer to a structure of type FCsg_fs_statsF[0].

FC
typedef enum {
        sg_fs_unknown  = 0,
        sg_fs_regular  = 1 << 0,
        sg_fs_special  = 1 << 1,
        sg_fs_loopback = 1 << 2,
        sg_fs_remote   = 1 << 3,
        sg_fs_local    = (sg_fs_regular | sg_fs_special),
        sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote)
} sg_fs_device_type;
    F[0]

FC
typedef struct {
        char *device_name;
        char *fs_type;
        char *mnt_point;
        sg_fs_device_type device_type;
        unsigned long long size;
        unsigned long long used;
        unsigned long long free;
        unsigned long long avail;
        unsigned long long total_inodes;
        unsigned long long used_inodes;
        unsigned long long free_inodes;
        unsigned long long avail_inodes;
        unsigned long long io_size;
        unsigned long long block_size;
        unsigned long long total_blocks;
        unsigned long long free_blocks;
        unsigned long long used_blocks;
        unsigned long long avail_blocks;
        time_t systime;
} sg_fs_stats;
    F[0]

FCdevice_nameF[0]

The name known to the operating system. (eg. on linux it might be hda)

FCfs_typeF[0]

The file system type of the file system (eg. hpfs or ufs).

FCmnt_pointF[0]

The mount point at which the file system is mounted.

FCdevice_typeF[0]

The device type of the file system, currently not filled and always sg_fs_unknown.

FCsizeF[0]

The total size, in bytes, of the file system.

size = used + free

FCusedF[0]

The amount of space, in bytes, used on the file system.

FCavailF[0]

The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space).

avail = free - reserved

FCfreeF[0]

The amount of space, in bytes, free on the file system.

FCtotal_inodesF[0]

The total number of inodes in the file system.

FCused_inodesF[0]

The number of used inodes in the file system.

FCfree_inodesF[0]

The number of free inodes in the file system.

FCavail_inodesF[0]

The number of free inodes available to non-privileged processes.

FCio_sizeF[0]

A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size.

FCblock_sizeF[0]

The size in bytes of the minimum unit of allocation on this file system.

FCtotal_blocksF[0]

The total number of blocks in the file system.

FCfree_blocksF[0]

The number of free blocks in the file system.

FCused_blocksF[0]

The number of used blocks in the file system.

FCavail_blocksF[0]

The number of free blocks available to non-privileged processes.

FCsystimeF[0]

The time in seconds since epoch when the statistic was retrieved from kernel.

BUGS

Only mounted file systems are recognised.

Some file systems might be reported twice when mounted on different mount points.

The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally.

Calling FCsg_set_valid_filesystemsF[0] with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list.

SEE ALSO

statgrab(3)

WEBSITE

⟨https://libstatgrab.org/⟩

History