52 int fifo_listen(
const char *path,
int permissions,
int block_mode)
55 static int open_mode = 0;
56 const char *myname =
"fifo_listen";
72 if (unlink(path) && errno != ENOENT)
73 msg_fatal(
"%s: remove %s: %m", myname, path);
74 if (mkfifo(path, permissions) < 0)
75 msg_fatal(
"%s: create fifo %s: %m", myname, path);
78 if ((fd = open(path, O_RDWR | O_NONBLOCK, 0)) < 0)
79 msg_fatal(
"%s: open %s: %m", myname, path);
81 open_mode = O_RDWR | O_NONBLOCK;
84 open_mode = O_RDONLY | O_NONBLOCK;
86 msg_info(
"open O_RDWR makes fifo readable - trying O_RDONLY");
91 if ((fd = open(path, open_mode, 0)) < 0)
92 msg_fatal(
"%s: open %s: %m", myname, path);
100 if (
fstat(fd, &st) < 0)
101 msg_fatal(
"%s: fstat %s: %m", myname, path);
102 if (S_ISFIFO(st.st_mode) == 0)
103 msg_fatal(
"%s: not a fifo: %s", myname, path);
104 if (fchmod(fd, permissions) < 0)
105 msg_fatal(
"%s: fchmod %s: %m", myname, path);
107 while ((count =
peekfd(fd)) > 0
NORETURN msg_fatal(const char *fmt,...)
int fifo_listen(const char *path, int permissions, int block_mode)
int non_blocking(int, int)
void msg_info(const char *fmt,...)