[SCM] Samba Shared Repository - branch v3-2-test updated - initial-v3-2-unstable-490-g51db8d0

Volker Lendecke vl at sernet.de
Wed Dec 5 12:42:51 GMT 2007


The branch, v3-2-test has been updated
       via  51db8d09a4652d626c093f7bacf075c1c168fc33 (commit)
       via  ca3add2d65a242029f08482f3b82ea56b7059538 (commit)
       via  c268be54ee3bdd59980a6217a0e8e59dd3ec5ce2 (commit)
       via  9ef81cb14952cad96c71409c04a2cc6579e3311c (commit)
       via  f5cdaacd1784d3801d638fa9984b52c57dad6ebd (commit)
       via  77b31ef44a9f7c1c9b80d90653a49affee8e0372 (commit)
       via  8cd27e4a7a1a2df0ff686ebe0b1a779511effd27 (commit)
       via  956aae7a57364debf724a7ef0bd0074119a24d24 (commit)
       via  f3421c3b86aece4f8303e864c5df97485db77f88 (commit)
       via  5a9d147e41b260cb620f026291786eeb95ebc64f (commit)
       via  719941605333a453c4219aed45780862c94a5c7c (commit)
       via  5bf4647dea71305d9a92875a751b24c8a2e4a916 (commit)
       via  753e640f49125c319d7b8f2db262e273a1727691 (commit)
       via  fb900184feeda37691cf9bd57c029988648de9f8 (commit)
       via  f6d62226a33cdff41ad7881996d856b7130ef15c (commit)
       via  a855808f4851a800055bfee5df39ca72057e55f9 (commit)
       via  481e35eba8e130041848887ec5fb6212e331eb14 (commit)
       via  4b1f0d1d93d1e7bd0b4fa641d4e9629af8234d71 (commit)
       via  4a2d502903934f4c3dc6b31595fe77a2013dbc21 (commit)
       via  b79b16d637d41a356c036c6aac932e4504d2d7b0 (commit)
       via  7f15a9f5a281052d2bed13a622b2fc9a24c62096 (commit)
      from  3b057022a570a1fb68e03c477a6989e7d1e7cef2 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit 51db8d09a4652d626c093f7bacf075c1c168fc33
Author: Volker Lendecke <vl at sernet.de>
Date:   Sun Dec 2 15:35:22 2007 +0100

    Move create_file to open.c
    
    I'm checking in this long sequence of micro-checkins for review, the overall
    patch from 3b057022a5 to this is not too large.

commit ca3add2d65a242029f08482f3b82ea56b7059538
Author: Volker Lendecke <vl at sernet.de>
Date:   Sun Dec 2 14:55:01 2007 +0100

    Fix an uninitialized variable

commit c268be54ee3bdd59980a6217a0e8e59dd3ec5ce2
Author: Volker Lendecke <vl at sernet.de>
Date:   Sun Dec 2 14:56:57 2007 +0100

    Fix debug

commit 9ef81cb14952cad96c71409c04a2cc6579e3311c
Author: Volker Lendecke <vl at sernet.de>
Date:   Sun Dec 2 14:37:44 2007 +0100

    Fix attribute calculation for ntcreate&x

commit f5cdaacd1784d3801d638fa9984b52c57dad6ebd
Author: Volker Lendecke <vl at sernet.de>
Date:   Sun Dec 2 13:34:59 2007 +0100

    Fix error returns

commit 77b31ef44a9f7c1c9b80d90653a49affee8e0372
Author: Volker Lendecke <vl at sernet.de>
Date:   Sun Dec 2 13:34:27 2007 +0100

    Fix debugs

commit 8cd27e4a7a1a2df0ff686ebe0b1a779511effd27
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 22:36:17 2007 +0100

    Implement create_file()
    
    Rip out the cores of reply_ntcreate_and_X and call_nt_transact_create
    
    Volker

commit 956aae7a57364debf724a7ef0bd0074119a24d24
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 21:31:52 2007 +0100

    Reformatting, also allow quotas for transact_create

commit f3421c3b86aece4f8303e864c5df97485db77f88
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 20:03:47 2007 +0100

    Tiny refactorings

commit 5a9d147e41b260cb620f026291786eeb95ebc64f
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 19:16:52 2007 +0100

    Split out sd parsing

commit 719941605333a453c4219aed45780862c94a5c7c
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 19:03:25 2007 +0100

    Reformatting

commit 5bf4647dea71305d9a92875a751b24c8a2e4a916
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 15:07:58 2007 +0100

    Align formatting, one TALLOC_FREE is enough

commit 753e640f49125c319d7b8f2db262e273a1727691
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 15:05:18 2007 +0100

    Move pulling the ea list out of the way

commit fb900184feeda37691cf9bd57c029988648de9f8
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 14:57:46 2007 +0100

    Reformatting

commit f6d62226a33cdff41ad7881996d856b7130ef15c
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 14:55:56 2007 +0100

    Put posix semantic calculation in the same place in both routines

commit a855808f4851a800055bfee5df39ca72057e55f9
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 14:52:25 2007 +0100

    Tiny refactoring
    
    Reformatting, consolidate oplock calculation to the same place in both routines

commit 481e35eba8e130041848887ec5fb6212e331eb14
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 14:49:58 2007 +0100

    Tiny refactoring

commit 4b1f0d1d93d1e7bd0b4fa641d4e9629af8234d71
Author: Volker Lendecke <vl at sernet.de>
Date:   Sat Dec 1 14:38:19 2007 +0100

    TALLOC_FREE early

commit 4a2d502903934f4c3dc6b31595fe77a2013dbc21
Author: Volker Lendecke <vl at sernet.de>
Date:   Thu Nov 29 15:45:53 2007 +0100

    consolidate srvstr_get_path in ntcreate_and_X

commit b79b16d637d41a356c036c6aac932e4504d2d7b0
Author: Volker Lendecke <vl at sernet.de>
Date:   Thu Nov 29 15:38:00 2007 +0100

    Tiny refactoring

commit 7f15a9f5a281052d2bed13a622b2fc9a24c62096
Author: Volker Lendecke <vl at sernet.de>
Date:   Thu Nov 29 15:15:33 2007 +0100

    tiny refactoring

-----------------------------------------------------------------------

Summary of changes:
 source/smbd/nttrans.c |  968 +++++--------------------------------------------
 source/smbd/open.c    |  475 ++++++++++++++++++++++++
 2 files changed, 572 insertions(+), 871 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/smbd/nttrans.c b/source/smbd/nttrans.c
index 9ff1cac..8a177c8 100644
--- a/source/smbd/nttrans.c
+++ b/source/smbd/nttrans.c
@@ -278,52 +278,6 @@ bool is_ntfs_stream_name(const char *fname)
 	return (strchr_m(fname, ':') != NULL) ? True : False;
 }
 
-struct case_semantics_state {
-	connection_struct *conn;
-	bool case_sensitive;
-	bool case_preserve;
-	bool short_case_preserve;
-};
-
-/****************************************************************************
- Restore case semantics.
-****************************************************************************/
-static int restore_case_semantics(struct case_semantics_state *state)
-{
-	state->conn->case_sensitive = state->case_sensitive;
-	state->conn->case_preserve = state->case_preserve;
-	state->conn->short_case_preserve = state->short_case_preserve;
-	return 0;
-}
-
-/****************************************************************************
- Save case semantics.
-****************************************************************************/
-static struct case_semantics_state *set_posix_case_semantics(TALLOC_CTX *mem_ctx,
-							     connection_struct *conn)
-{
-	struct case_semantics_state *result;
-
-	if (!(result = talloc(mem_ctx, struct case_semantics_state))) {
-		DEBUG(0, ("talloc failed\n"));
-		return NULL;
-	}
-
-	result->conn = conn;
-	result->case_sensitive = conn->case_sensitive;
-	result->case_preserve = conn->case_preserve;
-	result->short_case_preserve = conn->short_case_preserve;
-
-	/* Set to POSIX. */
-	conn->case_sensitive = True;
-	conn->case_preserve = True;
-	conn->short_case_preserve = True;
-
-	talloc_set_destructor(result, restore_case_semantics);
-
-	return result;
-}
-
 /****************************************************************************
  Reply to an NT create and X call on a pipe
 ****************************************************************************/
@@ -453,46 +407,10 @@ static void do_ntcreate_pipe_open(connection_struct *conn,
 }
 
 /****************************************************************************
- Reply to an NT create and X call for a quota file.
-****************************************************************************/
-
-static void reply_ntcreate_and_X_quota(connection_struct *conn,
-				       struct smb_request *req,
-				       enum FAKE_FILE_TYPE fake_file_type,
-				       const char *fname)
-{
-	char *p;
-	uint32 desired_access = IVAL(req->inbuf,smb_ntcreate_DesiredAccess);
-	files_struct *fsp;
-	NTSTATUS status;
-
-	status = open_fake_file(conn, fake_file_type, fname, desired_access,
-				&fsp);
-
-	if (!NT_STATUS_IS_OK(status)) {
-		reply_nterror(req, status);
-		return;
-	}
-
-	reply_outbuf(req, 34, 0);
-
-	p = (char *)req->outbuf + smb_vwv2;
-
-	/* SCVAL(p,0,NO_OPLOCK_RETURN); */
-	p++;
-	SSVAL(p,0,fsp->fnum);
-
-	DEBUG(5,("reply_ntcreate_and_X_quota: fnum = %d, open name = %s\n", fsp->fnum, fsp->fsp_name));
-
-	chain_reply(req);
-}
-
-/****************************************************************************
  Reply to an NT create and X call.
 ****************************************************************************/
 
-void reply_ntcreate_and_X(connection_struct *conn,
-			  struct smb_request *req)
+void reply_ntcreate_and_X(connection_struct *conn, struct smb_request *req)
 {
 	char *fname = NULL;
 	uint32 flags;
@@ -515,9 +433,8 @@ void reply_ntcreate_and_X(connection_struct *conn,
 	struct timespec c_timespec;
 	struct timespec a_timespec;
 	struct timespec m_timespec;
-	bool extended_oplock_granted = False;
 	NTSTATUS status;
-	struct case_semantics_state *case_state = NULL;
+	uint8_t oplock_granted = NO_OPLOCK_RETURN;
 	TALLOC_CTX *ctx = talloc_tos();
 
 	START_PROFILE(SMBntcreateX);
@@ -535,22 +452,35 @@ void reply_ntcreate_and_X(connection_struct *conn,
 	create_options = IVAL(req->inbuf,smb_ntcreate_CreateOptions);
 	root_dir_fid = (uint16)IVAL(req->inbuf,smb_ntcreate_RootDirectoryFid);
 
-	allocation_size = (SMB_BIG_UINT)IVAL(req->inbuf,smb_ntcreate_AllocationSize);
+	allocation_size = (SMB_BIG_UINT)IVAL(req->inbuf,
+					     smb_ntcreate_AllocationSize);
 #ifdef LARGE_SMB_OFF_T
-	allocation_size |= (((SMB_BIG_UINT)IVAL(req->inbuf,smb_ntcreate_AllocationSize + 4)) << 32);
+	allocation_size |= (((SMB_BIG_UINT)IVAL(
+				     req->inbuf,
+				     smb_ntcreate_AllocationSize + 4)) << 32);
 #endif
 
+	srvstr_get_path(ctx, (char *)req->inbuf, req->flags2, &fname,
+			smb_buf(req->inbuf), 0, STR_TERMINATE, &status);
+
+	if (!NT_STATUS_IS_OK(status)) {
+		reply_nterror(req, status);
+		END_PROFILE(SMBntcreateX);
+		return;
+	}
+
 	DEBUG(10,("reply_ntcreate_and_X: flags = 0x%x, access_mask = 0x%x "
 		  "file_attributes = 0x%x, share_access = 0x%x, "
 		  "create_disposition = 0x%x create_options = 0x%x "
-		  "root_dir_fid = 0x%x\n",
+		  "root_dir_fid = 0x%x, fname = %s\n",
 			(unsigned int)flags,
 			(unsigned int)access_mask,
 			(unsigned int)file_attributes,
 			(unsigned int)share_access,
 			(unsigned int)create_disposition,
 			(unsigned int)create_options,
-			(unsigned int)root_dir_fid ));
+			(unsigned int)root_dir_fid,
+			fname));
 
 	/*
 	 * If it's an IPC, use the pipe handler.
@@ -568,172 +498,20 @@ void reply_ntcreate_and_X(connection_struct *conn,
 		}
 	}
 
-	if (create_options & FILE_OPEN_BY_FILE_ID) {
-		reply_nterror(req, NT_STATUS_NOT_SUPPORTED);
-		END_PROFILE(SMBntcreateX);
-		return;
-	}
-
-	/*
-	 * Get the file name.
-	 */
-
-	if(root_dir_fid != 0) {
-		/*
-		 * This filename is relative to a directory fid.
-		 */
-		char *rel_fname = NULL;
-		files_struct *dir_fsp = file_fsp(
-			SVAL(req->inbuf, smb_ntcreate_RootDirectoryFid));
-
-		if(!dir_fsp) {
-			reply_doserror(req, ERRDOS, ERRbadfid);
-			END_PROFILE(SMBntcreateX);
-			return;
-		}
-
-		if(!dir_fsp->is_directory) {
-
-			srvstr_get_path(ctx, (char *)req->inbuf,
-					req->flags2, &fname,
-					smb_buf(req->inbuf), 0,
-					STR_TERMINATE, &status);
-			if (!NT_STATUS_IS_OK(status)) {
-				reply_nterror(req, status);
-				END_PROFILE(SMBntcreateX);
-				return;
-			}
-
-			/*
-			 * Check to see if this is a mac fork of some kind.
-			 */
-
-			if( is_ntfs_stream_name(fname)) {
-				reply_nterror(
-					req, NT_STATUS_OBJECT_PATH_NOT_FOUND);
-				END_PROFILE(SMBntcreateX);
-				return;
-			}
-
-			/*
-			  we need to handle the case when we get a
-			  relative open relative to a file and the
-			  pathname is blank - this is a reopen!
-			  (hint from demyn plantenberg)
-			*/
-
-			reply_doserror(req, ERRDOS, ERRbadfid);
-			END_PROFILE(SMBntcreateX);
-			return;
-		}
-
-		if (ISDOT(dir_fsp->fsp_name)) {
-			/*
-			 * We're at the toplevel dir, the final file name
-			 * must not contain ./, as this is filtered out
-			 * normally by srvstr_get_path and unix_convert
-			 * explicitly rejects paths containing ./.
-			 */
-			fname = talloc_strdup(ctx,"");
-			if (!fname) {
-				reply_nterror(req, NT_STATUS_NO_MEMORY);
-				END_PROFILE(SMBntcreateX);
-				return;
-			}
-		} else {
-			size_t dir_name_len = strlen(dir_fsp->fsp_name);
-
-			/*
-			 * Copy in the base directory name.
-			 */
-
-			fname = TALLOC_ARRAY(ctx, char, dir_name_len+2);
-			if (!fname) {
-				reply_nterror(
-					req, NT_STATUS_NO_MEMORY);
-				END_PROFILE(SMBntcreateX);
-				return;
-			}
-			memcpy(fname, dir_fsp->fsp_name, dir_name_len+1);
+	status = create_file(conn, req, root_dir_fid, fname, flags,
+			     access_mask, file_attributes, share_access,
+			     create_disposition, create_options,
+			     oplock_request, allocation_size, NULL, NULL,
+			     &fsp, &info, &oplock_granted, &sbuf);
 
-			/*
-			 * Ensure it ends in a '/'.
-			 * We used TALLOC_SIZE +2 to add space for the '/'.
-			 */
-
-			if(dir_name_len &&
-					(fname[dir_name_len-1] != '\\') &&
-					(fname[dir_name_len-1] != '/')) {
-				fname[dir_name_len] = '/';
-				fname[dir_name_len+1] = '\0';
-			}
-		}
-
-		srvstr_get_path(ctx, (char *)req->inbuf, req->flags2, &rel_fname,
-				smb_buf(req->inbuf), 0,
-				STR_TERMINATE, &status);
-		if (!NT_STATUS_IS_OK(status)) {
-			reply_nterror(req, status);
-			END_PROFILE(SMBntcreateX);
-			return;
-		}
-		fname = talloc_asprintf(ctx, "%s%s",
-					fname,
-					rel_fname);
-		if (!fname) {
-			reply_nterror(
-				req, NT_STATUS_NO_MEMORY);
-			END_PROFILE(SMBntcreateX);
-			return;
-		}
-	} else {
-		srvstr_get_path(ctx, (char *)req->inbuf, req->flags2, &fname,
-				smb_buf(req->inbuf), 0,
-				STR_TERMINATE, &status);
-		if (!NT_STATUS_IS_OK(status)) {
-			reply_nterror(req, status);
-			END_PROFILE(SMBntcreateX);
-			return;
-		}
-
-		/*
-		 * Check to see if this is a mac fork of some kind.
-		 */
-
-		if( is_ntfs_stream_name(fname)) {
-			enum FAKE_FILE_TYPE fake_file_type = is_fake_file(fname);
-			if (fake_file_type!=FAKE_FILE_TYPE_NONE) {
-				/*
-				 * Here we go! support for changing the disk quotas --metze
-				 *
-				 * We need to fake up to open this MAGIC QUOTA file 
-				 * and return a valid FID.
-				 *
-				 * w2k close this file directly after openening
-				 * xp also tries a QUERY_FILE_INFO on the file and then close it
-				 */
-				reply_ntcreate_and_X_quota(conn, req,
-							  fake_file_type, fname);
-			} else {
-				reply_nterror(req, NT_STATUS_OBJECT_PATH_NOT_FOUND);
-			}
+	if (!NT_STATUS_IS_OK(status)) {
+		if (open_was_deferred(req->mid)) {
+			/* We have re-scheduled this call, no error. */
 			END_PROFILE(SMBntcreateX);
 			return;
 		}
-	}
-
-	/*
-	 * Now contruct the smb_open_mode value from the filename,
-	 * desired access and the share access.
-	 */
-	status = resolve_dfspath(ctx, conn,
-				req->flags2 & FLAGS2_DFS_PATHNAMES,
-				fname,
-				&fname);
-	if (!NT_STATUS_IS_OK(status)) {
-		if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
-			reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
-					ERRSRV, ERRbadpath);
+		if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
+			reply_botherror(req, status, ERRDOS, ERRfilexists);
 		}
 		else {
 			reply_nterror(req, status);
@@ -742,230 +520,11 @@ void reply_ntcreate_and_X(connection_struct *conn,
 		return;
 	}
 
-	oplock_request = (flags & REQUEST_OPLOCK) ? EXCLUSIVE_OPLOCK : 0;
-	if (oplock_request) {
-		oplock_request |= (flags & REQUEST_BATCH_OPLOCK) ? BATCH_OPLOCK : 0;
-	}
-
-	/*
-	 * Ordinary file or directory.
-	 */
-
-	/*
-	 * Check if POSIX semantics are wanted.
-	 */
-
-	if (file_attributes & FILE_FLAG_POSIX_SEMANTICS) {
-		case_state = set_posix_case_semantics(NULL, conn);
-		file_attributes &= ~FILE_FLAG_POSIX_SEMANTICS;
-	}
-
-	status = unix_convert(ctx, conn, fname, False, &fname, NULL, &sbuf);
-	if (!NT_STATUS_IS_OK(status)) {
-		TALLOC_FREE(case_state);
-		reply_nterror(req, status);
-		END_PROFILE(SMBntcreateX);
-		return;
-	}
-	/* All file access must go through check_name() */
-	status = check_name(conn, fname);
-	if (!NT_STATUS_IS_OK(status)) {
-		TALLOC_FREE(case_state);
-		reply_nterror(req, status);
-		END_PROFILE(SMBntcreateX);
-		return;
-	}
-
-	/* This is the correct thing to do (check every time) but can_delete is
-	   expensive (it may have to read the parent directory permissions). So
-	   for now we're not doing it unless we have a strong hint the client
-	   is really going to delete this file. If the client is forcing FILE_CREATE
-	   let the filesystem take care of the permissions. */
-
-	/* Setting FILE_SHARE_DELETE is the hint. */
-
-	if (lp_acl_check_permissions(SNUM(conn))
-	    && (create_disposition != FILE_CREATE)
-	    && (share_access & FILE_SHARE_DELETE)
-	    && (access_mask & DELETE_ACCESS)) {
-		if (((dos_mode(conn, fname, &sbuf) & FILE_ATTRIBUTE_READONLY)
-				&& !lp_delete_readonly(SNUM(conn))) ||
-				!can_delete_file_in_directory(conn, fname)) {
-			TALLOC_FREE(case_state);
-			reply_nterror(req, NT_STATUS_ACCESS_DENIED);
-			END_PROFILE(SMBntcreateX);
-			return;
-		}
-	}
-
-#if 0
-	/* We need to support SeSecurityPrivilege for this. */
-	if ((access_mask & SEC_RIGHT_SYSTEM_SECURITY) &&
-			!user_has_privileges(current_user.nt_user_token,
-				&se_security)) {
-		TALLOC_FREE(case_state);
-		END_PROFILE(SMBntcreateX);
-		return ERROR_NT(NT_STATUS_PRIVILEGE_NOT_HELD);
-	}
-#endif
-
-	/*
-	 * If it's a request for a directory open, deal with it separately.
-	 */
-
-	if(create_options & FILE_DIRECTORY_FILE) {
-
-		/* Can't open a temp directory. IFS kit test. */
-		if (file_attributes & FILE_ATTRIBUTE_TEMPORARY) {
-			TALLOC_FREE(case_state);
-			reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
-			END_PROFILE(SMBntcreateX);
-			return;
-		}
-
-		oplock_request = 0;
-		status = open_directory(conn, req, fname, &sbuf,
-					access_mask,
-					share_access,
-					create_disposition,
-					create_options,
-					file_attributes,
-					&info, &fsp);
-
-	} else {
-
-		/*
-		 * Ordinary file case.
-		 */
-
-		/* NB. We have a potential bug here. If we
-		 * cause an oplock break to ourselves, then we
-		 * could end up processing filename related
-		 * SMB requests whilst we await the oplock
-		 * break response. As we may have changed the
-		 * filename case semantics to be POSIX-like,
-		 * this could mean a filename request could
-		 * fail when it should succeed. This is a rare
-		 * condition, but eventually we must arrange
-		 * to restore the correct case semantics
-		 * before issuing an oplock break request to
-		 * our client. JRA.  */
-
-		status = open_file_ntcreate(conn, req, fname, &sbuf,
-					access_mask,
-					share_access,
-					create_disposition,
-					create_options,
-					file_attributes,
-					oplock_request,
-					&info, &fsp);
-
-		/* We cheat here. There are two cases we
-		 * care about. One is a directory rename,
-		 * where the NT client will attempt to
-		 * open the source directory for
-		 * DELETE access. Note that when the
-		 * NT client does this it does *not*
-		 * set the directory bit in the
-		 * request packet. This is translated
-		 * into a read/write open
-		 * request. POSIX states that any open
-		 * for write request on a directory
-		 * will generate an EISDIR error, so
-		 * we can catch this here and open a
-		 * pseudo handle that is flagged as a
-		 * directory. The second is an open
-		 * for a permissions read only, which
-		 * we handle in the open_file_stat case. JRA.
-		 */
-
-		if (NT_STATUS_EQUAL(status, NT_STATUS_FILE_IS_A_DIRECTORY)) {
-
-			/*
-			 * Fail the open if it was explicitly a non-directory
-			 * file.
-			 */
-
-			if (create_options & FILE_NON_DIRECTORY_FILE) {
-				TALLOC_FREE(case_state);
-				reply_force_nterror(req,
-						NT_STATUS_FILE_IS_A_DIRECTORY);
-				END_PROFILE(SMBntcreateX);
-				return;
-			}
-
-			oplock_request = 0;
-			status = open_directory(conn, req, fname,
-						&sbuf,
-						access_mask,
-						share_access,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list