/*
- * $Id: ad_sendfile.c,v 1.9 2008-12-03 18:35:44 didg Exp $
+ * $Id: ad_sendfile.c,v 1.10 2009-10-25 09:47:04 didg Exp $
*
* Copyright (c) 1999 Adrian Sun (asun@zoology.washington.edu)
* All rights reserved. See COPYRIGHT.
#include <errno.h>
#include <atalk/logger.h>
-
#include "ad_private.h"
#if defined(LINUX_BROKEN_SENDFILE_API)
ssize_t sys_sendfile(int tofd, int fromfd, off_t *offset, size_t count)
{
-u_int32_t small_total = 0;
+u_int32_t small_total;
int32_t small_offset;
+int32_t nwritten;
/*
* Fix for broken Linux 2.4 systems with no working sendfile64().
errno = ENOSYS;
return -1;
}
- small_total = (u_int32_t)count;
small_offset = (int32_t)*offset;
-
- while (small_total) {
- int32_t nwritten;
- do {
- nwritten = sendfile(tofd, fromfd, &small_offset, small_total);
- } while (nwritten == -1 && errno == EINTR);
- if (nwritten == -1)
- return -1;
- if (nwritten == 0)
- return -1; /* I think we're at EOF here... */
- small_total -= nwritten;
- }
- *offset += count;
- return count;
+ small_total = (u_int32_t)count;
+ nwritten = sendfile(tofd, fromfd, &small_offset, small_total);
+ if (nwritten > = 0)
+ *offset += nwritten;
+
+ return nwritten;
}
#elif defined(SENDFILE_FLAVOR_LINUX)
ssize_t sys_sendfile(int tofd, int fromfd, off_t *offset, size_t count)
{
-size_t total=0;
-
- total = count;
- while (total) {
- ssize_t nwritten;
- do {
- nwritten = sendfile(tofd, fromfd, offset, total);
- } while (nwritten == -1 && errno == EINTR);
- if (nwritten == -1)
- return -1;
- if (nwritten == 0)
- return -1; /* I think we're at EOF here... */
- total -= nwritten;
- }
- return count;
+ return sendfile(tofd, fromfd, offset, count);
}
#elif defined(SENDFILE_FLAVOR_BSD )
/* FIXME untested */
+#error sendfile semantic broken
#include <sys/sendfile.h>
ssize_t sys_sendfile(int tofd, int fromfd, off_t *offset, size_t count)
{
#endif
/* ------------------------------- */
-static int ad_sendfile_init(const struct adouble *ad,
+int ad_readfile_init(const struct adouble *ad,
const int eid, off_t *off,
const int end)
{
*off = ad_size(ad, eid) - *off;
if (eid == ADEID_DFORK) {
- fd = ad_dfileno(ad);
+ fd = ad_data_fileno(ad);
} else {
*off += ad_getentryoff(ad, eid);
- fd = ad_hfileno(ad);
+ fd = ad_reso_fileno(ad);
}
return fd;
}
-/* --------------------------------
- * read from adouble file and write to socket. sendfile doesn't change
- * the file pointer position. */
-ssize_t ad_readfile(const struct adouble *ad, const int eid,
- const int sock, off_t off, const size_t len)
-{
- off_t cc;
- int fd;
-
- fd = ad_sendfile_init(ad, eid, &off, 0);
- cc = sys_sendfile(sock, fd, &off, len);
- return cc;
-}
-
/* ------------------------ */
#if 0
#ifdef HAVE_SENDFILE_WRITE