/**** common part ****/
struct timeval when; /* date of this event, (tv_sec == 0) means "never" */
/* @16 */
- char *buf; /* copy of the beginning of the message (may be NULL) */
+ void (*show)(struct buffer *, const struct error_snapshot *); /* dump function */
unsigned long long buf_ofs; /* relative position of the buffer's input inside its container */
/* @32 */
unsigned int buf_out; /* pending output bytes _before_ the buffer's input (0..buf->data-1) */
unsigned int ev_id; /* event number (counter incremented for each capture) */
/* @68: 4 bytes hole here */
struct sockaddr_storage src; /* client's address */
- void (*show)(struct buffer *, const struct error_snapshot *); /* dump function */
/**** protocol-specific part ****/
union error_snapshot_ctx ctx;
+ char buf[0]; /* copy of the beginning of the message for bufsize bytes */
};
struct email_alert {
ev_id = HA_ATOMIC_XADD(&error_snapshot_id, 1);
- es = malloc(sizeof(*es));
+ buf_len = b_data(buf) - buf_out;
+
+ es = malloc(sizeof(*es) + buf_len);
if (!es)
return;
- es->ev_id = ev_id;
+ es->buf_len = buf_len;
+ es->ev_id = ev_id;
- buf_len = b_data(buf) - buf_out;
len1 = b_size(buf) - buf_len;
if (len1 > buf_len)
len1 = buf_len;
- len2 = buf_len - len1;
-
- es->buf_len = buf_len;
-
- if (!es->buf)
- es->buf = malloc(global.tune.bufsize);
- if (es->buf) {
+ if (len1) {
memcpy(es->buf, b_peek(buf, buf_out), len1);
+ len2 = buf_len - len1;
if (len2)
memcpy(es->buf + len1, b_orig(buf), len2);
}
}
/* OK, ptr >= 0, so we have to dump the current line */
- while (es->buf && appctx->ctx.errors.ptr < es->buf_len && appctx->ctx.errors.ptr < global.tune.bufsize) {
+ while (appctx->ctx.errors.ptr < es->buf_len && appctx->ctx.errors.ptr < global.tune.bufsize) {
int newptr;
int newline;