diff options
author | Karel Zak | 2012-07-20 14:41:25 +0200 |
---|---|---|
committer | Karel Zak | 2012-07-20 14:41:25 +0200 |
commit | 37b04d6cce552116f31272a56d699f7c6cc91cdf (patch) | |
tree | fe0c460c9eb7a0e709fc770f6a584d0d2db47b2f | |
parent | dmesg: cleanup exclusive_option() usage (diff) | |
download | kernel-qcow2-util-linux-37b04d6cce552116f31272a56d699f7c6cc91cdf.tar.gz kernel-qcow2-util-linux-37b04d6cce552116f31272a56d699f7c6cc91cdf.tar.xz kernel-qcow2-util-linux-37b04d6cce552116f31272a56d699f7c6cc91cdf.zip |
dmesg: implement backwardly compatible --raw for /dev/kmsg
.. and if you really want raw data from /dev/kmsg then use dd(1) ;-)
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | sys-utils/dmesg.1 | 15 | ||||
-rw-r--r-- | sys-utils/dmesg.c | 12 |
2 files changed, 25 insertions, 2 deletions
diff --git a/sys-utils/dmesg.1 b/sys-utils/dmesg.1 index ff149a9e3..c67cfa14a 100644 --- a/sys-utils/dmesg.1 +++ b/sys-utils/dmesg.1 @@ -98,12 +98,23 @@ will print or clear the kernel ring buffer. .IP "\fB\-r\fR, \fB\-\-raw\fR" Print the raw message buffer, i.e., do not strip the log level prefixes. + +Note that the real raw format depends on method how +.BR dmesg (1) +reads kernel messages. The /dev/kmsg uses different format than +.BR syslog (2) . +For backward compatibility +.BR dmesg (1) +returns data always in +.BR syslog (2) +format. The real raw data from /dev/kmsg is possible to read for example by +command 'dd if=/dev/kmsg iflag=nonblock'. .IP "\fB\-S\fR, \fB\-\-syslog\fR" Force to use -.BR syslog(2) +.BR syslog (2) kernel interface to read kernel messages. The default is to use /dev/kmsg rather than -.BR syslog(2) +.BR syslog (2) since kernel 3.5.0. .IP "\fB\-s\fR, \fB\-\-buffer-size \fIsize\fR Use a buffer of diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c index 70c0a2e71..65ace3e81 100644 --- a/sys-utils/dmesg.c +++ b/sys-utils/dmesg.c @@ -702,6 +702,16 @@ static void print_record(struct dmesg_control *ctl, struct dmesg_record *rec) return; } + if (ctl->raw) { + /* compose syslog(2) compatible output */ + printf("<%d>[%5d.%06d] ", + LOG_MAKEPRI(rec->facility, rec->level), + (int) rec->tv.tv_sec, + (int) rec->tv.tv_usec); + + goto mesg; + } + if (ctl->decode && rec->level >= 0 && rec->facility >= 0) printf("%-6s:%-6s: ", facility_names[rec->facility].name, level_names[rec->level].name); @@ -744,6 +754,7 @@ static void print_record(struct dmesg_control *ctl, struct dmesg_record *rec) !ctl->notime && !ctl->delta && !ctl->ctime) printf("[%5d.%06d] ", (int) rec->tv.tv_sec, (int) rec->tv.tv_usec); +mesg: safe_fwrite(rec->mesg, rec->mesg_size, stdout); if (*(rec->mesg + rec->mesg_size - 1) != '\n') @@ -893,6 +904,7 @@ static int read_kmsg(struct dmesg_control *ctl) if (parse_kmsg_record(ctl, &rec, buf, (size_t) sz) != 0) continue; + print_record(ctl, &rec); } while (1); |