#define SMB2_FILE_FULL_EA_INFORMATION (FSCC_FILE_FULL_EA_INFORMATION + SMB2_INFO_SPECIAL)
#define SMB2_FILE_ALL_INFORMATION (FSCC_FILE_ALL_INFORMATION + SMB2_INFO_SPECIAL)
#define SMB2_FILE_POSIX_INFORMATION_INTERNAL (SMB2_FILE_POSIX_INFORMATION + SMB2_INFO_SPECIAL)
+#define SMB2_FS_POSIX_INFORMATION_INTERNAL 1100
/* NT passthrough levels for qfsinfo. */
"%s", samba_version_string());
}
+static bool fsinfo_unix_valid_level(connection_struct *conn,
+ uint16_t info_level)
+{
+ if (conn->sconn->using_smb2 &&
+ lp_smb3_unix_extensions() &&
+ info_level == SMB2_FS_POSIX_INFORMATION_INTERNAL) {
+ return true;
+ }
+#if defined(SMB1SERVER)
+ if (lp_smb1_unix_extensions() &&
+ info_level == SMB_QUERY_POSIX_FS_INFO) {
+ return true;
+ }
+#endif
+ return false;
+}
+
NTSTATUS smbd_do_qfsinfo(struct smbXsrv_connection *xconn,
connection_struct *conn,
TALLOC_CTX *mem_ctx,
#endif
case SMB_QUERY_POSIX_FS_INFO:
+ case SMB2_FS_POSIX_INFORMATION_INTERNAL:
{
int rc;
struct vfs_statvfs_struct svfs;
- if (!lp_smb1_unix_extensions()) {
+ if (!fsinfo_unix_valid_level(conn, info_level)) {
return NT_STATUS_INVALID_LEVEL;
}