diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-02 09:20:59 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2008-11-02 09:20:59 +0000 |
commit | 40dae974804e364d747254ba942597e3c00612c0 (patch) | |
tree | cc2489bb950a95358b888dd78ec6f942d4e93fba /gacopyz/gacopyz.c | |
parent | b44a8aaa2d15535fad13f3f45c205a662f32967c (diff) | |
download | mailfromd-40dae974804e364d747254ba942597e3c00612c0.tar.gz mailfromd-40dae974804e364d747254ba942597e3c00612c0.tar.bz2 |
Get rid of ml_header. Gacopyz takes care about the header formatting.
* gacopyz/gacopyz.h (gacopyz_safe_header_value): New proto.
* gacopyz/gacopyz.c (gacopyz_safe_header_value): New function.
(gacopyz_header_command): Use gacopyz_safe_header_value to format
header value.
* mfd/bi_sa.m4 (sa): Remove unused variable.
* mfd/bi_string.m4: Remove ml_header.
* doc/mailfromd.texi: Remove ml_header.
git-svn-id: file:///svnroot/mailfromd/trunk@1718 7a8a7f39-df28-0410-adc6-e0d955640f24
Diffstat (limited to 'gacopyz/gacopyz.c')
-rw-r--r-- | gacopyz/gacopyz.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/gacopyz/gacopyz.c b/gacopyz/gacopyz.c index 06066a41..39c78a9c 100644 --- a/gacopyz/gacopyz.c +++ b/gacopyz/gacopyz.c @@ -1595,8 +1595,58 @@ gacopyz_stop(gacopyz_conn_t conn) return MI_SUCCESS; } +#define ISWS(c) ((c) == ' ' || (c) == '\t') + +const char * +gacopyz_safe_header_value(const char *input, char **poutput) +{ + char *output; + const char *p; + size_t len; + size_t count; + int tab, newline; + + for (count = 0, p = input; *p && (p = strchr(p, '\n')); ) { + if (p == input || (p[1] && !ISWS(p[1]))) + count++; + p++; + } + + if (!count) { + *poutput = NULL; + return input; + } + + output = malloc(strlen(input) + count + 1); + *poutput = output; + if (!output) + return NULL; + newline = tab = 0; + while (*input) { + len = strcspn(input, "\n"); + if (len == 0 && input[1] == 0) + break; + if (newline) + *output++ = '\n'; + else + newline = 1; + if (tab) + *output++ = '\t'; + tab = !ISWS(input[len+1]); + if (len) { + memcpy(output, input, len); + input += len; + output += len; + } + if (*input) + input++; + } + *output = 0; + return *poutput; +} + static int -gacopyz_header_command(SMFICTX *ctx, unsigned char cmd, +gacopyz_header_command0(SMFICTX *ctx, unsigned char cmd, int idx, const char *headerf, const char *headerv) { @@ -1638,6 +1688,24 @@ gacopyz_header_command(SMFICTX *ctx, unsigned char cmd, } static int +gacopyz_header_command(SMFICTX *ctx, unsigned char cmd, + int idx, const char *headerf, + const char *headerv) +{ + int rc; + char *header_tmp; + + if (!headerf || !*headerf || !headerv) + return MI_FAILURE; + headerv = gacopyz_safe_header_value(headerv, &header_tmp); + if (!headerv) + return MI_FAILURE; + rc = gacopyz_header_command0(ctx, cmd, idx, headerf, headerv); + free(header_tmp); + return rc; +} + +static int gacopyz_rcpt_command(SMFICTX *ctx, unsigned char cmd, const char *rcpt) { char *buf; |