delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/1996/09/11/22:32:03

Date: Wed, 11 Sep 1996 22:31:07 -0400
From: dj (DJ Delorie)
Message-Id: <199609120231.WAA17793@delorie.com>
To: djgpp-workers
Subject: readdir & /

I applied this patch to make readdir() return entries for "." and ".."
even for root directories.  The fact that it didn't use to cost me a
few CDR blanks, because mkisofs requires this behavior.

Comments?  Is there ever a case where opendir("/") returns "." and
".." on its own?  If so, any reason why calling findfirst an extra
time (to see if "." is returned) would be a bad thing?

DJ


diff -c3 -r src/libc/posix/dirent/dirstruc.h /v2/src/libc/posix/dirent/dirstruc.h
*** src/libc/posix/dirent/dirstruc.h	Tue Dec 20 03:12:42 1994
--- /v2/src/libc/posix/dirent/dirstruc.h	Wed Sep 11 22:23:52 1996
***************
*** 7,10 ****
--- 7,11 ----
    int flags;
    struct ffblk ff;
    struct dirent de;
+   int need_fake_dot_dotdot; /* 0=no, 1=.., 2=. */
  };
diff -c3 -r src/libc/posix/dirent/opendir.c /v2/src/libc/posix/dirent/opendir.c
*** src/libc/posix/dirent/opendir.c	Sat Aug 31 21:09:32 1996
--- /v2/src/libc/posix/dirent/opendir.c	Wed Sep 11 22:27:00 1996
***************
*** 34,39 ****
--- 34,46 ----
    /* Make absolute path */
    _fixpath(name, dir->name);
  
+   /* If we're doing opendir of the root directory, we need to
+      fake out the . and .. entries, as some unix programs (like
+      mkisofs) expect them and fail if they don't exist */
+   dir->need_fake_dot_dotdot = 0;
+   if (dir->name[1] == ':' && dir->name[2] == '/' && dir->name[3] == 0)
+     dir->need_fake_dot_dotdot = 2;
+ 
    /* Ensure that directory to be accessed exists */
    if (access(dir->name, D_OK))
    {
diff -c3 -r src/libc/posix/dirent/readdir.c /v2/src/libc/posix/dirent/readdir.c
*** src/libc/posix/dirent/readdir.c	Sat Aug 31 21:09:32 1996
--- /v2/src/libc/posix/dirent/readdir.c	Wed Sep 11 22:28:54 1996
***************
*** 12,17 ****
--- 12,30 ----
  {
    int done;
    int oerrno = errno;
+ 
+   if (dir->need_fake_dot_dotdot)
+   {
+     /* Fake out . and .. on /; see opendir for comments */
+     dir->need_fake_dot_dotdot --;
+     if (dir->need_fake_dot_dotdot)
+       strcpy(dir->de.d_name, ".");
+     else
+       strcpy(dir->de.d_name, "..");
+     dir->de.d_namlen = strlen(dir->de.d_name);
+     return &(dir->de);
+   }
+ 
    if (dir->num_read)
      done = findnext(&dir->ff);
    else

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019