From dfe75af4bd063ca34c64c86bf5bab0edec56e9ba Mon Sep 17 00:00:00 2001 From: leitner Date: Mon, 8 Sep 2003 17:36:31 +0000 Subject: [PATCH] add io_sendfile with BSD support --- io.h | 4 ++++ io/io_sendfile.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 io/io_sendfile.c diff --git a/io.h b/io.h index 5edf66b..880e7e3 100644 --- a/io.h +++ b/io.h @@ -63,4 +63,8 @@ void io_closeonexec(int64 d); void io_close(int64 d); +/* send n bytes from file fd starting at offset off to socket s */ +/* return number of bytes written */ +int64 io_sendfile(int64 s,int64 fd,uint64 off,uint64 n); + #endif diff --git a/io/io_sendfile.c b/io/io_sendfile.c new file mode 100644 index 0000000..d23b5a7 --- /dev/null +++ b/io/io_sendfile.c @@ -0,0 +1,58 @@ +#define _FILE_OFFSET_BITS 64 +#include "io_internal.h" + +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) +#include +#include +#include + +int64 io_sendfile(int64 s,int64 fd,uint64 off,uint64 n) { + off_t sbytes; + int r=sendfile(fd,s,off,n,0,&sbytes,0); + if (r==0) return n; + if (r==-1) + return (errno==EAGAIN?sbytes:-1); +} +#elif defined(__linux__) + +#if defined(__GLIBC__) +#include +#elif defined(__dietlibc__) +#include +#else +#include +_syscall4(int,sendfile,int,out,int,in,long *,offset,unsigned long,count) +#endif + +int64 io_sendfile(int64 s,int64 fd,uint64 off,uint64 n) { + off_t o=off; + return sendfile(s,fd,&o,n); +} + +#else + +#define BUFSIZE 16384 + +int64 io_sendfile(int64 out,int64 in,uint64 off,uint64 bytes) { + char buf[BUFSIZE]; + int n,m; + uint64 sent=0; + if (lseek(in,off,SEEK_SET) != off) + return -1; + while (bytes>0) { + char* tmp=buf; + if ((n=read(in,tmp,(bytes0) { + if ((m=write(out,tmp,n))<0) + goto abort; + sent+=m; + n-=m; + tmp+=m; + } + } +abort: + return sent; +} + +#endif