1/* 2 * Copyright (c) 1982, 1986, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 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 * @(#)subr_log.c 8.1 (Berkeley) 6/10/93 |
34 * $FreeBSD: head/sys/kern/subr_log.c 69741 2000-12-08 06:57:39Z phk $ |
35 */ 36 37/* 38 * Error log buffer for kernel printf's. 39 */ 40 41#include <sys/param.h> 42#include <sys/systm.h> --- 42 unchanged lines hidden (view full) --- 85 struct selinfo sc_selp; /* process waiting on select call */ 86 struct sigio *sc_sigio; /* information for async I/O */ 87} logsoftc; 88 89int log_open; /* also used in log() */ 90 91/*ARGSUSED*/ 92static int |
93logopen(dev_t dev, int flags, int mode, struct proc *p) |
94{ 95 if (log_open) 96 return (EBUSY); 97 log_open = 1; 98 fsetown(p->p_pid, &logsoftc.sc_sigio); /* signal process only */ 99 return (0); 100} 101 102/*ARGSUSED*/ 103static int |
104logclose(dev_t dev, int flag, int mode, struct proc *p) |
105{ 106 107 log_open = 0; 108 logsoftc.sc_state = 0; 109 funsetown(logsoftc.sc_sigio); 110 return (0); 111} 112 113/*ARGSUSED*/ 114static int |
115logread(dev_t dev, struct uio *uio, int flag) |
116{ |
117 struct msgbuf *mbp = msgbufp; 118 long l; 119 int s; |
120 int error = 0; 121 122 s = splhigh(); 123 while (mbp->msg_bufr == mbp->msg_bufx) { 124 if (flag & IO_NDELAY) { 125 splx(s); 126 return (EWOULDBLOCK); 127 } --- 22 unchanged lines hidden (view full) --- 150 if (mbp->msg_bufr >= mbp->msg_size) 151 mbp->msg_bufr = 0; 152 } 153 return (error); 154} 155 156/*ARGSUSED*/ 157static int |
158logpoll(dev_t dev, int events, struct proc *p) |
159{ 160 int s; 161 int revents = 0; 162 163 s = splhigh(); 164 165 if (events & (POLLIN | POLLRDNORM)) { 166 if (msgbufp->msg_bufr != msgbufp->msg_bufx) 167 revents |= events & (POLLIN | POLLRDNORM); 168 else 169 selrecord(p, &logsoftc.sc_selp); 170 } 171 splx(s); 172 return (revents); 173} 174 175void |
176logwakeup(void) |
177{ 178 if (!log_open) 179 return; 180 selwakeup(&logsoftc.sc_selp); 181 if ((logsoftc.sc_state & LOG_ASYNC) && logsoftc.sc_sigio != NULL) 182 pgsigio(logsoftc.sc_sigio, SIGIO, 0); 183 if (logsoftc.sc_state & LOG_RDWAIT) { 184 wakeup((caddr_t)msgbufp); 185 logsoftc.sc_state &= ~LOG_RDWAIT; 186 } 187} 188 189/*ARGSUSED*/ 190static int |
191logioctl(dev_t dev, u_long com, caddr_t data, int flag, struct proc *p) |
192{ 193 long l; 194 int s; 195 196 switch (com) { 197 198 /* return number of characters immediately available */ 199 case FIONREAD: --- 32 unchanged lines hidden (view full) --- 232 break; 233 234 default: 235 return (ENOTTY); 236 } 237 return (0); 238} 239 |
240static void |
241log_drvinit(void *unused) |
242{ |
243 |
244 make_dev(&log_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "klog"); 245} 246 247SYSINIT(logdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,log_drvinit,NULL) |