static void tipc_printbuf_move(struct print_buf *pb_to, struct print_buf *pb_from) { int len; /* Handle the cases where contents can't be moved */ if (!pb_to->buf) return; if (!pb_from->buf) { tipc_printbuf_reset(pb_to); return; } if (pb_to->size < pb_from->size) { strcpy(pb_to->buf, "*** PRINT BUFFER MOVE ERROR ***"); pb_to->buf[pb_to->size - 1] = ~0; pb_to->crs = strchr(pb_to->buf, 0); return; } /* Copy data from char after cursor to end (if used) */ len = pb_from->buf + pb_from->size - pb_from->crs - 2; if ((pb_from->buf[pb_from->size - 1] == 0) && (len > 0)) { strcpy(pb_to->buf, pb_from->crs + 1); pb_to->crs = pb_to->buf + len; } else pb_to->crs = pb_to->buf; /* Copy data from start to cursor (always) */ len = pb_from->crs - pb_from->buf; strcpy(pb_to->crs, pb_from->buf); pb_to->crs += len; tipc_printbuf_reset(pb_from); }
void tipc_dump_dbg(struct print_buf *pb, const char *fmt, ...) { int len; if (pb == TIPC_CONS) return; spin_lock_bh(&print_lock); FORMAT(print_string, len, fmt); printk(print_string); printk("\n---- Start of %s log dump ----\n\n", (pb == TIPC_LOG) ? "global" : "local"); printbuf_dump(pb); tipc_printbuf_reset(pb); printk("\n---- End of dump ----\n"); spin_unlock_bh(&print_lock); }
void tipc_dump(struct print_buf *pb, const char *fmt, ...) { struct print_buf *pb_next; int len; spin_lock_bh(&print_lock); FORMAT(print_string, len, fmt); printk(print_string); for (; pb; pb = pb->next) { if (pb != TIPC_CONS) { printk("\n---- Start of %s log dump ----\n\n", (pb == TIPC_LOG) ? "global" : "local"); printbuf_dump(pb); tipc_printbuf_reset(pb); printk("\n---- End of dump ----\n"); } pb_next = pb->next; pb->next = NULL; pb = pb_next; } spin_unlock_bh(&print_lock); }
int tipc_printbuf_validate(struct print_buf *pb) { char *err = "\n\n*** PRINT BUFFER OVERFLOW ***\n\n"; char *cp_buf; struct print_buf cb; if (!pb->buf) return 0; if (pb->buf[pb->size - 1] == 0) { cp_buf = kmalloc(pb->size, GFP_ATOMIC); if (cp_buf) { tipc_printbuf_init(&cb, cp_buf, pb->size); tipc_printbuf_move(&cb, pb); tipc_printbuf_move(pb, &cb); kfree(cp_buf); memcpy(pb->buf, err, strlen(err)); } else { tipc_printbuf_reset(pb); tipc_printf(pb, err); } } return (pb->crs - pb->buf + 1); }