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

Comparing libeio/eio.c (file contents):
Revision 1.51 by root, Thu Jan 7 18:08:21 2010 UTC vs.
Revision 1.54 by root, Tue Feb 23 14:32:45 2010 UTC

137/* used for struct dirent, AIX doesn't provide it */ 137/* used for struct dirent, AIX doesn't provide it */
138#ifndef NAME_MAX 138#ifndef NAME_MAX
139# define NAME_MAX 4096 139# define NAME_MAX 4096
140#endif 140#endif
141 141
142/* used for readlink etc. */
143#ifndef PATH_MAX
144# define PATH_MAX 4096
145#endif
146
142/* buffer size for various temporary buffers */ 147/* buffer size for various temporary buffers */
143#define EIO_BUFSIZE 65536 148#define EIO_BUFSIZE 65536
144 149
145#define dBUF \ 150#define dBUF \
146 char *eio_buf; \ 151 char *eio_buf; \
919 */ 924 */
920 { 925 {
921 off_t sbytes; 926 off_t sbytes;
922 res = sendfile (ifd, ofd, offset, count, 0, &sbytes, 0); 927 res = sendfile (ifd, ofd, offset, count, 0, &sbytes, 0);
923 928
929 #if 0 /* according to the manpage, this is correct, but broken behaviour */
924 /* freebsd' sendfile will return 0 when success */ 930 /* freebsd' sendfile will return 0 on success */
925 if (res == 0 && sbytes) 931 /* freebsd 8 documents it as only setting *sbytes on EINTR and EAGAIN, but */
926 /* 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)
927 res = sbytes; 939 res = sbytes;
928 } 940 }
929 941
930# elif defined (__APPLE__) 942# elif defined (__APPLE__)
931 943
932 { 944 {
933 off_t sbytes = count; 945 off_t sbytes = count;
934 res = sendfile (ifd, ofd, offset, &sbytes, 0, 0); 946 res = sendfile (ifd, ofd, offset, &sbytes, 0, 0);
935 947
936 if (res == 0 && errno == EAGAIN && sbytes) 948 /* according to the manpage, sbytes is always valid */
949 if (sbytes)
937 res = sbytes; 950 res = sbytes;
938 } 951 }
939 952
940# elif __hpux 953# elif __hpux
941 res = sendfile (ofd, ifd, offset, count, 0, 0); 954 res = sendfile (ofd, ifd, offset, count, 0, 0);
1600 case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; 1613 case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break;
1601 case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; 1614 case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break;
1602 case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; 1615 case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break;
1603 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;
1604 1617
1605 case EIO_READLINK: ALLOC (NAME_MAX); 1618 case EIO_READLINK: ALLOC (PATH_MAX);
1606 req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; 1619 req->result = readlink (req->ptr1, req->ptr2, PATH_MAX); break;
1607 1620
1608 case EIO_SYNC: req->result = 0; sync (); break; 1621 case EIO_SYNC: req->result = 0; sync (); break;
1609 case EIO_FSYNC: req->result = fsync (req->int1); break; 1622 case EIO_FSYNC: req->result = fsync (req->int1); break;
1610 case EIO_FDATASYNC: req->result = fdatasync (req->int1); break; 1623 case EIO_FDATASYNC: req->result = fdatasync (req->int1); break;
1611 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;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines