17 /* don't want to block when open()ing a fifo */
18 #if defined(O_NONBLOCK)
19 # define FIFO_NONBLOCK O_NONBLOCK
21 # define FIFO_NONBLOCK 0
24 int stream_open(stream
*f
, const buffer
*fn
) {
35 if (-1 == (fd
= open(fn
->ptr
, O_RDONLY
| O_BINARY
| FIFO_NONBLOCK
))) {
39 if (-1 == fstat(fd
, &st
)) {
44 if (0 == st
.st_size
) {
45 /* empty file doesn't need a mapping */
50 f
->start
= mmap(NULL
, st
.st_size
, PROT_READ
, MAP_SHARED
, fd
, 0);
52 if (MAP_FAILED
== f
->start
) {
53 f
->start
= malloc((size_t)st
.st_size
);
55 || st
.st_size
!= read(fd
, f
->start
, (size_t)st
.st_size
)) {
79 fh
= CreateFile(fn
->ptr
,
84 FILE_ATTRIBUTE_READONLY
,
89 if (0 != GetFileSizeEx(fh
, &fsize
)) {
99 mh
= CreateFileMapping( fh
,
102 (sizeof(off_t
) > 4) ? fsize
>> 32 : 0,
110 FORMAT_MESSAGE_ALLOCATE_BUFFER |
111 FORMAT_MESSAGE_FROM_SYSTEM,
114 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
122 p
= MapViewOfFile(mh
,
131 f
->size
= (off_t
)fsize
;
138 int stream_close(stream
*f
) {
143 munmap(f
->start
, f
->size
);
148 #elif defined(__WIN32)
149 if (f
->start
) UnmapViewOfFile(f
->start
);