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
p_devtmp => p_dupfd; eliminate u.u_error from RETURN macro
[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
b555264
..
4d77f7d
100644
(file)
--- a/
usr/src/sys/kern/subr_log.c
+++ b/
usr/src/sys/kern/subr_log.c
@@
-1,21
+1,25
@@
-/* subr_log.c 6.1 84/07/16 */
+/*
+ * 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.6 (Berkeley) %G%
+ */
/*
* Error log buffer for kernel printf's.
*/
/*
* Error log buffer for kernel printf's.
*/
-#include "../h/param.h"
-#include "../h/dir.h"
-#include "../h/user.h"
-#include "../h/proc.h"
-#include "../h/ioctl.h"
-#include "../h/msgbuf.h"
-#include "../h/file.h"
-#include "../h/errno.h"
+#include "param.h"
+#include "user.h"
+#include "proc.h"
+#include "ioctl.h"
+#include "msgbuf.h"
+#include "file.h"
+#include "errno.h"
#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
#define LOG_NBIO 0x02
#define LOG_ASYNC 0x04
#define LOG_RDWAIT 0x08
@@
-23,19
+27,19
@@
struct logsoftc {
int sc_state; /* see above for possibilities */
struct proc *sc_selp; /* process waiting on select call */
struct logsoftc {
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 */
+
struct pgrp *sc_pgrp;
/* process group for async I/O */
} logsoftc;
} logsoftc;
+int log_open; /* also used in log() */
+
+/*ARGSUSED*/
logopen(dev)
dev_t dev;
{
logopen(dev)
dev_t dev;
{
-#ifdef LOGDEBUG
- printf("logopen: dev=0x%x\n", dev);
-#endif
- if (logsoftc.sc_state & LOG_OPEN)
- return(EBUSY);
- logsoftc.sc_state |= LOG_OPEN;
+ if (log_open)
+ return (EBUSY);
+ log_open = 1;
logsoftc.sc_selp = 0;
logsoftc.sc_pgrp = u.u_procp->p_pgrp;
/*
logsoftc.sc_selp = 0;
logsoftc.sc_pgrp = u.u_procp->p_pgrp;
/*
@@
-51,42
+55,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;
}
- 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
- printf("logclose: dev=0x%x\n", dev);
-#endif
+ logsoftc.sc_pgrp = NULL;
}
}
+/*ARGSUSED*/
logread(dev, uio)
dev_t dev;
struct uio *uio;
{
register long l;
logread(dev, uio)
dev_t dev;
struct uio *uio;
{
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
- printf("logread: dev=0x%x\n", dev);
-#endif
-
s = splhigh();
while (msgbuf.msg_bufr == msgbuf.msg_bufx) {
if (logsoftc.sc_state & LOG_NBIO) {
splx(s);
s = splhigh();
while (msgbuf.msg_bufr == msgbuf.msg_bufx) {
if (logsoftc.sc_state & LOG_NBIO) {
splx(s);
- return(EWOULDBLOCK);
+ return
(EWOULDBLOCK);
}
logsoftc.sc_state |= LOG_RDWAIT;
}
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;
@@
-95,18
+97,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);
+ l = MIN(l, uio->uio_resid);
+ if (l == 0)
+ break;
error = uiomove((caddr_t)&msgbuf.msg_bufc[msgbuf.msg_bufr],
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;
}
if (msgbuf.msg_bufr < 0 || msgbuf.msg_bufr >= MSG_BSIZE)
msgbuf.msg_bufr = 0;
}
- return(error);
+ return
(error);
}
}
+/*ARGSUSED*/
logselect(dev, rw)
dev_t dev;
int rw;
logselect(dev, rw)
dev_t dev;
int rw;
@@
-116,37
+121,28
@@
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)
- printf("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
- printf("logselect: FWRITE\n");
-#endif
- break;
}
splx(s);
}
splx(s);
- return(0);
-win:
- splx(s);
- return(1);
+ return (0);
}
logwakeup()
{
}
logwakeup()
{
+ if (!log_open)
+ return;
if (logsoftc.sc_selp) {
selwakeup(logsoftc.sc_selp, 0);
logsoftc.sc_selp = 0;
}
if (logsoftc.sc_state & LOG_ASYNC)
if (logsoftc.sc_selp) {
selwakeup(logsoftc.sc_selp, 0);
logsoftc.sc_selp = 0;
}
if (logsoftc.sc_state & LOG_ASYNC)
-
gsignal(logsoftc.sc_pgrp, SIGIO
);
+
pgsignal(logsoftc.sc_pgrp, SIGIO, 0
);
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;
@@
-186,16
+182,19
@@
logioctl(com, data, flag)
logsoftc.sc_state &= ~LOG_ASYNC;
break;
logsoftc.sc_state &= ~LOG_ASYNC;
break;
- case TIOCSPGRP:
- logsoftc.sc_pgrp = *(int *)data;
+#ifdef notdef /* XXX remove -- a single open device doesn't need this */
+ case TIOCSPGRP: {
+ logsoftc.sc_pgid = *(int *)data;
break;
break;
+ }
+#endif
case TIOCGPGRP:
case TIOCGPGRP:
- *(int *)data = logsoftc.sc_pgrp;
+ *(int *)data = logsoftc.sc_pgrp
->pg_id
;
break;
default:
break;
default:
- return(-1);
+ return
(-1);
}
}
- return(0);
+ return
(0);
}
}