[PATCH cifs-utils 1/2] smbinfo: add filealternatenameinfo subcommand

ChenXiaoSong chenxiaosong at chenxiaosong.com
Tue Sep 15 06:34:28 UTC 2026


From: ChenXiaoSong <chenxiaosong at kylinos.cn>

Example:

  1. Mount on Windows 11 Server
  2. touch /mnt/dir/long-file-name
  3. ./smbinfo filealternatenameinfo /mnt/long-file-name
     Alternate Name: LONG-F~1

Signed-off-by: ChenXiaoSong <chenxiaosong at kylinos.cn>
---
 bash-completion/smbinfo |  6 ++++--
 smbinfo                 | 27 +++++++++++++++++++++++++++
 smbinfo.rst             |  2 ++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/bash-completion/smbinfo b/bash-completion/smbinfo
index 3f1f9f6..54e2ff5 100644
--- a/bash-completion/smbinfo
+++ b/bash-completion/smbinfo
@@ -8,6 +8,7 @@ smb_info()
 	OPTS="fileaccessinfo
 	      filealigninfo
 	      fileallinfo
+	      filealternatenameinfo
 	      filebasicinfo
 	      fileeainfo
 	      filefsfullsizeinfo
@@ -30,8 +31,9 @@ smb_info()
 		'-v'|'-h')
 			return 0
 			;;
-		'fileaccessinfo'|'filealigninfo'|'fileallinfo'|'filebasicinfo'|'fileeainfo'|\
-		'filefsfullsizeinfo'|'fileinternalinfo'|'filemodeinfo'|'filepositioninfo'|\
+		'fileaccessinfo'|'filealigninfo'|'fileallinfo'|'filealternatenameinfo'|\
+		'filebasicinfo'|'fileeainfo'|'filefsfullsizeinfo'|'fileinternalinfo'|\
+		'filemodeinfo'|'filepositioninfo'|\
 		'filestandardinfo'|'filestreaminfo'|'filecompressioninfo'|'fsctl-getobjid'|\
 		'getcompression'|'setcompression'|'list-snapshots'|'quota'|'secdesc'|'keys'|\
 		'gettconinfo'|'notify')
diff --git a/smbinfo b/smbinfo
index 5c1a812..1f1f3c4 100755
--- a/smbinfo
+++ b/smbinfo
@@ -35,6 +35,7 @@ VERBOSE = False
 SMB2_O_INFO_FILE        = 0x01
 
 # QUERY INFO levels
+FILE_ALTERNATE_NAME_INFORMATION  = 21
 FILE_COMPRESSION_INFORMATION     = 28
 
 # ioctl ctl codes
@@ -237,6 +238,10 @@ def main():
     sap.add_argument("file")
     sap.set_defaults(func=cmd_fileallinfo)
 
+    sap = subp.add_parser("filealternatenameinfo", help="Prints FileAlternateNameInfo for a cifs file")
+    sap.add_argument("file")
+    sap.set_defaults(func=cmd_filealternatenameinfo)
+
     sap = subp.add_parser("filebasicinfo", help="Prints FileBasicInfo for a cifs file")
     sap.add_argument("file")
     sap.set_defaults(func=cmd_filebasicinfo)
@@ -435,6 +440,28 @@ def cmd_fileallinfo(args):
     print_filemodeinfo(buf[88:])
     print_filealigninfo(buf[92:])
 
+def cmd_filenameinfo(args, file_info_class, label):
+    qi = QueryInfoStruct(info_type=SMB2_O_INFO_FILE,
+                         file_info_class=file_info_class,
+                         input_buffer_length=INPUT_BUFFER_LENGTH)
+    try:
+        fd = os.open(args.file, os.O_RDONLY)
+        buf = qi.ioctl(fd)
+    except Exception as e:
+        print("syscall failed: %s"%e)
+        return False
+
+    print_filenameinfo(buf, label)
+
+def cmd_filealternatenameinfo(args):
+    return cmd_filenameinfo(args, FILE_ALTERNATE_NAME_INFORMATION,
+                            "Alternate Name")
+
+def print_filenameinfo(buf, label):
+    name_length = struct.unpack_from('<I', buf, 0)[0]
+    name = buf[4:4 + name_length].decode("utf-16le")
+    print("%s: %s"%(label, name))
+
 def win_to_datetime(smb2_time):
     usec = (smb2_time / 10) % 1000000
     sec  = (smb2_time - 116444736000000000) // 10000000
diff --git a/smbinfo.rst b/smbinfo.rst
index 7f5bb4d..8356617 100644
--- a/smbinfo.rst
+++ b/smbinfo.rst
@@ -51,6 +51,8 @@ COMMAND
 
 `fileallinfo`: Prints the FileAllInformation class
 
+`filealternatenameinfo`: Prints the FileAlternateNameInformation class
+
 `filebasicinfo`: Prints the FileBasicInformation class
 
 `fileeainfo`: Prints the FileEaInformation class
-- 
2.55.0




More information about the samba-technical mailing list