#include <netinet/in.h>
#include <err.h>
+#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
{ "DATA", "354 End data with <CR><LF>.<CR><LF>\n" },
};
+static volatile sig_atomic_t got_signal = 0;
+
+static void
+signal_handler(int sig)
+{
+ (void)sig;
+ got_signal = 1;
+}
+
int
main(void)
{
FILE *f;
socklen_t clsize = sizeof(struct sockaddr_in);
struct sockaddr_in me = { 0 }, cl;
+ socklen_t melen = sizeof(me);
char *line = NULL;
size_t linecap = 0;
int mailnum = 0;
err(EXIT_FAILURE, "setsockopt");
me.sin_family = AF_INET;
me.sin_addr.s_addr = inet_addr("127.0.0.1");
- /* specific interface */
- me.sin_port = htons(25678);
+ me.sin_port = htons(0);
if (bind(s, (struct sockaddr *) &me, sizeof(me)) == -1)
- err(EXIT_FAILURE, "bin");
+ err(EXIT_FAILURE, "bind");
+ if (getsockname(s, (struct sockaddr *) &me, &melen) == -1)
+ err(EXIT_FAILURE, "getsockname");
if (listen(s, 1) == -1)
err(EXIT_FAILURE, "listen");
+ /* Write assigned port before daemonizing so the parent can read it */
+ f = fopen("fakesmtp.port", "w");
+ if (f == NULL)
+ err(EXIT_FAILURE, "fopen port");
+ fprintf(f, "%d\n", ntohs(me.sin_port));
+ fclose(f);
+
if (daemon(1, 0) != 0)
err(EXIT_FAILURE, "daemon");
+
+ signal(SIGTERM, signal_handler);
+ signal(SIGINT, signal_handler);
+
f = fopen("fakesmtp.pid", "w+");
if (f == NULL)
- err(EXIT_FAILURE, "fopen");
+ err(EXIT_FAILURE, "fopen pid");
fprintf(f, "%d\n", getpid());
fclose(f);
for (;;) {
char *mail;
FILE *fp, *fp2;
c = accept(s, (struct sockaddr *) &cl, &clsize);
- if (c == -1)
+ if (c == -1) {
+ if (got_signal)
+ break;
err(EXIT_FAILURE, "accept");
+ }
mailnum++;
asprintf(&mail, "mail-%d.txt", mailnum);
fclose(f);
}
+ free(line);
+ close(s);
+ unlink("fakesmtp.pid");
+ unlink("fakesmtp.port");
+
return (EXIT_SUCCESS);
}
simple_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > incoming-invalid << EOF
From: bob@test
subscribe_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > subscribe << EOF
subscribe_digest_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > subscribe << EOF
subscribe_nomail_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > subscribe << EOF
subscribe_both_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > subscribe << EOF
subscribe_nomail_confunsub_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > subscribe << EOF
subscribe_digest_confunsub_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > subscribe << EOF
}
ctrl_list_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > ctrllist << EOF
}
ctrl_help_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > ctrlhelp << EOF
}
ctrl_faq_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > ctrlhelp << EOF
}
ctrl_get_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
cat > ctrlget << EOF
}
subscription_moderation_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
echo "me@modos" > list/control/owner
moderator="test-moderators@mlmmjtest"
fi
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
echo "me@modos" > list/control/moderators
}
moderation_notifymod_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
echo "me@modos" > list/control/moderators
}
moderation_notmetoo_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
echo "me@modos" > list/control/moderators
}
moderation_reject_invalid_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
echo "me@modos" > list/control/moderators
}
maxmailsize_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
echo "1" > list/control/maxmailsize
}
maxmailsize0_body() {
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
echo "0" > list/control/maxmailsize
normal_email_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
printf "user@test\nuser2@test" > list/subscribers.d/u
delheaders_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
printf "X-H1\nNope\n" > list/control/delheaders
delheaders_extras_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
printf "X-k3\nx-h1\nx-L\n\n\n \n\t\nplop\nx-sym-colon:\nNope\n" > list/control/delheaders
customheaders_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
printf "X-H1: test\nNope: really not\n" > list/control/customheaders
customheaders_blanks_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
printf "X-H1: test\nNope: really not\n\n \n" > list/control/customheaders
customheaders_with_subst_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
printf "X-H1: test\nNope: really not\nX-Poster-Address: \$posteraddr\$\n" > list/control/customheaders
verp_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "postfix" > list/control/verp
echo 2 > list/control/maxverprecips
echo "heloname" > list/control/smtphelo
normal_email_with_dot_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
printf "user@test\nuser2@test" > list/subscribers.d/u
multi_line_headers_body()
{
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
init_ml list
rmdir list/text
ln -s ${top_srcdir}/listtexts/en list/text
echo test@mlmmjtest > list/control/listaddress
- echo "25678" > list/control/smtpport
+ start_fakesmtp list
echo "heloname" > list/control/smtphelo
printf "user@test\nuser2@test" > list/subscribers.d/u
{
init_ml ml
mlmmjsub=$(command -v mlmmj-sub)
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
echo test@mlmmjtest > ml/control/listaddress
- echo "25678" > ml/control/smtpport
+ start_fakesmtp ml
echo "heloname" > ml/control/smtphelo
rmdir ml/text
ln -s ${top_srcdir}/listtexts/en ml/text
{
init_ml ml
mlmmjsub=$(command -v mlmmj-sub)
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
echo test@mlmmjtest > ml/control/listaddress
- echo "25678" > ml/control/smtpport
+ start_fakesmtp ml
echo "heloname" > ml/control/smtphelo
rmdir ml/text
ln -s ${top_srcdir}/listtexts/en ml/text
{
init_ml ml
mlmmjsub=$(command -v mlmmj-sub)
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
echo test@mlmmjtest > ml/control/listaddress
- echo "25678" > ml/control/smtpport
+ start_fakesmtp ml
echo "heloname" > ml/control/smtphelo
touch ml/control/notifysub
rmdir ml/text
{
init_ml ml
mlmmjsub=$(command -v mlmmj-sub)
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
echo test@mlmmjtest > ml/control/listaddress
- echo "25678" > ml/control/smtpport
+ start_fakesmtp ml
echo "heloname" > ml/control/smtphelo
rmdir ml/text
ln -s ${top_srcdir}/listtexts/en ml/text
{
init_ml ml
mlmmjsub=$(command -v mlmmj-unsub)
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
echo test@mlmmjtest > ml/control/listaddress
echo "john@doe.org" > ml/subscribers.d/j
echo "bob@doe.org" >> ml/subscribers.d/j
echo "rebecca@doe.org" >> ml/subscribers.d/j
- echo "25678" > ml/control/smtpport
+ start_fakesmtp ml
echo "heloname" > ml/control/smtphelo
rmdir ml/text
ln -s ${top_srcdir}/listtexts/en ml/text
{
init_ml ml
mlmmjsub=$(command -v mlmmj-unsub)
- atf_check $top_builddir/tests/fakesmtpd
- trap kill_fakesmtp EXIT TERM
echo test@mlmmjtest > ml/control/listaddress
echo "john@doe.org" > ml/subscribers.d/j
echo "bob@doe.org" >> ml/subscribers.d/j
echo "rebecca@doe.org" >> ml/subscribers.d/j
- echo "25678" > ml/control/smtpport
+ start_fakesmtp ml
echo "heloname" > ml/control/smtphelo
touch ml/control/notifysub
rmdir ml/text
init_ml ml
mlmmjsub=$(command -v mlmmj-unsub)
printf "To: test@mlmmjtest1\r\nSubject: test\n\nplop" > mail
- echo 25678 > ml/control/smtpport
+ echo 1 > ml/control/smtpport
echo test@mlmmjtest > ml/control/listaddress
echo owner@mlmmjtest > ml/control/owner
echo "john@doe.org" > ml/subscribers.d/j