root/usr/src/uts/common/fs/smbsrv/smb_trans2_create_directory.c
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * SMB: trans2_create_directory
 *
 * This requests the server to create a directory relative to Tid in the
 * SMB header, optionally assigning extended attributes to it.
 *
 *  Client Request             Value
 *  ========================== =========================================
 *
 *  WordCount                  15
 *  MaxSetupCount              0
 *  SetupCount                 1
 *  Setup[0]                   TRANS2_CREATE_DIRECTORY
 *
 *  Parameter Block Encoding   Description
 *  ========================== =========================================
 *
 *  ULONG Reserved;            Reserved--must be zero
 *  STRING Name[];             Directory name to create
 *  UCHAR Data[];              Optional FEAList for the new directory
 *
 *  Response Parameter Block   Description
 *  ========================== =========================================
 *
 *  USHORT EaErrorOffset       Offset into FEAList of first error which
 *                             occurred while setting EAs
 */

#include <smbsrv/smb_kproto.h>


/*
 * smb_com_trans2_create_directory
 */
smb_sdrc_t
smb_com_trans2_create_directory(struct smb_request *sr, struct smb_xa *xa)
{
        int     rc;
        smb_pathname_t *pn = &sr->arg.dirop.fqi.fq_path;

        if (!STYPE_ISDSK(sr->tid_tree->t_res_type)) {
                smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
                    ERRDOS, ERROR_ACCESS_DENIED);
                return (SDRC_ERROR);
        }

        if (smb_mbc_decodef(&xa->req_param_mb, "%4.u", sr, &pn->pn_path) != 0)
                return (SDRC_ERROR);

        smb_pathname_init(sr, pn, pn->pn_path);
        if (!smb_pathname_validate(sr, pn) ||
            !smb_validate_dirname(sr, pn)) {
                return (SDRC_ERROR);
        }

        if ((rc = smb_common_create_directory(sr)) != 0) {
                smbsr_errno(sr, rc);
                return (SDRC_ERROR);
        }

        if (smb_mbc_encodef(&xa->rep_param_mb, "w", 0) < 0)
                return (SDRC_ERROR);

        return (SDRC_SUCCESS);
}