Try to fix Solaris build
[exim.git] / src / src / daemon.c
index 12e3413a06798a4d4178ba577b80a3ed2ef23b89..067bb3329bbc6fc26b006b50cd49c13cc32ea6e6 100644 (file)
@@ -1000,13 +1000,12 @@ int len;
 
 DEBUG(D_any) debug_printf("creating notifier socket ");
 
-where = US"socket";
 #ifdef SOCK_CLOEXEC
 if ((fd = socket(PF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0)
-  goto bad;
+  { where = US"socket"; goto bad; }
 #else
-if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
-  goto bad;
+if ((fd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
+  { where = US"socket"; goto bad; }
 (void)fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
 #endif
 
@@ -1022,27 +1021,30 @@ len = offsetof(struct sockaddr_un, sun_path)
 DEBUG(D_any) debug_printf("%s\n", sa_un.sun_path);
 #endif
 
-where = US"bind";
 if (bind(fd, (const struct sockaddr *)&sa_un, len) < 0)
-  goto bad;
+  { where = US"bind"; goto bad; }
 
 #ifdef SO_PASSCRED             /* Linux */
-where = US"SO_PASSCRED";
 if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0)
-  goto bad;
+  { where = US"SO_PASSCRED"; goto bad2; }
 #elif defined(LOCAL_CREDS)     /* FreeBSD-ish */
-where = US"LOCAL_CREDS";
-if (setsockopt(fd, SOL_SOCKET, LOCAL_CREDS, &on, sizeof(on)) < 0)
-  goto bad;
+if (setsockopt(fd, 0, LOCAL_CREDS, &on, sizeof(on)) < 0)
+  { where = US"LOCAL_CREDS"; goto bad2; }
 #endif
 
 /* debug_printf("%s: fd %d\n", __FUNCTION__, fd); */
 daemon_notifier_fd = fd;
 return;
 
+bad2:
+#ifndef EXIM_HAVE_ABSTRACT_UNIX_SOCKETS
+  Uunlink(sa_un.sun_path);
+#endif
 bad:
-  log_write(0, LOG_MAIN|LOG_PANIC, "%s: %s: %s",
+  log_write(0, LOG_MAIN|LOG_PANIC, "%s %s: %s",
     __FUNCTION__, where, strerror(errno));
+  close(fd);
+  return;
 }
 
 
@@ -1054,13 +1056,17 @@ daemon_notification(void)
 {
 uschar buf[256], cbuf[256];
 struct sockaddr_un sa_un;
-struct iovec iov = {.iov_base = buf, .iov_len = sizeof(buf)-1};
+struct iovec iov = {.iov_base = (void *)buf,   /* ? cast needed for Solaris compiler */
+                   .iov_len = sizeof(buf)-1
+                  };
 struct msghdr msg = { .msg_name = &sa_un,
                      .msg_namelen = sizeof(sa_un),
                      .msg_iov = &iov,
                      .msg_iovlen = 1,
+#if !defined(__sun)
                      .msg_control = cbuf,
                      .msg_controllen = sizeof(cbuf)
+#endif
                    };
 ssize_t sz;
 struct cmsghdr * cp;