summaryrefslogtreecommitdiff
path: root/source4/ntvfs/posix/pvfs_dirlist.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-07-18 03:35:52 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:29:36 -0500
commitb37e82567d28626d39ce02c392d09a815cce497f (patch)
treee374845dfa17396ecd889dd250d56854fbb7d228 /source4/ntvfs/posix/pvfs_dirlist.c
parent2ec501883d4c7d5d18cb1b457d94169960824817 (diff)
downloadsamba-b37e82567d28626d39ce02c392d09a815cce497f.tar.gz
samba-b37e82567d28626d39ce02c392d09a815cce497f.tar.bz2
samba-b37e82567d28626d39ce02c392d09a815cce497f.zip
r8535: no longer rely on seekdir working after a closedir. Instead, keep
directories open, but close search states based on an inactivity timer, with a default of a 5 minute timeout (This used to be commit 2e8d154e7dfb9b320a1344e957a39e96e1eefadd)
Diffstat (limited to 'source4/ntvfs/posix/pvfs_dirlist.c')
-rw-r--r--source4/ntvfs/posix/pvfs_dirlist.c52
1 files changed, 1 insertions, 51 deletions
diff --git a/source4/ntvfs/posix/pvfs_dirlist.c b/source4/ntvfs/posix/pvfs_dirlist.c
index 1b60f17462..328d07f71b 100644
--- a/source4/ntvfs/posix/pvfs_dirlist.c
+++ b/source4/ntvfs/posix/pvfs_dirlist.c
@@ -194,58 +194,16 @@ const char *pvfs_list_next(struct pvfs_dir *dir, uint_t *ofs)
if (e->name) talloc_free(e->name);
- e->name = talloc_strdup(dir, de->d_name);
+ e->name = talloc_strdup(dir->name_cache, de->d_name);
e->offset = dir->offset;
return e->name;
}
dir->end_of_search = True;
- pvfs_list_hibernate(dir);
return NULL;
}
-/*
- put the directory to sleep. Used between search calls to give the
- right directory change semantics
-*/
-void pvfs_list_hibernate(struct pvfs_dir *dir)
-{
- if (dir->dir) {
- closedir(dir->dir);
- dir->dir = NULL;
- }
-}
-
-
-/*
- wake up the directory search
-*/
-NTSTATUS pvfs_list_wakeup(struct pvfs_dir *dir, uint_t *ofs)
-{
- if (dir->no_wildcard ||
- dir->dir != NULL) {
- return NT_STATUS_OK;
- }
-
- dir->dir = opendir(dir->unix_path);
- if (dir->dir == NULL) {
- dir->end_of_search = True;
- return pvfs_map_errno(dir->pvfs, errno);
- }
-
- seekdir(dir->dir, *ofs);
- dir->offset = telldir(dir->dir);
- if (dir->offset != *ofs) {
- DEBUG(0,("pvfs_list_wakeup: search offset changed %u -> %u\n",
- *ofs, (unsigned)dir->offset));
- }
-
- return NT_STATUS_OK;
-}
-
-
-
/*
return unix directory of an open search
*/
@@ -268,14 +226,8 @@ BOOL pvfs_list_eos(struct pvfs_dir *dir, uint_t ofs)
NTSTATUS pvfs_list_seek(struct pvfs_dir *dir, const char *name, uint_t *ofs)
{
struct dirent *de;
- NTSTATUS status;
int i;
- status = pvfs_list_wakeup(dir, ofs);
- if (!NT_STATUS_IS_OK(status)) {
- return status;
- }
-
for (i=dir->name_cache_index;i>=0;i--) {
struct name_cache_entry *e = &dir->name_cache[i];
if (e->name && StrCaseCmp(name, e->name) == 0) {
@@ -303,7 +255,5 @@ NTSTATUS pvfs_list_seek(struct pvfs_dir *dir, const char *name, uint_t *ofs)
dir->end_of_search = True;
- pvfs_list_hibernate(dir);
-
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
}