patch: telldir() and seekdir()

Corinna Vinschen corinna.vinschen@cityweb.de
Sat Mar 13 07:21:00 GMT 1999


Chris Faylor wrote:
> 
> Could you rewrite this patch and change the name from __find_first_called
> to something more descriptive?
> 
> I removed the dependency on this field a while ago so I think it is safe
> to change it as long as you replace it with something that is 4 bytes
> in size in the same location in the structure.
> 
> cgf

Ok, done. I have also changed dirent.h, to shift the prototypes to the
#ifndef _POSIX_SOURCE section. telldir/seekdir are not POSIX, are they?

ChangeLog:
==========

Sat Mar 13  9:11:00  Corinna Vinschen  <corinna.vinschen@cityweb.de>

	* dir.cc: Changed usage of struct member __d_find_first_called
	to usage of __d_position.
	* dir.cc (telldir): Checks for __d_cookie now.
	* dir.cc (seekdir): Ditto.
	* newlib/libc/sys/cygwin/sys/dirent.h: Renamed `__d_find_first_called'
	to `__d_position'. Prototypes of `telldir()' and `seekdir()'
	are part of `#ifndef _POSIX_SOURCE' section now.
	
Fri Mar 12 23:23:00  Corinna Vinschen  <corinna.vinschen@cityweb.de>

	* dir.cc: New functions `telldir()' and `seekdir()'.	
	* cygwin.def: Ditto.	
	* newlib/libc/sys/cygwin/sys/dirent.h: Additional prototypes
	for `telldir()' and `seekdir()'.

======= snip =======
--- dir.cc      1999/03/07 22:05:34     1.3
+++ dir.cc      1999/03/13 07:07:40
@@ -106,2 +106,3 @@ opendir (const char *dirname)
   dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
+  dir->__d_position = 0;
   dir->__d_dirhash = statbuf.st_ino;
@@ -202,2 +203,3 @@ readdir (DIR * dir)

+  ++dir->__d_position;
   res = dir->__d_dirent;
@@ -208,2 +210,25 @@ readdir (DIR * dir)

+/* telldir */
+extern "C"
+off_t
+telldir (DIR * dir)
+{
+  if (dir->__d_cookie != __DIRENT_COOKIE)
+    return 0;
+  return dir->__d_position;
+}
+
+/* seekdir */
+extern "C"
+void
+seekdir (DIR * dir, off_t loc)
+{
+  if (dir->__d_cookie != __DIRENT_COOKIE)
+    return;
+  rewinddir (dir);
+  while (loc > dir->__d_position)
+    if (! readdir (dir))
+      break;
+}
+
 /* rewinddir: POSIX 5.1.2.1 */
@@ -221,2 +246,3 @@ rewinddir (DIR * dir)
       dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;
+      dir->__d_position = 0;
     }
--- cygwin.def.orig     Sat Mar 13 00:25:27 1999
+++ cygwin.def  Sat Mar 13 00:12:58 1999
@@ -495,2 +495,4 @@ random
 initstate
+seekdir
+_seekdir = seekdir
 setstate
@@ -727,2 +729,4 @@ tcsetpgrp
 _tcsetpgrp = tcsetpgrp
+telldir
+_telldir = telldir
 tempnam
--- newlib/libc/sys/cygwin/sys/dirent.h.orig    Sat Mar 13 00:27:01 1999
+++ newlib/libc/sys/cygwin/sys/dirent.h Sat Mar 13 09:10:34 1999
@@ -24,3 +24,3 @@ typedef struct
   char *__d_dirname;           /* directory name with trailing '*' */
-  int __d_find_first_called;   /* non-zero if FindFirstFile called */
+  off_t __d_position;          /* used by telldir/seekdir */
   unsigned long __d_dirhash;    /* hash of directory name for use by
@@ -46,2 +46,5 @@ int closedir (DIR *);
 #ifndef _POSIX_SOURCE
+off_t telldir (DIR *);
+void seekdir (DIR *, off_t loc);
+
 int scandir (const char *__dir,


More information about the Cygwin-developers mailing list