+1.2.9
+ o Make recipient delimiter configurable per list. SIC! (Joel Aelwyn)
o Use is_subbed_in instead of find_subscriber when subscribing people
(Christian Laursen)
o Make it possible to confirm subscription even though it's a closedlist.
dist-hook:
rm -rf `find $(distdir)/ -name CVS`
-man1_MANS = man/mlmmj-bounce.1 man/mlmmj-make-ml.1 man/mlmmj-recieve.1 \
+man1_MANS = man/mlmmj-bounce.1 man/mlmmj-make-ml.sh.1 man/mlmmj-recieve.1 \
man/mlmmj-sub.1 man/mlmmj-maintd.1 man/mlmmj-process.1 \
man/mlmmj-send.1 man/mlmmj-unsub.1 man/mlmmj-list.1
In this file a port other than port 25 for connecting to the relayhost
can be specified.
+
+ ยท delimiter (normal)
+
+ This specifies what to use as recipient delimiter for the list.
+ Default is "+".
-# generated automatically by aclocal 1.9.5 -*- Autoconf -*-
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005 Free Software Foundation, Inc.
# Call AM_AUTOMAKE_VERSION so it can be traced.
# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
- [AM_AUTOMAKE_VERSION([1.9.5])])
+ [AM_AUTOMAKE_VERSION([1.9.6])])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
-scriptversion=2005-02-09.22
+scriptversion=2005-07-09.11
# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
done
"$@" -E |
- sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
sed '$ s: \\$::' > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
--- /dev/null
+/* Copyright 2005 Joel Aelwyn <joel@lightbearer.com>
+ *
+ * $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.
+ */
+
+#ifndef GETLISTDELIM_H
+#define GETLISTDELIM_H
+
+char *getlistdelim(const char *listdir);
+
+#endif /* GETLISTDELIM_H */
size_t bodylen);
int send_mail_many_fd(int sockfd, const char *from, const char *replyto,
char *mailmap, size_t mailsize, int subfd,
- const char *listaddr, const char *archivefilename,
- const char *listdir, const char *mlmmjbounce,
- const char *hdrs, size_t hdrslen, const char *body,
- size_t bodylen);
+ const char *listaddr, const char *listdelim,
+ const char *archivefilename, const char *listdir,
+ const char *mlmmjbounce, const char *hdrs, size_t hdrslen,
+ const char *body, size_t bodylen);
int send_mail_many_list(int sockfd, const char *from, const char *replyto,
char *mailmap, size_t mailsize, struct strlist *addrs,
- const char *listaddr, const char *archivefilename,
- const char *listdir, const char *mlmmjbounce,
- const char *hdrs, size_t hdrslen, const char *body,
- size_t bodylen);
+ const char *listaddr, const char *listdelim,
+ const char *archivefilename, const char *listdir,
+ const char *mlmmjbounce, const char *hdrs, size_t hdrslen,
+ const char *body, size_t bodylen);
int send_mail_verp(int sockfd, struct strlist *addrs, char *mailmap,
size_t mailsize, const char *from, const char *listdir,
const char *hdrs, size_t hdrslen, const char *body,
#include <mlmmj.h>
void confirm_sub(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub);
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub);
void generate_subconfirm(const char *listdir, const char *listadr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub);
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub);
#endif /* MLMMJ_SUBSCRIBE_H */
#include <sys/types.h>
void confirm_unsub(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmj,
- enum subtype typesub);
+ const char *listdelim, const char *subaddr,
+ const char *mlmmj, enum subtype typesub);
ssize_t unsubscribe(int subreadfd, int subwritefd, const char *address);
void generate_unsubconfirm(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub);
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub);
#endif /* MLMMJ_UNSUBSCRIBE_H */
#define RELAYHOST "127.0.0.1"
#define READ_BUFSIZE 2048
-#define RECIPDELIM '+' /* XXX Warning: not changable at the moment */
+#define DEFAULT_RECIPDELIM "+" /* Default recipient delimiter */
#define MODREQLIFE 604800 /* How long time will moderation requests be kept?
* 604800s is 7 days */
#define DISCARDEDLIFE 604800 /* How long time will discarded mails be kept?
#ifndef PREPSTDREPLY_H
#define PREPSTDREPLY_H
-char *substitute(const char *line, const char *listaddr, size_t datacount,
- char **data);
-char *substitute_one(const char *line, const char *listaddr, size_t datacount,
- char **data);
+char *substitute(const char *line, const char *listaddr, const char *listdelim,
+ size_t datacount, char **data);
+char *substitute_one(const char *line, const char *listaddr,
+ const char *listdelim, size_t datacount, char **data);
char *prepstdreply(const char *listdir, const char *filename, const char *from,
const char *to, const char *replyto, size_t tokencount,
char **data);
#!/bin/sh
# install - install a program, script, or datafile
-scriptversion=2005-02-02.21
+scriptversion=2005-05-14.22
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
#! /bin/sh
# Common stub for a few missing GNU programs while installing.
-scriptversion=2005-02-08.22
+scriptversion=2005-06-08.21
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# ... or it is derived from the source name (dir/f.texi becomes f.info)
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
touch $file
;;
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
-scriptversion=2005-02-02.21
+scriptversion=2005-06-29.22
# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# <automake-patches@gnu.org>.
errstatus=0
-dirmode=""
+dirmode=
usage="\
Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
for file
do
- set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ case $file in
+ /*) pathcomp=/ ;;
+ *) pathcomp= ;;
+ esac
+ oIFS=$IFS
+ IFS=/
+ set fnord $file
shift
+ IFS=$oIFS
- pathcomp=
for d
do
- pathcomp="$pathcomp$d"
+ test "x$d" = x && continue
+
+ pathcomp=$pathcomp$d
case $pathcomp in
-*) pathcomp=./$pathcomp ;;
esac
else
if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
- lasterr=""
+ lasterr=
chmod "$dirmode" "$pathcomp" || lasterr=$?
if test ! -z "$lasterr"; then
fi
fi
- pathcomp="$pathcomp/"
+ pathcomp=$pathcomp/
done
done
-# Makefile.in generated by automake 1.9.5 from Makefile.am.
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
#
-SOURCES = $(mlmmj_bounce_SOURCES) $(mlmmj_list_SOURCES) $(mlmmj_maintd_SOURCES) $(mlmmj_process_SOURCES) $(mlmmj_recieve_SOURCES) $(mlmmj_send_SOURCES) $(mlmmj_sub_SOURCES) $(mlmmj_unsub_SOURCES)
-
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
--- /dev/null
+/* Copyright 2005 Joel Aelwyn <joel@lightbearer.com>
+ *
+ * $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 <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "mlmmj.h"
+#include "getlistdelim.h"
+#include "chomp.h"
+#include "log_error.h"
+#include "mygetline.h"
+#include "strgen.h"
+#include "memory.h"
+
+char *getlistdelim(const char *listdir)
+{
+ char *delimfn, *delimstr;
+ int delimfd;
+
+ delimfn = concatstr(2, listdir, "/control/delimiter");
+ if(-1 != (delimfd = open(delimfn, O_RDONLY))){
+ delimstr = mygetline(delimfd);
+ close(delimfd);
+
+ if(NULL == delimstr){
+ log_error(LOG_ARGS,
+ "FATAL. Could not get list delimiter from %s",
+ delimfn);
+ myfree(delimfn);
+ exit(EXIT_FAILURE);
+ }
+
+ chomp(delimstr);
+
+ if(0 == strlen(delimstr)){
+ log_error(LOG_ARGS,
+ "FATAL. Zero-length delimiter found from %s",
+ delimfn);
+ myfree(delimfn);
+ exit(EXIT_FAILURE);
+ }
+ } else
+ delimstr = mystrdup(DEFAULT_RECIPDELIM);
+
+ myfree(delimfn);
+
+ return delimstr;
+}
#include "mlmmj.h"
#include "listcontrol.h"
#include "find_email_adr.h"
+#include "getlistdelim.h"
#include "strgen.h"
#include "send_help.h"
#include "send_list.h"
const char *mlmmjunsub, const char *mlmmjsend,
const char *mlmmjbounce, const char *mailname)
{
- char *atsign, *recipdelimsign, *bouncenr, *tmpstr;
+ char *atsign, *recipdelimsign, *listdelim, *bouncenr, *tmpstr;
char *controlstr, *param = NULL, *conffilename, *moderatefilename;
char *c, *archivefilename, *sendfilename;
const char *subswitch;
else
subswitch = "-C";
- recipdelimsign = index(controladdr, RECIPDELIM);
+ listdelim = getlistdelim(listdir);
+ recipdelimsign = strstr(controladdr, listdelim);
MY_ASSERT(recipdelimsign);
atsign = index(controladdr, '@');
MY_ASSERT(atsign);
controlstr = mymalloc(len);
MY_ASSERT(controlstr);
- snprintf(controlstr, len, "%s", recipdelimsign + 1);
+ snprintf(controlstr, len, "%s", recipdelimsign + strlen(listdelim));
+ myfree(listdelim);
#if 0
log_error(LOG_ARGS, "controlstr = [%s]\n", controlstr);
#include <ctype.h>
#include "getlistaddr.h"
+#include "getlistdelim.h"
#include "mlmmj.h"
#include "strgen.h"
#include "wrappers.h"
void do_probe(const char *listdir, const char *mlmmjsend, const char *addr)
{
char *myaddr, *from, *a, *indexstr, *queuefilename, *listaddr;
- char *listfqdn, *listname, *probefile;
+ char *listfqdn, *listname, *probefile, *listdelim=getlistdelim(listdir);
char *maildata[] = { "bouncenumbers", NULL };
int fd;
time_t t;
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- from = concatstr(5, listname, "+bounces-probe-", myaddr, "@", listfqdn);
+ from = concatstr(6, listname, listdelim, "bounces-probe-", myaddr, "@",
+ listfqdn);
myfree(listaddr);
+ myfree(listdelim);
myfree(listfqdn);
myfree(listname);
#include "find_email_adr.h"
#include "incindexfile.h"
#include "getlistaddr.h"
+#include "getlistdelim.h"
#include "listcontrol.h"
#include "strgen.h"
#include "do_all_the_voodo_here.h"
const char *mlmmjsend)
{
char *from, *listfqdn, *listname, *moderators = NULL;
- char *buf, *replyto, *listaddr = getlistaddr(listdir);
+ char *buf, *replyto, *listaddr = getlistaddr(listdir), *listdelim;
char *queuefilename = NULL, *moderatorsfilename;
char *mailbasename = mybasename(mailfilename), *tmp, *to;
int queuefd, moderatorsfd, mailfd;
close(moderatorsfd);
- replyto = concatstr(5, listname, "+moderate-", mailbasename, "@",
- listfqdn);
+ listdelim = getlistdelim(listdir);
+ replyto = concatstr(6, listname, listdelim, "moderate-", mailbasename,
+ "@", listfqdn);
maildata[1] = replyto;
maildata[3] = moderators;
- from = concatstr(3, listname, "+owner@", listfqdn);
- to = concatstr(3, listname, "-moderators@", listfqdn);
+ from = concatstr(4, listname, listdelim, "owner@", listfqdn);
+ to = concatstr(3, listname, "-moderators@", listfqdn); /* FIXME JFA: Should this be converted? Why, why not? */
+ myfree(listdelim);
myfree(listname);
myfree(listfqdn);
char *footerfilename = NULL, *donemailname = NULL;
char *randomstr = NULL, *mqueuename;
char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce;
- char *bindir, *subjectprefix, *discardname, *listaddr;
+ char *bindir, *subjectprefix, *discardname, *listaddr, *listdelim;
char *listfqdn, *listname, *fromaddr;
- char *queuefilename, *recipdelim, *owner = NULL;
+ char *queuefilename, *recipextra, *owner = NULL;
char *maildata[2] = { "posteraddr", NULL };
struct stat st;
uid_t uid;
else
whichto = NULL;
- if(whichto && whichto->emaillist && whichto->emaillist[0])
- recipdelim = strchr(whichto->emaillist[0], RECIPDELIM);
- else
- recipdelim = NULL;
+ listdelim = getlistdelim(listdir);
+ if(whichto && whichto->emaillist && whichto->emaillist[0]){
+ recipextra = strstr(whichto->emaillist[0], listdelim);
+ if (recipextra)
+ recipextra += strlen(listdelim);
+ } else
+ recipextra = NULL;
+ myfree(listdelim);
- if(recipdelim) {
+ if(recipextra) {
owner = concatstr(2, listdir, "/control/owner");
- if(owner && strncmp(recipdelim, "+owner@", 7) == 0) {
+ if(owner && strncmp(recipextra, "owner@", 6) == 0) {
/* strip envelope from before resending */
delheaders->count = 0;
delheaders->strs = NULL;
myfree(donemailname);
exit(EXIT_SUCCESS);
}
+ listdelim = getlistdelim(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@",
+ listfqdn);
queuefilename = prepstdreply(listdir, "notintocc",
"$listowner$", fromemails.emaillist[0],
NULL, 0, NULL);
MY_ASSERT(queuefilename)
+ myfree(listdelim);
myfree(listname);
myfree(listfqdn);
unlink(donemailname);
myfree(donemailname);
exit(EXIT_SUCCESS);
}
+ listdelim = getlistdelim(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
maildata[1] = fromemails.emaillist[0];
- fromaddr = concatstr(3, listname, "+bounces-help@",
- listfqdn);
+ fromaddr = concatstr(4, listname, listdelim,
+ "bounces-help@", listfqdn);
queuefilename = prepstdreply(listdir, "subonlypost",
"$listowner$", fromemails.emaillist[0],
NULL, 1, maildata);
MY_ASSERT(queuefilename)
myfree(listaddr);
+ myfree(listdelim);
myfree(listname);
myfree(listfqdn);
unlink(donemailname);
myfree(donemailname);
exit(EXIT_SUCCESS);
}
+ listdelim = getlistdelim(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@",
- listfqdn);
+ fromaddr = concatstr(4, listname, listdelim,
+ "bounces-help@", listfqdn);
queuefilename = prepstdreply(listdir, "access",
"$listowner$",
fromemails.emaillist[0],
NULL, 0, NULL);
MY_ASSERT(queuefilename)
myfree(listaddr);
+ myfree(listdelim);
myfree(listname);
myfree(listfqdn);
unlink(donemailname);
#include "chomp.h"
#include "checkwait_smtpreply.h"
#include "getlistaddr.h"
+#include "getlistdelim.h"
#include "init_sockfd.h"
#include "strgen.h"
#include "log_error.h"
}
char *bounce_from_adr(const char *recipient, const char *listadr,
- const char *mailfilename)
+ const char *listdelim, const char *mailfilename)
{
- char *bounceaddr, *myrecipient, *mylistadr;
+ char *bounceaddr, *myrecipient, *mylistadr, *mylistdelim;
char *indexstr, *listdomain, *a = NULL, *mymailfilename;
size_t len;
return NULL;
}
+ mylistdelim = mystrdup(listdelim);
+ if (!mylistdelim) {
+ myfree(mymailfilename);
+ myfree(myrecipient);
+ myfree(mylistadr);
+ return NULL;
+ }
+
listdomain = strchr(mylistadr, '@');
if (!listdomain) {
myfree(mymailfilename);
myfree(myrecipient);
myfree(mylistadr);
+ myfree(mylistdelim);
return NULL;
}
*listdomain++ = '\0';
- /* 12 = RECIPDELIM + "bounces-" + "-" + "@" + NUL */
- len = strlen(mylistadr) + strlen(myrecipient) + strlen(indexstr)
- + strlen(listdomain) + 12;
+ /* 11 = "bounces-" + "-" + "@" + NUL */
+ len = strlen(mylistadr) + strlen(mylistdelim) + strlen(myrecipient)
+ + strlen(indexstr) + strlen(listdomain) + 11;
bounceaddr = mymalloc(len);
if (!bounceaddr) {
myfree(myrecipient);
myfree(mylistadr);
+ myfree(mylistdelim);
return NULL;
}
- snprintf(bounceaddr, len, "%s%cbounces-%s-%s@%s", mylistadr, RECIPDELIM,
+ snprintf(bounceaddr, len, "%s%sbounces-%s-%s@%s", mylistadr, listdelim,
indexstr, myrecipient, listdomain);
myfree(myrecipient);
myfree(mylistadr);
+ myfree(mylistdelim);
myfree(mymailfilename);
return bounceaddr;
int bouncemail(const char *listdir, const char *mlmmjbounce, const char *from)
{
char *myfrom = mystrdup(from);
+ char *listdelim = getlistdelim(listdir);
char *addr, *num, *c;
size_t len;
pid_t pid = 0;
if((c = strchr(myfrom, '@')) == NULL) {
myfree(myfrom);
+ myfree(listdelim);
return 0; /* Success when malformed 'from' */
}
*c = '\0';
num = strrchr(myfrom, '-');
num++;
- c = strchr(myfrom, RECIPDELIM);
+ c = strstr(myfrom, listdelim);
myfrom = strchr(c, '-');
myfrom++;
len = num - myfrom - 1;
addr[len] = '\0';
strncpy(addr, myfrom, len);
+ myfree(listdelim);
+
pid = fork();
if(pid < 0) {
int send_mail_many_fd(int sockfd, const char *from, const char *replyto,
char *mailmap, size_t mailsize, int subfd,
- const char *listaddr, const char *archivefilename,
- const char *listdir, const char *mlmmjbounce,
- const char *hdrs, size_t hdrslen, const char *body,
- size_t bodylen)
+ const char *listaddr, const char *listdelim,
+ const char *archivefilename, const char *listdir,
+ const char *mlmmjbounce, const char *hdrs, size_t hdrslen,
+ const char *body, size_t bodylen)
{
int res, ret, i;
struct strlist stl;
if(stl.count == maxverprecips) {
ret = send_mail_many_list(sockfd, from, replyto,
mailmap, mailsize, &stl, listaddr,
- archivefilename, listdir, mlmmjbounce,
- hdrs, hdrslen, body, bodylen);
+ listdelim, archivefilename, listdir,
+ mlmmjbounce, hdrs, hdrslen,
+ body, bodylen);
for(i = 0; i < stl.count; i++)
myfree(stl.strs[i]);
if(ret < 0)
if(stl.count) {
ret = send_mail_many_list(sockfd, from, replyto, mailmap,
- mailsize, &stl, listaddr, archivefilename,
- listdir, mlmmjbounce, hdrs, hdrslen, body,
- bodylen);
+ mailsize, &stl, listaddr, listdelim,
+ archivefilename, listdir, mlmmjbounce,
+ hdrs, hdrslen, body, bodylen);
for(i = 0; i < stl.count; i++)
myfree(stl.strs[i]);
stl.count = 0;
int send_mail_many_list(int sockfd, const char *from, const char *replyto,
char *mailmap, size_t mailsize, struct strlist *addrs,
- const char *listaddr, const char *archivefilename,
- const char *listdir, const char *mlmmjbounce,
- const char *hdrs, size_t hdrslen, const char *body,
- size_t bodylen)
+ const char *listaddr, const char *listdelim,
+ const char *archivefilename, const char *listdir,
+ const char *mlmmjbounce, const char *hdrs, size_t hdrslen,
+ const char *body, size_t bodylen)
{
int res = 0, i;
char *bounceaddr, *addr, *index;
mailmap, mailsize, listdir, NULL,
hdrs, hdrslen, body, bodylen);
} else {
- bounceaddr = bounce_from_adr(addr, listaddr,
+ bounceaddr = bounce_from_adr(addr, listaddr, listdelim,
archivefilename);
res = send_mail(sockfd, bounceaddr, addr, replyto,
mailmap, mailsize, listdir, mlmmjbounce,
int sockfd = -1, mailfd = 0, opt, mindex = 0, subfd = 0, tmpfd, i;
int deletewhensent = 1, sendres = 0, archive = 1, digest = 0;
int ctrlarchive, res;
- char *listaddr = NULL, *mailfilename = NULL, *subfilename = NULL;
+ char *listaddr = NULL, *listdelim = NULL;
+ char *mailfilename = NULL, *subfilename = NULL;
char *replyto = NULL, *bounceaddr = NULL, *to_addr = NULL;
char *relayhost = NULL, *archivefilename = NULL, *tmpstr;
char *listctrl = NULL, *subddirname = NULL, *listdir = NULL;
}
}
+ if(listdir)
+ listdelim = getlistdelim(listdir);
+
switch(listctrl[0]) {
case '1': /* A single mail is to be sent, do nothing */
case '5':
myfree(hdrs);
myfree(body);
myfree(subfilename);
+ myfree(listdelim);
/* No moderators is no error. Could be the sysadmin
* likes to do it manually.
*/
subfilename);
myfree(hdrs);
myfree(body);
+ myfree(listdelim);
exit(EXIT_FAILURE);
}
break;
archive = 0;
deletewhensent = 0;
archivefilename = mystrdup(mailfilename);
- bounceaddr = bounce_from_adr(to_addr, listaddr,
+ bounceaddr = bounce_from_adr(to_addr, listaddr, listdelim,
archivefilename);
break;
default: /* normal list mail -- now handled when forking */
case '2': /* Moderators */
initsmtp(&sockfd, relay, smtpport);
if(send_mail_many_fd(sockfd, bounceaddr, NULL, mailmap,
- st.st_size, subfd, NULL, NULL, listdir,
- NULL, hdrs, hdrslen, body, bodylen))
+ st.st_size, subfd, NULL, NULL, NULL,
+ listdir, NULL, hdrs, hdrslen,
+ body, bodylen))
close(sockfd);
else
endsmtp(&sockfd);
case '3': /* resending earlier failed mails */
initsmtp(&sockfd, relay, smtpport);
if(send_mail_many_fd(sockfd, NULL, NULL, mailmap, st.st_size,
- subfd, listaddr, mailfilename, listdir,
- mlmmjbounce, hdrs, hdrslen, body, bodylen))
+ subfd, listaddr, listdelim, mailfilename,
+ listdir, mlmmjbounce, hdrs, hdrslen,
+ body, bodylen))
close(sockfd);
else
endsmtp(&sockfd);
case '4': /* send mails to owner */
initsmtp(&sockfd, relay, smtpport);
if(send_mail_many_fd(sockfd, bounceaddr, NULL, mailmap,
- st.st_size, subfd, listaddr, mailfilename,
- listdir, mlmmjbounce, hdrs, hdrslen, body,
- bodylen))
+ st.st_size, subfd, listaddr, listdelim,
+ mailfilename, listdir, mlmmjbounce,
+ hdrs, hdrslen, body, bodylen))
close(sockfd);
else
endsmtp(&sockfd);
if((subddir = opendir(subddirname)) == NULL) {
log_error(LOG_ARGS, "Could not opendir(%s)",
subddirname);
+ myfree(listdelim);
myfree(subddirname);
myfree(hdrs);
myfree(body);
exit(EXIT_FAILURE);
}
+ listdelim = getlistdelim(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- verpfrom = concatstr(5, listname, "+bounces-", strindex, "@",
- listfqdn);
+ verpfrom = concatstr(6, listname, listdelim, "bounces-",
+ strindex, "@", listfqdn);
myfree(listname);
myfree(listfqdn);
st.st_size,
&stl,
listaddr,
+ listdelim,
archivefilename,
listdir,
mlmmjbounce,
} else {
sendres = send_mail_many_list(sockfd, NULL,
NULL, mailmap, st.st_size,
- &stl, listaddr,
+ &stl, listaddr, listdelim,
archivefilename, listdir,
mlmmjbounce, hdrs, hdrslen,
body, bodylen);
myfree(stl.strs[i]);
stl.count = 0;
+ myfree(listdelim);
myfree(hdrs);
myfree(body);
myfree(mlmmjbounce);
#include "mylocking.h"
#include "wrappers.h"
#include "getlistaddr.h"
+#include "getlistdelim.h"
#include "strgen.h"
#include "subscriberfuncs.h"
#include "log_error.h"
#include "memory.h"
void confirm_sub(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub)
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub)
{
char *queuefilename, *fromaddr, *listname, *listfqdn, *listtext;
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
myfree(listname);
myfree(listfqdn);
}
void notify_sub(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub)
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub)
{
char *maildata[2] = { "newsub", NULL };
char *listfqdn, *listname, *fromaddr, *tostr;
maildata[1] = mystrdup(subaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
- tostr = concatstr(3, listname, "+owner@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
+ tostr = concatstr(4, listname, listdelim, "owner@", listfqdn);
myfree(listname);
myfree(listfqdn);
}
void generate_subconfirm(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub)
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub)
{
int subconffd;
char *confirmaddr, *listname, *listfqdn, *confirmfilename = NULL;
close(subconffd);
- fromaddr = concatstr(5, listname, "+bounces-confsub-", randomstr,
- "@", listfqdn);
+ fromaddr = concatstr(6, listname, listdelim, "bounces-confsub-",
+ randomstr, "@", listfqdn);
switch(typesub) {
default:
case SUB_NORMAL:
listtext = mystrdup("sub-confirm");
- tmpstr = mystrdup("+confsub-");
+ tmpstr = mystrdup("confsub-");
break;
case SUB_DIGEST:
listtext = mystrdup("sub-confirm-digest");
- tmpstr = mystrdup("+confsub-digest-");
+ tmpstr = mystrdup("confsub-digest-");
break;
case SUB_NOMAIL:
listtext = mystrdup("sub-confirm-nomail");
- tmpstr = mystrdup("+confsub-nomail-");
+ tmpstr = mystrdup("confsub-nomail-");
break;
}
- confirmaddr = concatstr(5, listname, tmpstr, randomstr, "@", listfqdn);
+ confirmaddr = concatstr(6, listname, listdelim, tmpstr, randomstr, "@",
+ listfqdn);
myfree(randomstr);
myfree(tmpstr);
const char *mlmmjsend)
{
char *queuefilename, *fromaddr, *listname, *listfqdn, *listaddr;
+ char *listdelim = getlistdelim(listdir);
listaddr = getlistaddr(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
+ myfree(listdelim);
queuefilename = prepstdreply(listdir, "sub-subscribed", "$helpaddr$",
subaddr, NULL, 0, NULL);
int main(int argc, char **argv)
{
- char *listaddr, *listdir = NULL, *address = NULL, *subfilename = NULL;
- char *mlmmjsend, *bindir, chstr[2], *subdir, *subddirname = NULL;
- char *sublockname;
+ char *listaddr, *listdelim, *listdir = NULL, *address = NULL;
+ char *subfilename = NULL, *mlmmjsend, *bindir, chstr[2], *subdir;
+ char *subddirname = NULL, *sublockname;
int subconfirm = 0, confirmsub = 0, opt, subfilefd, lock, notifysub;
int changeuid = 1, status, digest = 0, nomail = 0;
int groupwritable = 0, sublock, sublockfd, nogensubscribed = 0, subbed;
exit(EXIT_FAILURE);
}
subbed = is_subbed_in(subddirname, address);
+ listdelim = getlistdelim(listdir);
if(subbed) {
if(subconfirm) {
close(subfilefd);
close(sublockfd);
unlink(sublockname);
myfree(sublockname);
- generate_subconfirm(listdir, listaddr, address,
- mlmmjsend, typesub);
+ generate_subconfirm(listdir, listaddr, listdelim,
+ address, mlmmjsend, typesub);
} else {
lseek(subfilefd, 0L, SEEK_END);
len = strlen(address);
if(childpid < 0) {
log_error(LOG_ARGS, "Could not fork");
- confirm_sub(listdir, listaddr, address, mlmmjsend,
- typesub);
+ confirm_sub(listdir, listaddr, listdelim, address,
+ mlmmjsend, typesub);
}
if(childpid > 0) {
/* child confirms subscription */
if(childpid == 0)
- confirm_sub(listdir, listaddr, address, mlmmjsend,
- typesub);
+ confirm_sub(listdir, listaddr, listdelim, address,
+ mlmmjsend, typesub);
}
notifysub = statctrl(listdir, "notifysub");
/* Notify list owner about subscription */
if (notifysub)
- notify_sub(listdir, listaddr, address, mlmmjsend, typesub);
+ notify_sub(listdir, listaddr, listdelim, address, mlmmjsend,
+ typesub);
myfree(listaddr);
+ myfree(listdelim);
return EXIT_SUCCESS;
}
#include "wrappers.h"
#include "mygetline.h"
#include "getlistaddr.h"
+#include "getlistdelim.h"
#include "subscriberfuncs.h"
#include "strgen.h"
#include "log_error.h"
#include "prepstdreply.h"
void confirm_unsub(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub)
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub)
{
char *queuefilename, *fromaddr, *listname, *listfqdn, *listtext;
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
myfree(listname);
myfree(listfqdn);
}
void notify_unsub(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub)
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub)
{
char *maildata[4] = { "oldsub", NULL };
char *listfqdn, *listname, *fromaddr, *tostr;
maildata[1] = mystrdup(subaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
- tostr = concatstr(3, listname, "+owner@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
+ tostr = concatstr(4, listname, listdelim, "owner@", listfqdn);
myfree(listname);
myfree(listfqdn);
void generate_unsubconfirm(const char *listdir, const char *listaddr,
- const char *subaddr, const char *mlmmjsend,
- enum subtype typesub)
+ const char *listdelim, const char *subaddr,
+ const char *mlmmjsend, enum subtype typesub)
{
char *confirmaddr, *listname, *listfqdn, *tmpstr;
char *queuefilename, *fromaddr;
close(subconffd);
- fromaddr = concatstr(5, listname, "+bounces-confunsub-", randomstr,
- "@", listfqdn);
+ fromaddr = concatstr(6, listname, listdelim, "bounces-confunsub-",
+ randomstr, "@", listfqdn);
switch(typesub) {
default:
case SUB_NORMAL:
listtext = mystrdup("unsub-confirm");
- tmpstr = mystrdup("+confunsub-");
+ tmpstr = mystrdup("confunsub-");
break;
case SUB_DIGEST:
listtext = mystrdup("unsub-confirm-digest");
- tmpstr = mystrdup("+confunsub-digest-");
+ tmpstr = mystrdup("confunsub-digest-");
break;
case SUB_NOMAIL:
listtext = mystrdup("unsub-confirm-nomail");
- tmpstr = mystrdup("+confunsub-nomail-");
+ tmpstr = mystrdup("confunsub-nomail-");
break;
}
- confirmaddr = concatstr(5, listname, tmpstr, randomstr, "@", listfqdn);
+ confirmaddr = concatstr(6, listname, listdelim, tmpstr, randomstr, "@",
+ listfqdn);
myfree(randomstr);
myfree(tmpstr);
const char *mlmmjsend)
{
char *queuefilename, *fromaddr, *listname, *listfqdn, *listaddr;
+ char *listdelim = getlistdelim(listdir);
listaddr = getlistaddr(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
+ myfree(listdelim);
queuefilename = prepstdreply(listdir, "unsub-notsubscribed",
"$helpaddr$", subaddr, NULL, 0, NULL);
int confirmunsub = 0, unsubconfirm = 0, notifysub = 0, digest = 0;
int changeuid = 1, groupwritable = 0, sublock, sublockfd;
int nogennotsubscribed = 0;
- char *listaddr, *listdir = NULL, *address = NULL, *subreadname = NULL;
- char *subwritename, *mlmmjsend, *bindir, *subdir;
+ char *listaddr, *listdelim, *listdir = NULL, *address = NULL;
+ char *subreadname = NULL, *subwritename, *mlmmjsend, *bindir, *subdir;
char *subddirname, *sublockname;
off_t suboff;
DIR *subddir;
exit(EXIT_SUCCESS);
}
+ listdelim = getlistdelim(listdir);
if(unsubconfirm)
- generate_unsubconfirm(listdir, listaddr, address, mlmmjsend,
- typesub);
+ generate_unsubconfirm(listdir, listaddr, listdelim, address,
+ mlmmjsend, typesub);
if((subddir = opendir(subddirname)) == NULL) {
log_error(LOG_ARGS, "Could not opendir(%s)",
subddirname);
myfree(subddirname);
myfree(listaddr);
+ myfree(listdelim);
exit(EXIT_FAILURE);
}
if(childpid < 0) {
log_error(LOG_ARGS, "Could not fork");
- confirm_unsub(listdir, listaddr, address,
- mlmmjsend, digest);
+ confirm_unsub(listdir, listaddr, listdelim,
+ address, mlmmjsend, digest);
}
if(childpid > 0) {
/* child confirms subscription */
if(childpid == 0)
- confirm_unsub(listdir, listaddr, address,
- mlmmjsend, digest);
+ confirm_unsub(listdir, listaddr, listdelim,
+ address, mlmmjsend, digest);
}
}
/* Notify list owner about subscription */
if (notifysub)
- notify_unsub(listdir, listaddr, address, mlmmjsend, typesub);
+ notify_unsub(listdir, listaddr, listdelim, address, mlmmjsend,
+ typesub);
myfree(listaddr);
+ myfree(listdelim);
return EXIT_SUCCESS;
}
#include "memory.h"
#include "getlistaddr.h"
#include "mlmmj.h"
+#include "getlistdelim.h"
-char *substitute(const char *line, const char *listaddr, size_t datacount,
- char **data)
+char *substitute(const char *line, const char *listaddr, const char *listdelim,
+ size_t datacount, char **data)
{
char *s1, *s2;
- s1 = substitute_one(line, listaddr, datacount, data);
+ s1 = substitute_one(line, listaddr, listdelim, datacount, data);
while(s1) {
- s2 = substitute_one(s1, listaddr, datacount, data);
+ s2 = substitute_one(s1, listaddr, listdelim, datacount, data);
if(s2) {
myfree(s1);
s1 = s2;
return mystrdup(line);
}
-char *substitute_one(const char *line, const char *listaddr, size_t datacount,
- char **data)
+char *substitute_one(const char *line, const char *listaddr,
+ const char *listdelim, size_t datacount, char **data)
{
char *fqdn, *listname, *d1, *d2, *token, *value = NULL;
char *retstr, *origline;
value = mystrdup(listaddr);
goto concatandreturn;
} else if(strcmp(token, "listowner") == 0) {
- value = concatstr(3, listname, "+owner@", fqdn);
+ value = concatstr(4, listname, listdelim, "owner@", fqdn);
goto concatandreturn;
} else if(strcmp(token, "helpaddr") == 0) {
- value = concatstr(3, listname, "+help@", fqdn);
+ value = concatstr(4, listname, listdelim, "help@", fqdn);
goto concatandreturn;
} else if(strcmp(token, "listgetN") == 0) {
- value = concatstr(3, listname, "+get-N@", fqdn);
+ value = concatstr(4, listname, listdelim, "get-N@", fqdn);
goto concatandreturn;
} else if(strcmp(token, "listunsubaddr") == 0) {
- value = concatstr(3, listname, "+unsubscribe@", fqdn);
+ value = concatstr(4, listname, listdelim, "unsubscribe@", fqdn);
goto concatandreturn;
} else if(strcmp(token, "digestunsubaddr") == 0) {
- value = concatstr(3, listname, "+unsubscribe-digest@", fqdn);
+ value = concatstr(4, listname, listdelim,
+ "unsubscribe-digest@", fqdn);
goto concatandreturn;
} else if(strcmp(token, "nomailunsubaddr") == 0) {
- value = concatstr(3, listname, "+unsubscribe-nomail@", fqdn);
+ value = concatstr(4, listname, listdelim,
+ "unsubscribe-nomail@", fqdn);
goto concatandreturn;
} else if(strcmp(token, "listsubaddr") == 0) {
- value = concatstr(3, listname, "+subscribe@", fqdn);
+ value = concatstr(4, listname, listdelim, "subscribe@", fqdn);
goto concatandreturn;
} else if(strcmp(token, "digestsubaddr") == 0) {
- value = concatstr(3, listname, "+subscribe-digest@", fqdn);
+ value = concatstr(4, listname, listdelim, "subscribe-digest@",
+ fqdn);
goto concatandreturn;
} else if(strcmp(token, "nomailsubaddr") == 0) {
- value = concatstr(3, listname, "+subscribe-nomail@", fqdn);
+ value = concatstr(4, listname, listdelim, "subscribe-nomail@",
+ fqdn);
goto concatandreturn;
}
if(data) {
char **data)
{
int infd, outfd;
- char *listaddr, *myfrom, *tmp, *subject, *retstr = NULL;
+ char *listaddr, *listdelim, *myfrom, *tmp, *subject, *retstr = NULL;
char *myreplyto, *myto, *str = NULL, *mydate, *mymsgid;
tmp = concatstr(3, listdir, "/text/", filename);
}
listaddr = getlistaddr(listdir);
+ listdelim = getlistdelim(listdir);
tmp = mygetline(infd);
if(strncasecmp(tmp, "Subject:", 8) != 0) {
"standard subject");
subject = mystrdup("mlmmj administrativa\n");
} else
- subject = substitute(tmp, listaddr, tokencount, data);
+ subject = substitute(tmp, listaddr, listdelim, tokencount,
+ data);
myfree(tmp);
- myfrom = substitute(from, listaddr, tokencount, data);
- myto = substitute(to, listaddr, tokencount, data);
+ myfrom = substitute(from, listaddr, listdelim, tokencount, data);
+ myto = substitute(to, listaddr, listdelim, tokencount, data);
mydate = gendatestr();
mymsgid = genmsgid();
if(replyto) {
- myreplyto = substitute(replyto, listaddr, tokencount, data);
+ myreplyto = substitute(replyto, listaddr, listdelim,
+ tokencount, data);
tmp = concatstr(3, "Reply-To: ", myreplyto, "\n");
myfree(myreplyto);
myreplyto = tmp;
if(outfd < 0) {
log_error(LOG_ARGS, "Could not open std mail %s", retstr);
myfree(str);
+ myfree(listdelim);
return NULL;
}
if(writen(outfd, str, strlen(str)) < 0) {
log_error(LOG_ARGS, "Could not write std mail");
myfree(str);
+ myfree(listdelim);
return NULL;
}
while((str = mygetline(infd))) {
tmp = str;
- str = substitute(tmp, listaddr, tokencount, data);
+ str = substitute(tmp, listaddr, listdelim, tokencount, data);
myfree(tmp);
if(writen(outfd, str, strlen(str)) < 0) {
myfree(str);
+ myfree(listdelim);
log_error(LOG_ARGS, "Could not write std mail");
return NULL;
}
#include "strgen.h"
#include "memory.h"
#include "getlistaddr.h"
+#include "getlistdelim.h"
#include "wrappers.h"
int i, fd, archivefd, status, hdrfd;
char buf[45];
char *tmp, *queuename = NULL, *archivename, *fromstr;
- char *boundary, *listaddr, *listname, *listfqdn;
+ char *boundary, *listaddr, *listdelim, *listname, *listfqdn;
pid_t childpid, pid;
if (addr) {
snprintf(buf, sizeof(buf), " (%d-%d)", firstindex, lastindex);
}
- fromstr = concatstr(5, "From: ", listname, "+help@", listfqdn, "\n");
+ listdelim = getlistdelim(listdir);
+ fromstr = concatstr(6, "From: ", listname, listdelim, "help@", listfqdn,
+ "\n");
+ myfree(listdelim);
+
tmp = concatstr(6, "MIME-Version: 1.0"
"\nContent-Type: multipart/" DIGESTMIMETYPE "; "
"boundary=", boundary,
#include "strgen.h"
#include "find_email_adr.h"
#include "getlistaddr.h"
+#include "getlistdelim.h"
#include "log_error.h"
#include "chomp.h"
#include "wrappers.h"
void send_help(const char *listdir, const char *emailaddr,
const char *mlmmjsend)
{
- char *queuefilename, *listaddr, *listname, *listfqdn, *fromaddr;
+ char *queuefilename, *listaddr, *listdelim, *listname, *listfqdn;
+ char *fromaddr;
listaddr = getlistaddr(listdir);
+ listdelim = getlistdelim(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
+ myfree(listdelim);
queuefilename = prepstdreply(listdir, "listhelp", "$listowner$",
emailaddr, NULL, 0, NULL);
#include "send_list.h"
#include "strgen.h"
#include "getlistaddr.h"
+#include "getlistdelim.h"
#include "log_error.h"
#include "chomp.h"
#include "wrappers.h"
void send_list(const char *listdir, const char *emailaddr,
const char *mlmmjsend)
{
- char *queuefilename, *listaddr, *listname, *listfqdn, *fromaddr;
- char *subdir, *fileiter;
+ char *queuefilename, *listaddr, *listdelim, *listname, *listfqdn;
+ char *fromaddr, *subdir, *fileiter;
DIR *dirp;
struct dirent *dp;
int fd, subfd;
listaddr = getlistaddr(listdir);
+ listdelim = getlistdelim(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
subdir = concatstr(2, listdir, "/subscribers.d/");
- fromaddr = concatstr(3, listname, "+bounces-help@", listfqdn);
+ fromaddr = concatstr(4, listname, listdelim, "bounces-help@", listfqdn);
+ myfree(listdelim);
queuefilename = prepstdreply(listdir, "listsubs", "$listowner$",
emailaddr, NULL, 0, NULL);