1 /* @(#)device.h	1.21 21/07/19 Copyright 1995-2021 J. Schilling */
2 /*
3  *	Generic header for users of major(), minor() and makedev()
4  *
5  *	Copyright (c) 1995-2021 J. Schilling
6  */
7 /*
8  * The contents of this file are subject to the terms of the
9  * Common Development and Distribution License, Version 1.0 only
10  * (the "License").  You may not use this file except in compliance
11  * with the License.
12  *
13  * See the file CDDL.Schily.txt in this distribution for details.
14  * A copy of the CDDL is also available via the Internet at
15  * http://www.opensource.org/licenses/cddl1.txt
16  *
17  * When distributing Covered Code, include this CDDL HEADER in each
18  * file and include the License file CDDL.Schily.txt from this distribution.
19  */
20 
21 #ifndef	_SCHILY_DEVICE_H
22 #define	_SCHILY_DEVICE_H
23 
24 #ifndef _SCHILY_MCONFIG_H
25 #include <schily/mconfig.h>
26 #endif
27 
28 /*
29  * On generic SVR4, major is a function (defined in sys/mkdev.h).
30  * On Solaris it is defined ...
31  * As we cannot just test if major is #define'd, we have to
32  * define _FOUND_MAJOR_ instead.
33  *
34  * WARNING: Do never include <sys/sysmacros.h> in SVR4, it contains
35  * an old definition for major()/minor() defining 8 minorbits.
36  * Use <sys/mkdev.h> instead.
37  */
38 #ifndef	_SCHILY_TYPES_H
39 #include <schily/types.h>
40 #endif
41 #ifndef	_SCHILY_STDINT_H
42 #include <schily/stdint.h>
43 #endif
44 
45 /*
46  * Some systems define major in <sys/types.h>.
47  * We are ready...
48  */
49 #ifdef major
50 #	define _FOUND_MAJOR_
51 #endif
52 
53 #ifdef MAJOR_IN_MKDEV
54 #	ifndef	_INCL_SYS_MKDEV_H
55 #	include <sys/mkdev.h>
56 #	define	_INCL_SYS_MKDEV_H
57 #	endif
58 	/*
59 	 * Interix doesn't use makedev(); it uses mkdev()
60 	 */
61 #	if !defined(makedev) && defined(mkdev)
62 #		define makedev(a, b)	mkdev((a), (b))
63 #	endif
64 #	define _FOUND_MAJOR_
65 #endif
66 
67 #ifndef _FOUND_MAJOR_
68 #	ifdef MAJOR_IN_SYSMACROS
69 #		ifndef	_INCL_SYS_SYSMACROS_H
70 #		include <sys/sysmacros.h>
71 #		define	_INCL_SYS_SYSMACROS_H
72 #		endif
73 #		define _FOUND_MAJOR_
74 #	endif
75 #endif
76 
77 /*
78  * If we are on HP/UX before HP/UX 8,
79  * major/minor are not in <sys/sysmacros.h>.
80  */
81 #ifndef _FOUND_MAJOR_
82 #	if defined(hpux) || defined(__hpux__) || defined(__hpux)
83 #		ifndef	_INCL_SYS_MKOD_H
84 #		include <sys/mknod.h>
85 #		define	_INCL_SYS_MKOD_H
86 #		endif
87 #		define _FOUND_MAJOR_
88 #	endif
89 #endif
90 
91 #ifndef	_FOUND_MAJOR_
92 #	if	defined(OS390) || defined(__MVS__)
93 #		include <sys/stat.h>
94 #		define major(dev)		S_MAJOR(dev)
95 #		define minor(dev)		S_MINOR(dev)
96 #		define makedev(majo, mino)	(((majo) << 16) | (mino))
97 #		define _FOUND_MAJOR_
98 #	endif /* z/OS */
99 #endif /* _FOUND_MAJOR_ */
100 
101 #ifndef	_FOUND_MAJOR_
102 #	ifdef VMS
103 #		define major(dev)		(((((long)dev) >> 8) & 0xFF))
104 #		define minor(dev)		((((long)dev) & 0xFF))
105 #		define makedev(majo, mino)	(((majo) << 8) | (mino))
106 #		define _FOUND_MAJOR_
107 #	endif /* VMS */
108 #endif /* _FOUND_MAJOR_ */
109 
110 #ifdef	__cplusplus
111 extern "C" {
112 #endif
113 
114 /*
115  * For all other systems define major()/minor() here.
116  * XXX Check if this definition will be usefull for ms dos too.
117  */
118 #ifndef _FOUND_MAJOR_
119 #	define major(dev)		(((dev) >> 8) & 0xFF)
120 #	define minor(dev)		((dev) & 0xFF)
121 #	define makedev(majo, mino)	(((majo) << 8) | (mino))
122 #endif
123 
124 /*
125  * Don't pollute namespace...
126  */
127 #undef _FOUND_MAJOR_
128 
129 #ifdef	__XDEV__
130 /*
131  * The following defines are currently only needed for 'star'.
132  * We make it conditional code to avoid to pollute the namespace.
133  */
134 #define	XDEV_T	Ullong
135 
136 extern	int	minorbits;
137 extern	XDEV_T	minormask;
138 extern	XDEV_T	_dev_mask[];
139 
140 #define	dev_major(dev)			(((XDEV_T)(dev)) >> minorbits)
141 #define	_dev_major(mbits, dev)		(((XDEV_T)(dev)) >> (mbits))
142 
143 #define	dev_minor(dev)			(((XDEV_T)(dev)) & minormask)
144 #define	_dev_minor(mbits, dev)		(((XDEV_T)(dev)) & _dev_mask[(mbits)])
145 
146 
147 #define	dev_make(majo, mino)		((((XDEV_T)(majo)) << minorbits) | \
148 							((XDEV_T)(mino)))
149 #define	_dev_make(mbits, majo, mino)	((((XDEV_T)(majo)) << (mbits)) | \
150 							((XDEV_T)(mino)))
151 
152 extern	void	dev_init	__PR((BOOL debug));
153 #ifndef	dev_major
154 extern	XDEV_T	dev_major	__PR((XDEV_T dev));
155 extern	XDEV_T	_dev_major	__PR((int mbits, XDEV_T dev));
156 extern	XDEV_T	dev_minor	__PR((XDEV_T dev));
157 extern	XDEV_T	_dev_minor	__PR((int mbits, XDEV_T dev));
158 extern	XDEV_T	dev_make	__PR((XDEV_T majo, XDEV_T mino));
159 extern	XDEV_T	_dev_make	__PR((int mbits, XDEV_T majo, XDEV_T mino));
160 #endif
161 
162 #endif	/* __XDEV__ */
163 
164 #ifdef	__cplusplus
165 }
166 #endif
167 
168 #endif	/* _SCHILY_DEVICE_H */
169