… | |
… | |
231 | #define D_NAME(entp) entp.cFileName |
231 | #define D_NAME(entp) entp.cFileName |
232 | #define D_TYPE(entp) (entp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? DT_DIR : DT_REG) |
232 | #define D_TYPE(entp) (entp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? DT_DIR : DT_REG) |
233 | |
233 | |
234 | #else |
234 | #else |
235 | |
235 | |
|
|
236 | #include <sys/ioctl.h> |
236 | #include <sys/time.h> |
237 | #include <sys/time.h> |
237 | #include <sys/select.h> |
238 | #include <sys/select.h> |
238 | #include <unistd.h> |
239 | #include <unistd.h> |
239 | #include <signal.h> |
240 | #include <signal.h> |
240 | #include <dirent.h> |
241 | #include <dirent.h> |
… | |
… | |
297 | # elif __solaris |
298 | # elif __solaris |
298 | # include <sys/sendfile.h> |
299 | # include <sys/sendfile.h> |
299 | # else |
300 | # else |
300 | # error sendfile support requested but not available |
301 | # error sendfile support requested but not available |
301 | # endif |
302 | # endif |
|
|
303 | #endif |
|
|
304 | |
|
|
305 | #if HAVE_RENAMEAT2 |
|
|
306 | # include <sys/syscall.h> |
|
|
307 | # include <linux/fs.h> |
302 | #endif |
308 | #endif |
303 | |
309 | |
304 | #ifndef D_TYPE |
310 | #ifndef D_TYPE |
305 | # define D_TYPE(de) 0 |
311 | # define D_TYPE(de) 0 |
306 | #endif |
312 | #endif |
… | |
… | |
1677 | } |
1683 | } |
1678 | } |
1684 | } |
1679 | |
1685 | |
1680 | #if HAVE_AT |
1686 | #if HAVE_AT |
1681 | |
1687 | |
|
|
1688 | static int |
|
|
1689 | eio__renameat2 (int olddirfd, const char *oldpath, int newdirfd, const char *newpath, unsigned int flags) |
|
|
1690 | { |
|
|
1691 | #if HAVE_RENAMEAT2 |
|
|
1692 | return syscall (SYS_renameat2, olddirfd, oldpath, newdirfd, newpath, flags); |
|
|
1693 | #else |
|
|
1694 | if (flags) |
|
|
1695 | return EIO_ENOSYS (); |
|
|
1696 | |
|
|
1697 | return renameat (olddirfd, oldpath, newdirfd, newpath); |
|
|
1698 | #endif |
|
|
1699 | } |
|
|
1700 | |
1682 | /* they forgot these */ |
1701 | /* they forgot these */ |
1683 | |
1702 | |
1684 | static int |
1703 | static int |
1685 | eio__truncateat (int dirfd, const char *path, off_t length) |
1704 | eio__truncateat (int dirfd, const char *path, off_t length) |
1686 | { |
1705 | { |
… | |
… | |
1842 | case EIO_RMDIR: /* complications arise because "." cannot be removed, so we might have to expand */ |
1861 | case EIO_RMDIR: /* complications arise because "." cannot be removed, so we might have to expand */ |
1843 | req->result = req->wd && SINGLEDOT (req->ptr1) |
1862 | req->result = req->wd && SINGLEDOT (req->ptr1) |
1844 | ? rmdir (req->wd->str) |
1863 | ? rmdir (req->wd->str) |
1845 | : unlinkat (dirfd, req->ptr1, AT_REMOVEDIR); break; |
1864 | : unlinkat (dirfd, req->ptr1, AT_REMOVEDIR); break; |
1846 | case EIO_MKDIR: req->result = mkdirat (dirfd, req->ptr1, (mode_t)req->int2); break; |
1865 | case EIO_MKDIR: req->result = mkdirat (dirfd, req->ptr1, (mode_t)req->int2); break; |
|
|
1866 | case EIO_RENAME: req->result = eio__renameat2 ( |
|
|
1867 | dirfd, |
1847 | case EIO_RENAME: /* complications arise because "." cannot be renamed, so we might have to expand */ |
1868 | /* complications arise because "." cannot be renamed, so we might have to expand */ |
1848 | req->result = req->wd && SINGLEDOT (req->ptr1) |
1869 | req->wd && SINGLEDOT (req->ptr1) ? req->wd->str : req->ptr1, |
1849 | ? rename (req->wd->str, req->ptr2) |
1870 | WD2FD ((eio_wd)req->int3), |
1850 | : renameat (dirfd, req->ptr1, WD2FD ((eio_wd)req->int3), req->ptr2); break; |
1871 | req->ptr2, |
|
|
1872 | req->int2 |
|
|
1873 | ); |
|
|
1874 | break; |
1851 | case EIO_LINK: req->result = linkat (dirfd, req->ptr1, WD2FD ((eio_wd)req->int3), req->ptr2, 0); break; |
1875 | case EIO_LINK: req->result = linkat (dirfd, req->ptr1, WD2FD ((eio_wd)req->int3), req->ptr2, 0); break; |
1852 | case EIO_SYMLINK: req->result = symlinkat (req->ptr1, dirfd, req->ptr2); break; |
1876 | case EIO_SYMLINK: req->result = symlinkat (req->ptr1, dirfd, req->ptr2); break; |
1853 | case EIO_MKNOD: req->result = mknodat (dirfd, req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; |
1877 | case EIO_MKNOD: req->result = mknodat (dirfd, req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; |
1854 | case EIO_STATVFS: ALLOC (sizeof (EIO_STRUCT_STATVFS)); |
1878 | case EIO_STATVFS: ALLOC (sizeof (EIO_STRUCT_STATVFS)); |
1855 | req->result = eio__statvfsat (dirfd, req->ptr1, (EIO_STRUCT_STATVFS *)req->ptr2); break; |
1879 | req->result = eio__statvfsat (dirfd, req->ptr1, (EIO_STRUCT_STATVFS *)req->ptr2); break; |
… | |
… | |
1897 | case EIO_OPEN: req->result = open (path , req->int1, (mode_t)req->int2); break; |
1921 | case EIO_OPEN: req->result = open (path , req->int1, (mode_t)req->int2); break; |
1898 | |
1922 | |
1899 | case EIO_UNLINK: req->result = unlink (path ); break; |
1923 | case EIO_UNLINK: req->result = unlink (path ); break; |
1900 | case EIO_RMDIR: req->result = rmdir (path ); break; |
1924 | case EIO_RMDIR: req->result = rmdir (path ); break; |
1901 | case EIO_MKDIR: req->result = mkdir (path , (mode_t)req->int2); break; |
1925 | case EIO_MKDIR: req->result = mkdir (path , (mode_t)req->int2); break; |
1902 | case EIO_RENAME: req->result = rename (path , req->ptr2); break; |
1926 | case EIO_RENAME: req->result = req->int2 ? EIO_ENOSYS () : rename (path, req->ptr2); break; |
1903 | case EIO_LINK: req->result = link (path , req->ptr2); break; |
1927 | case EIO_LINK: req->result = link (path , req->ptr2); break; |
1904 | case EIO_SYMLINK: req->result = symlink (path , req->ptr2); break; |
1928 | case EIO_SYMLINK: req->result = symlink (path , req->ptr2); break; |
1905 | case EIO_MKNOD: req->result = mknod (path , (mode_t)req->int2, (dev_t)req->offs); break; |
1929 | case EIO_MKNOD: req->result = mknod (path , (mode_t)req->int2, (dev_t)req->offs); break; |
1906 | case EIO_STATVFS: ALLOC (sizeof (EIO_STRUCT_STATVFS)); |
1930 | case EIO_STATVFS: ALLOC (sizeof (EIO_STRUCT_STATVFS)); |
1907 | req->result = statvfs (path , (EIO_STRUCT_STATVFS *)req->ptr2); break; |
1931 | req->result = statvfs (path , (EIO_STRUCT_STATVFS *)req->ptr2); break; |