Re: Disappearing emails in bsd-mailx 8.1.2-0.200909
Debian Bug report logs - #642940
Hello,
Nobody replied to this bug report. Am I the only one
with this problem (or maybe the only one still using
mailx)?
Anyhow, I attach a temporary fix. The attached program
fixmail.c will automatically fix your mailbox. I run
my e-mail via the mailx script (also attached) that
will automatically run fixmail.
There are certainly better ways to do this... but the
most important is not losing e-mails!
Cheers,
Franco
/* Fixes corrupt files due to buggy bsd-mailx */
/* that "forgets" line feed between messages */
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdarg.h>
#define MAXLINE 10000
void error(const char *fmt,...)
{
va_list ap;
va_start(ap,fmt);
fprintf(stderr, "fixmail: ");
vfprintf(stderr,fmt,ap);
putc('\n',stderr);
va_end(ap);
exit(EXIT_FAILURE);
}
int fgetline(FILE *flp,char buffer[],const int max,const int sklead)
{
int i,c;
i = 0;
while ((c=getc(flp))!='\n' && c!=EOF)
if ((i<max-1 || max==-1) && !(sklead && i==0 && isspace(c)))
buffer[i++] = c;
if (i<=max-1 || max==-1)
buffer[i]='\0';
if (c==EOF && i==0)
return -1;
if (c==EOF)
ungetc(c,flp);
return (i+1);
}
FILE *ffopen(const char *path,const char *fln, const char *mode)
{
char buffer[MAXLINE];
FILE *flp;
sprintf(buffer,"%s%s",path,fln);
if ((flp=fopen(buffer,mode))==NULL)
error("ffopen(): Couldn't open file %s.",buffer);
return flp;
}
int ssystem(const char *string)
{
int excode;
if ((excode=system(string))!=0 && string!=NULL)
error("ssystem(\"%s\"): exit code %d.", string, excode);
return(excode);
}
int main(int n, char *p[])
{
FILE *in, *out;
char *infln, outfln[MAXLINE], tmpfln[MAXLINE];
char buffer[MAXLINE];
int l, old_l = 1, fix=0;
if (TMP_MAX<2)
error("Can't make temporary files: this system has TMP_MAX<2");
if (n > 1)
infln = p[1];
else
if ((infln = getenv("MAIL"))==NULL)
error("Undefined $MAIL");
in = ffopen("", infln, "r");
tmpnam(outfln);
out = ffopen("", outfln, "w");
while ((l = fgetline(in, buffer, MAXLINE, 0)) > 0)
{
if (l >= MAXLINE)
error("%s: Long buffer: %100.100s", infln, buffer);
if (strncmp(buffer, "From ", 5)==0 && old_l > 1)
{
putc('\n', out);
if (!fix)
printf("Fixing %s:\n", infln);
printf(" %s\n", buffer);
++fix;
}
fprintf(out, "%s\n", buffer);
old_l = l;
}
fclose(out);
fclose(in);
if (fix > 0)
{
tmpnam(tmpfln);
sprintf(buffer, "cp %s %s", infln, tmpfln);
ssystem(buffer);
sprintf(buffer, "cp %s %s", outfln, infln);
ssystem(buffer);
printf("fixmail: %d fixes applied (%s backed up as %s).\n",
fix, infln, tmpfln);
}
}
exec mail $*
fixmail