You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.5 KiB
47 lines
1.5 KiB
--- procmail-3.22/src/mailfold.c.truncate 2007-03-27 13:24:05.000000000 +0200 |
|
+++ procmail-3.22/src/mailfold.c 2007-03-27 13:25:06.000000000 +0200 |
|
@@ -30,6 +30,7 @@ |
|
|
|
int logopened,rawnonl; |
|
off_t lasttell; |
|
+static int trunced; |
|
static long lastdump; |
|
static volatile int mailread; /* if the mail is completely read in already */ |
|
static struct dyna_array confield; /* escapes, concatenations */ |
|
@@ -81,6 +82,7 @@ |
|
long len; |
|
{ int i;long part; |
|
lasttell=i= -1;SETerrno(EBADF); |
|
+ trunced=0; |
|
if(s>=0) |
|
{ if(ft_lock(type)&&(lseek(s,(off_t)0,SEEK_END),fdlock(s))) |
|
nlog("Kernel-lock failed\n"); |
|
@@ -120,13 +122,18 @@ |
|
} |
|
writefin: |
|
i=type!=ft_PIPE&&fsync(s)&&errno!=EINVAL; /* EINVAL => wasn't a file */ |
|
+ if ((i||len)&&lasttell>=0) |
|
+ { int serrno=errno; |
|
+ if(!ftruncate(s,lasttell)) trunced=1; |
|
+ SETerrno(serrno); |
|
+ } |
|
if(ft_lock(type)) |
|
{ int serrno=errno; /* save any error information */ |
|
if(fdunlock()) |
|
nlog("Kernel-unlock failed\n"); |
|
SETerrno(serrno); |
|
} |
|
- i=rclose(s)||i; |
|
+ i=rclose(s)||i; /* if this fails, we should truncate, but it's too late */ |
|
} /* return an error even if nothing was to be sent */ |
|
return i&&!len?-1:len; |
|
} |
|
@@ -237,7 +244,7 @@ |
|
#endif |
|
default:writeerr(buf); |
|
} |
|
- if(lasttell>=0&&!truncate(boxname,lasttell)&&(logopened||verbose)) |
|
+ if(lasttell>=0&&trunced&&(logopened||verbose)) |
|
nlog("Truncated file to former size\n"); /* undo garbage */ |
|
ret0: return 0; |
|
}
|
|
|