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 /* 22cb174861Sjoyce mcintosh * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 23*a90cf9f2SGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 24da6c28aaSamw */ 25da6c28aaSamw 26bbf6f00cSJordan Brown #include <smbsrv/smb_kproto.h> 27da6c28aaSamw 28da6c28aaSamw #define SMB_CREATE_NAMEBUF_SZ 16 29da6c28aaSamw 30da6c28aaSamw /* 31da6c28aaSamw * Create a new file, or truncate an existing file to zero length, 32da6c28aaSamw * open the file and return a fid. The file is specified using a 33da6c28aaSamw * fully qualified name relative to the tree. 34da6c28aaSamw */ 357b59d02dSjb150015 smb_sdrc_t 36faa1795aSjb150015 smb_pre_create(smb_request_t *sr) 37da6c28aaSamw { 38da6c28aaSamw struct open_param *op = &sr->arg.open; 39faa1795aSjb150015 int rc; 40da6c28aaSamw 41da6c28aaSamw bzero(op, sizeof (sr->arg.open)); 42da6c28aaSamw 432c1b14e5Sjose borrego rc = smbsr_decode_vwv(sr, "wl", &op->dattr, &op->mtime.tv_sec); 44faa1795aSjb150015 if (rc == 0) 45eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path); 46da6c28aaSamw 47da6c28aaSamw op->create_disposition = FILE_OVERWRITE_IF; 482c1b14e5Sjose borrego op->create_options = FILE_NON_DIRECTORY_FILE; 49da6c28aaSamw 50faa1795aSjb150015 DTRACE_SMB_2(op__Create__start, smb_request_t *, sr, 51faa1795aSjb150015 struct open_param *, op); 52faa1795aSjb150015 53faa1795aSjb150015 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 54faa1795aSjb150015 } 55faa1795aSjb150015 56faa1795aSjb150015 void 57faa1795aSjb150015 smb_post_create(smb_request_t *sr) 58faa1795aSjb150015 { 59faa1795aSjb150015 DTRACE_SMB_1(op__Create__done, smb_request_t *, sr); 60faa1795aSjb150015 } 61faa1795aSjb150015 62faa1795aSjb150015 smb_sdrc_t 63faa1795aSjb150015 smb_com_create(smb_request_t *sr) 64faa1795aSjb150015 { 657b59d02dSjb150015 if (smb_common_create(sr) != NT_STATUS_SUCCESS) 66faa1795aSjb150015 return (SDRC_ERROR); 67da6c28aaSamw 687b59d02dSjb150015 if (smbsr_encode_result(sr, 1, 0, "bww", 1, sr->smb_fid, 0)) 69faa1795aSjb150015 return (SDRC_ERROR); 70da6c28aaSamw 71faa1795aSjb150015 return (SDRC_SUCCESS); 72da6c28aaSamw } 73da6c28aaSamw 74da6c28aaSamw /* 75da6c28aaSamw * Create a new file and return a fid. The file is specified using 76da6c28aaSamw * a fully qualified name relative to the tree. 77da6c28aaSamw */ 787b59d02dSjb150015 smb_sdrc_t 79faa1795aSjb150015 smb_pre_create_new(smb_request_t *sr) 80da6c28aaSamw { 81da6c28aaSamw struct open_param *op = &sr->arg.open; 82faa1795aSjb150015 int rc; 83da6c28aaSamw 84da6c28aaSamw bzero(op, sizeof (sr->arg.open)); 85da6c28aaSamw 862c1b14e5Sjose borrego rc = smbsr_decode_vwv(sr, "wl", &op->dattr, &op->mtime.tv_sec); 87faa1795aSjb150015 if (rc == 0) 88eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path); 89da6c28aaSamw 90da6c28aaSamw op->create_disposition = FILE_CREATE; 91da6c28aaSamw 92faa1795aSjb150015 DTRACE_SMB_2(op__CreateNew__start, smb_request_t *, sr, 93faa1795aSjb150015 struct open_param *, op); 94da6c28aaSamw 95faa1795aSjb150015 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 96da6c28aaSamw } 97da6c28aaSamw 98faa1795aSjb150015 void 99faa1795aSjb150015 smb_post_create_new(smb_request_t *sr) 100faa1795aSjb150015 { 101faa1795aSjb150015 DTRACE_SMB_1(op__CreateNew__done, smb_request_t *, sr); 102faa1795aSjb150015 } 103faa1795aSjb150015 104faa1795aSjb150015 smb_sdrc_t 105faa1795aSjb150015 smb_com_create_new(smb_request_t *sr) 106faa1795aSjb150015 { 107faa1795aSjb150015 if (smb_common_create(sr) != NT_STATUS_SUCCESS) 108faa1795aSjb150015 return (SDRC_ERROR); 109faa1795aSjb150015 110faa1795aSjb150015 if (smbsr_encode_result(sr, 1, 0, "bww", 1, sr->smb_fid, 0)) 111faa1795aSjb150015 return (SDRC_ERROR); 112faa1795aSjb150015 113faa1795aSjb150015 return (SDRC_SUCCESS); 114faa1795aSjb150015 } 115da6c28aaSamw 116da6c28aaSamw /* 117da6c28aaSamw * Create a unique file in the specified directory relative to the 118da6c28aaSamw * current tree. No attributes are specified. 119da6c28aaSamw */ 1207b59d02dSjb150015 smb_sdrc_t 121faa1795aSjb150015 smb_pre_create_temporary(smb_request_t *sr) 122faa1795aSjb150015 { 123faa1795aSjb150015 struct open_param *op = &sr->arg.open; 124faa1795aSjb150015 uint16_t reserved; 125faa1795aSjb150015 int rc; 126faa1795aSjb150015 127faa1795aSjb150015 bzero(op, sizeof (sr->arg.open)); 128faa1795aSjb150015 1292c1b14e5Sjose borrego rc = smbsr_decode_vwv(sr, "wl", &reserved, &op->mtime.tv_sec); 130faa1795aSjb150015 if (rc == 0) 131eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States rc = smbsr_decode_data(sr, "%S", sr, &op->fqi.fq_path.pn_path); 132faa1795aSjb150015 133faa1795aSjb150015 op->create_disposition = FILE_CREATE; 134faa1795aSjb150015 135faa1795aSjb150015 DTRACE_SMB_2(op__CreateTemporary__start, smb_request_t *, sr, 136faa1795aSjb150015 struct open_param *, op); 137faa1795aSjb150015 138faa1795aSjb150015 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR); 139faa1795aSjb150015 } 140faa1795aSjb150015 141faa1795aSjb150015 void 142faa1795aSjb150015 smb_post_create_temporary(smb_request_t *sr) 143faa1795aSjb150015 { 144faa1795aSjb150015 DTRACE_SMB_1(op__CreateTemporary__done, smb_request_t *, sr); 145faa1795aSjb150015 } 146faa1795aSjb150015 147faa1795aSjb150015 smb_sdrc_t 148faa1795aSjb150015 smb_com_create_temporary(smb_request_t *sr) 149da6c28aaSamw { 150da6c28aaSamw static uint16_t tmp_id = 10000; 151da6c28aaSamw struct open_param *op = &sr->arg.open; 152da6c28aaSamw char name[SMB_CREATE_NAMEBUF_SZ]; 153da6c28aaSamw char *buf; 154da6c28aaSamw uint16_t bcc; 155da6c28aaSamw 156da6c28aaSamw ++tmp_id; 157da6c28aaSamw bcc = 1; /* null terminator */ 158da6c28aaSamw bcc += snprintf(name, SMB_CREATE_NAMEBUF_SZ, "tt%05d.tmp", tmp_id); 159da6c28aaSamw 1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States buf = smb_srm_zalloc(sr, MAXPATHLEN); 161eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States (void) snprintf(buf, MAXPATHLEN, "%s\\%s", 162eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States op->fqi.fq_path.pn_path, name); 163eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States op->fqi.fq_path.pn_path = buf; 164da6c28aaSamw 1657b59d02dSjb150015 if (smb_common_create(sr) != NT_STATUS_SUCCESS) 166faa1795aSjb150015 return (SDRC_ERROR); 167da6c28aaSamw 168faa1795aSjb150015 if (smbsr_encode_result(sr, 1, VAR_BCC, "bww%S", 1, sr->smb_fid, 169faa1795aSjb150015 VAR_BCC, sr, name)) 170faa1795aSjb150015 return (SDRC_ERROR); 171da6c28aaSamw 172faa1795aSjb150015 return (SDRC_SUCCESS); 173da6c28aaSamw } 174da6c28aaSamw 175da6c28aaSamw /* 176da6c28aaSamw * Common create file function. The file is opened in compatibility 177da6c28aaSamw * mode with read/write access. 178da6c28aaSamw */ 179da6c28aaSamw uint32_t 180faa1795aSjb150015 smb_common_create(smb_request_t *sr) 181da6c28aaSamw { 182da6c28aaSamw struct open_param *op = &sr->arg.open; 183da6c28aaSamw uint32_t status; 184da6c28aaSamw 1852c1b14e5Sjose borrego if ((op->mtime.tv_sec != 0) && (op->mtime.tv_sec != UINT_MAX)) 186e3f2c991SKeyur Desai op->mtime.tv_sec = smb_time_local_to_gmt(sr, op->mtime.tv_sec); 1872c1b14e5Sjose borrego op->mtime.tv_nsec = 0; 1882c2961f8Sjose borrego op->dsize = 0; 189da6c28aaSamw op->omode = SMB_DA_ACCESS_READ_WRITE | SMB_DA_SHARE_COMPATIBILITY; 190da6c28aaSamw op->desired_access = smb_omode_to_amask(op->omode); 191eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States op->share_access = smb_denymode_to_sharemode(op->omode, 192eb1d736bSafshin salek ardakani - Sun Microsystems - Irvine United States op->fqi.fq_path.pn_path); 193da6c28aaSamw 194da6c28aaSamw if (sr->smb_flg & SMB_FLAGS_OPLOCK) { 1952c2961f8Sjose borrego if (sr->smb_flg & SMB_FLAGS_OPLOCK_NOTIFY_ANY) 1962c2961f8Sjose borrego op->op_oplock_level = SMB_OPLOCK_BATCH; 1972c2961f8Sjose borrego else 1982c2961f8Sjose borrego op->op_oplock_level = SMB_OPLOCK_EXCLUSIVE; 199da6c28aaSamw } else { 2002c2961f8Sjose borrego op->op_oplock_level = SMB_OPLOCK_NONE; 201da6c28aaSamw } 202cb174861Sjoyce mcintosh op->op_oplock_levelII = B_FALSE; 203da6c28aaSamw 2047b59d02dSjb150015 status = smb_common_open(sr); 205da6c28aaSamw 2062c2961f8Sjose borrego if (op->op_oplock_level == SMB_OPLOCK_NONE) { 207da6c28aaSamw sr->smb_flg &= 208da6c28aaSamw ~(SMB_FLAGS_OPLOCK | SMB_FLAGS_OPLOCK_NOTIFY_ANY); 209da6c28aaSamw } 210da6c28aaSamw 211*a90cf9f2SGordon Ross if (status) 212*a90cf9f2SGordon Ross smbsr_status(sr, status, 0, 0); 213*a90cf9f2SGordon Ross 214da6c28aaSamw return (status); 215da6c28aaSamw } 216