[BACK]Return to dir.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / ufs / ufs

Annotation of src/sys/ufs/ufs/dir.h, Revision 1.20.74.1

1.20.74.1! yamt        1: /*     $NetBSD: dir.h,v 1.20 2005/12/11 12:25:28 christos Exp $        */
1.5       mycroft     2:
1.1       mycroft     3: /*
                      4:  * Copyright (c) 1982, 1986, 1989, 1993
                      5:  *     The Regents of the University of California.  All rights reserved.
                      6:  * (c) UNIX System Laboratories, Inc.
                      7:  * All or some portions of this file are derived from material licensed
                      8:  * to the University of California by American Telephone and Telegraph
                      9:  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
                     10:  * the permission of UNIX System Laboratories, Inc.
                     11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above copyright
                     18:  *    notice, this list of conditions and the following disclaimer in the
                     19:  *    documentation and/or other materials provided with the distribution.
1.17      agc        20:  * 3. Neither the name of the University nor the names of its contributors
1.1       mycroft    21:  *    may be used to endorse or promote products derived from this software
                     22:  *    without specific prior written permission.
                     23:  *
                     24:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     25:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     26:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     27:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     28:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     29:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     30:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     31:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     32:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     33:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     34:  * SUCH DAMAGE.
                     35:  *
1.9       fvdl       36:  *     @(#)dir.h       8.5 (Berkeley) 4/27/95
1.1       mycroft    37:  */
                     38:
1.15      matt       39: #ifndef _UFS_UFS_DIR_H_
                     40: #define        _UFS_UFS_DIR_H_
1.6       cgd        41:
                     42: /*
1.20.74.1! yamt       43:  * Theoretically, directories can be more than 2Gb in length; however, in
1.6       cgd        44:  * practice this seems unlikely. So, we define the type doff_t as a 32-bit
                     45:  * quantity to keep down the cost of doing lookup on a 32-bit machine.
1.9       fvdl       46:  */
1.6       cgd        47: #define        doff_t          int32_t
                     48: #define        MAXDIRSIZE      (0x7fffffff)
1.1       mycroft    49:
                     50: /*
1.4       mycroft    51:  * A directory consists of some number of blocks of DIRBLKSIZ
                     52:  * bytes, where DIRBLKSIZ is chosen such that it can be transferred
                     53:  * to disk in a single atomic operation (e.g. 512 bytes on most machines).
1.1       mycroft    54:  *
                     55:  * Each DIRBLKSIZ byte block contains some number of directory entry
1.4       mycroft    56:  * structures, which are of variable length.  Each directory entry has
                     57:  * a struct direct at the front of it, containing its inode number,
                     58:  * the length of the entry, and the length of the name contained in
1.16      christos   59:  * the entry.  These are followed by the name padded to a 4 byte boundary.
                     60:  * All names are guaranteed null terminated.
1.19      christos   61:  * The maximum length of a name in a directory is FFS_MAXNAMLEN.
1.1       mycroft    62:  *
                     63:  * The macro DIRSIZ(fmt, dp) gives the amount of space required to represent
1.4       mycroft    64:  * a directory entry.  Free space in a directory is represented by
                     65:  * entries which have dp->d_reclen > DIRSIZ(fmt, dp).  All DIRBLKSIZ bytes
                     66:  * in a directory block are claimed by the directory entries.  This
                     67:  * usually results in the last entry in a directory having a large
                     68:  * dp->d_reclen.  When entries are deleted from a directory, the
                     69:  * space is returned to the previous entry in the same directory
                     70:  * block by increasing its dp->d_reclen.  If the first entry of
                     71:  * a directory block is free, then its dp->d_ino is set to 0.
                     72:  * Entries other than the first in a directory do not normally have
                     73:  * dp->d_ino set to 0.
1.1       mycroft    74:  */
1.13      lukem      75: #undef DIRBLKSIZ
                     76: #define        DIRBLKSIZ       DEV_BSIZE
1.19      christos   77: #define        FFS_MAXNAMLEN   255
1.14      dbj        78: #define APPLEUFS_DIRBLKSIZ 1024
1.1       mycroft    79:
1.18      christos   80: #define d_ino d_fileno
1.1       mycroft    81: struct direct {
1.18      christos   82:        u_int32_t d_fileno;             /* inode number of entry */
1.4       mycroft    83:        u_int16_t d_reclen;             /* length of this record */
                     84:        u_int8_t  d_type;               /* file type, see below */
                     85:        u_int8_t  d_namlen;             /* length of string in d_name */
1.19      christos   86:        char      d_name[FFS_MAXNAMLEN + 1];/* name with length <= FFS_MAXNAMLEN */
1.1       mycroft    87: };
                     88:
                     89: /*
                     90:  * File types
                     91:  */
                     92: #define        DT_UNKNOWN       0
                     93: #define        DT_FIFO          1
                     94: #define        DT_CHR           2
                     95: #define        DT_DIR           4
                     96: #define        DT_BLK           6
                     97: #define        DT_REG           8
                     98: #define        DT_LNK          10
                     99: #define        DT_SOCK         12
1.4       mycroft   100: #define        DT_WHT          14
1.1       mycroft   101:
                    102: /*
                    103:  * Convert between stat structure types and directory types.
                    104:  */
                    105: #define        IFTODT(mode)    (((mode) & 0170000) >> 12)
                    106: #define        DTTOIF(dirtype) ((dirtype) << 12)
                    107:
                    108: /*
                    109:  * The DIRSIZ macro gives the minimum record length which will hold
                    110:  * the directory entry.  This requires the amount of space in struct direct
                    111:  * without the d_name field, plus enough space for the name with a terminating
                    112:  * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary.
                    113:  */
1.11      lukem     114: #define        DIRECTSIZ(namlen) \
1.19      christos  115:        ((sizeof(struct direct) - (FFS_MAXNAMLEN+1)) + (((namlen)+1 + 3) &~ 3))
1.11      lukem     116:
1.1       mycroft   117: #if (BYTE_ORDER == LITTLE_ENDIAN)
1.11      lukem     118: #define DIRSIZ(oldfmt, dp, needswap)   \
                    119:     (((oldfmt) && !(needswap)) ?       \
                    120:     DIRECTSIZ((dp)->d_type) : DIRECTSIZ((dp)->d_namlen))
1.1       mycroft   121: #else
1.11      lukem     122: #define DIRSIZ(oldfmt, dp, needswap)   \
                    123:     (((oldfmt) && (needswap)) ?                \
                    124:     DIRECTSIZ((dp)->d_type) : DIRECTSIZ((dp)->d_namlen))
1.1       mycroft   125: #endif
1.11      lukem     126:
1.1       mycroft   127: #define OLDDIRFMT      1
                    128: #define NEWDIRFMT      0
                    129:
                    130: /*
1.3       cgd       131:  * Template for manipulating directories.  Should use struct direct's,
1.19      christos  132:  * but the name field is FFS_MAXNAMLEN - 1, and this just won't do.
1.1       mycroft   133:  */
                    134: struct dirtemplate {
1.3       cgd       135:        u_int32_t       dot_ino;
                    136:        int16_t         dot_reclen;
                    137:        u_int8_t        dot_type;
                    138:        u_int8_t        dot_namlen;
1.4       mycroft   139:        char            dot_name[4];    /* must be multiple of 4 */
1.3       cgd       140:        u_int32_t       dotdot_ino;
                    141:        int16_t         dotdot_reclen;
                    142:        u_int8_t        dotdot_type;
                    143:        u_int8_t        dotdot_namlen;
1.4       mycroft   144:        char            dotdot_name[4]; /* ditto */
1.1       mycroft   145: };
                    146:
                    147: /*
                    148:  * This is the old format of directories, sanz type element.
                    149:  */
                    150: struct odirtemplate {
1.3       cgd       151:        u_int32_t       dot_ino;
                    152:        int16_t         dot_reclen;
                    153:        u_int16_t       dot_namlen;
1.4       mycroft   154:        char            dot_name[4];    /* must be multiple of 4 */
1.3       cgd       155:        u_int32_t       dotdot_ino;
                    156:        int16_t         dotdot_reclen;
                    157:        u_int16_t       dotdot_namlen;
1.4       mycroft   158:        char            dotdot_name[4]; /* ditto */
1.1       mycroft   159: };
1.15      matt      160: #endif /* !_UFS_UFS_DIR_H_ */

CVSweb <webmaster@jp.NetBSD.org>