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