* Copyright (c) 1991 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
/*static char sccsid[] = "from: @(#)dirent.c 5.1 (Berkeley) 3/7/91";*/
static char rcsid
[] = "dirent.c,v 1.4 1993/08/01 18:58:21 mycroft Exp";
#include "shell.h" /* definitions for pointer, NULL, DIRENT, and BSD */
#ifndef S_ISDIR /* macro to test for directory file */
#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
int stat(char *, struct stat
*);
* The BSD opendir routine doesn't check that what is being opened is a
* directory, so we have to include the check in a wrapper routine.
char *dirname
; /* name of directory */
if (stat(dirname
, &statb
) != 0 || ! S_ISDIR(statb
.st_mode
)) {
return NULL
; /* not a directory */
* Dirent routines for old style file systems.
pointer
malloc(unsigned);
int open(char *, int, ...);
int fstat(int, struct stat
*);
char *dirname
; /* name of directory */
register DIR *dirp
; /* -> malloc'ed storage */
register int fd
; /* file descriptor for read */
struct stat statb
; /* result of fstat() */
fd
= open(dirname
, O_RDONLY
|O_NDELAY
);
fd
= open(dirname
, O_RDONLY
);
return NULL
; /* errno set by open() */
if (fstat(fd
, &statb
) != 0 || !S_ISDIR(statb
.st_mode
)) {
return NULL
; /* not a directory */
if ((dirp
= (DIR *)malloc(sizeof(DIR))) == NULL
) {
return NULL
; /* not enough memory */
dirp
->dd_nleft
= 0; /* refill needed */
register DIR *dirp
; /* stream from opendir() */
return -1; /* invalid pointer */
register DIR *dirp
; /* stream from opendir() */
register struct direct
*dp
;
if ((dirp
->dd_nleft
-= sizeof (struct direct
)) < 0) {
if ((i
= read(dirp
->dd_fd
,
DIRBUFENT
*sizeof(struct direct
))) <= 0) {
errno
= 0; /* unnecessary */
return NULL
; /* EOF or error */
dirp
->dd_loc
= dirp
->dd_buf
;
dirp
->dd_nleft
= i
- sizeof (struct direct
);
} while (dp
->d_ino
== 0);
dirp
->dd_entry
.d_ino
= dp
->d_ino
;
/* now copy the name, nul terminating it */
q
= dirp
->dd_entry
.d_name
;
while (--i
>= 0 && *p
!= '\0')