kern_conf.c revision 11127
1227825Stheraven/*-
2227825Stheraven * Parts Copyright (c) 1995 Terrence R. Lambert
3227825Stheraven * Copyright (c) 1995 Julian R. Elischer
4227825Stheraven * All rights reserved.
5227825Stheraven *
6227825Stheraven * Redistribution and use in source and binary forms, with or without
7227825Stheraven * modification, are permitted provided that the following conditions
8227825Stheraven * are met:
9227825Stheraven * 1. Redistributions of source code must retain the above copyright
10227825Stheraven *    notice, this list of conditions and the following disclaimer.
11227825Stheraven * 2. Redistributions in binary form must reproduce the above copyright
12227825Stheraven *    notice, this list of conditions and the following disclaimer in the
13227825Stheraven *    documentation and/or other materials provided with the distribution.
14227825Stheraven * 3. All advertising materials mentioning features or use of this software
15227825Stheraven *    must display the following acknowledgement:
16227825Stheraven *      This product includes software developed by Terrence R. Lambert.
17227825Stheraven * 4. The name Terrence R. Lambert may not be used to endorse or promote
18227825Stheraven *    products derived from this software without specific prior written
19227825Stheraven *    permission.
20227825Stheraven *
21227825Stheraven * THIS SOFTWARE IS PROVIDED BY Julian R. Elischer ``AS IS'' AND ANY
22227825Stheraven * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23227825Stheraven * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24227825Stheraven * ARE DISCLAIMED.  IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE
25227825Stheraven * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26227825Stheraven * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27227825Stheraven * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28227825Stheraven * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29227825Stheraven * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30227825Stheraven * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31227825Stheraven * SUCH DAMAGE.
32227825Stheraven *
33 * $Id: kern_conf.c,v 1.1 1995/10/02 09:24:44 julian Exp $
34 */
35
36#include <sys/param.h>
37#include <sys/types.h>
38#include <sys/systm.h>
39#include <sys/conf.h>
40extern d_open_t lkmenodev;
41
42/*
43 * (re)place an entry in the bdevsw or cdevsw table
44 * return the slot used in major(*descrip)
45 */
46#define ADDENTRY(TTYPE,NXXXDEV) \
47int TTYPE##_add(dev_t *descrip,						\
48		struct TTYPE *cdeventry,				\
49		struct TTYPE *oldentry)					\
50{									\
51	int i ;								\
52	if ( (int)*descrip == -1) {	/* auto (0 is valid) */		\
53		/*							\
54		 * Search the table looking for a slot...		\
55		 */							\
56		for (i = 0; i < NXXXDEV; i++)				\
57			if (TTYPE[i].d_open == lkmenodev)		\
58				break;		/* found it! */		\
59		/* out of allocable slots? */				\
60		if (i == NXXXDEV) {					\
61			return ENFILE;					\
62		}							\
63	} else {				/* assign */		\
64		i = major(descrip);					\
65		if (i < 0 || i >= NXXXDEV) {				\
66			return EINVAL;					\
67		}							\
68	}								\
69									\
70	/* save old */							\
71        if (oldentry) {							\
72		bcopy(&TTYPE[i], oldentry, sizeof(struct TTYPE));	\
73	}								\
74	/* replace with new */						\
75	bcopy(cdeventry, &TTYPE[i], sizeof(struct TTYPE));		\
76									\
77	/* done! */							\
78	*descrip = makedev(i,0);					\
79	return 0;							\
80} \
81
82ADDENTRY(cdevsw, nblkdev)
83ADDENTRY(bdevsw, nchrdev)
84