37 #include <sys/cdefs.h>
41 #include "opt_printf.h"
43 #include <sys/param.h>
44 #include <sys/systm.h>
47 #include <sys/mutex.h>
49 #include <sys/kernel.h>
50 #include <sys/msgbuf.h>
51 #include <sys/malloc.h>
54 #include <sys/stddef.h>
55 #include <sys/sysctl.h>
57 #include <sys/syslog.h>
60 #include <sys/ctype.h>
70 #include <machine/stdarg.h>
77 #define MAXNBUF (sizeof(intmax_t) * NBBY + 1)
97 static void msglogstr(
char *str,
int pri,
int filter_cr);
98 static void putchar(
int ch,
void *arg);
99 static char *
ksprintn(
char *
nbuf, uintmax_t num,
int base,
int *len,
int upper);
130 log(LOG_ERR,
"%s: table is full\n", tab);
146 if (TD_IS_IDLETHREAD(td))
152 if ((p->p_flag & P_CONTROLT) == 0) {
157 SESS_LOCK(p->p_session);
158 pca.
tty = p->p_session->s_ttyp;
159 SESS_UNLOCK(p->p_session);
161 if (pca.
tty == NULL) {
181 tprintf(
struct proc *p,
int pri,
const char *fmt, ...)
183 struct tty *tp = NULL;
187 struct session *sess = NULL;
194 if (p->p_flag & P_CONTROLT && p->p_session->s_ttyvp) {
249 #ifdef PRINTF_BUFR_SIZE
250 char bufr[PRINTF_BUFR_SIZE];
256 #ifdef PRINTF_BUFR_SIZE
259 pca.
n_bufr =
sizeof(bufr);
260 pca.
remain =
sizeof(bufr);
269 #ifdef PRINTF_BUFR_SIZE
271 if (*pca.
p_bufr !=
'\0') {
300 #define CONSCHUNK 128
312 pri = LOG_INFO | LOG_CONSOLE;
317 while (uio->uio_resid > 0) {
319 error =
uiomove(consbuffer, c, uio);
323 consbuffer[c] =
'\0';
324 if (consbuffer[c - 1] ==
'\n')
356 consbuffer[0] =
'\n';
357 consbuffer[1] =
'\0';
362 free(consbuffer, M_TEMP);
412 if (ap->
remain == 2 || c ==
'\n') {
418 if ((
panicstr == NULL) && (constty != NULL))
439 KASSERT(ap->
remain > 2, (
"Bad buffer logic, remain = %zd",
453 struct tty *tp = ap->
tty;
454 int flags = ap->
flags;
470 if ((flags &
TOLOG) && (putbuf_done == 0)) {
486 retval =
kvprintf(cfmt, NULL, (
void *)buf, 10, ap);
500 retval =
kvprintf(cfmt, NULL, (
void *)buf, 10, ap);
509 snprintf(
char *str,
size_t size,
const char *format, ...)
514 va_start(ap, format);
515 retval =
vsnprintf(str, size, format, ap);
524 vsnprintf(
char *str,
size_t size,
const char *format, va_list ap)
541 vsnrprintf(
char *
str,
size_t size,
int radix,
const char *format, va_list ap)
579 c = hex2ascii(num % base);
580 *++p = upper ? toupper(c) : c;
581 }
while (num /= base);
614 kvprintf(
char const *fmt,
void (*func)(
int,
void*),
void *arg,
int radix, va_list ap)
616 #define PCHAR(c) {int cc=(c); if (func) (*func)(cc,arg); else *d++ = cc; retval++; }
619 const char *p, *percent, *q;
623 int base, lflag,
qflag, tmp, width, ladjust, sharpflag, neg, sign, dot;
624 int cflag, hflag, jflag, tflag, zflag;
627 int stop = 0, retval = 0;
636 fmt =
"(fmt null)\n";
638 if (radix < 2 || radix > 36)
644 while ((ch = (u_char)*fmt++) !=
'%' ||
stop) {
650 qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
651 sign = 0; dot = 0; dwidth = 0; upper = 0;
652 cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0;
653 reswitch:
switch (ch = (u_char)*fmt++) {
671 width = va_arg(ap,
int);
677 dwidth = va_arg(ap,
int);
685 case '1':
case '2':
case '3':
case '4':
686 case '5':
case '6':
case '7':
case '8':
case '9':
687 for (n = 0;; ++fmt) {
688 n = n * 10 + ch -
'0';
690 if (ch < '0' || ch >
'9')
699 num = (u_int)va_arg(ap,
int);
700 p = va_arg(ap,
char *);
701 for (q =
ksprintn(nbuf, num, *p++, NULL, 0); *q;)
709 if (num & (1 << (n - 1))) {
710 PCHAR(tmp ?
',' :
'<');
711 for (; (n = *p) >
' '; ++p)
715 for (; *p >
' '; ++p)
722 PCHAR(va_arg(ap,
int));
725 up = va_arg(ap, u_char *);
726 p = va_arg(ap,
char *);
730 PCHAR(hex2ascii(*up >> 4));
731 PCHAR(hex2ascii(*up & 0x0f));
762 *(va_arg(ap, intmax_t *)) = retval;
764 *(va_arg(ap, quad_t *)) = retval;
766 *(va_arg(ap,
long *)) = retval;
768 *(va_arg(ap,
size_t *)) = retval;
770 *(va_arg(ap,
short *)) = retval;
772 *(va_arg(ap,
char *)) = retval;
774 *(va_arg(ap,
int *)) = retval;
781 sharpflag = (width == 0);
783 num = (uintptr_t)va_arg(ap,
void *);
794 p = va_arg(ap,
char *);
800 for (n = 0; n < dwidth && p[n]; n++)
805 if (!ladjust && width > 0)
810 if (ladjust && width > 0)
835 num = va_arg(ap, uintmax_t);
837 num = va_arg(ap, u_quad_t);
839 num = va_arg(ap, ptrdiff_t);
841 num = va_arg(ap, u_long);
843 num = va_arg(ap,
size_t);
845 num = (u_short)va_arg(ap,
int);
847 num = (u_char)va_arg(ap,
int);
849 num = va_arg(ap, u_int);
853 num = va_arg(ap, intmax_t);
855 num = va_arg(ap, quad_t);
857 num = va_arg(ap, ptrdiff_t);
859 num = va_arg(ap,
long);
861 num = va_arg(ap, ssize_t);
863 num = (short)va_arg(ap,
int);
865 num = (char)va_arg(ap,
int);
867 num = va_arg(ap,
int);
869 if (sign && (intmax_t)num < 0) {
871 num = -(intmax_t)num;
873 p =
ksprintn(nbuf, num, base, &n, upper);
875 if (sharpflag && num != 0) {
884 if (!ladjust && padc ==
'0')
885 dwidth = width - tmp;
886 width -= tmp + imax(dwidth, n);
893 if (sharpflag && num != 0) {
896 }
else if (base == 16) {
913 while (percent < fmt)
934 static int lastpri = -1;
941 if (c ==
'\0' || c ==
'\r')
943 if (pri != -1 && pri != lastpri) {
949 for (p =
ksprintn(nbuf, (uintmax_t)pri, 10, NULL, 0); *p;)
976 static struct msgbuf *oldp = NULL;
978 size -=
sizeof(*msgbufp);
980 msgbufp = (
struct msgbuf *)(cp + size);
989 SYSCTL_INT(_security_bsd, OID_AUTO, unprivileged_read_msgbuf,
990 CTLFLAG_RW, &unprivileged_read_msgbuf, 0,
991 "Unprivileged processes may read the kernel message buffer");
1001 if (!unprivileged_read_msgbuf) {
1025 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
1035 if (!error && req->newptr) {
1039 msgbuf_clearflag = 0;
1045 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE | CTLFLAG_MPSAFE,
1047 "Clear kernel message buffer");
1051 DB_SHOW_COMMAND(msgbuf, db_show_msgbuf)
1056 db_printf(
"msgbuf not mapped yet\n");
1059 db_printf(
"msgbufp = %p\n", msgbufp);
1060 db_printf(
"magic = %x, size = %d, r= %u, w = %u, ptr = %p, cksum= %u\n",
1061 msgbufp->msg_magic, msgbufp->msg_size, msgbufp->msg_rseq,
1062 msgbufp->msg_wseq, msgbufp->msg_ptr, msgbufp->msg_cksum);
1063 for (i = 0; i < msgbufp->msg_size && !db_pager_quit; i++) {
1064 j = MSGBUF_SEQ_TO_POS(msgbufp, i + msgbufp->msg_rseq);
1065 db_printf(
"%c", msgbufp->msg_ptr[j]);
1073 hexdump(
const void *ptr,
int length,
const char *hdr,
int flags)
1077 const unsigned char *cp;
1080 if ((flags & HD_DELIM_MASK) != 0)
1081 delim = (flags & HD_DELIM_MASK) >> 8;
1085 if ((flags & HD_COLUMN_MASK) != 0)
1086 cols = flags & HD_COLUMN_MASK;
1091 for (i = 0; i < length; i+= cols) {
1095 if ((flags & HD_OMIT_COUNT) == 0)
1098 if ((flags & HD_OMIT_HEX) == 0) {
1099 for (j = 0; j < cols; j++) {
1102 printf(
"%c%02x", delim, cp[k]);
1108 if ((flags & HD_OMIT_CHARS) == 0) {
1110 for (j = 0; j < cols; j++) {
1114 else if (cp[k] >=
' ' && cp[k] <=
'~')
static char * ksprintn(char *nbuf, uintmax_t num, int base, int *len, int upper)
struct uio * cloneuio(struct uio *uiop)
int vsnrprintf(char *str, size_t size, int radix, const char *format, va_list ap)
static int _vprintf(int level, int flags, const char *fmt, va_list ap)
int snprintf(char *str, size_t size, const char *format,...)
void sess_hold(struct session *s)
static int log_console_output
int sprintf(char *buf, const char *cfmt,...)
void * malloc(unsigned long size, struct malloc_type *mtp, int flags)
static int sysctl_kern_msgbuf_clear(SYSCTL_HANDLER_ARGS)
int kvprintf(char const *fmt, void(*func)(int, void *), void *arg, int radix, va_list ap)
void sess_release(struct session *s)
static void putchar(int ch, void *arg)
void hexdump(const void *ptr, int length, const char *hdr, int flags)
int uprintf(const char *fmt,...)
void tablefull(const char *tab)
TUNABLE_INT("kern.log_console_output",&log_console_output)
int vsnprintf(char *str, size_t size, const char *format, va_list ap)
void tprintf(struct proc *p, int pri, const char *fmt,...)
int ttyprintf(struct tty *tp, const char *fmt,...)
static int sysctl_kern_msgbuf(SYSCTL_HANDLER_ARGS)
int priv_check(struct thread *td, int priv)
int msgbuf_peekbytes(struct msgbuf *mbp, char *buf, int buflen, u_int *seqp)
static void msglogstr(char *str, int pri, int filter_cr)
void msgbuf_addchar(struct msgbuf *mbp, int c)
void log_console(struct uio *uio)
int sysctl_handle_opaque(SYSCTL_HANDLER_ARGS)
int vsprintf(char *buf, const char *cfmt, va_list ap)
void msgbuf_addstr(struct msgbuf *mbp, int pri, char *str, int filter_cr)
int tty_putchar(struct tty *tp, char c)
int sysctl_handle_int(SYSCTL_HANDLER_ARGS)
void log(int level, const char *fmt,...)
int tty_checkoutq(struct tty *tp)
SYSCTL_PROC(_kern, OID_AUTO, msgbuf, CTLTYPE_STRING|CTLFLAG_RD|CTLFLAG_MPSAFE, NULL, 0, sysctl_kern_msgbuf,"A","Contents of kernel message buffer")
int uiomove(void *cp, int n, struct uio *uio)
void free(void *addr, struct malloc_type *mtp)
int printf(const char *fmt,...)
void msgbuf_copy(struct msgbuf *src, struct msgbuf *dst)
void msgbufinit(void *ptr, int size)
static void putbuf(int c, struct putchar_arg *ap)
static int unprivileged_read_msgbuf
void msgbuf_reinit(struct msgbuf *mbp, void *ptr, int size)
SYSCTL_INT(_kern, OID_AUTO, log_console_output, CTLFLAG_RW,&log_console_output, 0,"Duplicate console output to the syslog.")
static int msgbuf_clearflag
int vprintf(const char *fmt, va_list ap)
void msgbuf_clear(struct msgbuf *mbp)
static int always_console_output
static int log_console_add_linefeed
static void snprintf_func(int ch, void *arg)
const struct cf_level * level
static void msglogchar(int c, int pri)