From cae1a561fde5ac302060d4af9cf7762e9f95ea0d Mon Sep 17 00:00:00 2001 From: leitner Date: Mon, 12 Jan 2004 22:09:41 +0000 Subject: [PATCH] integrate Linux sendfile into trysendfile.c infrastructure first stab at AIX 5 sendfile support --- Makefile | 2 +- io/io_sendfile.c | 48 ++++++++++++++++++++++++------------------------ trysendfile.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 2d44f41..2d4b3fe 100644 --- a/Makefile +++ b/Makefile @@ -548,7 +548,7 @@ clean: rm -f *.o *.a *.da *.bbg *.bb core t haveip6.h haven2i.h \ havesl.h haveinline.h iopause.h select.h havekqueue.h haveepoll.h \ libepoll havesigio.h havebsdsf.h havesendfile.h havescope.h havedevpoll.h \ -Makefile dep +Makefile dep libsocket INCLUDES=buffer.h byte.h fmt.h ip4.h ip6.h mmap.h scan.h socket.h str.h stralloc.h \ uint16.h uint32.h uint64.h open.h textcode.h tai.h taia.h dns.h iopause.h case.h \ diff --git a/io/io_sendfile.c b/io/io_sendfile.c index 97751fa..27590ee 100644 --- a/io/io_sendfile.c +++ b/io/io_sendfile.c @@ -17,30 +17,6 @@ int64 io_sendfile(int64 s,int64 fd,uint64 off,uint64 n) { return (errno==EAGAIN?(sbytes?sbytes:-1):-3); return n; } -#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; - io_entry* e=array_get(&io_fds,sizeof(io_entry),s); - off_t i=sendfile(s,fd,&o,n); - if (i==-1) { - if (e) { - e->canwrite=0; - e->next_write=-1; - } - if (errno!=EAGAIN) i=-3; - } - return i; -} #elif defined(HAVE_SENDFILE) @@ -67,6 +43,30 @@ int64 io_sendfile(int64 out,int64 in,uint64 off,uint64 bytes) { return sendfile64(out,in,&o,bytes); } +#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; + io_entry* e=array_get(&io_fds,sizeof(io_entry),s); + off_t i=sendfile(s,fd,&o,n); + if (i==-1) { + if (e) { + e->canwrite=0; + e->next_write=-1; + } + if (errno!=EAGAIN) i=-3; + } + return i; +} #endif #else diff --git a/trysendfile.c b/trysendfile.c index 84b4501..6b7e544 100644 --- a/trysendfile.c +++ b/trysendfile.c @@ -34,6 +34,48 @@ int main() { perror("sendfile"); return 0; } +#elif defined (_AIX) + +#define _FILE_OFFSET_BITS 64 +#include +#include +#include +#include + +int main() { + int fd=open("havesendfile.c",0); + struct sf_parms p; + int destfd=1; + p.header_data="header"; + p.header_length=6; + p.file_descriptor=fd; + p.file_offset=0; + p.file_bytes=23; + p.trailer_data="footer"; + p.trailer_length=6; + if (send_file(&destfd,&p,0)>=0) + printf("sent %lu bytes.\n",p.bytes_sent); +} +#elif defined(__linux__) + +#define _FILE_OFFSET_BITS 64 +#if defined(__GLIBC__) +#include +#elif defined(__dietlibc__) +#include +#else +#include +_syscall4(int,sendfile,int,out,int,in,long *,offset,unsigned long,count) +#endif + +int main() { + int fd=open("havesendfile.c",0); + off_t o=0; + off_t r=sendfile(1,fd,&o,23); + if (r!=-1) + printf("sent %llu bytes.\n",r); +} + #else #error unsupported architecture #endif