]> git.ipfire.org Git - thirdparty/mlmmj.git/commitdiff
listtexts: subtree merge
authorBaptiste Daroussin <bapt@FreeBSD.org>
Mon, 26 Jun 2023 18:57:59 +0000 (20:57 +0200)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Mon, 26 Jun 2023 18:57:59 +0000 (20:57 +0200)
Merge the listext repository keeping the history

190 files changed:
1  2 
listtexts/Makefile.am
listtexts/ast/confirm
listtexts/ast/deny
listtexts/ast/deny-post
listtexts/ast/digest
listtexts/ast/faq
listtexts/ast/finish
listtexts/ast/finish-sub
listtexts/ast/gatekeep-sub
listtexts/ast/help
listtexts/ast/list
listtexts/ast/moderate-post
listtexts/ast/notify
listtexts/ast/probe
listtexts/ast/prologue
listtexts/ast/subrelease
listtexts/ast/wait-post
listtexts/ast/wait-sub
listtexts/cs/confirm
listtexts/cs/deny
listtexts/cs/deny-post
listtexts/cs/digest
listtexts/cs/faq
listtexts/cs/finish
listtexts/cs/finish-sub
listtexts/cs/gatekeep-sub
listtexts/cs/help
listtexts/cs/list
listtexts/cs/moderate-post
listtexts/cs/notify
listtexts/cs/probe
listtexts/cs/prologue
listtexts/cs/subrelease
listtexts/cs/wait-post
listtexts/cs/wait-sub
listtexts/de/confirm
listtexts/de/deny
listtexts/de/deny-post
listtexts/de/digest
listtexts/de/faq
listtexts/de/finish
listtexts/de/finish-sub
listtexts/de/gatekeep-sub
listtexts/de/help
listtexts/de/list
listtexts/de/moderate-post
listtexts/de/notify
listtexts/de/probe
listtexts/de/prologue
listtexts/de/subrelease
listtexts/de/wait-post
listtexts/de/wait-sub
listtexts/en/confirm
listtexts/en/deny
listtexts/en/deny-post
listtexts/en/digest
listtexts/en/faq
listtexts/en/finish
listtexts/en/finish-sub
listtexts/en/gatekeep-sub
listtexts/en/help
listtexts/en/list
listtexts/en/moderate-post
listtexts/en/notify
listtexts/en/probe
listtexts/en/prologue
listtexts/en/subrelease
listtexts/en/wait-post
listtexts/en/wait-sub
listtexts/fi/confirm
listtexts/fi/deny
listtexts/fi/deny-post
listtexts/fi/digest
listtexts/fi/faq
listtexts/fi/finish
listtexts/fi/finish-sub
listtexts/fi/gatekeep-sub
listtexts/fi/help
listtexts/fi/list
listtexts/fi/moderate-post
listtexts/fi/notify
listtexts/fi/probe
listtexts/fi/prologue
listtexts/fi/subrelease
listtexts/fi/wait-post
listtexts/fi/wait-sub
listtexts/fr/confirm
listtexts/fr/deny
listtexts/fr/deny-post
listtexts/fr/digest
listtexts/fr/faq
listtexts/fr/finish
listtexts/fr/finish-sub
listtexts/fr/gatekeep-sub
listtexts/fr/help
listtexts/fr/list
listtexts/fr/moderate-post
listtexts/fr/notify
listtexts/fr/probe
listtexts/fr/prologue
listtexts/fr/subrelease
listtexts/fr/wait-post
listtexts/fr/wait-sub
listtexts/gr/confirm
listtexts/gr/deny
listtexts/gr/deny-post
listtexts/gr/digest
listtexts/gr/faq
listtexts/gr/finish
listtexts/gr/finish-sub
listtexts/gr/gatekeep-sub
listtexts/gr/help
listtexts/gr/list
listtexts/gr/moderate-post
listtexts/gr/notify
listtexts/gr/probe
listtexts/gr/prologue
listtexts/gr/subrelease
listtexts/gr/wait-post
listtexts/gr/wait-sub
listtexts/it/confirm
listtexts/it/deny
listtexts/it/deny-post
listtexts/it/digest
listtexts/it/faq
listtexts/it/finish
listtexts/it/finish-sub
listtexts/it/gatekeep-sub
listtexts/it/help
listtexts/it/list
listtexts/it/moderate-post
listtexts/it/notify
listtexts/it/probe
listtexts/it/prologue
listtexts/it/subrelease
listtexts/it/wait-post
listtexts/it/wait-sub
listtexts/pt/confirm
listtexts/pt/deny
listtexts/pt/deny-post
listtexts/pt/digest
listtexts/pt/faq
listtexts/pt/finish
listtexts/pt/finish-sub
listtexts/pt/gatekeep-sub
listtexts/pt/help
listtexts/pt/list
listtexts/pt/moderate-post
listtexts/pt/notify
listtexts/pt/probe
listtexts/pt/prologue
listtexts/pt/subrelease
listtexts/pt/wait-post
listtexts/pt/wait-sub
listtexts/sk/confirm
listtexts/sk/deny
listtexts/sk/deny-post
listtexts/sk/digest
listtexts/sk/faq
listtexts/sk/finish
listtexts/sk/finish-sub
listtexts/sk/gatekeep-sub
listtexts/sk/help
listtexts/sk/list
listtexts/sk/moderate-post
listtexts/sk/notify
listtexts/sk/probe
listtexts/sk/prologue
listtexts/sk/subrelease
listtexts/sk/wait-post
listtexts/sk/wait-sub
listtexts/zh-cn/confirm
listtexts/zh-cn/deny
listtexts/zh-cn/deny-post
listtexts/zh-cn/digest
listtexts/zh-cn/faq
listtexts/zh-cn/finish
listtexts/zh-cn/finish-sub
listtexts/zh-cn/gatekeep-sub
listtexts/zh-cn/help
listtexts/zh-cn/list
listtexts/zh-cn/moderate-post
listtexts/zh-cn/notify
listtexts/zh-cn/probe
listtexts/zh-cn/prologue
listtexts/zh-cn/subrelease
listtexts/zh-cn/wait-post
listtexts/zh-cn/wait-sub
src/mlmmj-sub.c
src/send_mail.c

index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..46329280c0dab1a2b69924411f64d1823068a0af
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++## Process this file with automake to produce Makefile.in
++
++nobase_dist_textlib_DATA = $(srcdir)/*/*
index 0000000000000000000000000000000000000000,110735794aa2991b23256901c6479634210c4916..110735794aa2991b23256901c6479634210c4916
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,4b10912d1454c8872ef78041ccd9ae3d2d686e13..4b10912d1454c8872ef78041ccd9ae3d2d686e13
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,26cdea7623ba95e3fab04f5e7945396b27c8e42d..26cdea7623ba95e3fab04f5e7945396b27c8e42d
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,8845b4f259746df7cd08039c502b5d267fda45b4..8845b4f259746df7cd08039c502b5d267fda45b4
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3c29fa9126e5da1db5068b1bc33388c153c35fa5..3c29fa9126e5da1db5068b1bc33388c153c35fa5
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,cfbeafadeecfa47cdef66102aebee67cf8de403b..cfbeafadeecfa47cdef66102aebee67cf8de403b
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9ecb92a5f566ec0338a1c1a092b6bc5a5b7b5253..9ecb92a5f566ec0338a1c1a092b6bc5a5b7b5253
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,46fb5f86eecd64f8c89bf11e1d0bc275c8f2a7d0..46fb5f86eecd64f8c89bf11e1d0bc275c8f2a7d0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,2cf6eb7ae1320c87e44fc137659bbb571b229ce5..2cf6eb7ae1320c87e44fc137659bbb571b229ce5
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,7fb358afac815f4bbdc6f960faa78473183dc3d1..7fb358afac815f4bbdc6f960faa78473183dc3d1
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,49b65f436c3726b09f7d12a65f12cf8a78ac7aa7..49b65f436c3726b09f7d12a65f12cf8a78ac7aa7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d52411025bb8463ee2ba1858e478cb2553e7c69e..d52411025bb8463ee2ba1858e478cb2553e7c69e
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,cd309afab3070ae1e778f7de2ea451a1e679b238..cd309afab3070ae1e778f7de2ea451a1e679b238
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,df7cf43b79a01b2867648452e4fc54c69e255180..df7cf43b79a01b2867648452e4fc54c69e255180
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,a8a0d0d9a626192bc183b70dcaf9383662f12278..a8a0d0d9a626192bc183b70dcaf9383662f12278
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,63e465497490593f8fb23e3eb52bb65e6cc83f33..63e465497490593f8fb23e3eb52bb65e6cc83f33
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,07d68299ebbc7a0902b2fead3b20b2c51983d9d4..07d68299ebbc7a0902b2fead3b20b2c51983d9d4
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,dc7bd56dd15ddf288bd2f24cb0d36ab15a2f20b5..dc7bd56dd15ddf288bd2f24cb0d36ab15a2f20b5
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,fea660da02717435ec564fa86346139b9d701561..fea660da02717435ec564fa86346139b9d701561
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d672b9640da3caeb6563093fc7bd10bf9fb0b902..d672b9640da3caeb6563093fc7bd10bf9fb0b902
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9a32e62e0c32b462ecaac63aa1b2dbeda4a1773c..9a32e62e0c32b462ecaac63aa1b2dbeda4a1773c
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,1233412b43deec2ed483b07097b8a854320eecc9..1233412b43deec2ed483b07097b8a854320eecc9
mode 000000,100644..100644
--- /dev/null
--- 2/cs/faq
index 0000000000000000000000000000000000000000,557d143acdb14f8ff5ceaa788515aad43c3190b8..557d143acdb14f8ff5ceaa788515aad43c3190b8
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,76e67e34d9b2e15bb2c50ee213a781cc47b2c7d5..76e67e34d9b2e15bb2c50ee213a781cc47b2c7d5
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ff3f83fb7c059ed62b2fc4f76e4c4481f287f8f7..ff3f83fb7c059ed62b2fc4f76e4c4481f287f8f7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,8f499e5365e5f04ed5951bc97704c8260db0d330..8f499e5365e5f04ed5951bc97704c8260db0d330
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9acf848c4e6648ecd0565394f9b4cb25ee61abb1..9acf848c4e6648ecd0565394f9b4cb25ee61abb1
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,467ca742e96fdce191d4962f459c6cf5ac3653d2..467ca742e96fdce191d4962f459c6cf5ac3653d2
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,21506f0a1922dc09960203b5a935c3cc359b09f6..21506f0a1922dc09960203b5a935c3cc359b09f6
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,8b867ed7422424ac6858d6e29e77cc03cd5e4628..8b867ed7422424ac6858d6e29e77cc03cd5e4628
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,bb4daa4778fa68fb1b4ea29c9f09d66ba865e20d..bb4daa4778fa68fb1b4ea29c9f09d66ba865e20d
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,db74f3f4fb3f7d54d0935de709508d3337d2f2bd..db74f3f4fb3f7d54d0935de709508d3337d2f2bd
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,50e976da040c48d9c2e4c609873f2d5aed438ac6..50e976da040c48d9c2e4c609873f2d5aed438ac6
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ce3328781899bb8aa5aa847de01fabf3b0f70995..ce3328781899bb8aa5aa847de01fabf3b0f70995
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,7e926d438e397db12b86e09fe3929656bb06960b..7e926d438e397db12b86e09fe3929656bb06960b
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3ef5e1fa881e2db557ca2e948e54f4d443f0562f..3ef5e1fa881e2db557ca2e948e54f4d443f0562f
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,26919c0b71afc4aefeaecfb8e32417b379394c09..26919c0b71afc4aefeaecfb8e32417b379394c09
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,06736075279940045fcecf41d1f4e013483293b9..06736075279940045fcecf41d1f4e013483293b9
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e19155112c62c491b666e18f8cb2110034693d53..e19155112c62c491b666e18f8cb2110034693d53
mode 000000,100644..100644
--- /dev/null
--- 2/de/faq
index 0000000000000000000000000000000000000000,46c12bee26d8afbedcfcfca60fa2ebec9ed22304..46c12bee26d8afbedcfcfca60fa2ebec9ed22304
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e1b67f4b1f285a8b2681ad94705ab172d1afdb68..e1b67f4b1f285a8b2681ad94705ab172d1afdb68
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,1f9a48acba41218c1ffe89b9482bdf0a99c19129..1f9a48acba41218c1ffe89b9482bdf0a99c19129
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b4b208b09e797deae005e4c068cd477e78d3fb87..b4b208b09e797deae005e4c068cd477e78d3fb87
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,faa9fcebe55f833c747616cc2709f58e4fb6bb93..faa9fcebe55f833c747616cc2709f58e4fb6bb93
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d214684ea7c4dbba80afc59a1b6d3b20329214ee..d214684ea7c4dbba80afc59a1b6d3b20329214ee
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,aa96202434aa304448249c5d6b6beec6e88a162d..aa96202434aa304448249c5d6b6beec6e88a162d
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d4c8a9d03ed453e54e9d05405a7bf6dd1f824ff7..d4c8a9d03ed453e54e9d05405a7bf6dd1f824ff7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,a3a44ae647a4bfd30dce1b981046c3f4941c5dab..a3a44ae647a4bfd30dce1b981046c3f4941c5dab
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,a68ec7119b36eb7843b7ac8cd1ceeab19f85540f..a68ec7119b36eb7843b7ac8cd1ceeab19f85540f
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,49bc99fc1180db3d73ec42456ec14a2d84815b52..49bc99fc1180db3d73ec42456ec14a2d84815b52
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,594fcfb4b61f727247e621c69e0d8715a0e115cb..594fcfb4b61f727247e621c69e0d8715a0e115cb
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ae8cbdddfd250369e93d1b38262a29af570de828..ae8cbdddfd250369e93d1b38262a29af570de828
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e02b1be32ed07b3c903244bd3b0ccff1a426145a..e02b1be32ed07b3c903244bd3b0ccff1a426145a
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9de308a079491baf4e11b3af008a92e0cbeebc7b..9de308a079491baf4e11b3af008a92e0cbeebc7b
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e9fa85926d5fc7828f34c4e6d426f297ece0bf71..e9fa85926d5fc7828f34c4e6d426f297ece0bf71
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,28f22fe1f64af56c060d0c28113b9612dd8d5cf2..28f22fe1f64af56c060d0c28113b9612dd8d5cf2
mode 000000,100644..100644
--- /dev/null
--- 2/en/faq
index 0000000000000000000000000000000000000000,8560bae1cb95e5d477c7048831f704915356e40a..8560bae1cb95e5d477c7048831f704915356e40a
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,64337a36ce4f82241070a17a586b3379bccdf99a..64337a36ce4f82241070a17a586b3379bccdf99a
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ba460886091f869d830bddf651d03c6945f587c2..ba460886091f869d830bddf651d03c6945f587c2
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3b104bc73b344a3cb47bfb41aeaaf690d3b846b2..3b104bc73b344a3cb47bfb41aeaaf690d3b846b2
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,52f3be876983a25369d0887c1e67742a61926c46..52f3be876983a25369d0887c1e67742a61926c46
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,18944c3a0f822b11e7c5e8e5c6ebb5c5663e2471..18944c3a0f822b11e7c5e8e5c6ebb5c5663e2471
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,6c2876c0c2976f71352b5a1cd1c8e4c4f308ead0..6c2876c0c2976f71352b5a1cd1c8e4c4f308ead0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,397ebbec14ae766bb6d48ec94bd0247eaa587eb0..397ebbec14ae766bb6d48ec94bd0247eaa587eb0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ef76595f6ab26cf957bfc108fa8830541281ac5f..ef76595f6ab26cf957bfc108fa8830541281ac5f
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,7cdae70cfb2ca51ad1ede2a559770136da85e0ec..7cdae70cfb2ca51ad1ede2a559770136da85e0ec
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d30fb5d2ad9d44687296eaf0fcf7cdeccbc1fb3b..d30fb5d2ad9d44687296eaf0fcf7cdeccbc1fb3b
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,84df549eb6f86f05d15fa3922bf29c32ba5a57df..84df549eb6f86f05d15fa3922bf29c32ba5a57df
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,6170eabad5cdbe4becb3b417dd84b0f2cb1308e6..6170eabad5cdbe4becb3b417dd84b0f2cb1308e6
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,cbd85dea698884e9583a5b647d7447c3ed4af556..cbd85dea698884e9583a5b647d7447c3ed4af556
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,0cc151beea7ae977f3680ef1d27ab8e053eb68b4..0cc151beea7ae977f3680ef1d27ab8e053eb68b4
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,c4d61798808cf4eda6b86bdba494fe23a0e6bbb0..c4d61798808cf4eda6b86bdba494fe23a0e6bbb0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d03db261ced2e0cf4c335cf3f42fa8142f669752..d03db261ced2e0cf4c335cf3f42fa8142f669752
mode 000000,100644..100644
--- /dev/null
--- 2/fi/faq
index 0000000000000000000000000000000000000000,1f25fba0db24c3a064a219eb5179be6831be2571..1f25fba0db24c3a064a219eb5179be6831be2571
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,4a8c3f09c9f56b61136341a6bb29efc36d93763d..4a8c3f09c9f56b61136341a6bb29efc36d93763d
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,26aa70120d9c2821521734d0b6942e4f894a2640..26aa70120d9c2821521734d0b6942e4f894a2640
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,51bc9da3dbc530e28f86f45f3f5266149baccc35..51bc9da3dbc530e28f86f45f3f5266149baccc35
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d6be99565e1fb3a056b03dad6e85d5fcb3f34c88..d6be99565e1fb3a056b03dad6e85d5fcb3f34c88
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9f7b46eeb3a45f045eb61a368982e221310755d1..9f7b46eeb3a45f045eb61a368982e221310755d1
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,a086dede7793ced9a6e723a6dd86f8292bc90088..a086dede7793ced9a6e723a6dd86f8292bc90088
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3b64737fb218e8ff6e0ab01732c8add84259af78..3b64737fb218e8ff6e0ab01732c8add84259af78
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,f7b463398da0358d047f051c0624a52966bcf264..f7b463398da0358d047f051c0624a52966bcf264
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,665c16379062ee50dd065821bdab4f93c6e7b1a9..665c16379062ee50dd065821bdab4f93c6e7b1a9
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ef63c9cb5970fe946bc51940af654f74c37f3ad2..ef63c9cb5970fe946bc51940af654f74c37f3ad2
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e0fd8d7f8f894ace204cba17f76f6aeee19b77c1..e0fd8d7f8f894ace204cba17f76f6aeee19b77c1
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b0ad3a8cda9d01440affd2c41606efc55f501531..b0ad3a8cda9d01440affd2c41606efc55f501531
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ba1b60435aba14e079c94198d75221f36875d7da..ba1b60435aba14e079c94198d75221f36875d7da
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b7b05dd3013d09815a95229723d043fd5a8b914d..b7b05dd3013d09815a95229723d043fd5a8b914d
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,91b6c196adc0a1ded7bed68782b6f410228ceaf7..91b6c196adc0a1ded7bed68782b6f410228ceaf7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,004af38cfd757514d226118cc545bbaf57ab53d9..004af38cfd757514d226118cc545bbaf57ab53d9
mode 000000,100644..100644
--- /dev/null
--- 2/fr/faq
index 0000000000000000000000000000000000000000,4e021bcc0abb966a4a88d22cff6a309ba7e6af1b..4e021bcc0abb966a4a88d22cff6a309ba7e6af1b
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,116af4574daa35920127ca5512a960d2e9c4b920..116af4574daa35920127ca5512a960d2e9c4b920
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,df1fa87c6ef6a4818555ba3cfacfd5095eb56e77..df1fa87c6ef6a4818555ba3cfacfd5095eb56e77
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9d13b8b0502c5fa108ee715d3631aaf785afe150..9d13b8b0502c5fa108ee715d3631aaf785afe150
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,14c61bb2bbc8cafeb8f67e0dc080e398e0f49eac..14c61bb2bbc8cafeb8f67e0dc080e398e0f49eac
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,6b1f5292365dbb2fd189414e390a854094591b43..6b1f5292365dbb2fd189414e390a854094591b43
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,20867b3cb0d59617e6d3031e7e0c8f4ae6f66ae0..20867b3cb0d59617e6d3031e7e0c8f4ae6f66ae0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ee421ee093cc2a5d97a3e81aca0138ae35e8b8cf..ee421ee093cc2a5d97a3e81aca0138ae35e8b8cf
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,06ae06de95b0e327d26ba1913dc3220b1c54ad84..06ae06de95b0e327d26ba1913dc3220b1c54ad84
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3f3bdcbfd9aac70ab55e1ebea7f6ffcd6314a4ee..3f3bdcbfd9aac70ab55e1ebea7f6ffcd6314a4ee
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,0d4196ef081c600a6ef1210786e9d04380929d37..0d4196ef081c600a6ef1210786e9d04380929d37
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,2f58448480c920e02b7c3255c25cc25191361ad9..2f58448480c920e02b7c3255c25cc25191361ad9
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,32b43c5aac92401ac0dab31f070af4e902bf45cf..32b43c5aac92401ac0dab31f070af4e902bf45cf
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,dc7b8fc34056f4aa4cdfa96fd0dea7690e0e64ce..dc7b8fc34056f4aa4cdfa96fd0dea7690e0e64ce
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,32a8dc843a2ebda6ccac1d0aa415b2b1c2f5ad70..32a8dc843a2ebda6ccac1d0aa415b2b1c2f5ad70
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e2c5970ff42321df4dd5cd5348305e0605617b62..e2c5970ff42321df4dd5cd5348305e0605617b62
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,a563bf60cfc10ebbcdf9ab81f39eb818587bbab1..a563bf60cfc10ebbcdf9ab81f39eb818587bbab1
mode 000000,100644..100644
--- /dev/null
--- 2/gr/faq
index 0000000000000000000000000000000000000000,388187abeee06758a65c396484435822737b56a4..388187abeee06758a65c396484435822737b56a4
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e884e510530cd68cad8beee7bc590c7fdbe45724..e884e510530cd68cad8beee7bc590c7fdbe45724
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,1c0a2efd399ffac6678985fd436ac05600bb010b..1c0a2efd399ffac6678985fd436ac05600bb010b
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,30b6459f50dbf8138b12aa9fb29a76ef2d398b77..30b6459f50dbf8138b12aa9fb29a76ef2d398b77
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,53004e6dd0cf4c3a44c44b77187bb7c3f1ab267a..53004e6dd0cf4c3a44c44b77187bb7c3f1ab267a
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,cb41e8ffd7356106cdb776ca8994a68347202726..cb41e8ffd7356106cdb776ca8994a68347202726
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,dd51bc1f1c2f61783b3584536e51880ce7d6beb0..dd51bc1f1c2f61783b3584536e51880ce7d6beb0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e043a97c818756111d96ffd94da5cb3ecf0854c1..e043a97c818756111d96ffd94da5cb3ecf0854c1
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b774bfe2ea3dbec32913770a02b72423c0a02970..b774bfe2ea3dbec32913770a02b72423c0a02970
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,4c808727e39319d0959457d22a11c4aab5dd0581..4c808727e39319d0959457d22a11c4aab5dd0581
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,4e42928b0414432c6e2522f8888f400505f19df8..4e42928b0414432c6e2522f8888f400505f19df8
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,c3c70a899e3d300178195261127851be1b50eec7..c3c70a899e3d300178195261127851be1b50eec7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b586b11ccc122b72394a50121cc0c270c5637c94..b586b11ccc122b72394a50121cc0c270c5637c94
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e9079811e59ad7b617f2c6fa966ec241cddb600c..e9079811e59ad7b617f2c6fa966ec241cddb600c
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,03b2e08fa11500ae19fe0ea943e455d498e82b66..03b2e08fa11500ae19fe0ea943e455d498e82b66
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d2143154f857d6e6904dde115a2914222ef96842..d2143154f857d6e6904dde115a2914222ef96842
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b32adf5a2c99dce084f1ce7422a356fef6d15a55..b32adf5a2c99dce084f1ce7422a356fef6d15a55
mode 000000,100644..100644
--- /dev/null
--- 2/it/faq
index 0000000000000000000000000000000000000000,d0d1f2b385b601612f70dc63c3bf2aaf155a59e5..d0d1f2b385b601612f70dc63c3bf2aaf155a59e5
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e8c7055960a18ea91ca3d16249000a6bed4101fb..e8c7055960a18ea91ca3d16249000a6bed4101fb
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3c14b0f79cd0fa078ab987bd01b7623ca2940fa5..3c14b0f79cd0fa078ab987bd01b7623ca2940fa5
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e124f69a2b57a8f313fafc2a1929e1ea72b441f0..e124f69a2b57a8f313fafc2a1929e1ea72b441f0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,a40342a91af72cbbdbc7d058112c357f358fa6cd..a40342a91af72cbbdbc7d058112c357f358fa6cd
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,6d9f2d54757003d2cdaa5f66ba74b97f638fb4a0..6d9f2d54757003d2cdaa5f66ba74b97f638fb4a0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,09297f4b36f9c16bd1660056bb472be982aac0b6..09297f4b36f9c16bd1660056bb472be982aac0b6
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d3bfaa3ab135e651950a771e20493938a48a57ab..d3bfaa3ab135e651950a771e20493938a48a57ab
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,50621f2b8df8f380616b3fcad0d964a2c22edeb9..50621f2b8df8f380616b3fcad0d964a2c22edeb9
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,f97453c1a963bf0286effd85f601f28279ac9f34..f97453c1a963bf0286effd85f601f28279ac9f34
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b057ea8bc43a699cd7a27226d78a96416b3ebf7c..b057ea8bc43a699cd7a27226d78a96416b3ebf7c
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,38b3493a9647f9eff9ffea28cae35e764b3b1889..38b3493a9647f9eff9ffea28cae35e764b3b1889
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,5d24f55e1864c25517b2c847a380cb4809bc7f78..5d24f55e1864c25517b2c847a380cb4809bc7f78
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,efecda7e6943fa0fbea04de2da26cc2f02609573..efecda7e6943fa0fbea04de2da26cc2f02609573
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,62ec9c3a9dfabf7dd145af89a8319a3c884a26c7..62ec9c3a9dfabf7dd145af89a8319a3c884a26c7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e5958222cb55c1a7bdfde004d62c74a5ec506dcd..e5958222cb55c1a7bdfde004d62c74a5ec506dcd
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,45454bca04150e8b36c170d3e6eeed90d1d8a485..45454bca04150e8b36c170d3e6eeed90d1d8a485
mode 000000,100644..100644
--- /dev/null
--- 2/pt/faq
index 0000000000000000000000000000000000000000,31a8a0e8343143a8e96b570c45ece97cd7eebdf4..31a8a0e8343143a8e96b570c45ece97cd7eebdf4
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b15ae66487913f70b20bf3fb7323b5f31b165367..b15ae66487913f70b20bf3fb7323b5f31b165367
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,eb8fec06eacd51472dcbc6e438898f1cbe16d880..eb8fec06eacd51472dcbc6e438898f1cbe16d880
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,28b0ce205079127eb2c9de96fc8ac3af53e836fe..28b0ce205079127eb2c9de96fc8ac3af53e836fe
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3f3590d168086fc06f710f59b2ab1e8b610e39cf..3f3590d168086fc06f710f59b2ab1e8b610e39cf
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d5bf0dc0f43237d36236ce56753d3443667ad9b0..d5bf0dc0f43237d36236ce56753d3443667ad9b0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,625279098253400f8dc0b274a6493f602feadfe4..625279098253400f8dc0b274a6493f602feadfe4
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,07ced0db9fc315a17f14949d4c625bb7feb857b3..07ced0db9fc315a17f14949d4c625bb7feb857b3
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,1b3d4e6ba252caebc0d45866a5c2ab3e2598c464..1b3d4e6ba252caebc0d45866a5c2ab3e2598c464
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,26be9eb23c21d8f0af2bdc081b010af751540f81..26be9eb23c21d8f0af2bdc081b010af751540f81
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,eb6d781d9a2f822ee83d5b1be4cdaedec011584d..eb6d781d9a2f822ee83d5b1be4cdaedec011584d
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,fa3f582c83697feb0503bdd97ac87b8408cbf735..fa3f582c83697feb0503bdd97ac87b8408cbf735
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,2ce420ee436542f517c7561e1ed21d31bb5ecf4e..2ce420ee436542f517c7561e1ed21d31bb5ecf4e
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3fba9c0c95ac7e8e7653b1d52356f2c2b30e58f6..3fba9c0c95ac7e8e7653b1d52356f2c2b30e58f6
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,752d1c2deb9f4581f123b5d311f1ba91fb8e4da3..752d1c2deb9f4581f123b5d311f1ba91fb8e4da3
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3742a2537a8b7c748a1a5f861123b2fa83a688e6..3742a2537a8b7c748a1a5f861123b2fa83a688e6
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,2570955c4842991140fd328612ffb92e1529c5c2..2570955c4842991140fd328612ffb92e1529c5c2
mode 000000,100644..100644
--- /dev/null
--- 2/sk/faq
index 0000000000000000000000000000000000000000,7a31b7f0c69a6005669c7ca3ea36b35873271c1b..7a31b7f0c69a6005669c7ca3ea36b35873271c1b
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3f8a620034b04eb707ff3ce05973362140a04908..3f8a620034b04eb707ff3ce05973362140a04908
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,09feab4209160edb5624e9c47935c0fa564cae90..09feab4209160edb5624e9c47935c0fa564cae90
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,4b95ff669e6526d89e17f8a1d42e65f3153cdfb3..4b95ff669e6526d89e17f8a1d42e65f3153cdfb3
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,30f0706b03aab47526e8243d24a677f6cd3a0767..30f0706b03aab47526e8243d24a677f6cd3a0767
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,4f834336ac4f88be86c6261d4582db5fb05ecbe0..4f834336ac4f88be86c6261d4582db5fb05ecbe0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d63415cd93e6c51c126650abe8cd61a296ef81b7..d63415cd93e6c51c126650abe8cd61a296ef81b7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,696094141b15f48a3c3c9ac5dfc459ed392a26ae..696094141b15f48a3c3c9ac5dfc459ed392a26ae
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b1197d48883529de985f2aa6cc6c5c24bad3d1c2..b1197d48883529de985f2aa6cc6c5c24bad3d1c2
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e94137e6c26928c5679e0dd3e4f87a0a68712030..e94137e6c26928c5679e0dd3e4f87a0a68712030
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9f7c8a3df2e8629021ca930a25e58b2825e94e4b..9f7c8a3df2e8629021ca930a25e58b2825e94e4b
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3b2e8ebbb7d6a4eb3d885ecdc8bf5997d0656adf..3b2e8ebbb7d6a4eb3d885ecdc8bf5997d0656adf
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3d4cabe9bece59ff0abf1fb00c5db3632ca10a19..3d4cabe9bece59ff0abf1fb00c5db3632ca10a19
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9e3e7b506d872bbe2a07284ad88ca5955bb20ea7..9e3e7b506d872bbe2a07284ad88ca5955bb20ea7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,2fc74203a1fcac753c1764e46ae78de27c87e196..2fc74203a1fcac753c1764e46ae78de27c87e196
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,613a48e92e4235dd7794f4ad8ba2175abfc4767a..613a48e92e4235dd7794f4ad8ba2175abfc4767a
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,7ba7cca35d08ff94d510c3a5cc22d054b0a56668..7ba7cca35d08ff94d510c3a5cc22d054b0a56668
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,1a863022581e9380b15e2b2dc0098c3b7717bd73..1a863022581e9380b15e2b2dc0098c3b7717bd73
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,955d199d4ecc7176ccdeabb367872e2500cd68ae..955d199d4ecc7176ccdeabb367872e2500cd68ae
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9e8e343ef746885647d69899fd2cc45e3d54efdf..9e8e343ef746885647d69899fd2cc45e3d54efdf
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,30e1a2e261677338f24700404ccf009b76a36b80..30e1a2e261677338f24700404ccf009b76a36b80
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,df70c032ac5d8ce4f02003faa56e83829d0daa90..df70c032ac5d8ce4f02003faa56e83829d0daa90
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,d2003f14cc402b4e9552fa726043d2c29b0d199a..d2003f14cc402b4e9552fa726043d2c29b0d199a
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,880472ffafbd7d850ee819444c1ccee7314a3fb0..880472ffafbd7d850ee819444c1ccee7314a3fb0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,45cff7c37b99d51c468859c10034e18a9b99ce82..45cff7c37b99d51c468859c10034e18a9b99ce82
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,f1c31e2747badde2028174196f5267caab23e1d7..f1c31e2747badde2028174196f5267caab23e1d7
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,62e22a20808574706ff3ac3a776ef07d06cf3435..62e22a20808574706ff3ac3a776ef07d06cf3435
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,ba6ec1c4ba868794e2bd4cdcda058a5f4cc22bfa..ba6ec1c4ba868794e2bd4cdcda058a5f4cc22bfa
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,8219ec5522a352c25d2ff478c63b021c81e91685..8219ec5522a352c25d2ff478c63b021c81e91685
mode 000000,100644..100644
--- /dev/null
diff --cc src/mlmmj-sub.c
index cc39bc8013cee90ddfe2bba55a1dfa08f7526c2d,0000000000000000000000000000000000000000..66802719fccedf785e62ea4f8bd17017bcdf98ad
mode 100644,000000..100644
--- /dev/null
@@@ -1,509 -1,0 +1,511 @@@
-       if(strncasecmp(ml.addr, address, strlen(ml.addr)) == 0)
 +/* Copyright (C) 2002, 2003 Mads Martin Joergensen <mmj at mmj.dk>
 + *
 + * $Id$
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <string.h>
 +#include <errno.h>
 +#include <syslog.h>
 +#include <sys/types.h>
 +#include <unistd.h>
 +#include <sys/stat.h>
 +#include <fcntl.h>
 +#include <libgen.h>
 +#include <sys/wait.h>
 +#include <ctype.h>
 +#include <err.h>
 +
 +#include "xmalloc.h"
 +#include "mlmmj.h"
 +#include "mlmmj-sub.h"
 +#include "wrappers.h"
 +#include "strgen.h"
 +#include "subscriberfuncs.h"
 +#include "log_error.h"
 +#include "statctrl.h"
 +#include "prepstdreply.h"
 +#include "ctrlvalues.h"
 +#include "chomp.h"
 +#include "utils.h"
 +#include "send_help.h"
 +#include "xstring.h"
 +
 +static char *subtypes[7] = {
 +      "SUB_NORMAL",
 +      "SUB_DIGEST",
 +      "SUB_NOMAIL",
 +      NULL,
 +      NULL,
 +      "SUB_BOTH",
 +      NULL,
 +};
 +
 +static void moderate_sub(struct ml *ml, const char *subaddr,
 +              const char *mlmmjsend, enum subtype typesub,
 +              enum subreason reasonsub)
 +{
 +      int fd, status;
 +      text *txt;
 +      memory_lines_state *mls;
 +      char *a = NULL, *queuefilename, *from;
 +      char *modfilename, *mods, *to, *replyto, *moderators = NULL;
 +      char *cookie, *obstruct;
 +      strlist *submods;
 +      const char *type;
 +      pid_t childpid, pid;
 +      xstring *str = NULL;
 +      int modfd = -1;
 +
 +      type = subtypes[typesub];
 +
 +      for (;;) {
 +              cookie = random_str();
 +              xasprintf(&modfilename, "moderation/subscribe%s", cookie);
 +              fd = openat(ml->fd, modfilename, O_RDWR|O_CREAT|O_EXCL,
 +                  S_IRUSR|S_IWUSR);
 +              if (fd < 0) {
 +                      if (errno == EEXIST) {
 +                              free(cookie);
 +                              free(modfilename);
 +                              continue;
 +                      }
 +                      log_error(LOG_ARGS, "could not create %s"
 +                                      "ignoring request for: %s", subaddr);
 +                      exit(EXIT_FAILURE);
 +              }
 +              break;
 +      }
 +
 +      if (dprintf(fd, "%s\n%s\n", subaddr, type) < 0) {
 +              log_error(LOG_ARGS, "could not write to %s"
 +                              "ignoring request for: %s", subaddr);
 +              exit(EXIT_FAILURE);
 +      }
 +      close(fd);
 +
 +      submods = ctrlvalues(ml->ctrlfd, "submod");
 +      if (submods == NULL)
 +              return;
 +      /* check to see if there's adresses in the submod control file */
 +      tll_foreach(*submods, it)
 +              a = strchr(it->item, '@');
 +
 +      /* no addresses in submod control file, use owner */
 +      if(a == NULL) {
 +              /* free the submods struct from above */
 +              tll_free_and_free(*submods, free);
 +              free(submods);
 +              submods = ctrlvalues(ml->ctrlfd, "owner");
 +              modfd = openat(ml->ctrlfd, "owner", O_RDONLY);
 +      }
 +      if (modfd == -1)
 +              modfd = openat(ml->ctrlfd, "submod", O_RDONLY);
 +
 +      gen_addr(from, ml, "owner");
 +      xasprintf(&to, "%s-moderators@%s", ml->name, ml->fqdn);
 +      gen_addr_cookie(replyto, ml, "permit-", cookie);
 +      gen_addr_cookie(obstruct, ml, "obstruct-", cookie);
 +      free(cookie);
 +      tll_foreach(*submods, sm) {
 +              if (str == NULL)
 +                      str = xstring_new();
 +              fprintf(str->fp, "%s\n", sm->item);
 +      }
 +      moderators = xstring_get(str);
 +      mls = init_memory_lines(moderators);
 +      free(moderators);
 +
 +      txt = open_text(ml->fd,
 +                      "gatekeep", "sub",
 +                      subreason_strs[reasonsub], subtype_strs[typesub],
 +                      "submod-moderator");
 +      MY_ASSERT(txt);
 +      register_default_unformatted(txt, ml);
 +      register_unformatted(txt, "subaddr", subaddr);
 +      register_unformatted(txt, "moderateaddr", replyto); /* DEPRECATED */
 +      register_unformatted(txt, "permitaddr", replyto);
 +      register_unformatted(txt, "obstructaddr", obstruct);
 +      register_unformatted(txt, "moderators", "%gatekeepers%"); /* DEPRECATED */
 +      register_formatted(txt, "gatekeepers",
 +                      rewind_memory_lines, get_memory_line, mls);
 +      queuefilename = prepstdreply(txt, ml, "$listowner$", to, replyto);
 +      MY_ASSERT(queuefilename);
 +      close_text(txt);
 +      
 +      /* we might need to exec more than one mlmmj-send */
 +
 +      if (statctrl(ml->ctrlfd, "nosubmodmails"))
 +              childpid = -1;
 +      else {
 +              childpid = fork();
 +              if(childpid < 0)
 +                      log_error(LOG_ARGS, "Could not fork; requester not notified");
 +      }
 +
 +      if(childpid != 0) {
 +              if(childpid > 0) {
 +                      do /* Parent waits for the child */
 +                              pid = waitpid(childpid, &status, 0);
 +                      while(pid == -1 && errno == EINTR);
 +              }
 +              finish_memory_lines(mls);
 +              xasprintf(&mods, "%d", modfd);
 +              execl(mlmmjsend, mlmmjsend,
 +                              "-a",
 +                              "-l", "4",
 +                              "-L", ml->dir,
 +                              "-s", mods,
 +                              "-F", from,
 +                              "-R", replyto,
 +                              "-m", queuefilename, (char *)NULL);
 +              log_error(LOG_ARGS, "execl() of '%s' failed", mlmmjsend);
 +              exit(EXIT_FAILURE);
 +      }
 +
 +      free(to);
 +      free(replyto);
 +      
 +      /* send mail to requester that the list is submod'ed */
 +
 +      txt = open_text(ml->fd,
 +                      "wait", "sub",
 +                      subreason_strs[reasonsub], subtype_strs[typesub],
 +                      "submod-requester");
 +      MY_ASSERT(txt);
 +      register_default_unformatted(txt, ml);
 +      register_unformatted(txt, "subaddr", subaddr);
 +      register_unformatted(txt, "moderators", "%gatekeepers"); /* DEPRECATED */
 +      register_formatted(txt, "gatekeepers",
 +                      rewind_memory_lines, get_memory_line, mls);
 +      queuefilename = prepstdreply(txt, ml, "$listowner$", subaddr, NULL);
 +      MY_ASSERT(queuefilename);
 +      close_text(txt);
 +
 +      finish_memory_lines(mls);
 +      send_help(ml, queuefilename, subaddr);
 +}
 +
 +void getaddrandtype(struct ml *ml, const char *modstr,
 +              char **addrptr, enum subtype *subtypeptr)
 +{
 +      int fd;
 +      char *readaddr, *readtype, *modfilename, *line = NULL;
 +      FILE *f;
 +      size_t linecap = 0;
 +
 +      if (strncmp(modstr, "subscribe", 9) == 0)
 +                      modstr += 9;
 +
 +      xasprintf(&modfilename, "moderation/subscribe%s", modstr);
 +
 +      fd = openat(ml->fd, modfilename, O_RDONLY);
 +      if(fd < 0) {
 +              log_error(LOG_ARGS, "Could not open %s/%s", ml->dir, modfilename);
 +              exit(EXIT_FAILURE);
 +      }
 +      f = fdopen(fd, "r");
 +
 +      if (getline(&line, &linecap, f) <= 0) {
 +              log_error(LOG_ARGS, "Could not parse %s/%s", ml->dir, modfilename);
 +              exit(EXIT_FAILURE);
 +      }
 +      chomp(line);
 +      readaddr = xstrdup(line);
 +      if (getline(&line, &linecap, f) <= 0) {
 +              log_error(LOG_ARGS, "Could not parse %s/%s", ml->dir, modfilename);
 +              exit(EXIT_FAILURE);
 +      }
 +      chomp(line);
 +      readtype = xstrdup(line);
 +      fclose(f);
 +
 +      *addrptr = readaddr;
 +
 +      for (size_t i = 0; i < NELEM(subtypes); i++) {
 +              if (subtypes[i] == NULL)
 +                      continue;
 +              if (strcmp(subtypes[i], readtype) == 0) {
 +                      *subtypeptr = i;
 +                      goto freedone;
 +              }
 +      }
 +
 +      log_error(LOG_ARGS, "Type %s not valid in %s/%s", readtype,
 +          ml->dir, modfilename);
 +
 +freedone:
 +      free(readtype);
 +      unlinkat(ml->fd, modfilename, 0);
 +      free(modfilename);
 +}
 +
 +static void print_help(const char *prg)
 +{
 +      printf("Usage: %s -L /path/to/list {-a john@doe.org | -m str}\n"
 +             "       [-c] [-C] [-f] [-h] [-L] [-d | -n] [-q] [-r | -R] [-s] [-U] [-V]\n"
 +             " -a: Email address to subscribe \n"
 +             " -c: Send welcome mail (unless requesting confirmation)\n"
 +             " -C: Request mail confirmation (unless switching versions)\n"
 +             " -d: Subscribe to digest of list\n"
 +             " -f: Force subscription (do not moderate)\n"
 +             " -h: This help\n"
 +             " -L: Full path to list directory\n"
 +             " -m: moderation string\n"
 +             " -n: Subscribe to no mail version of list\n", prg);
 +      printf(" -q: Be quiet (don't notify owner about the subscription)\n"
 +             " -r: Behave as if request arrived via email (internal use)\n"
 +             " -R: Behave as if confirmation arrived via email (internal use)\n"
 +             " -s: Don't send a mail to subscriber if already subscribed\n"
 +             " -U: Don't switch to the user id of the listdir owner\n"
 +             " -V: Print version\n"
 +             "To ensure a silent subscription, use -f -q -s\n");
 +      exit(EXIT_SUCCESS);
 +}
 +
 +static void subscribe_type(int listfd, char *address, enum subtype typesub) {
 +      int dirfd;;
 +      char chstr[2];
 +      const char *subdir;
 +      int groupwritable = 0, subfilefd;
 +      struct stat st;
 +
 +      dirfd = open_subscriber_directory(listfd, typesub, &subdir);
 +      if (dirfd == -1)
 +              err(EXIT_FAILURE, "cannot open(%s)", subdir);
 +      if (fstat(dirfd, &st) == 0) {
 +              if(st.st_mode & S_IWGRP) {
 +                      groupwritable = S_IRGRP|S_IWGRP;
 +                      umask(S_IWOTH);
 +                      setgid(st.st_gid);
 +              }
 +      }
 +
 +      chstr[0] = address[0];
 +      chstr[1] = '\0';
 +
 +      subfilefd = openat(dirfd, chstr, O_RDWR|O_CREAT|O_APPEND,
 +                              S_IRUSR|S_IWUSR|groupwritable);
 +      if(subfilefd == -1 && !lock(subfilefd, true)) {
 +              log_error(LOG_ARGS, "Could not open '%s/%s'", subdir, chstr);
 +              exit(EXIT_FAILURE);
 +      }
 +
 +      dprintf(subfilefd, "%s\n", address);
 +      close(dirfd);
 +      close(subfilefd);
 +}
 +
 +int main(int argc, char **argv)
 +{
 +      char *mlmmjsend, *bindir;
 +      char *address = NULL, *modstr = NULL;
 +      bool send_welcome_mail = false;
 +      int opt;
 +      bool subconfirm = false, notifysub;
 +      bool changeuid = true, digest = false, nomail = false, both = false;
 +      bool nogensubscribed = false;
 +      bool force = false, quiet = false;
 +      enum subtype subbed;
 +      struct stat st;
 +      uid_t uid;
 +      enum subtype typesub = SUB_NORMAL;
 +      enum subreason reasonsub = SUB_ADMIN;
 +      struct ml ml;
 +
 +      ml_init(&ml);
 +      CHECKFULLPATH(argv[0]);
 +
 +      log_set_name(argv[0]);
 +
 +      bindir = mydirname(argv[0]);
 +      xasprintf(&mlmmjsend, "%s/mlmmj-send", bindir);
 +      free(bindir);
 +
 +      while ((opt = getopt(argc, argv, "hbcCdfm:nsVUL:a:qrR")) != -1) {
 +              switch(opt) {
 +              case 'a':
 +                      if (strchr(optarg, '@') == NULL)
 +                              errx(EXIT_FAILURE, "No '@' in the provided email address '%s'",
 +                                  optarg);
 +                      address = optarg;
 +                      break;
 +              case 'b':
 +                      both = true;
 +                      break;
 +              case 'c':
 +                      send_welcome_mail = true;
 +                      break;
 +              case 'C':
 +                      subconfirm = true;
 +                      break;
 +              case 'd':
 +                      digest = true;
 +                      break;
 +              case 'f':
 +                      force = true;
 +                      break;
 +              case 'h':
 +                      print_help(argv[0]);
 +                      break;
 +              case 'L':
 +                      ml.dir = optarg;
 +                      break;
 +              case 'm':
 +                      modstr = optarg;
 +                      break;
 +              case 'n':
 +                      nomail = true;
 +                      break;
 +              case 'q':
 +                      quiet = true;
 +                      break;
 +              case 'r':
 +                      reasonsub = SUB_REQUEST;
 +                      break;
 +              case 'R':
 +                      reasonsub = SUB_CONFIRM;
 +                      break;
 +              case 's':
 +                      nogensubscribed = true;
 +                      break;
 +              case 'U':
 +                      changeuid = false;
 +                      break;
 +              case 'V':
 +                      print_version(argv[0]);
 +                      exit(0);
 +              }
 +      }
 +
 +      if(ml.dir == NULL) {
 +              errx(EXIT_FAILURE, "You have to specify -L\n"
 +                  "%s -h for help", argv[0]);
 +      }
 +      if (!ml_open(&ml, false))
 +              exit(EXIT_FAILURE);
 +
 +      if(address == NULL && modstr == NULL) {
 +              errx(EXIT_FAILURE, "You have to specify -a or -m\n"
 +                  "%s -h for help", argv[0]);
 +      }
 +
 +      if(both + digest + nomail > 1) {
 +              errx(EXIT_FAILURE, "Specify at most one of -b, -d and -n\n"
 +                  "%s -h for help", argv[0]);
 +      }
 +
 +      if(digest)
 +              typesub = SUB_DIGEST;
 +      if(nomail)
 +              typesub = SUB_NOMAIL;
 +      if(both)
 +              typesub = SUB_BOTH;
 +
 +      if(reasonsub == SUB_CONFIRM && subconfirm) {
 +              errx(EXIT_FAILURE, "Cannot specify both -C and -R\n"
 +                  "%s -h for help", argv[0]);
 +      }
 +
 +      if(modstr) {
 +              getaddrandtype(&ml, modstr, &address, &typesub);
 +              reasonsub = SUB_PERMIT;
 +      }
 +
 +      /* Make the address lowercase */
 +      address = lowercase(address);
 +
++      if(strncasecmp(ml.addr, address, strlen(ml.addr)) == 0) {
++              free(address);
 +              errx(EXIT_FAILURE, "Cannot subscribe the list address to the list");
++      }
 +
 +      if(changeuid) {
 +              uid = getuid();
 +              if(!uid && fstat(ml.fd, &st) == 0 && uid != st.st_uid) {
 +                      printf("Changing to uid %d, owner of %s.\n",
 +                                      (int)st.st_uid, ml.dir);
 +                      if(setuid(st.st_uid) < 0) {
 +                              perror("setuid");
 +                              fprintf(stderr, "Continuing as uid %d\n",
 +                                  (int)uid);
 +                      }
 +              }
 +      }
 +
 +      subbed = is_subbed(ml.fd, address, 1);
 +
 +      if(subbed == typesub) {
 +              if(!nogensubscribed)
 +                      generate_subscription(&ml, address, typesub, true);
 +              return EXIT_SUCCESS;
 +      } else if(subbed != SUB_NONE) {
 +              reasonsub = SUB_SWITCH;
 +              /* If we want to subscribe to both, we can just subscribe the
 +               * missing version, so don't unsub. */
 +              if (!(typesub == SUB_BOTH &&
 +                              subbed != SUB_NOMAIL)) {
 +                      enum subtype ts = SUB_ALL;
 +                      if (subbed == SUB_BOTH) {
 +                              if (typesub == SUB_NORMAL) ts = SUB_DIGEST;
 +                              if (typesub == SUB_DIGEST) ts = SUB_NORMAL;
 +                      }
 +                      if (!unsubscribe(ml.fd, address, ts))
 +                              log_error(LOG_ARGS, "not unsubscribed from "
 +                                  "current version");
 +              }
 +      }
 +
 +      if(subbed == SUB_NONE && subconfirm)
 +              generate_subconfirm(&ml, address, typesub, reasonsub, true);
 +
 +      if(modstr == NULL && subbed == SUB_NONE && !force &&
 +                      statctrl(ml.ctrlfd, "submod")) {
 +              moderate_sub(&ml, address, mlmmjsend, typesub, reasonsub);
 +      }
 +
 +      if (typesub == SUB_BOTH) {
 +              if (subbed != SUB_NORMAL) {
 +                      subscribe_type(ml.fd, address, SUB_NORMAL);
 +              }
 +              if (subbed != SUB_DIGEST) {
 +                      subscribe_type(ml.fd, address, SUB_DIGEST);
 +              }
 +      } else if (!(subbed == SUB_BOTH && typesub != SUB_NOMAIL)) {
 +              subscribe_type(ml.fd, address, typesub);
 +      }
 +
 +      if(send_welcome_mail)
 +              send_confirmation_mail(&ml, address, typesub, reasonsub, true);
 +
 +      notifysub = !quiet && reasonsub != SUB_SWITCH &&
 +                      statctrl(ml.ctrlfd, "notifysub");
 +
 +      /* Notify list owner about subscription */
 +      if (notifysub)
 +              notify_sub(&ml, address, typesub, reasonsub, true);
 +
 +      free(address);
 +      free(mlmmjsend);
 +
 +      return EXIT_SUCCESS;
 +}
diff --cc src/send_mail.c
index d88df0e2e4615ab19ab354ab5c671e90c4c71691,0000000000000000000000000000000000000000..4b26e897624d83791af6e46aedaa836c2b531d21
mode 100644,000000..100644
--- /dev/null
@@@ -1,518 -1,0 +1,520 @@@
 +/*
 + * Copyright (C) 2004, 2003, 2004 Mads Martin Joergensen <mmj at mmj.dk>
 + * Copyright (C) 2022-2023 Baptiste Daroussin <bapt@FreeBSD.org>
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining a copy
 + * of this software and associated documentation files (the "Software"), to
 + * deal in the Software without restriction, including without limitation the
 + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 + * sell copies of the Software, and to permit persons to whom the Software is
 + * furnished to do so, subject to the following conditions:
 + *
 + * The above copyright notice and this permission notice shall be included in
 + * all copies or substantial portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 + * IN THE SOFTWARE.
 + */
 +
 +#include <sys/stat.h>
 +
 +#include <stdio.h>
 +#include <unistd.h>
 +#include <fcntl.h>
 +
 +#include "checkwait_smtpreply.h"
 +#include "mail-functions.h"
 +#include "getlistdelim.h"
 +#include "send_mail.h"
 +#include "log_error.h"
 +#include "init_sockfd.h"
 +#include "mlmmj.h"
 +#include "strgen.h"
 +#include "tllist.h"
 +#include "xmalloc.h"
 +#include "ctrlvalue.h"
 +#include "utils.h"
 +
 +int
 +initsmtp(int *sockfd, const char *relayhost, unsigned short port, const char *heloname)
 +{
 +      int retval = 0;
 +      int try_ehlo = 1;
 +      char *reply = NULL;
 +
 +      do {
 +              init_sockfd(sockfd, relayhost, port);
 +
 +              if(*sockfd == -1) {
 +                      retval = EBADF;
 +                      break;
 +              }
 +
 +              if((reply = checkwait_smtpreply(*sockfd, MLMMJ_CONNECT)) != NULL) {
 +                      log_error(LOG_ARGS, "No proper greeting to our connect"
 +                                      "Reply: [%s]", reply);
 +                      free(reply);
 +                      retval = MLMMJ_CONNECT;
 +                      /* FIXME: Queue etc. */
 +                      break;
 +              }
 +
 +              if (try_ehlo) {
 +                      write_ehlo(*sockfd, heloname);
 +                      if((reply = checkwait_smtpreply(*sockfd, MLMMJ_EHLO))
 +                                      == NULL) {
 +                              /* EHLO successful don't try more */
 +                              break;
 +                      }
 +
 +                      /* RFC 1869 - 4.5. - In the case of any error response,
 +                       * the client SMTP should issue either the HELO or QUIT
 +                       * command.
 +                       * RFC 1869 - 4.5. - If the server SMTP recognizes the
 +                       * EHLO command, but the command argument is
 +                       * unacceptable, it will return code 501.
 +                       */
 +                      if (strncmp(reply, "501", 3) == 0) {
 +                              free(reply);
 +                              /* Commmand unacceptable; we choose to QUIT but
 +                               * ignore any QUIT errors; return that EHLO was
 +                               * the error.
 +                               */
 +                              endsmtp(sockfd);
 +                              retval = MLMMJ_EHLO;
 +                              break;
 +                      }
 +
 +                      /* RFC 1869 - 4.6. - A server SMTP that conforms to RFC
 +                       * 821 but does not support the extensions specified
 +                       * here will not recognize the EHLO command and will
 +                       * consequently return code 500, as specified in RFC
 +                       * 821.  The server SMTP should stay in the same state
 +                       * after returning this code (see section 4.1.1 of RFC
 +                       * 821).  The client SMTP may then issue either a HELO
 +                       * or a QUIT command.
 +                       */
 +
 +                      if (reply[0] != '5') {
 +                              free(reply);
 +                              /* Server doesn't understand EHLO, but gives a
 +                               * broken response. Try with new connection.
 +                               */
 +                              endsmtp(sockfd);
 +                              try_ehlo = 0;
 +                              continue;
 +                      }
 +
 +                      free(reply);
 +
 +                      /* RFC 1869 - 4.7. - Other improperly-implemented
 +                       * servers will not accept a HELO command after EHLO has
 +                       * been sent and rejected.  In some cases, this problem
 +                       * can be worked around by sending a RSET after the
 +                       * failure response to EHLO, then sending the HELO.
 +                       */
 +                      write_rset(*sockfd);
 +                      reply = checkwait_smtpreply(*sockfd, MLMMJ_RSET);
 +
 +                      /* RFC 1869 - 4.7. - Clients that do this should be
 +                       * aware that many implementations will return a failure
 +                       * code (e.g., 503 Bad sequence of commands) in response
 +                       * to the RSET. This code can be safely ignored.
 +                       */
 +                      free(reply);
 +
 +                      /* Try HELO on the same connection
 +                       */
 +              }
 +
 +              write_helo(*sockfd, heloname);
 +              if((reply = checkwait_smtpreply(*sockfd, MLMMJ_HELO))
 +                              == NULL) {
 +                      /* EHLO successful don't try more */
 +                      break;
 +              }
 +              if (try_ehlo) {
 +                      free(reply);
 +                      /* We reused a connection we tried EHLO on. Maybe
 +                       * that's why it failed. Try with new connection.
 +                       */
 +                      endsmtp(sockfd);
 +                      try_ehlo = 0;
 +                      continue;
 +              }
 +
 +              log_error(LOG_ARGS, "Error with HELO. Reply: "
 +                              "[%s]", reply);
 +              free(reply);
 +              /* FIXME: quit and tell admin to configure
 +               * correctly */
 +              retval = MLMMJ_HELO;
 +              break;
 +
 +      } while (1);
 +
 +      return retval;
 +}
 +
 +int
 +endsmtp(int *sockfd)
 +{
 +      int retval = 0;
 +      char *reply = NULL;
 +
 +      if(*sockfd == -1)
 +              return retval;
 +      
 +      write_quit(*sockfd);
 +      reply = checkwait_smtpreply(*sockfd, MLMMJ_QUIT);
 +      if(reply) {
 +              log_error(LOG_ARGS, "Mailserver would not let us QUIT. "
 +                        "We close the socket anyway though. "
 +                        "Mailserver reply = [%s]", reply);
 +              free(reply);
 +              retval = MLMMJ_QUIT;
 +      }
 +
 +      close(*sockfd);
 +      *sockfd = -1;
 +
 +      return retval;
 +}
 +
 +int do_bouncemail(int listfd, int ctrlfd, const char *from)
 +{
 +      /* expected format for the from: "something+anything-<number>-anything@anything" */
 +      char *tofree;
 +      char *myfrom = xstrdup(from);
 +      char *listdelim = getlistdelim(ctrlfd);
 +      char *addr, *num, *c;
 +
 +      tofree = myfrom;
 +      if((c = strchr(myfrom, '@')) == NULL) {
 +              free(myfrom);
 +              free(listdelim);
 +              return 0; /* Success when malformed 'from' */
 +      }
 +      *c = '\0';
 +      num = strrchr(myfrom, '-');
 +      if (num == NULL) {
 +              free(tofree);
 +              return (0); /* Success when malformed 'from' */
 +      }
 +      num++;
 +      c = strstr(myfrom, listdelim);
 +      if (c == NULL) {
 +              free(tofree);
 +              return (0); /* Success when malformed 'from' */
 +      }
 +      myfrom = strchr(c, '-'); /* malformed entry with delimiter after the -num */
 +      if (myfrom == NULL) {
 +              free(tofree);
 +              return (0);
 +      }
 +      myfrom++;
 +      if (num <= myfrom) {
 +              free(tofree);
 +              return (0); /* Success when malformed 'from' */
 +      }
 +      addr = xstrndup(myfrom, num - myfrom - 1);
 +      free(listdelim);
 +
 +      bouncemail(listfd, num, addr);
++      free(tofree);
++      free(addr);
 +      return 1;
 +}
 +
 +int
 +send_mail(int sockfd, struct mail *mail, int listfd, int ctrlfd, bool bounce)
 +{
 +      int retval = 0;
 +      char *reply, *reply2;
 +
 +      if(sockfd == -1)
 +              return EBADF;
 +
 +      if (mail->to == NULL) {
 +              errno = 0;
 +              log_error(LOG_ARGS, "No 'to' address, ignoring");
 +              return (0);
 +      }
 +
 +      if(strchr(mail->to, '@') == NULL) {
 +              errno = 0;
 +              log_error(LOG_ARGS, "No @ in address, ignoring %s",
 +                  mail->to);
 +              return 0;
 +      }
 +
 +      if (mail->from == NULL) {
 +              errno = 0;
 +              log_error(LOG_ARGS, "No from address, ignoring");
 +              return 0;
 +      }
 +
 +      if (mail->fp == NULL) {
 +              errno = 0;
 +              log_error(LOG_ARGS, "No mail to send, ignoring");
 +              return 0;
 +      }
 +      rewind(mail->fp);
 +
 +      retval = write_mail_from(sockfd, mail->from, "");
 +      if(retval) {
 +              log_error(LOG_ARGS, "Could not write MAIL FROM\n");
 +              return retval;
 +      }
 +      reply = checkwait_smtpreply(sockfd, MLMMJ_FROM);
 +      if(reply) {
 +              log_error(LOG_ARGS, "Error in MAIL FROM. Reply = [%s]",
 +                              reply);
 +              free(reply);
 +              write_rset(sockfd);
 +              reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET);
 +              if (reply2 != NULL) free(reply2);
 +              return MLMMJ_FROM;
 +      }
 +      retval = write_rcpt_to(sockfd, mail->to);
 +      if(retval) {
 +              log_error(LOG_ARGS, "Could not write RCPT TO:\n");
 +              return retval;
 +      }
 +
 +      reply = checkwait_smtpreply(sockfd, MLMMJ_RCPTTO);
 +      if(reply) {
 +              write_rset(sockfd);
 +              reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET);
 +              if (reply2 != NULL) free(reply2);
 +              if(bounce && ((reply[0] == '4') || (reply[0] == '5'))
 +                              && (reply[1] == '5')) {
 +                      free(reply);
 +                      return do_bouncemail(listfd, ctrlfd, mail->from);
 +              } else {
 +                      log_error(LOG_ARGS, "Error in RCPT TO. Reply = [%s]",
 +                                      reply);
 +                      free(reply);
 +                      return MLMMJ_RCPTTO;
 +              }
 +      }
 +
 +      retval = write_data(sockfd);
 +      if(retval) {
 +              log_error(LOG_ARGS, "Could not write DATA\b");
 +              return retval;
 +      }
 +
 +      reply = checkwait_smtpreply(sockfd, MLMMJ_DATA);
 +      if(reply) {
 +              log_error(LOG_ARGS, "Error with DATA. Reply = [%s]", reply);
 +              free(reply);
 +              write_rset(sockfd);
 +              reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET);
 +              if (reply2 != NULL) free(reply2);
 +              return MLMMJ_DATA;
 +      }
 +
 +      if(mail->replyto) {
 +              retval = write_replyto(sockfd, mail->replyto);
 +              if(retval) {
 +                      log_error(LOG_ARGS, "Could not write reply-to addr.\n");
 +                      return retval;
 +              }
 +      }
 +
 +      write_mailbody(sockfd, mail->fp, mail->addtohdr ? mail->to : NULL);
 +
 +      retval = write_dot(sockfd);
 +      if(retval) {
 +              log_error(LOG_ARGS, "Could not write <CR><LF>.<CR><LF>\n");
 +              return retval;
 +      }
 +
 +      reply = checkwait_smtpreply(sockfd, MLMMJ_DOT);
 +      if(reply) {
 +              log_error(LOG_ARGS, "Mailserver did not ack end of mail.\n"
 +                              "<CR><LF>.<CR><LF> was written, to no"
 +                              "avail. Reply = [%s]", reply);
 +              free(reply);
 +              write_rset(sockfd);
 +              reply2 = checkwait_smtpreply(sockfd, MLMMJ_RSET);
 +              if (reply2 != NULL) free(reply2);
 +              return MLMMJ_DOT;
 +      }
 +
 +      return 0;
 +}
 +
 +int
 +newsmtp(struct ml *ml)
 +{
 +      int sockfd;
 +      char *relayhost, *smtphelo;
 +      unsigned short smtpport = ctrlushort(ml->ctrlfd, "smtpport", 25);
 +
 +      relayhost = ctrlvalue(ml->ctrlfd, "relayhost");
 +      if (relayhost == NULL)
 +              relayhost = xstrdup(RELAYHOST);
 +      smtphelo = ctrlvalue(ml->ctrlfd, "smtphelo");
 +      if (smtphelo == NULL)
 +              smtphelo = hostnamestr();
 +      if (initsmtp(&sockfd, relayhost, smtpport, smtphelo) != 0)
 +              return (-1);
 +      return (sockfd);
 +}
 +
 +static bool
 +save_file(const char *name, const char *ext, const char *content)
 +{
 +      char *tmpstr;
 +      int fd;
 +
 +      xasprintf(&tmpstr, "%s.%s", name, ext);
 +      fd = open(tmpstr, O_WRONLY|O_CREAT|O_EXCL|O_SYNC, S_IRUSR|S_IWUSR);
 +      if (fd == -1) {
 +              free(tmpstr);
 +              return (false);
 +      }
 +      dprintf(fd, "%s", content);
 +      close(fd);
 +      free(tmpstr);
 +      return (true);
 +}
 +
 +void
 +save_queue(const char *queuefilename, struct mail *mail)
 +{
 +      if (!save_file(queuefilename, "mailfrom", mail->from))
 +              return;
 +      if (!save_file(queuefilename, "reciptto", mail->to))
 +              return;
 +      if (mail->replyto != NULL)
 +              save_file(queuefilename, "reply-to", mail->replyto);
 +}
 +
 +bool
 +send_single_mail(struct mail *mail, struct ml *ml, bool bounce)
 +{
 +      int sockfd;
 +
 +      sockfd = newsmtp(ml);
 +      if (sockfd == -1)
 +              return (false);
 +      if (send_mail(sockfd, mail, ml->fd, ml->ctrlfd, bounce)) {
 +              endsmtp(&sockfd);
 +              return (false);
 +      }
 +      endsmtp(&sockfd);
 +      return (true);
 +}
 +
 +bool
 +requeuemail(int listfd, int index, strlist *addrs, const char *addr)
 +{
 +      int addrfd, dfd;
 +      char *dirname;
 +
 +      if (addrs == NULL || tll_length(*addrs) == 0)
 +              return (false);
 +      xasprintf(&dirname, "requeue/%d", index);
 +      if(mkdirat(listfd, dirname, 0750) < 0 && errno != EEXIST) {
 +              log_error(LOG_ARGS, "Could not mkdir(%s) for "
 +                              "requeueing. Mail cannot "
 +                              "be requeued.", dirname);
 +              free(dirname);
 +              return (false);
 +      }
 +      dfd = openat(listfd, dirname, O_DIRECTORY);
 +      addrfd = openat(dfd, "subscribers", O_WRONLY|O_CREAT|O_APPEND,
 +                      S_IRUSR|S_IWUSR);
 +      if(addrfd < 0) {
 +              log_error(LOG_ARGS, "Could not open %s/subscribers",
 +                  dirname);
 +              free(dirname);
 +              close(dfd);
 +              return (false);
 +      }
 +      free(dirname);
 +      close(dfd);
 +      /* Dump the remaining addresses. We dump the remaining before
 +       * we write the failing address to ensure the potential good
 +       * ones will be tried first when mlmmj-maintd sends out mails
 +       * that have been requeued. addrcount was so far we were */
 +      tll_foreach(*addrs, it) {
 +              dprintf(addrfd, "%s\n", it->item);
 +      }
 +      if (addr != NULL)
 +              dprintf(addrfd, "%s\n", addr);
 +      close(addrfd);
 +
 +      return (true);
 +}
 +
 +char *
 +get_bounce_from_adr(const char *recipient, struct ml *ml, int index)
 +{
 +      char *bounceaddr, *myrecipient;
 +      char *a = NULL;
 +      char *staticbounceaddr, *staticbounceaddr_localpart = NULL;
 +      const char *staticbounceaddr_domain = NULL;
 +
 +      myrecipient = xstrdup(recipient);
 +      a = strchr(myrecipient, '@');
 +      if (a)
 +              *a = '=';
 +
 +      staticbounceaddr = ctrlvalue(ml->ctrlfd, "staticbounceaddr");
 +      if (staticbounceaddr) {
 +              staticbounceaddr_localpart = genlistname(staticbounceaddr);
 +              staticbounceaddr_domain = genlistfqdn(staticbounceaddr);
 +      }
 +
 +      if (staticbounceaddr) {
 +              xasprintf(&bounceaddr, "%s%s%s-bounces-%d-%s@%s",
 +                      staticbounceaddr_localpart, ml->delim, ml->name,
 +                      index, myrecipient, staticbounceaddr_domain);
 +
 +              free(staticbounceaddr);
 +              free(staticbounceaddr_localpart);
 +      } else {
 +              xasprintf(&bounceaddr, "%s%sbounces-%d-%s@%s", ml->name,
 +                  ml->delim, index, myrecipient, ml->fqdn);
 +      }
 +
 +      free(myrecipient);
 +
 +      return bounceaddr;
 +}
 +
 +int
 +get_index_from_filename(const char *filename)
 +{
 +      char *myfilename, *indexstr;
 +      int ret;
 +      size_t len;
 +
 +      myfilename = xstrdup(filename);
 +      len = strlen(myfilename);
 +      if (len > 9 && (strcmp(myfilename + len - 9, "/mailfile") == 0)) {
 +              myfilename[len - 9] = '\0';
 +      }
 +
 +      indexstr = strrchr(myfilename, '/');
 +      if (indexstr) {
 +              indexstr++;  /* skip the slash */
 +      } else {
 +              indexstr = myfilename;
 +      }
 +
 +      ret = strtoim(indexstr, 0, INT_MAX, NULL);
 +      free(myfilename);
 +
 +      return ret;
 +}
 +