Implement sendfilev and sendfilev64
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Sun, 7 Sep 2008 16:11:34 +0000 (16:11 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Sun, 7 Sep 2008 16:11:34 +0000 (16:11 +0000)
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Versions
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sendfile.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sendfile64.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sendfilev.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sendfilev64.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/sendfile.h

index 7836504..157d261 100644 (file)
@@ -25,7 +25,7 @@ sysdep_routines +=  gethrtime mount umount umount2 systeminfo resolvepath \
     core_set_global_path core_set_options core_set_process_content \
     core_set_process_path getacct putacct wracct sysfs acct allocids \
     idmap_reg idmap_unreg acctctl pcsample settaskid gettaskid getprojid \
-    utssys zone port
+    utssys zone port sendfilev sendfilev64
 sysdep_routines += sys_fdsync sys_sysconfig sys_brk sys_fcntl sys_utssys \
     sys_lwp_private sys_uname sys_getloadavg sys_utimes sys_getpeerucred \
     sys_ucred_get sys_privsys sys_syslabeling sys_putmsg sys_putpmsg \
index 8ea4018..09f39a6 100644 (file)
@@ -41,8 +41,8 @@ libc {
     resolvepath;
 
     # s
-    setpflags; setppriv; settaskid; setustack; strlcat; strlcpy; swapctl;
-    __systemcall; sysfs; systeminfo;
+    sendfilev; sendfilev64; setpflags; setppriv; settaskid; setustack; strlcat;
+    strlcpy; swapctl; __systemcall; sysfs; systeminfo;
 
     # u
     uadmin; ucred_free; ucred_get; ucred_getegid; ucred_geteuid;
index 9cbe3f5..8b05dba 100644 (file)
 #include <sys/sendfile.h>
 #include <errno.h>
 
-DECLARE_INLINE_SYSCALL (ssize_t, sendfilev, int fildes,
-    const struct sendfilevec *vec, int sfvcnt, size_t *xferred);
-
 ssize_t
 sendfile (int out_fd, int in_fd, off_t *offset, size_t count)
 {
-  if(count > 0 && offset == NULL)
-    {
-      __set_errno(EINVAL);
-      return -1;
-    }
-
   sendfilevec_t sfv;
   sfv.sfv_fd = in_fd;
   sfv.sfv_flag = 0;
   sfv.sfv_off = *offset;
   sfv.sfv_len = count;
+  int xferred = 0;
 
-  /* call sendfilev */
-  size_t xferred = 0;
-  int result = INLINE_SYSCALL(sendfilev, 4, out_fd, &sfv, 1, &xferred);
-      return -1;
+  int res = sendfilev (out_fd, &sfv, 1, &xferred);
   *offset += xferred;
-
-  return result;
 }
index efdff7e..9439e0f 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (C) 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
-   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
 #include <sys/sendfile.h>
 #include <errno.h>
 
-DECLARE_INLINE_SYSCALL (ssize_t, sendfilev64, int fildes,
-    const struct sendfilevec64 *vec, int sfvcnt, size_t *xferred);
-
 ssize_t
 sendfile64 (int out_fd, int in_fd, off64_t *offset, size_t count)
 {
-  if (count > 0 && offset == NULL)
-    {
-      __set_errno (EINVAL);
-      return -1;
-    }
-
   sendfilevec64_t sfv;
   sfv.sfv_fd = in_fd;
   sfv.sfv_flag = 0;
   sfv.sfv_off = *offset;
   sfv.sfv_len = count;
+  int xferred = 0;
 
-  /* call sendfilev */
-  size_t xferred = 0;
-  int result = INLINE_SYSCALL (sendfilev64, 4, out_fd, &sfv, 1, &xferred);
-    return -1;
+  int res = sendfilev (out_fd, &sfv, 1, &xferred);
   *offset += xferred;
-
-  return result;
 }
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sendfilev.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sendfilev.c
new file mode 100644 (file)
index 0000000..f5337f2
--- /dev/null
@@ -0,0 +1,35 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <inline-syscall.h>
+#include <sys/sendfile.h>
+#include <errno.h>
+
+DECLARE_INLINE_SYSCALL (size_t, sendfilev, int fildes,
+    const sendfilevec_t *sfv, int count, size_t *xferred);
+
+ssize_t
+sendfilev (int out_fd, const sendfilevec_t *sfv, int count, size_t *xferred)
+{
+  int res = INLINE_SYSCALL (sendfilev, 4, out_fd, sfv, 1, xferred);
+  if (res == -1 && errno == EINTR)
+    return *xferred;
+  else
+    return res;
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sendfilev64.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sendfilev64.c
new file mode 100644 (file)
index 0000000..ba56e97
--- /dev/null
@@ -0,0 +1,35 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <inline-syscall.h>
+#include <sys/sendfile.h>
+#include <errno.h>
+
+DECLARE_INLINE_SYSCALL (size_t, sendfilev64, int fildes,
+    const sendfilevec64_t *sfv, int count, size_t *xferred);
+
+ssize_t
+sendfilev64 (int out_fd, const sendfilevec64_t *sfv, int count, size_t *xferred)
+{
+  int res = INLINE_SYSCALL (sendfilev64, 4, out_fd, sfv, 1, xferred);
+  if (res == -1 && errno == EINTR)
+    return *xferred;
+  else
+    return res;
+}
index 92591de..bb29d07 100644 (file)
 #include <features.h>
 #include <sys/types.h>
 
+#define SENDFILEV      0
+#define SENDFILEV64    1
+
+#define SFV_FD_SELF    (-2)
+
 typedef struct sendfilevec
 {
        int sfv_fd;
@@ -65,6 +70,22 @@ extern ssize_t sendfile64 (int __out_fd, int __in_fd, __off64_t *__offset,
                           size_t __count) __THROW;
 #endif
 
+#ifndef __USE_FILE_OFFSET64
+extern ssize_t sendfilev (int, const sendfilevec_t *,
+                          int, size_t *) __THROW;
+#else
+# ifdef __REDIRECT_NTH
+extern ssize_t __REDIRECT_NTH (sendfilev,
+                              (int, const sendfilevec64_t *, int, size_t *), sendfilev64);
+# else
+#  define sendfilev sendfilev64
+# endif
+#endif
+#ifdef __USE_LARGEFILE64
+extern ssize_t sendfilev64 (int, const sendfilevec64_t *,
+                          int, size_t *) __THROW;
+#endif
+
 __END_DECLS
 
 #endif /* sys/sendfile.h */