summaryrefslogtreecommitdiffstats
path: root/sys-utils/dmesg.c
diff options
context:
space:
mode:
authorKarel Zak2012-07-20 13:24:42 +0200
committerKarel Zak2012-07-20 13:24:42 +0200
commitc677ffba974b29f6bd61aba161c219b3757bcfc1 (patch)
tree02e0508cd45daaaa5a0fb0457f0eb85faa3d0131 /sys-utils/dmesg.c
parentdmesg: read /dev/kmsg (since kernel 3.5.0) (diff)
downloadkernel-qcow2-util-linux-c677ffba974b29f6bd61aba161c219b3757bcfc1.tar.gz
kernel-qcow2-util-linux-c677ffba974b29f6bd61aba161c219b3757bcfc1.tar.xz
kernel-qcow2-util-linux-c677ffba974b29f6bd61aba161c219b3757bcfc1.zip
dmesg: support --clear for kmsg
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'sys-utils/dmesg.c')
-rw-r--r--sys-utils/dmesg.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c
index 57ba7d26b..46d1e3106 100644
--- a/sys-utils/dmesg.c
+++ b/sys-utils/dmesg.c
@@ -495,6 +495,8 @@ static ssize_t read_buffer(struct dmesg_control *ctl, char **buf)
* Since kernel 3.5.0
*/
n = read_kmsg(ctl);
+ if (n == 0 && ctl->action == SYSLOG_ACTION_READ_CLEAR)
+ n = klogctl(SYSLOG_ACTION_CLEAR, NULL, 0);
break;
}
@@ -769,7 +771,17 @@ static void print_buffer(struct dmesg_control *ctl,
static int init_kmsg(struct dmesg_control *ctl)
{
ctl->kmsg = open("/dev/kmsg", O_RDONLY|O_NONBLOCK);
- return ctl->kmsg < 0 ? -1 : 0;
+ if (ctl->kmsg < 0)
+ return -1;
+
+ /*
+ * Seek after the last record available at the time
+ * the last SYSLOG_ACTION_CLEAR was issued.
+ *
+ * ... otherwise SYSLOG_ACTION_CLEAR will have no effect for kmsg.
+ */
+ lseek(ctl->kmsg, 0, SEEK_DATA);
+ return 0;
}
/*