summaryrefslogtreecommitdiffstats
path: root/sys-utils/dmesg.c
diff options
context:
space:
mode:
authorKarel Zak2011-07-01 14:15:07 +0200
committerKarel Zak2011-07-01 14:15:07 +0200
commit65e3eed92420fd6c05c7496af2f27bd97432984d (patch)
tree33aca4aba2bc8286a1e3c0ac9a2c964aa9f10942 /sys-utils/dmesg.c
parentdmesg: refactoring - cleanup print buffer code (diff)
downloadkernel-qcow2-util-linux-65e3eed92420fd6c05c7496af2f27bd97432984d.tar.gz
kernel-qcow2-util-linux-65e3eed92420fd6c05c7496af2f27bd97432984d.tar.xz
kernel-qcow2-util-linux-65e3eed92420fd6c05c7496af2f27bd97432984d.zip
dmesg: refactoring - cleanup read buffer code
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'sys-utils/dmesg.c')
-rw-r--r--sys-utils/dmesg.c51
1 files changed, 31 insertions, 20 deletions
diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c
index e4a8cffa3..a291857a6 100644
--- a/sys-utils/dmesg.c
+++ b/sys-utils/dmesg.c
@@ -74,6 +74,36 @@ static int get_buffer_size()
return n > 0 ? n : 0;
}
+static int read_buffer(char **buf, size_t bufsize, int clear)
+{
+ size_t sz;
+ int rc = -1;
+ int cmd = clear ? SYSLOG_ACTION_READ_CLEAR :
+ SYSLOG_ACTION_READ_ALL;
+
+ if (bufsize) {
+ sz = bufsize + 8;
+ *buf = xmalloc(sz * sizeof(char));
+ rc = klogctl(cmd, *buf, sz);
+ } else {
+ sz = 16392;
+ while (1) {
+ *buf = xmalloc(sz * sizeof(char));
+ rc = klogctl(SYSLOG_ACTION_READ_ALL, *buf, sz);
+ if (rc != sz || sz > (1 << 28))
+ break;
+ free(*buf);
+ *buf = NULL;
+ sz *= 4;
+ }
+
+ if (rc > 0 && clear)
+ rc = klogctl(SYSLOG_ACTION_READ_CLEAR, *buf, sz);
+ }
+
+ return rc;
+}
+
static void print_buffer(const char *buf, size_t size, int flags)
{
int lastc = '\n';
@@ -98,7 +128,6 @@ static void print_buffer(const char *buf, size_t size, int flags)
int main(int argc, char *argv[])
{
char *buf = NULL;
- int sz;
int bufsize = 0;
int n;
int c;
@@ -166,25 +195,7 @@ int main(int argc, char *argv[])
if (!bufsize)
bufsize = get_buffer_size();
- if (bufsize) {
- sz = bufsize + 8;
- buf = xmalloc(sz * sizeof(char));
- n = klogctl(cmd, buf, sz);
- } else {
- sz = 16392;
- while (1) {
- buf = xmalloc(sz * sizeof(char));
- n = klogctl(SYSLOG_ACTION_READ_ALL, buf, sz); /* read only */
- if (n != sz || sz > (1 << 28))
- break;
- free(buf);
- sz *= 4;
- }
-
- if (n > 0 && cmd == SYSLOG_ACTION_READ_CLEAR)
- n = klogctl(cmd, buf, sz); /* read and clear */
- }
-
+ n = read_buffer(&buf, bufsize, cmd == SYSLOG_ACTION_READ_CLEAR);
if (n < 0)
err(EXIT_FAILURE, _("klogctl failed"));