import less(1)
[unleashed/tickless.git] / usr / src / lib / libc / port / gen / mkdev.c
blobfe804e49f3a7f233f455384c616e5837403da9b6
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1988 AT&T */
28 /* All Rights Reserved */
30 #pragma ident "%Z%%M% %I% %E% SMI"
32 #include "lint.h"
33 #include <sys/types.h>
34 #include <sys/mkdev.h>
35 #include <errno.h>
38 * Create a formatted device number
40 dev_t
41 __makedev(const int version, const major_t majdev, const minor_t mindev)
43 dev_t devnum;
44 switch (version) {
45 case OLDDEV:
46 if (majdev > OMAXMAJ || mindev > OMAXMIN) {
47 errno = EINVAL;
48 return ((o_dev_t)NODEV);
50 devnum = ((majdev << ONBITSMINOR) | mindev);
51 break;
53 case NEWDEV:
54 #if MAXMAJ != 0xfffffffful /* assumes major_t == uint32_t */
55 if (majdev > MAXMAJ) {
56 errno = EINVAL;
57 return (NODEV);
59 #endif
60 #if MAXMIN != 0xfffffffful /* assumes minor_t == uint32_t */
61 if (mindev > MAXMIN) {
62 errno = EINVAL;
63 return (NODEV);
65 #endif
66 if ((devnum = (((dev_t)majdev << NBITSMINOR) |
67 mindev)) == NODEV) {
68 errno = EINVAL;
69 return (NODEV);
71 break;
73 default:
74 errno = EINVAL;
75 return (NODEV);
78 return (devnum);
82 * Return major number part of formatted device number
84 major_t
85 __major(const int version, const dev_t devnum)
87 major_t maj;
89 switch (version) {
90 case OLDDEV:
91 maj = (devnum >> ONBITSMINOR);
92 if (devnum == NODEV || maj > OMAXMAJ) {
93 errno = EINVAL;
94 return ((major_t)NODEV);
96 break;
98 case NEWDEV:
99 maj = (devnum >> NBITSMINOR);
100 if (devnum == NODEV) {
101 errno = EINVAL;
102 return ((major_t)NODEV);
104 #if MAXMAJ != 0xfffffffful /* assumes major_t == uint32_t */
105 if (maj > MAXMAJ) {
106 errno = EINVAL;
107 return ((major_t)NODEV);
109 #endif
110 break;
112 default:
113 errno = EINVAL;
114 return ((major_t)NODEV);
117 return (maj);
122 * Return minor number part of formatted device number
124 minor_t
125 __minor(const int version, const dev_t devnum)
127 switch (version) {
128 case OLDDEV:
129 if (devnum == NODEV) {
130 errno = EINVAL;
131 return ((minor_t)NODEV);
133 return (devnum & OMAXMIN);
135 case NEWDEV:
136 if (devnum == NODEV) {
137 errno = EINVAL;
138 return ((minor_t)NODEV);
140 return (devnum & MAXMIN);
142 default:
143 errno = EINVAL;
144 return ((minor_t)NODEV);