OZ++ Class: VFileSystemStatistics
/******************************************************************************
 *
 * Copyright (c) 2016 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 *  VFileSystemStatistics.h
 *
 *****************************************************************************/

#pragma once

#include <oz++/CommonObject.h>
#include <oz++/Exception.h>
#include <sys/statvfs.h>


/*
struct statvfs {
  unsigned long  f_bsize;    // file system block size 
  unsigned long  f_frsize;   // fragment size 
  fsblkcnt_t     f_blocks;   // size of fs in f_frsize units 
  fsblkcnt_t     f_bfree;    // # free blocks 
  fsblkcnt_t     f_bavail;   // # free blocks for unprivileged users 
  fsfilcnt_t     f_files;    // # inodes 
  fsfilcnt_t     f_ffree;    // # free inodes 
  fsfilcnt_t     f_favail;   // # free inodes for unprivileged users 
  unsigned long  f_fsid;     // file system ID 
  unsigned long  f_flag;     // mount flags 
  unsigned long  f_namemax;  // maximum filename length 
};
The types fsblkcnt_t and fsfilcnt_t are defined in <sys/types.h>. Both used to be unsigned long. 
 */

namespace OZ {

class VFileSystemStatistics :public CommonObject {
private:
  struct statvfs vfs;

public:
  VFileSystemStatistics(const char* path="/")
  {
    if (path == NULL) {
      throw IException("Invalid argument. path is NULL");
    }
    int rc = statvfs(path, &vfs);
    if (rc != 0) {
      throw IException("Failed to statvfs for %s", path);
    }
  }

  VFileSystemStatistics(int fd)
  {
    int rc = fstatvfs(fd, &vfs); 
    if (rc != 0) {
      throw IException("Failed to statvfs for %d", fd);
    }
  }

  unsigned long  systemBlockSize()
  {
    return vfs.f_bsize;    // file system block size 
  }

  unsigned long  fragmentSize()
  {
    return vfs.f_frsize;   // fragment size 
  }

  fsblkcnt_t     frsizeUnits()
  {
    return vfs.f_blocks;   // size of fs in f_frsize units 
  }

  fsblkcnt_t     freeBlocks()
  {
    return vfs.f_bfree;    // # free blocks 
  }

  fsblkcnt_t     freeBlocksForUnprivilegedUsers()
  {
    return vfs.f_bavail;   // # free blocks for unprivileged users 
  }

  fsfilcnt_t     inodes()
  {
    return vfs.f_files;    // # inodes 
  }

  fsfilcnt_t     freeInoodes()
  {
    return vfs.f_ffree;    // # free inodes 
  }

  fsfilcnt_t     freeInodesForUnpriviledUsers()
  {
    return vfs.f_favail;   // # free inodes for unprivileged users 
  }

  unsigned long  fileSystemID()
  {
    return vfs.f_fsid;     // file system ID 
  }

  unsigned long  mountFlags()
  {
    return vfs.f_flag;     // mount flags 
  }

  unsigned long  maximumFileNameLength()
  {
    return vfs.f_namemax;  // maximum filename length 
  }

  virtual void display()
  {
    printf("SystemBlockSize                %lu\n",  systemBlockSize());
    printf("FragmentSize                   %lu\n",  fragmentSize());
    printf("FrSizeUnits                    %lu\n", frsizeUnits());
    printf("FreeBlocks                     %lu\n",  freeBlocks());
    printf("FreeBlocksForUnprivilegedUsers %lu\n", freeBlocksForUnprivilegedUsers());
    printf("Inodes                         %lu\n", inodes());
    printf("FreeInodes                     %lu\n", freeInoodes());
    printf("FreeInodesForUnpriviledUsers   %lu\n", freeInodesForUnpriviledUsers());
    printf("FileSystemiD                   %lu\n", fileSystemID());
    printf("MountFlags                     %lu\n", mountFlags());
    printf("MaxFileNameLength              %lu\n", maximumFileNameLength());
  }
};

}