… | |
… | |
80 | # include <utime.h> |
80 | # include <utime.h> |
81 | # include <signal.h> |
81 | # include <signal.h> |
82 | # include <dirent.h> |
82 | # include <dirent.h> |
83 | |
83 | |
84 | /* POSIX_SOURCE is useless on bsd's, and XOPEN_SOURCE is unreliable there, too */ |
84 | /* POSIX_SOURCE is useless on bsd's, and XOPEN_SOURCE is unreliable there, too */ |
85 | # if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) |
85 | # if __freebsd || defined __NetBSD__ || defined __OpenBSD__ |
86 | # define _DIRENT_HAVE_D_TYPE /* sigh */ |
86 | # define _DIRENT_HAVE_D_TYPE /* sigh */ |
87 | # define D_INO(de) (de)->d_fileno |
87 | # define D_INO(de) (de)->d_fileno |
88 | # define D_NAMLEN(de) (de)->d_namlen |
88 | # define D_NAMLEN(de) (de)->d_namlen |
89 | # elif defined(__linux) || defined(d_ino) || _XOPEN_SOURCE >= 600 |
89 | # elif __linux || defined d_ino || _XOPEN_SOURCE >= 600 |
90 | # define D_INO(de) (de)->d_ino |
90 | # define D_INO(de) (de)->d_ino |
91 | # endif |
91 | # endif |
92 | |
92 | |
93 | #ifdef _D_EXACT_NAMLEN |
93 | #ifdef _D_EXACT_NAMLEN |
94 | # undef D_NAMLEN |
94 | # undef D_NAMLEN |
… | |
… | |
106 | #endif |
106 | #endif |
107 | |
107 | |
108 | #if HAVE_SENDFILE |
108 | #if HAVE_SENDFILE |
109 | # if __linux |
109 | # if __linux |
110 | # include <sys/sendfile.h> |
110 | # include <sys/sendfile.h> |
111 | # elif __freebsd |
111 | # elif __freebsd || defined __APPLE__ |
112 | # include <sys/socket.h> |
112 | # include <sys/socket.h> |
113 | # include <sys/uio.h> |
113 | # include <sys/uio.h> |
114 | # elif __hpux |
114 | # elif __hpux |
115 | # include <sys/socket.h> |
115 | # include <sys/socket.h> |
116 | # elif __solaris /* not yet */ |
116 | # elif __solaris |
117 | # include <sys/sendfile.h> |
117 | # include <sys/sendfile.h> |
|
|
118 | # elif defined _WIN32 |
118 | # else |
119 | # else |
119 | # error sendfile support requested but not available |
120 | # error sendfile support requested but not available |
120 | # endif |
121 | # endif |
121 | #endif |
122 | #endif |
122 | |
123 | |
… | |
… | |
923 | if (res < 0 && sbytes) |
924 | if (res < 0 && sbytes) |
924 | /* maybe only on EAGAIN: as usual, the manpage leaves you guessing */ |
925 | /* maybe only on EAGAIN: as usual, the manpage leaves you guessing */ |
925 | res = sbytes; |
926 | res = sbytes; |
926 | } |
927 | } |
927 | |
928 | |
|
|
929 | # elif defined __APPLE__ |
|
|
930 | |
|
|
931 | { |
|
|
932 | off_t bytes = count; |
|
|
933 | res = sendfile (ifd, ofd, offset, &bytes, 0, 0); |
|
|
934 | |
|
|
935 | if (res < 0 && errno == EAGAIN && bytes) |
|
|
936 | res = sbytes; |
|
|
937 | } |
|
|
938 | |
928 | # elif __hpux |
939 | # elif __hpux |
929 | res = sendfile (ofd, ifd, offset, count, 0, 0); |
940 | res = sendfile (ofd, ifd, offset, count, 0, 0); |
930 | |
941 | |
931 | # elif __solaris |
942 | # elif __solaris |
932 | { |
943 | { |
… | |
… | |
943 | if (res < 0 && sbytes) |
954 | if (res < 0 && sbytes) |
944 | res = sbytes; |
955 | res = sbytes; |
945 | } |
956 | } |
946 | |
957 | |
947 | # endif |
958 | # endif |
|
|
959 | #elif defined _WIN32 |
|
|
960 | |
|
|
961 | /* does not work, just for documentation of what would need to be done */ |
|
|
962 | { |
|
|
963 | HANDLE h = TO_SOCKET (ifd); |
|
|
964 | SetFilePointer (h, offset, 0, FILE_BEGIN); |
|
|
965 | res = TransmitFile (TO_SOCKET (ofd), h, count, 0, 0, 0, 0); |
|
|
966 | } |
|
|
967 | |
948 | #else |
968 | #else |
949 | res = -1; |
969 | res = -1; |
950 | errno = ENOSYS; |
970 | errno = ENOSYS; |
951 | #endif |
971 | #endif |
952 | |
972 | |
… | |
… | |
1371 | |
1391 | |
1372 | if (!page) |
1392 | if (!page) |
1373 | page = sysconf (_SC_PAGESIZE); |
1393 | page = sysconf (_SC_PAGESIZE); |
1374 | #endif |
1394 | #endif |
1375 | |
1395 | |
|
|
1396 | /* round down to start of page, although this is probably useless */ |
1376 | addr &= ~(page - 1); /* assume page size is always a power of two */ |
1397 | addr &= ~(page - 1); /* assume page size is always a power of two */ |
1377 | |
1398 | |
1378 | if (addr < end) |
1399 | if (addr < end) |
1379 | if (flags) /* modify */ |
1400 | if (flags) /* modify */ |
1380 | do { *((volatile sig_atomic_t *)addr) |= 0; } while ((addr += page) < len); |
1401 | do { *((volatile sig_atomic_t *)addr) |= 0; } while ((addr += page) < len); |