1 /* @(#)device.h	1.12 03/06/15 Copyright 1995 J. Schilling */
2 /*
3  *	Generic header for users of major(), minor() and makedev()
4  *
5  *	Copyright (c) 1995 J. Schilling
6  */
7 /*
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2, or (at your option)
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along with
19  * this program; see the file COPYING.  If not, write to the Free Software
20  * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21  */
22 
23 #ifndef	_DEVICE_H
24 #define	_DEVICE_H
25 
26 #ifndef _MCONFIG_H
27 #include <mconfig.h>
28 #endif
29 #ifndef _PROTOTYP_H
30 #include <prototyp.h>
31 #endif
32 
33 /*
34  * On generic SVR4, major is a function (defined in sys/mkdev.h).
35  * On Solaris it is defined ...
36  * As we cannot just test if major is #define'd, we have to
37  * define _FOUND_MAJOR_ instead.
38  *
39  * WARNING: Do never include <sys/sysmacros.h> in SVR4, it contains
40  * an old definition for major()/minor() defining 8 minorbits.
41  * Use <sys/mkdev.h> instead.
42  */
43 #ifndef	_INCL_SYS_TYPES_H
44 #include <sys/types.h>
45 #define	_INCL_SYS_TYPES_H
46 #endif
47 /*
48  * Some systems define major in <sys/types.h>.
49  * We are ready...
50  */
51 #ifdef major
52 #	define _FOUND_MAJOR_
53 #endif
54 
55 #ifdef MAJOR_IN_MKDEV
56 #	ifndef	_INCL_SYS_MKDEV_H
57 #	include <sys/mkdev.h>
58 #	define	_INCL_SYS_MKDEV_H
59 #	endif
60 #	define _FOUND_MAJOR_
61 #endif
62 
63 #ifndef _FOUND_MAJOR_
64 #	ifdef MAJOR_IN_SYSMACROS
65 #		ifndef	_INCL_SYS_SYSMACROS_H
66 #		include <sys/sysmacros.h>
67 #		define	_INCL_SYS_SYSMACROS_H
68 #		endif
69 #		define _FOUND_MAJOR_
70 #	endif
71 #endif
72 
73 /*
74  * If we are on HP/UX before HP/UX 8,
75  * major/minor are not in <sys/sysmacros.h>.
76  */
77 #ifndef _FOUND_MAJOR_
78 #	if defined(hpux) || defined(__hpux__) || defined(__hpux)
79 #		ifndef	_INCL_SYS_MKOD_H
80 #		include <sys/mknod.h>
81 #		define	_INCL_SYS_MKOD_H
82 #		endif
83 #		define _FOUND_MAJOR_
84 #	endif
85 #endif
86 
87 #ifdef	__cplusplus
88 extern "C" {
89 #endif
90 
91 /*
92  * For all other systems define major()/minor() here.
93  * XXX Check if this definition will be usefull for ms dos too.
94  */
95 #ifndef _FOUND_MAJOR_
96 #	define major(dev)		(((dev) >> 8) & 0xFF)
97 #	define minor(dev)		((dev) & 0xFF)
98 #	define makedev(majo, mino)	(((majo) << 8) | (mino))
99 #endif
100 
101 /*
102  * Don't pollute namespace...
103  */
104 #undef _FOUND_MAJOR_
105 
106 #ifdef	__XDEV__
107 /*
108  * The following defines are currently only needed for 'star'.
109  * We make it conditional code to avoid to pollute the namespace.
110  */
111 #define	XDEV_T	unsigned long
112 
113 extern	int	minorbits;
114 extern	XDEV_T	minormask;
115 extern	XDEV_T	_dev_mask[];
116 
117 #define	dev_major(dev)			(((XDEV_T)(dev)) >> minorbits)
118 #define	_dev_major(mbits, dev)		(((XDEV_T)(dev)) >> (mbits))
119 
120 #define	dev_minor(dev)			(((XDEV_T)(dev)) & minormask)
121 #define	_dev_minor(mbits, dev)		(((XDEV_T)(dev)) & _dev_mask[(mbits)])
122 
123 
124 #define	dev_make(majo, mino)		((((XDEV_T)(majo)) << minorbits) | \
125 							((XDEV_T)(mino)))
126 #define	_dev_make(mbits, majo, mino)	((((XDEV_T)(majo)) << (mbits) | \
127 							((XDEV_T)(mino)))
128 
129 extern	void	dev_init	__PR((BOOL debug));
130 #ifndef	dev_major
131 extern	XDEV_T	dev_major	__PR((XDEV_T dev));
132 extern	XDEV_T	_dev_major	__PR((int mbits, XDEV_T dev));
133 extern	XDEV_T	dev_minor	__PR((XDEV_T dev));
134 extern	XDEV_T	_dev_minor	__PR((int mbits, XDEV_T dev));
135 extern	XDEV_T	dev_make	__PR((XDEV_T majo, XDEV_T mino));
136 extern	XDEV_T	_dev_make	__PR((int mbits, XDEV_T majo, XDEV_T mino));
137 #endif
138 
139 #endif	/* __XDEV__ */
140 
141 #ifdef	__cplusplus
142 }
143 #endif
144 
145 #endif	/* _DEVICE_H */
146