extern int actconn; /* # of active sessions */
extern int listeners;
extern int jobs; /* # of active jobs */
-extern char trash[BUFSIZE];
+extern char *trash;
+extern int trashlen;
extern char *swap_buffer;
extern int nb_oldpids; /* contains the number of old pids found */
extern const int zero;
opaque = 0;
pattern = NULL;
args[1] = "";
- while (fgets(trash, sizeof(trash), file) != NULL) {
+ while (fgets(trash, trashlen, file) != NULL) {
line++;
c = trash;
global.tune.bufsize = atol(args[1]);
if (global.tune.maxrewrite >= global.tune.bufsize / 2)
global.tune.maxrewrite = global.tune.bufsize / 2;
+ trashlen = global.tune.bufsize;
+ trash = realloc(trash, trashlen);
}
else if (!strcmp(args[0], "tune.maxrewrite")) {
if (*(args[1]) == 0) {
continue;
if (strcmp(kwl->kw[index].kw, args[0]) == 0) {
/* prepare error message just in case */
- snprintf(trash, sizeof(trash),
+ snprintf(trash, trashlen,
"error near '%s' in '%s' section", args[0], "global");
rc = kwl->kw[index].parse(args, CFG_GLOBAL, NULL, NULL, &errmsg);
if (rc < 0) {
goto out;
}
- expr = sample_parse_expr(args, &myidx, trash, sizeof(trash));
+ expr = sample_parse_expr(args, &myidx, trash, trashlen);
if (!expr) {
Alert("parsing [%s:%d] : '%s': %s\n", file, linenum, args[0], trash);
err_code |= ERR_ALERT | ERR_FATAL;
continue;
if (strcmp(kwl->kw[index].kw, args[0]) == 0) {
/* prepare error message just in case */
- snprintf(trash, sizeof(trash),
+ snprintf(trash, trashlen,
"error near '%s' in %s section", args[0], cursection);
rc = kwl->kw[index].parse(args, CFG_LISTEN, curproxy, &defproxy, &errmsg);
if (rc < 0) {
int health, rise, fall, state;
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
/* FIXME begin: calculate local version of the health/rise/fall/state */
health = s->health;
*/
xferred = redistribute_pending(s);
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
if (s->state & SRV_MAINTAIN) {
chunk_printf(&msg,
*/
xferred = check_for_pending(s);
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
if (old_state & SRV_MAINTAIN) {
chunk_printf(&msg,
*/
xferred = redistribute_pending(s);
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
chunk_printf(&msg,
"Load-balancing on %sServer %s/%s is disabled",
*/
xferred = check_for_pending(s);
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
chunk_printf(&msg,
"Load-balancing on %sServer %s/%s is enabled again",
if (show) {
struct chunk msg;
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
if (!stats_dump_table_head_to_buffer(&msg, si, px, px))
return;
stats_dump_table_entry_to_buffer(&msg, si, px, ts);
}
/* return server's effective weight at the moment */
- snprintf(trash, sizeof(trash), "%d (initial %d)\n", sv->uweight, sv->iweight);
+ snprintf(trash, trashlen, "%d (initial %d)\n", sv->uweight, sv->iweight);
bi_putstr(si->ib, trash);
return 1;
}
if (buffer_almost_full(si->ib))
break;
- reql = bo_getline(si->ob, trash, sizeof(trash));
+ reql = bo_getline(si->ob, trash, trashlen);
if (reql <= 0) { /* closed or EOL not found */
if (reql == 0)
break;
struct chunk msg;
unsigned int up;
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
switch (si->applet.state) {
case STAT_ST_INIT:
struct session *s = si->applet.private;
struct chunk msg;
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
switch (si->applet.state) {
case STAT_ST_INIT:
struct chunk msg;
unsigned int up;
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
switch (si->applet.state) {
case STAT_ST_INIT:
struct listener *l;
struct chunk msg;
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
switch (si->applet.ctx.stats.px_st) {
case STAT_PX_ST_INIT:
extern const char *monthname[12];
char pn[INET6_ADDRSTRLEN];
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
sess = si->applet.ctx.sess.target;
if (si->applet.ctx.sess.section > 0 && si->applet.ctx.sess.uid != sess->uniq_id) {
return 1;
}
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
switch (si->applet.state) {
case STAT_ST_INIT:
return 1;
}
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
while (si->applet.state != STAT_ST_FIN) {
switch (si->applet.state) {
if (unlikely(si->ib->flags & (BF_WRITE_ERROR|BF_SHUTW)))
return 1;
- chunk_init(&msg, trash, sizeof(trash));
+ chunk_init(&msg, trash, trashlen);
if (!si->applet.ctx.errors.px) {
/* the function had not been called yet, let's prepare the
static int oldpids_sig; /* use USR1 or TERM */
/* this is used to drain data, and as a temporary buffer for sprintf()... */
-char trash[BUFSIZE];
+char *trash = NULL;
+int trashlen = BUFSIZE;
/* this buffer is always the same size as standard buffers and is used for
* swapping data inside a buffer.
send_log(p, LOG_NOTICE, "SIGHUP received, dumping servers states for proxy %s.\n", p->id);
while (s) {
- snprintf(trash, sizeof(trash),
+ snprintf(trash, trashlen,
"SIGHUP: Server %s/%s is %s. Conn: %d act, %d pend, %lld tot.",
p->id, s->id,
(s->state & SRV_RUNNING) ? "UP" : "DOWN",
/* FIXME: those info are a bit outdated. We should be able to distinguish between FE and BE. */
if (!p->srv) {
- snprintf(trash, sizeof(trash),
+ snprintf(trash, trashlen,
"SIGHUP: Proxy %s has no servers. Conn: act(FE+BE): %d+%d, %d pend (%d unass), tot(FE+BE): %lld+%lld.",
p->id,
p->feconn, p->beconn, p->totpend, p->nbpend, p->fe_counters.cum_conn, p->be_counters.cum_conn);
} else if (p->srv_act == 0) {
- snprintf(trash, sizeof(trash),
+ snprintf(trash, trashlen,
"SIGHUP: Proxy %s %s ! Conn: act(FE+BE): %d+%d, %d pend (%d unass), tot(FE+BE): %lld+%lld.",
p->id,
(p->srv_bck) ? "is running on backup servers" : "has no server available",
p->feconn, p->beconn, p->totpend, p->nbpend, p->fe_counters.cum_conn, p->be_counters.cum_conn);
} else {
- snprintf(trash, sizeof(trash),
+ snprintf(trash, trashlen,
"SIGHUP: Proxy %s has %d active servers and %d backup servers available."
" Conn: act(FE+BE): %d+%d, %d pend (%d unass), tot(FE+BE): %lld+%lld.",
p->id, p->srv_act, p->srv_bck,
char *progname;
char *change_dir = NULL;
+ trash = malloc(trashlen);
+
/* NB: POSIX does not make it mandatory for gethostname() to NULL-terminate
* the string in case of truncation, and at least FreeBSD appears not to do
* it.
si->applet.st0 = PEER_SESSION_GETVERSION;
/* fall through */
case PEER_SESSION_GETVERSION:
- reql = bo_getline(si->ob, trash, sizeof(trash));
+ reql = bo_getline(si->ob, trash, trashlen);
if (reql <= 0) { /* closed or EOL not found */
if (reql == 0)
goto out;
si->applet.st0 = PEER_SESSION_GETHOST;
/* fall through */
case PEER_SESSION_GETHOST:
- reql = bo_getline(si->ob, trash, sizeof(trash));
+ reql = bo_getline(si->ob, trash, trashlen);
if (reql <= 0) { /* closed or EOL not found */
if (reql == 0)
goto out;
case PEER_SESSION_GETPEER: {
struct peer *curpeer;
char *p;
- reql = bo_getline(si->ob, trash, sizeof(trash));
+ reql = bo_getline(si->ob, trash, trashlen);
if (reql <= 0) { /* closed or EOL not found */
if (reql == 0)
goto out;
size_t key_size;
char *p;
- reql = bo_getline(si->ob, trash, sizeof(trash));
+ reql = bo_getline(si->ob, trash, trashlen);
if (reql <= 0) { /* closed or EOL not found */
if (reql == 0)
goto out;
case PEER_SESSION_SENDSUCCESS:{
struct peer_session *ps = (struct peer_session *)si->applet.private;
- repl = snprintf(trash, sizeof(trash), "%d\n", PEER_SESSION_SUCCESSCODE);
+ repl = snprintf(trash, trashlen, "%d\n", PEER_SESSION_SUCCESSCODE);
repl = bi_putblk(si->ib, trash, repl);
if (repl <= 0) {
if (repl == -1)
struct peer_session *ps = (struct peer_session *)si->applet.private;
/* Send headers */
- repl = snprintf(trash, sizeof(trash),
+ repl = snprintf(trash, trashlen,
PEER_SESSION_PROTO_NAME " 1.0\n%s\n%s %d\n%s %lu %d\n",
ps->peer->id,
localpeer,
ps->table->table->type,
(int)ps->table->table->key_size);
- if (repl >= sizeof(trash)) {
+ if (repl >= trashlen) {
si->applet.st0 = PEER_SESSION_END;
goto switchstate;
}
if (si->ib->flags & BF_WRITE_PARTIAL)
ps->statuscode = PEER_SESSION_CONNECTEDCODE;
- reql = bo_getline(si->ob, trash, sizeof(trash));
+ reql = bo_getline(si->ob, trash, trashlen);
if (reql <= 0) { /* closed or EOL not found */
if (reql == 0)
goto out;
}
ts = eb32_entry(eb, struct stksess, upd);
- msglen = peer_prepare_datamsg(ts, ps, trash, sizeof(trash));
+ msglen = peer_prepare_datamsg(ts, ps, trash, trashlen);
if (msglen) {
/* message to buffer */
repl = bi_putblk(si->ib, trash, msglen);
}
ts = eb32_entry(eb, struct stksess, upd);
- msglen = peer_prepare_datamsg(ts, ps, trash, sizeof(trash));
+ msglen = peer_prepare_datamsg(ts, ps, trash, trashlen);
if (msglen) {
/* message to buffer */
repl = bi_putblk(si->ib, trash, msglen);
}
ts = eb32_entry(eb, struct stksess, upd);
- msglen = peer_prepare_datamsg(ts, ps, trash, sizeof(trash));
+ msglen = peer_prepare_datamsg(ts, ps, trash, trashlen);
if (msglen) {
/* message to buffer */
repl = bi_putblk(si->ib, trash, msglen);
goto out;
}
case PEER_SESSION_EXIT:
- repl = snprintf(trash, sizeof(trash), "%d\n", si->applet.st1);
+ repl = snprintf(trash, trashlen, "%d\n", si->applet.st1);
if (bi_putblk(si->ib, trash, repl) == -1)
goto out;
static void http_silent_debug(int line, struct session *s)
{
int size = 0;
- size += snprintf(trash + size, sizeof(trash) - size,
+ size += snprintf(trash + size, trashlen - size,
"[%04d] req: p=%d(%d) s=%d bf=%08x an=%08x data=%p size=%d l=%d w=%p r=%p o=%p sm=%d fw=%ld tf=%08x\n",
line,
s->si[0].state, s->si[0].fd, s->txn.req.msg_state, s->req->flags, s->req->analysers,
s->req->data, s->req->size, s->req->l, s->req->w, s->req->r, s->req->p, s->req->o, s->req->to_forward, s->txn.flags);
write(-1, trash, size);
size = 0;
- size += snprintf(trash + size, sizeof(trash) - size,
+ size += snprintf(trash + size, trashlen - size,
" %04d rep: p=%d(%d) s=%d bf=%08x an=%08x data=%p size=%d l=%d w=%p r=%p o=%p sm=%d fw=%ld\n",
line,
s->si[1].state, s->si[1].fd, s->txn.rsp.msg_state, s->rep->flags, s->rep->analysers,
/* 1: create the response header */
rdr.len = strlen(HTTP_302);
rdr.str = trash;
- rdr.size = sizeof(trash);
+ rdr.size = trashlen;
memcpy(rdr.str, HTTP_302, rdr.len);
srv = target_srv(&s->target);
realm = do_stats?STATS_DEFAULT_REALM:px->id;
sprintf(trash, (txn->flags & TX_USE_PX_CONN) ? HTTP_407_fmt : HTTP_401_fmt, realm);
- chunk_initlen(&msg, trash, sizeof(trash), strlen(trash));
+ chunk_initlen(&msg, trash, trashlen, strlen(trash));
txn->status = 401;
stream_int_retnclose(req->prod, &msg);
/* on 401 we still count one error, because normal browsing
}
if (ret) {
- struct chunk rdr = { .str = trash, .size = sizeof(trash), .len = 0 };
+ struct chunk rdr = { .str = trash, .size = trashlen, .len = 0 };
const char *msg_fmt;
/* build redirect message */
hdr_val += hdr_name_len;
*hdr_val++ = ':';
*hdr_val++ = ' ';
- hdr_val += strlcpy2(hdr_val, srv_name, trash + sizeof(trash) - hdr_val);
+ hdr_val += strlcpy2(hdr_val, srv_name, trash + trashlen - hdr_val);
http_header_add_tail2(&txn->req, &txn->hdr_idx, trash, hdr_val - trash);
return 0;
len = sprintf(trash, "%08x:%s.%s[%04x:%04x]: ", t->uniq_id, t->be->id,
dir, (unsigned short)t->req->prod->fd, (unsigned short)t->req->cons->fd);
max = end - start;
- UBOUND(max, sizeof(trash) - len - 1);
+ UBOUND(max, trashlen - len - 1);
len += strlcpy2(trash + len, start, max + 1);
trash[len++] = '\n';
if (write(1, trash, len) < 0) /* shut gcc warning */;
* (which is recomputed every time since it's constant). If
* it is positive, it means we have to send from the start.
*/
- ret = make_proxy_line(trash, sizeof(trash),
+ ret = make_proxy_line(trash, trashlen,
&b->prod->addr.from, &b->prod->addr.to);
if (!ret)
return -1;
+
+ if (1) {
+ for (i=0; i<16096; i++)
-+ chunk_printf(&msg, sizeof(trash), "*");
++ chunk_printf(&msg, trashlen, "*");
+
-+ chunk_printf(&msg, sizeof(trash), "\n");
++ chunk_printf(&msg, trashlen, "\n");
+#if 0
if (!(s->data_ctx.stats.flags & STAT_FMT_CSV)) {
- chunk_printf(&msg, sizeof(trash),
+ chunk_printf(&msg, trashlen,
/* name, queue */
@@ -694,6 +702,7 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri)
px->failed_req,
px->state == PR_STIDLE ? "FULL" : "STOP");
+#endif
} else {
- chunk_printf(&msg, sizeof(trash),
+ chunk_printf(&msg, trashlen,
/* pxid, name, queue cur, queue max, */