ctdb-tests: Strengthen some tests
[samba.git] / ctdb / common / system_freebsd.c
index 2fb3f45ebd09841928278b6b0e4354ae821b2d21..b709a5c75c14113cf5b93f2ece9e5aeaaa0c8411 100644 (file)
   needs, and inspired by 'common/system_aix.c' for the pcap usage.
 */
 
-#include "includes.h"
+#include "replace.h"
 #include "system/network.h"
 #include "system/filesys.h"
 #include "system/wait.h"
-#include "../include/ctdb_private.h"
+
+#include "lib/util/debug.h"
+#include "lib/util/blocking.h"
+
+#include "protocol/protocol.h"
+
 #include <net/ethernet.h>
 #include <netinet/ip6.h>
 #include <net/if_arp.h>
 #include <pcap.h>
 
+#include "common/logging.h"
+#include "common/system.h"
 
 #ifndef ETHERTYPE_IP6
 #define ETHERTYPE_IP6 0x86dd
@@ -75,8 +82,8 @@ static uint16_t tcp_checksum6(uint16_t *data, size_t n, struct ip6_hdr *ip6)
  */
 int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface)
 {
-       /* FIXME FreeBSD: We dont do gratuitous arp yet */
-       return 0;
+       /* FIXME FreeBSD: We don't do gratuitous arp yet */
+       return -1;
 }
 
 
@@ -130,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:
@@ -158,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)));
@@ -173,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;
@@ -208,13 +215,13 @@ 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;
 
                }
-               /* sendto() dont like if the port is set and the socket is
+               /* sendto() don't like if the port is set and the socket is
                   in raw mode.
                */
                tmpdest = discard_const(dest);
@@ -224,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;
@@ -272,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
@@ -288,6 +298,9 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
                return -1;
        }
 
+       ZERO_STRUCTP(src);
+       ZERO_STRUCTP(dst);
+
        /* Ethernet */
        eth = (struct ether_header *)pkt;
 
@@ -326,6 +339,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) {
@@ -351,6 +370,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;
        }
@@ -369,21 +394,3 @@ int ctdb_get_peer_pid(const int fd, pid_t *peer_pid)
        /* FIXME FreeBSD: get_peer_pid not implemented */
        return 1;
 }
-
-char *ctdb_get_process_name(pid_t pid)
-{
-       /* FIXME FreeBSD: get_process_name not implemented */
-       return NULL;
-}
-
-bool ctdb_get_lock_info(pid_t req_pid, struct ctdb_lock_info *lock_info)
-{
-       /* FIXME FreeBSD: get_lock_info not implemented */
-       return false;
-}
-
-bool ctdb_get_blocker_pid(struct ctdb_lock_info *reqlock, pid_t *blocker_pid)
-{
-       /* FIXME FreeBSD: get_blocker_pid not implemented */
-       return false;
-}