diff options
author | Karel Zak | 2011-07-01 14:15:07 +0200 |
---|---|---|
committer | Karel Zak | 2011-07-01 14:15:07 +0200 |
commit | 65e3eed92420fd6c05c7496af2f27bd97432984d (patch) | |
tree | 33aca4aba2bc8286a1e3c0ac9a2c964aa9f10942 /sys-utils/dmesg.c | |
parent | dmesg: refactoring - cleanup print buffer code (diff) | |
download | kernel-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.c | 51 |
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")); |