blob: cb1f22f7c87acc74dcfcdb4d16c9eb5fcfd77981 [file] [log] [blame]
/*
*
* Headerfile of quota interactions with system - filenames, fstab...
*
*/
#ifndef GUARD_QUOTASYS_H
#define GUARD_QUOTASYS_H
#include <sys/types.h>
#include <inttypes.h>
#include "mntopt.h"
#include "quota.h"
#define MAXNAMELEN 64 /* Maximal length of user/group name */
#define MAXTIMELEN 40 /* Maximal length of time string */
#define MAXNUMLEN 32 /* Maximal length of number */
/* Flags for formatting time */
#define TF_ROUND 0x1 /* Should be printed time rounded? */
/* Flags for IO initialization */
#define IOI_READONLY 0x1 /* Only readonly access */
#define IOI_INITSCAN 0x2 /* Prepare handle for scanning dquots */
#define IOI_NFS_MIXED_PATHS 0x4 /* Trim leading / from NFSv4 mountpoints */
/* Interface versions */
#define IFACE_VFSOLD 1
#define IFACE_VFSV0 2
#define IFACE_GENERIC 3
/* Path to export table of NFS daemon */
#define NFSD_XTAB_PATH "/var/lib/nfs/etab"
/* Supported kernel interface */
extern int kernel_iface;
struct mount_entry {
char *me_type; /* Type of filesystem for given entry */
char *me_opts; /* Options of filesystem */
dev_t me_dev; /* Device filesystem is mounted on */
ino_t me_ino; /* Inode number of root of filesystem */
const char *me_devname; /* Name of device (after pass through get_device_name()) */
const char *me__dir; /* One mountpoint of a filesystem (strdup()ed) */
const char *me_dir; /* Current mountpoint of a filesystem to process */
int me_qfmt[MAXQUOTAS]; /* Detected quota formats */
};
struct fs_project {
qid_t pr_id;
char *pr_name;
};
/*
* Exported functions
*/
/* Check whether type is one of the NFS filesystems */
int nfs_fstype(char *);
/* Quota file is treated as metadata? */
int meta_qf_fstype(char *type);
/* Convert quota type to written form */
char *type2name(int);
/* Rewind /etc/projid to the beginning */
void setprent(void);
/* Close /etc/projid file */
void endprent(void);
/* Get next entry in /etc/projid */
struct fs_project *getprent(void);
/* Convert username to uid */
uid_t user2uid(char *, int flag, int *err);
/* Convert groupname to gid */
gid_t group2gid(char *, int flag, int *err);
/* Convert project name to project id */
qid_t project2pid(char *name, int flag, int *err);
/* Convert user/groupname to id */
int name2id(char *name, int qtype, int flag, int *err);
/* Convert uid to username */
int uid2user(uid_t, char *);
/* Convert gid to groupname */
int gid2group(gid_t, char *);
/* Convert project id to name */
int pid2project(qid_t, char *);
/* Convert id to user/group name */
int id2name(int id, int qtype, char *buf);
/* Possible default passwd handling */
#define PASSWD_FILES 0
#define PASSWD_DB 1
/* Parse /etc/nsswitch.conf and return type of default passwd handling */
int passwd_handling(void);
/* Convert quota format name to number */
int name2fmt(char *str);
/* Convert quota format number to name */
char *fmt2name(int fmt);
/* Convert output format name to number */
int name2ofmt(char *str);
/* Convert output format number to name */
char *ofmt2name(int fmt);
/* Convert utility to kernel format numbers */
int util2kernfmt(int fmt);
/* Convert time difference between given time and current time to printable form */
void difftime2str(time_t, char *);
/* Round difference of two time_t values into int32_t */
int32_t difftime2net(time_t later, time_t sooner);
/* Convert time to printable form */
void time2str(time_t, char *, int);
/* Convert number and units to time in seconds */
int str2timeunits(time_t, char *, time_t *);
/* Convert number in quota blocks to short printable form */
void space2str(qsize_t, char *, int);
/* Convert block number with unit from string to quota blocks */
const char *str2space(const char *string, qsize_t *space);
/* Convert number to short printable form */
void number2str(long long, char *, int);
/* Convert inode number with unit from string to quota inodes. */
const char *str2number(const char *string, qsize_t *inodes);
/* Return pointer to given mount option in mount option string */
char *str_hasmntopt(const char *optstring, const char *opt);
/* Check to see if particular quota type is configured */
static inline int me_hasquota(struct mount_entry *mnt, int type)
{
return mnt->me_qfmt[type] >= 0;
}
/* Flags for get_qf_name() */
#define NF_EXIST 1 /* Check whether file exists */
#define NF_FORMAT 2 /* Check whether file is in proper format */
/* Get quotafile name for given entry */
int get_qf_name(struct mount_entry *mnt, int type, int fmt, int flags, char **filename);
/* Detect newest quota format with existing file */
int detect_quota_files(struct mount_entry *mnt, int type, int fmt);
/* Create NULL-terminated list of handles for quotafiles for given mountpoints */
struct quota_handle **create_handle_list(int count, char **mntpoints, int type, int fmt,
int ioflags, int mntflags);
/* Dispose given list of handles */
int dispose_handle_list(struct quota_handle **hlist);
/* Check whether given device name matches quota handle device */
int devcmp_handle(const char *dev, struct quota_handle *h);
/* Check whether two quota handles have same device */
int devcmp_handles(struct quota_handle *a, struct quota_handle *b);
/* Check kernel supported quotafile format */
void init_kernel_interface(void);
/*
* Check whether is quota turned on on given device for given type. This
* works for XFS for all kernels and for other filesystems since kernel 4.1.
*/
int kern_quota_state_xfs(const char *dev, int type);
/* Check whether is quota turned on on given device for given type */
int kern_quota_on(struct mount_entry *mnt, int type, int fmt);
/* Return whether kernel is able to handle given format */
int kern_qfmt_supp(int fmt);
/* Flags for init_mounts_scan() */
#define MS_NO_MNTPOINT 0x01 /* Specified directory needn't be mountpoint */
#define MS_NO_AUTOFS 0x02 /* Ignore autofs mountpoints */
#define MS_QUIET 0x04 /* Be quiet with error reporting */
#define MS_LOCALONLY 0x08 /* Ignore nfs mountpoints */
#define MS_XFS_DISABLED 0x10 /* Return also XFS mountpoints with quota disabled */
#define MS_NFS_ALL 0x20 /* Don't filter NFS mountpoints on the same device */
/* Initialize mountpoints scan */
int init_mounts_scan(int dcnt, char **dirs, int flags);
/* Return next mountpoint for scan */
struct mount_entry *get_next_mount(void);
/* Free all structures associated with mountpoints scan */
void end_mounts_scan(void);
/* Quota output formats */
#define QOF_ERROR -1
#define QOF_DEFAULT 0
#define QOF_CSV 1
#define QOF_XML 2
#endif /* GUARD_QUOTASYS_H */