selftest: Add a variable to indicate that selftest is running
[ambi/samba-autobuild/.git] / ctdb / common / system_freebsd.c
index 21a300b753e19c81e5323328172da0d6daf15821..e72fbbd28cae84042b44f0f16a5ddac4b3fef376 100644 (file)
@@ -30,8 +30,9 @@
 #include "system/wait.h"
 
 #include "lib/util/debug.h"
+#include "lib/util/blocking.h"
 
-#include "ctdb_private.h"
+#include "protocol/protocol.h"
 
 #include <net/ethernet.h>
 #include <netinet/ip6.h>
@@ -136,6 +137,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest,
                struct ip6_hdr ip6;
                struct tcphdr tcp;
        } ip6pkt;
+       int saved_errno;
 
        switch (src->ip.sin_family) {
        case AF_INET:
@@ -164,7 +166,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest,
                ip4pkt.tcp.th_sum   = tcp_checksum((uint16_t *)&ip4pkt.tcp, sizeof(ip4pkt.tcp), &ip4pkt.ip);
 
                /* open a raw socket to send this segment from */
-               s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW));
+               s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
                if (s == -1) {
                        DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket (%s)\n",
                                 strerror(errno)));
@@ -179,15 +181,14 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest,
                        return -1;
                }
 
-               set_nonblocking(s);
-               set_close_on_exec(s);
-
                ret = sendto(s, &ip4pkt, sizeof(ip4pkt), 0,
                             (const struct sockaddr *)&dest->ip,
                             sizeof(dest->ip));
+               saved_errno = errno;
                close(s);
                if (ret != sizeof(ip4pkt)) {
-                       DEBUG(DEBUG_CRIT,(__location__ " failed sendto (%s)\n", strerror(errno)));
+                       DEBUG(DEBUG_ERR,
+                             ("Failed sendto (%s)\n", strerror(saved_errno)));
                        return -1;
                }
                break;
@@ -214,7 +215,7 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest,
                ip6pkt.tcp.th_win   = htons(1234);
                ip6pkt.tcp.th_sum   = tcp_checksum6((uint16_t *)&ip6pkt.tcp, sizeof(ip6pkt.tcp), &ip6pkt.ip6);
 
-               s = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW);
+               s = socket(AF_INET6, SOCK_RAW, IPPROTO_RAW);
                if (s == -1) {
                        DEBUG(DEBUG_CRIT, (__location__ " Failed to open sending socket\n"));
                        return -1;
@@ -230,11 +231,13 @@ int ctdb_sys_send_tcp(const ctdb_sock_addr *dest,
                ret = sendto(s, &ip6pkt, sizeof(ip6pkt), 0,
                             (const struct sockaddr *)&dest->ip6,
                             sizeof(dest->ip6));
+               saved_errno = errno;
                tmpdest->ip6.sin6_port = tmpport;
                close(s);
 
                if (ret != sizeof(ip6pkt)) {
-                       DEBUG(DEBUG_CRIT,(__location__ " failed sendto (%s)\n", strerror(errno)));
+                       DEBUG(DEBUG_ERR,
+                             ("Failed sendto (%s)\n", strerror(saved_errno)));
                        return -1;
                }
                break;
@@ -278,8 +281,9 @@ int ctdb_sys_close_capture_socket(void *private_data)
   called when the raw socket becomes readable
  */
 int ctdb_sys_read_tcp_packet(int s, void *private_data, 
-                       ctdb_sock_addr *src, ctdb_sock_addr *dst,
-                       uint32_t *ack_seq, uint32_t *seq)
+                            ctdb_sock_addr *src, ctdb_sock_addr *dst,
+                            uint32_t *ack_seq, uint32_t *seq,
+                            int *rst, uint16_t *window)
 {
        int ret;
 #define RCVPKTSIZE 100
@@ -332,6 +336,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
                dst->ip.sin_port        = tcp->th_dport;
                *ack_seq                = tcp->th_ack;
                *seq                    = tcp->th_seq;
+               if (window != NULL) {
+                       *window = tcp->th_win;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->th_flags & TH_RST;
+               }
 
                return 0;
        } else if (ntohs(eth->ether_type) == ETHERTYPE_IP6) {
@@ -357,6 +367,12 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
 
                *ack_seq             = tcp->th_ack;
                *seq                 = tcp->th_seq;
+               if (window != NULL) {
+                       *window = tcp->th_win;
+               }
+               if (rst != NULL) {
+                       *rst = tcp->th_flags & TH_RST;
+               }
 
                return 0;
        }