Recently we had a bug report of xfs_io frozen on a file, which ended up being a pipe, and xfs_io was waiting for data on the other side of the pipe. Although xfs_io was not stuck due a bug itself, we can do better and check the file type before opening the file. xfs_io has very limited usage on pipes, so, just check and deny opening of FIFO files. Signed-off-by: Carlos Maiolino <cmaiolino@xxxxxxxxxx> --- I belive having a generic helper to check the file type may have other uses too, so I opted to make it a generic helper. include/libfrog.h | 2 ++ io/open.c | 6 ++++++ libfrog/util.c | 12 ++++++++++++ 3 files changed, 20 insertions(+) diff --git a/include/libfrog.h b/include/libfrog.h index d33f0146..693d026d 100644 --- a/include/libfrog.h +++ b/include/libfrog.h @@ -5,7 +5,9 @@ */ #ifndef __LIBFROG_UTIL_H_ #define __LIBFROG_UTIL_H_ +#include <sys/types.h> unsigned int log2_roundup(unsigned int i); +unsigned int check_file_type(char *name, mode_t mode); #endif /* __LIBFROG_UTIL_H_ */ diff --git a/io/open.c b/io/open.c index 6ea3e9a2..25f44b64 100644 --- a/io/open.c +++ b/io/open.c @@ -9,6 +9,7 @@ #include "init.h" #include "io.h" #include "libxfs.h" +#include "libfrog.h" #ifndef __O_TMPFILE #if defined __alpha__ @@ -59,6 +60,11 @@ openfile( int fd; int oflags; + if (check_file_type(path, S_IFIFO)) { + fprintf(stderr, _("xfs_io does not work on FIFO files\n")); + return -1; + } + oflags = flags & IO_READONLY ? O_RDONLY : O_RDWR; if (flags & IO_APPEND) oflags |= O_APPEND; diff --git a/libfrog/util.c b/libfrog/util.c index ff935184..de0b8542 100644 --- a/libfrog/util.c +++ b/libfrog/util.c @@ -5,6 +5,9 @@ */ #include "platform_defs.h" #include "libfrog.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> /* * libfrog is a collection of miscellaneous userspace utilities. @@ -22,3 +25,12 @@ log2_roundup(unsigned int i) } return rval; } + +unsigned int +check_file_type(char *name, mode_t mode) +{ + struct stat sb; + + lstat(name, &sb); + return (sb.st_mode & mode); +} -- 2.17.1