]>
sourceware.org Git - newlib-cygwin.git/blob - winsup/cygwin/dir.cc
1 /* dir.cc: Posix directory-related routines
3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2006, 2007 Red Hat, Inc.
5 This file is part of Cygwin.
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license. Please consult the file "CYGWIN_LICENSE" for
14 #define _COMPILING_NEWLIB
29 if (efault
.faulted (EFAULT
))
31 if (dir
->__d_cookie
!= __DIRENT_COOKIE
)
34 syscall_printf ("-1 = dirfd (%p)", dir
);
40 /* Symbol kept for backward compatibility. Don't remove. Don't declare
41 in public header file. */
43 __opendir_with_d_ino (const char *name
)
45 return opendir (name
);
48 /* opendir: POSIX 5.1.2.1 */
50 opendir (const char *name
)
55 fh
= build_fh_name (name
, NULL
, PC_SYM_FOLLOW
);
58 else if (fh
->exists ())
59 res
= fh
->opendir (-1);
76 cygheap_fdget
cfd (fd
);
78 res
= cfd
->opendir (fd
);
83 readdir_worker (DIR *dir
, dirent
*de
)
86 if (efault
.faulted ())
89 if (dir
->__d_cookie
!= __DIRENT_COOKIE
)
91 syscall_printf ("%p = readdir (%p)", NULL
, dir
);
96 int res
= ((fhandler_base
*) dir
->__fh
)->readdir (dir
, de
);
100 if (!(dir
->__flags
& dirent_saw_dot
))
102 strcpy (de
->d_name
, ".");
103 dir
->__flags
|= dirent_saw_dot
;
107 else if (!(dir
->__flags
& dirent_saw_dot_dot
))
109 strcpy (de
->d_name
, "..");
110 dir
->__flags
|= dirent_saw_dot_dot
;
116 if (!res
&& !de
->d_ino
)
119 bool is_dot_dot
= false;
121 if (de
->d_name
[0] == '.')
123 if (de
->d_name
[1] == '\0')
125 else if (de
->d_name
[1] == '.' && de
->d_name
[2] == '\0')
129 if (is_dot_dot
&& !(dir
->__flags
& dirent_isroot
))
130 de
->d_ino
= readdir_get_ino (((fhandler_base
*) dir
->__fh
)->get_name (),
134 /* Compute d_ino by combining filename hash with directory hash. */
135 de
->d_ino
= ((fhandler_base
*) dir
->__fh
)->get_ino ();
136 if (!is_dot
&& !is_dot_dot
)
138 PUNICODE_STRING w32name
=
139 ((fhandler_base
*) dir
->__fh
)->pc
.get_nt_native_path ();
140 DWORD devn
= ((fhandler_base
*) dir
->__fh
)->get_device ();
141 /* Paths below /proc don't have a Win32 pendant. */
142 if (isproc_dev (devn
))
143 de
->d_ino
= hash_path_name (de
->d_ino
, L
"/");
144 else if (w32name
->Buffer
[w32name
->Length
/ sizeof (WCHAR
) - 1]
146 de
->d_ino
= hash_path_name (de
->d_ino
, L
"\\");
147 de
->d_ino
= hash_path_name (de
->d_ino
, de
->d_name
);
151 /* This fills out the old 32 bit d_ino field for old applications,
152 build under Cygwin before 1.5.x. */
153 de
->__d_internal1
= de
->d_ino
;
158 /* readdir: POSIX 5.1.2.1 */
159 extern "C" struct dirent
*
162 int res
= readdir_worker (dir
, dir
->__d_dirent
);
164 return dir
->__d_dirent
;
171 readdir_r (DIR *dir
, dirent
*de
, dirent
**ode
)
173 int res
= readdir_worker (dir
, de
);
189 if (efault
.faulted (EFAULT
))
192 if (dir
->__d_cookie
!= __DIRENT_COOKIE
)
194 return ((fhandler_base
*) dir
->__fh
)->telldir (dir
);
201 return telldir64 (dir
);
205 seekdir64 (DIR *dir
, _off64_t loc
)
208 if (efault
.faulted (EFAULT
))
211 if (dir
->__d_cookie
!= __DIRENT_COOKIE
)
213 dir
->__flags
&= dirent_info_mask
;
214 return ((fhandler_base
*) dir
->__fh
)->seekdir (dir
, loc
);
219 seekdir (DIR *dir
, _off_t loc
)
221 seekdir64 (dir
, (_off64_t
)loc
);
224 /* rewinddir: POSIX 5.1.2.1 */
229 if (efault
.faulted (EFAULT
))
232 if (dir
->__d_cookie
!= __DIRENT_COOKIE
)
234 dir
->__flags
&= dirent_info_mask
;
235 return ((fhandler_base
*) dir
->__fh
)->rewinddir (dir
);
238 /* closedir: POSIX 5.1.2.1 */
243 if (efault
.faulted (EFAULT
))
246 if (dir
->__d_cookie
!= __DIRENT_COOKIE
)
249 syscall_printf ("-1 = closedir (%p)", dir
);
253 /* Reset the marker in case the caller tries to use `dir' again. */
256 int res
= ((fhandler_base
*) dir
->__fh
)->closedir (dir
);
258 cygheap
->fdtab
.release (dir
->__d_fd
);
260 free (dir
->__d_dirname
);
261 free (dir
->__d_dirent
);
263 syscall_printf ("%d = closedir (%p)", res
);
267 /* mkdir: POSIX 5.4.1.1 */
269 mkdir (const char *dir
, mode_t mode
)
272 fhandler_base
*fh
= NULL
;
275 if (efault
.faulted (EFAULT
))
278 if (!(fh
= build_fh_name (dir
, NULL
, PC_SYM_NOFOLLOW
)))
279 goto done
; /* errno already set */;
283 debug_printf ("got %d error from build_fh_name", fh
->error ());
284 set_errno (fh
->error ());
286 else if (has_dot_last_component (dir
, true))
287 set_errno (fh
->exists () ? EEXIST
: ENOENT
);
288 else if (!fh
->mkdir (mode
))
293 syscall_printf ("%d = mkdir (%s, %d)", res
, dir
, mode
);
297 /* rmdir: POSIX 5.5.2.1 */
299 rmdir (const char *dir
)
302 fhandler_base
*fh
= NULL
;
305 if (efault
.faulted (EFAULT
))
308 if (!(fh
= build_fh_name (dir
, NULL
, PC_SYM_NOFOLLOW
)))
309 goto done
; /* errno already set */;
313 debug_printf ("got %d error from build_fh_name", fh
->error ());
314 set_errno (fh
->error ());
316 else if (!fh
->exists ())
318 else if (has_dot_last_component (dir
, false))
320 else if (!fh
->rmdir ())
326 syscall_printf ("%d = rmdir (%s)", res
, dir
);
This page took 0.047558 seconds and 5 git commands to generate.