commit 6f50562c56f193791207499caae0a5f6da3e9a6e from: Martijn van Duren date: Thu Mar 28 19:44:53 2019 UTC Apparently _IOLBF doesn't always flush on lines. Force with fflush(3). Also, we support multiple requests at a time, remove fake non-support commit - bbde5ceaee75d67802c9e2018c23adcc292d75e8 commit + 6f50562c56f193791207499caae0a5f6da3e9a6e blob - 4ab66caa6dbfaeaf85a4fc4f8d3086a46b1c69b4 blob + 96d943ce505fbd9c14b4c290260c7d42ca4db6ac --- smtp_proc.c +++ smtp_proc.c @@ -42,7 +42,6 @@ struct smtp_callback { }; static int ready = 0; -static int resolved = 1; int smtp_register_filter_connect(void (*cb)(char *, int, struct timespec *, char *, @@ -57,6 +56,7 @@ smtp_run(void) struct event stdinev; printf("register|ready\n"); + fflush(stdout); ready = 1; event_init(); @@ -66,7 +66,6 @@ smtp_run(void) if (fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK) == -1) err(1, "fcntl"); - event_dispatch(); } @@ -182,39 +181,31 @@ smtp_handle_filter(struct smtp_callback *cb, int versi { enum filter_decision fdes; - if (!resolved) - errx(1, "Handling unexpected second request"); - resolved = 0; fdes = cb->cb(cb->type, version, tm, cb->direction, cb->phase, reqid, token, params); - if (!resolved) { - switch (fdes) { - case FILTER_PROCEED: - smtp_filter_proceed(reqid, token); - break; - case FILTER_REJECT: - smtp_filter_reject(reqid, token, 451, - "Rejected by filter"); - break; - case FILTER_DISCONNECT: - smtp_filter_disconnect(reqid, token, - "Rejected by filter"); - break; - case FILTER_REWRITE: - errx(1, "Not sure what is intended here yet"); - } + switch (fdes) { + case FILTER_PROCEED: + smtp_filter_proceed(reqid, token); + break; + case FILTER_REJECT: + smtp_filter_reject(reqid, token, 451, + "Rejected by filter"); + break; + case FILTER_DISCONNECT: + smtp_filter_disconnect(reqid, token, + "Rejected by filter"); + break; + case FILTER_REWRITE: + errx(1, "Not sure what is intended here yet"); } } void smtp_filter_proceed(uint64_t reqid, uint64_t token) { - if (resolved) - errx(1, "reqid: %016"PRIx64" token: %016"PRIx64" already " - "resolved", reqid, token); printf("filter-result|%016"PRIx64"|%016"PRIx64"|proceed\n", token, reqid); - resolved = 1; + fflush(stdout); } void @@ -223,9 +214,6 @@ smtp_filter_reject(uint64_t reqid, uint64_t token, int { va_list ap; - if (resolved) - errx(1, "reqid: %016"PRIx64" token: %016"PRIx64" already " - "resolved", reqid, token); if (code < 200 || code > 599) errx(1, "Invalid reject code"); @@ -235,7 +223,7 @@ smtp_filter_reject(uint64_t reqid, uint64_t token, int vprintf(reason, ap); va_end(ap); putchar('\n'); - resolved = 1; + fflush(stdout); } void @@ -243,16 +231,13 @@ smtp_filter_disconnect(uint64_t reqid, uint64_t token, { va_list ap; - if (resolved) - errx(1, "reqid: %016"PRIx64" token: %016"PRIx64" already " - "resolved", reqid, token); printf("filter-result|%016"PRIx64"|%016"PRIx64"|disconnect|421 ", token, reqid); va_start(ap, reason); vprintf(reason, ap); va_end(ap); putchar('\n'); - resolved = 1; + fflush(stdout); } static int