-/* $Cambridge: exim/src/src/transports/tf_maildir.c,v 1.4 2005/02/17 11:58:27 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/tf_maildir.c,v 1.7 2005/06/27 14:29:45 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
Returns: the sum of the sizes of the messages
*/
-int
+off_t
maildir_compute_size(uschar *path, int *filecount, time_t *latest,
const pcre *regex, const pcre *dir_regex, BOOL timestamp_only)
{
DIR *dir;
-int sum = 0;
+off_t sum = 0;
struct dirent *ent;
struct stat statbuf;
debug_printf("maildir_compute_size (timestamp_only): %ld\n",
(long int) *latest);
else
- debug_printf("maildir_compute_size: path=%s\n sum=%d filecount=%d "
- "timestamp=%ld\n", path, sum, *filecount, (long int) *latest);
+ debug_printf("maildir_compute_size: path=%s\n sum=" OFF_T_FMT
+ " filecount=%d timestamp=%ld\n",
+ path, sum, *filecount, (long int) *latest);
}
return sum;
}
int
maildir_ensure_sizefile(uschar *path, appendfile_transport_options_block *ob,
- const pcre *regex, const pcre *dir_regex, int *returned_size,
+ const pcre *regex, const pcre *dir_regex, off_t *returned_size,
int *returned_filecount)
{
int count, fd;
-int cached_quota = 0;
+off_t cached_quota = 0;
int cached_quota_filecount = 0;
-int size = 0;
int filecount = 0;
int linecount = 0;
+off_t size = 0;
uschar *filename;
uschar buffer[MAX_FILE_SIZE];
uschar *ptr = buffer;
for (;;)
{
- long int n = Ustrtol(ptr, &endptr, 10);
+ off_t n = (off_t)Ustrtod(ptr, &endptr);
/* Only two data items are currently defined; ignore any others that
may be present. The spec is for a number followed by a letter. Anything
else we reject and recalculate. */
if (*endptr == 'S') cached_quota = n;
- else if (*endptr == 'C') cached_quota_filecount = n;
+ else if (*endptr == 'C') cached_quota_filecount = (int)n;
if (!isalpha(*endptr++))
{
DEBUG(D_transport)
{
DEBUG(D_transport)
debug_printf("cached quota is out of date: recalculating\n"
- " quota=%d cached_quota=%d filecount_quota=%d "
- "cached_quota_filecount=%d\n", ob->quota_value, cached_quota,
- ob->quota_filecount_value, cached_quota_filecount);
+ " quota=" OFF_T_FMT " cached_quota=" OFF_T_FMT " filecount_quota=%d "
+ "cached_quota_filecount=%d\n", ob->quota_value,
+ cached_quota, ob->quota_filecount_value, cached_quota_filecount);
goto RECALCULATE;
}
if (*endptr == 0) break;
linecount++;
ptr = endptr;
- size += Ustrtol(ptr, &endptr, 10);
+ size += (off_t)Ustrtod(ptr, &endptr);
if (*endptr != ' ') break;
ptr = endptr + 1;
filecount += Ustrtol(ptr, &endptr, 10);
if (size < 0 || filecount < 0)
{
DEBUG(D_transport) debug_printf("negative value in maildirsize "
- "(size=%d count=%d): recalculating\n", size, filecount);
+ "(size=" OFF_T_FMT " count=%d): recalculating\n", size, filecount);
goto RECALCULATE;
}
RECALCULATE:
- if (fd >= 0) close(fd);
+ if (fd >= 0) (void)close(fd);
old_latest = 0;
filecount = 0;
size = maildir_compute_size(path, &filecount, &old_latest, regex, dir_regex,
fd = Uopen(tempname, O_RDWR|O_CREAT|O_EXCL, 0600);
if (fd >= 0)
{
- (void)sprintf(CS buffer, "%dS,%dC\n%d %d\n", ob->quota_value,
- ob->quota_filecount_value, size, filecount);
+ (void)sprintf(CS buffer, OFF_T_FMT "S,%dC\n" OFF_T_FMT " %d\n",
+ ob->quota_value, ob->quota_filecount_value, size, filecount);
len = Ustrlen(buffer);
if (write(fd, buffer, len) != len || Urename(tempname, filename) < 0)
{
- close(fd);
+ (void)close(fd);
fd = -1;
}
}
DEBUG(D_transport) debug_printf("abandoning maildirsize because of "
"a later subdirectory modification\n");
(void)Uunlink(filename);
- close(fd);
+ (void)close(fd);
fd = -1;
}
}
/* Return the sizes and the file descriptor, if any */
-DEBUG(D_transport) debug_printf("returning maildir size=%d filecount=%d\n",
- size, filecount);
+DEBUG(D_transport) debug_printf("returning maildir size=" OFF_T_FMT
+ " filecount=%d\n", size, filecount);
*returned_size = size;
*returned_filecount = filecount;
return fd;