pipe-sink: use existing fifo
authorSamo Pogačnik <samo_pogacnik@t-2.net>
Thu, 18 Jan 2018 15:15:18 +0000 (16:15 +0100)
committerGeorg Chini <georg@chini.tk>
Thu, 18 Jan 2018 15:18:25 +0000 (16:18 +0100)
Allow usage of an already existing fifo (named pipe) within the
pipe-sink module. Also, the used fifo is going to be removed upon
module unload only if the fifo is created by the same module.

src/modules/module-pipe-sink.c

index fe2af70..a2074c1 100644 (file)
@@ -78,6 +78,7 @@ struct userdata {
 
     char *filename;
     int fd;
+    bool do_unlink_fifo;
     size_t buffer_size;
     size_t bytes_dropped;
     bool fifo_error;
@@ -450,11 +451,16 @@ int pa__init(pa_module *m) {
     u->write_type = 0;
 
     u->filename = pa_runtime_path(pa_modargs_get_value(ma, "file", DEFAULT_FILE_NAME));
+    u->do_unlink_fifo = false;
 
     if (mkfifo(u->filename, 0666) < 0) {
-        pa_log("mkfifo('%s'): %s", u->filename, pa_cstrerror(errno));
-        goto fail;
-    }
+        if (errno != EEXIST) {
+            pa_log("mkfifo('%s'): %s", u->filename, pa_cstrerror(errno));
+            goto fail;
+        }
+    } else
+        u->do_unlink_fifo = true;
+
     if ((u->fd = pa_open_cloexec(u->filename, O_RDWR, 0)) < 0) {
         pa_log("open('%s'): %s", u->filename, pa_cstrerror(errno));
         goto fail;
@@ -584,7 +590,8 @@ void pa__done(pa_module *m) {
         pa_rtpoll_free(u->rtpoll);
 
     if (u->filename) {
-        unlink(u->filename);
+        if (u->do_unlink_fifo)
+            unlink(u->filename);
         pa_xfree(u->filename);
     }