svn commit: samba r21257 - in branches: SAMBA_3_0/source/lib
SAMBA_3_0/source/locking SAMBA_3_0/source/smbd
SAMBA_3_0_25/source/lib SAMBA_3_0_25/source/locking
SAMBA_3_0_25/source/smbd
jra at samba.org
jra at samba.org
Fri Feb 9 02:03:40 GMT 2007
Author: jra
Date: 2007-02-09 02:03:39 +0000 (Fri, 09 Feb 2007)
New Revision: 21257
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21257
Log:
Better fix for bug #4188 :
Windows Vista RC1 and RC2 can't delete directory on Samba share
based on work by Joe Meadows <jmeadows at webopolis.com>.
Jeremy.
Modified:
branches/SAMBA_3_0/source/lib/dummysmbd.c
branches/SAMBA_3_0/source/locking/locking.c
branches/SAMBA_3_0/source/smbd/dir.c
branches/SAMBA_3_0_25/source/lib/dummysmbd.c
branches/SAMBA_3_0_25/source/locking/locking.c
branches/SAMBA_3_0_25/source/smbd/dir.c
Changeset:
Modified: branches/SAMBA_3_0/source/lib/dummysmbd.c
===================================================================
--- branches/SAMBA_3_0/source/lib/dummysmbd.c 2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0/source/lib/dummysmbd.c 2007-02-09 02:03:39 UTC (rev 21257)
@@ -38,22 +38,13 @@
{
}
-NTSTATUS dptr_create(connection_struct *conn, pstring path, BOOL old_handle, BOOL expect_close,uint16 spid,
- const char *wcard, BOOL wcard_has_wild, uint32 attr, struct dptr_struct **dptr_ret)
+void send_stat_cache_delete_message(const char *name)
{
- return NT_STATUS_OK;
}
-int dptr_CloseDir(struct dptr_struct *dptr)
+NTSTATUS can_delete_directory(struct connection_struct *conn,
+ const char *dirname)
{
- return 0;
+ return NT_STATUS_OK;
}
-const char *dptr_ReadDirName(struct dptr_struct *dptr, long *poffset, SMB_STRUCT_STAT *pst)
-{
- return NULL;
-}
-
-void send_stat_cache_delete_message(const char *name)
-{
-}
Modified: branches/SAMBA_3_0/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_0/source/locking/locking.c 2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0/source/locking/locking.c 2007-02-09 02:03:39 UTC (rev 21257)
@@ -1151,42 +1151,7 @@
/* Don't allow delete on close for non-empty directories. */
if (fsp->is_directory) {
- long offset = 0;
- NTSTATUS status;
- SMB_STRUCT_STAT st;
- struct dptr_struct *dirptr;
- const char *name;
-
- status = dptr_create(fsp->conn,
- fsp->fsp_name,
- False,
- True,
- 0,
- "*",
- True,
- 0,
- &dirptr);
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
-
- /* Read 3 entries. Ignore first 2 (they're . and .. ) */
- name = dptr_ReadDirName(dirptr, &offset, &st);
- if (!name) {
- dptr_CloseDir(dirptr);
- return NT_STATUS_ACCESS_DENIED;
- }
- name = dptr_ReadDirName(dirptr, &offset, &st);
- if (!name) {
- dptr_CloseDir(dirptr);
- return NT_STATUS_ACCESS_DENIED;
- }
- name = dptr_ReadDirName(dirptr, &offset, &st);
- dptr_CloseDir(dirptr);
- if (name) {
- DEBUG(10,("can_set_delete_on_close: got name %s - can't delete\n", name ));
- return NT_STATUS_DIRECTORY_NOT_EMPTY;
- }
+ return can_delete_directory(fsp->conn, fsp->fsp_name);
}
return NT_STATUS_OK;
Modified: branches/SAMBA_3_0/source/smbd/dir.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/dir.c 2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0/source/smbd/dir.c 2007-02-09 02:03:39 UTC (rev 21257)
@@ -1279,3 +1279,42 @@
}
return False;
}
+
+/*****************************************************************
+ Is this directory empty ?
+*****************************************************************/
+
+NTSTATUS can_delete_directory(struct connection_struct *conn,
+ const char *dirname)
+{
+ NTSTATUS status = NT_STATUS_OK;
+ long dirpos = 0;
+ const char *dname;
+ struct smb_Dir *dir_hnd = OpenDir(conn, dirname, NULL, 0);
+
+ if (!dir_hnd) {
+ return map_nt_error_from_unix(errno);
+ }
+
+ while ((dname = ReadDirName(dir_hnd,&dirpos))) {
+ SMB_STRUCT_STAT st;
+
+ /* Quick check for "." and ".." */
+ if (dname[0] == '.') {
+ if (!dname[1] || (dname[1] == '.' && !dname[2])) {
+ continue;
+ }
+ }
+
+ if (!is_visible_file(conn, dirname, dname, &st, True)) {
+ continue;
+ }
+
+ DEBUG(10,("can_delete_directory: got name %s - can't delete\n", dname ));
+ status = NT_STATUS_DIRECTORY_NOT_EMPTY;
+ break;
+ }
+ CloseDir(dir_hnd);
+
+ return status;
+}
Modified: branches/SAMBA_3_0_25/source/lib/dummysmbd.c
===================================================================
--- branches/SAMBA_3_0_25/source/lib/dummysmbd.c 2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0_25/source/lib/dummysmbd.c 2007-02-09 02:03:39 UTC (rev 21257)
@@ -38,22 +38,13 @@
{
}
-NTSTATUS dptr_create(connection_struct *conn, pstring path, BOOL old_handle, BOOL expect_close,uint16 spid,
- const char *wcard, BOOL wcard_has_wild, uint32 attr, struct dptr_struct **dptr_ret)
+void send_stat_cache_delete_message(const char *name)
{
- return NT_STATUS_OK;
}
-int dptr_CloseDir(struct dptr_struct *dptr)
+NTSTATUS can_delete_directory(struct connection_struct *conn,
+ const char *dirname)
{
- return 0;
+ return NT_STATUS_OK;
}
-const char *dptr_ReadDirName(struct dptr_struct *dptr, long *poffset, SMB_STRUCT_STAT *pst)
-{
- return NULL;
-}
-
-void send_stat_cache_delete_message(const char *name)
-{
-}
Modified: branches/SAMBA_3_0_25/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_0_25/source/locking/locking.c 2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0_25/source/locking/locking.c 2007-02-09 02:03:39 UTC (rev 21257)
@@ -1151,42 +1151,7 @@
/* Don't allow delete on close for non-empty directories. */
if (fsp->is_directory) {
- long offset = 0;
- NTSTATUS status;
- SMB_STRUCT_STAT st;
- struct dptr_struct *dirptr;
- const char *name;
-
- status = dptr_create(fsp->conn,
- fsp->fsp_name,
- False,
- True,
- 0,
- "*",
- True,
- 0,
- &dirptr);
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
-
- /* Read 3 entries. Ignore first 2 (they're . and .. ) */
- name = dptr_ReadDirName(dirptr, &offset, &st);
- if (!name) {
- dptr_CloseDir(dirptr);
- return NT_STATUS_ACCESS_DENIED;
- }
- name = dptr_ReadDirName(dirptr, &offset, &st);
- if (!name) {
- dptr_CloseDir(dirptr);
- return NT_STATUS_ACCESS_DENIED;
- }
- name = dptr_ReadDirName(dirptr, &offset, &st);
- dptr_CloseDir(dirptr);
- if (name) {
- DEBUG(10,("can_set_delete_on_close: got name %s - can't delete\n", name ));
- return NT_STATUS_DIRECTORY_NOT_EMPTY;
- }
+ return can_delete_directory(fsp->conn, fsp->fsp_name);
}
return NT_STATUS_OK;
Modified: branches/SAMBA_3_0_25/source/smbd/dir.c
===================================================================
--- branches/SAMBA_3_0_25/source/smbd/dir.c 2007-02-09 01:52:13 UTC (rev 21256)
+++ branches/SAMBA_3_0_25/source/smbd/dir.c 2007-02-09 02:03:39 UTC (rev 21257)
@@ -1279,3 +1279,42 @@
}
return False;
}
+
+/*****************************************************************
+ Is this directory empty ?
+*****************************************************************/
+
+NTSTATUS can_delete_directory(struct connection_struct *conn,
+ const char *dirname)
+{
+ NTSTATUS status = NT_STATUS_OK;
+ long dirpos = 0;
+ const char *dname;
+ struct smb_Dir *dir_hnd = OpenDir(conn, dirname, NULL, 0);
+
+ if (!dir_hnd) {
+ return map_nt_error_from_unix(errno);
+ }
+
+ while ((dname = ReadDirName(dir_hnd,&dirpos))) {
+ SMB_STRUCT_STAT st;
+
+ /* Quick check for "." and ".." */
+ if (dname[0] == '.') {
+ if (!dname[1] || (dname[1] == '.' && !dname[2])) {
+ continue;
+ }
+ }
+
+ if (!is_visible_file(conn, dirname, dname, &st, True)) {
+ continue;
+ }
+
+ DEBUG(10,("can_delete_directory: got name %s - can't delete\n", dname ));
+ status = NT_STATUS_DIRECTORY_NOT_EMPTY;
+ break;
+ }
+ CloseDir(dir_hnd);
+
+ return status;
+}
More information about the samba-cvs
mailing list