| |
| /* |
| * Mach Operating System |
| * Copyright (c) 1991,1990 Carnegie Mellon University |
| * All Rights Reserved. |
| * |
| * Permission to use, copy, modify and distribute this software and its |
| * documentation is hereby granted, provided that both the copyright |
| * notice and this permission notice appear in all copies of the |
| * software, derivative works or modified versions, and any portions |
| * thereof, and that both notices appear in supporting documentation. |
| * |
| * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" |
| * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR |
| * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. |
| * |
| * Carnegie Mellon requests users of this software to return to |
| * |
| * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU |
| * School of Computer Science |
| * Carnegie Mellon University |
| * Pittsburgh PA 15213-3890 |
| * |
| * any improvements or extensions that they make and grant Carnegie Mellon |
| * the rights to redistribute these changes. |
| */ |
| /* |
| * Copyright (c) 1982, 1986, 1989 The Regents of the University of California. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms are permitted |
| * provided that the above copyright notice and this paragraph are |
| * duplicated in all such forms and that any documentation, |
| * advertising materials, and other materials related to such |
| * distribution and use acknowledge that the software was developed |
| * by the University of California, Berkeley. The name of the |
| * University may not be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
| * |
| * @(#)dir.h 7.6 (Berkeley) 5/9/89 |
| */ |
| |
| #ifndef _BOOT_UFS_DIR_H_ |
| #define _BOOT_UFS_DIR_H_ |
| |
| /* |
| * A directory consists of some number of blocks of DIRBLKSIZ |
| * bytes, where DIRBLKSIZ is chosen such that it can be transferred |
| * to disk in a single atomic operation (e.g. 512 bytes on most machines). |
| * |
| * Each DIRBLKSIZ byte block contains some number of directory entry |
| * structures, which are of variable length. Each directory entry has |
| * a struct direct at the front of it, containing its inode number, |
| * the length of the entry, and the length of the name contained in |
| * the entry. These are followed by the name padded to a 4 byte boundary |
| * with null bytes. All names are guaranteed null terminated. |
| * The maximum length of a name in a directory is MAXNAMLEN. |
| * |
| * The macro DIRSIZ(dp) gives the amount of space required to represent |
| * a directory entry. Free space in a directory is represented by |
| * entries which have dp->d_reclen > DIRSIZ(dp). All DIRBLKSIZ bytes |
| * in a directory block are claimed by the directory entries. This |
| * usually results in the last entry in a directory having a large |
| * dp->d_reclen. When entries are deleted from a directory, the |
| * space is returned to the previous entry in the same directory |
| * block by increasing its dp->d_reclen. If the first entry of |
| * a directory block is free, then its dp->d_ino is set to 0. |
| * Entries other than the first in a directory do not normally have |
| * dp->d_ino set to 0. |
| */ |
| #define DIRBLKSIZ DEV_BSIZE |
| #define MAXNAMLEN 255 |
| |
| struct direct |
| { |
| u_int d_ino; /* inode number of entry */ |
| u_short d_reclen; /* length of this record */ |
| u_short d_namlen; /* length of string in d_name */ |
| char d_name[MAXNAMLEN + 1]; /* name with length <= MAXNAMLEN */ |
| }; |
| |
| /* |
| * The DIRSIZ macro gives the minimum record length which will hold |
| * the directory entry. This requires the amount of space in struct direct |
| * without the d_name field, plus enough space for the name with a terminating |
| * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary. |
| */ |
| #undef DIRSIZ |
| #define DIRSIZ(dp) \ |
| ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3)) |
| |
| #ifdef KERNEL |
| /* |
| * Template for manipulating directories. |
| * Should use struct direct's, but the name field |
| * is MAXNAMLEN - 1, and this just won't do. |
| */ |
| struct dirtemplate |
| { |
| u_int dot_ino; |
| short dot_reclen; |
| short dot_namlen; |
| char dot_name[4]; /* must be multiple of 4 */ |
| u_int dotdot_ino; |
| short dotdot_reclen; |
| short dotdot_namlen; |
| char dotdot_name[4]; /* ditto */ |
| }; |
| #endif |
| |
| /* |
| * The following information should be obtained from <dirent.h> |
| * and is provided solely (and temporarily) for backward compatibility. |
| */ |
| #ifndef KERNEL |
| #define d_fileno d_ino /* compatibility with POSIX */ |
| #ifndef DEV_BSIZE |
| #define DEV_BSIZE 512 |
| #endif |
| /* |
| * Definitions for library routines operating on directories. |
| */ |
| typedef struct _dirdesc |
| { |
| int dd_fd; |
| int dd_loc; |
| int dd_size; |
| char dd_buf[DIRBLKSIZ]; |
| } |
| DIR; |
| |
| #define dirfd(dirp) ((dirp)->dd_fd) |
| |
| #ifndef NULL |
| #define NULL 0 |
| #endif |
| extern DIR *opendir (); |
| extern struct direct *readdir (); |
| extern int telldir (); |
| extern void seekdir (); |
| #define rewinddir(dirp) seekdir((dirp), (long)0) |
| extern void closedir (); |
| #endif /* not KERNEL */ |
| #endif /* _BOOT_UFS_DIR_H_ */ |