projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
set/get timeouts using timevals
[unix-history]
/
usr
/
src
/
sys
/
kern
/
subr_log.c
diff --git
a/usr/src/sys/kern/subr_log.c
b/usr/src/sys/kern/subr_log.c
index
8c97f9c
..
813340d
100644
(file)
--- a/
usr/src/sys/kern/subr_log.c
+++ b/
usr/src/sys/kern/subr_log.c
@@
-1,13
+1,19
@@
-/* subr_log.c 6.3 84/08/29 */
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ * @(#)subr_log.c 7.8 (Berkeley) %G%
+ */
/*
* Error log buffer for kernel printf's.
*/
#include "param.h"
/*
* Error log buffer for kernel printf's.
*/
#include "param.h"
-#include "dir.h"
#include "user.h"
#include "proc.h"
#include "user.h"
#include "proc.h"
+#include "vnode.h"
#include "ioctl.h"
#include "msgbuf.h"
#include "file.h"
#include "ioctl.h"
#include "msgbuf.h"
#include "file.h"
@@
-15,40
+21,26
@@
#define LOG_RDPRI (PZERO + 1)
#define LOG_RDPRI (PZERO + 1)
-#define LOG_OPEN 0x01
-#define LOG_NBIO 0x02
#define LOG_ASYNC 0x04
#define LOG_RDWAIT 0x08
struct logsoftc {
int sc_state; /* see above for possibilities */
struct proc *sc_selp; /* process waiting on select call */
#define LOG_ASYNC 0x04
#define LOG_RDWAIT 0x08
struct logsoftc {
int sc_state; /* see above for possibilities */
struct proc *sc_selp; /* process waiting on select call */
- int sc_pg
rp; /* process
group for async I/O */
+ int sc_pg
id; /* process/
group for async I/O */
} logsoftc;
} logsoftc;
-#ifdef LOGDEBUG
-/*VARARGS1*/
-xprintf(fmt, x1)
- char *fmt;
- unsigned x1;
-{
-
- prf(fmt, &x1, 1, (struct tty *)0);
-}
-#endif
+int log_open; /* also used in log() */
+/*ARGSUSED*/
logopen(dev)
dev_t dev;
{
logopen(dev)
dev_t dev;
{
-#ifdef LOGDEBUG
- xprintf("logopen: dev=0x%x\n", dev);
-#endif
- if (logsoftc.sc_state & LOG_OPEN)
+ if (log_open)
return (EBUSY);
return (EBUSY);
- logsoftc.sc_state |= LOG_OPEN;
- logsoftc.sc_selp = 0;
- logsoftc.sc_pgrp = u.u_procp->p_pgrp;
+ log_open = 1;
+ logsoftc.sc_pgid = u.u_procp->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
/*
* Potential race here with putchar() but since putchar should be
* called by autoconf, msg_magic should be initialized by the time
@@
-62,45
+54,40
@@
logopen(dev)
for (i=0; i < MSG_BSIZE; i++)
msgbuf.msg_bufc[i] = 0;
}
for (i=0; i < MSG_BSIZE; i++)
msgbuf.msg_bufc[i] = 0;
}
-#ifdef LOGDEBUG
- xprintf("logopen: bufx=%d, bufr=%d\n", msgbuf.msg_bufx, msgbuf.msg_bufr);
-#endif
return (0);
}
return (0);
}
+/*ARGSUSED*/
logclose(dev, flag)
dev_t dev;
{
logclose(dev, flag)
dev_t dev;
{
+ log_open = 0;
logsoftc.sc_state = 0;
logsoftc.sc_selp = 0;
logsoftc.sc_state = 0;
logsoftc.sc_selp = 0;
- logsoftc.sc_pgrp = 0;
-#ifdef LOGDEBUG
- xprintf("logclose: dev=0x%x\n", dev);
-#endif
}
}
-logread(dev, uio)
+/*ARGSUSED*/
+logread(dev, uio, flag)
dev_t dev;
struct uio *uio;
dev_t dev;
struct uio *uio;
+ int flag;
{
register long l;
{
register long l;
- register u_int c;
- register struct iovec *iov;
register int s;
int error = 0;
register int s;
int error = 0;
-#ifdef LOGDEBUG
- xprintf("logread: dev=0x%x\n", dev);
-#endif
-
s = splhigh();
while (msgbuf.msg_bufr == msgbuf.msg_bufx) {
s = splhigh();
while (msgbuf.msg_bufr == msgbuf.msg_bufx) {
- if (
logsoftc.sc_state & LOG_NBIO
) {
+ if (
flag & IO_NDELAY
) {
splx(s);
return (EWOULDBLOCK);
}
logsoftc.sc_state |= LOG_RDWAIT;
splx(s);
return (EWOULDBLOCK);
}
logsoftc.sc_state |= LOG_RDWAIT;
- sleep((caddr_t)&msgbuf, LOG_RDPRI);
+ if (error = tsleep((caddr_t)&msgbuf, LOG_RDPRI | PCATCH,
+ "klog", 0)) {
+ splx(s);
+ return (error);
+ }
}
splx(s);
logsoftc.sc_state &= ~LOG_RDWAIT;
}
splx(s);
logsoftc.sc_state &= ~LOG_RDWAIT;
@@
-109,24
+96,21
@@
logread(dev, uio)
l = msgbuf.msg_bufx - msgbuf.msg_bufr;
if (l < 0)
l = MSG_BSIZE - msgbuf.msg_bufr;
l = msgbuf.msg_bufx - msgbuf.msg_bufr;
if (l < 0)
l = MSG_BSIZE - msgbuf.msg_bufr;
- c = min((u_int) l, (u_int)uio->uio_resid);
-#ifdef LOGDEBUG
- xprintf("logread: bufx=%d, bufr=%d, l=%d, c=%d\n",
- msgbuf.msg_bufx, msgbuf.msg_bufr, l, c);
-#endif
- if (c <= 0)
+ l = MIN(l, uio->uio_resid);
+ if (l == 0)
break;
error = uiomove((caddr_t)&msgbuf.msg_bufc[msgbuf.msg_bufr],
break;
error = uiomove((caddr_t)&msgbuf.msg_bufc[msgbuf.msg_bufr],
- (int)
c, UIO_READ
, uio);
+ (int)
l
, uio);
if (error)
break;
if (error)
break;
- msgbuf.msg_bufr +=
c
;
+ msgbuf.msg_bufr +=
l
;
if (msgbuf.msg_bufr < 0 || msgbuf.msg_bufr >= MSG_BSIZE)
msgbuf.msg_bufr = 0;
}
return (error);
}
if (msgbuf.msg_bufr < 0 || msgbuf.msg_bufr >= MSG_BSIZE)
msgbuf.msg_bufr = 0;
}
return (error);
}
+/*ARGSUSED*/
logselect(dev, rw)
dev_t dev;
int rw;
logselect(dev, rw)
dev_t dev;
int rw;
@@
-136,37
+120,33
@@
logselect(dev, rw)
switch (rw) {
case FREAD:
switch (rw) {
case FREAD:
- if (msgbuf.msg_bufr != msgbuf.msg_bufx)
- goto win;
-#ifdef LOGDEBUG
- if (logsoftc.sc_selp)
- xprintf("logselect: collision\n");
-#endif
+ if (msgbuf.msg_bufr != msgbuf.msg_bufx) {
+ splx(s);
+ return (1);
+ }
logsoftc.sc_selp = u.u_procp;
break;
logsoftc.sc_selp = u.u_procp;
break;
-
- case FWRITE:
-#ifdef LOGDEBUG
- xprintf("logselect: FWRITE\n");
-#endif
- break;
}
splx(s);
return (0);
}
splx(s);
return (0);
-win:
- splx(s);
- return (1);
}
logwakeup()
{
}
logwakeup()
{
+ struct proc *p;
+ if (!log_open)
+ return;
if (logsoftc.sc_selp) {
selwakeup(logsoftc.sc_selp, 0);
logsoftc.sc_selp = 0;
}
if (logsoftc.sc_selp) {
selwakeup(logsoftc.sc_selp, 0);
logsoftc.sc_selp = 0;
}
- if (logsoftc.sc_state & LOG_ASYNC)
- gsignal(logsoftc.sc_pgrp, SIGIO);
+ if (logsoftc.sc_state & LOG_ASYNC) {
+ if (logsoftc.sc_pgid < 0)
+ gsignal(logsoftc.sc_pgid, SIGIO);
+ else if (p = pfind(logsoftc.sc_pgid))
+ psignal(p, SIGIO);
+ }
if (logsoftc.sc_state & LOG_RDWAIT) {
wakeup((caddr_t)&msgbuf);
logsoftc.sc_state &= ~LOG_RDWAIT;
if (logsoftc.sc_state & LOG_RDWAIT) {
wakeup((caddr_t)&msgbuf);
logsoftc.sc_state &= ~LOG_RDWAIT;
@@
-174,7
+154,7
@@
logwakeup()
}
/*ARGSUSED*/
}
/*ARGSUSED*/
-logioctl(com, data, flag)
+logioctl(
dev,
com, data, flag)
caddr_t data;
{
long l;
caddr_t data;
{
long l;
@@
-193,10
+173,6
@@
logioctl(com, data, flag)
break;
case FIONBIO:
break;
case FIONBIO:
- if (*(int *)data)
- logsoftc.sc_state |= LOG_NBIO;
- else
- logsoftc.sc_state &= ~LOG_NBIO;
break;
case FIOASYNC:
break;
case FIOASYNC:
@@
-207,11
+183,11
@@
logioctl(com, data, flag)
break;
case TIOCSPGRP:
break;
case TIOCSPGRP:
- logsoftc.sc_pg
rp
= *(int *)data;
+ logsoftc.sc_pg
id
= *(int *)data;
break;
case TIOCGPGRP:
break;
case TIOCGPGRP:
- *(int *)data = logsoftc.sc_pg
rp
;
+ *(int *)data = logsoftc.sc_pg
id
;
break;
default:
break;
default: