smb_directory.c revision bbf6f00c25b6a2bed23c35eac6d62998ecdb338c
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * CDDL HEADER START
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * The contents of this file are subject to the terms of the
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Common Development and Distribution License (the "License").
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * You may not use this file except in compliance with the License.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * See the License for the specific language governing permissions
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * and limitations under the License.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * When distributing Covered Code, include this CDDL HEADER in each
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * If applicable, add the following below this CDDL HEADER, with the
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * fields enclosed by brackets "[]" replaced with your own identifying
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * information: Portions Copyright [yyyy] [name of copyright owner]
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * CDDL HEADER END
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Use is subject to license terms.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothiertypedef struct smb_dirpath {
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier char *sp_curp; /* Current pointer into the original path */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smb_request_t *sp_sr; /* Current request pointer */
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic smb_dirpath_t *smb_dirpath_new(smb_request_t *);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothierstatic boolean_t smb_dirpath_isvalid(const char *);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * The create directory message is sent to create a new directory. The
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * appropriate Tid and additional pathname are passed. The directory must
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * not exist for it to be created.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Client Request Description
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * ================================== =================================
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * UCHAR WordCount; Count of parameter words = 0
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * USHORT ByteCount; Count of data bytes; min = 2
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * UCHAR BufferFormat; 0x04
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * STRING DirectoryName[]; Directory name
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Servers require clients to have at least create permission for the
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * subtree containing the directory in order to create a new directory.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * The creator's access rights to the new directory are be determined by
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * local policy on the server.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Server Response Description
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * ================================== =================================
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * UCHAR WordCount; Count of parameter words = 0
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * USHORT ByteCount; Count of data bytes = 0
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier DTRACE_SMB_2(op__CreateDirectory__start, smb_request_t *, sr,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier DTRACE_SMB_1(op__CreateDirectory__done, smb_request_t *, sr);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * smb_com_create_directory
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * It is possible to get a full pathname here and the client expects any
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * or all of the components to be created if they don't already exist.
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbsr_error(sr, NT_STATUS_OBJECT_PATH_SYNTAX_BAD,
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier smbsr_error(sr, status, ERRDOS, ERROR_INVALID_NAME);
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * Try each component of the path. EEXIST on path
074bb90d80fdbeb2d04a8450a55ecbc96de28785Tom Pothier * components is okay except on the last one.
switch (rc) {
case EEXIST:
case ENOENT:
return (SDRC_ERROR);
case ENOTDIR:
return (SDRC_ERROR);
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
char *name;
return (NT_STATUS_NOT_A_DIRECTORY);
return (NT_STATUS_SUCCESS);
int rc;
if (rc != 0)
return (rc);
if (rc == 0) {
return (EEXIST);
return (rc);
return (EACCES);
if (rc != 0) {
return (rc);
static smb_dirpath_t *
int pathLen;
char *xpath;
return (spp);
char *xp;
int xlen;
if (spp == 0)
int rc;
int rc;
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
return (SDRC_ERROR);
!= NT_STATUS_SUCCESS)) {
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
int rc;
int rc;
char *path;
return (SDRC_ERROR);
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
return (SDRC_ERROR);
if (rc != 0) {
return (SDRC_ERROR);
static boolean_t
char *name;
int len;
char *cp;
return (B_TRUE);
return (B_FALSE);
return (B_TRUE);