struct msgbuf is from sysv, not gnu
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / mkdev.c
1 /* Copyright (C) 2008 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <sys/types.h>
21 #include <errno.h>
22 #include <mkdevP.h>
23 #include <sys/param.h>
24
25 major_t __major (const int version, const dev_t devnum)
26 {
27   if ((version != OLDDEV && version != NEWDEV) || devnum == NODEV)
28     {
29       __set_errno (EINVAL);
30       return NODEV;
31     }
32
33   if (version == OLDDEV)
34     {
35       if ((devnum >> O_BITSMINOR) > O_MAXMAJ)
36         {
37           __set_errno (EINVAL);
38           return NODEV;
39         }
40
41         return devnum >> O_BITSMINOR;
42     }
43   else /* NEWDEV */
44     {
45       if ((devnum >> L_BITSMINOR) > L_MAXMAJ)
46         {
47           __set_errno (EINVAL);
48           return NODEV;
49         }
50
51         return devnum >> L_BITSMINOR;
52     }
53 }
54
55
56 minor_t __minor (const int version, const dev_t devnum)
57 {
58   if ((version != OLDDEV && version != NEWDEV) || devnum == NODEV)
59     {
60       __set_errno (EINVAL);
61       return NODEV;
62     }
63
64   if (version == OLDDEV)
65     return devnum & O_MAXMIN;
66   else /* NEWDEV */
67     return devnum & L_MAXMIN;
68 }
69
70
71 dev_t __makedev (const int version, const major_t majdev, const minor_t mindev)
72 {
73   if (version != OLDDEV && version != NEWDEV)
74     {
75       __set_errno (EINVAL);
76       return NODEV;
77     }
78
79   if (version == OLDDEV)
80     {
81       if (majdev > O_MAXMAJ || mindev > O_MAXMIN)
82         {
83           __set_errno (EINVAL);
84           return NODEV;
85         }
86       return (majdev << O_BITSMINOR) | mindev;
87     }
88   else /* NEWDEV */
89     {
90       if (majdev > L_MAXMAJ || mindev > L_MAXMIN)
91         {
92           __set_errno (EINVAL);
93           return NODEV;
94         }
95
96       dev_t devnum = (majdev << L_BITSMINOR) | mindev;
97       if (devnum == NODEV)
98         __set_errno (EINVAL);
99       return devnum;
100     }
101 }