a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * This file and its contents are supplied under the terms of the
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * You may only use this file in accordance with the terms of version
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * 1.0 of the CDDL.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * A full copy of the text of the CDDL should have accompanied this
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * source. A copy of the CDDL is also available via the Internet at
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * http://www.illumos.org/license/CDDL.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Dispatch function for SMB2_QUERY_INFO
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * [MS-FSCC 2.4] If a file system does not support ...
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * an Information Classs, NT_STATUS_INVALID_PARAMETER...
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#include <smbsrv/smb2_kproto.h>
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#include <smbsrv/smb_fsops.h>
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#include <smbsrv/ntifs.h>
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_all(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_basic(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_standard(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_internal(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_ea_size(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_access(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_name(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_position(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_full_ea(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_mode(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_alignment(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_all(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_altname(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_stream(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_pipe(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_pipe_lcl(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_pipe_rem(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_compr(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_opens(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t smb2_qif_tags(smb_request_t *, smb_queryinfo_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qinfo_file(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_ofile_t *of = sr->fid_ofile;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint_t mask = 0;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross boolean_t getstd = B_FALSE;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross boolean_t getname = B_FALSE;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Which attributes do we need from the FS?
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (qi->qi_InfoClass) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileBasicInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mask = SMB_AT_BASIC;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileStandardInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mask = SMB_AT_STANDARD;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross getstd = B_TRUE;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileInternalInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mask = SMB_AT_NODEID;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileAllInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mask = SMB_AT_ALL;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross getstd = B_TRUE;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross getname = B_TRUE;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileNameInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross getname = B_TRUE;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileAlternateNameInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mask = SMB_AT_NODEID;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross getname = B_TRUE;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileStreamInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mask = SMB_AT_STANDARD;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileCompressionInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mask = SMB_AT_SIZE | SMB_AT_ALLOCSZ;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileNetworkOpenInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mask = SMB_AT_BASIC | SMB_AT_STANDARD;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross default:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross qi->qi_attr.sa_mask = mask;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross qi->qi_node = of->f_node;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (mask & SMB_AT_ALL) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_ofile_getattr(sr, of, &qi->qi_attr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (getstd) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_ofile_getstd(of, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (getname) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_ofile_getname(of, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (qi->qi_InfoClass) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileBasicInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_basic(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileStandardInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_standard(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileInternalInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_internal(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileEaInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_ea_size(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileAccessInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_access(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileNameInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_name(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FilePositionInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_position(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileFullEaInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_full_ea(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileModeInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_mode(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileAlignmentInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_alignment(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileAllInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_all(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileAlternateNameInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_altname(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileStreamInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_stream(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FilePipeInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_pipe(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FilePipeLocalInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_pipe_lcl(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FilePipeRemoteInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_pipe_rem(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileCompressionInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_compr(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileNetworkOpenInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_opens(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileAttributeTagInformation:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_tags(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross default:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = NT_STATUS_INVALID_INFO_CLASS;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileAllInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * This returns a concatenation of:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileBasicInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileStandardInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileInternalInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileEaInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FilePositionInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileModeInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileAlignmentInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileNameInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_all(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_basic(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_standard(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_internal(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_ea_size(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_position(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_mode(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_alignment(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qif_name(sr, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (status)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileBasicInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * See also:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * case SMB_QUERY_FILE_BASIC_INFO:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * case SMB_FILE_BASIC_INFORMATION:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_basic(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_attr_t *sa = &qi->qi_attr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ASSERT((sa->sa_mask & SMB_AT_BASIC) == SMB_AT_BASIC);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "TTTTll",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sa->sa_crtime, /* T */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sa->sa_vattr.va_atime, /* T */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sa->sa_vattr.va_mtime, /* T */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sa->sa_vattr.va_ctime, /* T */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_dosattr, /* l */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0); /* reserved */ /* l */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileStandardInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * See also:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_QUERY_FILE_STANDARD_INFO
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_FILE_STANDARD_INFORMATION
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_standard(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_attr_t *sa = &qi->qi_attr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ASSERT((sa->sa_mask & SMB_AT_STANDARD) == SMB_AT_STANDARD);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "qqlbbw",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_allocsz, /* q */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_vattr.va_size, /* q */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_vattr.va_nlink, /* l */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross qi->qi_delete_on_close, /* b */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross qi->qi_isdir, /* b */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0); /* reserved */ /* w */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileInternalInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * See also:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_FILE_INTERNAL_INFORMATION
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_internal(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_attr_t *sa = &qi->qi_attr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ASSERT((sa->sa_mask & SMB_AT_NODEID) == SMB_AT_NODEID);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "q",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_vattr.va_nodeid); /* q */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileEaInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * See also:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_QUERY_FILE_EA_INFO
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_FILE_EA_INFORMATION
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_ea_size(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross _NOTE(ARGUNUSED(qi))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "l", 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileFullEaInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * We could put EAs in a named stream...
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/* ARGSUSED */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_full_ea(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_NO_EAS_ON_FILE);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileAccessInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_access(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross _NOTE(ARGUNUSED(qi))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_ofile_t *of = sr->fid_ofile;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "l",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross of->f_granted_access);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileNameInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * See also:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_QUERY_FILE_NAME_INFO
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_FILE_NAME_INFORMATION
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_name(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ASSERT(qi->qi_namelen > 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "llU",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0, /* FileIndex (l) */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross qi->qi_namelen, /* l */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross qi->qi_name); /* U */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FilePositionInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_position(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross _NOTE(ARGUNUSED(qi))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_ofile_t *of = sr->fid_ofile;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint64_t pos;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mutex_enter(&of->f_mutex);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross pos = of->f_seek_pos;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross mutex_exit(&of->f_mutex);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "q", pos);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileModeInformation [MS-FSA 2.4.24]
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * XXX: These mode flags are supposed to be on the open handle,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * XXX: or I think so. Not yet... (just put zero for now)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_mode(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross _NOTE(ARGUNUSED(qi))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "l", 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileAlignmentInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_alignment(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross _NOTE(ARGUNUSED(qi))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "l", 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileAlternateNameInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * See also:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_QUERY_FILE_ALT_NAME_INFO
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * SMB_FILE_ALT_NAME_INFORMATION
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_altname(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_ofile_t *of = sr->fid_ofile;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ASSERT(qi->qi_namelen > 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ASSERT(qi->qi_attr.sa_mask & SMB_AT_NODEID);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (of->f_ftype != SMB_FTYPE_DISK)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_OBJECT_NAME_NOT_FOUND);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if ((of->f_tree->t_flags & SMB_TREE_SHORTNAMES) == 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_OBJECT_NAME_NOT_FOUND);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* fill in qi->qi_shortname */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_query_shortname(of->f_node, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "%lU", sr,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_wcequiv_strlen(qi->qi_shortname),
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross qi->qi_shortname);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileStreamInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_stream(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_ofile_t *of = sr->fid_ofile;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_attr_t *attr = &qi->qi_attr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ASSERT((attr->sa_mask & SMB_AT_STANDARD) == SMB_AT_STANDARD);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (of->f_ftype != SMB_FTYPE_DISK) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "l", 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb_query_stream_info(sr, &sr->raw_data, qi);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FilePipeInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_pipe(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross _NOTE(ARGUNUSED(qi))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_ofile_t *of = sr->fid_ofile;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t pipe_mode;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t nonblock;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (of->f_ftype) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case SMB_FTYPE_BYTE_PIPE:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross pipe_mode = 0; /* FILE_PIPE_BYTE_STREAM_MODE */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case SMB_FTYPE_MESG_PIPE:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross pipe_mode = 1; /* FILE_PIPE_MESSAGE_MODE */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case SMB_FTYPE_DISK:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case SMB_FTYPE_PRINTER:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross default:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross nonblock = 0; /* XXX todo: Get this from the pipe handle. */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "ll",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross pipe_mode, nonblock);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FilePipeLocalInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/* ARGSUSED */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_pipe_lcl(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER); /* XXX todo */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FilePipeRemoteInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/* ARGSUSED */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_pipe_rem(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER); /* XXX todo */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileCompressionInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * XXX: For now, just say "not compressed".
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_compr(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_attr_t *sa = &qi->qi_attr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint16_t CompressionFormat = 0; /* COMPRESSION_FORMAT_NONE */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ASSERT(sa->sa_mask & SMB_AT_SIZE);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "qw6.",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_vattr.va_size, /* q */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross CompressionFormat); /* w */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileNetworkOpenInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_opens(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_attr_t *sa = &qi->qi_attr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "TTTTqqll",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sa->sa_crtime, /* T */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sa->sa_vattr.va_atime, /* T */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sa->sa_vattr.va_mtime, /* T */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sa->sa_vattr.va_ctime, /* T */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_allocsz, /* q */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_vattr.va_size, /* q */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross sa->sa_dosattr, /* l */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0); /* reserved */ /* l */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileAttributeTagInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * If dattr includes FILE_ATTRIBUTE_REPARSE_POINT, the
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * second dword should be the reparse tag. Otherwise
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * the tag value should be set to zero.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * We don't support reparse points, so we set the tag
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * to zero.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossstatic uint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qif_tags(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross _NOTE(ARGUNUSED(qi))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "ll", 0, 0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}