* Copyright (c) 1982, 1986, 1993
* The Regents of the University of California. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* @(#)subr_log.c 8.3 (Berkeley) 2/14/95
* Error log buffer for kernel printf's.
#define LOG_RDPRI (PZERO + 1)
int sc_state
; /* see above for possibilities */
struct selinfo sc_selp
; /* process waiting on select call */
int sc_pgid
; /* process/group for async I/O */
int log_open
; /* also used in log() */
logopen(dev
, flags
, mode
, p
)
register struct msgbuf
*mbp
= msgbufp
;
logsoftc
.sc_pgid
= p
->p_pid
; /* signal process only */
* Potential race here with putchar() but since putchar should be
* called by autoconf, msg_magic should be initialized by the time
if (mbp
->msg_magic
!= MSG_MAGIC
) {
mbp
->msg_magic
= MSG_MAGIC
;
mbp
->msg_bufx
= mbp
->msg_bufr
= 0;
for (i
=0; i
< MSG_BSIZE
; i
++)
logclose(dev
, flag
, mode
, p
)
register struct msgbuf
*mbp
= msgbufp
;
while (mbp
->msg_bufr
== mbp
->msg_bufx
) {
logsoftc
.sc_state
|= LOG_RDWAIT
;
if (error
= tsleep((caddr_t
)mbp
, LOG_RDPRI
| PCATCH
,
logsoftc
.sc_state
&= ~LOG_RDWAIT
;
while (uio
->uio_resid
> 0) {
l
= mbp
->msg_bufx
- mbp
->msg_bufr
;
l
= MSG_BSIZE
- mbp
->msg_bufr
;
l
= min(l
, uio
->uio_resid
);
error
= uiomove((caddr_t
)&mbp
->msg_bufc
[mbp
->msg_bufr
],
if (mbp
->msg_bufr
< 0 || mbp
->msg_bufr
>= MSG_BSIZE
)
if (msgbufp
->msg_bufr
!= msgbufp
->msg_bufx
) {
selrecord(p
, &logsoftc
.sc_selp
);
selwakeup(&logsoftc
.sc_selp
);
if (logsoftc
.sc_state
& LOG_ASYNC
) {
if (logsoftc
.sc_pgid
< 0)
gsignal(-logsoftc
.sc_pgid
, SIGIO
);
else if (p
= pfind(logsoftc
.sc_pgid
))
if (logsoftc
.sc_state
& LOG_RDWAIT
) {
wakeup((caddr_t
)msgbufp
);
logsoftc
.sc_state
&= ~LOG_RDWAIT
;
logioctl(dev
, com
, data
, flag
, p
)
/* return number of characters immediately available */
l
= msgbufp
->msg_bufx
- msgbufp
->msg_bufr
;
logsoftc
.sc_state
|= LOG_ASYNC
;
logsoftc
.sc_state
&= ~LOG_ASYNC
;
logsoftc
.sc_pgid
= *(int *)data
;
*(int *)data
= logsoftc
.sc_pgid
;