CLEANUP: cli: simplify the "show cli sockets" I/O handler
The code is was a bit convoluted by the use of a state machine around
st2 that is not used since only the STAT_ST_LIST state was used, and
the test of global.cli_fe inside the loop while it ought better be
tested before entering there. Let's get rid of this unneded state and
simplify the code. There's no more need for ->st2 now. The code looks
more changed than it really is due to the reindent caused by the
removal of the switch statement, but "git show -b" shows what really
changed.
diff --git a/src/cli.c b/src/cli.c
index e5d3051..46052d9 100644
--- a/src/cli.c
+++ b/src/cli.c
@@ -1559,81 +1559,73 @@
struct bind_conf *bind_conf = appctx->ctx.cli.p0;
struct conn_stream *cs = appctx->owner;
- chunk_reset(&trash);
+ if (!global.cli_fe)
+ goto done;
- switch (appctx->st2) {
- case STAT_ST_INIT:
- chunk_printf(&trash, "# socket lvl processes\n");
- if (ci_putchk(cs_ic(cs), &trash) == -1) {
- cs_rx_room_blk(cs);
- return 0;
- }
- appctx->st2 = STAT_ST_LIST;
- /* fall through */
+ chunk_reset(&trash);
- case STAT_ST_LIST:
- if (global.cli_fe) {
- if (!bind_conf)
- bind_conf = LIST_ELEM(global.cli_fe->conf.bind.n, typeof(bind_conf), by_fe);
+ if (!bind_conf) {
+ /* first call */
+ if (ci_putstr(cs_ic(cs), "# socket lvl processes\n") == -1)
+ goto full;
+ bind_conf = LIST_ELEM(global.cli_fe->conf.bind.n, typeof(bind_conf), by_fe);
+ }
- list_for_each_entry_from(bind_conf, &global.cli_fe->conf.bind, by_fe) {
- struct listener *l = appctx->ctx.cli.p1;
+ list_for_each_entry_from(bind_conf, &global.cli_fe->conf.bind, by_fe) {
+ struct listener *l = appctx->ctx.cli.p1;
- if (!l)
- l = LIST_ELEM(bind_conf->listeners.n, typeof(l), by_bind);
+ if (!l)
+ l = LIST_ELEM(bind_conf->listeners.n, typeof(l), by_bind);
- list_for_each_entry_from(l, &bind_conf->listeners, by_bind) {
- char addr[46];
- char port[6];
+ list_for_each_entry_from(l, &bind_conf->listeners, by_bind) {
+ char addr[46];
+ char port[6];
- if (l->rx.addr.ss_family == AF_UNIX) {
- const struct sockaddr_un *un;
+ if (l->rx.addr.ss_family == AF_UNIX) {
+ const struct sockaddr_un *un;
- un = (struct sockaddr_un *)&l->rx.addr;
- if (un->sun_path[0] == '\0') {
- chunk_appendf(&trash, "abns@%s ", un->sun_path+1);
- } else {
- chunk_appendf(&trash, "unix@%s ", un->sun_path);
- }
- } else if (l->rx.addr.ss_family == AF_INET) {
- addr_to_str(&l->rx.addr, addr, sizeof(addr));
- port_to_str(&l->rx.addr, port, sizeof(port));
- chunk_appendf(&trash, "ipv4@%s:%s ", addr, port);
- } else if (l->rx.addr.ss_family == AF_INET6) {
- addr_to_str(&l->rx.addr, addr, sizeof(addr));
- port_to_str(&l->rx.addr, port, sizeof(port));
- chunk_appendf(&trash, "ipv6@[%s]:%s ", addr, port);
- } else if (l->rx.addr.ss_family == AF_CUST_SOCKPAIR) {
- chunk_appendf(&trash, "sockpair@%d ", ((struct sockaddr_in *)&l->rx.addr)->sin_addr.s_addr);
- } else
- chunk_appendf(&trash, "unknown ");
+ un = (struct sockaddr_un *)&l->rx.addr;
+ if (un->sun_path[0] == '\0') {
+ chunk_appendf(&trash, "abns@%s ", un->sun_path+1);
+ } else {
+ chunk_appendf(&trash, "unix@%s ", un->sun_path);
+ }
+ } else if (l->rx.addr.ss_family == AF_INET) {
+ addr_to_str(&l->rx.addr, addr, sizeof(addr));
+ port_to_str(&l->rx.addr, port, sizeof(port));
+ chunk_appendf(&trash, "ipv4@%s:%s ", addr, port);
+ } else if (l->rx.addr.ss_family == AF_INET6) {
+ addr_to_str(&l->rx.addr, addr, sizeof(addr));
+ port_to_str(&l->rx.addr, port, sizeof(port));
+ chunk_appendf(&trash, "ipv6@[%s]:%s ", addr, port);
+ } else if (l->rx.addr.ss_family == AF_CUST_SOCKPAIR) {
+ chunk_appendf(&trash, "sockpair@%d ", ((struct sockaddr_in *)&l->rx.addr)->sin_addr.s_addr);
+ } else
+ chunk_appendf(&trash, "unknown ");
- if ((bind_conf->level & ACCESS_LVL_MASK) == ACCESS_LVL_ADMIN)
- chunk_appendf(&trash, "admin ");
- else if ((bind_conf->level & ACCESS_LVL_MASK) == ACCESS_LVL_OPER)
- chunk_appendf(&trash, "operator ");
- else if ((bind_conf->level & ACCESS_LVL_MASK) == ACCESS_LVL_USER)
- chunk_appendf(&trash, "user ");
- else
- chunk_appendf(&trash, " ");
+ if ((bind_conf->level & ACCESS_LVL_MASK) == ACCESS_LVL_ADMIN)
+ chunk_appendf(&trash, "admin ");
+ else if ((bind_conf->level & ACCESS_LVL_MASK) == ACCESS_LVL_OPER)
+ chunk_appendf(&trash, "operator ");
+ else if ((bind_conf->level & ACCESS_LVL_MASK) == ACCESS_LVL_USER)
+ chunk_appendf(&trash, "user ");
+ else
+ chunk_appendf(&trash, " ");
- chunk_appendf(&trash, "all\n");
+ chunk_appendf(&trash, "all\n");
- if (ci_putchk(cs_ic(cs), &trash) == -1) {
- /* buffer full, we must yield */
- appctx->ctx.cli.p0 = bind_conf;
- appctx->ctx.cli.p1 = l;
- cs_rx_room_blk(cs);
- return 0;
- }
- }
- }
+ if (ci_putchk(cs_ic(cs), &trash) == -1) {
+ appctx->ctx.cli.p0 = bind_conf;
+ appctx->ctx.cli.p1 = l;
+ goto full;
}
- /* fall through */
- default:
- appctx->st2 = STAT_ST_FIN;
- return 1;
+ }
}
+ done:
+ return 1;
+ full:
+ cs_rx_room_blk(cs);
+ return 0;
}