summaryrefslogtreecommitdiff
path: root/ctdb/common/system_aix.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronniesahlberg@gmail.com>2008-07-09 10:17:39 +1000
committerRonnie Sahlberg <ronniesahlberg@gmail.com>2008-07-09 10:17:39 +1000
commit52f03be2d9e1c87f1ae3a02bf5aae447482c4364 (patch)
tree2cf4c48bcfe49626dda2cc52da01e392baf7a105 /ctdb/common/system_aix.c
parent2d644b3fbec0a6a7dea1d1c28fb69c0c1b84e5ab (diff)
downloadsamba-52f03be2d9e1c87f1ae3a02bf5aae447482c4364.tar.gz
From Chris Cowan, patch to make aix compile again
(This used to be ctdb commit 77255bb5523b8d132770a0a7d4ba29ec9e5043cc)
Diffstat (limited to 'ctdb/common/system_aix.c')
-rw-r--r--ctdb/common/system_aix.c82
1 files changed, 54 insertions, 28 deletions
diff --git a/ctdb/common/system_aix.c b/ctdb/common/system_aix.c
index 8742a393c9d..b08692d1774 100644
--- a/ctdb/common/system_aix.c
+++ b/ctdb/common/system_aix.c
@@ -23,8 +23,10 @@
#include "system/network.h"
#include "system/filesys.h"
#include "system/wait.h"
-#include <netinet/if_ether.h>
#include "../include/ctdb_private.h"
+#include <netinet/if_ether.h>
+#include <netinet/ip6.h>
+#include <net/if_arp.h>
#include <sys/ndd_var.h>
#include <sys/kinfo.h>
#include <pcap.h>
@@ -113,47 +115,71 @@ static uint16_t tcp_checksum(uint16_t *data, size_t n, struct ip *ip)
This can also be used to send RST segments (if rst is true) and also
if correct seq and ack numbers are provided.
*/
-int ctdb_sys_send_tcp(int s,
- const struct sockaddr_in *dest,
- const struct sockaddr_in *src,
+int ctdb_sys_send_tcp(const ctdb_sock_addr *dest,
+ const ctdb_sock_addr *src,
uint32_t seq, uint32_t ack, int rst)
{
- int ret;
+ int s;
+ int ret;
+ uint32_t one = 1;
+ ctdb_sock_addr *tmpdest;
+
struct {
struct ip ip;
struct tcphdr tcp;
- } pkt;
+ } ip4pkt;
+
/* for now, we only handle AF_INET addresses */
- if (src->sin_family != AF_INET || dest->sin_family != AF_INET) {
+ if (src->ip.sin_family != AF_INET || dest->ip.sin_family != AF_INET) {
DEBUG(DEBUG_CRIT,(__location__ " not an ipv4 address\n"));
return -1;
}
- memset(&pkt, 0, sizeof(pkt));
- pkt.ip.ip_v = 4;
- pkt.ip.ip_hl = sizeof(pkt.ip)/4;
- pkt.ip.ip_len = htons(sizeof(pkt));
- pkt.ip.ip_ttl = 255;
- pkt.ip.ip_p = IPPROTO_TCP;
- pkt.ip.ip_src.s_addr = src->sin_addr.s_addr;
- pkt.ip.ip_dst.s_addr = dest->sin_addr.s_addr;
- pkt.ip.ip_sum = 0;
-
- pkt.tcp.th_sport = src->sin_port;
- pkt.tcp.th_dport = dest->sin_port;
- pkt.tcp.th_seq = seq;
- pkt.tcp.th_ack = ack;
- pkt.tcp.th_flags = TH_ACK;
+
+
+ s = socket(AF_INET, SOCK_RAW, htons(IPPROTO_RAW));
+ if (s == -1) {
+ DEBUG(DEBUG_CRIT,(" failed to open raw socket (%s)\n",
+ strerror(errno)));
+ return -1;
+ }
+
+ ret = setsockopt(s, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one));
+ if (ret != 0) {
+ DEBUG(DEBUG_CRIT, (" failed to setup IP headers (%s)\n",
+ strerror(errno)));
+ close(s);
+ return -1;
+ }
+
+ set_nonblocking(s);
+ set_close_on_exec(s);
+
+ memset(&ip4pkt, 0, sizeof(ip4pkt));
+ ip4pkt.ip.ip_v = 4;
+ ip4pkt.ip.ip_hl = sizeof(ip4pkt.ip)/4;
+ ip4pkt.ip.ip_len = htons(sizeof(ip4pkt));
+ ip4pkt.ip.ip_ttl = 255;
+ ip4pkt.ip.ip_p = IPPROTO_TCP;
+ ip4pkt.ip.ip_src.s_addr = src->ip.sin_addr.s_addr;
+ ip4pkt.ip.ip_dst.s_addr = dest->ip.sin_addr.s_addr;
+ ip4pkt.ip.ip_sum = 0;
+
+ ip4pkt.tcp.th_sport = src->ip.sin_port;
+ ip4pkt.tcp.th_dport = dest->ip.sin_port;
+ ip4pkt.tcp.th_seq = seq;
+ ip4pkt.tcp.th_ack = ack;
+ ip4pkt.tcp.th_flags = TH_ACK;
if (rst) {
- pkt.tcp.th_flags = TH_RST;
+ ip4pkt.tcp.th_flags = TH_RST;
}
- pkt.tcp.th_off = sizeof(pkt.tcp)/4;
- pkt.tcp.th_win = htons(1234);
- pkt.tcp.th_sum = tcp_checksum((uint16_t *)&pkt.tcp, sizeof(pkt.tcp), &pkt.ip);
+ ip4pkt.tcp.th_off = sizeof(ip4pkt.tcp)/4;
+ ip4pkt.tcp.th_win = htons(1234);
+ ip4pkt.tcp.th_sum = tcp_checksum((uint16_t *)&ip4pkt.tcp, sizeof(ip4pkt.tcp), &ip4pkt.ip);
- ret = sendto(s, &pkt, sizeof(pkt), 0, (struct sockaddr *)dest, sizeof(*dest));
- if (ret != sizeof(pkt)) {
+ ret = sendto(s, &ip4pkt, sizeof(ip4pkt), 0, (struct sockaddr *)dest, sizeof(*dest));
+ if (ret != sizeof(ip4pkt)) {
DEBUG(DEBUG_CRIT,(__location__ " failed sendto (%s)\n", strerror(errno)));
return -1;
}