37#include <sys/kernel.h>
39#include <sys/msgbuf.h>
40#include <sys/sysctl.h>
46#define MAXPRIBUF (sizeof(intmax_t) * NBBY + 3)
49#define SEQMOD(size) ((size) * 16)
71 mbp->msg_seqmod =
SEQMOD(size);
72 mbp->msg_lastpri = -1;
75 mbp->msg_magic = MSG_MAGIC;
76 bzero(&mbp->msg_lock,
sizeof(mbp->msg_lock));
77 mtx_init(&mbp->msg_lock,
"msgbuf", NULL, MTX_SPIN);
90 if (mbp->msg_magic != MSG_MAGIC || mbp->msg_size != size) {
94 mbp->msg_seqmod =
SEQMOD(size);
95 mbp->msg_wseq = MSGBUF_SEQNORM(mbp, mbp->msg_wseq);
96 mbp->msg_rseq = MSGBUF_SEQNORM(mbp, mbp->msg_rseq);
99 if (cksum != mbp->msg_cksum) {
101 printf(
"msgbuf cksum mismatch (read %x, calc %x)\n",
102 mbp->msg_cksum, cksum);
103 printf(
"Old msgbuf not recovered\n");
108 mbp->msg_lastpri = -1;
110 mbp->msg_flags |= MSGBUF_NEEDNL;
111 bzero(&mbp->msg_lock,
sizeof(mbp->msg_lock));
112 mtx_init(&mbp->msg_lock,
"msgbuf", NULL, MTX_SPIN);
122 bzero(mbp->msg_ptr, mbp->msg_size);
126 mbp->msg_flags &= ~MSGBUF_WRAP;
137 len = MSGBUF_SEQSUB(mbp, mbp->msg_wseq, mbp->msg_rseq);
138 if (len > mbp->msg_size)
155 pos = MSGBUF_SEQ_TO_POS(mbp, mbp->msg_wseq);
156 mbp->msg_cksum += (u_int)(u_char)c -
157 (u_int)(u_char)mbp->msg_ptr[pos];
158 mbp->msg_ptr[pos] = c;
159 mbp->msg_wseq = MSGBUF_SEQADD(mbp, mbp->msg_wseq, 1);
168 mtx_lock_spin(&mbp->msg_lock);
171 if (mbp->msg_wseq >= mbp->msg_size)
172 mbp->msg_flags |= MSGBUF_WRAP;
174 mtx_unlock_spin(&mbp->msg_lock);
188 size_t len, prefix_len;
200 mtx_lock_spin(&mbp->msg_lock);
207 prefix_len =
sprintf(prefix,
"<%d>", pri);
216 if (mbp->msg_lastpri != pri && (mbp->msg_flags & MSGBUF_NEEDNL) != 0) {
218 mbp->msg_flags &= ~MSGBUF_NEEDNL;
222 for (i = 0; i < len; i++) {
228 if ((mbp->msg_flags & MSGBUF_NEEDNL) == 0 && prefix_len != 0) {
231 for (j = 0; j < prefix_len; j++)
236 (mbp->msg_flags & MSGBUF_NEEDNL) == 0) {
239 for (j = 0;
buf[j] !=
'\0'; j++)
252 if ((filter_cr != 0) && (str[i] ==
'\r'))
260 mbp->msg_flags &= ~MSGBUF_NEEDNL;
262 mbp->msg_flags |= MSGBUF_NEEDNL;
266 if (mbp->msg_wseq >= mbp->msg_size)
267 mbp->msg_flags |= MSGBUF_WRAP;
272 mbp->msg_lastpri = pri;
274 mtx_unlock_spin(&mbp->msg_lock);
288 mtx_lock_spin(&mbp->msg_lock);
290 wseq = mbp->msg_wseq;
291 len = MSGBUF_SEQSUB(mbp, wseq, mbp->msg_rseq);
293 mtx_unlock_spin(&mbp->msg_lock);
296 if (len > mbp->msg_size)
297 mbp->msg_rseq = MSGBUF_SEQSUB(mbp, wseq, mbp->msg_size);
298 c = (u_char)mbp->msg_ptr[MSGBUF_SEQ_TO_POS(mbp, mbp->msg_rseq)];
299 mbp->msg_rseq = MSGBUF_SEQADD(mbp, mbp->msg_rseq, 1);
301 mtx_unlock_spin(&mbp->msg_lock);
313 u_int len, pos, wseq;
315 mtx_lock_spin(&mbp->msg_lock);
317 wseq = mbp->msg_wseq;
318 len = MSGBUF_SEQSUB(mbp, wseq, mbp->msg_rseq);
320 mtx_unlock_spin(&mbp->msg_lock);
323 if (len > mbp->msg_size) {
324 mbp->msg_rseq = MSGBUF_SEQSUB(mbp, wseq, mbp->msg_size);
327 pos = MSGBUF_SEQ_TO_POS(mbp, mbp->msg_rseq);
328 len = min(len, mbp->msg_size - pos);
329 len = min(len, (u_int)buflen);
331 bcopy(&mbp->msg_ptr[pos],
buf, len);
332 mbp->msg_rseq = MSGBUF_SEQADD(mbp, mbp->msg_rseq, len);
334 mtx_unlock_spin(&mbp->msg_lock);
352 u_int len, pos, wseq;
354 mtx_lock_spin(&mbp->msg_lock);
358 if (mbp->msg_flags & MSGBUF_WRAP)
359 *seqp = MSGBUF_SEQSUB(mbp, mbp->msg_wseq, mbp->msg_size);
362 mtx_unlock_spin(&mbp->msg_lock);
366 wseq = mbp->msg_wseq;
367 len = MSGBUF_SEQSUB(mbp, wseq, *seqp);
369 mtx_unlock_spin(&mbp->msg_lock);
372 if (len > mbp->msg_size) {
373 *seqp = MSGBUF_SEQSUB(mbp, wseq, mbp->msg_size);
376 pos = MSGBUF_SEQ_TO_POS(mbp, *seqp);
377 len = min(len, mbp->msg_size - pos);
378 len = min(len, (u_int)buflen);
379 bcopy(&mbp->msg_ptr[MSGBUF_SEQ_TO_POS(mbp, *seqp)],
buf, len);
380 *seqp = MSGBUF_SEQADD(mbp, *seqp, len);
382 mtx_unlock_spin(&mbp->msg_lock);
396 for (i = 0; i < mbp->msg_size; i++)
397 sum += (u_char)mbp->msg_ptr[i];
421 mtx_lock_spin(&
src->msg_lock);
422 bcopy(
src, dst,
sizeof(
struct msgbuf));
423 dst->msg_ptr = dst_msgptr;
424 bcopy(
src->msg_ptr, dst->msg_ptr,
src->msg_size);
425 mtx_unlock_spin(&
src->msg_lock);
volatile time_t time_uptime
struct intr_irqsrc ** src
void msgbuf_duplicate(struct msgbuf *src, struct msgbuf *dst, char *dst_msgptr)
void msgbuf_addstr(struct msgbuf *mbp, int pri, const char *str, int filter_cr)
int msgbuf_getchar(struct msgbuf *mbp)
void msgbuf_reinit(struct msgbuf *mbp, void *ptr, int size)
int msgbuf_getcount(struct msgbuf *mbp)
static int msgbuf_show_timestamp
SYSCTL_INT(_kern, OID_AUTO, msgbuf_show_timestamp, CTLFLAG_RWTUN, &msgbuf_show_timestamp, 0, "Show timestamp in msgbuf")
int msgbuf_getbytes(struct msgbuf *mbp, char *buf, int buflen)
int msgbuf_peekbytes(struct msgbuf *mbp, char *buf, int buflen, u_int *seqp)
void msgbuf_clear(struct msgbuf *mbp)
static void msgbuf_do_addchar(struct msgbuf *const mbp, const int c)
void msgbuf_copy(struct msgbuf *src, struct msgbuf *dst)
void msgbuf_addchar(struct msgbuf *mbp, int c)
static u_int msgbuf_cksum(struct msgbuf *mbp)
void msgbuf_init(struct msgbuf *mbp, void *ptr, int size)
int printf(const char *fmt,...)
int sprintf(char *buf, const char *cfmt,...)
int snprintf(char *str, size_t size, const char *format,...)