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 /* 22*7f667e74Sjose 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 209*7f667e74Sjose borrego typedef struct smb_find_args { 210*7f667e74Sjose borrego uint16_t fa_infolev; 211*7f667e74Sjose borrego uint16_t fa_maxcount; 212*7f667e74Sjose borrego uint16_t fa_fflag; 213*7f667e74Sjose borrego uint32_t fa_maxdata; 214*7f667e74Sjose borrego } smb_find_args_t; 215*7f667e74Sjose borrego 216*7f667e74Sjose borrego static int smb_trans2_find_entries(smb_request_t *, smb_xa_t *, 217*7f667e74Sjose 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); 219*7f667e74Sjose borrego static int smb_trans2_find_mbc_encode(smb_request_t *, smb_xa_t *, 220*7f667e74Sjose 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 { 274*7f667e74Sjose borrego int count; 275*7f667e74Sjose borrego uint16_t sattr, odid; 276da6c28aaSamw char *path; 277*7f667e74Sjose borrego smb_odir_t *od; 278*7f667e74Sjose borrego smb_find_args_t args; 279*7f667e74Sjose borrego boolean_t eos; 280*7f667e74Sjose borrego 281*7f667e74Sjose borrego bzero(&args, sizeof (smb_find_args_t)); 282da6c28aaSamw 283da6c28aaSamw if (!STYPE_ISDSK(sr->tid_tree->t_res_type)) { 284dc20a302Sas200622 smbsr_error(sr, NT_STATUS_ACCESS_DENIED, 285da6c28aaSamw ERRDOS, ERROR_ACCESS_DENIED); 286faa1795aSjb150015 return (SDRC_ERROR); 287da6c28aaSamw } 288da6c28aaSamw 289*7f667e74Sjose borrego if (smb_mbc_decodef(&xa->req_param_mb, "%wwww4.u", sr, &sattr, 290*7f667e74Sjose borrego &args.fa_maxcount, &args.fa_fflag, &args.fa_infolev, &path) != 0) { 291faa1795aSjb150015 return (SDRC_ERROR); 292da6c28aaSamw } 293da6c28aaSamw 2948d7e4166Sjose borrego if (smb_is_stream_name(path)) { 295b89a8333Snatalie li - Sun Microsystems - Irvine United States smbsr_error(sr, NT_STATUS_OBJECT_NAME_INVALID, 296b89a8333Snatalie li - Sun Microsystems - Irvine United States ERRDOS, ERROR_INVALID_NAME); 297b89a8333Snatalie li - Sun Microsystems - Irvine United States return (SDRC_ERROR); 298b89a8333Snatalie li - Sun Microsystems - Irvine United States } 299b89a8333Snatalie li - Sun Microsystems - Irvine United States 300*7f667e74Sjose borrego if (args.fa_fflag & SMB_FIND_WITH_BACKUP_INTENT) 301b89a8333Snatalie li - Sun Microsystems - Irvine United States sr->user_cr = smb_user_getprivcred(sr->uid_user); 302b89a8333Snatalie li - Sun Microsystems - Irvine United States 303*7f667e74Sjose borrego args.fa_maxdata = 304*7f667e74Sjose borrego smb_trans2_find_get_maxdata(sr, args.fa_infolev, args.fa_fflag); 305*7f667e74Sjose borrego if (args.fa_maxdata == 0) 306faa1795aSjb150015 return (SDRC_ERROR); 307dc20a302Sas200622 308dc20a302Sas200622 if (sr->smb_flg2 & SMB_FLAGS2_UNICODE) 309da6c28aaSamw (void) smb_convert_unicode_wildcards(path); 310dc20a302Sas200622 311*7f667e74Sjose borrego odid = smb_odir_open(sr, path, sattr); 312*7f667e74Sjose borrego if (odid == 0) 313faa1795aSjb150015 return (SDRC_ERROR); 314da6c28aaSamw 315*7f667e74Sjose borrego od = smb_tree_lookup_odir(sr->tid_tree, odid); 316*7f667e74Sjose borrego if (od == NULL) 317*7f667e74Sjose borrego return (SDRC_ERROR); 318*7f667e74Sjose borrego count = smb_trans2_find_entries(sr, xa, od, &args, &eos); 319*7f667e74Sjose borrego smb_odir_release(od); 320dc20a302Sas200622 321*7f667e74Sjose borrego if (count == -1) { 322*7f667e74Sjose borrego smb_odir_close(od); 323faa1795aSjb150015 return (SDRC_ERROR); 324da6c28aaSamw } 325da6c28aaSamw 326*7f667e74Sjose borrego if (count == 0) { 327*7f667e74Sjose borrego smb_odir_close(od); 328*7f667e74Sjose borrego smbsr_errno(sr, ENOENT); 329*7f667e74Sjose borrego return (SDRC_ERROR); 330da6c28aaSamw } 331da6c28aaSamw 332*7f667e74Sjose borrego if ((args.fa_fflag & SMB_FIND_CLOSE_AFTER_REQUEST) || 333*7f667e74Sjose borrego (eos && (args.fa_fflag & SMB_FIND_CLOSE_AT_EOS))) { 334*7f667e74Sjose borrego smb_odir_close(od); 335*7f667e74Sjose borrego } /* else leave odir open for trans2_find_next2 */ 336*7f667e74Sjose borrego 3373db3f65cSamw (void) smb_mbc_encodef(&xa->rep_param_mb, "wwwww", 338*7f667e74Sjose borrego odid, count, (eos) ? 1 : 0, 0, 0); 339da6c28aaSamw 340faa1795aSjb150015 return (SDRC_SUCCESS); 341da6c28aaSamw } 342da6c28aaSamw 343da6c28aaSamw /* 344da6c28aaSamw * smb_com_trans2_find_next2 345da6c28aaSamw * 346da6c28aaSamw * Client Request Value 347da6c28aaSamw * ================================== ================================= 348da6c28aaSamw * 349da6c28aaSamw * WordCount 15 350da6c28aaSamw * SetupCount 1 351da6c28aaSamw * Setup[0] TRANS2_FIND_NEXT2 352da6c28aaSamw * 353da6c28aaSamw * Parameter Block Encoding Description 354da6c28aaSamw * ================================== ================================= 355da6c28aaSamw * 356da6c28aaSamw * USHORT Sid; Search handle 357da6c28aaSamw * USHORT SearchCount; Maximum number of entries to 358da6c28aaSamw * return 359da6c28aaSamw * USHORT InformationLevel; Levels described in 360da6c28aaSamw * TRANS2_FIND_FIRST2 request 361da6c28aaSamw * ULONG ResumeKey; Value returned by previous find2 362da6c28aaSamw * call 363da6c28aaSamw * USHORT Flags; Additional information: bit set- 364da6c28aaSamw * 0 - close search after this 365da6c28aaSamw * request 366da6c28aaSamw * 1 - close search if end of search 367da6c28aaSamw * reached 368da6c28aaSamw * 2 - return resume keys for each 369da6c28aaSamw * entry found 370da6c28aaSamw * 3 - resume/continue from previous 371da6c28aaSamw * ending place 372da6c28aaSamw * 4 - find with backup intent 373da6c28aaSamw * STRING FileName; Resume file name 374da6c28aaSamw * 375da6c28aaSamw * Sid is the value returned by a previous successful TRANS2_FIND_FIRST2 376da6c28aaSamw * call. If Bit3 of Flags is set, then FileName may be the NULL string, 377da6c28aaSamw * since the search is continued from the previous TRANS2_FIND request. 378da6c28aaSamw * Otherwise, FileName must not be more than 256 characters long. 379da6c28aaSamw * 380da6c28aaSamw * Response Field Description 381da6c28aaSamw * ================================== ================================= 382da6c28aaSamw * 383da6c28aaSamw * USHORT SearchCount; Number of entries returned 384da6c28aaSamw * USHORT EndOfSearch; Was last entry returned? 385da6c28aaSamw * USHORT EaErrorOffset; Offset into EA list if EA error 386da6c28aaSamw * USHORT LastNameOffset; Offset into data to file name of 387da6c28aaSamw * last entry, if server needs it to 388da6c28aaSamw * resume search; else 0 389da6c28aaSamw * UCHAR Data[TotalDataCount] Level dependent info about the 390da6c28aaSamw * matches found in the search 391b89a8333Snatalie li - Sun Microsystems - Irvine United States * 392b89a8333Snatalie li - Sun Microsystems - Irvine United States * 393b89a8333Snatalie li - Sun Microsystems - Irvine United States * The last parameter in the request is a filename, which is a 394b89a8333Snatalie li - Sun Microsystems - Irvine United States * null-terminated unicode string. 395b89a8333Snatalie li - Sun Microsystems - Irvine United States * 396b89a8333Snatalie li - Sun Microsystems - Irvine United States * smb_mbc_decodef(&xa->req_param_mb, "%www lwu", sr, 397*7f667e74Sjose borrego * &odid, &fa_maxcount, &fa_infolev, &cookie, &fa_fflag, &fname) 398b89a8333Snatalie li - Sun Microsystems - Irvine United States * 399*7f667e74Sjose borrego * The filename parameter is not currently decoded because we 400*7f667e74Sjose borrego * expect a 2-byte null but Mac OS 10 clients send a 1-byte null, 401b89a8333Snatalie li - Sun Microsystems - Irvine United States * which leads to a decode error. 402b89a8333Snatalie li - Sun Microsystems - Irvine United States * Thus, we do not support resume by filename. We treat a request 403b89a8333Snatalie li - Sun Microsystems - Irvine United States * to resume by filename as SMB_FIND_CONTINUE_FROM_LAST. 404da6c28aaSamw */ 4057b59d02dSjb150015 smb_sdrc_t 406dc20a302Sas200622 smb_com_trans2_find_next2(smb_request_t *sr, smb_xa_t *xa) 407da6c28aaSamw { 408*7f667e74Sjose borrego int count; 409*7f667e74Sjose borrego uint16_t odid; 410da6c28aaSamw uint32_t cookie; 411*7f667e74Sjose borrego smb_odir_t *od; 412*7f667e74Sjose borrego smb_find_args_t args; 413*7f667e74Sjose borrego boolean_t eos; 414*7f667e74Sjose borrego smb_odir_resume_t odir_resume; 415da6c28aaSamw 416*7f667e74Sjose borrego bzero(&args, sizeof (smb_find_args_t)); 417*7f667e74Sjose borrego 418*7f667e74Sjose borrego if (smb_mbc_decodef(&xa->req_param_mb, "%wwwlw", sr, &odid, 419*7f667e74Sjose borrego &args.fa_maxcount, &args.fa_infolev, &cookie, &args.fa_fflag) 420*7f667e74Sjose borrego != 0) { 421faa1795aSjb150015 return (SDRC_ERROR); 422da6c28aaSamw } 423da6c28aaSamw 424b89a8333Snatalie li - Sun Microsystems - Irvine United States /* continuation by filename not supported */ 425*7f667e74Sjose borrego if ((args.fa_fflag & SMB_FIND_CONTINUE_FROM_LAST) || (cookie == 0)) { 426*7f667e74Sjose borrego odir_resume.or_type = SMB_ODIR_RESUME_IDX; 427*7f667e74Sjose borrego odir_resume.or_idx = 0; 428*7f667e74Sjose borrego } else { 429*7f667e74Sjose borrego odir_resume.or_type = SMB_ODIR_RESUME_COOKIE; 430*7f667e74Sjose borrego odir_resume.or_cookie = cookie; 431*7f667e74Sjose borrego } 432b89a8333Snatalie li - Sun Microsystems - Irvine United States 433*7f667e74Sjose borrego if (args.fa_fflag & SMB_FIND_WITH_BACKUP_INTENT) 434b89a8333Snatalie li - Sun Microsystems - Irvine United States sr->user_cr = smb_user_getprivcred(sr->uid_user); 435b89a8333Snatalie li - Sun Microsystems - Irvine United States 436*7f667e74Sjose borrego args.fa_maxdata = 437*7f667e74Sjose borrego smb_trans2_find_get_maxdata(sr, args.fa_infolev, args.fa_fflag); 438*7f667e74Sjose borrego if (args.fa_maxdata == 0) 439*7f667e74Sjose borrego return (SDRC_ERROR); 440*7f667e74Sjose borrego 441*7f667e74Sjose borrego od = smb_tree_lookup_odir(sr->tid_tree, odid); 442*7f667e74Sjose borrego if (od == NULL) { 443*7f667e74Sjose borrego smbsr_error(sr, NT_STATUS_INVALID_HANDLE, 444*7f667e74Sjose borrego ERRDOS, ERROR_INVALID_HANDLE); 445*7f667e74Sjose borrego return (SDRC_ERROR); 446*7f667e74Sjose borrego } 447*7f667e74Sjose borrego smb_odir_resume_at(od, &odir_resume); 448*7f667e74Sjose borrego count = smb_trans2_find_entries(sr, xa, od, &args, &eos); 449*7f667e74Sjose borrego smb_odir_release(od); 450*7f667e74Sjose borrego 451*7f667e74Sjose borrego if (count == -1) { 452*7f667e74Sjose borrego smb_odir_close(od); 453faa1795aSjb150015 return (SDRC_ERROR); 454da6c28aaSamw } 455da6c28aaSamw 456*7f667e74Sjose borrego if ((args.fa_fflag & SMB_FIND_CLOSE_AFTER_REQUEST) || 457*7f667e74Sjose borrego (eos && (args.fa_fflag & SMB_FIND_CLOSE_AT_EOS))) { 458*7f667e74Sjose borrego smb_odir_close(od); 459*7f667e74Sjose borrego } /* else leave odir open for trans2_find_next2 */ 460*7f667e74Sjose borrego 461*7f667e74Sjose borrego (void) smb_mbc_encodef(&xa->rep_param_mb, "wwww", 462*7f667e74Sjose borrego count, (eos) ? 1 : 0, 0, 0); 463*7f667e74Sjose borrego 464*7f667e74Sjose borrego return (SDRC_SUCCESS); 465da6c28aaSamw } 466da6c28aaSamw 467*7f667e74Sjose borrego 468da6c28aaSamw /* 469*7f667e74Sjose borrego * smb_trans2_find_entries 470*7f667e74Sjose borrego * 471*7f667e74Sjose borrego * Find and encode up to args->fa_maxcount directory entries. 472*7f667e74Sjose borrego * For compatibilty with Windows, if args->fa_maxcount is zero treat it as 1. 473*7f667e74Sjose borrego * 474*7f667e74Sjose borrego * Returns: 475*7f667e74Sjose borrego * count - count of entries encoded 476*7f667e74Sjose borrego * *eos = B_TRUE if no more directory entries 477*7f667e74Sjose borrego * -1 - error 478dc20a302Sas200622 */ 479*7f667e74Sjose borrego static int 480*7f667e74Sjose borrego smb_trans2_find_entries(smb_request_t *sr, smb_xa_t *xa, smb_odir_t *od, 481*7f667e74Sjose borrego smb_find_args_t *args, boolean_t *eos) 482*7f667e74Sjose borrego { 483*7f667e74Sjose borrego int rc; 484*7f667e74Sjose borrego uint16_t count, maxcount; 485*7f667e74Sjose borrego uint32_t cookie; 486*7f667e74Sjose borrego smb_fileinfo_t fileinfo; 487*7f667e74Sjose borrego 488*7f667e74Sjose borrego if ((maxcount = args->fa_maxcount) == 0) 489dc20a302Sas200622 maxcount = 1; 490dc20a302Sas200622 491dc20a302Sas200622 if ((smb_trans2_find_max != 0) && (maxcount > smb_trans2_find_max)) 492dc20a302Sas200622 maxcount = smb_trans2_find_max; 493dc20a302Sas200622 494*7f667e74Sjose borrego count = 0; 495*7f667e74Sjose borrego while (count < maxcount) { 496*7f667e74Sjose borrego if (smb_odir_read_fileinfo(sr, od, &fileinfo, eos) != 0) 497*7f667e74Sjose borrego return (-1); 498*7f667e74Sjose borrego if (*eos == B_TRUE) 499*7f667e74Sjose borrego break; 500*7f667e74Sjose borrego 501*7f667e74Sjose borrego rc = smb_trans2_find_mbc_encode(sr, xa, &fileinfo, args); 502*7f667e74Sjose borrego if (rc == -1) 503*7f667e74Sjose borrego return (-1); 504*7f667e74Sjose borrego if (rc == 1) 505*7f667e74Sjose borrego break; 506*7f667e74Sjose borrego 507*7f667e74Sjose borrego cookie = fileinfo.fi_cookie; 508*7f667e74Sjose borrego ++count; 509da6c28aaSamw } 510da6c28aaSamw 511*7f667e74Sjose borrego /* save the last cookie returned to client */ 512*7f667e74Sjose borrego if (count != 0) 513*7f667e74Sjose borrego smb_odir_save_cookie(od, 0, cookie); 514da6c28aaSamw 515*7f667e74Sjose borrego /* if eos not already detected, check if more entries */ 516*7f667e74Sjose borrego if (!*eos) 517*7f667e74Sjose borrego (void) smb_odir_read_fileinfo(sr, od, &fileinfo, eos); 518da6c28aaSamw 519*7f667e74Sjose borrego return (count); 520da6c28aaSamw } 521da6c28aaSamw 522da6c28aaSamw /* 523da6c28aaSamw * smb_trans2_find_get_maxdata 524da6c28aaSamw * 525dc20a302Sas200622 * Calculate the minimum response space required for the specified 526dc20a302Sas200622 * information level. 527da6c28aaSamw * 528dc20a302Sas200622 * A non-zero return value provides the minimum space required. 529dc20a302Sas200622 * A return value of zero indicates an unknown information level. 530da6c28aaSamw */ 531dc20a302Sas200622 static int 532dc20a302Sas200622 smb_trans2_find_get_maxdata(smb_request_t *sr, uint16_t infolev, uint16_t fflag) 533da6c28aaSamw { 534da6c28aaSamw int maxdata; 535da6c28aaSamw 536da6c28aaSamw maxdata = smb_ascii_or_unicode_null_len(sr); 537da6c28aaSamw 538da6c28aaSamw switch (infolev) { 539da6c28aaSamw case SMB_INFO_STANDARD : 540da6c28aaSamw if (fflag & SMB_FIND_RETURN_RESUME_KEYS) 541da6c28aaSamw maxdata += sizeof (int32_t); 542da6c28aaSamw maxdata += 2 + 2 + 2 + 4 + 4 + 2 + 1; 543da6c28aaSamw break; 544da6c28aaSamw 545da6c28aaSamw case SMB_INFO_QUERY_EA_SIZE: 546da6c28aaSamw if (fflag & SMB_FIND_RETURN_RESUME_KEYS) 547da6c28aaSamw maxdata += sizeof (int32_t); 548da6c28aaSamw maxdata += 2 + 2 + 2 + 4 + 4 + 2 + 4 + 1; 549da6c28aaSamw break; 550da6c28aaSamw 551da6c28aaSamw case SMB_FIND_FILE_DIRECTORY_INFO: 552da6c28aaSamw maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4; 553da6c28aaSamw break; 554da6c28aaSamw 555b89a8333Snatalie li - Sun Microsystems - Irvine United States case SMB_FIND_FILE_FULL_DIRECTORY_INFO: 556b89a8333Snatalie li - Sun Microsystems - Irvine United States maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4; 557b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 558b89a8333Snatalie li - Sun Microsystems - Irvine United States 559b89a8333Snatalie li - Sun Microsystems - Irvine United States case SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO: 560b89a8333Snatalie li - Sun Microsystems - Irvine United States maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4 + 4 + 8; 561b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 562b89a8333Snatalie li - Sun Microsystems - Irvine United States 563da6c28aaSamw case SMB_FIND_FILE_BOTH_DIRECTORY_INFO: 564da6c28aaSamw maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4 + 2 + 24; 565da6c28aaSamw break; 566da6c28aaSamw 567b89a8333Snatalie li - Sun Microsystems - Irvine United States case SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO: 568b89a8333Snatalie li - Sun Microsystems - Irvine United States maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 4 + 4 + 2 + 24 569b89a8333Snatalie li - Sun Microsystems - Irvine United States + 2 + 8; 570b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 571b89a8333Snatalie li - Sun Microsystems - Irvine United States 572da6c28aaSamw case SMB_FIND_FILE_NAMES_INFO: 573da6c28aaSamw maxdata += 4 + 4 + 4; 574da6c28aaSamw break; 575da6c28aaSamw 576da6c28aaSamw case SMB_MAC_FIND_BOTH_HFS_INFO: 577da6c28aaSamw maxdata += 4 + 4 + 8 + 8 + 8 + 8 + 8 + 8 + 8 + 4 + 1 + 1 + 2 + 578da6c28aaSamw 4 + 32 + 4 + 1 + 1 + 24 + 4; 579da6c28aaSamw break; 580da6c28aaSamw 581da6c28aaSamw default: 582da6c28aaSamw maxdata = 0; 583*7f667e74Sjose borrego smbsr_error(sr, NT_STATUS_INVALID_LEVEL, 584*7f667e74Sjose borrego ERRDOS, ERROR_INVALID_LEVEL); 585da6c28aaSamw } 586da6c28aaSamw 587da6c28aaSamw return (maxdata); 588da6c28aaSamw } 589da6c28aaSamw 590da6c28aaSamw /* 591*7f667e74Sjose borrego * smb_trans2_mbc_encode 592da6c28aaSamw * 593da6c28aaSamw * This function encodes the mbc for one directory entry. 594da6c28aaSamw * 595da6c28aaSamw * The function returns -1 when the max data requested by client 596da6c28aaSamw * is reached. If the entry is valid and successful encoded, 0 597da6c28aaSamw * will be returned; otherwise, 1 will be returned. 598b89a8333Snatalie li - Sun Microsystems - Irvine United States * 599b89a8333Snatalie li - Sun Microsystems - Irvine United States * We always null terminate the filename. The space for the null 600b89a8333Snatalie li - Sun Microsystems - Irvine United States * is included in the maxdata calculation and is therefore included 601b89a8333Snatalie li - Sun Microsystems - Irvine United States * in the next_entry_offset. namelen is the unterminated length of 602b89a8333Snatalie li - Sun Microsystems - Irvine United States * the filename. For levels except STANDARD and EA_SIZE, if the 603b89a8333Snatalie li - Sun Microsystems - Irvine United States * filename is ascii the name length returned to the client should 604b89a8333Snatalie li - Sun Microsystems - Irvine United States * include the null terminator. Otherwise the length returned to 605b89a8333Snatalie li - Sun Microsystems - Irvine United States * the client should not include the terminator. 606*7f667e74Sjose borrego * 607*7f667e74Sjose borrego * Returns: 0 - data successfully encoded 608*7f667e74Sjose borrego * 1 - client request's maxdata limit reached 609*7f667e74Sjose borrego * -1 - error 610da6c28aaSamw */ 611*7f667e74Sjose borrego static int 612*7f667e74Sjose borrego smb_trans2_find_mbc_encode(smb_request_t *sr, smb_xa_t *xa, 613*7f667e74Sjose borrego smb_fileinfo_t *fileinfo, smb_find_args_t *args) 614da6c28aaSamw { 615b89a8333Snatalie li - Sun Microsystems - Irvine United States int namelen, shortlen, buflen; 616dc20a302Sas200622 uint32_t next_entry_offset; 617*7f667e74Sjose borrego uint32_t dsize32, asize32; 618*7f667e74Sjose borrego uint32_t mb_flags = 0; 619da6c28aaSamw char buf83[26]; 620b89a8333Snatalie li - Sun Microsystems - Irvine United States char *tmpbuf; 621da6c28aaSamw smb_msgbuf_t mb; 622da6c28aaSamw 623*7f667e74Sjose borrego namelen = smb_ascii_or_unicode_strlen(sr, fileinfo->fi_name); 624b89a8333Snatalie li - Sun Microsystems - Irvine United States if (namelen == -1) 625da6c28aaSamw return (-1); 626da6c28aaSamw 627*7f667e74Sjose borrego next_entry_offset = args->fa_maxdata + namelen; 628*7f667e74Sjose borrego 629*7f667e74Sjose borrego if (MBC_ROOM_FOR(&xa->rep_data_mb, (args->fa_maxdata + namelen)) == 0) 630*7f667e74Sjose borrego return (1); 631*7f667e74Sjose borrego 632b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 633b89a8333Snatalie li - Sun Microsystems - Irvine United States * If ascii the filename length returned to the client should 634b89a8333Snatalie li - Sun Microsystems - Irvine United States * include the null terminator for levels except STANDARD and 635b89a8333Snatalie li - Sun Microsystems - Irvine United States * EASIZE. 636b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 637b89a8333Snatalie li - Sun Microsystems - Irvine United States if (!(sr->smb_flg2 & SMB_FLAGS2_UNICODE)) { 638*7f667e74Sjose borrego if ((args->fa_infolev != SMB_INFO_STANDARD) && 639*7f667e74Sjose borrego (args->fa_infolev != SMB_INFO_QUERY_EA_SIZE)) 640b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen += 1; 641b89a8333Snatalie li - Sun Microsystems - Irvine United States } 642b89a8333Snatalie li - Sun Microsystems - Irvine United States 643*7f667e74Sjose borrego mb_flags = (sr->smb_flg2 & SMB_FLAGS2_UNICODE) ? SMB_MSGBUF_UNICODE : 0; 644*7f667e74Sjose borrego dsize32 = (fileinfo->fi_size > UINT_MAX) ? 645*7f667e74Sjose borrego UINT_MAX : (uint32_t)fileinfo->fi_size; 646*7f667e74Sjose borrego asize32 = (fileinfo->fi_alloc_size > UINT_MAX) ? 647*7f667e74Sjose borrego UINT_MAX : (uint32_t)fileinfo->fi_alloc_size; 648da6c28aaSamw 649*7f667e74Sjose borrego switch (args->fa_infolev) { 650da6c28aaSamw case SMB_INFO_STANDARD: 651*7f667e74Sjose borrego if (args->fa_fflag & SMB_FIND_RETURN_RESUME_KEYS) 6523db3f65cSamw (void) smb_mbc_encodef(&xa->rep_data_mb, "l", 653*7f667e74Sjose borrego fileinfo->fi_cookie); 654da6c28aaSamw 6553db3f65cSamw (void) smb_mbc_encodef(&xa->rep_data_mb, "%yyyllwbu", sr, 656*7f667e74Sjose borrego smb_gmt2local(sr, fileinfo->fi_crtime.tv_sec), 657*7f667e74Sjose borrego smb_gmt2local(sr, fileinfo->fi_atime.tv_sec), 658*7f667e74Sjose borrego smb_gmt2local(sr, fileinfo->fi_mtime.tv_sec), 6596537f381Sas200622 dsize32, 6606537f381Sas200622 asize32, 661*7f667e74Sjose borrego fileinfo->fi_dosattr, 662b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen, 663*7f667e74Sjose borrego fileinfo->fi_name); 664da6c28aaSamw break; 665da6c28aaSamw 666da6c28aaSamw case SMB_INFO_QUERY_EA_SIZE: 667*7f667e74Sjose borrego if (args->fa_fflag & SMB_FIND_RETURN_RESUME_KEYS) 6683db3f65cSamw (void) smb_mbc_encodef(&xa->rep_data_mb, "l", 669*7f667e74Sjose borrego fileinfo->fi_cookie); 670da6c28aaSamw 671b89a8333Snatalie li - Sun Microsystems - Irvine United States /* 672b89a8333Snatalie li - Sun Microsystems - Irvine United States * Unicode filename should NOT be aligned. Encode ('u') 673b89a8333Snatalie li - Sun Microsystems - Irvine United States * into a temporary buffer, then encode buffer as a 674b89a8333Snatalie li - Sun Microsystems - Irvine United States * byte stream ('#c'). 675b89a8333Snatalie li - Sun Microsystems - Irvine United States * Regardless of whether unicode or ascii, a single 676b89a8333Snatalie li - Sun Microsystems - Irvine United States * termination byte is used. 677b89a8333Snatalie li - Sun Microsystems - Irvine United States */ 678b89a8333Snatalie li - Sun Microsystems - Irvine United States buflen = namelen + sizeof (mts_wchar_t); 679b89a8333Snatalie li - Sun Microsystems - Irvine United States tmpbuf = kmem_zalloc(buflen, KM_SLEEP); 680b89a8333Snatalie li - Sun Microsystems - Irvine United States smb_msgbuf_init(&mb, (uint8_t *)tmpbuf, buflen, mb_flags); 681*7f667e74Sjose borrego if (smb_msgbuf_encode(&mb, "u", fileinfo->fi_name) < 0) { 682b89a8333Snatalie li - Sun Microsystems - Irvine United States smb_msgbuf_term(&mb); 683b89a8333Snatalie li - Sun Microsystems - Irvine United States kmem_free(tmpbuf, buflen); 684b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 685b89a8333Snatalie li - Sun Microsystems - Irvine United States } 686b89a8333Snatalie li - Sun Microsystems - Irvine United States tmpbuf[namelen] = '\0'; 687b89a8333Snatalie li - Sun Microsystems - Irvine United States 688b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, "%yyyllwlb#c", sr, 689*7f667e74Sjose borrego smb_gmt2local(sr, fileinfo->fi_crtime.tv_sec), 690*7f667e74Sjose borrego smb_gmt2local(sr, fileinfo->fi_atime.tv_sec), 691*7f667e74Sjose borrego smb_gmt2local(sr, fileinfo->fi_mtime.tv_sec), 6926537f381Sas200622 dsize32, 6936537f381Sas200622 asize32, 694*7f667e74Sjose borrego fileinfo->fi_dosattr, 695da6c28aaSamw 0L, /* EA Size */ 696b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen, 697b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen + 1, 698b89a8333Snatalie li - Sun Microsystems - Irvine United States tmpbuf); 699b89a8333Snatalie li - Sun Microsystems - Irvine United States 700b89a8333Snatalie li - Sun Microsystems - Irvine United States smb_msgbuf_term(&mb); 701b89a8333Snatalie li - Sun Microsystems - Irvine United States kmem_free(tmpbuf, buflen); 702da6c28aaSamw break; 703da6c28aaSamw 704da6c28aaSamw case SMB_FIND_FILE_DIRECTORY_INFO: 7053db3f65cSamw (void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqllu", sr, 706dc20a302Sas200622 next_entry_offset, 707*7f667e74Sjose borrego fileinfo->fi_cookie, 708*7f667e74Sjose borrego &fileinfo->fi_crtime, 709*7f667e74Sjose borrego &fileinfo->fi_atime, 710*7f667e74Sjose borrego &fileinfo->fi_mtime, 711*7f667e74Sjose borrego &fileinfo->fi_ctime, 712*7f667e74Sjose borrego fileinfo->fi_size, 713*7f667e74Sjose borrego fileinfo->fi_alloc_size, 714*7f667e74Sjose borrego fileinfo->fi_dosattr, 715b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen, 716*7f667e74Sjose borrego fileinfo->fi_name); 717b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 718b89a8333Snatalie li - Sun Microsystems - Irvine United States 719b89a8333Snatalie li - Sun Microsystems - Irvine United States case SMB_FIND_FILE_FULL_DIRECTORY_INFO: 720b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqlllu", sr, 721b89a8333Snatalie li - Sun Microsystems - Irvine United States next_entry_offset, 722*7f667e74Sjose borrego fileinfo->fi_cookie, 723*7f667e74Sjose borrego &fileinfo->fi_crtime, 724*7f667e74Sjose borrego &fileinfo->fi_atime, 725*7f667e74Sjose borrego &fileinfo->fi_mtime, 726*7f667e74Sjose borrego &fileinfo->fi_ctime, 727*7f667e74Sjose borrego fileinfo->fi_size, 728*7f667e74Sjose borrego fileinfo->fi_alloc_size, 729*7f667e74Sjose borrego fileinfo->fi_dosattr, 730b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen, 731b89a8333Snatalie li - Sun Microsystems - Irvine United States 0L, 732*7f667e74Sjose borrego fileinfo->fi_name); 733b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 734b89a8333Snatalie li - Sun Microsystems - Irvine United States 735b89a8333Snatalie li - Sun Microsystems - Irvine United States case SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO: 736b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqlll4.qu", sr, 737b89a8333Snatalie li - Sun Microsystems - Irvine United States next_entry_offset, 738*7f667e74Sjose borrego fileinfo->fi_cookie, 739*7f667e74Sjose borrego &fileinfo->fi_crtime, 740*7f667e74Sjose borrego &fileinfo->fi_atime, 741*7f667e74Sjose borrego &fileinfo->fi_mtime, 742*7f667e74Sjose borrego &fileinfo->fi_ctime, 743*7f667e74Sjose borrego fileinfo->fi_size, 744*7f667e74Sjose borrego fileinfo->fi_alloc_size, 745*7f667e74Sjose borrego fileinfo->fi_dosattr, 746b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen, 747b89a8333Snatalie li - Sun Microsystems - Irvine United States 0L, 748*7f667e74Sjose borrego fileinfo->fi_nodeid, 749*7f667e74Sjose borrego fileinfo->fi_name); 750da6c28aaSamw break; 751da6c28aaSamw 752da6c28aaSamw case SMB_FIND_FILE_BOTH_DIRECTORY_INFO: 753da6c28aaSamw bzero(buf83, sizeof (buf83)); 754dc20a302Sas200622 smb_msgbuf_init(&mb, (uint8_t *)buf83, sizeof (buf83), 755da6c28aaSamw mb_flags); 756*7f667e74Sjose borrego if (smb_msgbuf_encode(&mb, "U", fileinfo->fi_shortname) < 0) { 757da6c28aaSamw smb_msgbuf_term(&mb); 758da6c28aaSamw return (-1); 759da6c28aaSamw } 760*7f667e74Sjose borrego shortlen = mts_wcequiv_strlen(fileinfo->fi_shortname); 761da6c28aaSamw 7623db3f65cSamw (void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqlllb.24cu", 763dc20a302Sas200622 sr, 764dc20a302Sas200622 next_entry_offset, 765*7f667e74Sjose borrego fileinfo->fi_cookie, 766*7f667e74Sjose borrego &fileinfo->fi_crtime, 767*7f667e74Sjose borrego &fileinfo->fi_atime, 768*7f667e74Sjose borrego &fileinfo->fi_mtime, 769*7f667e74Sjose borrego &fileinfo->fi_ctime, 770*7f667e74Sjose borrego fileinfo->fi_size, 771*7f667e74Sjose borrego fileinfo->fi_alloc_size, 772*7f667e74Sjose borrego fileinfo->fi_dosattr, 773b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen, 774da6c28aaSamw 0L, 775dc20a302Sas200622 shortlen, 776da6c28aaSamw buf83, 777*7f667e74Sjose borrego fileinfo->fi_name); 778da6c28aaSamw 779da6c28aaSamw smb_msgbuf_term(&mb); 780da6c28aaSamw break; 781da6c28aaSamw 782b89a8333Snatalie li - Sun Microsystems - Irvine United States case SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO: 783b89a8333Snatalie li - Sun Microsystems - Irvine United States bzero(buf83, sizeof (buf83)); 784b89a8333Snatalie li - Sun Microsystems - Irvine United States smb_msgbuf_init(&mb, (uint8_t *)buf83, sizeof (buf83), 785b89a8333Snatalie li - Sun Microsystems - Irvine United States mb_flags); 786*7f667e74Sjose borrego if (smb_msgbuf_encode(&mb, "u", fileinfo->fi_shortname) < 0) { 787b89a8333Snatalie li - Sun Microsystems - Irvine United States smb_msgbuf_term(&mb); 788b89a8333Snatalie li - Sun Microsystems - Irvine United States return (-1); 789b89a8333Snatalie li - Sun Microsystems - Irvine United States } 790*7f667e74Sjose borrego shortlen = smb_ascii_or_unicode_strlen(sr, 791*7f667e74Sjose borrego fileinfo->fi_shortname); 792b89a8333Snatalie li - Sun Microsystems - Irvine United States 793b89a8333Snatalie li - Sun Microsystems - Irvine United States (void) smb_mbc_encodef(&xa->rep_data_mb, 794b89a8333Snatalie li - Sun Microsystems - Irvine United States "%llTTTTqqlllb.24c2.qu", 795b89a8333Snatalie li - Sun Microsystems - Irvine United States sr, 796b89a8333Snatalie li - Sun Microsystems - Irvine United States next_entry_offset, 797*7f667e74Sjose borrego fileinfo->fi_cookie, 798*7f667e74Sjose borrego &fileinfo->fi_crtime, 799*7f667e74Sjose borrego &fileinfo->fi_atime, 800*7f667e74Sjose borrego &fileinfo->fi_mtime, 801*7f667e74Sjose borrego &fileinfo->fi_ctime, 802*7f667e74Sjose borrego fileinfo->fi_size, 803*7f667e74Sjose borrego fileinfo->fi_alloc_size, 804*7f667e74Sjose borrego fileinfo->fi_dosattr, 805b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen, 806b89a8333Snatalie li - Sun Microsystems - Irvine United States 0L, 807b89a8333Snatalie li - Sun Microsystems - Irvine United States shortlen, 808b89a8333Snatalie li - Sun Microsystems - Irvine United States buf83, 809*7f667e74Sjose borrego fileinfo->fi_nodeid, 810*7f667e74Sjose borrego fileinfo->fi_name); 811b89a8333Snatalie li - Sun Microsystems - Irvine United States 812b89a8333Snatalie li - Sun Microsystems - Irvine United States smb_msgbuf_term(&mb); 813b89a8333Snatalie li - Sun Microsystems - Irvine United States break; 814b89a8333Snatalie li - Sun Microsystems - Irvine United States 815da6c28aaSamw case SMB_FIND_FILE_NAMES_INFO: 8163db3f65cSamw (void) smb_mbc_encodef(&xa->rep_data_mb, "%lllu", sr, 817dc20a302Sas200622 next_entry_offset, 818*7f667e74Sjose borrego fileinfo->fi_cookie, 819b89a8333Snatalie li - Sun Microsystems - Irvine United States namelen, 820*7f667e74Sjose borrego fileinfo->fi_name); 821da6c28aaSamw break; 822da6c28aaSamw } 823da6c28aaSamw 824da6c28aaSamw return (0); 825da6c28aaSamw } 826da6c28aaSamw 827da6c28aaSamw /* 828da6c28aaSamw * Close a search started by a Trans2FindFirst2 request. 829da6c28aaSamw */ 8307b59d02dSjb150015 smb_sdrc_t 831faa1795aSjb150015 smb_pre_find_close2(smb_request_t *sr) 832faa1795aSjb150015 { 833faa1795aSjb150015 DTRACE_SMB_1(op__FindClose2__start, smb_request_t *, sr); 834*7f667e74Sjose borrego return (SDRC_SUCCESS); 835faa1795aSjb150015 } 836faa1795aSjb150015 837faa1795aSjb150015 void 838faa1795aSjb150015 smb_post_find_close2(smb_request_t *sr) 839faa1795aSjb150015 { 840faa1795aSjb150015 DTRACE_SMB_1(op__FindClose2__done, smb_request_t *, sr); 841faa1795aSjb150015 } 842faa1795aSjb150015 843faa1795aSjb150015 smb_sdrc_t 844dc20a302Sas200622 smb_com_find_close2(smb_request_t *sr) 845da6c28aaSamw { 846*7f667e74Sjose borrego uint16_t odid; 847*7f667e74Sjose borrego smb_odir_t *od; 848*7f667e74Sjose borrego 849*7f667e74Sjose borrego if (smbsr_decode_vwv(sr, "w", &odid) != 0) 850*7f667e74Sjose borrego return (SDRC_ERROR); 851*7f667e74Sjose borrego 852*7f667e74Sjose borrego od = smb_tree_lookup_odir(sr->tid_tree, odid); 853*7f667e74Sjose borrego if (od == NULL) { 854*7f667e74Sjose borrego smbsr_error(sr, NT_STATUS_INVALID_HANDLE, 855*7f667e74Sjose borrego ERRDOS, ERROR_INVALID_HANDLE); 856faa1795aSjb150015 return (SDRC_ERROR); 857da6c28aaSamw } 858da6c28aaSamw 859*7f667e74Sjose borrego smb_odir_close(od); 860*7f667e74Sjose borrego smb_odir_release(od); 8617b59d02dSjb150015 8627b59d02dSjb150015 if (smbsr_encode_empty_result(sr)) 863faa1795aSjb150015 return (SDRC_ERROR); 8647b59d02dSjb150015 865faa1795aSjb150015 return (SDRC_SUCCESS); 866da6c28aaSamw } 867