summaryrefslogtreecommitdiff
path: root/usr.bin/rctl
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2015-11-29 12:33:56 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2015-11-29 12:33:56 +0000
commit4cf0d89598d9b0b4564c3e579cd1c75c03ea4a97 (patch)
treebf2a9f304eb3c421ca509d327c954003f2d963a9 /usr.bin/rctl
parent73e900646a347470d1b9b71c8134875c5edd6a85 (diff)
downloadsrc-test2-4cf0d89598d9b0b4564c3e579cd1c75c03ea4a97.tar.gz
src-test2-4cf0d89598d9b0b4564c3e579cd1c75c03ea4a97.zip
Simplify rule retrieval and improve error handling.
MFC after: 1 month Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/head/; revision=291451
Diffstat (limited to 'usr.bin/rctl')
-rw-r--r--usr.bin/rctl/rctl.c64
1 files changed, 38 insertions, 26 deletions
diff --git a/usr.bin/rctl/rctl.c b/usr.bin/rctl/rctl.c
index cf69e0b4bf5f..1bcb82078c16 100644
--- a/usr.bin/rctl/rctl.c
+++ b/usr.bin/rctl/rctl.c
@@ -387,20 +387,24 @@ show_limits(const char *filter, int hflag, int nflag)
char *outbuf = NULL;
size_t outbuflen = RCTL_DEFAULT_BUFSIZE / 4;
- do {
+ for (;;) {
outbuflen *= 4;
outbuf = realloc(outbuf, outbuflen);
if (outbuf == NULL)
err(1, "realloc");
+ error = rctl_get_limits(filter, strlen(filter) + 1,
+ outbuf, outbuflen);
+ if (error == 0)
+ break;
+ if (errno == ERANGE)
+ continue;
+ if (errno == ENOSYS)
+ enosys();
+ warn("rctl_get_limits");
+ free(outbuf);
- error = rctl_get_limits(filter, strlen(filter) + 1, outbuf,
- outbuflen);
- if (error && errno != ERANGE) {
- if (errno == ENOSYS)
- enosys();
- warn("rctl_get_limits");
- }
- } while (error && errno == ERANGE);
+ return (error);
+ }
print_rules(outbuf, hflag, nflag);
free(outbuf);
@@ -466,20 +470,24 @@ show_usage(const char *filter, int hflag)
char *copy, *outbuf = NULL, *tmp;
size_t outbuflen = RCTL_DEFAULT_BUFSIZE / 4;
- do {
+ for (;;) {
outbuflen *= 4;
outbuf = realloc(outbuf, outbuflen);
if (outbuf == NULL)
err(1, "realloc");
+ error = rctl_get_racct(filter, strlen(filter) + 1,
+ outbuf, outbuflen);
+ if (error == 0)
+ break;
+ if (errno == ERANGE)
+ continue;
+ if (errno == ENOSYS)
+ enosys();
+ warn("rctl_get_racct");
+ free(outbuf);
- error = rctl_get_racct(filter, strlen(filter) + 1, outbuf,
- outbuflen);
- if (error && errno != ERANGE) {
- if (errno == ENOSYS)
- enosys();
- warn("rctl_get_racct");
- }
- } while (error && errno == ERANGE);
+ return (error);
+ }
copy = outbuf;
while ((tmp = strsep(&copy, ",")) != NULL) {
@@ -512,19 +520,23 @@ show_rules(const char *filter, int hflag, int nflag)
else
filterlen = 0;
- do {
+ for (;;) {
outbuflen *= 4;
outbuf = realloc(outbuf, outbuflen);
if (outbuf == NULL)
err(1, "realloc");
-
error = rctl_get_rules(filter, filterlen, outbuf, outbuflen);
- if (error && errno != ERANGE) {
- if (errno == ENOSYS)
- enosys();
- warn("rctl_get_rules");
- }
- } while (error && errno == ERANGE);
+ if (error == 0)
+ break;
+ if (errno == ERANGE)
+ continue;
+ if (errno == ENOSYS)
+ enosys();
+ warn("rctl_get_rules");
+ free(outbuf);
+
+ return (error);
+ }
print_rules(outbuf, hflag, nflag);
free(outbuf);