The branch, master has been updated
       via  96340e6 s3: add Darwin sendfile support and merge with the FreeBSD 
code
       via  887cebf s3:waf: add Darwin sendfile() test
       via  d347c8d s3:configure: add Darwin sendfile() test
      from  115a88e lib/param: Merge "Filename Handling" section from 
source3/param

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 96340e60b7f7ff86a49cbb822ae9170812114dcd
Author: Björn Jacke <[email protected]>
Date:   Fri Jun 29 20:16:18 2012 +0200

    s3: add Darwin sendfile support and merge with the FreeBSD code
    
    This is based on the adpotion of the FreeBSD sendfile code that was done by
    James Peach for Darwin.
    
    Autobuild-User(master): Björn Jacke <[email protected]>
    Autobuild-Date(master): Thu Jul 26 17:19:09 CEST 2012 on sn-devel-104

commit 887cebffd06c1a9e8b3979c209cebf230de49d45
Author: Björn Jacke <[email protected]>
Date:   Mon Jul 2 12:47:06 2012 +0200

    s3:waf: add Darwin sendfile() test

commit d347c8d5775261a59679bc7ecd3b5e9b5b9ccca7
Author: Björn Jacke <[email protected]>
Date:   Fri Jun 29 20:13:57 2012 +0200

    s3:configure: add Darwin sendfile() test

-----------------------------------------------------------------------

Summary of changes:
 source3/configure.in   |   32 ++++++++++++++++
 source3/lib/sendfile.c |   94 ++++++++++++++++++++++-------------------------
 source3/wscript        |   23 ++++++++++++
 3 files changed, 99 insertions(+), 50 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/configure.in b/source3/configure.in
index 6a26038..bd21db9 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -5649,7 +5649,39 @@ samba_cv_HAVE_SENDFILE=yes,samba_cv_HAVE_SENDFILE=no)])
                AC_MSG_RESULT(no);
        fi
        ;;
+       *darwin*)
+               AC_CACHE_CHECK([for Darwin sendfile support],
+                       samba_cv_HAVE_SENDFILE,
+                       [
+                       AC_TRY_LINK([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+                       ],
+                       [
+       int fromfd, tofd, ret;
+       off_t offset, nwritten;
+       struct sf_hdtr hdr;
+       struct iovec hdtrl;
+       hdr.headers = &hdtrl;
+       hdr.hdr_cnt = 1;
+       hdr.trailers = (void *)0;
+       hdr.trl_cnt = 0;
+       hdtrl.iov_base = (void *)0;
+       hdtrl.iov_len = 0;
+       ret = sendfile(fromfd, tofd, offset, &nwritten, &hdr, 0);
+                       ],
+                       samba_cv_HAVE_SENDFILE=yes,
+                       samba_cv_HAVE_SENDFILE=no)])
 
+       if test x"$samba_cv_HAVE_SENDFILE" = x"yes"; then
+               AC_DEFINE(HAVE_SENDFILE,1,[Whether sendfile() support is 
available])
+               AC_DEFINE(DARWIN_SENDFILE_API,1,[Whether the Darwin sendfile() 
API is available])
+               AC_DEFINE(WITH_SENDFILE,1,[Whether sendfile() support should be 
included])
+       else
+               AC_MSG_RESULT(no);
+       fi
+       ;;
        *hpux*|*osf*)
                AC_CACHE_CHECK([for osf/hpux sendfile 
support],samba_cv_HAVE_SENDFILE,[
                AC_TRY_LINK([\
diff --git a/source3/lib/sendfile.c b/source3/lib/sendfile.c
index 196ef68..d5fd5a6 100644
--- a/source3/lib/sendfile.c
+++ b/source3/lib/sendfile.c
@@ -248,80 +248,74 @@ ssize_t sys_sendfile(int tofd, int fromfd, const 
DATA_BLOB *header, off_t offset
        return count + hdr_len;
 }
 
-#elif defined(FREEBSD_SENDFILE_API)
+#elif defined(FREEBSD_SENDFILE_API) || defined(DARWIN_SENDFILE_API)
 
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/uio.h>
 
-ssize_t sys_sendfile(int tofd, int fromfd, const DATA_BLOB *header, off_t 
offset, size_t count)
+ssize_t sys_sendfile(int tofd, int fromfd,
+           const DATA_BLOB *header, off_t offset, size_t count)
 {
-       size_t total=0;
-       struct sf_hdtr hdr;
-       struct iovec hdtrl;
-       size_t hdr_len = 0;
+       struct sf_hdtr  sf_header = {0};
+       struct iovec    io_header = {0};
 
-       hdr.headers = &hdtrl;
-       hdr.hdr_cnt = 1;
-       hdr.trailers = NULL;
-       hdr.trl_cnt = 0;
+       off_t   nwritten;
+       int     ret;
 
-       /* Set up the header iovec. */
        if (header) {
-               hdtrl.iov_base = (void *)header->data;
-               hdtrl.iov_len = hdr_len = header->length;
-       } else {
-               hdtrl.iov_base = NULL;
-               hdtrl.iov_len = 0;
+               sf_header.headers = &io_header;
+               sf_header.hdr_cnt = 1;
+               io_header.iov_base = header->data;
+               io_header.iov_len = header->length;
+               sf_header.trailers = NULL;
+               sf_header.trl_cnt = 0;
        }
 
-       total = count;
-       while (total + hdtrl.iov_len) {
-               off_t nwritten;
-               int ret;
-
-               /*
-                * FreeBSD sendfile returns 0 on success, -1 on error.
-                * Remember, the tofd and fromfd are reversed..... :-).
-                * nwritten includes the header data sent.
-                */
+       while (count != 0) {
 
-               do {
-                       ret = sendfile(fromfd, tofd, offset, total, &hdr, 
&nwritten, 0);
+               nwritten = count;
+#if defined(DARWIN_SENDFILE_API)
+               /* Darwin recycles nwritten as a value-result parameter, apart 
from that this
+                  sendfile implementation is quite the same as the FreeBSD one 
*/
+               ret = sendfile(fromfd, tofd, offset, &nwritten, &sf_header, 0);
+#else
+               ret = sendfile(fromfd, tofd, offset, count, &sf_header, 
&nwritten, 0);
+#endif
 #if defined(EWOULDBLOCK)
-               } while (ret == -1 && (errno == EINTR || errno == EAGAIN || 
errno == EWOULDBLOCK));
+               if (ret == -1 && errno != EINTR && errno != EAGAIN && errno != 
EWOULDBLOCK) {
 #else
-               } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
+               if (ret == -1 && errno != EINTR && errno != EAGAIN) {
 #endif
-               if (ret == -1)
+                       /* Send failed, we are toast. */
                        return -1;
+               }
 
-               if (nwritten == 0)
-                       return -1; /* I think we're at EOF here... */
-
-               /*
-                * If this was a short (signal interrupted) write we may need
-                * to subtract it from the header data, or null out the header
-                * data altogether if we wrote more than hdtrl.iov_len bytes.
-                * We change nwritten to be the number of file bytes written.
-                */
+               if (nwritten == 0) {
+                       /* EOF of offset is after EOF. */
+                       break;
+               }
 
-               if (hdtrl.iov_base && hdtrl.iov_len) {
-                       if (nwritten >= hdtrl.iov_len) {
-                               nwritten -= hdtrl.iov_len;
-                               hdtrl.iov_base = NULL;
-                               hdtrl.iov_len = 0;
+               if (sf_header.hdr_cnt) {
+                       if (io_header.iov_len <= nwritten) {
+                               /* Entire header was sent. */
+                               sf_header.headers = NULL;
+                               sf_header.hdr_cnt = 0;
+                               nwritten -= io_header.iov_len;
                        } else {
-                               hdtrl.iov_base =
-                                   (void *)((caddr_t)hdtrl.iov_base + 
nwritten);
-                               hdtrl.iov_len -= nwritten;
+                               /* Partial header was sent. */
+                               io_header.iov_len -= nwritten;
+                               io_header.iov_base =
+                                   ((uint8_t *)io_header.iov_base) + nwritten;
                                nwritten = 0;
                        }
                }
-               total -= nwritten;
+
                offset += nwritten;
+               count -= nwritten;
        }
-       return count + hdr_len;
+
+       return nwritten;
 }
 
 #elif defined(AIX_SENDFILE_API)
diff --git a/source3/wscript b/source3/wscript
index 91ffc25..0be9a43 100755
--- a/source3/wscript
+++ b/source3/wscript
@@ -1061,6 +1061,29 @@ main() {
                 conf.DEFINE('HAVE_SENDFILE', '1')
                 conf.DEFINE('FREEBSD_SENDFILE_API', '1')
                 conf.DEFINE('WITH_SENDFILE', '1')
+        elif (host_os.rfind('darwin') > -1):
+            conf.CHECK_CODE('''
+                            #include <sys/types.h>
+                            #include <sys/socket.h>
+                            #include <sys/uio.h>
+                            int fromfd, tofd, ret;
+                            off_t offset, nwritten;
+                            struct sf_hdtr hdr;
+                            struct iovec hdtrl;
+                            hdr.headers = &hdtrl;
+                            hdr.hdr_cnt = 1;
+                            hdr.trailers = (void *)0;
+                            hdr.trl_cnt = 0;
+                            hdtrl.iov_base = (void *)0;
+                            hdtrl.iov_len = 0;
+                           ret = sendfile(fromfd, tofd, offset, &nwritten, 
&hdr, 0);
+                            ''',
+                            '_HAVE_SENDFILE',
+                            msg='Checking for darwin sendfile support')
+            if conf.CONFIG_SET('_HAVE_SENDFILE'):
+                conf.DEFINE('HAVE_SENDFILE', '1')
+                conf.DEFINE('DARWIN_SENDFILE_API', '1')
+                conf.DEFINE('WITH_SENDFILE', '1')
         elif (host_os.rfind('hpux') > -1) or (host_os.rfind('osf') > -1):
             conf.CHECK_CODE('''
                             #include <sys/socket.h>


-- 
Samba Shared Repository

Reply via email to