aboutsummaryrefslogtreecommitdiff
path: root/gacopyz/gacopyz.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2008-11-02 09:20:59 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2008-11-02 09:20:59 +0000
commit40dae974804e364d747254ba942597e3c00612c0 (patch)
treecc2489bb950a95358b888dd78ec6f942d4e93fba /gacopyz/gacopyz.c
parentb44a8aaa2d15535fad13f3f45c205a662f32967c (diff)
downloadmailfromd-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.c70
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;

Return to:

Send suggestions and report system problems to the System administrator.