xref: /illumos-gate/usr/src/grub/grub-0.97/stage2/dir.h (revision 1b8adde7ba7d5e04395c141c5400dc2cffd7d809)
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