/* subr_log.c 6.2 84/07/17 */
* Error log buffer for kernel printf's.
#define LOG_RDPRI (PZERO + 1)
int sc_state
; /* see above for possibilities */
struct proc
*sc_selp
; /* process waiting on select call */
int sc_pgrp
; /* process group for async I/O */
prf(fmt
, &x1
, 1, (struct tty
*)0);
xprintf("logopen: dev=0x%x\n", dev
);
if (logsoftc
.sc_state
& LOG_OPEN
)
logsoftc
.sc_state
|= LOG_OPEN
;
logsoftc
.sc_pgrp
= u
.u_procp
->p_pgrp
;
* Potential race here with putchar() but since putchar should be
* called by autoconf, msg_magic should be initialized by the time
if (msgbuf
.msg_magic
!= MSG_MAGIC
) {
msgbuf
.msg_magic
= MSG_MAGIC
;
msgbuf
.msg_bufx
= msgbuf
.msg_bufr
= 0;
for (i
=0; i
< MSG_BSIZE
; i
++)
xprintf("logopen: bufx=%d, bufr=%d\n", msgbuf
.msg_bufx
, msgbuf
.msg_bufr
);
xprintf("logclose: dev=0x%x\n", dev
);
register struct iovec
*iov
;
xprintf("logread: dev=0x%x\n", dev
);
while (msgbuf
.msg_bufr
== msgbuf
.msg_bufx
) {
if (logsoftc
.sc_state
& LOG_NBIO
) {
logsoftc
.sc_state
|= LOG_RDWAIT
;
sleep((caddr_t
)&msgbuf
, LOG_RDPRI
);
logsoftc
.sc_state
&= ~LOG_RDWAIT
;
while (uio
->uio_resid
> 0) {
l
= msgbuf
.msg_bufx
- msgbuf
.msg_bufr
;
l
= MSG_BSIZE
- msgbuf
.msg_bufr
;
c
= min((u_int
) l
, (u_int
)uio
->uio_resid
);
xprintf("logread: bufx=%d, bufr=%d, l=%d, c=%d\n",
msgbuf
.msg_bufx
, msgbuf
.msg_bufr
, l
, c
);
error
= uiomove((caddr_t
)&msgbuf
.msg_bufc
[msgbuf
.msg_bufr
],
if (msgbuf
.msg_bufr
< 0 || msgbuf
.msg_bufr
>= MSG_BSIZE
)
if (msgbuf
.msg_bufr
!= msgbuf
.msg_bufx
)
xprintf("logselect: collision\n");
logsoftc
.sc_selp
= u
.u_procp
;
xprintf("logselect: FWRITE\n");
selwakeup(logsoftc
.sc_selp
, 0);
if (logsoftc
.sc_state
& LOG_ASYNC
)
gsignal(logsoftc
.sc_pgrp
, SIGIO
);
if (logsoftc
.sc_state
& LOG_RDWAIT
) {
wakeup((caddr_t
)&msgbuf
);
logsoftc
.sc_state
&= ~LOG_RDWAIT
;
logioctl(com
, data
, flag
)
/* return number of characters immediately available */
l
= msgbuf
.msg_bufx
- msgbuf
.msg_bufr
;
logsoftc
.sc_state
|= LOG_NBIO
;
logsoftc
.sc_state
&= ~LOG_NBIO
;
logsoftc
.sc_state
|= LOG_ASYNC
;
logsoftc
.sc_state
&= ~LOG_ASYNC
;
logsoftc
.sc_pgrp
= *(int *)data
;
*(int *)data
= logsoftc
.sc_pgrp
;