fix to previous changes
[unix-history] / usr / src / sys / kern / subr_log.c
index f5126b3..b52883e 100644 (file)
@@ -1,9 +1,10 @@
 /*
  * Copyright (c) 1982, 1986 Regents of the University of California.
 /*
  * 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.
+ * All rights reserved.
  *
  *
- *     @(#)subr_log.c  7.3 (Berkeley) %G%
+ * %sccs.include.redist.c%
+ *
+ *     @(#)subr_log.c  7.11 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
  */
 
 #include "param.h"
  */
 
 #include "param.h"
-#include "user.h"
 #include "proc.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"
-#include "errno.h"
 
 #define LOG_RDPRI      (PZERO + 1)
 
 
 #define LOG_RDPRI      (PZERO + 1)
 
-#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 */
-       pid_t   sc_pgid;                /* process group id for async I/O */
+       int     sc_pgid;                /* process/group for async I/O */
 } logsoftc;
 
 int    log_open;                       /* also used in log() */
 
 /*ARGSUSED*/
 } logsoftc;
 
 int    log_open;                       /* also used in log() */
 
 /*ARGSUSED*/
-logopen(dev)
+logopen(dev, flags, mode, p)
        dev_t dev;
        dev_t dev;
+       int flags, mode;
+       struct proc *p;
 {
 {
+       register struct msgbuf *mbp = msgbufp;
 
        if (log_open)
                return (EBUSY);
        log_open = 1;
 
        if (log_open)
                return (EBUSY);
        log_open = 1;
-       logsoftc.sc_selp = 0;
-       logsoftc.sc_pgid = u.u_procp->p_pgrp->pg_id;
+       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
         * we get here.
         */
        /*
         * Potential race here with putchar() but since putchar should be
         * called by autoconf, msg_magic should be initialized by the time
         * we get here.
         */
-       if (msgbuf.msg_magic != MSG_MAGIC) {
+       if (mbp->msg_magic != MSG_MAGIC) {
                register int i;
 
                register int i;
 
-               msgbuf.msg_magic = MSG_MAGIC;
-               msgbuf.msg_bufx = msgbuf.msg_bufr = 0;
+               mbp->msg_magic = MSG_MAGIC;
+               mbp->msg_bufx = mbp->msg_bufr = 0;
                for (i=0; i < MSG_BSIZE; i++)
                for (i=0; i < MSG_BSIZE; i++)
-                       msgbuf.msg_bufc[i] = 0;
+                       mbp->msg_bufc[i] = 0;
        }
        return (0);
 }
        }
        return (0);
 }
@@ -65,63 +66,69 @@ logclose(dev, flag)
        log_open = 0;
        logsoftc.sc_state = 0;
        logsoftc.sc_selp = 0;
        log_open = 0;
        logsoftc.sc_state = 0;
        logsoftc.sc_selp = 0;
-       logsoftc.sc_pgid = 0;
 }
 
 /*ARGSUSED*/
 }
 
 /*ARGSUSED*/
-logread(dev, uio)
+logread(dev, uio, flag)
        dev_t dev;
        struct uio *uio;
        dev_t dev;
        struct uio *uio;
+       int flag;
 {
 {
+       register struct msgbuf *mbp = msgbufp;
        register long l;
        register int s;
        int error = 0;
 
        s = splhigh();
        register long l;
        register int s;
        int error = 0;
 
        s = splhigh();
-       while (msgbuf.msg_bufr == msgbuf.msg_bufx) {
-               if (logsoftc.sc_state & LOG_NBIO) {
+       while (mbp->msg_bufr == mbp->msg_bufx) {
+               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)mbp, LOG_RDPRI | PCATCH,
+                   "klog", 0)) {
+                       splx(s);
+                       return (error);
+               }
        }
        splx(s);
        logsoftc.sc_state &= ~LOG_RDWAIT;
 
        while (uio->uio_resid > 0) {
        }
        splx(s);
        logsoftc.sc_state &= ~LOG_RDWAIT;
 
        while (uio->uio_resid > 0) {
-               l = msgbuf.msg_bufx - msgbuf.msg_bufr;
+               l = mbp->msg_bufx - mbp->msg_bufr;
                if (l < 0)
                if (l < 0)
-                       l = MSG_BSIZE - msgbuf.msg_bufr;
+                       l = MSG_BSIZE - mbp->msg_bufr;
                l = MIN(l, uio->uio_resid);
                if (l == 0)
                        break;
                l = MIN(l, uio->uio_resid);
                if (l == 0)
                        break;
-               error = uiomove((caddr_t)&msgbuf.msg_bufc[msgbuf.msg_bufr],
+               error = uiomove((caddr_t)&mbp->msg_bufc[mbp->msg_bufr],
                        (int)l, uio);
                if (error)
                        break;
                        (int)l, uio);
                if (error)
                        break;
-               msgbuf.msg_bufr += l;
-               if (msgbuf.msg_bufr < 0 || msgbuf.msg_bufr >= MSG_BSIZE)
-                       msgbuf.msg_bufr = 0;
+               mbp->msg_bufr += l;
+               if (mbp->msg_bufr < 0 || mbp->msg_bufr >= MSG_BSIZE)
+                       mbp->msg_bufr = 0;
        }
        return (error);
 }
 
 /*ARGSUSED*/
        }
        return (error);
 }
 
 /*ARGSUSED*/
-logselect(dev, rw)
+logselect(dev, rw, p)
        dev_t dev;
        int rw;
        dev_t dev;
        int rw;
+       struct proc *p;
 {
        int s = splhigh();
 
        switch (rw) {
 
        case FREAD:
 {
        int s = splhigh();
 
        switch (rw) {
 
        case FREAD:
-               if (msgbuf.msg_bufr != msgbuf.msg_bufx) {
+               if (msgbufp->msg_bufr != msgbufp->msg_bufx) {
                        splx(s);
                        return (1);
                }
                        splx(s);
                        return (1);
                }
-               logsoftc.sc_selp = u.u_procp;
+               logsoftc.sc_selp = p;
                break;
        }
        splx(s);
                break;
        }
        splx(s);
@@ -130,6 +137,7 @@ logselect(dev, rw)
 
 logwakeup()
 {
 
 logwakeup()
 {
+       struct proc *p;
 
        if (!log_open)
                return;
 
        if (!log_open)
                return;
@@ -137,16 +145,20 @@ logwakeup()
                selwakeup(logsoftc.sc_selp, 0);
                logsoftc.sc_selp = 0;
        }
                selwakeup(logsoftc.sc_selp, 0);
                logsoftc.sc_selp = 0;
        }
-       if (logsoftc.sc_state & LOG_ASYNC)
-               gsignal(logsoftc.sc_pgid, 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) {
        if (logsoftc.sc_state & LOG_RDWAIT) {
-               wakeup((caddr_t)&msgbuf);
+               wakeup((caddr_t)msgbufp);
                logsoftc.sc_state &= ~LOG_RDWAIT;
        }
 }
 
 /*ARGSUSED*/
                logsoftc.sc_state &= ~LOG_RDWAIT;
        }
 }
 
 /*ARGSUSED*/
-logioctl(com, data, flag)
+logioctl(dev, com, data, flag)
        caddr_t data;
 {
        long l;
        caddr_t data;
 {
        long l;
@@ -157,7 +169,7 @@ logioctl(com, data, flag)
        /* return number of characters immediately available */
        case FIONREAD:
                s = splhigh();
        /* return number of characters immediately available */
        case FIONREAD:
                s = splhigh();
-               l = msgbuf.msg_bufx - msgbuf.msg_bufr;
+               l = msgbufp->msg_bufx - msgbufp->msg_bufr;
                splx(s);
                if (l < 0)
                        l += MSG_BSIZE;
                splx(s);
                if (l < 0)
                        l += MSG_BSIZE;
@@ -165,10 +177,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:
@@ -178,10 +186,9 @@ logioctl(com, data, flag)
                        logsoftc.sc_state &= ~LOG_ASYNC;
                break;
 
                        logsoftc.sc_state &= ~LOG_ASYNC;
                break;
 
-       case TIOCSPGRP: {
+       case TIOCSPGRP:
                logsoftc.sc_pgid = *(int *)data;
                break;
                logsoftc.sc_pgid = *(int *)data;
                break;
-       }
 
        case TIOCGPGRP:
                *(int *)data = logsoftc.sc_pgid;
 
        case TIOCGPGRP:
                *(int *)data = logsoftc.sc_pgid;