summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/system.c6
-rw-r--r--source3/smbd/dir.c6
2 files changed, 10 insertions, 2 deletions
diff --git a/source3/lib/system.c b/source3/lib/system.c
index 24d3c09d58..092287a602 100644
--- a/source3/lib/system.c
+++ b/source3/lib/system.c
@@ -868,13 +868,15 @@ SMB_STRUCT_DIR *sys_opendir(const char *name)
/*******************************************************************
An fdopendir wrapper that will deal with 64 bit filesizes.
+ Ugly hack - we need dirfd for this to work correctly in the
+ calling code.. JRA.
********************************************************************/
SMB_STRUCT_DIR *sys_fdopendir(int fd)
{
-#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_FDOPENDIR64)
+#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_FDOPENDIR64) && defined(HAVE_DIRFD)
return fdopendir64(fd);
-#elif defined(HAVE_FDOPENDIR)
+#elif defined(HAVE_FDOPENDIR) && defined(HAVE_DIRFD)
return fdopendir(fd);
#else
errno = ENOSYS;
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 5c502f7706..b9791e9dab 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -570,10 +570,16 @@ NTSTATUS dptr_create(connection_struct *conn, files_struct *fsp,
void dptr_CloseDir(files_struct *fsp)
{
if (fsp->dptr) {
+/*
+ * Ugly hack. We have defined fdopendir to return ENOSYS if dirfd also isn't
+ * present. I hate Solaris. JRA.
+ */
+#ifdef HAVE_DIRFD
if (fsp->fh->fd == dirfd(fsp->dptr->dir_hnd->dir)) {
/* The call below closes the underlying fd. */
fsp->fh->fd = -1;
}
+#endif
dptr_close_internal(fsp->dptr);
fsp->dptr = NULL;
}