svn commit: samba r8688 - in trunk/source/smbd: .

jra at samba.org jra at samba.org
Thu Jul 21 20:24:17 GMT 2005


Author: jra
Date: 2005-07-21 20:24:17 +0000 (Thu, 21 Jul 2005)
New Revision: 8688

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=8688

Log:
Fixes bugid #2889 for sure. Turns out the OS/2 dos box doesn't like two offsets
to be identical. Make offsets for . and .. different (and explicit).
Jeremy.

Modified:
   trunk/source/smbd/dir.c


Changeset:
Modified: trunk/source/smbd/dir.c
===================================================================
--- trunk/source/smbd/dir.c	2005-07-21 18:57:02 UTC (rev 8687)
+++ trunk/source/smbd/dir.c	2005-07-21 20:24:17 UTC (rev 8688)
@@ -26,6 +26,11 @@
 
 extern struct current_user current_user;
 
+/* "Special" directory offsets. */
+#define END_OF_DIRECTORY_OFFSET ((long)-1)
+#define START_OF_DIRECTORY_OFFSET ((long)0)
+#define DOT_DOT_DIRECTORY_OFFSET ((long)0x80000000)
+
 /* Make directory handle internals available. */
 
 #define NAME_CACHE_SIZE 100
@@ -560,7 +565,7 @@
 
 	/* If poffset is -1 then we know we returned this name before and we have
 	   no wildcards. We're at the end of the directory. */
-	if (*poffset == -1) {
+	if (*poffset == END_OF_DIRECTORY_OFFSET) {
 		return NULL;
 	}
 
@@ -577,7 +582,7 @@
 	if (VALID_STAT(*pst)) {
 		/* We need to set the underlying dir_hdn offset to -1 also as
 		   this function is usually called with the output from TellDir. */
-		dptr->dir_hnd->offset = *poffset = -1;
+		dptr->dir_hnd->offset = *poffset = END_OF_DIRECTORY_OFFSET;
 		return dptr->wcard;
 	}
 
@@ -588,7 +593,7 @@
 	if (SMB_VFS_STAT(dptr->conn,pathreal,pst) == 0) {
 		/* We need to set the underlying dir_hdn offset to -1 also as
 		   this function is usually called with the output from TellDir. */
-		dptr->dir_hnd->offset = *poffset = -1;
+		dptr->dir_hnd->offset = *poffset = END_OF_DIRECTORY_OFFSET;
 		return dptr->wcard;
 	} else {
 		/* If we get any other error than ENOENT or ENOTDIR
@@ -596,7 +601,7 @@
 		if (errno != ENOENT && errno != ENOTDIR) {
 			/* We need to set the underlying dir_hdn offset to -1 also as
 			   this function is usually called with the output from TellDir. */
-			dptr->dir_hnd->offset = *poffset = -1;
+			dptr->dir_hnd->offset = *poffset = END_OF_DIRECTORY_OFFSET;
 			return dptr->wcard;
 		}
 	}
@@ -607,7 +612,7 @@
 	if (dptr->conn->case_sensitive) {
 		/* We need to set the underlying dir_hdn offset to -1 also as
 		   this function is usually called with the output from TellDir. */
-		dptr->dir_hnd->offset = *poffset = -1;
+		dptr->dir_hnd->offset = *poffset = END_OF_DIRECTORY_OFFSET;
 		return NULL;
 	} else {
 		dptr->has_wild = True;
@@ -623,9 +628,9 @@
 {
 	SET_STAT_INVALID(*pst);
 
-	if (!dptr->has_wild && (dptr->dir_hnd->offset == -1)) {
+	if (!dptr->has_wild && (dptr->dir_hnd->offset == END_OF_DIRECTORY_OFFSET)) {
 		/* This is a singleton directory and we're already at the end. */
-		*poffset = -1;
+		*poffset = END_OF_DIRECTORY_OFFSET;
 		return False;
 	}
 
@@ -676,7 +681,7 @@
 	*num = key;
 	offset = IVAL(buf,1);
 	if (offset == (uint32)-1) {
-		seekoff = -1;
+		seekoff = END_OF_DIRECTORY_OFFSET;
 	} else {
 		seekoff = (long)offset;
 	}
@@ -1083,10 +1088,12 @@
 	connection_struct *conn = dirp->conn;
 
 	/* Cheat to allow . and .. to be the first entries returned. */
-	if ((*poffset == 0) && (dirp->file_number < 2)) {
+	if (((*poffset == START_OF_DIRECTORY_OFFSET) || (*poffset == DOT_DOT_DIRECTORY_OFFSET)) && (dirp->file_number < 2)) {
 		if (dirp->file_number == 0) {
 			n = ".";
+			*poffset = dirp->offset = START_OF_DIRECTORY_OFFSET;
 		} else {
+			*poffset = dirp->offset = DOT_DOT_DIRECTORY_OFFSET;
 			n = "..";
 		}
 		dirp->file_number++;
@@ -1113,7 +1120,7 @@
 		dirp->file_number++;
 		return e->name;
 	}
-	dirp->offset = -1;
+	dirp->offset = END_OF_DIRECTORY_OFFSET;
 	return NULL;
 }
 
@@ -1125,8 +1132,8 @@
 {
 	SMB_VFS_REWINDDIR(dirp->conn, dirp->dir);
 	dirp->file_number = 0;
-	dirp->offset = 0;
-	*poffset = 0;
+	dirp->offset = START_OF_DIRECTORY_OFFSET;
+	*poffset = START_OF_DIRECTORY_OFFSET;
 }
 
 /*******************************************************************
@@ -1136,7 +1143,7 @@
 void SeekDir(struct smb_Dir *dirp, long offset)
 {
 	if (offset != dirp->offset) {
-		if (offset == 0) {
+		if (offset == START_OF_DIRECTORY_OFFSET || offset == DOT_DOT_DIRECTORY_OFFSET) {
 			RewindDir(dirp, &offset);
 		} else {
 			SMB_VFS_SEEKDIR(dirp->conn, dirp->dir, offset);
@@ -1186,7 +1193,7 @@
 	/* Not found in the name cache. Rewind directory and start from scratch. */
 	SMB_VFS_REWINDDIR(conn, dirp->dir);
 	dirp->file_number = 0;
-	*poffset = 0;
+	*poffset = START_OF_DIRECTORY_OFFSET;
 	while ((entry = ReadDirName(dirp, poffset))) {
 		if (conn->case_sensitive ? (strcmp(entry, name) == 0) : strequal(entry, name)) {
 			return True;



More information about the samba-cvs mailing list