summaryrefslogtreecommitdiff
path: root/source4/torture/qfsinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/torture/qfsinfo.c')
-rw-r--r--source4/torture/qfsinfo.c286
1 files changed, 0 insertions, 286 deletions
diff --git a/source4/torture/qfsinfo.c b/source4/torture/qfsinfo.c
deleted file mode 100644
index fc4947e158..0000000000
--- a/source4/torture/qfsinfo.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- RAW_QFS_* individual test suite
- Copyright (C) Andrew Tridgell 2003
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-
-
-static struct {
- const char *name;
- enum fsinfo_level level;
- NTSTATUS status;
- union smb_fsinfo fsinfo;
-} levels[] = {
- {"DSKATTR", RAW_QFS_DSKATTR, },
- {"ALLOCATION", RAW_QFS_ALLOCATION, },
- {"VOLUME", RAW_QFS_VOLUME, },
- {"VOLUME_INFO", RAW_QFS_VOLUME_INFO, },
- {"SIZE_INFO", RAW_QFS_SIZE_INFO, },
- {"DEVICE_INFO", RAW_QFS_DEVICE_INFO, },
- {"ATTRIBUTE_INFO", RAW_QFS_ATTRIBUTE_INFO, },
- {"VOLUME_INFORMATION", RAW_QFS_VOLUME_INFORMATION, },
- {"SIZE_INFORMATION", RAW_QFS_SIZE_INFORMATION, },
- {"DEVICE_INFORMATION", RAW_QFS_DEVICE_INFORMATION, },
- {"ATTRIBUTE_INFORMATION", RAW_QFS_ATTRIBUTE_INFORMATION, },
- {"QUOTA_INFORMATION", RAW_QFS_QUOTA_INFORMATION, },
- {"FULL_SIZE_INFORMATION", RAW_QFS_FULL_SIZE_INFORMATION, },
- {"OBJECTID_INFORMATION", RAW_QFS_OBJECTID_INFORMATION, },
- { NULL, }
-};
-
-
-/*
- find a level in the levels[] table
-*/
-static union smb_fsinfo *find(const char *name)
-{
- int i;
- for (i=0; levels[i].name; i++) {
- if (strcmp(name, levels[i].name) == 0) {
- return &levels[i].fsinfo;
- }
- }
- return NULL;
-}
-
-/* local macros to make the code below more readable */
-#define VAL_EQUAL(n1, v1, n2, v2) do {if (s1->n1.out.v1 != s2->n2.out.v2) { \
- printf("%s/%s [%u] != %s/%s [%u] at %s(%d)\n", \
- #n1, #v1, (uint_t)s1->n1.out.v1, \
- #n2, #v2, (uint_t)s2->n2.out.v2, \
- __FILE__, __LINE__); \
- ret = False; \
-}} while(0)
-
-#define STR_EQUAL(n1, v1, n2, v2) do {if (!s1->n1.out.v1 && !s2->n2.out.v2) return True; \
- if (!s1->n1.out.v1 || !s2->n2.out.v2) return False; \
- if (strcmp(s1->n1.out.v1, s2->n2.out.v2)) { \
- printf("%s/%s [%s] != %s/%s [%s] at %s(%d)\n", \
- #n1, #v1, s1->n1.out.v1, \
- #n2, #v2, s2->n2.out.v2, \
- __FILE__, __LINE__); \
- ret = False; \
-}} while(0)
-
-#define STRUCT_EQUAL(n1, v1, n2, v2) do {if (memcmp(&s1->n1.out.v1,&s2->n2.out.v2,sizeof(s1->n1.out.v1))) { \
- printf("%s/%s != %s/%s at %s(%d)\n", \
- #n1, #v1, \
- #n2, #v2, \
- __FILE__, __LINE__); \
- ret = False; \
-}} while(0)
-
-/* used to find hints on unknown values - and to make sure
- we zero-fill */
-#define VAL_UNKNOWN(n1, v1) do {if (s1->n1.out.v1 != 0) { \
- printf("%s/%s non-zero unknown - %u (0x%x) at %s(%d)\n", \
- #n1, #v1, \
- (uint_t)s1->n1.out.v1, \
- (uint_t)s1->n1.out.v1, \
- __FILE__, __LINE__); \
- ret = False; \
-}} while(0)
-
-/* basic testing of all RAW_QFS_* calls
- for each call we test that it succeeds, and where possible test
- for consistency between the calls.
-
- Some of the consistency tests assume that the target filesystem is
- quiescent, which is sometimes hard to achieve
-*/
-BOOL torture_qfsinfo(int dummy)
-{
- struct cli_state *cli;
- int i;
- BOOL ret = True;
- int count;
- union smb_fsinfo *s1, *s2;
- TALLOC_CTX *mem_ctx;
-
- if (!torture_open_connection(&cli)) {
- return False;
- }
-
- mem_ctx = talloc_init("torture_qfsinfo");
-
- /* scan all the levels, pulling the results */
- for (i=0; levels[i].name; i++) {
- levels[i].fsinfo.generic.level = levels[i].level;
- levels[i].status = smb_raw_fsinfo(cli->tree, mem_ctx, &levels[i].fsinfo);
- }
-
- /* check for completely broken levels */
- for (count=i=0; levels[i].name; i++) {
- if (!NT_STATUS_IS_OK(levels[i].status)) {
- printf("ERROR: level %s failed - %s\n", levels[i].name, nt_errstr(levels[i].status));
- count++;
- }
- }
-
- if (count != 0) {
- ret = False;
- printf("%d levels failed\n", count);
- if (count > 10) {
- printf("too many level failures - giving up\n");
- goto done;
- }
- }
-
- /* check for correct aliases */
- s1 = find("SIZE_INFO");
- s2 = find("SIZE_INFORMATION");
- if (s1 && s2) {
- VAL_EQUAL(size_info, total_alloc_units, size_info, total_alloc_units);
- VAL_EQUAL(size_info, avail_alloc_units, size_info, avail_alloc_units);
- VAL_EQUAL(size_info, sectors_per_unit, size_info, sectors_per_unit);
- VAL_EQUAL(size_info, bytes_per_sector, size_info, bytes_per_sector);
- }
-
- s1 = find("DEVICE_INFO");
- s2 = find("DEVICE_INFORMATION");
- if (s1 && s2) {
- VAL_EQUAL(device_info, device_type, device_info, device_type);
- VAL_EQUAL(device_info, characteristics, device_info, characteristics);
- }
-
- s1 = find("VOLUME_INFO");
- s2 = find("VOLUME_INFORMATION");
- if (s1 && s2) {
- STRUCT_EQUAL(volume_info, create_time, volume_info, create_time);
- VAL_EQUAL (volume_info, serial_number, volume_info, serial_number);
- STR_EQUAL (volume_info, volume_name.s, volume_info, volume_name.s);
- printf("volume_info.volume_name = '%s'\n", s1->volume_info.out.volume_name.s);
- }
-
- s1 = find("ATTRIBUTE_INFO");
- s2 = find("ATTRIBUTE_INFORMATION");
- if (s1 && s2) {
- VAL_EQUAL(attribute_info, fs_attr,
- attribute_info, fs_attr);
- VAL_EQUAL(attribute_info, max_file_component_length,
- attribute_info, max_file_component_length);
- STR_EQUAL(attribute_info, fs_type.s, attribute_info, fs_type.s);
- printf("attribute_info.fs_type = '%s'\n", s1->attribute_info.out.fs_type.s);
- }
-
- /* check for consistent disk sizes */
- s1 = find("DSKATTR");
- s2 = find("ALLOCATION");
- if (s1 && s2) {
- double size1, size2;
- double scale = s1->dskattr.out.blocks_per_unit * s1->dskattr.out.block_size;
- size1 = 1.0 *
- s1->dskattr.out.units_total *
- s1->dskattr.out.blocks_per_unit *
- s1->dskattr.out.block_size / scale;
- size2 = 1.0 *
- s2->allocation.out.sectors_per_unit *
- s2->allocation.out.total_alloc_units *
- s2->allocation.out.bytes_per_sector / scale;
- if (ABS(size1 - size2) > 1) {
- printf("Inconsistent total size in DSKATTR and ALLOCATION - size1=%.0f size2=%.0f\n",
- size1, size2);
- ret = False;
- }
- printf("total disk = %.0f MB\n", size1*scale/1.0e6);
- }
-
- /* and for consistent free disk space */
- s1 = find("DSKATTR");
- s2 = find("ALLOCATION");
- if (s1 && s2) {
- double size1, size2;
- double scale = s1->dskattr.out.blocks_per_unit * s1->dskattr.out.block_size;
- size1 = 1.0 *
- s1->dskattr.out.units_free *
- s1->dskattr.out.blocks_per_unit *
- s1->dskattr.out.block_size / scale;
- size2 = 1.0 *
- s2->allocation.out.sectors_per_unit *
- s2->allocation.out.avail_alloc_units *
- s2->allocation.out.bytes_per_sector / scale;
- if (ABS(size1 - size2) > 1) {
- printf("Inconsistent avail size in DSKATTR and ALLOCATION - size1=%.0f size2=%.0f\n",
- size1, size2);
- ret = False;
- }
- printf("free disk = %.0f MB\n", size1*scale/1.0e6);
- }
-
- /* volume info consistency */
- s1 = find("VOLUME");
- s2 = find("VOLUME_INFO");
- if (s1 && s2) {
- VAL_EQUAL(volume, serial_number, volume_info, serial_number);
- STR_EQUAL(volume, volume_name.s, volume_info, volume_name.s);
- }
-
- /* disk size consistency - notice that 'avail_alloc_units' maps to the caller
- available allocation units, not the total */
- s1 = find("SIZE_INFO");
- s2 = find("FULL_SIZE_INFORMATION");
- if (s1 && s2) {
- VAL_EQUAL(size_info, total_alloc_units, full_size_information, total_alloc_units);
- VAL_EQUAL(size_info, avail_alloc_units, full_size_information, call_avail_alloc_units);
- VAL_EQUAL(size_info, sectors_per_unit, full_size_information, sectors_per_unit);
- VAL_EQUAL(size_info, bytes_per_sector, full_size_information, bytes_per_sector);
- }
-
- /* check for non-zero unknown fields - if we find them
- they might give us some hints */
- s1 = find("QUOTA_INFORMATION");
- if (s1) {
- VAL_UNKNOWN(quota_information, unknown[0]);
- VAL_UNKNOWN(quota_information, unknown[1]);
- VAL_UNKNOWN(quota_information, unknown[2]);
- }
-
- s1 = find("OBJECTID_INFORMATION");
- if (s1) {
- VAL_UNKNOWN(objectid_information, unknown[0]);
- VAL_UNKNOWN(objectid_information, unknown[1]);
- VAL_UNKNOWN(objectid_information, unknown[2]);
- VAL_UNKNOWN(objectid_information, unknown[3]);
- VAL_UNKNOWN(objectid_information, unknown[4]);
- VAL_UNKNOWN(objectid_information, unknown[5]);
- }
-
-
-#define STR_CHECK(sname, stype, field, flags) do { \
- s1 = find(sname); \
- if (s1) { \
- if (wire_bad_flags(&s1->stype.out.field, flags)) { \
- printf("(%d) incorrect string termination in %s/%s\n", \
- __LINE__, #stype, #field); \
- ret = False; \
- } \
- }} while (0)
-
- /* check for correct termination */
- STR_CHECK("VOLUME", volume, volume_name, 0);
- STR_CHECK("VOLUME_INFO", volume_info, volume_name, STR_UNICODE);
- STR_CHECK("VOLUME_INFORMATION", volume_info, volume_name, STR_UNICODE);
- STR_CHECK("ATTRIBUTE_INFO", attribute_info, fs_type, STR_UNICODE);
- STR_CHECK("ATTRIBUTE_INFORMATION", attribute_info, fs_type, STR_UNICODE);
-
-done:
- torture_close_connection(cli);
- talloc_destroy(mem_ctx);
- return ret;
-}