| 769 | }; |
| 770 | |
| 771 | static void log_one_line(struct timerel diff, |
| 772 | enum log_level level, |
| 773 | const struct node_id *node_id, |
| 774 | const char *prefix, |
| 775 | const char *log, |
| 776 | size_t loglen, |
| 777 | const u8 *io, |
| 778 | size_t iolen, |
| 779 | struct log_data *data) |
| 780 | { |
| 781 | char buf[101]; |
| 782 | |
| 783 | snprintf(buf, sizeof(buf), "%s+%lu.%09u %s%s: ", |
| 784 | data->prefix, |
| 785 | (unsigned long)diff.ts.tv_sec, |
| 786 | (unsigned)diff.ts.tv_nsec, |
| 787 | prefix, |
| 788 | level == LOG_IO_IN ? "IO_IN" |
| 789 | : level == LOG_IO_OUT ? "IO_OUT" |
| 790 | : level == LOG_TRACE ? "TRACE" |
| 791 | : level == LOG_DBG ? "DEBUG" |
| 792 | : level == LOG_INFORM ? "INFO" |
| 793 | : level == LOG_UNUSUAL ? "UNUSUAL" |
| 794 | : level == LOG_BROKEN ? "BROKEN" |
| 795 | : "**INVALID**"); |
| 796 | |
| 797 | write_all(data->fd, buf, strlen(buf)); |
| 798 | write_all(data->fd, log, loglen); |
| 799 | if (level == LOG_IO_IN || level == LOG_IO_OUT) { |
| 800 | size_t off, used; |
| 801 | |
| 802 | /* No allocations, may be in signal handler. */ |
| 803 | for (off = 0; off < iolen; off += used) { |
| 804 | used = iolen - off; |
| 805 | if (hex_str_size(used) > sizeof(buf)) |
| 806 | used = hex_data_size(sizeof(buf)); |
| 807 | hex_encode(io + off, used, buf, hex_str_size(used)); |
| 808 | write_all(data->fd, buf, strlen(buf)); |
| 809 | } |
| 810 | } |
| 811 | |
| 812 | data->prefix = "\n"; |
| 813 | } |
| 814 | |
| 815 | static struct log_file *find_log_file(struct log_book *log_book, |
| 816 | const char *fname) |
nothing calls this directly
no test coverage detected