1 /* ========================================================================
2 * Copyright 1988-2006 University of Washington
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
11 * ========================================================================
15 * Program: Read directories
17 * Author: Mark Crispin
18 * Networks and Distributed Computing
19 * Computing & Communications
20 * University of Washington
21 * Administration Building, AG-44
23 * Internet: MRC@CAC.Washington.EDU
25 * Date: 16 December 1993
26 * Last Edited: 30 August 2006
29 /* Emulator for BSD opendir() call
30 * Accepts: directory name
31 * Returns: directory structure pointer
34 DIR *opendir (char *name
)
38 int fd
= open (name
,O_RDONLY
,NIL
);
39 errno
= ENOTDIR
; /* default error is bogus directory */
40 if ((fd
>= 0) && !(fstat (fd
,&sbuf
)) && ((sbuf
.st_mode
&S_IFMT
) == S_IFDIR
)) {
41 d
= (DIR *) fs_get (sizeof (DIR));
42 /* initialize structure */
44 read (fd
,d
->dd_buf
= (char *) fs_get (sbuf
.st_size
),
45 d
->dd_size
= sbuf
.st_size
);
47 else if (d
) fs_give ((void **) &d
);
48 if (fd
>= 0) close (fd
);
53 /* Emulator for BSD closedir() call
54 * Accepts: directory structure pointer
60 fs_give ((void **) &(d
->dd_buf
));
61 fs_give ((void **) &d
);
62 return NIL
; /* return */
66 /* Emulator for BSD readdir() call
67 * Accepts: directory structure pointer
70 struct direct
*readdir (DIR *d
)
72 /* loop through directory */
73 while (d
->dd_loc
< d
->dd_size
) {
74 struct direct
*dp
= (struct direct
*) (d
->dd_buf
+ d
->dd_loc
);
75 d
->dd_loc
+= sizeof (struct direct
);
76 if (dp
->d_ino
) return dp
; /* if have a good entry return it */
78 return NIL
; /* all done */