… | |
… | |
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; |