LCOV - code coverage report
Current view: top level - ufs/ext2fs - ext2fs_dir.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 11 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 1 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*      $OpenBSD: ext2fs_dir.h,v 1.11 2014/07/11 07:59:04 pelikan Exp $ */
       2             : /*      $NetBSD: ext2fs_dir.h,v 1.4 2000/01/28 16:00:23 bouyer Exp $    */
       3             : 
       4             : /*
       5             :  * Copyright (c) 1997 Manuel Bouyer.
       6             :  * Copyright (c) 1982, 1986, 1989, 1993
       7             :  *      The Regents of the University of California.  All rights reserved.
       8             :  * (c) UNIX System Laboratories, Inc.
       9             :  * All or some portions of this file are derived from material licensed
      10             :  * to the University of California by American Telephone and Telegraph
      11             :  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
      12             :  * the permission of UNIX System Laboratories, Inc.
      13             :  *
      14             :  * Redistribution and use in source and binary forms, with or without
      15             :  * modification, are permitted provided that the following conditions
      16             :  * are met:
      17             :  * 1. Redistributions of source code must retain the above copyright
      18             :  *    notice, this list of conditions and the following disclaimer.
      19             :  * 2. Redistributions in binary form must reproduce the above copyright
      20             :  *    notice, this list of conditions and the following disclaimer in the
      21             :  *    documentation and/or other materials provided with the distribution.
      22             :  * 3. Neither the name of the University nor the names of its contributors
      23             :  *    may be used to endorse or promote products derived from this software
      24             :  *    without specific prior written permission.
      25             :  *
      26             :  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      27             :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      28             :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      29             :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      30             :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      31             :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      32             :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      33             :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      34             :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      35             :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      36             :  * SUCH DAMAGE.
      37             :  *
      38             :  *      @(#)dir.h       8.4 (Berkeley) 8/10/94
      39             :  * Modified for ext2fs by Manuel Bouyer.
      40             :  */
      41             : 
      42             : #ifndef _EXT2FS_DIR_H_
      43             : #define _EXT2FS_DIR_H_
      44             : 
      45             : /*
      46             :  * Theoretically, directories can be more than 2Gb in length, however, in
      47             :  * practice this seems unlikely. So, we define the type doff_t as a 32-bit
      48             :  * quantity to keep down the cost of doing lookup on a 32-bit machine.
      49             :  */
      50             : #define doff_t          int32_t
      51             : #define EXT2FS_MAXDIRSIZE       (0x7fffffff)
      52             : 
      53             : /*
      54             :  * A directory consists of some number of blocks of e2fs_bsize bytes.
      55             :  *
      56             :  * Each block contains some number of directory entry
      57             :  * structures, which are of variable length.  Each directory entry has
      58             :  * a struct direct at the front of it, containing its inode number,
      59             :  * the length of the entry, and the length of the name contained in
      60             :  * the entry.  These are followed by the name padded to a 4 byte boundary
      61             :  * with null bytes.  All names are guaranteed null terminated.
      62             :  * The maximum length of a name in a directory is EXT2FS_MAXNAMLEN.
      63             :  *
      64             :  * The macro EXT2FS_DIRSIZ(fmt, dp) gives the amount of space required to
      65             :  * represent a directory entry.  Free space in a directory is represented by
      66             :  * entries which have dp->e2d_reclen > DIRSIZ(fmt, dp).  All d2fs_bsize bytes
      67             :  * in a directory block are claimed by the directory entries.  This
      68             :  * usually results in the last entry in a directory having a large
      69             :  * dp->e2d_reclen.  When entries are deleted from a directory, the
      70             :  * space is returned to the previous entry in the same directory
      71             :  * block by increasing its dp->e2d_reclen.  If the first entry of
      72             :  * a directory block is free, then its dp->e2d_ino is set to 0.
      73             :  * Entries other than the first in a directory do not normally have
      74             :  * dp->e2d_ino set to 0.
      75             :  * Ext2 rev 0 has a 16 bits e2d_namlen. For Ext2 rev 1 this has been split
      76             :  * into a 8 bits e2d_namlen and 8 bits e2d_type (looks like ffs, isnt't it ? :)
      77             :  * It's safe to use this for rev 0 as well because all ext2 are little-endian.
      78             :  */
      79             : 
      80             : #define EXT2FS_MAXNAMLEN        255
      81             : 
      82             : struct  ext2fs_direct {
      83             :         u_int32_t e2d_ino;              /* inode number of entry */
      84             :         u_int16_t e2d_reclen;           /* length of this record */
      85             :         u_int8_t e2d_namlen;            /* length of string in d_name */
      86             :         u_int8_t e2d_type;              /* file type */
      87             :         char      e2d_name[EXT2FS_MAXNAMLEN];/* name with length <= EXT2FS_MAXNAMLEN */
      88             : };
      89             : 
      90             : enum slotstatus {
      91             :         NONE,
      92             :         COMPACT,
      93             :         FOUND
      94             : };
      95             : 
      96             : struct ext2fs_searchslot {
      97             :         enum slotstatus slotstatus;
      98             :         doff_t          slotoffset;     /* offset of area with free space */
      99             :         int             slotsize;       /* size of area at slotoffset */
     100             :         int             slotfreespace;  /* amount of space free in slot */
     101             :         int             slotneeded;     /* sizeof the entry we are seeking */
     102             : };
     103             : 
     104             : /* Ext2 directory file types (not the same as FFS. Sigh. */
     105             : #define EXT2_FT_UNKNOWN         0
     106             : #define EXT2_FT_REG_FILE        1
     107             : #define EXT2_FT_DIR             2
     108             : #define EXT2_FT_CHRDEV          3
     109             : #define EXT2_FT_BLKDEV          4
     110             : #define EXT2_FT_FIFO            5
     111             : #define EXT2_FT_SOCK            6
     112             : #define EXT2_FT_SYMLINK         7
     113             : 
     114             : #define EXT2_FT_MAX             8
     115             : 
     116             : #define E2IFTODT(mode)    (((mode) & 0170000) >> 12)
     117             : 
     118             : static __inline__ u_int8_t inot2ext2dt(u_int16_t)
     119             :     __attribute__((__unused__));
     120             : static __inline__ u_int8_t
     121           0 : inot2ext2dt(u_int16_t type)
     122             : {
     123           0 :         switch(type) {
     124             :         case E2IFTODT(EXT2_IFIFO):
     125           0 :                 return EXT2_FT_FIFO;
     126             :         case E2IFTODT(EXT2_IFCHR):
     127           0 :                 return EXT2_FT_CHRDEV;
     128             :         case E2IFTODT(EXT2_IFDIR):
     129           0 :                 return EXT2_FT_DIR;
     130             :         case E2IFTODT(EXT2_IFBLK):
     131           0 :                 return EXT2_FT_BLKDEV;
     132             :         case E2IFTODT(EXT2_IFREG):
     133           0 :                 return EXT2_FT_REG_FILE;
     134             :         case E2IFTODT(EXT2_IFLNK):
     135           0 :                 return EXT2_FT_SYMLINK;
     136             :         case E2IFTODT(EXT2_IFSOCK):
     137           0 :                 return EXT2_FT_SOCK;
     138             :         default:
     139           0 :                 return 0;
     140             :         }
     141           0 : }
     142             : 
     143             : /*
     144             :  * The EXT2FS_DIRSIZ macro gives the minimum record length which will hold
     145             :  * the directory entryfor a name len "len" (without the terminating null byte).
     146             :  * This requires the amount of space in struct direct
     147             :  * without the d_name field, plus enough space for the name without a
     148             :  * terminating null byte, rounded up to a 4 byte boundary.
     149             :  */
     150             : #define EXT2FS_DIRSIZ(len) \
     151             :    (( 8 + len + 3) &~ 3)
     152             : 
     153             : /*
     154             :  * Template for manipulating directories.  Should use struct direct's,
     155             :  * but the name field is EXT2FS_MAXNAMLEN - 1, and this just won't do.
     156             :  */
     157             : struct ext2fs_dirtemplate {
     158             :         u_int32_t       dot_ino;
     159             :         int16_t         dot_reclen;
     160             :         u_int8_t        dot_namlen;
     161             :         u_int8_t        dot_type;
     162             :         char            dot_name[4];    /* must be multiple of 4 */
     163             :         u_int32_t       dotdot_ino;
     164             :         int16_t         dotdot_reclen;
     165             :         u_int8_t        dotdot_namlen;
     166             :         u_int8_t        dotdot_type;
     167             :         char            dotdot_name[4]; /* ditto */
     168             : };
     169             : 
     170             : #endif /* !_EXT2FS_DIR_H_ */

Generated by: LCOV version 1.13