xref: /illumos-gate/usr/src/uts/common/fs/smbsrv/smb_trans2_find.c (revision 1fcced4c370617db71610fecffd5451a5894ca5e)
1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21da6c28aaSamw /*
227f667e74Sjose borrego  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23da6c28aaSamw  * Use is subject to license terms.
24da6c28aaSamw  */
25da6c28aaSamw 
26da6c28aaSamw 
27da6c28aaSamw /*
28da6c28aaSamw  * This module provides functions for TRANS2_FIND_FIRST2 and
29da6c28aaSamw  * TRANS2_FIND_NEXT2 requests. The requests allow the client to search
30da6c28aaSamw  * for the file(s) which match the file specification.  The search is
31da6c28aaSamw  * started with TRANS2_FIND_FIRST2 and can be continued if necessary with
32da6c28aaSamw  * TRANS2_FIND_NEXT2. There are numerous levels of information which may be
33da6c28aaSamw  * obtained for the returned files, the desired level is specified in the
34da6c28aaSamw  * InformationLevel field of the requests.
35da6c28aaSamw  *
36da6c28aaSamw  *  InformationLevel Name              Value
37da6c28aaSamw  *  =================================  ================
38da6c28aaSamw  *
39da6c28aaSamw  *  SMB_INFO_STANDARD                  1
40da6c28aaSamw  *  SMB_INFO_QUERY_EA_SIZE             2
41da6c28aaSamw  *  SMB_INFO_QUERY_EAS_FROM_LIST       3
42da6c28aaSamw  *  SMB_FIND_FILE_DIRECTORY_INFO       0x101
43da6c28aaSamw  *  SMB_FIND_FILE_FULL_DIRECTORY_INFO  0x102
44da6c28aaSamw  *  SMB_FIND_FILE_NAMES_INFO           0x103
45da6c28aaSamw  *  SMB_FIND_FILE_BOTH_DIRECTORY_INFO  0x104
46b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO  0x105
47b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO  0x106
48da6c28aaSamw  *
49da6c28aaSamw  * The following sections detail the data returned for each
50da6c28aaSamw  * InformationLevel. The requested information is placed in the Data
51da6c28aaSamw  * portion of the transaction response. Note: a client which does not
52da6c28aaSamw  * support long names can only request SMB_INFO_STANDARD.
53da6c28aaSamw  *
54da6c28aaSamw  * A four-byte resume key precedes each data item (described below) if bit
55da6c28aaSamw  * 2 in the Flags field is set, i.e. if the request indicates the server
56da6c28aaSamw  * should return resume keys. Note: it is not always the case. If the
57da6c28aaSamw  * data item already includes the resume key, the resume key should not be
58da6c28aaSamw  * added again.
59da6c28aaSamw  *
60da6c28aaSamw  * 4.3.4.1   SMB_INFO_STANDARD
61da6c28aaSamw  *
62da6c28aaSamw  *  Response Field                    Description
63da6c28aaSamw  *  ================================  ==================================
64da6c28aaSamw  *
65da6c28aaSamw  *  SMB_DATE CreationDate;            Date when file was created
66da6c28aaSamw  *  SMB_TIME CreationTime;            Time when file was created
67da6c28aaSamw  *  SMB_DATE LastAccessDate;          Date of last file access
68da6c28aaSamw  *  SMB_TIME LastAccessTime;          Time of last file access
69da6c28aaSamw  *  SMB_DATE LastWriteDate;           Date of last write to the file
70da6c28aaSamw  *  SMB_TIME LastWriteTime;           Time of last write to the file
71da6c28aaSamw  *  ULONG  DataSize;                  File Size
72da6c28aaSamw  *  ULONG AllocationSize;             Size of filesystem allocation unit
73da6c28aaSamw  *  USHORT Attributes;                File Attributes
74da6c28aaSamw  *  UCHAR FileNameLength;             Length of filename in bytes
75da6c28aaSamw  *  STRING FileName;                  Name of found file
76da6c28aaSamw  *
77da6c28aaSamw  * 4.3.4.2   SMB_INFO_QUERY_EA_SIZE
78da6c28aaSamw  *
79da6c28aaSamw  *  Response Field                     Description
80da6c28aaSamw  *  =================================  ==================================
81da6c28aaSamw  *
82da6c28aaSamw  *   SMB_DATE CreationDate;            Date when file was created
83da6c28aaSamw  *   SMB_TIME CreationTime;            Time when file was created
84da6c28aaSamw  *   SMB_DATE LastAccessDate;          Date of last file access
85da6c28aaSamw  *   SMB_TIME LastAccessTime;          Time of last file access
86da6c28aaSamw  *   SMB_DATE LastWriteDate;           Date of last write to the file
87da6c28aaSamw  *   SMB_TIME LastWriteTime;           Time of last write to the file
88da6c28aaSamw  *   ULONG DataSize;                   File Size
89da6c28aaSamw  *   ULONG AllocationSize;             Size of filesystem allocation unit
90da6c28aaSamw  *   USHORT Attributes;                File Attributes
91da6c28aaSamw  *   ULONG EaSize;                     Size of file's EA information
92da6c28aaSamw  *   UCHAR FileNameLength;             Length of filename in bytes
93da6c28aaSamw  *   STRING FileName;                  Name of found file
94da6c28aaSamw  *
95da6c28aaSamw  * 4.3.4.3   SMB_INFO_QUERY_EAS_FROM_LIST
96da6c28aaSamw  *
97da6c28aaSamw  * This request returns the same information as SMB_INFO_QUERY_EA_SIZE, but
98da6c28aaSamw  * only for files which have an EA list which match the EA information in
99da6c28aaSamw  * the Data part of the request.
100da6c28aaSamw  *
101da6c28aaSamw  * 4.3.4.4   SMB_FIND_FILE_DIRECTORY_INFO
102da6c28aaSamw  *
103da6c28aaSamw  *  Response Field                     Description
104da6c28aaSamw  *  =================================  ==================================
105da6c28aaSamw  *
106da6c28aaSamw  *  ULONG NextEntryOffset;             Offset from this structure to
107da6c28aaSamw  *					beginning of next one
108da6c28aaSamw  *  ULONG FileIndex;
109da6c28aaSamw  *  LARGE_INTEGER CreationTime;        file creation time
110da6c28aaSamw  *  LARGE_INTEGER LastAccessTime;      last access time
111da6c28aaSamw  *  LARGE_INTEGER LastWriteTime;       last write time
112da6c28aaSamw  *  LARGE_INTEGER ChangeTime;          last attribute change time
113da6c28aaSamw  *  LARGE_INTEGER EndOfFile;           file size
114da6c28aaSamw  *  LARGE_INTEGER AllocationSize;      size of filesystem allocation information
115da6c28aaSamw  *  ULONG ExtFileAttributes;           Extended file attributes
116da6c28aaSamw  *					(see section 3.11)
117da6c28aaSamw  *  ULONG FileNameLength;              Length of filename in bytes
118da6c28aaSamw  *  STRING FileName;                   Name of the file
119da6c28aaSamw  *
120da6c28aaSamw  * 4.3.4.5   SMB_FIND_FILE_FULL_DIRECTORY_INFO
121da6c28aaSamw  *
122da6c28aaSamw  *  Response Field                     Description
123da6c28aaSamw  *  =================================  ==================================
124da6c28aaSamw  *
125da6c28aaSamw  *  ULONG NextEntryOffset;             Offset from this structure to
126da6c28aaSamw  *					beginning of next one
127da6c28aaSamw  *  ULONG FileIndex;
128da6c28aaSamw  *  LARGE_INTEGER CreationTime;        file creation time
129da6c28aaSamw  *  LARGE_INTEGER LastAccessTime;      last access time
130da6c28aaSamw  *  LARGE_INTEGER LastWriteTime;       last write time
131da6c28aaSamw  *  LARGE_INTEGER ChangeTime;          last attribute change time
132da6c28aaSamw  *  LARGE_INTEGER EndOfFile;           file size
133da6c28aaSamw  *  LARGE_INTEGER AllocationSize;      size of filesystem allocation information
134da6c28aaSamw  *  ULONG ExtFileAttributes;           Extended file attributes
135da6c28aaSamw  *					(see section 3.11)
136da6c28aaSamw  *  ULONG FileNameLength;              Length of filename in bytes
137da6c28aaSamw  *  ULONG EaSize;                      Size of file's extended attributes
138da6c28aaSamw  *  STRING FileName;                   Name of the file
139da6c28aaSamw  *
140b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
141b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO
142b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
143b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  This is the same as SMB_FIND_FILE_FULL_DIRECTORY_INFO but with
144b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  FileId inserted after EaSize. FileId is preceded by a 4 byte
145b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  alignment padding.
146b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
147b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  Response Field                     Description
148b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  =================================  ==================================
149b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  ...
150b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  ULONG EaSize;                      Size of file's extended attributes
151b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  UCHAR Reserved[4]
152b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  LARGE_INTEGER FileId               Internal file system unique id.
153b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  STRING FileName;                   Name of the file
154b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
155da6c28aaSamw  * 4.3.4.6   SMB_FIND_FILE_BOTH_DIRECTORY_INFO
156da6c28aaSamw  *
157da6c28aaSamw  *  Response Field                     Description
158da6c28aaSamw  *  =================================  ==================================
159da6c28aaSamw  *
160da6c28aaSamw  *  ULONG NextEntryOffset;             Offset from this structure to
161da6c28aaSamw  *					beginning of next one
162da6c28aaSamw  *  ULONG FileIndex;
163da6c28aaSamw  *  LARGE_INTEGER CreationTime;        file creation time
164da6c28aaSamw  *  LARGE_INTEGER LastAccessTime;      last access time
165da6c28aaSamw  *  LARGE_INTEGER LastWriteTime;       last write time
166da6c28aaSamw  *  LARGE_INTEGER ChangeTime;          last attribute change time
167da6c28aaSamw  *  LARGE_INTEGER EndOfFile;           file size
168da6c28aaSamw  *  LARGE_INTEGER AllocationSize;      size of filesystem allocation information
169da6c28aaSamw  *  ULONG ExtFileAttributes;           Extended file attributes
170da6c28aaSamw  *					(see section 3.11)
171da6c28aaSamw  *  ULONG FileNameLength;              Length of FileName in bytes
172da6c28aaSamw  *  ULONG EaSize;                      Size of file's extended attributes
173da6c28aaSamw  *  UCHAR ShortNameLength;             Length of file's short name in bytes
174da6c28aaSamw  *  UCHAR Reserved
175da6c28aaSamw  *  WCHAR ShortName[12];               File's 8.3 conformant name in Unicode
176da6c28aaSamw  *  STRING FileName;                   Files full length name
177da6c28aaSamw  *
178b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
179b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO
180b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
181b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  This is the same as SMB_FIND_FILE_BOTH_DIRECTORY_INFO but with
182b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  FileId inserted after ShortName. FileId is preceded by a 2 byte
183b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  alignment pad.
184b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
185b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  Response Field                     Description
186b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  =================================  ==================================
187b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  ...
188b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  WCHAR ShortName[12];               File's 8.3 conformant name in Unicode
189b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  UCHAR Reserved[2]
190b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  LARGE_INTEGER FileId               Internal file system unique id.
191b89a8333Snatalie li - Sun Microsystems - Irvine United States  *  STRING FileName;                   Files full length name
192b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
193da6c28aaSamw  * 4.3.4.7   SMB_FIND_FILE_NAMES_INFO
194da6c28aaSamw  *
195da6c28aaSamw  *  Response Field                     Description
196da6c28aaSamw  *  =================================  ==================================
197da6c28aaSamw  *
198da6c28aaSamw  *  ULONG NextEntryOffset;             Offset from this structure to
199da6c28aaSamw  *                                     beginning of next one
200da6c28aaSamw  *  ULONG FileIndex;
201da6c28aaSamw  *  ULONG FileNameLength;              Length of FileName in bytes
202da6c28aaSamw  *  STRING FileName;                   Files full length name
203da6c28aaSamw  */
204da6c28aaSamw 
205da6c28aaSamw #include <smbsrv/smb_incl.h>
206da6c28aaSamw #include <smbsrv/msgbuf.h>
207da6c28aaSamw #include <smbsrv/smb_fsops.h>
208da6c28aaSamw 
2097f667e74Sjose borrego typedef struct smb_find_args {
2107f667e74Sjose borrego 	uint16_t fa_infolev;
2117f667e74Sjose borrego 	uint16_t fa_maxcount;
2127f667e74Sjose borrego 	uint16_t fa_fflag;
2137f667e74Sjose borrego 	uint32_t fa_maxdata;
2147f667e74Sjose borrego } smb_find_args_t;
2157f667e74Sjose borrego 
2167f667e74Sjose borrego static int smb_trans2_find_entries(smb_request_t *, smb_xa_t *,
2177f667e74Sjose borrego     smb_odir_t *, smb_find_args_t *, boolean_t *);
218dc20a302Sas200622 static int smb_trans2_find_get_maxdata(smb_request_t *, uint16_t, uint16_t);
2197f667e74Sjose borrego static int smb_trans2_find_mbc_encode(smb_request_t *, smb_xa_t *,
2207f667e74Sjose borrego     smb_fileinfo_t *, smb_find_args_t *);
221da6c28aaSamw 
222da6c28aaSamw /*
223dc20a302Sas200622  * Tunable parameter to limit the maximum
224dc20a302Sas200622  * number of entries to be returned.
225da6c28aaSamw  */
226dc20a302Sas200622 uint16_t smb_trans2_find_max = 128;
227da6c28aaSamw 
228da6c28aaSamw /*
229da6c28aaSamw  * smb_com_trans2_find_first2
230da6c28aaSamw  *
231da6c28aaSamw  *  Client Request                Value
232da6c28aaSamw  *  ============================  ==================================
233da6c28aaSamw  *
234da6c28aaSamw  *  UCHAR  WordCount              15
235da6c28aaSamw  *  UCHAR  TotalDataCount         Total size of extended attribute list
236da6c28aaSamw  *  UCHAR  SetupCount             1
237da6c28aaSamw  *  UCHAR  Setup[0]               TRANS2_FIND_FIRST2
238da6c28aaSamw  *
239da6c28aaSamw  *  Parameter Block Encoding      Description
240da6c28aaSamw  *  ============================  ==================================
241da6c28aaSamw  *  USHORT SearchAttributes;
242da6c28aaSamw  *  USHORT SearchCount;           Maximum number of entries to return
243da6c28aaSamw  *  USHORT Flags;                 Additional information:
244da6c28aaSamw  *                                Bit 0 - close search after this request
245da6c28aaSamw  *                                Bit 1 - close search if end of search
246da6c28aaSamw  *                                reached
247da6c28aaSamw  *                                Bit 2 - return resume keys for each
248da6c28aaSamw  *                                entry found
249da6c28aaSamw  *                                Bit 3 - continue search from previous
250da6c28aaSamw  *                                ending place
251da6c28aaSamw  *                                Bit 4 - find with backup intent
252da6c28aaSamw  *  USHORT InformationLevel;      See below
253da6c28aaSamw  *  ULONG SearchStorageType;
254da6c28aaSamw  *  STRING FileName;              Pattern for the search
255da6c28aaSamw  *  UCHAR Data[ TotalDataCount ]  FEAList if InformationLevel is
256da6c28aaSamw  *                                QUERY_EAS_FROM_LIST
257da6c28aaSamw  *
258da6c28aaSamw  *  Response Parameter Block      Description
259da6c28aaSamw  *  ============================  ==================================
260da6c28aaSamw  *
261da6c28aaSamw  *  USHORT Sid;                   Search handle
262da6c28aaSamw  *  USHORT SearchCount;           Number of entries returned
263da6c28aaSamw  *  USHORT EndOfSearch;           Was last entry returned?
264da6c28aaSamw  *  USHORT EaErrorOffset;         Offset into EA list if EA error
265da6c28aaSamw  *  USHORT LastNameOffset;        Offset into data to file name of last
266da6c28aaSamw  *                                entry, if server needs it to resume
267da6c28aaSamw  *                                search; else 0
268da6c28aaSamw  *  UCHAR Data[ TotalDataCount ]  Level dependent info about the matches
269da6c28aaSamw  *                                found in the search
270da6c28aaSamw  */
2717b59d02dSjb150015 smb_sdrc_t
272dc20a302Sas200622 smb_com_trans2_find_first2(smb_request_t *sr, smb_xa_t *xa)
273da6c28aaSamw {
2747f667e74Sjose borrego 	int		count;
2757f667e74Sjose borrego 	uint16_t	sattr, odid;
276da6c28aaSamw 	char		*path;
2777f667e74Sjose borrego 	smb_odir_t	*od;
2787f667e74Sjose borrego 	smb_find_args_t	args;
2797f667e74Sjose borrego 	boolean_t	eos;
280eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	odir_flags = 0;
2817f667e74Sjose borrego 
2827f667e74Sjose borrego 	bzero(&args, sizeof (smb_find_args_t));
283da6c28aaSamw 
284da6c28aaSamw 	if (!STYPE_ISDSK(sr->tid_tree->t_res_type)) {
285dc20a302Sas200622 		smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
286da6c28aaSamw 		    ERRDOS, ERROR_ACCESS_DENIED);
287faa1795aSjb150015 		return (SDRC_ERROR);
288da6c28aaSamw 	}
289da6c28aaSamw 
2907f667e74Sjose borrego 	if (smb_mbc_decodef(&xa->req_param_mb, "%wwww4.u", sr, &sattr,
2917f667e74Sjose borrego 	    &args.fa_maxcount, &args.fa_fflag, &args.fa_infolev, &path) != 0) {
292faa1795aSjb150015 		return (SDRC_ERROR);
293da6c28aaSamw 	}
294da6c28aaSamw 
2958d7e4166Sjose borrego 	if (smb_is_stream_name(path)) {
296b89a8333Snatalie li - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_OBJECT_NAME_INVALID,
297b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_INVALID_NAME);
298b89a8333Snatalie li - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
299b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
300b89a8333Snatalie li - Sun Microsystems - Irvine United States 
301eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States 	if (args.fa_fflag & SMB_FIND_WITH_BACKUP_INTENT) {
302b89a8333Snatalie li - Sun Microsystems - Irvine United States 		sr->user_cr = smb_user_getprivcred(sr->uid_user);
303eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States 		odir_flags = SMB_ODIR_OPENF_BACKUP_INTENT;
304eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States 	}
305b89a8333Snatalie li - Sun Microsystems - Irvine United States 
3067f667e74Sjose borrego 	args.fa_maxdata =
3077f667e74Sjose borrego 	    smb_trans2_find_get_maxdata(sr, args.fa_infolev, args.fa_fflag);
3087f667e74Sjose borrego 	if (args.fa_maxdata == 0)
309faa1795aSjb150015 		return (SDRC_ERROR);
310dc20a302Sas200622 
311dc20a302Sas200622 	if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
3123a6c5f83SAlan Wright 		(void) smb_convert_wildcards(path);
313dc20a302Sas200622 
314eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States 	odid = smb_odir_open(sr, path, sattr, odir_flags);
3157f667e74Sjose borrego 	if (odid == 0)
316faa1795aSjb150015 		return (SDRC_ERROR);
317da6c28aaSamw 
3187f667e74Sjose borrego 	od = smb_tree_lookup_odir(sr->tid_tree, odid);
3197f667e74Sjose borrego 	if (od == NULL)
3207f667e74Sjose borrego 		return (SDRC_ERROR);
3217f667e74Sjose borrego 	count = smb_trans2_find_entries(sr, xa, od, &args, &eos);
322dc20a302Sas200622 
3237f667e74Sjose borrego 	if (count == -1) {
3247f667e74Sjose borrego 		smb_odir_close(od);
325a1511e6bSjoyce mcintosh 		smb_odir_release(od);
326faa1795aSjb150015 		return (SDRC_ERROR);
327da6c28aaSamw 	}
328da6c28aaSamw 
3297f667e74Sjose borrego 	if (count == 0) {
3307f667e74Sjose borrego 		smb_odir_close(od);
331a1511e6bSjoyce mcintosh 		smb_odir_release(od);
3327f667e74Sjose borrego 		smbsr_errno(sr, ENOENT);
3337f667e74Sjose borrego 		return (SDRC_ERROR);
334da6c28aaSamw 	}
335da6c28aaSamw 
3367f667e74Sjose borrego 	if ((args.fa_fflag & SMB_FIND_CLOSE_AFTER_REQUEST) ||
3377f667e74Sjose borrego 	    (eos && (args.fa_fflag & SMB_FIND_CLOSE_AT_EOS))) {
3387f667e74Sjose borrego 		smb_odir_close(od);
3397f667e74Sjose borrego 	} /* else leave odir open for trans2_find_next2 */
3407f667e74Sjose borrego 
341a1511e6bSjoyce mcintosh 	smb_odir_release(od);
342a1511e6bSjoyce mcintosh 
3433db3f65cSamw 	(void) smb_mbc_encodef(&xa->rep_param_mb, "wwwww",
3447f667e74Sjose borrego 	    odid, count, (eos) ? 1 : 0, 0, 0);
345da6c28aaSamw 
346faa1795aSjb150015 	return (SDRC_SUCCESS);
347da6c28aaSamw }
348da6c28aaSamw 
349da6c28aaSamw /*
350da6c28aaSamw  * smb_com_trans2_find_next2
351da6c28aaSamw  *
352da6c28aaSamw  *  Client Request                     Value
353da6c28aaSamw  *  ================================== =================================
354da6c28aaSamw  *
355da6c28aaSamw  *  WordCount                          15
356da6c28aaSamw  *  SetupCount                         1
357da6c28aaSamw  *  Setup[0]                           TRANS2_FIND_NEXT2
358da6c28aaSamw  *
359da6c28aaSamw  *  Parameter Block Encoding           Description
360da6c28aaSamw  *  ================================== =================================
361da6c28aaSamw  *
362da6c28aaSamw  *  USHORT Sid;                        Search handle
363da6c28aaSamw  *  USHORT SearchCount;                Maximum number of entries to
364da6c28aaSamw  *                                      return
365da6c28aaSamw  *  USHORT InformationLevel;           Levels described in
366da6c28aaSamw  *                                      TRANS2_FIND_FIRST2 request
367da6c28aaSamw  *  ULONG ResumeKey;                   Value returned by previous find2
368da6c28aaSamw  *                                      call
369da6c28aaSamw  *  USHORT Flags;                      Additional information: bit set-
370da6c28aaSamw  *                                      0 - close search after this
371da6c28aaSamw  *                                      request
372da6c28aaSamw  *                                      1 - close search if end of search
373da6c28aaSamw  *                                      reached
374da6c28aaSamw  *                                      2 - return resume keys for each
375da6c28aaSamw  *                                      entry found
376da6c28aaSamw  *                                      3 - resume/continue from previous
377da6c28aaSamw  *                                      ending place
378da6c28aaSamw  *                                      4 - find with backup intent
379da6c28aaSamw  *  STRING FileName;                   Resume file name
380da6c28aaSamw  *
381da6c28aaSamw  * Sid is the value returned by a previous successful TRANS2_FIND_FIRST2
382da6c28aaSamw  * call.  If Bit3 of Flags is set, then FileName may be the NULL string,
383da6c28aaSamw  * since the search is continued from the previous TRANS2_FIND request.
384da6c28aaSamw  * Otherwise, FileName must not be more than 256 characters long.
385da6c28aaSamw  *
386da6c28aaSamw  *  Response Field                     Description
387da6c28aaSamw  *  ================================== =================================
388da6c28aaSamw  *
389da6c28aaSamw  *  USHORT SearchCount;                Number of entries returned
390da6c28aaSamw  *  USHORT EndOfSearch;                Was last entry returned?
391da6c28aaSamw  *  USHORT EaErrorOffset;              Offset into EA list if EA error
392da6c28aaSamw  *  USHORT LastNameOffset;             Offset into data to file name of
393da6c28aaSamw  *                                      last entry, if server needs it to
394da6c28aaSamw  *                                      resume search; else 0
395da6c28aaSamw  *  UCHAR Data[TotalDataCount]         Level dependent info about the
396da6c28aaSamw  *                                      matches found in the search
397b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
398b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
399b89a8333Snatalie li - Sun Microsystems - Irvine United States  * The last parameter in the request is a filename, which is a
400b89a8333Snatalie li - Sun Microsystems - Irvine United States  * null-terminated unicode string.
401b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
402b89a8333Snatalie li - Sun Microsystems - Irvine United States  * smb_mbc_decodef(&xa->req_param_mb, "%www lwu", sr,
4037f667e74Sjose borrego  *    &odid, &fa_maxcount, &fa_infolev, &cookie, &fa_fflag, &fname)
404b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
4057f667e74Sjose borrego  * The filename parameter is not currently decoded because we
4067f667e74Sjose borrego  * expect a 2-byte null but Mac OS 10 clients send a 1-byte null,
407b89a8333Snatalie li - Sun Microsystems - Irvine United States  * which leads to a decode error.
408b89a8333Snatalie li - Sun Microsystems - Irvine United States  * Thus, we do not support resume by filename.  We treat a request
409b89a8333Snatalie li - Sun Microsystems - Irvine United States  * to resume by filename as SMB_FIND_CONTINUE_FROM_LAST.
410da6c28aaSamw  */
4117b59d02dSjb150015 smb_sdrc_t
412dc20a302Sas200622 smb_com_trans2_find_next2(smb_request_t *sr, smb_xa_t *xa)
413da6c28aaSamw {
4147f667e74Sjose borrego 	int			count;
4157f667e74Sjose borrego 	uint16_t		odid;
416da6c28aaSamw 	uint32_t		cookie;
4177f667e74Sjose borrego 	smb_odir_t		*od;
4187f667e74Sjose borrego 	smb_find_args_t		args;
4197f667e74Sjose borrego 	boolean_t		eos;
4207f667e74Sjose borrego 	smb_odir_resume_t	odir_resume;
421da6c28aaSamw 
4227f667e74Sjose borrego 	bzero(&args, sizeof (smb_find_args_t));
4237f667e74Sjose borrego 
4247f667e74Sjose borrego 	if (smb_mbc_decodef(&xa->req_param_mb, "%wwwlw", sr, &odid,
4257f667e74Sjose borrego 	    &args.fa_maxcount, &args.fa_infolev, &cookie, &args.fa_fflag)
4267f667e74Sjose borrego 	    != 0) {
427faa1795aSjb150015 		return (SDRC_ERROR);
428da6c28aaSamw 	}
429da6c28aaSamw 
430b89a8333Snatalie li - Sun Microsystems - Irvine United States 	/* continuation by filename not supported */
4317f667e74Sjose borrego 	if ((args.fa_fflag & SMB_FIND_CONTINUE_FROM_LAST) || (cookie == 0)) {
4327f667e74Sjose borrego 		odir_resume.or_type = SMB_ODIR_RESUME_IDX;
4337f667e74Sjose borrego 		odir_resume.or_idx = 0;
4347f667e74Sjose borrego 	} else {
4357f667e74Sjose borrego 		odir_resume.or_type = SMB_ODIR_RESUME_COOKIE;
4367f667e74Sjose borrego 		odir_resume.or_cookie = cookie;
4377f667e74Sjose borrego 	}
438b89a8333Snatalie li - Sun Microsystems - Irvine United States 
4397f667e74Sjose borrego 	if (args.fa_fflag & SMB_FIND_WITH_BACKUP_INTENT)
440b89a8333Snatalie li - Sun Microsystems - Irvine United States 		sr->user_cr = smb_user_getprivcred(sr->uid_user);
441b89a8333Snatalie li - Sun Microsystems - Irvine United States 
4427f667e74Sjose borrego 	args.fa_maxdata =
4437f667e74Sjose borrego 	    smb_trans2_find_get_maxdata(sr, args.fa_infolev, args.fa_fflag);
4447f667e74Sjose borrego 	if (args.fa_maxdata == 0)
4457f667e74Sjose borrego 		return (SDRC_ERROR);
4467f667e74Sjose borrego 
4477f667e74Sjose borrego 	od = smb_tree_lookup_odir(sr->tid_tree, odid);
4487f667e74Sjose borrego 	if (od == NULL) {
4497f667e74Sjose borrego 		smbsr_error(sr, NT_STATUS_INVALID_HANDLE,
4507f667e74Sjose borrego 		    ERRDOS, ERROR_INVALID_HANDLE);
4517f667e74Sjose borrego 		return (SDRC_ERROR);
4527f667e74Sjose borrego 	}
4537f667e74Sjose borrego 	smb_odir_resume_at(od, &odir_resume);
4547f667e74Sjose borrego 	count = smb_trans2_find_entries(sr, xa, od, &args, &eos);
4557f667e74Sjose borrego 
4567f667e74Sjose borrego 	if (count == -1) {
4577f667e74Sjose borrego 		smb_odir_close(od);
458a1511e6bSjoyce mcintosh 		smb_odir_release(od);
459faa1795aSjb150015 		return (SDRC_ERROR);
460da6c28aaSamw 	}
461da6c28aaSamw 
4627f667e74Sjose borrego 	if ((args.fa_fflag & SMB_FIND_CLOSE_AFTER_REQUEST) ||
4637f667e74Sjose borrego 	    (eos && (args.fa_fflag & SMB_FIND_CLOSE_AT_EOS))) {
4647f667e74Sjose borrego 		smb_odir_close(od);
4657f667e74Sjose borrego 	} /* else leave odir open for trans2_find_next2 */
4667f667e74Sjose borrego 
467a1511e6bSjoyce mcintosh 	smb_odir_release(od);
4687f667e74Sjose borrego 	(void) smb_mbc_encodef(&xa->rep_param_mb, "wwww",
4697f667e74Sjose borrego 	    count, (eos) ? 1 : 0, 0, 0);
4707f667e74Sjose borrego 
4717f667e74Sjose borrego 	return (SDRC_SUCCESS);
472da6c28aaSamw }
473da6c28aaSamw 
4747f667e74Sjose borrego 
475da6c28aaSamw /*
4767f667e74Sjose borrego  * smb_trans2_find_entries
4777f667e74Sjose borrego  *
4787f667e74Sjose borrego  * Find and encode up to args->fa_maxcount directory entries.
4797f667e74Sjose borrego  * For compatibilty with Windows, if args->fa_maxcount is zero treat it as 1.
4807f667e74Sjose borrego  *
4817f667e74Sjose borrego  * Returns:
4827f667e74Sjose borrego  *   count - count of entries encoded
4837f667e74Sjose borrego  *           *eos = B_TRUE if no more directory entries
4847f667e74Sjose borrego  *      -1 - error
485dc20a302Sas200622  */
4867f667e74Sjose borrego static int
4877f667e74Sjose borrego smb_trans2_find_entries(smb_request_t *sr, smb_xa_t *xa, smb_odir_t *od,
4887f667e74Sjose borrego     smb_find_args_t *args, boolean_t *eos)
4897f667e74Sjose borrego {
4907f667e74Sjose borrego 	int		rc;
4917f667e74Sjose borrego 	uint16_t	count, maxcount;
4927f667e74Sjose borrego 	uint32_t	cookie;
4937f667e74Sjose borrego 	smb_fileinfo_t	fileinfo;
4947f667e74Sjose borrego 
4957f667e74Sjose borrego 	if ((maxcount = args->fa_maxcount) == 0)
496dc20a302Sas200622 		maxcount = 1;
497dc20a302Sas200622 
498dc20a302Sas200622 	if ((smb_trans2_find_max != 0) && (maxcount > smb_trans2_find_max))
499dc20a302Sas200622 		maxcount = smb_trans2_find_max;
500dc20a302Sas200622 
5017f667e74Sjose borrego 	count = 0;
5027f667e74Sjose borrego 	while (count < maxcount) {
5037f667e74Sjose borrego 		if (smb_odir_read_fileinfo(sr, od, &fileinfo, eos) != 0)
5047f667e74Sjose borrego 			return (-1);
5057f667e74Sjose borrego 		if (*eos == B_TRUE)
5067f667e74Sjose borrego 			break;
5077f667e74Sjose borrego 
5087f667e74Sjose borrego 		rc = smb_trans2_find_mbc_encode(sr, xa, &fileinfo, args);
5097f667e74Sjose borrego 		if (rc == -1)
5107f667e74Sjose borrego 			return (-1);
5117f667e74Sjose borrego 		if (rc == 1)
5127f667e74Sjose borrego 			break;
5137f667e74Sjose borrego 
5147f667e74Sjose borrego 		cookie = fileinfo.fi_cookie;
5157f667e74Sjose borrego 		++count;
516da6c28aaSamw 	}
517da6c28aaSamw 
5187f667e74Sjose borrego 	/* save the last cookie returned to client */
5197f667e74Sjose borrego 	if (count != 0)
5207f667e74Sjose borrego 		smb_odir_save_cookie(od, 0, cookie);
521da6c28aaSamw 
522*1fcced4cSJordan Brown 	/*
523*1fcced4cSJordan Brown 	 * If all retrieved entries have been successfully encoded
524*1fcced4cSJordan Brown 	 * and eos has not already been detected, check if there are
525*1fcced4cSJordan Brown 	 * any more entries. eos will be set if there are no more.
526*1fcced4cSJordan Brown 	 */
527*1fcced4cSJordan Brown 	if ((rc == 0) && (!*eos))
5287f667e74Sjose borrego 		(void) smb_odir_read_fileinfo(sr, od, &fileinfo, eos);
529da6c28aaSamw 
5307f667e74Sjose borrego 	return (count);
531da6c28aaSamw }
532da6c28aaSamw 
533da6c28aaSamw /*
534da6c28aaSamw  * smb_trans2_find_get_maxdata
535da6c28aaSamw  *
536dc20a302Sas200622  * Calculate the minimum response space required for the specified
537dc20a302Sas200622  * information level.
538da6c28aaSamw  *
539dc20a302Sas200622  * A non-zero return value provides the minimum space required.
540dc20a302Sas200622  * A return value of zero indicates an unknown information level.
541da6c28aaSamw  */
542dc20a302Sas200622 static int
543dc20a302Sas200622 smb_trans2_find_get_maxdata(smb_request_t *sr, uint16_t infolev, uint16_t fflag)
544da6c28aaSamw {
545da6c28aaSamw 	int maxdata;
546da6c28aaSamw 
547da6c28aaSamw 	maxdata = smb_ascii_or_unicode_null_len(sr);
548da6c28aaSamw 
549da6c28aaSamw 	switch (infolev) {
550da6c28aaSamw 	case SMB_INFO_STANDARD :
551da6c28aaSamw 		if (fflag & SMB_FIND_RETURN_RESUME_KEYS)
552da6c28aaSamw 			maxdata += sizeof (int32_t);
553da6c28aaSamw 		maxdata += 2 + 2 + 2 + 4 + 4 + 2 + 1;
554da6c28aaSamw 		break;
555da6c28aaSamw 
556da6c28aaSamw 	case SMB_INFO_QUERY_EA_SIZE:
557da6c28aaSamw 		if (fflag & SMB_FIND_RETURN_RESUME_KEYS)
558da6c28aaSamw 			maxdata += sizeof (int32_t);
559da6c28aaSamw 		maxdata += 2 + 2 + 2 + 4 + 4 + 2 + 4 + 1;
560da6c28aaSamw 		break;
561da6c28aaSamw 
562da6c28aaSamw 	case SMB_FIND_FILE_DIRECTORY_INFO:
563da6c28aaSamw 		maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4;
564da6c28aaSamw 		break;
565da6c28aaSamw 
566b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case SMB_FIND_FILE_FULL_DIRECTORY_INFO:
567b89a8333Snatalie li - Sun Microsystems - Irvine United States 		maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4;
568b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
569b89a8333Snatalie li - Sun Microsystems - Irvine United States 
570b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO:
571b89a8333Snatalie li - Sun Microsystems - Irvine United States 		maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4 + 4 + 8;
572b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
573b89a8333Snatalie li - Sun Microsystems - Irvine United States 
574da6c28aaSamw 	case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
575da6c28aaSamw 		maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4 + 2 + 24;
576da6c28aaSamw 		break;
577da6c28aaSamw 
578b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO:
579b89a8333Snatalie li - Sun Microsystems - Irvine United States 		maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4 + 2 + 24
580b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    + 2 + 8;
581b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
582b89a8333Snatalie li - Sun Microsystems - Irvine United States 
583da6c28aaSamw 	case SMB_FIND_FILE_NAMES_INFO:
584da6c28aaSamw 		maxdata += 4 + 4 + 4;
585da6c28aaSamw 		break;
586da6c28aaSamw 
587da6c28aaSamw 	case SMB_MAC_FIND_BOTH_HFS_INFO:
588da6c28aaSamw 		maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 1 + 1 + 2 +
589da6c28aaSamw 		    4 + 32 + 4 + 1 + 1 + 24 + 4;
590da6c28aaSamw 		break;
591da6c28aaSamw 
592da6c28aaSamw 	default:
593da6c28aaSamw 		maxdata = 0;
5947f667e74Sjose borrego 		smbsr_error(sr, NT_STATUS_INVALID_LEVEL,
5957f667e74Sjose borrego 		    ERRDOS, ERROR_INVALID_LEVEL);
596da6c28aaSamw 	}
597da6c28aaSamw 
598da6c28aaSamw 	return (maxdata);
599da6c28aaSamw }
600da6c28aaSamw 
601da6c28aaSamw /*
6027f667e74Sjose borrego  * smb_trans2_mbc_encode
603da6c28aaSamw  *
604da6c28aaSamw  * This function encodes the mbc for one directory entry.
605da6c28aaSamw  *
606da6c28aaSamw  * The function returns -1 when the max data requested by client
607da6c28aaSamw  * is reached. If the entry is valid and successful encoded, 0
608da6c28aaSamw  * will be returned; otherwise, 1 will be returned.
609b89a8333Snatalie li - Sun Microsystems - Irvine United States  *
610b89a8333Snatalie li - Sun Microsystems - Irvine United States  * We always null terminate the filename. The space for the null
611b89a8333Snatalie li - Sun Microsystems - Irvine United States  * is included in the maxdata calculation and is therefore included
612b89a8333Snatalie li - Sun Microsystems - Irvine United States  * in the next_entry_offset. namelen is the unterminated length of
613b89a8333Snatalie li - Sun Microsystems - Irvine United States  * the filename. For levels except STANDARD and EA_SIZE, if the
614b89a8333Snatalie li - Sun Microsystems - Irvine United States  * filename is ascii the name length returned to the client should
615b89a8333Snatalie li - Sun Microsystems - Irvine United States  * include the null terminator. Otherwise the length returned to
616b89a8333Snatalie li - Sun Microsystems - Irvine United States  * the client should not include the terminator.
6177f667e74Sjose borrego  *
6187f667e74Sjose borrego  * Returns: 0 - data successfully encoded
6197f667e74Sjose borrego  *          1 - client request's maxdata limit reached
6207f667e74Sjose borrego  *	   -1 - error
621da6c28aaSamw  */
6227f667e74Sjose borrego static int
6237f667e74Sjose borrego smb_trans2_find_mbc_encode(smb_request_t *sr, smb_xa_t *xa,
6247f667e74Sjose borrego     smb_fileinfo_t *fileinfo, smb_find_args_t *args)
625da6c28aaSamw {
626b89a8333Snatalie li - Sun Microsystems - Irvine United States 	int		namelen, shortlen, buflen;
627dc20a302Sas200622 	uint32_t	next_entry_offset;
6287f667e74Sjose borrego 	uint32_t	dsize32, asize32;
6297f667e74Sjose borrego 	uint32_t	mb_flags = 0;
630da6c28aaSamw 	char		buf83[26];
631b89a8333Snatalie li - Sun Microsystems - Irvine United States 	char		*tmpbuf;
632da6c28aaSamw 	smb_msgbuf_t	mb;
633da6c28aaSamw 
6347f667e74Sjose borrego 	namelen = smb_ascii_or_unicode_strlen(sr, fileinfo->fi_name);
635b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (namelen == -1)
636da6c28aaSamw 		return (-1);
637da6c28aaSamw 
6387f667e74Sjose borrego 	next_entry_offset = args->fa_maxdata + namelen;
6397f667e74Sjose borrego 
6407f667e74Sjose borrego 	if (MBC_ROOM_FOR(&xa->rep_data_mb, (args->fa_maxdata + namelen)) == 0)
6417f667e74Sjose borrego 		return (1);
6427f667e74Sjose borrego 
643b89a8333Snatalie li - Sun Microsystems - Irvine United States 	/*
644b89a8333Snatalie li - Sun Microsystems - Irvine United States 	 * If ascii the filename length returned to the client should
645b89a8333Snatalie li - Sun Microsystems - Irvine United States 	 * include the null terminator for levels except STANDARD and
646b89a8333Snatalie li - Sun Microsystems - Irvine United States 	 * EASIZE.
647b89a8333Snatalie li - Sun Microsystems - Irvine United States 	 */
648b89a8333Snatalie li - Sun Microsystems - Irvine United States 	if (!(sr->smb_flg2 & SMB_FLAGS2_UNICODE)) {
6497f667e74Sjose borrego 		if ((args->fa_infolev != SMB_INFO_STANDARD) &&
6507f667e74Sjose borrego 		    (args->fa_infolev != SMB_INFO_QUERY_EA_SIZE))
651b89a8333Snatalie li - Sun Microsystems - Irvine United States 			namelen += 1;
652b89a8333Snatalie li - Sun Microsystems - Irvine United States 	}
653b89a8333Snatalie li - Sun Microsystems - Irvine United States 
6547f667e74Sjose borrego 	mb_flags = (sr->smb_flg2 & SMB_FLAGS2_UNICODE) ? SMB_MSGBUF_UNICODE : 0;
6557f667e74Sjose borrego 	dsize32 = (fileinfo->fi_size > UINT_MAX) ?
6567f667e74Sjose borrego 	    UINT_MAX : (uint32_t)fileinfo->fi_size;
6577f667e74Sjose borrego 	asize32 = (fileinfo->fi_alloc_size > UINT_MAX) ?
6587f667e74Sjose borrego 	    UINT_MAX : (uint32_t)fileinfo->fi_alloc_size;
659da6c28aaSamw 
6607f667e74Sjose borrego 	switch (args->fa_infolev) {
661da6c28aaSamw 	case SMB_INFO_STANDARD:
6627f667e74Sjose borrego 		if (args->fa_fflag & SMB_FIND_RETURN_RESUME_KEYS)
6633db3f65cSamw 			(void) smb_mbc_encodef(&xa->rep_data_mb, "l",
6647f667e74Sjose borrego 			    fileinfo->fi_cookie);
665da6c28aaSamw 
6663db3f65cSamw 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%yyyllwbu", sr,
6677f667e74Sjose borrego 		    smb_gmt2local(sr, fileinfo->fi_crtime.tv_sec),
6687f667e74Sjose borrego 		    smb_gmt2local(sr, fileinfo->fi_atime.tv_sec),
6697f667e74Sjose borrego 		    smb_gmt2local(sr, fileinfo->fi_mtime.tv_sec),
6706537f381Sas200622 		    dsize32,
6716537f381Sas200622 		    asize32,
6727f667e74Sjose borrego 		    fileinfo->fi_dosattr,
673b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen,
6747f667e74Sjose borrego 		    fileinfo->fi_name);
675da6c28aaSamw 		break;
676da6c28aaSamw 
677da6c28aaSamw 	case SMB_INFO_QUERY_EA_SIZE:
6787f667e74Sjose borrego 		if (args->fa_fflag & SMB_FIND_RETURN_RESUME_KEYS)
6793db3f65cSamw 			(void) smb_mbc_encodef(&xa->rep_data_mb, "l",
6807f667e74Sjose borrego 			    fileinfo->fi_cookie);
681da6c28aaSamw 
682b89a8333Snatalie li - Sun Microsystems - Irvine United States 		/*
683b89a8333Snatalie li - Sun Microsystems - Irvine United States 		 * Unicode filename should NOT be aligned. Encode ('u')
684b89a8333Snatalie li - Sun Microsystems - Irvine United States 		 * into a temporary buffer, then encode buffer as a
685b89a8333Snatalie li - Sun Microsystems - Irvine United States 		 * byte stream ('#c').
686b89a8333Snatalie li - Sun Microsystems - Irvine United States 		 * Regardless of whether unicode or ascii, a single
687b89a8333Snatalie li - Sun Microsystems - Irvine United States 		 * termination byte is used.
688b89a8333Snatalie li - Sun Microsystems - Irvine United States 		 */
689b89a8333Snatalie li - Sun Microsystems - Irvine United States 		buflen = namelen + sizeof (mts_wchar_t);
690b89a8333Snatalie li - Sun Microsystems - Irvine United States 		tmpbuf = kmem_zalloc(buflen, KM_SLEEP);
691b89a8333Snatalie li - Sun Microsystems - Irvine United States 		smb_msgbuf_init(&mb, (uint8_t *)tmpbuf, buflen, mb_flags);
6927f667e74Sjose borrego 		if (smb_msgbuf_encode(&mb, "u", fileinfo->fi_name) < 0) {
693b89a8333Snatalie li - Sun Microsystems - Irvine United States 			smb_msgbuf_term(&mb);
694b89a8333Snatalie li - Sun Microsystems - Irvine United States 			kmem_free(tmpbuf, buflen);
695b89a8333Snatalie li - Sun Microsystems - Irvine United States 			return (-1);
696b89a8333Snatalie li - Sun Microsystems - Irvine United States 		}
697b89a8333Snatalie li - Sun Microsystems - Irvine United States 		tmpbuf[namelen] = '\0';
698b89a8333Snatalie li - Sun Microsystems - Irvine United States 
699b89a8333Snatalie li - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%yyyllwlb#c", sr,
7007f667e74Sjose borrego 		    smb_gmt2local(sr, fileinfo->fi_crtime.tv_sec),
7017f667e74Sjose borrego 		    smb_gmt2local(sr, fileinfo->fi_atime.tv_sec),
7027f667e74Sjose borrego 		    smb_gmt2local(sr, fileinfo->fi_mtime.tv_sec),
7036537f381Sas200622 		    dsize32,
7046537f381Sas200622 		    asize32,
7057f667e74Sjose borrego 		    fileinfo->fi_dosattr,
706da6c28aaSamw 		    0L,		/* EA Size */
707b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen,
708b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen + 1,
709b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    tmpbuf);
710b89a8333Snatalie li - Sun Microsystems - Irvine United States 
711b89a8333Snatalie li - Sun Microsystems - Irvine United States 		smb_msgbuf_term(&mb);
712b89a8333Snatalie li - Sun Microsystems - Irvine United States 		kmem_free(tmpbuf, buflen);
713da6c28aaSamw 		break;
714da6c28aaSamw 
715da6c28aaSamw 	case SMB_FIND_FILE_DIRECTORY_INFO:
7163db3f65cSamw 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqllu", sr,
717dc20a302Sas200622 		    next_entry_offset,
7187f667e74Sjose borrego 		    fileinfo->fi_cookie,
7197f667e74Sjose borrego 		    &fileinfo->fi_crtime,
7207f667e74Sjose borrego 		    &fileinfo->fi_atime,
7217f667e74Sjose borrego 		    &fileinfo->fi_mtime,
7227f667e74Sjose borrego 		    &fileinfo->fi_ctime,
7237f667e74Sjose borrego 		    fileinfo->fi_size,
7247f667e74Sjose borrego 		    fileinfo->fi_alloc_size,
7257f667e74Sjose borrego 		    fileinfo->fi_dosattr,
726b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen,
7277f667e74Sjose borrego 		    fileinfo->fi_name);
728b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
729b89a8333Snatalie li - Sun Microsystems - Irvine United States 
730b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case SMB_FIND_FILE_FULL_DIRECTORY_INFO:
731b89a8333Snatalie li - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqlllu", sr,
732b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    next_entry_offset,
7337f667e74Sjose borrego 		    fileinfo->fi_cookie,
7347f667e74Sjose borrego 		    &fileinfo->fi_crtime,
7357f667e74Sjose borrego 		    &fileinfo->fi_atime,
7367f667e74Sjose borrego 		    &fileinfo->fi_mtime,
7377f667e74Sjose borrego 		    &fileinfo->fi_ctime,
7387f667e74Sjose borrego 		    fileinfo->fi_size,
7397f667e74Sjose borrego 		    fileinfo->fi_alloc_size,
7407f667e74Sjose borrego 		    fileinfo->fi_dosattr,
741b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen,
742b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    0L,
7437f667e74Sjose borrego 		    fileinfo->fi_name);
744b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
745b89a8333Snatalie li - Sun Microsystems - Irvine United States 
746b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO:
747b89a8333Snatalie li - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqlll4.qu", sr,
748b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    next_entry_offset,
7497f667e74Sjose borrego 		    fileinfo->fi_cookie,
7507f667e74Sjose borrego 		    &fileinfo->fi_crtime,
7517f667e74Sjose borrego 		    &fileinfo->fi_atime,
7527f667e74Sjose borrego 		    &fileinfo->fi_mtime,
7537f667e74Sjose borrego 		    &fileinfo->fi_ctime,
7547f667e74Sjose borrego 		    fileinfo->fi_size,
7557f667e74Sjose borrego 		    fileinfo->fi_alloc_size,
7567f667e74Sjose borrego 		    fileinfo->fi_dosattr,
757b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen,
758b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    0L,
7597f667e74Sjose borrego 		    fileinfo->fi_nodeid,
7607f667e74Sjose borrego 		    fileinfo->fi_name);
761da6c28aaSamw 		break;
762da6c28aaSamw 
763da6c28aaSamw 	case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
764da6c28aaSamw 		bzero(buf83, sizeof (buf83));
765dc20a302Sas200622 		smb_msgbuf_init(&mb, (uint8_t *)buf83, sizeof (buf83),
766da6c28aaSamw 		    mb_flags);
7677f667e74Sjose borrego 		if (smb_msgbuf_encode(&mb, "U", fileinfo->fi_shortname) < 0) {
768da6c28aaSamw 			smb_msgbuf_term(&mb);
769da6c28aaSamw 			return (-1);
770da6c28aaSamw 		}
7717f667e74Sjose borrego 		shortlen = mts_wcequiv_strlen(fileinfo->fi_shortname);
772da6c28aaSamw 
7733db3f65cSamw 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqlllb.24cu",
774dc20a302Sas200622 		    sr,
775dc20a302Sas200622 		    next_entry_offset,
7767f667e74Sjose borrego 		    fileinfo->fi_cookie,
7777f667e74Sjose borrego 		    &fileinfo->fi_crtime,
7787f667e74Sjose borrego 		    &fileinfo->fi_atime,
7797f667e74Sjose borrego 		    &fileinfo->fi_mtime,
7807f667e74Sjose borrego 		    &fileinfo->fi_ctime,
7817f667e74Sjose borrego 		    fileinfo->fi_size,
7827f667e74Sjose borrego 		    fileinfo->fi_alloc_size,
7837f667e74Sjose borrego 		    fileinfo->fi_dosattr,
784b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen,
785da6c28aaSamw 		    0L,
786dc20a302Sas200622 		    shortlen,
787da6c28aaSamw 		    buf83,
7887f667e74Sjose borrego 		    fileinfo->fi_name);
789da6c28aaSamw 
790da6c28aaSamw 		smb_msgbuf_term(&mb);
791da6c28aaSamw 		break;
792da6c28aaSamw 
793b89a8333Snatalie li - Sun Microsystems - Irvine United States 	case SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO:
794b89a8333Snatalie li - Sun Microsystems - Irvine United States 		bzero(buf83, sizeof (buf83));
795b89a8333Snatalie li - Sun Microsystems - Irvine United States 		smb_msgbuf_init(&mb, (uint8_t *)buf83, sizeof (buf83),
796b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    mb_flags);
7977f667e74Sjose borrego 		if (smb_msgbuf_encode(&mb, "u", fileinfo->fi_shortname) < 0) {
798b89a8333Snatalie li - Sun Microsystems - Irvine United States 			smb_msgbuf_term(&mb);
799b89a8333Snatalie li - Sun Microsystems - Irvine United States 			return (-1);
800b89a8333Snatalie li - Sun Microsystems - Irvine United States 		}
8017f667e74Sjose borrego 		shortlen = smb_ascii_or_unicode_strlen(sr,
8027f667e74Sjose borrego 		    fileinfo->fi_shortname);
803b89a8333Snatalie li - Sun Microsystems - Irvine United States 
804b89a8333Snatalie li - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb,
805b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    "%llTTTTqqlllb.24c2.qu",
806b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    sr,
807b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    next_entry_offset,
8087f667e74Sjose borrego 		    fileinfo->fi_cookie,
8097f667e74Sjose borrego 		    &fileinfo->fi_crtime,
8107f667e74Sjose borrego 		    &fileinfo->fi_atime,
8117f667e74Sjose borrego 		    &fileinfo->fi_mtime,
8127f667e74Sjose borrego 		    &fileinfo->fi_ctime,
8137f667e74Sjose borrego 		    fileinfo->fi_size,
8147f667e74Sjose borrego 		    fileinfo->fi_alloc_size,
8157f667e74Sjose borrego 		    fileinfo->fi_dosattr,
816b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen,
817b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    0L,
818b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    shortlen,
819b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    buf83,
8207f667e74Sjose borrego 		    fileinfo->fi_nodeid,
8217f667e74Sjose borrego 		    fileinfo->fi_name);
822b89a8333Snatalie li - Sun Microsystems - Irvine United States 
823b89a8333Snatalie li - Sun Microsystems - Irvine United States 		smb_msgbuf_term(&mb);
824b89a8333Snatalie li - Sun Microsystems - Irvine United States 		break;
825b89a8333Snatalie li - Sun Microsystems - Irvine United States 
826da6c28aaSamw 	case SMB_FIND_FILE_NAMES_INFO:
8273db3f65cSamw 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%lllu", sr,
828dc20a302Sas200622 		    next_entry_offset,
8297f667e74Sjose borrego 		    fileinfo->fi_cookie,
830b89a8333Snatalie li - Sun Microsystems - Irvine United States 		    namelen,
8317f667e74Sjose borrego 		    fileinfo->fi_name);
832da6c28aaSamw 		break;
833da6c28aaSamw 	}
834da6c28aaSamw 
835da6c28aaSamw 	return (0);
836da6c28aaSamw }
837da6c28aaSamw 
838da6c28aaSamw /*
839da6c28aaSamw  * Close a search started by a Trans2FindFirst2 request.
840da6c28aaSamw  */
8417b59d02dSjb150015 smb_sdrc_t
842faa1795aSjb150015 smb_pre_find_close2(smb_request_t *sr)
843faa1795aSjb150015 {
844faa1795aSjb150015 	DTRACE_SMB_1(op__FindClose2__start, smb_request_t *, sr);
8457f667e74Sjose borrego 	return (SDRC_SUCCESS);
846faa1795aSjb150015 }
847faa1795aSjb150015 
848faa1795aSjb150015 void
849faa1795aSjb150015 smb_post_find_close2(smb_request_t *sr)
850faa1795aSjb150015 {
851faa1795aSjb150015 	DTRACE_SMB_1(op__FindClose2__done, smb_request_t *, sr);
852faa1795aSjb150015 }
853faa1795aSjb150015 
854faa1795aSjb150015 smb_sdrc_t
855dc20a302Sas200622 smb_com_find_close2(smb_request_t *sr)
856da6c28aaSamw {
8577f667e74Sjose borrego 	uint16_t	odid;
8587f667e74Sjose borrego 	smb_odir_t	*od;
8597f667e74Sjose borrego 
8607f667e74Sjose borrego 	if (smbsr_decode_vwv(sr, "w", &odid) != 0)
8617f667e74Sjose borrego 		return (SDRC_ERROR);
8627f667e74Sjose borrego 
8637f667e74Sjose borrego 	od = smb_tree_lookup_odir(sr->tid_tree, odid);
8647f667e74Sjose borrego 	if (od == NULL) {
8657f667e74Sjose borrego 		smbsr_error(sr, NT_STATUS_INVALID_HANDLE,
8667f667e74Sjose borrego 		    ERRDOS, ERROR_INVALID_HANDLE);
867faa1795aSjb150015 		return (SDRC_ERROR);
868da6c28aaSamw 	}
869da6c28aaSamw 
8707f667e74Sjose borrego 	smb_odir_close(od);
8717f667e74Sjose borrego 	smb_odir_release(od);
8727b59d02dSjb150015 
8737b59d02dSjb150015 	if (smbsr_encode_empty_result(sr))
874faa1795aSjb150015 		return (SDRC_ERROR);
8757b59d02dSjb150015 
876faa1795aSjb150015 	return (SDRC_SUCCESS);
877da6c28aaSamw }
878