changeset 13292:78f9f28b5d24

master: If fifo already exists, replace it to be sure it has proper permissions.
author Timo Sirainen <tss@iki.fi>
date Fri, 26 Aug 2011 05:09:25 +0300
parents 6eb42d5d0ce3
children 076a71f9a154
files src/master/service-listen.c
diffstat 1 files changed, 17 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/master/service-listen.c	Fri Aug 26 05:08:42 2011 +0300
+++ b/src/master/service-listen.c	Fri Aug 26 05:09:25 2011 +0300
@@ -108,16 +108,27 @@
 {
         struct service *service = l->service;
 	const struct file_listener_settings *set = l->set.fileset.set;
+	unsigned int i;
 	mode_t old_umask;
 	int fd, ret;
 
-	old_umask = umask((set->mode ^ 0777) & 0777);
-	ret = mkfifo(set->path, set->mode);
-	umask(old_umask);
+	for (i = 0;; i++) {
+		old_umask = umask((set->mode ^ 0777) & 0777);
+		ret = mkfifo(set->path, set->mode);
+		umask(old_umask);
 
-	if (ret < 0 && errno != EEXIST) {
-		service_error(service, "mkfifo(%s) failed: %m", set->path);
-		return -1;
+		if (ret == 0)
+			break;
+		if (ret < 0 && (errno != EEXIST || i == 1)) {
+			service_error(service, "mkfifo(%s) failed: %m",
+				      set->path);
+			return -1;
+		}
+		if (unlink(set->path) < 0) {
+			service_error(service, "unlink(%s) failed: %m",
+				      set->path);
+			return -1;
+		}
 	}
 
 	/* open as RDWR, so that even if the last writer closes,