"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "src/mlmmj-process.c" between
mlmmj-1.2.19.0.tar.gz and mlmmj-1.3.0.tar.bz2

About: mlmmj is a mailing list manager similar to ezmlm, but with a decent license and mail server independency.

mlmmj-process.c  (mlmmj-1.2.19.0):mlmmj-process.c  (mlmmj-1.3.0.tar.bz2)
skipping to change at line 56 skipping to change at line 56
#include "mygetline.h" #include "mygetline.h"
#include "statctrl.h" #include "statctrl.h"
#include "ctrlvalue.h" #include "ctrlvalue.h"
#include "ctrlvalues.h" #include "ctrlvalues.h"
#include "getlistaddr.h" #include "getlistaddr.h"
#include "prepstdreply.h" #include "prepstdreply.h"
#include "subscriberfuncs.h" #include "subscriberfuncs.h"
#include "memory.h" #include "memory.h"
#include "log_oper.h" #include "log_oper.h"
#include "unistr.h" #include "unistr.h"
#include "chomp.h"
enum action { enum action {
ALLOW, ALLOW,
SEND, SEND,
DENY, DENY,
MODERATE, MODERATE,
DISCARD DISCARD
}; };
static char *action_strs[] = { static char *action_strs[] = {
"allowed", "allowed",
"sent", "sent",
"denied", "denied",
"moderated", "moderated",
"discarded" "discarded"
}; };
enum modreason { enum modreason {
MODNONSUBPOSTS, MODNONSUBPOSTS,
MODNONMODPOSTS,
ACCESS, ACCESS,
MODERATED MODERATED
}; };
static char *modreason_strs[] = { static char *modreason_strs[] = {
"modnonsubposts", "modnonsubposts",
"modnonmodposts",
"access", "access",
"moderated" "moderated"
}; };
static int is_moderator(const char *listdir, const char *address,
char **moderators) {
char *buf, *tmp, *moderatorsfilename;
int moderatorsfd, foundaddr = 0;
moderatorsfilename = concatstr(2, listdir, "/control/moderators");
if((moderatorsfd = open(moderatorsfilename, O_RDONLY)) < 0) {
log_error(LOG_ARGS, "Could not open '%s'", moderatorsfilename);
myfree(moderatorsfilename);
exit(EXIT_FAILURE);
}
myfree(moderatorsfilename);
while((buf = mygetline(moderatorsfd))) {
chomp(buf);
if(address && strcasecmp(buf, address) == 0) {
foundaddr = 1;
if (!moderators) {
close(moderatorsfd);
myfree(buf);
return foundaddr;
}
}
if (moderators) {
tmp = *moderators;
*moderators = concatstr(3, *moderators, buf, "\n");
myfree(tmp);
}
myfree(buf);
}
close(moderatorsfd);
return foundaddr;
}
static void newmoderated(const char *listdir, const char *mailfilename, static void newmoderated(const char *listdir, const char *mailfilename,
const char *mlmmjsend, const char *efromsender, const char *mlmmjsend, const char *efromsender,
const char *subject, const char *posteraddr, const char *subject, const char *posteraddr,
enum modreason modreason) enum modreason modreason)
{ {
char *from, *listfqdn, *listname, *moderators = NULL; char *from, *listfqdn, *listname, *moderators = NULL;
char *buf, *replyto, *listaddr = getlistaddr(listdir), *listdelim; char *replyto, *listaddr = getlistaddr(listdir), *listdelim;
text *txt; text *txt;
memory_lines_state *mls; memory_lines_state *mls;
char *queuefilename = NULL, *moderatorsfilename, *efromismod = NULL; char *queuefilename = NULL;
char *mailbasename = mybasename(mailfilename), *tmp, *to, *reject; const char *efromismod = NULL;
int moderatorsfd, foundaddr = 0, notifymod = 0, status; char *mailbasename = mybasename(mailfilename), *to, *reject;
int notifymod = 0, status;
pid_t childpid, pid; pid_t childpid, pid;
#if 0 #if 0
printf("mailfilename = [%s], mailbasename = [%s]\n", mailfilename, printf("mailfilename = [%s], mailbasename = [%s]\n", mailfilename,
mailbasename); mailbasename);
#endif #endif
listfqdn = genlistfqdn(listaddr); listfqdn = genlistfqdn(listaddr);
listname = genlistname(listaddr); listname = genlistname(listaddr);
moderatorsfilename = concatstr(2, listdir, "/control/moderators");
if((moderatorsfd = open(moderatorsfilename, O_RDONLY)) < 0) {
log_error(LOG_ARGS, "Could not open '%s'", moderatorsfilename);
myfree(moderatorsfilename);
exit(EXIT_FAILURE);
}
myfree(moderatorsfilename);
if(statctrl(listdir, "ifmodsendonlymodmoderate")) if(statctrl(listdir, "ifmodsendonlymodmoderate"))
efromismod = concatstr(2, efromsender, "\n"); efromismod = efromsender;
while((buf = mygetline(moderatorsfd))) { if(!is_moderator(listdir, efromismod, &moderators))
if(efromismod && strcmp(buf, efromismod) == 0)
foundaddr = 1;
tmp = moderators;
moderators = concatstr(2, moderators, buf);
myfree(buf);
myfree(tmp);
}
if(!foundaddr) {
myfree(efromismod);
efromismod = NULL; efromismod = NULL;
}
if(efromismod) mls = init_memory_lines(efromismod); if(efromismod) mls = init_memory_lines(efromismod);
else mls = init_memory_lines(moderators); else mls = init_memory_lines(moderators);
close(moderatorsfd);
myfree(moderators); myfree(moderators);
listdelim = getlistdelim(listdir); listdelim = getlistdelim(listdir);
replyto = concatstr(6, listname, listdelim, "release-", mailbasename, replyto = concatstr(6, listname, listdelim, "release-", mailbasename,
"@", listfqdn); "@", listfqdn);
reject = concatstr(6, listname, listdelim, "reject-", mailbasename, reject = concatstr(6, listname, listdelim, "reject-", mailbasename,
"@", listfqdn); "@", listfqdn);
from = concatstr(4, listname, listdelim, "owner@", listfqdn); from = concatstr(4, listname, listdelim, "owner@", listfqdn);
to = concatstr(3, listname, "-moderators@", listfqdn); /* FIXME JFA: Shou ld this be converted? Why, why not? */ to = concatstr(3, listname, "-moderators@", listfqdn); /* FIXME JFA: Shou ld this be converted? Why, why not? */
skipping to change at line 365 skipping to change at line 384
} }
} }
log_oper(listdir, OPLOGFNAME, "mlmmj-process: access -" log_oper(listdir, OPLOGFNAME, "mlmmj-process: access -"
" A mail from \"%s\" didn't match any rules, and" " A mail from \"%s\" didn't match any rules, and"
" was denied by default.", from); " was denied by default.", from);
return DENY; return DENY;
} }
static char *recipient_extra(const char *listdir, const char *addr) static int addrmatch(const char *listaddr, const char *addr,
const char *listdelim, char **recipextra)
{ {
char *listdelim; char *delim, *atsign;
char *delim, *atsign, *ret;
size_t len; size_t len;
if (!addr) if (!addr)
return NULL; return 0;
listdelim = getlistdelim(listdir); if(strcasecmp(listaddr, addr) == 0) {
if (recipextra)
*recipextra = NULL;
return 1;
}
if (!listdelim)
return 0;
delim = strstr(addr, listdelim); delim = strstr(addr, listdelim);
if (!delim) { if (!delim)
myfree(listdelim); return 0;
return NULL;
} len = delim - addr;
if(strncasecmp(listaddr, addr, len) != 0)
return 0;
if(*(listaddr + len) != '@')
return 0;
delim += strlen(listdelim); delim += strlen(listdelim);
myfree(listdelim);
atsign = strrchr(delim, '@'); atsign = strrchr(delim, '@');
if (!atsign) if (!atsign)
return NULL; return 0;
if(strcasecmp(listaddr + len + 1, atsign + 1) != 0)
return 0;
len = atsign - delim; if (recipextra) {
ret = (char *)mymalloc(len + 1); len = atsign - delim;
strncpy(ret, delim, len); *recipextra = (char *)mymalloc(len + 1);
ret[len] = '\0'; strncpy(*recipextra, delim, len);
(*recipextra)[len] = '\0';
}
return ret; return 1;
} }
static void print_help(const char *prg) static void print_help(const char *prg)
{ {
printf("Usage: %s -L /path/to/list\n" printf("Usage: %s -L /path/to/list\n"
" -m /path/to/mail [-h] [-P] [-V]\n" " -m /path/to/mail [-h] [-P] [-V]\n"
" -h: This help\n" " -h: This help\n"
" -L: Full path to list directory\n" " -L: Full path to list directory\n"
" -m: Full path to mail file\n" " -m: Full path to mail file\n"
" -P: Don't execute mlmmj-send\n" " -P: Don't execute mlmmj-send\n"
" -V: Print version\n", prg); " -V: Print version\n", prg);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int i, j, opt, noprocess = 0, moderated = 0, send = 0; int i, j, opt, noprocess = 0, moderated = 0, send = 0;
enum modreason modreason; enum modreason modreason;
int hdrfd, footfd, rawmailfd, donemailfd, omitfd; int hdrfd, footfd, rawmailfd, donemailfd, omitfd;
int addrtocc = 1, intocc = 0; int addrtocc, intocc = 0, findaddress = 0;
int maxmailsize = 0; int maxmailsize = 0;
int notmetoo = 0; int notmetoo = 0;
int subonlypost = 0, modonlypost = 0, modnonsubposts = 0, foundaddr = 0;
char *listdir = NULL, *mailfile = NULL, *headerfilename = NULL; char *listdir = NULL, *mailfile = NULL, *headerfilename = NULL;
char *footerfilename = NULL, *donemailname = NULL; char *footerfilename = NULL, *donemailname = NULL;
char *randomstr = NULL, *mqueuename, *omitfilename; char *randomstr = NULL, *mqueuename, *omitfilename;
char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce; char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce;
char *bindir, *subjectprefix, *discardname, *listaddr, *listdelim; char *bindir, *subjectprefix, *discardname, *listaddr, *listdelim = NULL;
char *listfqdn, *listname, *fromaddr; char *listfqdn, *listname, *fromaddr;
text *txt; text *txt;
char *queuefilename, *recipextra = NULL, *owner = NULL; char *queuefilename, *recipextra = NULL, *owner = NULL;
char *maxmailsizestr; char *maxmailsizestr;
char *subject = NULL, *posteraddr = NULL; char *subject = NULL, *posteraddr = NULL;
char *envstr, *efrom; char *envstr, *efrom;
struct stat st; struct stat st;
uid_t uid; uid_t uid;
struct email_container fromemails = { 0, NULL }; struct email_container fromemails = { 0, NULL };
struct email_container toemails = { 0, NULL }; struct email_container toemails = { 0, NULL };
struct email_container ccemails = { 0, NULL }; struct email_container ccemails = { 0, NULL };
struct email_container rpemails = { 0, NULL }; struct email_container rpemails = { 0, NULL };
struct email_container dtemails = { 0, NULL }; struct email_container dtemails = { 0, NULL };
struct strlist *access_rules = NULL; struct strlist *access_rules = NULL;
struct strlist *delheaders = NULL; struct strlist *delheaders = NULL;
struct strlist allheaders; struct strlist allheaders;
struct strlist *alternates = NULL; struct strlist *listaddrs = NULL;
struct mailhdr readhdrs[] = { struct mailhdr readhdrs[] = {
{ "From:", 0, NULL }, { "From:", 0, NULL },
{ "To:", 0, NULL }, { "To:", 0, NULL },
{ "Cc:", 0, NULL }, { "Cc:", 0, NULL },
{ "Return-Path:", 0, NULL }, { "Return-Path:", 0, NULL },
{ "Delivered-To:", 0, NULL }, { "Delivered-To:", 0, NULL },
{ "Subject:", 0, NULL }, { "Subject:", 0, NULL },
{ NULL, 0, NULL } { NULL, 0, NULL }
}; };
skipping to change at line 606 skipping to change at line 642
recipextra = mystrdup(envstr); recipextra = mystrdup(envstr);
} else if((envstr = getenv("LOCAL_PART_SUFFIX")) != NULL) { } else if((envstr = getenv("LOCAL_PART_SUFFIX")) != NULL) {
/* exim */ /* exim */
listdelim = getlistdelim(listdir); listdelim = getlistdelim(listdir);
if (strncmp(envstr, listdelim, strlen(listdelim)) == 0) { if (strncmp(envstr, listdelim, strlen(listdelim)) == 0) {
recipextra = mystrdup(envstr + strlen(listdelim)); recipextra = mystrdup(envstr + strlen(listdelim));
} else { } else {
recipextra = mystrdup(envstr); recipextra = mystrdup(envstr);
} }
myfree(listdelim); myfree(listdelim);
} else if(dtemails.emailcount >= 1) { listdelim = NULL;
/* parse the (first) Delivered-To: header */
recipextra = recipient_extra(listdir, dtemails.emaillist[0]);
} else if(toemails.emailcount >= 1) {
/* parse the (first) To: header */
recipextra = recipient_extra(listdir, toemails.emaillist[0]);
} else { } else {
recipextra = NULL; findaddress = 1;
} }
addrtocc = !(statctrl(listdir, "tocc"));
if (findaddress) {
listdelim = getlistdelim(listdir);
}
if(addrtocc || findaddress) {
listaddrs = ctrlvalues(listdir, "listaddress");
for(i = 0; i < dtemails.emailcount; i++) {
for(j = 0; j < listaddrs->count; j++) {
if(addrmatch(listaddrs->strs[j], dtemails.emailli
st[i],
listdelim, &recipextra)) {
findaddress = 0;
myfree(listdelim);
listdelim = NULL;
break;
}
}
}
}
if(addrtocc || findaddress) {
for(i = 0; i < toemails.emailcount; i++) {
for(j = 0; j < listaddrs->count; j++) {
if(addrmatch(listaddrs->strs[j], toemails.emailli
st[i],
listdelim, &recipextra)) {
intocc = 1;
break;
}
}
}
if (!intocc) for(i = 0; i < ccemails.emailcount; i++) {
for(j = 0; j < listaddrs->count; j++) {
if(addrmatch(listaddrs->strs[j], ccemails.emailli
st[i],
listdelim, &recipextra)) {
intocc = 1;
break;
}
}
}
}
if (listdelim) {
myfree(listdelim);
listdelim = NULL;
}
if (listaddrs) for(i = 0; i < listaddrs->count; i++)
myfree(listaddrs->strs[i]);
if(recipextra && (strlen(recipextra) == 0)) { if(recipextra && (strlen(recipextra) == 0)) {
myfree(recipextra); myfree(recipextra);
recipextra = NULL; recipextra = NULL;
} }
/* From: addresses */ /* From: addresses */
for(i = 0; i < readhdrs[0].valuecount; i++) { for(i = 0; i < readhdrs[0].valuecount; i++) {
find_email_adr(readhdrs[0].values[i], &fromemails); find_email_adr(readhdrs[0].values[i], &fromemails);
} }
/* discard malformed mail with invalid From: unless it's a bounce */ /* discard malformed mail with invalid From: unless it's a bounce */
skipping to change at line 725 skipping to change at line 803
"-L", listdir, "-L", listdir,
"-F", efrom, "-F", efrom,
"-s", owner, "-s", owner,
"-a", "-a",
"-m", donemailname, (char *)NULL); "-m", donemailname, (char *)NULL);
log_error(LOG_ARGS, "execlp() of '%s' failed", log_error(LOG_ARGS, "execlp() of '%s' failed",
mlmmjsend); mlmmjsend);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
#if 0 #if 0
log_error(LOG_ARGS, "listcontrol(from, %s, %s, %s, %s, %s, %s)\n" , listdir, toemails.emaillist[0], mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce); log_error(LOG_ARGS, "listcontrol(from, %s, %s, %s, %s, %s, %s, %s )\n", listdir, toemails.emaillist[0], mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjboun ce, donemailname);
#endif #endif
unlink(mailfile); unlink(mailfile);
listcontrol(&fromemails, listdir, recipextra, listcontrol(&fromemails, listdir, recipextra,
mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce, mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce,
donemailname); donemailname);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
listaddr = getlistaddr(listdir); listaddr = getlistaddr(listdir);
alternates = ctrlvalues(listdir, "listaddress");
/* checking incoming mail's size */ /* checking incoming mail's size */
maxmailsizestr = ctrlvalue(listdir, "maxmailsize"); maxmailsizestr = ctrlvalue(listdir, "maxmailsize");
if(maxmailsizestr) { if(maxmailsizestr) {
maxmailsize = atol(maxmailsizestr); maxmailsize = atol(maxmailsizestr);
if(stat(donemailname, &st) < 0) { if(stat(donemailname, &st) < 0) {
log_error(LOG_ARGS, "stat(%s,..) failed", donemailname); log_error(LOG_ARGS, "stat(%s,..) failed", donemailname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
skipping to change at line 817 skipping to change at line 894
unlink(donemailname); unlink(donemailname);
myfree(donemailname); myfree(donemailname);
myfree(discardname); myfree(discardname);
myfree(randomstr); myfree(randomstr);
/* TODO: free emailstructs */ /* TODO: free emailstructs */
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
unlink(mailfile); unlink(mailfile);
addrtocc = !(statctrl(listdir, "tocc"));
if(addrtocc) {
for(i = 0; i < toemails.emailcount; i++) {
errno = 0;
log_error(LOG_ARGS, "Found To: %s",
toemails.emaillist[i]);
for(j = 0; j < alternates->count; j++) {
if(strcasecmp(alternates->strs[j],
toemails.emaillist[i]) == 0)
intocc = 1;
}
}
for(i = 0; i < ccemails.emailcount; i++) {
errno = 0;
log_error(LOG_ARGS, "Found Cc: %s",
ccemails.emaillist[i]);
for(j = 0; j < alternates->count; j++) {
if(strcasecmp(alternates->strs[j],
ccemails.emaillist[i]) == 0)
intocc = 1;
}
}
}
for(i = 0; i < alternates->count; i++)
myfree(alternates->strs[i]);
if(addrtocc && !intocc) { if(addrtocc && !intocc) {
/* Don't send a mail about denial to the list, but silently /* Don't send a mail about denial to the list, but silently
* discard and exit. Also don't in case of it being turned off * discard and exit. Also don't in case of it being turned off
*/ */
if ((strcasecmp(listaddr, posteraddr) == 0) || if ((strcasecmp(listaddr, posteraddr) == 0) ||
statctrl(listdir, "notoccdenymails")) { statctrl(listdir, "notoccdenymails")) {
log_error(LOG_ARGS, "Discarding %s because list" log_error(LOG_ARGS, "Discarding %s because list"
" address was not in To: or Cc:," " address was not in To: or Cc:,"
" and From: was the list or" " and From: was the list or"
" notoccdenymails was set", " notoccdenymails was set",
skipping to change at line 968 skipping to change at line 1018
myfree(donemailname); myfree(donemailname);
myfree(discardname); myfree(discardname);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} else if (accret == SEND) { } else if (accret == SEND) {
send = 1; send = 1;
} else if (accret == ALLOW) { } else if (accret == ALLOW) {
/* continue processing as normal */ /* continue processing as normal */
} }
} }
if(!send && (statctrl(listdir, "subonlypost") || subonlypost = statctrl(listdir, "subonlypost");
statctrl(listdir, "modnonsubposts"))) { modonlypost = statctrl(listdir, "modonlypost");
modnonsubposts = statctrl(listdir, "modnonsubposts");
/* modnonsubposts implies subonlypost if modonlypost is not set */
if (modnonsubposts && !modonlypost) subonlypost = 1;
if(!send && (subonlypost || modonlypost || modnonsubposts)) {
/* Don't send a mail about denial to the list, but silently /* Don't send a mail about denial to the list, but silently
* discard and exit. */ * discard and exit. */
if (strcasecmp(listaddr, posteraddr) == 0) { if (strcasecmp(listaddr, posteraddr) == 0) {
log_error(LOG_ARGS, "Discarding %s because" log_error(LOG_ARGS, "Discarding %s because"
" subonlypost was set and From: was" " there are sender restrictions but"
" the list address", " From: was the list address",
mailfile); mailfile);
myfree(listaddr); myfree(listaddr);
unlink(donemailname); unlink(donemailname);
myfree(donemailname); myfree(donemailname);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
if(is_subbed(listdir, posteraddr, 0) == SUB_NONE) { if(subonlypost) {
if(statctrl(listdir, "modnonsubposts")) { foundaddr = (is_subbed(listdir, posteraddr, 0) !=
moderated = 1; SUB_NONE);
} else if (modonlypost) {
foundaddr = is_moderator(listdir, posteraddr, NULL);
}
if(!foundaddr) {
if(modnonsubposts) {
moderated = 1;
if (subonlypost)
modreason = MODNONSUBPOSTS; modreason = MODNONSUBPOSTS;
else if (modonlypost)
modreason = MODNONMODPOSTS;
} else { } else {
if(statctrl(listdir, "nosubonlydenymails")) { if((subonlypost &&
log_error(LOG_ARGS, "Discarding %s because" statctrl(listdir, "nosubonlydenymails")) ||
" subonlypost and" (modonlypost &&
" nosubonlydenymails was set", statctrl(listdir, "nomodonlydenymails"))) {
mailfile); log_error(LOG_ARGS, "Discarding %s because"
myfree(listaddr); " no{sub|mod}onlydenymails was set",
unlink(donemailname); mailfile);
myfree(donemailname);
exit(EXIT_SUCCESS);
}
listdelim = getlistdelim(listdir);
listname = genlistname(listaddr);
listfqdn = genlistfqdn(listaddr);
fromaddr = concatstr(4, listname, listdelim,
"bounces-help@", listfqdn);
txt = open_text(listdir, "deny", "post",
"subonlypost", NULL, "subonlypost");
MY_ASSERT(txt);
register_unformatted(txt, "subject", subject);
register_unformatted(txt, "posteraddr", posteradd
r);
register_originalmail(txt, donemailname);
queuefilename = prepstdreply(txt, listdir,
"$listowner$", posteraddr, NULL);
MY_ASSERT(queuefilename)
close_text(txt);
myfree(listaddr); myfree(listaddr);
myfree(listdelim);
myfree(listname);
myfree(listfqdn);
unlink(donemailname); unlink(donemailname);
myfree(donemailname); myfree(donemailname);
execlp(mlmmjsend, mlmmjsend, exit(EXIT_SUCCESS);
"-L", listdir, }
"-l", "1", listdelim = getlistdelim(listdir);
"-T", posteraddr, listname = genlistname(listaddr);
"-F", fromaddr, listfqdn = genlistfqdn(listaddr);
"-m", queuefilename, (char *)NULL); fromaddr = concatstr(4, listname, listdelim,
"bounces-help@", listfqdn);
if (subonlypost) {
txt = open_text(listdir, "deny", "post",
"subonlypost", NULL, "subonlypost");
} else if (modonlypost) {
txt = open_text(listdir, "deny", "post",
"modonlypost", NULL, NULL);
}
MY_ASSERT(txt);
register_unformatted(txt, "subject", subject);
register_unformatted(txt, "posteraddr", posteraddr);
register_originalmail(txt, donemailname);
queuefilename = prepstdreply(txt, listdir,
"$listowner$", posteraddr, NULL);
MY_ASSERT(queuefilename)
close_text(txt);
myfree(listaddr);
myfree(listdelim);
myfree(listname);
myfree(listfqdn);
unlink(donemailname);
myfree(donemailname);
execlp(mlmmjsend, mlmmjsend,
"-L", listdir,
"-l", "1",
"-T", posteraddr,
"-F", fromaddr,
"-m", queuefilename, (char *)NULL);
log_error(LOG_ARGS, "execlp() of '%s' failed", ml log_error(LOG_ARGS, "execlp() of '%s' failed", mlmmjs
mmjsend); end);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
} }
if(!send && !moderated) { if(!send && !moderated) {
if(statctrl(listdir, "moderated")) { if(statctrl(listdir, "moderated")) {
moderated = 1; moderated = 1;
modreason = MODERATED; modreason = MODERATED;
} }
} }
 End of changes. 38 change blocks. 
126 lines changed or deleted 199 lines changed or added

Home  |  About  |  All  |  Newest  |  Fossies Dox  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTPS