summaryrefslogtreecommitdiff
path: root/net/samba420/files/0023-Add-cmd_get_quota-test-function-into-vfstest-to-test.patch
blob: 581da64f67471bea0dcd4e1b1ec0d95c42de5276 (plain) (blame)
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
From 2e927425e04d65027db5348b3e89a69a5e447556 Mon Sep 17 00:00:00 2001
From: "Timur I. Bakeyev" <timur@FreeBSD.org>
Date: Mon, 31 May 2021 03:07:40 +0200
Subject: [PATCH 23/28] Add `cmd_get_quota()` test function into vfstest, to
 test disk quota interface.

Signed-off-by: Timur I. Bakeyev <timur@FreeBSD.org>
---
 source3/torture/cmd_vfs.c     | 78 +++++++++++++++++++++++++++++++++++
 source3/torture/wscript_build |  2 +-
 2 files changed, 79 insertions(+), 1 deletion(-)

diff --git a/source3/torture/cmd_vfs.c b/source3/torture/cmd_vfs.c
index 38ce0dc4ff6..1bc4639d2a2 100644
--- a/source3/torture/cmd_vfs.c
+++ b/source3/torture/cmd_vfs.c
@@ -145,6 +145,83 @@ static NTSTATUS cmd_disk_free(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int ar
 	return NT_STATUS_OK;
 }
 
+static NTSTATUS cmd_get_quota(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
+{
+	struct smb_filename *smb_fname = NULL;
+	uint64_t bsize, dfree, dsize;
+	enum SMB_QUOTA_TYPE qtype;
+	SMB_DISK_QUOTA D;
+	unid_t id;
+	int r;
+
+	if (argc != 4) {
+		printf("Usage: get_quota <path> [user|group] id\n");
+		return NT_STATUS_OK;
+	}
+
+	smb_fname = synthetic_smb_fname(talloc_tos(),
+					argv[1],
+					NULL,
+					NULL,
+					0,
+					ssf_flags());
+	if (smb_fname == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	if(strcmp(argv[2], "user") == 0) {
+		qtype = SMB_USER_FS_QUOTA_TYPE;
+	}
+	else if(strcmp(argv[2], "group") == 0) {
+		qtype = SMB_GROUP_FS_QUOTA_TYPE;
+	}
+	else {
+		printf("Usage: get_quota <path> [user|group] id\n");
+		return NT_STATUS_OK;
+	}
+
+	id.uid = atoi(argv[3]);
+
+	ZERO_STRUCT(D);
+
+	r = SMB_VFS_GET_QUOTA(vfs->conn, smb_fname, qtype, id, &D);
+
+	if (r == -1 && errno != ENOSYS) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	if (r == 0 && (D.qflags & QUOTAS_DENY_DISK) == 0) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	bsize = D.bsize;
+	/* Use softlimit to determine disk space, except when it has been exceeded */
+	if (
+		(D.softlimit && D.curblocks >= D.softlimit) ||
+		(D.hardlimit && D.curblocks >= D.hardlimit) ||
+		(D.isoftlimit && D.curinodes >= D.isoftlimit) ||
+		(D.ihardlimit && D.curinodes>=D.ihardlimit)
+	) {
+		dfree = 0;
+		dsize = D.curblocks;
+	} else if (D.softlimit==0 && D.hardlimit==0) {
+		return NT_STATUS_UNSUCCESSFUL;
+	} else {
+		if (D.softlimit == 0) {
+			D.softlimit = D.hardlimit;
+		}
+		dfree = D.softlimit - D.curblocks;
+		dsize = D.softlimit;
+	}
+
+	printf("get_quota: bsize = %lu, dfree = %lu, dsize = %lu\n",
+			(unsigned long)bsize,
+			(unsigned long)dfree,
+			(unsigned long)dsize);
+
+	return NT_STATUS_OK;
+}
+
 
 static NTSTATUS cmd_opendir(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
 {
@@ -2257,6 +2334,7 @@ struct cmd_set vfs_commands[] = {
 	{ "connect",   cmd_connect,   "VFS connect()",    "connect" },
 	{ "disconnect",   cmd_disconnect,   "VFS disconnect()",    "disconnect" },
 	{ "disk_free",   cmd_disk_free,   "VFS disk_free()",    "disk_free <path>" },
+	{ "get_quota",   cmd_get_quota,   "VFS get_quota()",    "get_quota <path> [user|group] id" },
 	{ "opendir",   cmd_opendir,   "VFS opendir()",    "opendir <fname>" },
 	{ "readdir",   cmd_readdir,   "VFS readdir()",    "readdir" },
 	{ "mkdir",   cmd_mkdir,   "VFS mkdir()",    "mkdir <path>" },
diff --git a/source3/torture/wscript_build b/source3/torture/wscript_build
index 0c4275de795..f75c4bfe2be 100644
--- a/source3/torture/wscript_build
+++ b/source3/torture/wscript_build
@@ -124,4 +124,4 @@ bld.SAMBA3_BINARY('vfstest',
                       smbconf
                       SMBREADLINE
                       ''',
-                 for_selftest=True)
+                 install=True)
-- 
2.37.1