diff --git a/sim_fio.c b/sim_fio.c index a5819d29..820d0adc 100644 --- a/sim_fio.c +++ b/sim_fio.c @@ -369,10 +369,35 @@ int sim_set_fsize (FILE *fptr, t_addr size) { return _chsize(_fileno(fptr), (long)size); } + +int sim_set_fifo_nonblock (FILE *fptr) +{ +return -1; +} + #else /* !defined(_WIN32) */ #include int sim_set_fsize (FILE *fptr, t_addr size) { return ftruncate(fileno(fptr), (off_t)size); } + +#include +#include + +int sim_set_fifo_nonblock (FILE *fptr) +{ +struct stat stbuf; + +if (!fptr || fstat (fileno(fptr), &stbuf)) + return -1; +#if defined(S_IFIFO) && defined(O_NONBLOCK) +if ((stbuf.st_mode & S_IFIFO)) { + int flags = fcntl(fileno(fptr), F_GETFL, 0); + return fcntl(fileno(fptr), F_SETFL, flags | O_NONBLOCK); + } +#endif +return -1; +} + #endif diff --git a/sim_fio.h b/sim_fio.h index 9089a1f2..65d77612 100644 --- a/sim_fio.h +++ b/sim_fio.h @@ -54,6 +54,7 @@ FILE *sim_fopen (const char *file, const char *mode); int sim_fseek (FILE *st, t_addr offset, int whence); int sim_fseeko (FILE *st, t_offset offset, int whence); int sim_set_fsize (FILE *fptr, t_addr size); +int sim_set_fifo_nonblock (FILE *fptr); size_t sim_fread (void *bptr, size_t size, size_t count, FILE *fptr); size_t sim_fwrite (void *bptr, size_t size, size_t count, FILE *fptr); uint32 sim_fsize (FILE *fptr);