kern_conf.c revision 12543
1/*-
2 * Parts Copyright (c) 1995 Terrence R. Lambert
3 * Copyright (c) 1995 Julian R. Elischer
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. All advertising materials mentioning features or use of this software
15 *    must display the following acknowledgement:
16 *      This product includes software developed by Terrence R. Lambert.
17 * 4. The name Terrence R. Lambert may not be used to endorse or promote
18 *    products derived from this software without specific prior written
19 *    permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY Julian R. Elischer ``AS IS'' AND ANY
22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * $Id: kern_conf.c,v 1.4 1995/11/29 12:38:46 julian Exp $
34 */
35
36#include <sys/param.h>
37#include <sys/types.h>
38#include <sys/systm.h>
39#include <sys/conf.h>
40
41/*
42 * (re)place an entry in the bdevsw or cdevsw table
43 * return the slot used in major(*descrip)
44 */
45#define ADDENTRY(TTYPE,NXXXDEV) \
46int TTYPE##_add(dev_t *descrip,						\
47		struct TTYPE *newentry,					\
48		struct TTYPE *oldentry)					\
49{									\
50	int i ;								\
51	if ( (int)*descrip == -1) {	/* auto (0 is valid) */		\
52		/*							\
53		 * Search the table looking for a slot...		\
54		 */							\
55		for (i = 0; i < NXXXDEV; i++)				\
56			if (TTYPE[i].d_open == NULL)			\
57				break;		/* found one! */	\
58		/* out of allocable slots? */				\
59		if (i == NXXXDEV) {					\
60			return ENFILE;					\
61		}							\
62	} else {				/* assign */		\
63		i = major(*descrip);					\
64		if (i < 0 || i >= NXXXDEV) {				\
65			return EINVAL;					\
66		}							\
67	}								\
68									\
69	/* maybe save old */						\
70        if (oldentry) {							\
71		bcopy(&TTYPE[i], oldentry, sizeof(struct TTYPE));	\
72	}								\
73	/* replace with new */						\
74	bcopy(newentry, &TTYPE[i], sizeof(struct TTYPE));		\
75									\
76	/* done! */							\
77	*descrip = makedev(i,0);					\
78	return 0;							\
79} \
80
81ADDENTRY(bdevsw, nblkdev)
82ADDENTRY(cdevsw, nchrdev)
83