Fix compile error on Mac OS/X
authorTatsuo Ishii <ishii@postgresql.org>
Wed, 3 Jul 2013 07:00:37 +0000 (16:00 +0900)
committerTatsuo Ishii <ishii@postgresql.org>
Wed, 3 Jul 2013 07:00:37 +0000 (16:00 +0900)
Patch contributed by Muhammad Usama.

watchdog/wd_heartbeat.c

index 2f484237812fc1ac1f681f0184051aee87a126f6..d56dcc8f35f73890acfa8846a7fb1334b586cf4a 100644 (file)
@@ -57,7 +57,6 @@ static RETSIGTYPE hb_receiver_exit(int sig);
 static int hton_wd_hb_packet(WdHbPacket * to, WdHbPacket * from);
 static int ntoh_wd_hb_packet(WdHbPacket * to, WdHbPacket * from);
 static int packet_to_string_hb(WdHbPacket pkt, char *str, int maxlen);
-static bool is_usable_bindtodevice(void);
 
 /* create socket for sending heartbeat */
 int
@@ -85,22 +84,28 @@ wd_create_hb_send_socket(WdHbIf hb_if)
                return -1;
        }
 
-       if (is_usable_bindtodevice())
+#if defined(SO_BINDTODEVICE)
        {
-               struct ifreq i;
-               strlcpy(i.ifr_name, hb_if.if_name, sizeof(i.ifr_name));
-
-               if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &i, sizeof(i)) == -1)
+               if (geteuid() == 0) /* check root privileges */
                {
-                       pool_error("wd_create_hb_send_socket: setsockopt(SO_BINDTODEVICE) failed. reason: %s, device: %s",
-                                  strerror(errno), i.ifr_name);
-                       close(sock);
-                       return -1;
+                       struct ifreq i;
+                       strlcpy(i.ifr_name, hb_if.if_name, sizeof(i.ifr_name));
+
+                       if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &i, sizeof(i)) == -1)
+                       {
+                               pool_error("wd_create_hb_send_socket: setsockopt(SO_BINDTODEVICE) failed. reason: %s, device: %s",
+                                                  strerror(errno), i.ifr_name);
+                               close(sock);
+                               return -1;
+                       }
+                       pool_log("wd_create_hb_send_socket: bind send socket to device: %s", i.ifr_name);
                }
-               pool_log("wd_create_hb_send_socket: bind send socket to device: %s", i.ifr_name);
+               else
+                       pool_log("wd_create_hb_send_socket: setsockopt(SO_BINDTODEVICE) requies root privilege");
        }
-       else
-               pool_log("wd_create_hb_send_socket: couldn't bind send socket to device: %s", hb_if.if_name);
+#else
+       pool_log("wd_create_hb_send_socket: couldn't setsockopt(SO_BINDTODEVICE) on this platform");
+#endif
 
 #if defined(SO_REUSEPORT)
        {
@@ -158,22 +163,28 @@ wd_create_hb_recv_socket(WdHbIf hb_if)
                return -1;
        }
 
-       if (is_usable_bindtodevice())
+#if defined(SO_BINDTODEVICE)
        {
-               struct ifreq i;
-               strlcpy(i.ifr_name, hb_if.if_name, sizeof(i.ifr_name));
-
-               if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &i, sizeof(i)) == -1)
+               if (geteuid() == 0) /* check root privileges */
                {
-                       pool_error("wd_create_hb_recv_socket: setsockopt(SO_BINDTODEVICE) failed. reason: %s, devise: %s",
-                                  strerror(errno), i.ifr_name);
-                       close(sock);
-                       return -1;
+                       struct ifreq i;
+                       strlcpy(i.ifr_name, hb_if.if_name, sizeof(i.ifr_name));
+
+                       if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &i, sizeof(i)) == -1)
+                       {
+                               pool_error("wd_create_hb_recv_socket: setsockopt(SO_BINDTODEVICE) failed. reason: %s, devise: %s",
+                                                  strerror(errno), i.ifr_name);
+                               close(sock);
+                               return -1;
+                       }
+                       pool_log("wd_create_hb_recv_socket: bind receive socket to device: %s", i.ifr_name);
                }
-               pool_log("wd_create_hb_recv_socket: bind receive socket to device: %s", i.ifr_name);
+               else
+                       pool_log("wd_create_hb_send_socket: setsockopt(SO_BINDTODEVICE) requies root privilege");
        }
-       else
-               pool_log("wd_create_hb_recv_socket: couldn't bind receive socket to device: %s", hb_if.if_name);
+#else
+       pool_log("wd_create_hb_send_socket: couldn't setsockopt(SO_BINDTODEVICE) on this platform");
+#endif
 
 #if defined(SO_REUSEPORT)
        {
@@ -558,22 +569,3 @@ packet_to_string_hb(WdHbPacket pkt, char *str, int maxlen)
 
        return len;
 }
-
-static bool
-is_usable_bindtodevice(void)
-{
-#if defined(SO_BINDTODEVICE)
-       if (geteuid() != 0)
-       {
-               pool_log("is_usable_bindtodevice: setsockopt(SO_BINDTODEVICE) requies root privilege");
-               return false;
-       }
-       else
-       {
-               return true;
-       }
-#else
-       pool_log("is_usable_bindtodevice: couldn't setsockopt(SO_BINDTODEVICE) in this platform");
-       return false;
-#endif
-}