diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-07-18 03:35:52 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:29:36 -0500 |
commit | b37e82567d28626d39ce02c392d09a815cce497f (patch) | |
tree | e374845dfa17396ecd889dd250d56854fbb7d228 /source4/ntvfs/posix/pvfs_dirlist.c | |
parent | 2ec501883d4c7d5d18cb1b457d94169960824817 (diff) | |
download | samba-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.c | 52 |
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; } |