44#include "opt_printf.h"
54#include <sys/kernel.h>
55#include <sys/msgbuf.h>
56#include <sys/malloc.h>
59#include <sys/stddef.h>
60#include <sys/sysctl.h>
62#include <sys/syslog.h>
80#include <machine/stdarg.h>
100#define MAXNBUF (sizeof(intmax_t) * NBBY + 1)
120static void msglogstr(
char *str,
int pri,
int filter_cr);
122static void putchar(
int ch,
void *arg);
123static char *
ksprintn(
char *
nbuf, uintmax_t num,
int base,
int *len,
int upper);
131#define BOOT_TAG_SZ 32
135#define BOOT_TAG "---<<BOOT>>---"
164 log(LOG_ERR,
"%s: table is full\n", tab);
180 if (TD_IS_IDLETHREAD(td))
194 if ((p->p_flag & P_CONTROLT) == 0) {
199 SESS_LOCK(p->p_session);
200 pca.
tty = p->p_session->s_ttyp;
201 SESS_UNLOCK(p->p_session);
203 if (pca.
tty == NULL) {
223tprintf(
struct proc *p,
int pri,
const char *fmt, ...)
233vtprintf(
struct proc *p,
int pri,
const char *fmt, va_list ap)
235 struct tty *tp = NULL;
238 struct session *sess = NULL;
245 if (p->p_flag & P_CONTROLT && p->p_session->s_ttyvp) {
277#ifdef PRINTF_BUFR_SIZE
278 char bufr[PRINTF_BUFR_SIZE];
285#ifdef PRINTF_BUFR_SIZE
288 pca.
n_bufr =
sizeof(bufr);
289 pca.
remain =
sizeof(bufr);
298#ifdef PRINTF_BUFR_SIZE
343 pri = LOG_INFO | LOG_CONSOLE;
348 while (uio->uio_resid > 0) {
350 error =
uiomove(consbuffer, c, uio);
354 consbuffer[c] =
'\0';
355 if (consbuffer[c - 1] ==
'\n')
387 consbuffer[0] =
'\n';
388 consbuffer[1] =
'\0';
393 free(consbuffer, M_TEMP);
416 if (!KERNEL_PANICKED())
430 if ((!KERNEL_PANICKED()) && (constty != NULL))
446 if ((!KERNEL_PANICKED()) && (constty != NULL))
470 if (ap->
remain == 2 || c ==
'\n') {
486 KASSERT(ap->
remain > 2, (
"Bad buffer logic, remain = %zd",
500 struct tty *tp = ap->
tty;
510 if ((
flags &
TOTTY) && tp != NULL && !KERNEL_PANICKED())
527 retval =
kvprintf(cfmt, NULL, (
void *)
buf, 10, ap);
541 retval =
kvprintf(cfmt, NULL, (
void *)
buf, 10, ap);
550snprintf(
char *str,
size_t size,
const char *format, ...)
555 va_start(ap, format);
556 retval =
vsnprintf(str, size, format, ap);
565vsnprintf(
char *str,
size_t size,
const char *format, va_list ap)
582vsnrprintf(
char *
str,
size_t size,
int radix,
const char *format, va_list ap)
620 c = hex2ascii(num % base);
621 *++p = upper ? toupper(c) : c;
622 }
while (num /= base);
655kvprintf(
char const *fmt,
void (*func)(
int,
void*),
void *arg,
int radix, va_list ap)
657#define PCHAR(c) {int cc=(c); if (func) (*func)(cc,arg); else *d++ = cc; retval++; }
660 const char *p, *percent, *q;
664 int base, lflag, qflag, tmp, width, ladjust, sharpflag, neg, sign, dot;
665 int cflag, hflag, jflag, tflag, zflag;
666 int bconv, dwidth, upper;
668 int stop = 0, retval = 0;
678 fmt =
"(fmt null)\n";
680 if (radix < 2 || radix > 36)
686 while ((ch = (u_char)*fmt++) !=
'%' ||
stop) {
692 qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
693 sign = 0; dot = 0; bconv = 0; dwidth = 0; upper = 0;
694 cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0;
695reswitch:
switch (ch = (u_char)*fmt++) {
713 width = va_arg(ap,
int);
719 dwidth = va_arg(ap,
int);
728 case '1':
case '2':
case '3':
case '4':
729 case '5':
case '6':
case '7':
case '8':
case '9':
730 for (n = 0;; ++fmt) {
731 n = n * 10 + ch -
'0';
733 if (ch < '0' || ch >
'9')
748 if (!ladjust && width > 0)
751 PCHAR(va_arg(ap,
int));
752 if (ladjust && width > 0)
757 up = va_arg(ap, u_char *);
758 p = va_arg(ap,
char *);
762 PCHAR(hex2ascii(*up >> 4));
763 PCHAR(hex2ascii(*up & 0x0f));
798 (void)va_arg(ap, intmax_t *);
800 (void)va_arg(ap, quad_t *);
802 (void)va_arg(ap,
long *);
804 (void)va_arg(ap,
size_t *);
806 (void)va_arg(ap,
short *);
808 (void)va_arg(ap,
char *);
810 (
void)va_arg(ap,
int *);
817 sharpflag = (width == 0);
819 num = (uintptr_t)va_arg(ap,
void *);
830 p = va_arg(ap,
char *);
836 for (n = 0; n < dwidth && p[n]; n++)
841 if (!ladjust && width > 0)
846 if (ladjust && width > 0)
872 num = va_arg(ap, uintmax_t);
874 num = va_arg(ap, u_quad_t);
876 num = va_arg(ap, ptrdiff_t);
878 num = va_arg(ap, u_long);
880 num = va_arg(ap,
size_t);
882 num = (u_short)va_arg(ap,
int);
884 num = (u_char)va_arg(ap,
int);
886 num = va_arg(ap, u_int);
888 q = va_arg(ap,
char *);
894 num = va_arg(ap, intmax_t);
896 num = va_arg(ap, quad_t);
898 num = va_arg(ap, ptrdiff_t);
900 num = va_arg(ap,
long);
902 num = va_arg(ap, ssize_t);
904 num = (short)va_arg(ap,
int);
906 num = (char)va_arg(ap,
int);
908 num = va_arg(ap,
int);
910 if (sign && (intmax_t)num < 0) {
912 num = -(intmax_t)num;
916 if (sharpflag && num != 0) {
925 if (!ladjust && padc ==
'0')
926 dwidth = width - tmp;
927 width -= tmp + imax(dwidth, n);
934 if (sharpflag && num != 0) {
937 }
else if (base == 16) {
948 if (bconv && num != 0) {
953 if (num & (1 << (n - 1))) {
954 PCHAR(retval != tmp ?
956 for (; (n = *q) >
' '; ++q)
959 for (; *q >
' '; ++q)
964 width -= retval - tmp;
974 while (percent < fmt)
995 static int lastpri = -1;
1002 if (c ==
'\0' || c ==
'\r')
1004 if (pri != -1 && pri != lastpri) {
1010 for (p =
ksprintn(
nbuf, (uintmax_t)pri, 10, NULL, 0); *p;)
1037 static struct msgbuf *oldp = NULL;
1038 bool print_boot_tag;
1040 size -=
sizeof(*msgbufp);
1047 msgbufp = (
struct msgbuf *)(cp + size);
1078 return (SYSCTL_OUT(req,
"", 1));
1081 bp = memchr(
buf,
'\n', len);
1104 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
1114 if (!error && req->newptr) {
1124 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_SECURE | CTLFLAG_MPSAFE,
1126 "Clear kernel message buffer");
1130DB_SHOW_COMMAND(msgbuf, db_show_msgbuf)
1135 db_printf(
"msgbuf not mapped yet\n");
1138 db_printf(
"msgbufp = %p\n",
msgbufp);
1139 db_printf(
"magic = %x, size = %d, r= %u, w = %u, ptr = %p, cksum= %u\n",
1142 for (i = 0; i <
msgbufp->msg_size && !db_pager_quit; i++) {
1144 db_printf(
"%c",
msgbufp->msg_ptr[j]);
1156 const unsigned char *cp;
1159 if ((
flags & HD_DELIM_MASK) != 0)
1160 delim = (
flags & HD_DELIM_MASK) >> 8;
1164 if ((
flags & HD_COLUMN_MASK) != 0)
1165 cols =
flags & HD_COLUMN_MASK;
1170 for (i = 0; i < length; i+= cols) {
1174 if ((
flags & HD_OMIT_COUNT) == 0)
1177 if ((
flags & HD_OMIT_HEX) == 0) {
1178 for (j = 0; j < cols; j++) {
1181 printf(
"%c%02x", delim, cp[k]);
1187 if ((
flags & HD_OMIT_CHARS) == 0) {
1189 for (j = 0; j < cols; j++) {
1193 else if (cp[k] >=
' ' && cp[k] <=
'~')
1211 const unsigned char *cp;
1214 if ((
flags & HD_DELIM_MASK) != 0)
1215 delim = (
flags & HD_DELIM_MASK) >> 8;
1219 if ((
flags & HD_COLUMN_MASK) != 0)
1220 cols =
flags & HD_COLUMN_MASK;
1225 for (i = 0; i < length; i+= cols) {
1229 if ((
flags & HD_OMIT_COUNT) == 0)
1232 if ((
flags & HD_OMIT_HEX) == 0) {
1233 for (j = 0; j < cols; j++) {
1242 if ((
flags & HD_OMIT_CHARS) == 0) {
1244 for (j = 0; j < cols; j++) {
1248 else if (cp[k] >=
' ' && cp[k] <=
'~')
1270 if (atomic_cmpset_int(counter, c, c - 1)) {
1272 log(LOG_INFO,
"pid %d (%s) %s%s\n",
1273 td->td_proc->p_pid, td->td_name, msg,
1274 c > 1 ?
"" :
" - not logging anymore");
1313 dataptr = __DECONST(
char *,
data);
1314 dataptr[len] =
'\0';
1319 dataptr[len] = oldchr;
1330 if (retvalptr != NULL)
const struct cf_level * level
void cnputs(const char *p)
void *() malloc(size_t size, struct malloc_type *mtp, int flags)
void free(void *addr, struct malloc_type *mtp)
int priv_check(struct thread *td, int priv)
void sess_hold(struct session *s)
struct sx __exclusive_cache_line proctree_lock
void sess_release(struct session *s)
int sysctl_handle_opaque(SYSCTL_HANDLER_ARGS)
int sysctl_handle_int(SYSCTL_HANDLER_ARGS)
u_char __read_frequently kdb_active
void msgbuf_addstr(struct msgbuf *mbp, int pri, const char *str, int filter_cr)
void msgbuf_reinit(struct msgbuf *mbp, void *ptr, int size)
int msgbuf_peekbytes(struct msgbuf *mbp, char *buf, int buflen, u_int *seqp)
void msgbuf_clear(struct msgbuf *mbp)
void msgbuf_copy(struct msgbuf *src, struct msgbuf *dst)
void msgbuf_addchar(struct msgbuf *mbp, int c)
static void msglogstr(char *str, int pri, int filter_cr)
static int sysctl_kern_msgbuf_clear(SYSCTL_HANDLER_ARGS)
static void msglogchar(int c, int pri)
void counted_warning(unsigned *counter, const char *msg)
void hexdump(const void *ptr, int length, const char *hdr, int flags)
void tablefull(const char *tab)
int vsnprintf(char *str, size_t size, const char *format, va_list ap)
static void snprintf_func(int ch, void *arg)
SYSCTL_INT(_kern, OID_AUTO, log_console_output, CTLFLAG_RWTUN, &log_console_output, 0, "Duplicate console output to the syslog")
int vsprintf(char *buf, const char *cfmt, va_list ap)
int sbuf_printf_drain(void *arg, const char *data, int len)
int vsnrprintf(char *str, size_t size, int radix, const char *format, va_list ap)
int printf(const char *fmt,...)
static int log_console_output
static void prf_putchar(int c, int flags, int pri)
void sbuf_hexdump(struct sbuf *sb, const void *ptr, int length, const char *hdr, int flags)
void vlog(int level, const char *fmt, va_list ap)
int vprintf(const char *fmt, va_list ap)
int kvprintf(char const *fmt, void(*func)(int, void *), void *arg, int radix, va_list ap)
void vtprintf(struct proc *p, int pri, const char *fmt, va_list ap)
SYSCTL_PROC(_kern, OID_AUTO, msgbuf, CTLTYPE_STRING|CTLFLAG_RD|CTLFLAG_MPSAFE, NULL, 0, sysctl_kern_msgbuf, "A", "Contents of kernel message buffer")
void msgbufinit(void *ptr, int size)
static int msgbuf_clearflag
void tprintf(struct proc *p, int pri, const char *fmt,...)
int sprintf(char *buf, const char *cfmt,...)
static int _vprintf(int level, int flags, const char *fmt, va_list ap)
static void putbuf(int c, struct putchar_arg *ap)
SYSCTL_STRING(_kern, OID_AUTO, boot_tag, CTLFLAG_RDTUN|CTLFLAG_NOFETCH, current_boot_tag, 0, "Tag added to dmesg at start of boot")
static int log_console_add_linefeed
static int sysctl_kern_msgbuf(SYSCTL_HANDLER_ARGS)
void log_console(struct uio *uio)
static int always_console_output
static char current_boot_tag[BOOT_TAG_SZ+1]
static void prf_putbuf(char *bufr, int flags, int pri)
int snprintf(char *str, size_t size, const char *format,...)
int uprintf(const char *fmt,...)
static char * ksprintn(char *nbuf, uintmax_t num, int base, int *len, int upper)
static void putchar(int ch, void *arg)
void log(int level, const char *fmt,...)
void sbuf_putbuf(struct sbuf *sb)
int sbuf_printf(struct sbuf *s, const char *fmt,...)
char * sbuf_data(struct sbuf *s)
struct uio * cloneuio(struct uio *uiop)
int uiomove(void *cp, int n, struct uio *uio)
int tty_checkoutq(struct tty *tp)
int tty_putchar(struct tty *tp, char c)