1/* $NetBSD: wsemulconf.c,v 1.7 2005/12/11 12:24:12 christos Exp $ */ 2 3/* 4 * Copyright (c) 1996, 1997 Christopher G. Demetriou. 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 Christopher G. Demetriou 17 * for the NetBSD Project. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#include <sys/cdefs.h> 34__KERNEL_RCSID(0, "$NetBSD: wsemulconf.c,v 1.7 2005/12/11 12:24:12 christos Exp $"); 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/malloc.h> 39 40#include <dev/wscons/wsconsio.h> 41#include <dev/wscons/wsdisplayvar.h> 42#include <dev/wscons/wsksymvar.h> 43#include <dev/wscons/wsemulvar.h> /* pulls in opt_wsemul.h */ 44#include <dev/wscons/wscons_callbacks.h> 45 46struct wsemulentry { 47 const struct wsemul_ops *ops; 48 int usecnt; 49 LIST_ENTRY(wsemulentry) next; 50}; 51static LIST_HEAD(, wsemulentry) wsemuls = LIST_HEAD_INITIALIZER(&wsemuls); 52 53static const struct wsemul_ops *wsemul_conf[] = { 54#ifdef WSEMUL_SUN 55 &wsemul_sun_ops, 56#endif 57#ifdef WSEMUL_VT100 58 &wsemul_vt100_ops, 59#endif 60#ifndef WSEMUL_NO_DUMB 61 &wsemul_dumb_ops, 62#endif 63 NULL 64}; 65 66const struct wsemul_ops * 67wsemul_pick(const char *name) 68{ 69 const struct wsemul_ops **ops; 70 struct wsemulentry *wep; 71 72 if (name == NULL) { 73 /* default */ 74#ifdef WSEMUL_DEFAULT 75 name = WSEMUL_DEFAULT; 76#else 77 return (wsemul_conf[0]); 78#endif 79 } 80 81 LIST_FOREACH(wep, &wsemuls, next) 82 if (!strcmp(name, wep->ops->name)) { 83 wep->usecnt++; 84 return wep->ops; 85 } 86 87 for (ops = &wsemul_conf[0]; *ops != NULL; ops++) 88 if (strcmp(name, (*ops)->name) == 0) 89 break; 90 91 return (*ops); 92} 93 94void 95wsemul_drop(const struct wsemul_ops *ops) 96{ 97 struct wsemulentry *wep; 98 99 LIST_FOREACH(wep, &wsemuls, next) 100 if (ops == wep->ops) { 101 wep->usecnt--; 102 return; 103 } 104} 105 106int 107wsemul_add(const struct wsemul_ops *ops) 108{ 109 struct wsemulentry *wep; 110 111 wep = malloc(sizeof (struct wsemulentry), M_DEVBUF, M_WAITOK); 112 wep->ops = ops; 113 wep->usecnt = 0; 114 LIST_INSERT_HEAD(&wsemuls, wep, next); 115 return 0; 116} 117 118int 119wsemul_remove(const struct wsemul_ops *ops) 120{ 121 struct wsemulentry *wep; 122 123 LIST_FOREACH(wep, &wsemuls, next) { 124 if (ops == wep->ops) { 125 if (wep->usecnt) 126 return EBUSY; 127 LIST_REMOVE(wep, next); 128 return 0; 129 } 130 } 131 return ENOENT; 132} 133