From 81cce1332129b97a5538f35c70367858f460935c Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 1 Mar 2007 21:01:22 +0000 Subject: r21638: Change POSIX_UNLINK to allow clients to differentiate between unlink/rmdir calls. Jeremy. (This used to be commit f0c8488d382ada32fabe79399f64ba1c6486d009) --- source3/include/trans2.h | 12 ++++++++++-- source3/smbd/trans2.c | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) (limited to 'source3') diff --git a/source3/include/trans2.h b/source3/include/trans2.h index fb8e7716ab..89227c39d9 100644 --- a/source3/include/trans2.h +++ b/source3/include/trans2.h @@ -604,7 +604,7 @@ number of entries sent will be zero. #define SMB_POSIX_IGNORE_ACE_ENTRIES 0xFFFF -/* Definition of parameter block of SMB_SET_POSIX_LOCK */ +/* Definition of data block of SMB_SET_POSIX_LOCK */ /* [2 bytes] lock_type - 0 = Read, 1 = Write, 2 = Unlock [2 bytes] lock_flags - 1 = Wait (only valid for setlock) @@ -643,7 +643,7 @@ number of entries sent will be zero. #define SMB_O_NOFOLLOW 0x400 #define SMB_O_DIRECT 0x800 -/* Definition of request parameter block for SMB_POSIX_PATH_OPEN */ +/* Definition of request data block for SMB_POSIX_PATH_OPEN */ /* [4 bytes] flags (as smb_ntcreate_Flags). [4 bytes] open_mode @@ -660,4 +660,12 @@ number of entries sent will be zero. [n bytes] - info level reply - if available. */ +/* Definition of request data block for SMB_POSIX_UNLINK */ +/* + [2 bytes] flags (defined below). +*/ + +#define SMB_POSIX_UNLINK_FILE_TARGET 0 +#define SMB_POSIX_UNLINK_DIRECTORY_TARGET 1 + #endif diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 5bbd618231..2952c9b1dc 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -5132,12 +5132,24 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn, { NTSTATUS status = NT_STATUS_OK; files_struct *fsp = NULL; + uint16 flags = 0; int info = 0; + if (total_data < 2) { + return NT_STATUS_INVALID_PARAMETER; + } + + flags = SVAL(pdata,0); + if (!VALID_STAT(*psbuf)) { return NT_STATUS_OBJECT_NAME_NOT_FOUND; } + if ((flags == SMB_POSIX_UNLINK_DIRECTORY_TARGET) && + !VALID_STAT_OF_DIR(*psbuf)) { + return NT_STATUS_NOT_A_DIRECTORY; + } + if (VALID_STAT_OF_DIR(*psbuf)) { status = open_directory(conn, fname, -- cgit