ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libeio/eio.c
(Generate patch)

Comparing libeio/eio.c (file contents):
Revision 1.49 by root, Sat Jan 2 14:24:32 2010 UTC vs.
Revision 1.53 by root, Sat Jan 9 10:03:09 2010 UTC

49#include <stdlib.h> 49#include <stdlib.h>
50#include <string.h> 50#include <string.h>
51#include <errno.h> 51#include <errno.h>
52#include <sys/types.h> 52#include <sys/types.h>
53#include <sys/stat.h> 53#include <sys/stat.h>
54#include <sys/statvfs.h>
54#include <limits.h> 55#include <limits.h>
55#include <fcntl.h> 56#include <fcntl.h>
56#include <assert.h> 57#include <assert.h>
57 58
58#ifndef EIO_FINISH 59#ifndef EIO_FINISH
80# include <utime.h> 81# include <utime.h>
81# include <signal.h> 82# include <signal.h>
82# include <dirent.h> 83# include <dirent.h>
83 84
84/* POSIX_SOURCE is useless on bsd's, and XOPEN_SOURCE is unreliable there, too */ 85/* POSIX_SOURCE is useless on bsd's, and XOPEN_SOURCE is unreliable there, too */
85# if __freebsd || defined __NetBSD__ || defined __OpenBSD__ 86# if __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__
86# define _DIRENT_HAVE_D_TYPE /* sigh */ 87# define _DIRENT_HAVE_D_TYPE /* sigh */
87# define D_INO(de) (de)->d_fileno 88# define D_INO(de) (de)->d_fileno
88# define D_NAMLEN(de) (de)->d_namlen 89# define D_NAMLEN(de) (de)->d_namlen
89# elif __linux || defined d_ino || _XOPEN_SOURCE >= 600 90# elif __linux || defined d_ino || _XOPEN_SOURCE >= 600
90# define D_INO(de) (de)->d_ino 91# define D_INO(de) (de)->d_ino
106#endif 107#endif
107 108
108#if HAVE_SENDFILE 109#if HAVE_SENDFILE
109# if __linux 110# if __linux
110# include <sys/sendfile.h> 111# include <sys/sendfile.h>
111# elif __freebsd || defined __APPLE__ 112# elif __FreeBSD__ || defined __APPLE__
112# include <sys/socket.h> 113# include <sys/socket.h>
113# include <sys/uio.h> 114# include <sys/uio.h>
114# elif __hpux 115# elif __hpux
115# include <sys/socket.h> 116# include <sys/socket.h>
116# elif __solaris 117# elif __solaris
909 910
910#if HAVE_SENDFILE 911#if HAVE_SENDFILE
911# if __linux 912# if __linux
912 res = sendfile (ofd, ifd, &offset, count); 913 res = sendfile (ofd, ifd, &offset, count);
913 914
914# elif __freebsd 915# elif __FreeBSD__
915 /* 916 /*
916 * Of course, the freebsd sendfile is a dire hack with no thoughts 917 * Of course, the freebsd sendfile is a dire hack with no thoughts
917 * wasted on making it similar to other I/O functions. 918 * wasted on making it similar to other I/O functions.
918 */ 919 */
919 { 920 {
920 off_t sbytes; 921 off_t sbytes;
921 res = sendfile (ifd, ofd, offset, count, 0, &sbytes, 0); 922 res = sendfile (ifd, ofd, offset, count, 0, &sbytes, 0);
922 923
923 if (res < 0 && sbytes) 924 #if 0 /* according to the manpage, this is correct, but broken behaviour */
924 /* maybe only on EAGAIN: as usual, the manpage leaves you guessing */ 925 /* freebsd' sendfile will return 0 on success */
926 /* freebsd 8 documents it as only setting *sbytes on EINTR and EAGAIN, but */
927 /* not on e.g. EIO or EPIPE - sounds broken */
928 if ((res < 0 && (errno == EAGAIN || errno == EINTR) && sbytes) || res == 0)
929 res = sbytes;
930 #endif
931
932 /* according to source inspection, this is correct, and useful behaviour */
933 if (sbytes)
925 res = sbytes; 934 res = sbytes;
926 } 935 }
927 936
928# elif defined (__APPLE__) 937# elif defined (__APPLE__)
929 938
930 { 939 {
931 off_t sbytes = count; 940 off_t sbytes = count;
932 res = sendfile (ifd, ofd, offset, &sbytes, 0, 0); 941 res = sendfile (ifd, ofd, offset, &sbytes, 0, 0);
933 942
934 if (res < 0 && errno == EAGAIN && sbytes) 943 /* according to the manpage, sbytes is always valid */
944 if (sbytes)
935 res = sbytes; 945 res = sbytes;
936 } 946 }
937 947
938# elif __hpux 948# elif __hpux
939 res = sendfile (ofd, ifd, offset, count, 0, 0); 949 res = sendfile (ofd, ifd, offset, count, 0, 0);
1575 case EIO_LSTAT: ALLOC (sizeof (EIO_STRUCT_STAT)); 1585 case EIO_LSTAT: ALLOC (sizeof (EIO_STRUCT_STAT));
1576 req->result = lstat (req->ptr1, (EIO_STRUCT_STAT *)req->ptr2); break; 1586 req->result = lstat (req->ptr1, (EIO_STRUCT_STAT *)req->ptr2); break;
1577 case EIO_FSTAT: ALLOC (sizeof (EIO_STRUCT_STAT)); 1587 case EIO_FSTAT: ALLOC (sizeof (EIO_STRUCT_STAT));
1578 req->result = fstat (req->int1, (EIO_STRUCT_STAT *)req->ptr2); break; 1588 req->result = fstat (req->int1, (EIO_STRUCT_STAT *)req->ptr2); break;
1579 1589
1590 case EIO_STATVFS: ALLOC (sizeof (EIO_STRUCT_STATVFS));
1591 req->result = statvfs (req->ptr1, (EIO_STRUCT_STATVFS *)req->ptr2); break;
1592 case EIO_FSTATVFS: ALLOC (sizeof (EIO_STRUCT_STATVFS));
1593 req->result = fstatvfs (req->int1, (EIO_STRUCT_STATVFS *)req->ptr2); break;
1594
1580 case EIO_CHOWN: req->result = chown (req->ptr1, req->int2, req->int3); break; 1595 case EIO_CHOWN: req->result = chown (req->ptr1, req->int2, req->int3); break;
1581 case EIO_FCHOWN: req->result = fchown (req->int1, req->int2, req->int3); break; 1596 case EIO_FCHOWN: req->result = fchown (req->int1, req->int2, req->int3); break;
1582 case EIO_CHMOD: req->result = chmod (req->ptr1, (mode_t)req->int2); break; 1597 case EIO_CHMOD: req->result = chmod (req->ptr1, (mode_t)req->int2); break;
1583 case EIO_FCHMOD: req->result = fchmod (req->int1, (mode_t)req->int2); break; 1598 case EIO_FCHMOD: req->result = fchmod (req->int1, (mode_t)req->int2); break;
1584 case EIO_TRUNCATE: req->result = truncate (req->ptr1, req->offs); break; 1599 case EIO_TRUNCATE: req->result = truncate (req->ptr1, req->offs); break;
1731eio_req *eio_fstat (int fd, int pri, eio_cb cb, void *data) 1746eio_req *eio_fstat (int fd, int pri, eio_cb cb, void *data)
1732{ 1747{
1733 REQ (EIO_FSTAT); req->int1 = fd; SEND; 1748 REQ (EIO_FSTAT); req->int1 = fd; SEND;
1734} 1749}
1735 1750
1751eio_req *eio_fstatvfs (int fd, int pri, eio_cb cb, void *data)
1752{
1753 REQ (EIO_FSTATVFS); req->int1 = fd; SEND;
1754}
1755
1736eio_req *eio_futime (int fd, double atime, double mtime, int pri, eio_cb cb, void *data) 1756eio_req *eio_futime (int fd, double atime, double mtime, int pri, eio_cb cb, void *data)
1737{ 1757{
1738 REQ (EIO_FUTIME); req->int1 = fd; req->nv1 = atime; req->nv2 = mtime; SEND; 1758 REQ (EIO_FUTIME); req->int1 = fd; req->nv1 = atime; req->nv2 = mtime; SEND;
1739} 1759}
1740 1760
1810} 1830}
1811 1831
1812eio_req *eio_lstat (const char *path, int pri, eio_cb cb, void *data) 1832eio_req *eio_lstat (const char *path, int pri, eio_cb cb, void *data)
1813{ 1833{
1814 return eio__1path (EIO_LSTAT, path, pri, cb, data); 1834 return eio__1path (EIO_LSTAT, path, pri, cb, data);
1835}
1836
1837eio_req *eio_statvfs (const char *path, int pri, eio_cb cb, void *data)
1838{
1839 return eio__1path (EIO_STATVFS, path, pri, cb, data);
1815} 1840}
1816 1841
1817eio_req *eio_unlink (const char *path, int pri, eio_cb cb, void *data) 1842eio_req *eio_unlink (const char *path, int pri, eio_cb cb, void *data)
1818{ 1843{
1819 return eio__1path (EIO_UNLINK, path, pri, cb, data); 1844 return eio__1path (EIO_UNLINK, path, pri, cb, data);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines