int main(int unused_argc, char **unused_argv) { VSTRING *unquoted = vstring_alloc(BUFLEN); VSTRING *quoted = vstring_alloc(100); ssize_t len; while ((len = read_buf(VSTREAM_IN, unquoted)) > 0) { xtext_quote(quoted, STR(unquoted), "+="); if (xtext_unquote(unquoted, STR(quoted)) == 0) msg_fatal("bad input: %.100s", STR(quoted)); if (LEN(unquoted) != len) msg_fatal("len %ld != unquoted len %ld", (long) len, (long) LEN(unquoted)); if (vstream_fwrite(VSTREAM_OUT, STR(unquoted), LEN(unquoted)) != LEN(unquoted)) msg_fatal("write error: %m"); } vstream_fflush(VSTREAM_OUT); vstring_free(unquoted); vstring_free(quoted); return (0); }
static int smtpd_proxy_xforward_send(SMTPD_STATE *state, VSTRING *buf, const char *name, int value_available, const char *value) { size_t new_len; int ret; #define CONSTR_LEN(s) (sizeof(s) - 1) #define PAYLOAD_LIMIT (512 - CONSTR_LEN("250 " XFORWARD_CMD "\r\n")) if (!value_available) value = XFORWARD_UNAVAILABLE; /* * Encode the attribute value. */ if (state->expand_buf == 0) state->expand_buf = vstring_alloc(100); xtext_quote(state->expand_buf, value, ""); /* * How much space does this attribute need? SPACE name = value. */ new_len = strlen(name) + strlen(STR(state->expand_buf)) + 2; if (new_len > PAYLOAD_LIMIT) msg_warn("%s command payload %s=%.10s... exceeds SMTP protocol limit", XFORWARD_CMD, name, value); /* * Flush the buffer if we need to, and store the attribute. */ if (VSTRING_LEN(buf) > 0 && VSTRING_LEN(buf) + new_len > PAYLOAD_LIMIT) if ((ret = smtpd_proxy_xforward_flush(state, buf)) < 0) return (ret); vstring_sprintf_append(buf, " %s=%s", name, STR(state->expand_buf)); return (0); }