p_devtmp => p_dupfd; eliminate u.u_error from RETURN macro
[unix-history] / usr / src / sys / kern / subr_log.c
index b555264..4d77f7d 100644 (file)
@@ -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
 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);
 }
 }