BSD 4_3_Net_2 release
[unix-history] / usr / src / sys / kern / subr_log.c
index 72d15f5..76347f9 100644 (file)
@@ -1,9 +1,36 @@
 /*
  * 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.8 (Berkeley) 6/24/90
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 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
+ * SUCH DAMAGE.
+ *
+ *     @(#)subr_log.c  7.11 (Berkeley) 3/17/91
  */
 
 /*
  */
 
 /*
  */
 
 #include "param.h"
  */
 
 #include "param.h"
-#include "user.h"
 #include "proc.h"
 #include "vnode.h"
 #include "ioctl.h"
 #include "msgbuf.h"
 #include "file.h"
 #include "proc.h"
 #include "vnode.h"
 #include "ioctl.h"
 #include "msgbuf.h"
 #include "file.h"
-#include "errno.h"
 
 #define LOG_RDPRI      (PZERO + 1)
 
 
 #define LOG_RDPRI      (PZERO + 1)
 
@@ -33,26 +58,29 @@ struct logsoftc {
 int    log_open;                       /* also used in log() */
 
 /*ARGSUSED*/
 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_pgid = u.u_procp->p_pid;    /* signal process only */
+       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);
 }
@@ -72,18 +100,19 @@ logread(dev, uio, flag)
        struct uio *uio;
        int flag;
 {
        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) {
+       while (mbp->msg_bufr == mbp->msg_bufx) {
                if (flag & IO_NDELAY) {
                        splx(s);
                        return (EWOULDBLOCK);
                }
                logsoftc.sc_state |= LOG_RDWAIT;
                if (flag & IO_NDELAY) {
                        splx(s);
                        return (EWOULDBLOCK);
                }
                logsoftc.sc_state |= LOG_RDWAIT;
-               if (error = tsleep((caddr_t)&msgbuf, LOG_RDPRI | PCATCH,
+               if (error = tsleep((caddr_t)mbp, LOG_RDPRI | PCATCH,
                    "klog", 0)) {
                        splx(s);
                        return (error);
                    "klog", 0)) {
                        splx(s);
                        return (error);
@@ -93,38 +122,39 @@ logread(dev, uio, flag)
        logsoftc.sc_state &= ~LOG_RDWAIT;
 
        while (uio->uio_resid > 0) {
        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);
@@ -143,12 +173,12 @@ logwakeup()
        }
        if (logsoftc.sc_state & LOG_ASYNC) {
                if (logsoftc.sc_pgid < 0)
        }
        if (logsoftc.sc_state & LOG_ASYNC) {
                if (logsoftc.sc_pgid < 0)
-                       gsignal(logsoftc.sc_pgid, SIGIO); 
+                       gsignal(-logsoftc.sc_pgid, SIGIO); 
                else if (p = pfind(logsoftc.sc_pgid))
                        psignal(p, SIGIO);
        }
        if (logsoftc.sc_state & LOG_RDWAIT) {
                else if (p = pfind(logsoftc.sc_pgid))
                        psignal(p, SIGIO);
        }
        if (logsoftc.sc_state & LOG_RDWAIT) {
-               wakeup((caddr_t)&msgbuf);
+               wakeup((caddr_t)msgbufp);
                logsoftc.sc_state &= ~LOG_RDWAIT;
        }
 }
                logsoftc.sc_state &= ~LOG_RDWAIT;
        }
 }
@@ -165,7 +195,7 @@ logioctl(dev, 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;