diff options
Diffstat (limited to 'input/input.c')
-rw-r--r-- | input/input.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/input/input.c b/input/input.c index 8651e83fbc..c366ca76e4 100644 --- a/input/input.c +++ b/input/input.c @@ -1759,18 +1759,19 @@ struct input_ctx *mp_input_init(struct input_conf *input_conf) if (input_conf->in_file) { struct stat st; - if (stat(input_conf->in_file, &st)) - mp_tmsg(MSGT_INPUT, MSGL_ERR, "Can't stat %s: %s\n", input_conf->in_file, strerror(errno)); - else { - int in_file_fd = open(input_conf->in_file, - S_ISFIFO(st.st_mode) ? O_RDWR : O_RDONLY); - if(in_file_fd >= 0) - mp_input_add_cmd_fd(ictx, in_file_fd, 1, NULL, - (mp_close_func_t)close); - else - mp_tmsg(MSGT_INPUT, MSGL_ERR, "Can't open %s: %s\n", - input_conf->in_file, strerror(errno)); - } + int mode = O_RDONLY; + // Use RDWR for FIFOs to ensure they stay open over multiple accesses. + // Note that on Windows stat may fail for named pipes, but due to how the + // API works, using RDONLY should be ok. + if (stat(input_conf->in_file, &st) == 0 && S_ISFIFO(st.st_mode)) + mode = O_RDWR; + int in_file_fd = open(input_conf->in_file, mode); + if(in_file_fd >= 0) + mp_input_add_cmd_fd(ictx, in_file_fd, 1, NULL, + (mp_close_func_t)close); + else + mp_tmsg(MSGT_INPUT, MSGL_ERR, "Can't open %s: %s\n", + input_conf->in_file, strerror(errno)); } return ictx; } |