master
  1/*	$NetBSD: dirent.h,v 1.30 2016/01/22 23:31:30 dholland Exp $	*/
  2
  3/*-
  4 * Copyright (c) 1989, 1993
  5 *	The Regents of the University of California.  All rights reserved.
  6 *
  7 * Redistribution and use in source and binary forms, with or without
  8 * modification, are permitted provided that the following conditions
  9 * are met:
 10 * 1. Redistributions of source code must retain the above copyright
 11 *    notice, this list of conditions and the following disclaimer.
 12 * 2. Redistributions in binary form must reproduce the above copyright
 13 *    notice, this list of conditions and the following disclaimer in the
 14 *    documentation and/or other materials provided with the distribution.
 15 * 3. Neither the name of the University nor the names of its contributors
 16 *    may be used to endorse or promote products derived from this software
 17 *    without specific prior written permission.
 18 *
 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 29 * SUCH DAMAGE.
 30 *
 31 *	@(#)dirent.h	8.3 (Berkeley) 8/10/94
 32 */
 33
 34#ifndef _SYS_DIRENT_H_
 35#define _SYS_DIRENT_H_
 36
 37#include <sys/cdefs.h>
 38#include <sys/featuretest.h>
 39
 40/*
 41 * The dirent structure defines the format of directory entries returned by
 42 * the getdents(2) system call.
 43 *
 44 * A directory entry has a struct dirent at the front of it, containing its
 45 * inode number, the length of the entry, and the length of the name
 46 * contained in the entry.  These are followed by the name padded to 
 47 * _DIRENT_ALIGN() byte boundary with null bytes.  All names are guaranteed
 48 * NUL terminated.  The maximum length of a name in a directory is MAXNAMLEN.
 49 */
 50struct dirent {
 51	ino_t d_fileno;			/* file number of entry */
 52	uint16_t d_reclen;		/* length of this record */
 53	uint16_t d_namlen;		/* length of string in d_name */
 54	uint8_t  d_type; 		/* file type, see below */
 55#if defined(_NETBSD_SOURCE)
 56#define	MAXNAMLEN	511		/* must be kept in sync with NAME_MAX */
 57	char	d_name[MAXNAMLEN + 1];	/* name must be no longer than this */
 58#else
 59	char	d_name[511 + 1];	/* name must be no longer than this */
 60#endif
 61};
 62
 63#if defined(_NETBSD_SOURCE)
 64/*
 65 * File types
 66 */
 67#define	DT_UNKNOWN	 0
 68#define	DT_FIFO		 1
 69#define	DT_CHR		 2
 70#define	DT_DIR		 4
 71#define	DT_BLK		 6
 72#define	DT_REG		 8
 73#define	DT_LNK		10
 74#define	DT_SOCK		12
 75#define	DT_WHT		14
 76
 77/*
 78 * Caution: the following macros are used by the ufs/ffs code on ffs's
 79 * struct direct as well as the exposed struct dirent. The two
 80 * structures are not the same, so it's important (until ufs is fixed,
 81 * XXX) that the macro definitions remain type-polymorphic.
 82 */
 83
 84/*
 85 * The _DIRENT_ALIGN macro returns the alignment of struct dirent.
 86 * struct direct and struct dirent12 used 4 byte alignment but
 87 * struct dirent uses 8.
 88 */
 89#define _DIRENT_ALIGN(dp) (sizeof((dp)->d_fileno) - 1)
 90/*
 91 * The _DIRENT_NAMEOFF macro returns the offset of the d_name field in 
 92 * struct dirent
 93 */
 94#if __GNUC_PREREQ__(4, 0)
 95#define	_DIRENT_NAMEOFF(dp)	__builtin_offsetof(__typeof__(*(dp)), d_name)
 96#else
 97#define _DIRENT_NAMEOFF(dp) \
 98    ((char *)(void *)&(dp)->d_name - (char *)(void *)dp)
 99#endif
100/*
101 * The _DIRENT_RECLEN macro gives the minimum record length which will hold
102 * a name of size "namlen".  This requires the amount of space in struct dirent
103 * without the d_name field, plus enough space for the name with a terminating
104 * null byte (namlen+1), rounded up to a the appropriate byte boundary.
105 */
106#define _DIRENT_RECLEN(dp, namlen) \
107    ((_DIRENT_NAMEOFF(dp) + (namlen) + 1 + _DIRENT_ALIGN(dp)) & \
108    ~_DIRENT_ALIGN(dp))
109/*
110 * The _DIRENT_SIZE macro returns the minimum record length required for
111 * name name stored in the current record.
112 */
113#define	_DIRENT_SIZE(dp) _DIRENT_RECLEN(dp, (dp)->d_namlen)
114/*
115 * The _DIRENT_NEXT macro advances to the next dirent record.
116 */
117#define _DIRENT_NEXT(dp) ((void *)((char *)(void *)(dp) + (dp)->d_reclen))
118/*
119 * The _DIRENT_MINSIZE returns the size of an empty (invalid) record.
120 */
121#define _DIRENT_MINSIZE(dp) _DIRENT_RECLEN(dp, 0)
122
123/*
124 * Convert between stat structure types and directory types.
125 */
126#define	IFTODT(mode)	(((mode) & 0170000) >> 12)
127#define	DTTOIF(dirtype)	((dirtype) << 12)
128#endif
129
130#endif	/* !_SYS_DIRENT_H_ */