32 #include <sys/param.h>
33 #include <sys/systm.h>
35 #include <sys/kernel.h>
36 #include <sys/mutex.h>
37 #include <sys/msgbuf.h>
38 #include <sys/sysctl.h>
44 #define MAXPRIBUF (sizeof(intmax_t) * NBBY + 3)
47 #define SEQMOD(size) ((size) * 16)
70 mbp->msg_seqmod =
SEQMOD(size);
72 mbp->msg_magic = MSG_MAGIC;
73 mbp->msg_lastpri = -1;
75 bzero(&mbp->msg_lock,
sizeof(mbp->msg_lock));
76 mtx_init(&mbp->msg_lock,
"msgbuf", NULL, MTX_SPIN);
89 if (mbp->msg_magic != MSG_MAGIC || mbp->msg_size != size) {
93 mbp->msg_seqmod =
SEQMOD(size);
94 mbp->msg_wseq = MSGBUF_SEQNORM(mbp, mbp->msg_wseq);
95 mbp->msg_rseq = MSGBUF_SEQNORM(mbp, mbp->msg_rseq);
98 if (cksum != mbp->msg_cksum) {
100 printf(
"msgbuf cksum mismatch (read %x, calc %x)\n",
101 mbp->msg_cksum, cksum);
102 printf(
"Old msgbuf not recovered\n");
107 mbp->msg_lastpri = -1;
109 mbp->msg_flags |= MSGBUF_NEEDNL;
110 bzero(&mbp->msg_lock,
sizeof(mbp->msg_lock));
111 mtx_init(&mbp->msg_lock,
"msgbuf", NULL, MTX_SPIN);
121 bzero(mbp->msg_ptr, mbp->msg_size);
135 len = MSGBUF_SEQSUB(mbp, mbp->msg_wseq, mbp->msg_rseq);
136 if (len > mbp->msg_size)
154 pos = MSGBUF_SEQ_TO_POS(mbp, *seq);
155 mbp->msg_cksum += (u_int)(u_char)c -
156 (u_int)(u_char)mbp->msg_ptr[pos];
157 mbp->msg_ptr[pos] = c;
158 *seq = MSGBUF_SEQNORM(mbp, *seq + 1);
167 mtx_lock_spin(&mbp->msg_lock);
171 mtx_unlock_spin(&mbp->msg_lock);
186 size_t len, prefix_len;
189 int nl, i, j, needtime;
199 mtx_lock_spin(&mbp->msg_lock);
206 prefix_len =
sprintf(prefix,
"<%d>", pri);
220 if (mbp->msg_lastpri != pri && (mbp->msg_flags & MSGBUF_NEEDNL) != 0) {
223 mbp->msg_flags &= ~MSGBUF_NEEDNL;
227 for (i = 0; i < len; i++) {
233 if ((mbp->msg_flags & MSGBUF_NEEDNL) == 0 && prefix_len != 0) {
236 for (j = 0; j < prefix_len; j++)
241 (mbp->msg_flags & MSGBUF_NEEDNL) == 0) {
243 snprintf(buf,
sizeof(buf),
"[%jd] ",
245 for (j = 0; buf[j] !=
'\0'; j++)
258 if ((filter_cr != 0) && (str[i] ==
'\r'))
266 mbp->msg_flags &= ~MSGBUF_NEEDNL;
268 mbp->msg_flags |= MSGBUF_NEEDNL;
282 mbp->msg_lastpri = pri;
284 mtx_unlock_spin(&mbp->msg_lock);
298 mtx_lock_spin(&mbp->msg_lock);
300 wseq = mbp->msg_wseq;
301 len = MSGBUF_SEQSUB(mbp, wseq, mbp->msg_rseq);
303 mtx_unlock_spin(&mbp->msg_lock);
306 if (len > mbp->msg_size)
307 mbp->msg_rseq = MSGBUF_SEQNORM(mbp, wseq - mbp->msg_size);
308 c = (u_char)mbp->msg_ptr[MSGBUF_SEQ_TO_POS(mbp, mbp->msg_rseq)];
309 mbp->msg_rseq = MSGBUF_SEQNORM(mbp, mbp->msg_rseq + 1);
311 mtx_unlock_spin(&mbp->msg_lock);
323 u_int len, pos, wseq;
325 mtx_lock_spin(&mbp->msg_lock);
327 wseq = mbp->msg_wseq;
328 len = MSGBUF_SEQSUB(mbp, wseq, mbp->msg_rseq);
330 mtx_unlock_spin(&mbp->msg_lock);
333 if (len > mbp->msg_size) {
334 mbp->msg_rseq = MSGBUF_SEQNORM(mbp, wseq - mbp->msg_size);
337 pos = MSGBUF_SEQ_TO_POS(mbp, mbp->msg_rseq);
338 len = min(len, mbp->msg_size - pos);
339 len = min(len, (u_int)buflen);
341 bcopy(&mbp->msg_ptr[pos], buf, len);
342 mbp->msg_rseq = MSGBUF_SEQNORM(mbp, mbp->msg_rseq + len);
344 mtx_unlock_spin(&mbp->msg_lock);
362 u_int len, pos, wseq;
364 mtx_lock_spin(&mbp->msg_lock);
368 *seqp = MSGBUF_SEQNORM(mbp, mbp->msg_wseq - mbp->msg_size);
369 mtx_unlock_spin(&mbp->msg_lock);
373 wseq = mbp->msg_wseq;
374 len = MSGBUF_SEQSUB(mbp, wseq, *seqp);
376 mtx_unlock_spin(&mbp->msg_lock);
379 if (len > mbp->msg_size) {
380 *seqp = MSGBUF_SEQNORM(mbp, wseq - mbp->msg_size);
383 pos = MSGBUF_SEQ_TO_POS(mbp, *seqp);
384 len = min(len, mbp->msg_size - pos);
385 len = min(len, (u_int)buflen);
386 bcopy(&mbp->msg_ptr[MSGBUF_SEQ_TO_POS(mbp, *seqp)], buf, len);
387 *seqp = MSGBUF_SEQNORM(mbp, *seqp + len);
389 mtx_unlock_spin(&mbp->msg_lock);
403 for (i = 0; i < mbp->msg_size; i++)
404 sum += (u_char)mbp->msg_ptr[i];
TUNABLE_INT("kern.msgbuf_show_timestamp",&msgbuf_show_timestamp)
int snprintf(char *str, size_t size, const char *format,...)
int sprintf(char *buf, const char *cfmt,...)
static u_int msgbuf_cksum(struct msgbuf *mbp)
int msgbuf_peekbytes(struct msgbuf *mbp, char *buf, int buflen, u_int *seqp)
void msgbuf_init(struct msgbuf *mbp, void *ptr, int size)
void msgbuf_addchar(struct msgbuf *mbp, int c)
static int msgbuf_show_timestamp
void msgbuf_addstr(struct msgbuf *mbp, int pri, char *str, int filter_cr)
int msgbuf_getchar(struct msgbuf *mbp)
static void msgbuf_do_addchar(struct msgbuf *const mbp, u_int *const seq, const int c)
int printf(const char *fmt,...)
void msgbuf_copy(struct msgbuf *src, struct msgbuf *dst)
void msgbuf_reinit(struct msgbuf *mbp, void *ptr, int size)
void mtx_init(struct mtx *m, const char *name, const char *type, int opts)
void msgbuf_clear(struct msgbuf *mbp)
int msgbuf_getcount(struct msgbuf *mbp)
volatile time_t time_uptime
SYSCTL_INT(_kern, OID_AUTO, msgbuf_show_timestamp, CTLFLAG_RW|CTLFLAG_TUN,&msgbuf_show_timestamp, 0,"Show timestamp in msgbuf")
int msgbuf_getbytes(struct msgbuf *mbp, char *buf, int buflen)