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

Comparing libeio/eio.c (file contents):
Revision 1.50 by root, Thu Jan 7 17:18:08 2010 UTC vs.
Revision 1.54 by root, Tue Feb 23 14:32:45 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
136/* used for struct dirent, AIX doesn't provide it */ 137/* used for struct dirent, AIX doesn't provide it */
137#ifndef NAME_MAX 138#ifndef NAME_MAX
138# define NAME_MAX 4096 139# define NAME_MAX 4096
139#endif 140#endif
140 141
142/* used for readlink etc. */
143#ifndef PATH_MAX
144# define PATH_MAX 4096
145#endif
146
141/* buffer size for various temporary buffers */ 147/* buffer size for various temporary buffers */
142#define EIO_BUFSIZE 65536 148#define EIO_BUFSIZE 65536
143 149
144#define dBUF \ 150#define dBUF \
145 char *eio_buf; \ 151 char *eio_buf; \
918 */ 924 */
919 { 925 {
920 off_t sbytes; 926 off_t sbytes;
921 res = sendfile (ifd, ofd, offset, count, 0, &sbytes, 0); 927 res = sendfile (ifd, ofd, offset, count, 0, &sbytes, 0);
922 928
929 #if 0 /* according to the manpage, this is correct, but broken behaviour */
923 /* freebsd' sendfile will return 0 when success */ 930 /* freebsd' sendfile will return 0 on success */
924 if (res == 0 && sbytes) 931 /* freebsd 8 documents it as only setting *sbytes on EINTR and EAGAIN, but */
925 /* maybe only on EAGAIN: as usual, the manpage leaves you guessing */ 932 /* not on e.g. EIO or EPIPE - sounds broken */
933 if ((res < 0 && (errno == EAGAIN || errno == EINTR) && sbytes) || res == 0)
934 res = sbytes;
935 #endif
936
937 /* according to source inspection, this is correct, and useful behaviour */
938 if (sbytes)
926 res = sbytes; 939 res = sbytes;
927 } 940 }
928 941
929# elif defined (__APPLE__) 942# elif defined (__APPLE__)
930 943
931 { 944 {
932 off_t sbytes = count; 945 off_t sbytes = count;
933 res = sendfile (ifd, ofd, offset, &sbytes, 0, 0); 946 res = sendfile (ifd, ofd, offset, &sbytes, 0, 0);
934 947
935 if (res == 0 && errno == EAGAIN && sbytes) 948 /* according to the manpage, sbytes is always valid */
949 if (sbytes)
936 res = sbytes; 950 res = sbytes;
937 } 951 }
938 952
939# elif __hpux 953# elif __hpux
940 res = sendfile (ofd, ifd, offset, count, 0, 0); 954 res = sendfile (ofd, ifd, offset, count, 0, 0);
1576 case EIO_LSTAT: ALLOC (sizeof (EIO_STRUCT_STAT)); 1590 case EIO_LSTAT: ALLOC (sizeof (EIO_STRUCT_STAT));
1577 req->result = lstat (req->ptr1, (EIO_STRUCT_STAT *)req->ptr2); break; 1591 req->result = lstat (req->ptr1, (EIO_STRUCT_STAT *)req->ptr2); break;
1578 case EIO_FSTAT: ALLOC (sizeof (EIO_STRUCT_STAT)); 1592 case EIO_FSTAT: ALLOC (sizeof (EIO_STRUCT_STAT));
1579 req->result = fstat (req->int1, (EIO_STRUCT_STAT *)req->ptr2); break; 1593 req->result = fstat (req->int1, (EIO_STRUCT_STAT *)req->ptr2); break;
1580 1594
1595 case EIO_STATVFS: ALLOC (sizeof (EIO_STRUCT_STATVFS));
1596 req->result = statvfs (req->ptr1, (EIO_STRUCT_STATVFS *)req->ptr2); break;
1597 case EIO_FSTATVFS: ALLOC (sizeof (EIO_STRUCT_STATVFS));
1598 req->result = fstatvfs (req->int1, (EIO_STRUCT_STATVFS *)req->ptr2); break;
1599
1581 case EIO_CHOWN: req->result = chown (req->ptr1, req->int2, req->int3); break; 1600 case EIO_CHOWN: req->result = chown (req->ptr1, req->int2, req->int3); break;
1582 case EIO_FCHOWN: req->result = fchown (req->int1, req->int2, req->int3); break; 1601 case EIO_FCHOWN: req->result = fchown (req->int1, req->int2, req->int3); break;
1583 case EIO_CHMOD: req->result = chmod (req->ptr1, (mode_t)req->int2); break; 1602 case EIO_CHMOD: req->result = chmod (req->ptr1, (mode_t)req->int2); break;
1584 case EIO_FCHMOD: req->result = fchmod (req->int1, (mode_t)req->int2); break; 1603 case EIO_FCHMOD: req->result = fchmod (req->int1, (mode_t)req->int2); break;
1585 case EIO_TRUNCATE: req->result = truncate (req->ptr1, req->offs); break; 1604 case EIO_TRUNCATE: req->result = truncate (req->ptr1, req->offs); break;
1594 case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; 1613 case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break;
1595 case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; 1614 case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break;
1596 case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; 1615 case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break;
1597 case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->int3); break; 1616 case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->int3); break;
1598 1617
1599 case EIO_READLINK: ALLOC (NAME_MAX); 1618 case EIO_READLINK: ALLOC (PATH_MAX);
1600 req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; 1619 req->result = readlink (req->ptr1, req->ptr2, PATH_MAX); break;
1601 1620
1602 case EIO_SYNC: req->result = 0; sync (); break; 1621 case EIO_SYNC: req->result = 0; sync (); break;
1603 case EIO_FSYNC: req->result = fsync (req->int1); break; 1622 case EIO_FSYNC: req->result = fsync (req->int1); break;
1604 case EIO_FDATASYNC: req->result = fdatasync (req->int1); break; 1623 case EIO_FDATASYNC: req->result = fdatasync (req->int1); break;
1605 case EIO_MSYNC: req->result = eio__msync (req->ptr2, req->size, req->int1); break; 1624 case EIO_MSYNC: req->result = eio__msync (req->ptr2, req->size, req->int1); break;
1732eio_req *eio_fstat (int fd, int pri, eio_cb cb, void *data) 1751eio_req *eio_fstat (int fd, int pri, eio_cb cb, void *data)
1733{ 1752{
1734 REQ (EIO_FSTAT); req->int1 = fd; SEND; 1753 REQ (EIO_FSTAT); req->int1 = fd; SEND;
1735} 1754}
1736 1755
1756eio_req *eio_fstatvfs (int fd, int pri, eio_cb cb, void *data)
1757{
1758 REQ (EIO_FSTATVFS); req->int1 = fd; SEND;
1759}
1760
1737eio_req *eio_futime (int fd, double atime, double mtime, int pri, eio_cb cb, void *data) 1761eio_req *eio_futime (int fd, double atime, double mtime, int pri, eio_cb cb, void *data)
1738{ 1762{
1739 REQ (EIO_FUTIME); req->int1 = fd; req->nv1 = atime; req->nv2 = mtime; SEND; 1763 REQ (EIO_FUTIME); req->int1 = fd; req->nv1 = atime; req->nv2 = mtime; SEND;
1740} 1764}
1741 1765
1811} 1835}
1812 1836
1813eio_req *eio_lstat (const char *path, int pri, eio_cb cb, void *data) 1837eio_req *eio_lstat (const char *path, int pri, eio_cb cb, void *data)
1814{ 1838{
1815 return eio__1path (EIO_LSTAT, path, pri, cb, data); 1839 return eio__1path (EIO_LSTAT, path, pri, cb, data);
1840}
1841
1842eio_req *eio_statvfs (const char *path, int pri, eio_cb cb, void *data)
1843{
1844 return eio__1path (EIO_STATVFS, path, pri, cb, data);
1816} 1845}
1817 1846
1818eio_req *eio_unlink (const char *path, int pri, eio_cb cb, void *data) 1847eio_req *eio_unlink (const char *path, int pri, eio_cb cb, void *data)
1819{ 1848{
1820 return eio__1path (EIO_UNLINK, path, pri, cb, data); 1849 return eio__1path (EIO_UNLINK, path, pri, cb, data);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines