#if !defined(__sys_dir_h)
#define __sys_dir_h

#if !defined(_NO_IDENTS) && defined(_HEAD_IDENTS)
# pragma ident "@(#)head:sys/dir.h	1.10 91/07/10 {Apple version 3.0 90/11/29 11:37:56}"
#endif

/*
 * Copyright 1987-91 Apple Computer, Inc.
 * All Rights Reserved.
 *
 * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF APPLE COMPUTER, INC.
 * The copyright notice above does not evidence any actual or
 * intended publication of such source code.
 */

/* Copyright 1983-87 Sun Microsystems, Inc. */
/* Copyright 1980-87 The Regents of the University of California */

/*
 * [ANSI C] ANSI X3.159-1989 (3.5.4.3) Function Declarators
 * [POSIX]  IEEE Std 1003.1-1988 (5.1) Directories
 */

#if !defined(__sys_types_h)
# if defined(__MPW_C__)
#   include "/:usr:include:sys:types.h"
# else
#   include <sys/types.h>
# endif
#endif

#if defined(_BSD_SOURCE)
 /*
  * A directory consists of some number of blocks each of which is
  * less than or equal to the filesystem block size number of
  * bytes.
  *
  * Each block contains some number of directory entry structures,
  * which are of variable length.  Each directory entry has
  * a struct direct at the front of it, containing its file number,
  * the length of the entry, and the length of the name contained in
  * the entry.  These are followed by the name padded to a 4 byte boundary
  * with null bytes.  All names are guaranteed null terminated.
  * The maximum length of a name in a directory is MAXNAMLEN, plus
  * a null byte.
  *
  * The macro DIRSIZ(dp) gives the amount of space required to represent
  * a directory entry.  Free space in a directory is represented by
  * entries which have dp->d_reclen > DIRSIZ(dp).
  *
  * All the bytes in a directory block are claimed by the directory entries.
  * This usually results in the last entry in a directory having a large
  * dp->d_reclen.  Free entries have their dp->d_fileno set to 0.
  */

#define DIRBLKSIZ	512
#define MAXNAMLEN	255

struct	direct {
	u_long	d_fileno;		/* file number of entry */
	u_short	d_reclen;		/* length of this record */
	u_short	d_namlen;		/* length of string in d_name */
	char	d_name[MAXNAMLEN + 1];	/* name (up to MAXNAMLEN + 1) */
};

#if !defined(KERNEL)
/*
 * The DIRSIZ macro gives the minimum record length which will hold
 * the directory entry.  This requires the amount of space in 'struct
 * direct' without the d_name field, plus enough space for the name with
 * a terminating null byte (dp->d_namlen+1), rounded up to a 4 byte
 * boundary.
 */
#define DIRSIZ(dp) ((sizeof (struct direct) - \
      (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))

#if !defined(NULL)
#define NULL 0
#endif

#endif /* !KERNEL */
#endif /* _BSD_SOURCE */

#if defined(_SYSV_SOURCE) || defined(_POSIX_SOURCE)
/*
 * System-wide file name maximum (MAXNAMLEN isn't ANSC-compliant).
 * Individual file systems (directories?) may impose smaller limits,
 * e.g., System V uses 14 single-byte characters, but _SYS_NAME_MAX
 * is the largest value that can be handled by the directory routines.
 */
#define _SYS_NAME_MAX	255

struct  dirent {
	unsigned long	d_ino;			/* file number of entry */
	unsigned short	d_reclen;               /* length of this record */
	unsigned short	d_namlen;               /* length of string in d_name */
	char	d_name[_SYS_NAME_MAX + 1];	/* name with terminating NULL */
};
#endif /* _SYSV_SOURCE || _POSIX_SOURCE */

/*
 * Definitions for library routines operating on directories.
 */
typedef struct __dirdesc {
	int	dd_fd;
	long	dd_loc;
	long	dd_size;
	long	dd_bbase;
	long	dd_entno;
	long	dd_bsize;
	char	*dd_buf;
} DIR;

#if defined(__STDC__)
  long telldir(DIR *dirp);
  long seekdir(DIR *dirp, long loc);
  DIR *opendir(const char *dirname);
#else
  long telldir();
  void seekdir();
  DIR *opendir();
#endif

/*
 * Place conflicting definitions here.
 */
#if defined(__dirent_h)
/*
 * Came through the <dirent.h> entry point, assume POSIX/SVR3 interface.
 */
#if defined(_POSIX_SOURCE) || defined(_SYSV_SOURCE)

#if defined(__STDC__)
  struct dirent *readdir(DIR *dirp);
  int closedir(DIR *dirp);
#else
  struct dirent *readdir();
  int closedir();
#endif

#endif /* _POSIX_SOURCE || _SYSV_SOURCE */

#if defined(_POSIX_SOURCE)
#if defined(__STDC__)
  void rewinddir(DIR *dirp);
#else
  void rewinddir();
#endif
#endif /* _POSIX_SOURCE */

#else /* !__dirent_h */

/*
 * Else use the BSD interface (the original implementation).
 */
#if defined(_BSD_SOURCE)
#define d_ino d_fileno		/* compatablity */
#if !defined(KERNEL)

#if defined(__STDC__)
  void closedir(DIR *dirp);
  struct direct *readdir(DIR *dirp);
#else
  void closedir();
  struct direct *readdir();
#endif

#endif /* !KERNEL */
#endif /* _BSD_SOURCE */
#endif /* __dirent_h */

#if defined(_BSD_SOURCE) || defined (_SYSV_SOURCE)
#if !defined(KERNEL)
#define rewinddir(dirp) seekdir((dirp), (long)0)
#endif /* !KERNEL */
#endif

#endif /* __sys_dir_h */