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 /* 222c2961f8Sjose borrego * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23da6c28aaSamw * Use is subject to license terms. 24da6c28aaSamw */ 25da6c28aaSamw 26da6c28aaSamw #include <smbsrv/smb_incl.h> 27da6c28aaSamw 28da6c28aaSamw #define SMB_CREATE_NAMEBUF_SZ 16 29da6c28aaSamw 30faa1795aSjb150015 static uint32_t smb_common_create(smb_request_t *sr); 31da6c28aaSamw 32da6c28aaSamw /* 33da6c28aaSamw * Create a new file, or truncate an existing file to zero length, 34da6c28aaSamw * open the file and return a fid. The file is specified using a 35da6c28aaSamw * fully qualified name relative to the tree. 36da6c28aaSamw */ 377b59d02dSjb150015 smb_sdrc_t 38faa1795aSjb150015 smb_pre_create(smb_request_t *sr) 39da6c28aaSamw { 40da6c28aaSamw struct open_param *op = &sr->arg.open; 41faa1795aSjb150015 int rc; 42da6c28aaSamw 43da6c28aaSamw bzero(op, sizeof (sr->arg.open)); 44da6c28aaSamw 452c1b14e5Sjose borrego rc = smbsr_decode_vwv(sr, "wl", &op->dattr, &op->mtime.tv_sec); 46faa1795aSjb150015 if (rc == 0) 47eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path); 48da6c28aaSamw 49da6c28aaSamw op->create_disposition = FILE_OVERWRITE_IF; 502c1b14e5Sjose borrego op->create_options = FILE_NON_DIRECTORY_FILE; 51da6c28aaSamw 52faa1795aSjb150015 DTRACE_SMB_2(op__Create__start, smb_request_t *, sr, 53faa1795aSjb150015 struct open_param *, op); 54faa1795aSjb150015 55faa1795aSjb150015 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 56faa1795aSjb150015 } 57faa1795aSjb150015 58faa1795aSjb150015 void 59faa1795aSjb150015 smb_post_create(smb_request_t *sr) 60faa1795aSjb150015 { 61faa1795aSjb150015 DTRACE_SMB_1(op__Create__done, smb_request_t *, sr); 62faa1795aSjb150015 } 63faa1795aSjb150015 64faa1795aSjb150015 smb_sdrc_t 65faa1795aSjb150015 smb_com_create(smb_request_t *sr) 66faa1795aSjb150015 { 677b59d02dSjb150015 if (smb_common_create(sr) != NT_STATUS_SUCCESS) 68faa1795aSjb150015 return (SDRC_ERROR); 69da6c28aaSamw 707b59d02dSjb150015 if (smbsr_encode_result(sr, 1, 0, "bww", 1, sr->smb_fid, 0)) 71faa1795aSjb150015 return (SDRC_ERROR); 72da6c28aaSamw 73faa1795aSjb150015 return (SDRC_SUCCESS); 74da6c28aaSamw } 75da6c28aaSamw 76da6c28aaSamw /* 77da6c28aaSamw * Create a new file and return a fid. The file is specified using 78da6c28aaSamw * a fully qualified name relative to the tree. 79da6c28aaSamw */ 807b59d02dSjb150015 smb_sdrc_t 81faa1795aSjb150015 smb_pre_create_new(smb_request_t *sr) 82da6c28aaSamw { 83da6c28aaSamw struct open_param *op = &sr->arg.open; 84faa1795aSjb150015 int rc; 85da6c28aaSamw 86da6c28aaSamw bzero(op, sizeof (sr->arg.open)); 87da6c28aaSamw 882c1b14e5Sjose borrego rc = smbsr_decode_vwv(sr, "wl", &op->dattr, &op->mtime.tv_sec); 89faa1795aSjb150015 if (rc == 0) 90eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path); 91da6c28aaSamw 92da6c28aaSamw op->create_disposition = FILE_CREATE; 93da6c28aaSamw 94faa1795aSjb150015 DTRACE_SMB_2(op__CreateNew__start, smb_request_t *, sr, 95faa1795aSjb150015 struct open_param *, op); 96da6c28aaSamw 97faa1795aSjb150015 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 98da6c28aaSamw } 99da6c28aaSamw 100faa1795aSjb150015 void 101faa1795aSjb150015 smb_post_create_new(smb_request_t *sr) 102faa1795aSjb150015 { 103faa1795aSjb150015 DTRACE_SMB_1(op__CreateNew__done, smb_request_t *, sr); 104faa1795aSjb150015 } 105faa1795aSjb150015 106faa1795aSjb150015 smb_sdrc_t 107faa1795aSjb150015 smb_com_create_new(smb_request_t *sr) 108faa1795aSjb150015 { 109faa1795aSjb150015 if (smb_common_create(sr) != NT_STATUS_SUCCESS) 110faa1795aSjb150015 return (SDRC_ERROR); 111faa1795aSjb150015 112faa1795aSjb150015 if (smbsr_encode_result(sr, 1, 0, "bww", 1, sr->smb_fid, 0)) 113faa1795aSjb150015 return (SDRC_ERROR); 114faa1795aSjb150015 115faa1795aSjb150015 return (SDRC_SUCCESS); 116faa1795aSjb150015 } 117da6c28aaSamw 118da6c28aaSamw /* 119da6c28aaSamw * Create a unique file in the specified directory relative to the 120da6c28aaSamw * current tree. No attributes are specified. 121da6c28aaSamw */ 1227b59d02dSjb150015 smb_sdrc_t 123faa1795aSjb150015 smb_pre_create_temporary(smb_request_t *sr) 124faa1795aSjb150015 { 125faa1795aSjb150015 struct open_param *op = &sr->arg.open; 126faa1795aSjb150015 uint16_t reserved; 127faa1795aSjb150015 int rc; 128faa1795aSjb150015 129faa1795aSjb150015 bzero(op, sizeof (sr->arg.open)); 130faa1795aSjb150015 1312c1b14e5Sjose borrego rc = smbsr_decode_vwv(sr, "wl", &reserved, &op->mtime.tv_sec); 132faa1795aSjb150015 if (rc == 0) 133eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path); 134faa1795aSjb150015 135faa1795aSjb150015 op->create_disposition = FILE_CREATE; 136faa1795aSjb150015 137faa1795aSjb150015 DTRACE_SMB_2(op__CreateTemporary__start, smb_request_t *, sr, 138faa1795aSjb150015 struct open_param *, op); 139faa1795aSjb150015 140faa1795aSjb150015 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 141faa1795aSjb150015 } 142faa1795aSjb150015 143faa1795aSjb150015 void 144faa1795aSjb150015 smb_post_create_temporary(smb_request_t *sr) 145faa1795aSjb150015 { 146faa1795aSjb150015 DTRACE_SMB_1(op__CreateTemporary__done, smb_request_t *, sr); 147faa1795aSjb150015 } 148faa1795aSjb150015 149faa1795aSjb150015 smb_sdrc_t 150faa1795aSjb150015 smb_com_create_temporary(smb_request_t *sr) 151da6c28aaSamw { 152da6c28aaSamw static uint16_t tmp_id = 10000; 153da6c28aaSamw struct open_param *op = &sr->arg.open; 154da6c28aaSamw char name[SMB_CREATE_NAMEBUF_SZ]; 155da6c28aaSamw char *buf; 156da6c28aaSamw uint16_t bcc; 157da6c28aaSamw 158da6c28aaSamw ++tmp_id; 159da6c28aaSamw bcc = 1; /* null terminator */ 160da6c28aaSamw bcc += snprintf(name, SMB_CREATE_NAMEBUF_SZ, "tt%05d.tmp", tmp_id); 161da6c28aaSamw 162da6c28aaSamw buf = smbsr_malloc(&sr->request_storage, MAXPATHLEN); 163eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(buf, MAXPATHLEN, "%s\\%s", 164eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States op->fqi.fq_path.pn_path, name); 165eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States op->fqi.fq_path.pn_path = buf; 166da6c28aaSamw 1677b59d02dSjb150015 if (smb_common_create(sr) != NT_STATUS_SUCCESS) 168faa1795aSjb150015 return (SDRC_ERROR); 169da6c28aaSamw 170faa1795aSjb150015 if (smbsr_encode_result(sr, 1, VAR_BCC, "bww%S", 1, sr->smb_fid, 171faa1795aSjb150015 VAR_BCC, sr, name)) 172faa1795aSjb150015 return (SDRC_ERROR); 173da6c28aaSamw 174faa1795aSjb150015 return (SDRC_SUCCESS); 175da6c28aaSamw } 176da6c28aaSamw 177da6c28aaSamw /* 178da6c28aaSamw * Common create file function. The file is opened in compatibility 179da6c28aaSamw * mode with read/write access. 180da6c28aaSamw */ 181da6c28aaSamw uint32_t 182faa1795aSjb150015 smb_common_create(smb_request_t *sr) 183da6c28aaSamw { 184da6c28aaSamw struct open_param *op = &sr->arg.open; 185da6c28aaSamw uint32_t status; 186da6c28aaSamw 1872c1b14e5Sjose borrego if ((op->mtime.tv_sec != 0) && (op->mtime.tv_sec != UINT_MAX)) 188*e3f2c991SKeyur Desai op->mtime.tv_sec = smb_time_local_to_gmt(sr, op->mtime.tv_sec); 1892c1b14e5Sjose borrego op->mtime.tv_nsec = 0; 1902c2961f8Sjose borrego op->dsize = 0; 191da6c28aaSamw op->omode = SMB_DA_ACCESS_READ_WRITE | SMB_DA_SHARE_COMPATIBILITY; 192da6c28aaSamw op->desired_access = smb_omode_to_amask(op->omode); 193eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States op->share_access = smb_denymode_to_sharemode(op->omode, 194eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States op->fqi.fq_path.pn_path); 195da6c28aaSamw 196da6c28aaSamw if (sr->smb_flg & SMB_FLAGS_OPLOCK) { 1972c2961f8Sjose borrego if (sr->smb_flg & SMB_FLAGS_OPLOCK_NOTIFY_ANY) 1982c2961f8Sjose borrego op->op_oplock_level = SMB_OPLOCK_BATCH; 1992c2961f8Sjose borrego else 2002c2961f8Sjose borrego op->op_oplock_level = SMB_OPLOCK_EXCLUSIVE; 201da6c28aaSamw } else { 2022c2961f8Sjose borrego op->op_oplock_level = SMB_OPLOCK_NONE; 203da6c28aaSamw } 204da6c28aaSamw 2057b59d02dSjb150015 status = smb_common_open(sr); 206da6c28aaSamw 2072c2961f8Sjose borrego if (op->op_oplock_level == SMB_OPLOCK_NONE) { 208da6c28aaSamw sr->smb_flg &= 209da6c28aaSamw ~(SMB_FLAGS_OPLOCK | SMB_FLAGS_OPLOCK_NOTIFY_ANY); 210da6c28aaSamw } 211da6c28aaSamw 212da6c28aaSamw return (status); 213da6c28aaSamw } 214