usr/src/lib/libc/port/gen/mkdev.c
author Casper H.S. Dik <Casper.Dik@Sun.COM>
Wed, 28 Apr 2010 10:01:37 +0200
changeset 12273 63678502e95e
parent 6812 febeba71273d
permissions -rw-r--r--
PSARC 2009/377 In-kernel pfexec implementation. PSARC 2009/378 Basic File Privileges PSARC 2010/072 RBAC update: user attrs from profiles 4912090 pfzsh(1) should exist 4912093 pfbash(1) should exist 4912096 pftcsh(1) should exist 6440298 Expand the basic privilege set in order to restrict file access 6859862 Move pfexec into the kernel 6919171 cred_t sidesteps kmem_debug; we need to be able to detect bad hold/free when they occur 6923721 The new SYS_SMB privilege is not backward compatible 6937562 autofs doesn't remove its door when the zone shuts down 6937727 Zones stuck on deathrow; netstack_zone keeps a credential reference to the zone 6940159 Implement PSARC 2010/072
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    30
#pragma ident	"%Z%%M%	%I%	%E% SMI"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 0
diff changeset
    32
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/mkdev.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 * Create a formatted device number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
dev_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
__makedev(const int version, const major_t majdev, const minor_t mindev)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
	dev_t devnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
	switch (version) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
	case OLDDEV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
		if (majdev > OMAXMAJ || mindev > OMAXMIN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
			return ((o_dev_t)NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
		devnum = ((majdev << ONBITSMINOR) | mindev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	case NEWDEV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#if MAXMAJ != 0xfffffffful	/* assumes major_t == uint32_t */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
		if (majdev > MAXMAJ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
			return (NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#if MAXMIN != 0xfffffffful	/* assumes minor_t == uint32_t */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
		if (mindev > MAXMIN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
			return (NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
		if ((devnum = (((dev_t)majdev << NBITSMINOR) |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
		    mindev)) == NODEV) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
			return (NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
		return (NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	return (devnum);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 * Return major number part of formatted device number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
major_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
__major(const int version, const dev_t devnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	major_t maj;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	switch (version) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	case OLDDEV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		maj = (devnum >> ONBITSMINOR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
		if (devnum == NODEV || maj > OMAXMAJ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
			return ((major_t)NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	case NEWDEV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
		maj = (devnum >> NBITSMINOR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
		if (devnum == NODEV) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
			return ((major_t)NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
#if MAXMAJ != 0xfffffffful	/* assumes major_t == uint32_t */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		if (maj > MAXMAJ) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
			return ((major_t)NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
		return ((major_t)NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	return (maj);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
 * Return minor number part of formatted device number
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
minor_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
__minor(const int version, const dev_t devnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	switch (version) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	case OLDDEV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
		if (devnum == NODEV) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
			return ((minor_t)NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		return (devnum & OMAXMIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	case NEWDEV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		if (devnum == NODEV) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
			errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
			return ((minor_t)NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		return (devnum & MAXMIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
		return ((minor_t)NODEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
}