vfs_default_quota.c [plain text]
#include "includes.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_QUOTA
#define DEFAULT_QUOTA_NAME "default_quota"
#define DEFAULT_QUOTA_UID_DEFAULT 0
#define DEFAULT_QUOTA_UID_NOLIMIT_DEFAULT True
#define DEFAULT_QUOTA_GID_DEFAULT 0
#define DEFAULT_QUOTA_GID_NOLIMIT_DEFAULT True
#define DEFAULT_QUOTA_UID(handle) \
(uid_t)lp_parm_int(SNUM((handle)->conn),DEFAULT_QUOTA_NAME,"uid",DEFAULT_QUOTA_UID_DEFAULT)
#define DEFAULT_QUOTA_UID_NOLIMIT(handle) \
lp_parm_bool(SNUM((handle)->conn),DEFAULT_QUOTA_NAME,"uid nolimit",DEFAULT_QUOTA_UID_NOLIMIT_DEFAULT)
#define DEFAULT_QUOTA_GID(handle) \
(gid_t)lp_parm_int(SNUM((handle)->conn),DEFAULT_QUOTA_NAME,"gid",DEFAULT_QUOTA_GID_DEFAULT)
#define DEFAULT_QUOTA_GID_NOLIMIT(handle) \
lp_parm_bool(SNUM((handle)->conn),DEFAULT_QUOTA_NAME,"gid nolimit",DEFAULT_QUOTA_GID_NOLIMIT_DEFAULT)
static int default_quota_get_quota(vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dq)
{
int ret = -1;
if ((ret=SMB_VFS_NEXT_GET_QUOTA(handle, qtype, id, dq))!=0) {
return ret;
}
switch (qtype) {
case SMB_USER_QUOTA_TYPE:
if ((id.uid==DEFAULT_QUOTA_UID(handle)) &&
DEFAULT_QUOTA_UID_NOLIMIT(handle)) {
SMB_QUOTAS_SET_NO_LIMIT(dq);
}
break;
#ifdef HAVE_GROUP_QUOTA
case SMB_GROUP_QUOTA_TYPE:
if ((id.gid==DEFAULT_QUOTA_GID(handle)) &&
DEFAULT_QUOTA_GID_NOLIMIT(handle)) {
SMB_QUOTAS_SET_NO_LIMIT(dq);
}
break;
#endif
case SMB_USER_FS_QUOTA_TYPE:
{
unid_t qid;
uint32 qflags = dq->qflags;
qid.uid = DEFAULT_QUOTA_UID(handle);
SMB_VFS_NEXT_GET_QUOTA(handle, SMB_USER_QUOTA_TYPE, qid, dq);
dq->qflags = qflags;
}
break;
#ifdef HAVE_GROUP_QUOTA
case SMB_GROUP_FS_QUOTA_TYPE:
{
unid_t qid;
uint32 qflags = dq->qflags;
qid.gid = DEFAULT_QUOTA_GID(handle);
SMB_VFS_NEXT_GET_QUOTA(handle, SMB_GROUP_QUOTA_TYPE, qid, dq);
dq->qflags = qflags;
}
break;
#endif
default:
errno = ENOSYS;
return -1;
break;
}
return ret;
}
static int default_quota_set_quota(vfs_handle_struct *handle, enum SMB_QUOTA_TYPE qtype, unid_t id, SMB_DISK_QUOTA *dq)
{
int ret = -1;
switch (qtype) {
case SMB_USER_QUOTA_TYPE:
if ((id.uid==DEFAULT_QUOTA_UID(handle)) &&
DEFAULT_QUOTA_UID_NOLIMIT(handle)) {
return -1;
}
break;
#ifdef HAVE_GROUP_QUOTA
case SMB_GROUP_QUOTA_TYPE:
if ((id.gid==DEFAULT_QUOTA_GID(handle)) &&
DEFAULT_QUOTA_GID_NOLIMIT(handle)) {
return -1;
}
break;
#endif
case SMB_USER_FS_QUOTA_TYPE:
break;
#ifdef HAVE_GROUP_QUOTA
case SMB_GROUP_FS_QUOTA_TYPE:
break;
#endif
default:
errno = ENOSYS;
return -1;
break;
}
if ((ret=SMB_VFS_NEXT_SET_QUOTA(handle, qtype, id, dq))!=0) {
return ret;
}
switch (qtype) {
case SMB_USER_QUOTA_TYPE:
break;
#ifdef HAVE_GROUP_QUOTA
case SMB_GROUP_QUOTA_TYPE:
break;
#endif
case SMB_USER_FS_QUOTA_TYPE:
{
unid_t qid;
qid.uid = DEFAULT_QUOTA_UID(handle);
ret = SMB_VFS_NEXT_SET_QUOTA(handle, SMB_USER_QUOTA_TYPE, qid, dq);
}
break;
#ifdef HAVE_GROUP_QUOTA
case SMB_GROUP_FS_QUOTA_TYPE:
{
unid_t qid;
qid.gid = DEFAULT_QUOTA_GID(handle);
ret = SMB_VFS_NEXT_SET_QUOTA(handle, SMB_GROUP_QUOTA_TYPE, qid, dq);
}
break;
#endif
default:
errno = ENOSYS;
return -1;
break;
}
return ret;
}
static vfs_op_tuple default_quota_ops[] = {
{SMB_VFS_OP(default_quota_get_quota), SMB_VFS_OP_GET_QUOTA, SMB_VFS_LAYER_TRANSPARENT},
{SMB_VFS_OP(default_quota_set_quota), SMB_VFS_OP_SET_QUOTA, SMB_VFS_LAYER_TRANSPARENT},
{SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}
};
NTSTATUS vfs_default_quota_init(void);
NTSTATUS vfs_default_quota_init(void)
{
return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, DEFAULT_QUOTA_NAME, default_quota_ops);
}