Beispiel #1
0
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;
}