+ o More memory debugging
0.7.1
o Fix bug with .reciptto and .mailfrom getting swapped
o Plug a few small memory leaks in mlmmj-maintd
-README mlmmj-0.7.0 Jun 9th 2004
+README mlmmj-0.7.1 Jun 10th 2004
This is an attempt at implementing a mailing list manager with the same
functionality as the brilliant ezmlm, but with a decent license and mail server
NOTE: Don't forget newaliases.
4) Start mlmmj-maintd (remember full path when starting it!) or add it to
- crontab with -F switch. If using it in daemon mode, keep an eye on it
- everyonce in a while to check it's running, or to make sure it's not turning
- into a memory hog. In the case it should happen, please tell us!
- For now the recommended way is to run it via cron:
+ crontab with -F switch. The recommended way for now is to run it via cron:
"0 */2 * * * /usr/bin/mlmmj-maintd -F -L /var/spool/mlmmj/mlmmj-test"
o listname+get functionality
o web interface
-An ever ongoing TODO is we need someone to run it all through valgrind or
-similar and plug all memory and fd leaks etc.
#define LOG_ARGS __FILE__, __LINE__, strerror(errno)
void log_set_name(const char *name);
+void log_free_name(void);
void log_error(const char *file, int line, const char *errstr,
const char *fmt, ...);
log_name = strdup(name);
}
+void log_free_name()
+{
+ free(log_name);
+}
+
void log_error(const char *file, int line, const char *errstr,
const char *fmt, ...)
{
free(listaddr);
free(listfqdn);
free(listname);
+ free(indexstr);
probefile = concatstr(4, listdir, "/bounce/", addr, "-probe");
MY_ASSERT(probefile);
free(bfilename);
exit(EXIT_FAILURE);
}
- free(bfilename);
/* TODO check that the message is not already bounced */
rename(mailname, savename);
free(savename);
}
+ free(bfilename);
return EXIT_SUCCESS;
}
return 1;
}
+ free(dirname);
+
while((dp = readdir(queuedir)) != NULL) {
if((strcmp(dp->d_name, "..") == 0) ||
(strcmp(dp->d_name, ".") == 0))
{
int opt, daemonize = 1;
char *bindir, *listdir = NULL, *mlmmjsend, *mlmmjbounce, *mlmmjunsub;
- char *logstr, *logname, *random = random_str();
+ char *logstr, *logname, *random;
char uidstr[16];
struct stat st;
}
for(;;) {
+ random = random_str();
logname = concatstr(3, listdir, "maintdlog-", random);
+ free(random);
maintdlogfd = open(logname, O_WRONLY|O_EXCL|O_CREAT,
S_IRUSR|S_IWUSR);
if(maintdlogfd < 0) {
+ free(logname);
log_error(LOG_ARGS, "Could not open maintenance logfile");
exit(EXIT_FAILURE);
}
else
sleep(MAINTD_SLEEP);
}
+
+ free(mlmmjbounce);
+ free(mlmmjsend);
+ free(mlmmjunsub);
+
+ log_free_name();
exit(EXIT_SUCCESS);
}
if(confirmsub)
confirm_sub(listdir, listaddr, address, mlmmjsend);
+ free(listaddr);
+
return EXIT_SUCCESS;
}
confirm_unsub(listdir, listaddr, address, mlmmjsend);
}
closedir(subddir);
+ free(listaddr);
return EXIT_SUCCESS;
}