/usr/include/ui-utilcpp/QuotaInfo.hpp is in libui-utilcpp-dev 1.8.3-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | /**
* @file
* @author Schlund + Partner AG
*
*/
#ifndef UI_UTIL_QUOTAINFO_HPP
#define UI_UTIL_QUOTAINFO_HPP
// STDC++
#include <string>
#include <vector>
// C++ libraries
#include <ui-utilcpp/Exception.hpp>
#include <ui-utilcpp/Sys.hpp>
namespace UI {
namespace Util {
/** @brief Quota information abstraction.
*
* May be extended easily be adding new methods:
* - Add a new private methodXXX method (e.g. methodWinFake) that somehow
* sets all the quota values.
* - Add it to the method vector (see constructor of QuotaInfo::Methods).
*
* @todo: The interface is focused on linux "standard" quota
* interface. Interface should rather be most powerful, with lesser
* implementations falling back to sane defaults.
*
* @todo: Nicer way to find out what interface to use rather then
* testing on by one (check "quota" source).
*/
class QuotaInfo
{
public:
/** @brief Helper class to hold the device string and (optional) the
* fs type (to be able to do better selection on the quota method to
* use). */
class FS
{
friend class QuotaInfo;
public:
FS(std::string const & dev, std::string const & fstype="")
:dev_(dev)
,fstype_(fstype)
{}
std::string const & getDevice() const { return dev_; }
std::string const & getType() const { return fstype_; }
std::string getMethods(std::string const & fstype="") const;
private:
std::string dev_;
std::string fstype_;
};
/** @brief Get FS information from any file in that fs.
*
* @note: This method is potentially NOT thread-safe (uses getmntent under linux).
*/
static FS file2fs(std::string const & fName, std::string const & tab="/proc/mounts");
/** @brief Type of quota information. */
enum Type
{
Usr_, Grp_
};
/**
* @param fs Device name (std::string - implicit) or file system (FS).
* @param id ID as in quotactl(2), normally a user or group ID.
* @param type Type (user or group) of quota info to retrieve.
* @param strPath Extra parameter for windows "quota".
*/
QuotaInfo(FS const & fs, int const id=Sys::geteuid(), Type const type=Usr_, std::string const & strPath = "");
public:
/** @brief Get method string of utilized method. */
std::string getMethod() const;
/** @brief Hard limit of disk blocks. */
unsigned long getBlockHL() const;
/** @brief Soft limit of disk blocks. */
unsigned long getBlockSL() const;
/** @brief Current block usage. */
unsigned long getBlocks() const;
/** @brief Hard limit of inodes. */
unsigned long getINodeHL() const;
/** @brief Soft limit of inodes. */
unsigned long getINodeSL() const;
/** @brief Current inode usage. */
unsigned long getINodes() const;
/** @brief Block timer limit. */
time_t getBlockTL() const;
/** @brief Inodes timer limit. */
time_t getINodeTL() const;
/** @brief Helper for getFree* methods. */
bool getFree(unsigned long const limit, unsigned long const blocks, unsigned long & free) const;
/** @brief Get free blocks from hard limit. False, if there is no hard limit. */
bool getFreeBlocksHL(unsigned long & free) const;
/** @brief Get free blocks from soft limit. False, if there is no soft limit. */
bool getFreeBlocksSL(unsigned long & free) const;
/** @brief Get free indoes from hard limit. False, if there is no hard limit. */
bool getFreeINodesHL(unsigned long & free) const;
/** @brief Get free inodes from soft limit. False, if there is no soft limit. */
bool getFreeInodesSL(unsigned long & free) const;
/** @brief QuotaInfo exceptions. */
class Exception: public UI::Util::Exception
{
public:
Exception(std::string const & what, std::string const & debug)
:UI::Util::Exception(what, debug)
{};
};
private:
typedef void (QuotaInfo::*Method) (std::string const &, uid_t const);
#ifdef HAVE_SYS_QUOTA_H
/** @brief Method for linux quota version 1 (@e vfsold). */
void methodLinuxV1(std::string const & dev, uid_t const uid);
/** @brief Method for linux quota versions 1,2 (@e vfsold, @e vfsv0) (requires "recent" kernel). */
void methodLinuxV2(std::string const & dev, uid_t const uid);
#endif
#ifdef HAVE_XFS_XQM_H
/** @brief Method for XFS quota. */
void methodLinuxXfs(std::string const & dev, uid_t const uid);
#endif
/** @brief Method for (NFS) quota via rpc. */
void methodLinuxRpc(std::string const & dev, uid_t const uid);
#ifdef WIN32
#ifndef W2K8
void noQuota(std::string const & dev, uid_t const uid);
#else
void w2k8Quota(std::string const & dev, uid_t const uid);
#endif
#endif
private:
/** @brief: Block size used for all block values. */
static unsigned long BlockSize_;
class Methods
{
public:
typedef std::map<std::string, Method> MethodMap;
typedef std::vector<MethodMap::const_iterator> MethodVec;
typedef std::map<std::string, MethodVec> FSMap;
Methods();
MethodMap m_;
FSMap f_;
MethodVec const & getMethods(std::string const & fstype) const;
};
static Methods const methods_;
int const sub_;
std::string const home_;
std::string method_;
unsigned long blockHL_;
unsigned long blockSL_;
unsigned long blocks_;
unsigned long inodeHL_;
unsigned long inodeSL_;
unsigned long inodes_;
time_t blockTL_;
time_t inodeTL_;
};
/** @brief Variant of QuotaInfo from any file in FS.
*
* @note: Constructor potentially is NOT thread-safe: @see file2fs.
*
* @note Usually, you instantiate one FS object when your program
* initializes, and then use that for all QuotaInfo() calls
* thereafter. This is just a shortcut that you should not use if you
* have several calls on the same FS.
*/
class FQuotaInfo: public QuotaInfo
{
public:
/**
* @param fileName Any file names on the FS you want to run quota on.
* @param id ID as in quotactl(2), normally a user or group ID.
* @param type Type (user or group) of quota info to retrieve.
*/
FQuotaInfo(std::string const & fileName, int const id=Sys::geteuid(), Type const type=Usr_)
:QuotaInfo(file2fs(fileName), id, type)
{}
};
}}
#endif
|