1*1b8adde7SWilliam Kucharski 2*1b8adde7SWilliam Kucharski /* 3*1b8adde7SWilliam Kucharski * Mach Operating System 4*1b8adde7SWilliam Kucharski * Copyright (c) 1991,1990 Carnegie Mellon University 5*1b8adde7SWilliam Kucharski * All Rights Reserved. 6*1b8adde7SWilliam Kucharski * 7*1b8adde7SWilliam Kucharski * Permission to use, copy, modify and distribute this software and its 8*1b8adde7SWilliam Kucharski * documentation is hereby granted, provided that both the copyright 9*1b8adde7SWilliam Kucharski * notice and this permission notice appear in all copies of the 10*1b8adde7SWilliam Kucharski * software, derivative works or modified versions, and any portions 11*1b8adde7SWilliam Kucharski * thereof, and that both notices appear in supporting documentation. 12*1b8adde7SWilliam Kucharski * 13*1b8adde7SWilliam Kucharski * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 14*1b8adde7SWilliam Kucharski * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 15*1b8adde7SWilliam Kucharski * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 16*1b8adde7SWilliam Kucharski * 17*1b8adde7SWilliam Kucharski * Carnegie Mellon requests users of this software to return to 18*1b8adde7SWilliam Kucharski * 19*1b8adde7SWilliam Kucharski * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 20*1b8adde7SWilliam Kucharski * School of Computer Science 21*1b8adde7SWilliam Kucharski * Carnegie Mellon University 22*1b8adde7SWilliam Kucharski * Pittsburgh PA 15213-3890 23*1b8adde7SWilliam Kucharski * 24*1b8adde7SWilliam Kucharski * any improvements or extensions that they make and grant Carnegie Mellon 25*1b8adde7SWilliam Kucharski * the rights to redistribute these changes. 26*1b8adde7SWilliam Kucharski */ 27*1b8adde7SWilliam Kucharski /* 28*1b8adde7SWilliam Kucharski * Copyright (c) 1982, 1986, 1989 The Regents of the University of California. 29*1b8adde7SWilliam Kucharski * All rights reserved. 30*1b8adde7SWilliam Kucharski * 31*1b8adde7SWilliam Kucharski * Redistribution and use in source and binary forms are permitted 32*1b8adde7SWilliam Kucharski * provided that the above copyright notice and this paragraph are 33*1b8adde7SWilliam Kucharski * duplicated in all such forms and that any documentation, 34*1b8adde7SWilliam Kucharski * advertising materials, and other materials related to such 35*1b8adde7SWilliam Kucharski * distribution and use acknowledge that the software was developed 36*1b8adde7SWilliam Kucharski * by the University of California, Berkeley. The name of the 37*1b8adde7SWilliam Kucharski * University may not be used to endorse or promote products derived 38*1b8adde7SWilliam Kucharski * from this software without specific prior written permission. 39*1b8adde7SWilliam Kucharski * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 40*1b8adde7SWilliam Kucharski * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 41*1b8adde7SWilliam Kucharski * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 42*1b8adde7SWilliam Kucharski * 43*1b8adde7SWilliam Kucharski * @(#)dir.h 7.6 (Berkeley) 5/9/89 44*1b8adde7SWilliam Kucharski */ 45*1b8adde7SWilliam Kucharski 46*1b8adde7SWilliam Kucharski #ifndef _BOOT_UFS_DIR_H_ 47*1b8adde7SWilliam Kucharski #define _BOOT_UFS_DIR_H_ 48*1b8adde7SWilliam Kucharski 49*1b8adde7SWilliam Kucharski /* 50*1b8adde7SWilliam Kucharski * A directory consists of some number of blocks of DIRBLKSIZ 51*1b8adde7SWilliam Kucharski * bytes, where DIRBLKSIZ is chosen such that it can be transferred 52*1b8adde7SWilliam Kucharski * to disk in a single atomic operation (e.g. 512 bytes on most machines). 53*1b8adde7SWilliam Kucharski * 54*1b8adde7SWilliam Kucharski * Each DIRBLKSIZ byte block contains some number of directory entry 55*1b8adde7SWilliam Kucharski * structures, which are of variable length. Each directory entry has 56*1b8adde7SWilliam Kucharski * a struct direct at the front of it, containing its inode number, 57*1b8adde7SWilliam Kucharski * the length of the entry, and the length of the name contained in 58*1b8adde7SWilliam Kucharski * the entry. These are followed by the name padded to a 4 byte boundary 59*1b8adde7SWilliam Kucharski * with null bytes. All names are guaranteed null terminated. 60*1b8adde7SWilliam Kucharski * The maximum length of a name in a directory is MAXNAMLEN. 61*1b8adde7SWilliam Kucharski * 62*1b8adde7SWilliam Kucharski * The macro DIRSIZ(dp) gives the amount of space required to represent 63*1b8adde7SWilliam Kucharski * a directory entry. Free space in a directory is represented by 64*1b8adde7SWilliam Kucharski * entries which have dp->d_reclen > DIRSIZ(dp). All DIRBLKSIZ bytes 65*1b8adde7SWilliam Kucharski * in a directory block are claimed by the directory entries. This 66*1b8adde7SWilliam Kucharski * usually results in the last entry in a directory having a large 67*1b8adde7SWilliam Kucharski * dp->d_reclen. When entries are deleted from a directory, the 68*1b8adde7SWilliam Kucharski * space is returned to the previous entry in the same directory 69*1b8adde7SWilliam Kucharski * block by increasing its dp->d_reclen. If the first entry of 70*1b8adde7SWilliam Kucharski * a directory block is free, then its dp->d_ino is set to 0. 71*1b8adde7SWilliam Kucharski * Entries other than the first in a directory do not normally have 72*1b8adde7SWilliam Kucharski * dp->d_ino set to 0. 73*1b8adde7SWilliam Kucharski */ 74*1b8adde7SWilliam Kucharski #define DIRBLKSIZ DEV_BSIZE 75*1b8adde7SWilliam Kucharski #define MAXNAMLEN 255 76*1b8adde7SWilliam Kucharski 77*1b8adde7SWilliam Kucharski struct direct 78*1b8adde7SWilliam Kucharski { 79*1b8adde7SWilliam Kucharski u_int d_ino; /* inode number of entry */ 80*1b8adde7SWilliam Kucharski u_short d_reclen; /* length of this record */ 81*1b8adde7SWilliam Kucharski u_short d_namlen; /* length of string in d_name */ 82*1b8adde7SWilliam Kucharski char d_name[MAXNAMLEN + 1]; /* name with length <= MAXNAMLEN */ 83*1b8adde7SWilliam Kucharski }; 84*1b8adde7SWilliam Kucharski 85*1b8adde7SWilliam Kucharski /* 86*1b8adde7SWilliam Kucharski * The DIRSIZ macro gives the minimum record length which will hold 87*1b8adde7SWilliam Kucharski * the directory entry. This requires the amount of space in struct direct 88*1b8adde7SWilliam Kucharski * without the d_name field, plus enough space for the name with a terminating 89*1b8adde7SWilliam Kucharski * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary. 90*1b8adde7SWilliam Kucharski */ 91*1b8adde7SWilliam Kucharski #undef DIRSIZ 92*1b8adde7SWilliam Kucharski #define DIRSIZ(dp) \ 93*1b8adde7SWilliam Kucharski ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3)) 94*1b8adde7SWilliam Kucharski 95*1b8adde7SWilliam Kucharski #ifdef KERNEL 96*1b8adde7SWilliam Kucharski /* 97*1b8adde7SWilliam Kucharski * Template for manipulating directories. 98*1b8adde7SWilliam Kucharski * Should use struct direct's, but the name field 99*1b8adde7SWilliam Kucharski * is MAXNAMLEN - 1, and this just won't do. 100*1b8adde7SWilliam Kucharski */ 101*1b8adde7SWilliam Kucharski struct dirtemplate 102*1b8adde7SWilliam Kucharski { 103*1b8adde7SWilliam Kucharski u_int dot_ino; 104*1b8adde7SWilliam Kucharski short dot_reclen; 105*1b8adde7SWilliam Kucharski short dot_namlen; 106*1b8adde7SWilliam Kucharski char dot_name[4]; /* must be multiple of 4 */ 107*1b8adde7SWilliam Kucharski u_int dotdot_ino; 108*1b8adde7SWilliam Kucharski short dotdot_reclen; 109*1b8adde7SWilliam Kucharski short dotdot_namlen; 110*1b8adde7SWilliam Kucharski char dotdot_name[4]; /* ditto */ 111*1b8adde7SWilliam Kucharski }; 112*1b8adde7SWilliam Kucharski #endif 113*1b8adde7SWilliam Kucharski 114*1b8adde7SWilliam Kucharski /* 115*1b8adde7SWilliam Kucharski * The following information should be obtained from <dirent.h> 116*1b8adde7SWilliam Kucharski * and is provided solely (and temporarily) for backward compatibility. 117*1b8adde7SWilliam Kucharski */ 118*1b8adde7SWilliam Kucharski #ifndef KERNEL 119*1b8adde7SWilliam Kucharski #define d_fileno d_ino /* compatibility with POSIX */ 120*1b8adde7SWilliam Kucharski #ifndef DEV_BSIZE 121*1b8adde7SWilliam Kucharski #define DEV_BSIZE 512 122*1b8adde7SWilliam Kucharski #endif 123*1b8adde7SWilliam Kucharski /* 124*1b8adde7SWilliam Kucharski * Definitions for library routines operating on directories. 125*1b8adde7SWilliam Kucharski */ 126*1b8adde7SWilliam Kucharski typedef struct _dirdesc 127*1b8adde7SWilliam Kucharski { 128*1b8adde7SWilliam Kucharski int dd_fd; 129*1b8adde7SWilliam Kucharski int dd_loc; 130*1b8adde7SWilliam Kucharski int dd_size; 131*1b8adde7SWilliam Kucharski char dd_buf[DIRBLKSIZ]; 132*1b8adde7SWilliam Kucharski } 133*1b8adde7SWilliam Kucharski DIR; 134*1b8adde7SWilliam Kucharski 135*1b8adde7SWilliam Kucharski #define dirfd(dirp) ((dirp)->dd_fd) 136*1b8adde7SWilliam Kucharski 137*1b8adde7SWilliam Kucharski #ifndef NULL 138*1b8adde7SWilliam Kucharski #define NULL 0 139*1b8adde7SWilliam Kucharski #endif 140*1b8adde7SWilliam Kucharski extern DIR *opendir (); 141*1b8adde7SWilliam Kucharski extern struct direct *readdir (); 142*1b8adde7SWilliam Kucharski extern int telldir (); 143*1b8adde7SWilliam Kucharski extern void seekdir (); 144*1b8adde7SWilliam Kucharski #define rewinddir(dirp) seekdir((dirp), (long)0) 145*1b8adde7SWilliam Kucharski extern void closedir (); 146*1b8adde7SWilliam Kucharski #endif /* not KERNEL */ 147*1b8adde7SWilliam Kucharski #endif /* _BOOT_UFS_DIR_H_ */ 148