X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/0f4556f12c8f75078501c9d1338ae7648a97f975..95f51977ddc18faa2e212f30c00a39540b39f325:/usr/src/sys/sys/subr_prf.c diff --git a/usr/src/sys/sys/subr_prf.c b/usr/src/sys/sys/subr_prf.c index 16376b23a9..e29170476c 100644 --- a/usr/src/sys/sys/subr_prf.c +++ b/usr/src/sys/sys/subr_prf.c @@ -1,22 +1,34 @@ -/* subr_prf.c 6.1 83/07/29 */ - -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/seg.h" -#include "../h/buf.h" -#include "../h/conf.h" -#include "../h/reboot.h" -#include "../h/vm.h" -#include "../h/msgbuf.h" -#include "../h/dir.h" -#include "../h/user.h" -#include "../h/proc.h" -#include "../h/tty.h" +/* + * 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_prf.c 7.1 (Berkeley) 6/5/86 + */ + +#include "param.h" +#include "systm.h" +#include "seg.h" +#include "buf.h" +#include "conf.h" +#include "reboot.h" +#include "vm.h" +#include "msgbuf.h" +#include "dir.h" +#include "user.h" +#include "proc.h" +#include "ioctl.h" +#include "tty.h" +#include "syslog.h" #ifdef vax #include "../vax/mtpr.h" #endif +#define TOCONS 0x1 +#define TOTTY 0x2 +#define TOLOG 0x4 + /* * In case console is off, * panicstr contains argument to last @@ -40,7 +52,7 @@ char *panicstr; * a character <= 32), give the name of the register. Thus * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n"); * would produce output: - * reg=2 + * reg=3 */ /*VARARGS1*/ printf(fmt, x1) @@ -48,26 +60,95 @@ printf(fmt, x1) unsigned x1; { - prf(fmt, &x1, 0); + prf(fmt, &x1, TOCONS | TOLOG, (struct tty *)0); + logwakeup(); } /* - * Uprintf prints to the current user's terminal, - * guarantees not to sleep (so can be called by interrupt routines) - * and does no watermark checking - (so no verbose messages). + * Uprintf prints to the current user's terminal. + * It may block if the tty queue is overfull. + * Should determine whether current terminal user is related + * to this process. */ /*VARARGS1*/ uprintf(fmt, x1) char *fmt; unsigned x1; { +#ifdef notdef + register struct proc *p; +#endif + register struct tty *tp; + + if ((tp = u.u_ttyp) == NULL) + return; +#ifdef notdef + if (tp->t_pgrp && (p = pfind(tp->t_pgrp))) + if (p->p_uid != u.u_uid) /* doesn't account for setuid */ + return; +#endif + (void)ttycheckoutq(tp, 1); + prf(fmt, &x1, TOTTY, tp); +} + +/* + * tprintf prints on the specified terminal (console if none) + * and logs the message. It is designed for error messages from + * single-open devices, and may be called from interrupt level + * (does not sleep). + */ +/*VARARGS2*/ +tprintf(tp, fmt, x1) + register struct tty *tp; + char *fmt; + unsigned x1; +{ + int flags = TOTTY | TOLOG; + extern struct tty cons; - prf(fmt, &x1, 2); + logpri(LOG_INFO); + if (tp == (struct tty *)NULL) + tp = &cons; + if (ttycheckoutq(tp, 0) == 0) + flags = TOLOG; + prf(fmt, &x1, flags, tp); + logwakeup(); } -prf(fmt, adx, touser) +/* + * Log writes to the log buffer, + * and guarantees not to sleep (so can be called by interrupt routines). + * If there is no process reading the log yet, it writes to the console also. + */ +/*VARARGS2*/ +log(level, fmt, x1) + char *fmt; + unsigned x1; +{ + register s = splhigh(); + extern int log_open; + + logpri(level); + prf(fmt, &x1, TOLOG, (struct tty *)0); + splx(s); + if (!log_open) + prf(fmt, &x1, TOCONS, (struct tty *)0); + logwakeup(); +} + +logpri(level) + int level; +{ + + putchar('<', TOLOG, (struct tty *)0); + printn((u_long)level, 10, TOLOG, (struct tty *)0); + putchar('>', TOLOG, (struct tty *)0); +} + +prf(fmt, adx, flags, ttyp) register char *fmt; register u_int *adx; + struct tty *ttyp; { register int b, c, i; char *s; @@ -75,9 +156,9 @@ prf(fmt, adx, touser) loop: while ((c = *fmt++) != '%') { - if(c == '\0') + if (c == '\0') return; - putchar(c, touser); + putchar(c, flags, ttyp); } again: c = *fmt++; @@ -96,45 +177,43 @@ again: case 'o': case 'O': b = 8; number: - printn((u_long)*adx, b, touser); + printn((u_long)*adx, b, flags, ttyp); break; case 'c': b = *adx; for (i = 24; i >= 0; i -= 8) if (c = (b >> i) & 0x7f) - putchar(c, touser); + putchar(c, flags, ttyp); break; case 'b': b = *adx++; s = (char *)*adx; - printn((u_long)b, *s++, touser); + printn((u_long)b, *s++, flags, ttyp); any = 0; if (b) { - putchar('<', touser); while (i = *s++) { if (b & (1 << (i-1))) { - if (any) - putchar(',', touser); + putchar(any? ',' : '<', flags, ttyp); any = 1; for (; (c = *s) > 32; s++) - putchar(c, touser); + putchar(c, flags, ttyp); } else for (; *s > 32; s++) ; } if (any) - putchar('>', touser); + putchar('>', flags, ttyp); } break; case 's': s = (char *)*adx; while (c = *s++) - putchar(c, touser); + putchar(c, flags, ttyp); break; case '%': - putchar('%', touser); + putchar('%', flags, ttyp); break; } adx++; @@ -145,14 +224,15 @@ number: * Printn prints a number n in base b. * We don't use recursion to avoid deep kernel stacks. */ -printn(n, b, touser) +printn(n, b, flags, ttyp) u_long n; + struct tty *ttyp; { char prbuf[11]; register char *cp; if (b == 10 && (int)n < 0) { - putchar('-', touser); + putchar('-', flags, ttyp); n = (unsigned)(-(int)n); } cp = prbuf; @@ -161,7 +241,7 @@ printn(n, b, touser) n /= b; } while (n); do - putchar(*--cp, touser); + putchar(*--cp, flags, ttyp); while (cp > prbuf); } @@ -192,7 +272,7 @@ tablefull(tab) char *tab; { - printf("%s: table is full\n", tab); + log(LOG_ERR, "%s: table is full\n", tab); } /* @@ -205,7 +285,7 @@ harderr(bp, cp) { printf("%s%d%c: hard error sn%d ", cp, - dkunit(bp), 'a'+(minor(bp->b_dev)&07), bp->b_blkno); + minor(bp->b_dev) >> 3, 'a'+(minor(bp->b_dev)&07), bp->b_blkno); } /* @@ -214,24 +294,24 @@ harderr(bp, cp) * are saved in msgbuf for inspection later. */ /*ARGSUSED*/ -putchar(c, touser) +putchar(c, flags, tp) register int c; + struct tty *tp; { - if (touser) { - register struct tty *tp = u.u_ttyp; + if (flags & TOTTY) { + register s = spltty(); - if (tp && (tp->t_state&TS_CARR_ON)) { - register s = spl6(); + if (tp && (tp->t_state & (TS_CARR_ON | TS_ISOPEN)) == + (TS_CARR_ON | TS_ISOPEN)) { if (c == '\n') (void) ttyoutput('\r', tp); (void) ttyoutput(c, tp); ttstart(tp); - splx(s); } - return; + splx(s); } - if (c != '\0' && c != '\r' && c != 0177 + if ((flags & TOLOG) && c != '\0' && c != '\r' && c != 0177 #ifdef vax && mfpr(MAPEN) #endif @@ -239,16 +319,15 @@ putchar(c, touser) if (msgbuf.msg_magic != MSG_MAGIC) { register int i; - msgbuf.msg_bufx = 0; msgbuf.msg_magic = MSG_MAGIC; + msgbuf.msg_bufx = msgbuf.msg_bufr = 0; for (i=0; i < MSG_BSIZE; i++) msgbuf.msg_bufc[i] = 0; } + msgbuf.msg_bufc[msgbuf.msg_bufx++] = c; if (msgbuf.msg_bufx < 0 || msgbuf.msg_bufx >= MSG_BSIZE) msgbuf.msg_bufx = 0; - msgbuf.msg_bufc[msgbuf.msg_bufx++] = c; } - if (c == 0) - return; - cnputc(c); + if ((flags & TOCONS) && c != '\0') + cnputc(c); }