/*             ----> DO NOT REMOVE THE FOLLOWING NOTICE <----

                   Copyright (c) 2014-2015 Datalight, Inc.
                       All Rights Reserved Worldwide.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; use version 2 of the License.

    This program is distributed in the hope that it will be useful,
    but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/*  Businesses and individuals that for commercial or other reasons cannot
    comply with the terms of the GPLv2 license may obtain a commercial license
    before incorporating Reliance Edge into proprietary software for
    distribution in any form.  Visit http://www.datalight.com/reliance-edge for
    more information.
*/
/** @file
*/
#ifndef REDSTAT_H
#define REDSTAT_H


/** Mode bit for a directory. */
#define RED_S_IFDIR  0x4000U

/** Mode bit for a regular file. */
#define RED_S_IFREG  0x8000U

/** @brief Test for a directory.
*/
#define RED_S_ISDIR(m)  (((m) & RED_S_IFDIR) != 0U)

/** @brief Test for a regular file.
*/
#define RED_S_ISREG(m)  (((m) & RED_S_IFREG) != 0U)


/** File system is read-only. */
#define RED_ST_RDONLY   0x00000001U

/** File system ignores suid and sgid bits. */
#define RED_ST_NOSUID   0x00000002U


/** @brief Status information on an inode.
*/
typedef struct
{
    uint8_t     st_dev;     /**< Volume number of volume containing file. */
    uint32_t    st_ino;     /**< File serial number (inode number). */
    uint16_t    st_mode;    /**< Mode of file. */
    uint16_t    st_nlink;   /**< Number of hard links to the file. */
    uint64_t    st_size;    /**< File size in bytes. */
  #if REDCONF_INODE_TIMESTAMPS == 1
    uint32_t    st_atime;   /**< Time of last access (seconds since 01-01-1970). */
    uint32_t    st_mtime;   /**< Time of last data modification (seconds since 01-01-1970). */
    uint32_t    st_ctime;   /**< Time of last status change (seconds since 01-01-1970). */
  #endif
  #if REDCONF_INODE_BLOCKS == 1
    uint32_t    st_blocks;  /**< Number of blocks allocated for this object. */
  #endif
} REDSTAT;


/** @brief Status information on a file system volume.
*/
typedef struct
{
    uint32_t    f_bsize;    /**< File system block size. */
    uint32_t    f_frsize;   /**< Fundamental file system block size. */
    uint32_t    f_blocks;   /**< Total number of blocks on file system in units of f_frsize. */
    uint32_t    f_bfree;    /**< Total number of free blocks. */
    uint32_t    f_bavail;   /**< Number of free blocks available to non-privileged process. */
    uint32_t    f_files;    /**< Total number of file serial numbers. */
    uint32_t    f_ffree;    /**< Total number of free file serial numbers. */
    uint32_t    f_favail;   /**< Number of file serial numbers available to non-privileged process. */
    uint32_t    f_fsid;     /**< File system ID (useless, populated with zero). */
    uint32_t    f_flag;     /**< Bit mask of f_flag values.  Includes read-only file system flag. */
    uint32_t    f_namemax;  /**< Maximum filename length. */
    uint64_t    f_maxfsize; /**< Maximum file size (POSIX extension). */
    uint32_t    f_dev;      /**< Volume number (POSIX extension). */
} REDSTATFS;


#endif

