diff mbox series

[2/2] smbinfo: add FileFsFullSizeInformation

Message ID 20190213054737.31425-3-lsahlber@redhat.com (mailing list archive)
State New, archived
Headers show
Series More smbinfo | expand

Commit Message

Ronnie Sahlberg Feb. 13, 2019, 5:47 a.m. UTC
Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
---
 smbinfo.c   | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 smbinfo.rst |  2 ++
 2 files changed, 51 insertions(+)
diff mbox series

Patch

diff --git a/smbinfo.c b/smbinfo.c
index c2cea9e..6375db7 100644
--- a/smbinfo.c
+++ b/smbinfo.c
@@ -67,6 +67,8 @@  usage(char *name)
                 "      Prints FileBasicInfo for a cifs file.\n"
 		"  fileeainfo:\n"
                 "      Prints FileEAInfo for a cifs file.\n"
+		"  filefsfullsizeinfo:\n"
+                "      Prints FileFsFullSizeInfo for a cifs share.\n"
 		"  fileinternalinfo:\n"
                 "      Prints FileInternalInfo for a cifs file.\n"
 		"  filemodeinfo:\n"
@@ -492,6 +494,51 @@  fileeainfo(int f)
 	free(qi);
 }
 
+static void
+print_filefullsizeinfo(uint8_t *sd)
+{
+        uint32_t u32;
+        uint64_t u64;
+
+        memcpy(&u64, &sd[0], 8);
+        printf("Total Allocation Units: %" PRIu64 "\n", le64toh(u64));
+
+        memcpy(&u64, &sd[8], 8);
+        printf("Caller Available Allocation Units: %" PRIu64 "\n",
+	       le64toh(u64));
+
+        memcpy(&u64, &sd[16], 8);
+        printf("Actual Available Allocation Units: %" PRIu64 "\n",
+	       le64toh(u64));
+
+        memcpy(&u32, &sd[24], 4);
+        printf("Sectors Per Allocation Unit: %" PRIu32 "\n", le32toh(u32));
+
+        memcpy(&u32, &sd[28], 4);
+        printf("Bytes Per Sector: %" PRIu32 "\n", le32toh(u32));
+}
+
+static void
+filefsfullsizeinfo(int f)
+{
+        struct smb_query_info *qi;
+
+        qi = malloc(sizeof(struct smb_query_info) + 32);
+	memset(qi, 0, sizeof(qi) + 32);
+        qi->info_type = 0x02;
+        qi->file_info_class = 7;
+        qi->additional_information = 0;
+        qi->input_buffer_length = 32;
+
+        if (ioctl(f, CIFS_QUERY_INFO, qi) < 0) {
+                fprintf(stderr, "ioctl failed with %s\n", strerror(errno));
+                exit(1);
+        }
+
+        print_filefullsizeinfo((uint8_t *)(&qi[1]));
+	free(qi);
+}
+
 static void
 fileallinfo(int f)
 {
@@ -759,6 +806,8 @@  int main(int argc, char *argv[])
                 filebasicinfo(f);
         else if (!strcmp(argv[1], "fileeainfo"))
                 fileeainfo(f);
+        else if (!strcmp(argv[1], "filefsfullsizeinfo"))
+                filefsfullsizeinfo(f);
         else if (!strcmp(argv[1], "fileinternalinfo"))
                 fileinternalinfo(f);
         else if (!strcmp(argv[1], "filemodeinfo"))
diff --git a/smbinfo.rst b/smbinfo.rst
index 2119f93..7bdbda4 100644
--- a/smbinfo.rst
+++ b/smbinfo.rst
@@ -49,6 +49,8 @@  COMMAND
 
 `fileeainfo`: Prints the FileEaInformation class
 
+`filefsfullsizeinfo`: Prints the FileFsFullSizeInformation class
+
 `fileinternalinfo`: Prints the FileInternalInformation class
 
 `filemodeinfo`: Prints the FileModeInformation class