From 19d14ef104b569c18d381c1259df0b409f39119a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 29 Oct 2012 16:51:55 +0100 Subject: [PATCH] MEDIUM: make the trash be a chunk instead of a char * The trash is used everywhere to store the results of temporary strings built out of s(n)printf, or as a storage for a chunk when chunks are needed. Using global.tune.bufsize is not the most convenient thing either. So let's replace trash with a chunk and directly use it as such. We can then use trash.size as the natural way to get its size, and get rid of many intermediary chunks that were previously used. The patch is huge because it touches many areas but it makes the code a lot more clear and even outlines places where trash was used without being that obvious. --- include/types/global.h | 2 +- src/acl.c | 4 +- src/appsession.c | 10 +- src/cfgparse.c | 17 +- src/checks.c | 142 ++++++----- src/connection.c | 31 ++- src/dumpstats.c | 534 ++++++++++++++++++++--------------------- src/frontend.c | 15 +- src/haproxy.c | 50 ++-- src/peers.c | 102 ++++---- src/proto_http.c | 269 ++++++++++----------- src/session.c | 17 +- src/ssl_sock.c | 14 +- src/stream_interface.c | 4 +- 14 files changed, 584 insertions(+), 627 deletions(-) diff --git a/include/types/global.h b/include/types/global.h index 3da65f515..28632b722 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -131,7 +131,7 @@ extern int relative_pid; /* process id starting at 1 */ extern int actconn; /* # of active sessions */ extern int listeners; extern int jobs; /* # of active jobs */ -extern char *trash; +extern struct chunk trash; extern char *swap_buffer; extern int nb_oldpids; /* contains the number of old pids found */ extern const int zero; diff --git a/src/acl.c b/src/acl.c index 30a6d2d3d..adc89f3c6 100644 --- a/src/acl.c +++ b/src/acl.c @@ -1308,9 +1308,9 @@ static int acl_read_patterns_from_file( struct acl_keyword *aclkw, opaque = 0; pattern = NULL; args[1] = ""; - while (fgets(trash, global.tune.bufsize, file) != NULL) { + while (fgets(trash.str, trash.size, file) != NULL) { line++; - c = trash; + c = trash.str; /* ignore lines beginning with a dash */ if (*c == '#') diff --git a/src/appsession.c b/src/appsession.c index ec97336e3..a71f186c8 100644 --- a/src/appsession.c +++ b/src/appsession.c @@ -97,13 +97,9 @@ static struct task *appsession_refresh(struct task *t) if (tick_is_expired(element->expire, now_ms)) { if ((global.mode & MODE_DEBUG) && (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE))) { - int len; - /* - on Linux NULL pointers are caught by sprintf, on solaris -> segfault - */ - len = sprintf(trash, "appsession_refresh: cleaning up expired Session '%s' on Server %s\n", - element->sessid, element->serverid?element->serverid:"(null)"); - if (write(1, trash, len) < 0) /* shut gcc warning */; + chunk_printf(&trash, "appsession_refresh: cleaning up expired Session '%s' on Server %s\n", + element->sessid, element->serverid?element->serverid:"(null)"); + if (write(1, trash.str, trash.len) < 0) /* shut gcc warning */; } /* delete the expired element from within the hash table */ LIST_DEL(&element->hash_list); diff --git a/src/cfgparse.c b/src/cfgparse.c index ef3be08fd..d1f18f7ab 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -582,7 +582,7 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) global.tune.bufsize = atol(args[1]); if (global.tune.maxrewrite >= global.tune.bufsize / 2) global.tune.maxrewrite = global.tune.bufsize / 2; - trash = realloc(trash, global.tune.bufsize); + chunk_init(&trash, realloc(trash.str, global.tune.bufsize), global.tune.bufsize); } else if (!strcmp(args[0], "tune.maxrewrite")) { if (*(args[1]) == 0) { @@ -1100,9 +1100,6 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) if (kwl->kw[index].section != CFG_GLOBAL) continue; if (strcmp(kwl->kw[index].kw, args[0]) == 0) { - /* prepare error message just in case */ - snprintf(trash, global.tune.bufsize, - "error near '%s' in '%s' section", args[0], "global"); rc = kwl->kw[index].parse(args, CFG_GLOBAL, NULL, NULL, file, linenum, &errmsg); if (rc < 0) { Alert("parsing [%s:%d] : %s\n", file, linenum, errmsg); @@ -2928,9 +2925,9 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) goto out; } - expr = sample_parse_expr(args, &myidx, trash, global.tune.bufsize); + expr = sample_parse_expr(args, &myidx, trash.str, trash.size); if (!expr) { - Alert("parsing [%s:%d] : '%s': %s\n", file, linenum, args[0], trash); + Alert("parsing [%s:%d] : '%s': %s\n", file, linenum, args[0], trash.str); err_code |= ERR_ALERT | ERR_FATAL; goto out; } @@ -5308,8 +5305,6 @@ stats_error_parsing: continue; if (strcmp(kwl->kw[index].kw, args[0]) == 0) { /* prepare error message just in case */ - snprintf(trash, global.tune.bufsize, - "error near '%s' in %s section", args[0], cursection); rc = kwl->kw[index].parse(args, CFG_LISTEN, curproxy, &defproxy, file, linenum, &errmsg); if (rc < 0) { Alert("parsing [%s:%d] : %s\n", file, linenum, errmsg); @@ -6607,10 +6602,8 @@ out_uri_auth_compat: /* enable separate counters */ if (curproxy->options2 & PR_O2_SOCKSTAT) { listener->counters = (struct licounters *)calloc(1, sizeof(struct licounters)); - if (!listener->name) { - sprintf(trash, "sock-%d", listener->luid); - listener->name = strdup(trash); - } + if (!listener->name) + memprintf(&listener->name, "sock-%d", listener->luid); } if (curproxy->options & PR_O_TCP_NOLING) diff --git a/src/checks.c b/src/checks.c index 8e4954936..e3c8620c8 100644 --- a/src/checks.c +++ b/src/checks.c @@ -198,10 +198,8 @@ static void server_status_printf(struct chunk *msg, struct server *s, unsigned o * Show information in logs about failed health check if server is UP * or succeeded health checks if server is DOWN. */ -static void set_server_check_status(struct server *s, short status, char *desc) { - - struct chunk msg; - +static void set_server_check_status(struct server *s, short status, char *desc) +{ if (status == HCHK_STATUS_START) { s->result = SRV_CHK_UNKNOWN; /* no result yet */ s->check.desc[0] = '\0'; @@ -238,7 +236,7 @@ static void set_server_check_status(struct server *s, short status, char *desc) int health, rise, fall, state; - chunk_init(&msg, trash, global.tune.bufsize); + chunk_reset(&trash); /* FIXME begin: calculate local version of the health/rise/fall/state */ health = s->health; @@ -274,22 +272,22 @@ static void set_server_check_status(struct server *s, short status, char *desc) } /* FIXME end: calculate local version of the health/rise/fall/state */ - chunk_appendf(&msg, - "Health check for %sserver %s/%s %s%s", - s->state & SRV_BACKUP ? "backup " : "", - s->proxy->id, s->id, - (s->result & SRV_CHK_DISABLE)?"conditionally ":"", - (s->result & SRV_CHK_RUNNING)?"succeeded":"failed"); + chunk_appendf(&trash, + "Health check for %sserver %s/%s %s%s", + s->state & SRV_BACKUP ? "backup " : "", + s->proxy->id, s->id, + (s->result & SRV_CHK_DISABLE)?"conditionally ":"", + (s->result & SRV_CHK_RUNNING)?"succeeded":"failed"); - server_status_printf(&msg, s, SSP_O_HCHK, -1); + server_status_printf(&trash, s, SSP_O_HCHK, -1); - chunk_appendf(&msg, ", status: %d/%d %s", - (state & SRV_RUNNING) ? (health - rise + 1) : (health), - (state & SRV_RUNNING) ? (fall) : (rise), - (state & SRV_RUNNING)?"UP":"DOWN"); + chunk_appendf(&trash, ", status: %d/%d %s", + (state & SRV_RUNNING) ? (health - rise + 1) : (health), + (state & SRV_RUNNING) ? (fall) : (rise), + (state & SRV_RUNNING)?"UP":"DOWN"); - Warning("%s.\n", trash); - send_log(s->proxy, LOG_NOTICE, "%s.\n", trash); + Warning("%s.\n", trash.str); + send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.str); } } @@ -393,7 +391,6 @@ static void shutdown_backup_sessions(struct proxy *px, int why) void set_server_down(struct server *s) { struct server *srv; - struct chunk msg; int xferred; if (s->state & SRV_MAINTAIN) { @@ -418,28 +415,28 @@ void set_server_down(struct server *s) */ xferred = redistribute_pending(s); - chunk_init(&msg, trash, global.tune.bufsize); + chunk_reset(&trash); if (s->state & SRV_MAINTAIN) { - chunk_appendf(&msg, - "%sServer %s/%s is DOWN for maintenance", s->state & SRV_BACKUP ? "Backup " : "", - s->proxy->id, s->id); + chunk_appendf(&trash, + "%sServer %s/%s is DOWN for maintenance", s->state & SRV_BACKUP ? "Backup " : "", + s->proxy->id, s->id); } else { - chunk_appendf(&msg, - "%sServer %s/%s is DOWN", s->state & SRV_BACKUP ? "Backup " : "", - s->proxy->id, s->id); + chunk_appendf(&trash, + "%sServer %s/%s is DOWN", s->state & SRV_BACKUP ? "Backup " : "", + s->proxy->id, s->id); - server_status_printf(&msg, s, - ((!s->track && !(s->proxy->options2 & PR_O2_LOGHCHKS))?SSP_O_HCHK:0), - xferred); + server_status_printf(&trash, s, + ((!s->track && !(s->proxy->options2 & PR_O2_LOGHCHKS)) ? SSP_O_HCHK : 0), + xferred); } - Warning("%s.\n", trash); + Warning("%s.\n", trash.str); /* we don't send an alert if the server was previously paused */ if (srv_was_paused) - send_log(s->proxy, LOG_NOTICE, "%s.\n", trash); + send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.str); else - send_log(s->proxy, LOG_ALERT, "%s.\n", trash); + send_log(s->proxy, LOG_ALERT, "%s.\n", trash.str); if (prev_srv_count && s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) set_backend_down(s->proxy); @@ -459,7 +456,6 @@ void set_server_down(struct server *s) void set_server_up(struct server *s) { struct server *srv; - struct chunk msg; int xferred; unsigned int old_state = s->state; @@ -510,24 +506,24 @@ void set_server_up(struct server *s) { */ xferred = check_for_pending(s); - chunk_init(&msg, trash, global.tune.bufsize); + chunk_reset(&trash); if (old_state & SRV_MAINTAIN) { - chunk_appendf(&msg, - "%sServer %s/%s is UP (leaving maintenance)", s->state & SRV_BACKUP ? "Backup " : "", - s->proxy->id, s->id); + chunk_appendf(&trash, + "%sServer %s/%s is UP (leaving maintenance)", s->state & SRV_BACKUP ? "Backup " : "", + s->proxy->id, s->id); } else { - chunk_appendf(&msg, - "%sServer %s/%s is UP", s->state & SRV_BACKUP ? "Backup " : "", - s->proxy->id, s->id); + chunk_appendf(&trash, + "%sServer %s/%s is UP", s->state & SRV_BACKUP ? "Backup " : "", + s->proxy->id, s->id); - server_status_printf(&msg, s, - ((!s->track && !(s->proxy->options2 & PR_O2_LOGHCHKS))?SSP_O_HCHK:0), - xferred); + server_status_printf(&trash, s, + ((!s->track && !(s->proxy->options2 & PR_O2_LOGHCHKS)) ? SSP_O_HCHK : 0), + xferred); } - Warning("%s.\n", trash); - send_log(s->proxy, LOG_NOTICE, "%s.\n", trash); + Warning("%s.\n", trash.str); + send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.str); if (s->state & SRV_CHECKED) for(srv = s->tracknext; srv; srv = srv->tracknext) @@ -544,7 +540,6 @@ void set_server_up(struct server *s) { static void set_server_disabled(struct server *s) { struct server *srv; - struct chunk msg; int xferred; s->state |= SRV_GOINGDOWN; @@ -557,19 +552,19 @@ static void set_server_disabled(struct server *s) { */ xferred = redistribute_pending(s); - chunk_init(&msg, trash, global.tune.bufsize); + chunk_reset(&trash); - chunk_appendf(&msg, - "Load-balancing on %sServer %s/%s is disabled", - s->state & SRV_BACKUP ? "Backup " : "", - s->proxy->id, s->id); + chunk_appendf(&trash, + "Load-balancing on %sServer %s/%s is disabled", + s->state & SRV_BACKUP ? "Backup " : "", + s->proxy->id, s->id); - server_status_printf(&msg, s, - ((!s->track && !(s->proxy->options2 & PR_O2_LOGHCHKS))?SSP_O_HCHK:0), - xferred); + server_status_printf(&trash, s, + ((!s->track && !(s->proxy->options2 & PR_O2_LOGHCHKS)) ? SSP_O_HCHK : 0), + xferred); - Warning("%s.\n", trash); - send_log(s->proxy, LOG_NOTICE, "%s.\n", trash); + Warning("%s.\n", trash.str); + send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.str); if (!s->proxy->srv_bck && !s->proxy->srv_act) set_backend_down(s->proxy); @@ -582,7 +577,6 @@ static void set_server_disabled(struct server *s) { static void set_server_enabled(struct server *s) { struct server *srv; - struct chunk msg; int xferred; s->state &= ~SRV_GOINGDOWN; @@ -594,27 +588,27 @@ static void set_server_enabled(struct server *s) { */ xferred = check_for_pending(s); - chunk_init(&msg, trash, global.tune.bufsize); + chunk_reset(&trash); - chunk_appendf(&msg, - "Load-balancing on %sServer %s/%s is enabled again", - s->state & SRV_BACKUP ? "Backup " : "", - s->proxy->id, s->id); + chunk_appendf(&trash, + "Load-balancing on %sServer %s/%s is enabled again", + s->state & SRV_BACKUP ? "Backup " : "", + s->proxy->id, s->id); - server_status_printf(&msg, s, - ((!s->track && !(s->proxy->options2 & PR_O2_LOGHCHKS))?SSP_O_HCHK:0), - xferred); + server_status_printf(&trash, s, + ((!s->track && !(s->proxy->options2 & PR_O2_LOGHCHKS)) ? SSP_O_HCHK : 0), + xferred); - Warning("%s.\n", trash); - send_log(s->proxy, LOG_NOTICE, "%s.\n", trash); + Warning("%s.\n", trash.str); + send_log(s->proxy, LOG_NOTICE, "%s.\n", trash.str); if (s->state & SRV_CHECKED) for(srv = s->tracknext; srv; srv = srv->tracknext) set_server_enabled(srv); } -void health_adjust(struct server *s, short status) { - +void health_adjust(struct server *s, short status) +{ int failed; int expire; @@ -652,8 +646,8 @@ void health_adjust(struct server *s, short status) { if (s->consecutive_errors < s->consecutive_errors_limit) return; - sprintf(trash, "Detected %d consecutive errors, last one was: %s", - s->consecutive_errors, get_analyze_status(status)); + chunk_printf(&trash, "Detected %d consecutive errors, last one was: %s", + s->consecutive_errors, get_analyze_status(status)); switch (s->onerror) { case HANA_ONERR_FASTINTER: @@ -669,7 +663,7 @@ void health_adjust(struct server *s, short status) { case HANA_ONERR_FAILCHK: /* simulate a failed health check */ - set_server_check_status(s, HCHK_STATUS_HANA, trash); + set_server_check_status(s, HCHK_STATUS_HANA, trash.str); if (s->health > s->rise) { s->health--; /* still good */ @@ -683,7 +677,7 @@ void health_adjust(struct server *s, short status) { case HANA_ONERR_MARKDWN: /* mark server down */ s->health = s->rise; - set_server_check_status(s, HCHK_STATUS_HANA, trash); + set_server_check_status(s, HCHK_STATUS_HANA, trash.str); set_server_down(s); break; @@ -1298,7 +1292,7 @@ static struct task *process_chk(struct task *t) } else if ((s->proxy->options2 & PR_O2_CHK_ANY) == PR_O2_HTTP_CHK) { if (s->proxy->options2 & PR_O2_CHK_SNDST) - bo_putblk(s->check.bo, trash, httpchk_build_status_header(s, trash)); + bo_putblk(s->check.bo, trash.str, httpchk_build_status_header(s, trash.str)); bo_putstr(s->check.bo, "\r\n"); *s->check.bo->p = '\0'; /* to make gdb output easier to read */ } diff --git a/src/connection.c b/src/connection.c index 9ccebbc9c..d698e69d5 100644 --- a/src/connection.c +++ b/src/connection.c @@ -282,15 +282,14 @@ void conn_update_sock_polling(struct connection *c) int conn_recv_proxy(struct connection *conn, int flag) { char *line, *end; - int len; /* we might have been called just after an asynchronous shutr */ if (conn->flags & CO_FL_SOCK_RD_SH) goto fail; do { - len = recv(conn->t.sock.fd, trash, global.tune.bufsize, MSG_PEEK); - if (len < 0) { + trash.len = recv(conn->t.sock.fd, trash.str, trash.size, MSG_PEEK); + if (trash.len < 0) { if (errno == EINTR) continue; if (errno == EAGAIN) { @@ -301,18 +300,18 @@ int conn_recv_proxy(struct connection *conn, int flag) } } while (0); - if (len < 6) + if (trash.len < 6) goto missing; - line = trash; - end = trash + len; + line = trash.str; + end = trash.str + trash.len; /* Decode a possible proxy request, fail early if it does not match */ if (strncmp(line, "PROXY ", 6) != 0) goto fail; line += 6; - if (len < 18) /* shortest possible line */ + if (trash.len < 18) /* shortest possible line */ goto missing; if (!memcmp(line, "TCP4 ", 5) != 0) { @@ -425,12 +424,12 @@ int conn_recv_proxy(struct connection *conn, int flag) * exact line at once. If we don't get the exact same result, we * fail. */ - len = line - trash; + trash.len = line - trash.str; do { - int len2 = recv(conn->t.sock.fd, trash, len, 0); + int len2 = recv(conn->t.sock.fd, trash.str, trash.len, 0); if (len2 < 0 && errno == EINTR) continue; - if (len2 != len) + if (len2 != trash.len) goto fail; } while (0); @@ -542,7 +541,7 @@ int make_proxy_line(char *buf, int buf_len, struct sockaddr_storage *src, struct */ int conn_local_send_proxy(struct connection *conn, unsigned int flag) { - int ret, len; + int ret; /* we might have been called just after an asynchronous shutw */ if (conn->flags & CO_FL_SOCK_WR_SH) @@ -557,14 +556,14 @@ int conn_local_send_proxy(struct connection *conn, unsigned int flag) if (!(conn->flags & CO_FL_ADDR_TO_SET)) goto out_error; - len = make_proxy_line(trash, global.tune.bufsize, &conn->addr.from, &conn->addr.to); - if (!len) + trash.len = make_proxy_line(trash.str, trash.size, &conn->addr.from, &conn->addr.to); + if (!trash.len) goto out_error; - /* we have to send trash from len bytes. If the data layer has a + /* we have to send the whole trash. If the data layer has a * pending write, we'll also set MSG_MORE. */ - ret = send(conn->t.sock.fd, trash, len, (conn->flags & CO_FL_DATA_WR_ENA) ? MSG_MORE : 0); + ret = send(conn->t.sock.fd, trash.str, trash.len, (conn->flags & CO_FL_DATA_WR_ENA) ? MSG_MORE : 0); if (ret == 0) goto out_wait; @@ -575,7 +574,7 @@ int conn_local_send_proxy(struct connection *conn, unsigned int flag) goto out_error; } - if (ret != len) + if (ret != trash.len) goto out_error; /* The connection is ready now, simply return and let the connection diff --git a/src/dumpstats.c b/src/dumpstats.c index cdf0bbb2e..eefce5812 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -525,7 +525,6 @@ static void stats_sock_table_key_request(struct stream_interface *si, char **arg struct stksess *ts; uint32_t uint32_key; unsigned char ip6_key[sizeof(struct in6_addr)]; - struct chunk msg; long long value; int data_type; void *ptr; @@ -599,10 +598,10 @@ static void stats_sock_table_key_request(struct stream_interface *si, char **arg case STAT_CLI_O_TAB: if (!ts) return; - chunk_init(&msg, trash, global.tune.bufsize); - if (!stats_dump_table_head_to_buffer(&msg, si, px, px)) + chunk_reset(&trash); + if (!stats_dump_table_head_to_buffer(&trash, si, px, px)) return; - stats_dump_table_entry_to_buffer(&msg, si, px, ts); + stats_dump_table_entry_to_buffer(&trash, si, px, ts); return; case STAT_CLI_O_CLR: @@ -1026,8 +1025,8 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line) } /* return server's effective weight at the moment */ - snprintf(trash, global.tune.bufsize, "%d (initial %d)\n", sv->uweight, sv->iweight); - bi_putstr(si->ib, trash); + snprintf(trash.str, trash.size, "%d (initial %d)\n", sv->uweight, sv->iweight); + bi_putstr(si->ib, trash.str); return 1; } else { /* not "get weight" */ @@ -1495,7 +1494,7 @@ static void cli_io_handler(struct stream_interface *si) if (buffer_almost_full(si->ib->buf)) break; - reql = bo_getline(si->ob, trash, global.tune.bufsize); + reql = bo_getline(si->ob, trash.str, trash.size); if (reql <= 0) { /* closed or EOL not found */ if (reql == 0) break; @@ -1507,8 +1506,8 @@ static void cli_io_handler(struct stream_interface *si) * replace it with an LF and skip only this part. */ for (len = 0; len < reql; len++) - if (trash[len] == ';') { - trash[len] = '\n'; + if (trash.str[len] == ';') { + trash.str[len] = '\n'; reql = len + 1; break; } @@ -1518,26 +1517,26 @@ static void cli_io_handler(struct stream_interface *si) * line. */ len = reql - 1; - if (trash[len] != '\n') { + if (trash.str[len] != '\n') { si->applet.st0 = STAT_CLI_END; continue; } - if (len && trash[len-1] == '\r') + if (len && trash.str[len-1] == '\r') len--; - trash[len] = '\0'; + trash.str[len] = '\0'; si->applet.st0 = STAT_CLI_PROMPT; if (len) { - if (strcmp(trash, "quit") == 0) { + if (strcmp(trash.str, "quit") == 0) { si->applet.st0 = STAT_CLI_END; continue; } - else if (strcmp(trash, "prompt") == 0) + else if (strcmp(trash.str, "prompt") == 0) si->applet.st1 = !si->applet.st1; - else if (strcmp(trash, "help") == 0 || - !stats_sock_parse_request(si, trash)) { + else if (strcmp(trash.str, "help") == 0 || + !stats_sock_parse_request(si, trash.str)) { si->applet.ctx.cli.msg = stats_sock_usage_msg; si->applet.st0 = STAT_CLI_PRINT; } @@ -1665,10 +1664,9 @@ static void cli_io_handler(struct stream_interface *si) static int stats_dump_raw_to_buffer(struct stream_interface *si) { struct proxy *px; - struct chunk msg; unsigned int up; - chunk_init(&msg, trash, global.tune.bufsize); + chunk_reset(&trash); switch (si->conn->xprt_st) { case STAT_ST_INIT: @@ -1678,8 +1676,8 @@ static int stats_dump_raw_to_buffer(struct stream_interface *si) case STAT_ST_HEAD: if (si->applet.ctx.stats.flags & STAT_SHOW_STAT) { - print_csv_header(&msg); - if (bi_putchk(si->ib, &msg) == -1) + print_csv_header(&trash); + if (bi_putchk(si->ib, &trash) == -1) return 0; } @@ -1689,7 +1687,7 @@ static int stats_dump_raw_to_buffer(struct stream_interface *si) case STAT_ST_INFO: up = (now.tv_sec - start_date.tv_sec); if (si->applet.ctx.stats.flags & STAT_SHOW_INFO) { - chunk_appendf(&msg, + chunk_appendf(&trash, "Name: " PRODUCT_NAME "\n" "Version: " HAPROXY_VERSION "\n" "Release_date: " HAPROXY_DATE "\n" @@ -1729,7 +1727,7 @@ static int stats_dump_raw_to_buffer(struct stream_interface *si) nb_tasks_cur, run_queue_cur, idle_pct, global.node, global.desc?global.desc:"" ); - if (bi_putchk(si->ib, &msg) == -1) + if (bi_putchk(si->ib, &trash) == -1) return 0; } @@ -1782,13 +1780,12 @@ static int stats_dump_raw_to_buffer(struct stream_interface *si) static int stats_http_redir(struct stream_interface *si, struct uri_auth *uri) { struct session *s = si->conn->xprt_ctx; - struct chunk msg; - chunk_init(&msg, trash, global.tune.bufsize); + chunk_reset(&trash); switch (si->conn->xprt_st) { case STAT_ST_INIT: - chunk_appendf(&msg, + chunk_appendf(&trash, "HTTP/1.0 303 See Other\r\n" "Cache-Control: no-cache\r\n" "Content-Type: text/plain\r\n" @@ -1800,9 +1797,9 @@ static int stats_http_redir(struct stream_interface *si, struct uri_auth *uri) stat_status_codes[si->applet.ctx.stats.st_code]) ? stat_status_codes[si->applet.ctx.stats.st_code] : stat_status_codes[STAT_STATUS_UNKN]); - chunk_appendf(&msg, "\r\n\r\n"); + chunk_appendf(&trash, "\r\n\r\n"); - if (bi_putchk(si->ib, &msg) == -1) + if (bi_putchk(si->ib, &trash) == -1) return 0; s->txn.status = 303; @@ -1885,14 +1882,13 @@ static int stats_dump_http(struct stream_interface *si, struct uri_auth *uri) struct session *s = si->conn->xprt_ctx; struct channel *rep = si->ib; struct proxy *px; - struct chunk msg; unsigned int up; - chunk_init(&msg, trash, global.tune.bufsize); + chunk_reset(&trash); switch (si->conn->xprt_st) { case STAT_ST_INIT: - chunk_appendf(&msg, + chunk_appendf(&trash, "HTTP/1.0 200 OK\r\n" "Cache-Control: no-cache\r\n" "Connection: close\r\n" @@ -1900,13 +1896,13 @@ static int stats_dump_http(struct stream_interface *si, struct uri_auth *uri) (si->applet.ctx.stats.flags & STAT_FMT_CSV) ? "text/plain" : "text/html"); if (uri->refresh > 0 && !(si->applet.ctx.stats.flags & STAT_NO_REFRESH)) - chunk_appendf(&msg, "Refresh: %d\r\n", + chunk_appendf(&trash, "Refresh: %d\r\n", uri->refresh); - chunk_appendf(&msg, "\r\n"); + chunk_appendf(&trash, "\r\n"); s->txn.status = 200; - if (bi_putchk(rep, &msg) == -1) + if (bi_putchk(rep, &trash) == -1) return 0; if (!(s->flags & SN_ERR_MASK)) // this is not really an error but it is @@ -1926,7 +1922,7 @@ static int stats_dump_http(struct stream_interface *si, struct uri_auth *uri) case STAT_ST_HEAD: if (!(si->applet.ctx.stats.flags & STAT_FMT_CSV)) { /* WARNING! This must fit in the first buffer !!! */ - chunk_appendf(&msg, + chunk_appendf(&trash, "\n" "Statistics Report for " PRODUCT_NAME "%s%s\n" @@ -2019,9 +2015,9 @@ static int stats_dump_http(struct stream_interface *si, struct uri_auth *uri) (uri->flags&ST_SHNODE) ? (uri->node ? uri->node : global.node) : "" ); } else { - print_csv_header(&msg); + print_csv_header(&trash); } - if (bi_putchk(rep, &msg) == -1) + if (bi_putchk(rep, &trash) == -1) return 0; si->conn->xprt_st = STAT_ST_INFO; @@ -2035,7 +2031,7 @@ static int stats_dump_http(struct stream_interface *si, struct uri_auth *uri) * become tricky if we want to support 4kB buffers ! */ if (!(si->applet.ctx.stats.flags & STAT_FMT_CSV)) { - chunk_appendf(&msg, + chunk_appendf(&trash, "

" PRODUCT_NAME "%s

\n" "

Statistics Report for pid %d%s%s%s%s

\n" @@ -2084,13 +2080,13 @@ static int stats_dump_http(struct stream_interface *si, struct uri_auth *uri) ); if (si->applet.ctx.stats.flags & STAT_HIDE_DOWN) - chunk_appendf(&msg, + chunk_appendf(&trash, "
  • Show all servers
    \n", uri->uri_prefix, "", (si->applet.ctx.stats.flags & STAT_NO_REFRESH) ? ";norefresh" : ""); else - chunk_appendf(&msg, + chunk_appendf(&trash, "
  • Hide 'DOWN' servers
    \n", uri->uri_prefix, ";up", @@ -2098,31 +2094,31 @@ static int stats_dump_http(struct stream_interface *si, struct uri_auth *uri) if (uri->refresh > 0) { if (si->applet.ctx.stats.flags & STAT_NO_REFRESH) - chunk_appendf(&msg, + chunk_appendf(&trash, "
  • Enable refresh
    \n", uri->uri_prefix, (si->applet.ctx.stats.flags & STAT_HIDE_DOWN) ? ";up" : "", ""); else - chunk_appendf(&msg, + chunk_appendf(&trash, "
  • Disable refresh
    \n", uri->uri_prefix, (si->applet.ctx.stats.flags & STAT_HIDE_DOWN) ? ";up" : "", ";norefresh"); } - chunk_appendf(&msg, + chunk_appendf(&trash, "
  • Refresh now
    \n", uri->uri_prefix, (si->applet.ctx.stats.flags & STAT_HIDE_DOWN) ? ";up" : "", (si->applet.ctx.stats.flags & STAT_NO_REFRESH) ? ";norefresh" : ""); - chunk_appendf(&msg, + chunk_appendf(&trash, "
  • CSV export
    \n", uri->uri_prefix, (uri->refresh > 0) ? ";norefresh" : ""); - chunk_appendf(&msg, + chunk_appendf(&trash, "" "" "External resources: