void db_dmesg(db_expr_t addr, bool haddr, db_expr_t count, const char *modif) { struct kern_msgbuf mb, *mbp; db_expr_t print; int newl, skip, i; char *p, *bufdata, ch; if (!db_read_int("msgbufenabled")) { db_printf("message buffer not available\n"); return; } mbp = (struct kern_msgbuf *)db_read_ptr("msgbufp"); db_read_bytes((db_addr_t)mbp, sizeof(mb), (char *)&mb); if (mb.msg_magic != MSG_MAGIC) { db_printf("message buffer not available\n"); return; } bufdata = &mbp->msg_bufc[0]; if (haddr && addr < mb.msg_bufs) print = addr; else print = mb.msg_bufs; for (newl = skip = i = 0, p = bufdata + mb.msg_bufx; i < mb.msg_bufs; i++, p++) { if (p == bufdata + mb.msg_bufs) p = bufdata; if (i < mb.msg_bufs - print) { continue; } db_read_bytes((db_addr_t)p, sizeof(ch), &ch); /* Skip "\n<.*>" syslog sequences. */ if (skip) { if (ch == '>') newl = skip = 0; continue; } if (newl && ch == '<') { skip = 1; continue; } if (ch == '\0') continue; newl = ch == '\n'; db_printf("%c", ch); } if (!newl) db_printf("\n"); }
int db_sread_int(database_handle_t *db) { int r; bool ok = db_read_int(db, &r); if (!ok) { slog(LG_ERROR, "db-read-int: needed int at file %s line %d token %d", db->file, db->line, db->token); slog(LG_ERROR, "db-read-int: exiting to avoid data loss"); exit(EXIT_FAILURE); } return r; }