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