Package: ctdb Version: 1.0.82-1 Severity: important Tags: patch
Coin,Please consider applying this patch, which correct the configure script to add support for the GNU system, add the new implentation-specific 'common/system_gnu.c' file, and deactivate the SOL_SOCKET use on Hurd, as it is not yet implemented. It adapts Build-depends and Depends as well.
With this patch, ctdb builds well and runs (even if a complete testing was not yet done). It will enable many blocked packages to be available.
Regards. -- Marc Dequènes (Duck)
diff -Nur orig/ctdb-1.0.82/debian/changelog ctdb-1.0.82/debian/changelog --- orig/ctdb-1.0.82/debian/changelog 2009-05-24 17:17:11.000000000 +0200 +++ ctdb-1.0.82/debian/changelog 2009-05-24 15:50:49.000000000 +0200 @@ -1,3 +1,9 @@ +ctdb (1.0.82-1+hurdfr1) unreleased; urgency=low + + * Added 'hurd_support' patch to fix configure script and support Hurd. + + -- Marc Dequènes (Duck) <d...@hurdfr.org> Sun, 24 May 2009 15:50:39 +0200 + ctdb (1.0.82-1) unstable; urgency=low * new upstream release diff -Nur orig/ctdb-1.0.82/debian/control ctdb-1.0.82/debian/control --- orig/ctdb-1.0.82/debian/control 2009-05-24 17:17:11.000000000 +0200 +++ ctdb-1.0.82/debian/control 2009-05-24 18:33:37.000000000 +0200 @@ -3,7 +3,7 @@ Priority: extra Maintainer: Debian Samba Maintainers <pkg-samba-ma...@lists.alioth.debian.org> Uploaders: Mathieu Parent <math.par...@gmail.com> -Build-Depends: debhelper (>= 5), quilt (>= 0.40), libpopt-dev +Build-Depends: debhelper (>= 5), quilt (>= 0.40), libpopt-dev, libpcap-dev [hurd-i386] Homepage: http://ctdb.samba.org/ Standards-Version: 3.8.1 XS-DM-Upload-Allowed: yes @@ -12,7 +12,7 @@ Package: ctdb Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, lsb-base, lsof, ethtool, iproute, psmisc, tdb-tools +Depends: ${shlibs:Depends}, ${misc:Depends}, lsb-base, lsof [!hurd-i386], ethtool [!hurd-i386], iproute [!hurd-i386], psmisc, tdb-tools Suggests: logrotate Description: clustered database to store temporary data CTDB is a cluster implementation of the TDB database used by Samba and other diff -Nur orig/ctdb-1.0.82/debian/patches/hurd_support ctdb-1.0.82/debian/patches/hurd_support --- orig/ctdb-1.0.82/debian/patches/hurd_support 1970-01-01 01:00:00.000000000 +0100 +++ ctdb-1.0.82/debian/patches/hurd_support 2009-05-24 18:20:36.000000000 +0200 @@ -0,0 +1,455 @@ +Index: ctdb-1.0.82/configure +=================================================================== +--- ctdb-1.0.82.orig/configure 2009-05-24 17:51:12.000000000 +0200 ++++ ctdb-1.0.82/configure 2009-05-24 18:19:57.000000000 +0200 +@@ -1843,16 +1843,16 @@ + + + +-#if test "${libdir}" = '${exec_prefix}/lib'; then +-# case `uname -m` in +-# x86_64|ppc64|powerpc64) +-# libdir='${exec_prefix}/lib64' +-# ;; +-# *) +-# libdir='${exec_prefix}/lib' +-# ;; +-# esac +-#fi ++if test "${libdir}" = '${exec_prefix}/lib'; then ++ case `uname -m` in ++ x86_64|ppc64|powerpc64) ++ libdir='${exec_prefix}/lib64' ++ ;; ++ *) ++ libdir='${exec_prefix}/lib' ++ ;; ++ esac ++fi + + case `uname` in + Linux*) +@@ -1865,6 +1865,11 @@ + CTDB_SCSI_IO= + CTDB_PCAP_LDFLAGS=-lpcap + ;; ++ GNU*) ++ CTDB_SYSTEM_OBJ=common/system_gnu.o ++ CTDB_SCSI_IO= ++ CTDB_PCAP_LDFLAGS=-lpcap ++ ;; + *) + echo unknown system cant configure + exit +Index: ctdb-1.0.82/configure.ac +=================================================================== +--- ctdb-1.0.82.orig/configure.ac 2009-05-24 17:50:47.000000000 +0200 ++++ ctdb-1.0.82/configure.ac 2009-05-24 18:19:50.000000000 +0200 +@@ -36,6 +36,11 @@ + CTDB_SCSI_IO= + CTDB_PCAP_LDFLAGS=-lpcap + ;; ++ GNU*) ++ CTDB_SYSTEM_OBJ=common/system_gnu.o ++ CTDB_SCSI_IO= ++ CTDB_PCAP_LDFLAGS=-lpcap ++ ;; + *) + echo unknown system cant configure + exit +Index: ctdb-1.0.82/server/ctdb_daemon.c +=================================================================== +--- ctdb-1.0.82.orig/server/ctdb_daemon.c 2009-05-24 17:50:48.000000000 +0200 ++++ ctdb-1.0.82/server/ctdb_daemon.c 2009-05-24 17:51:12.000000000 +0200 +@@ -532,6 +532,7 @@ + int fd; + struct ctdb_context *ctdb = talloc_get_type(private_data, struct ctdb_context); + struct ctdb_client *client; ++#if ! defined(__GNU__) + #ifdef _AIX + struct peercred_struct cr; + socklen_t crl = sizeof(struct peercred_struct); +@@ -539,6 +540,7 @@ + struct ucred cr; + socklen_t crl = sizeof(struct ucred); + #endif ++#endif + + memset(&addr, 0, sizeof(addr)); + len = sizeof(addr); +@@ -551,6 +553,7 @@ + set_close_on_exec(fd); + + client = talloc_zero(ctdb, struct ctdb_client); ++#if ! defined(__GNU__) + #ifdef _AIX + if (getsockopt(fd, SOL_SOCKET, SO_PEERID, &cr, &crl) == 0) { + #else +@@ -558,6 +561,7 @@ + #endif + talloc_asprintf(client, "struct ctdb_client: pid:%u", (unsigned)cr.pid); + } ++#endif + + client->ctdb = ctdb; + client->fd = fd; +Index: ctdb-1.0.82/common/system_gnu.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ ctdb-1.0.82/common/system_gnu.c 2009-05-24 18:18:47.000000000 +0200 +@@ -0,0 +1,355 @@ ++/* ++ ctdb system specific code to manage raw sockets on linux ++ ++ Copyright (C) Ronnie Sahlberg 2007 ++ Copyright (C) Andrew Tridgell 2007 ++ Copyright (C) Marc Dequènes (Duck) 2009 ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, see <http://www.gnu.org/licenses/>. ++ ++ ++ This file is a copy of 'common/system_linux.c' adapted for Hurd needs, ++ and inspired by 'common/system_aix.c' for the pcap usage. ++*/ ++ ++#include "includes.h" ++#include "system/network.h" ++#include "system/filesys.h" ++#include "system/wait.h" ++#include "../include/ctdb_private.h" ++#include "lib/events/events.h" ++#include <net/ethernet.h> ++#include <netinet/ip6.h> ++#include <net/if_arp.h> ++#include <pcap.h> ++ ++ ++#ifndef ETHERTYPE_IP6 ++#define ETHERTYPE_IP6 0x86dd ++#endif ++ ++/* ++ calculate the tcp checksum for tcp over ipv6 ++*/ ++static uint16_t tcp_checksum6(uint16_t *data, size_t n, struct ip6_hdr *ip6) ++{ ++ uint32_t phdr[2]; ++ uint32_t sum = 0; ++ uint16_t sum2; ++ ++ sum += uint16_checksum((uint16_t *)(void *)&ip6->ip6_src, 16); ++ sum += uint16_checksum((uint16_t *)(void *)&ip6->ip6_dst, 16); ++ ++ phdr[0] = htonl(n); ++ phdr[1] = htonl(ip6->ip6_nxt); ++ sum += uint16_checksum((uint16_t *)phdr, 8); ++ ++ sum += uint16_checksum(data, n); ++ ++ sum = (sum & 0xFFFF) + (sum >> 16); ++ sum = (sum & 0xFFFF) + (sum >> 16); ++ sum2 = htons(sum); ++ sum2 = ~sum2; ++ if (sum2 == 0) { ++ return 0xFFFF; ++ } ++ return sum2; ++} ++ ++/* ++ send gratuitous arp reply after we have taken over an ip address ++ ++ saddr is the address we are trying to claim ++ iface is the interface name we will be using to claim the address ++ */ ++int ctdb_sys_send_arp(const ctdb_sock_addr *addr, const char *iface) ++{ ++ /* We dont do grat arp on Hurd yet */ ++ return 0; ++} ++ ++ ++/* ++ simple TCP checksum - assumes data is multiple of 2 bytes long ++ */ ++static uint16_t tcp_checksum(uint16_t *data, size_t n, struct iphdr *ip) ++{ ++ uint32_t sum = uint16_checksum(data, n); ++ uint16_t sum2; ++ sum += uint16_checksum((uint16_t *)(void *)&ip->saddr, ++ sizeof(ip->saddr)); ++ sum += uint16_checksum((uint16_t *)(void *)&ip->daddr, ++ sizeof(ip->daddr)); ++ sum += ip->protocol + n; ++ sum = (sum & 0xFFFF) + (sum >> 16); ++ sum = (sum & 0xFFFF) + (sum >> 16); ++ sum2 = htons(sum); ++ sum2 = ~sum2; ++ if (sum2 == 0) { ++ return 0xFFFF; ++ } ++ return sum2; ++} ++ ++/* ++ Send tcp segment from the specified IP/port to the specified ++ destination IP/port. ++ ++ This is used to trigger the receiving host into sending its own ACK, ++ which should trigger early detection of TCP reset by the client ++ after IP takeover ++ ++ 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(const ctdb_sock_addr *dest, ++ const ctdb_sock_addr *src, ++ uint32_t seq, uint32_t ack, int rst) ++{ ++ int s; ++ int ret; ++ uint32_t one = 1; ++ uint16_t tmpport; ++ ctdb_sock_addr *tmpdest; ++ struct { ++ struct iphdr ip; ++ struct tcphdr tcp; ++ } ip4pkt; ++ struct { ++ struct ip6_hdr ip6; ++ struct tcphdr tcp; ++ } ip6pkt; ++ ++ switch (src->ip.sin_family) { ++ case AF_INET: ++ ZERO_STRUCT(ip4pkt); ++ ip4pkt.ip.version = 4; ++ ip4pkt.ip.ihl = sizeof(ip4pkt.ip)/4; ++ ip4pkt.ip.tot_len = htons(sizeof(ip4pkt)); ++ ip4pkt.ip.ttl = 255; ++ ip4pkt.ip.protocol = IPPROTO_TCP; ++ ip4pkt.ip.saddr = src->ip.sin_addr.s_addr; ++ ip4pkt.ip.daddr = dest->ip.sin_addr.s_addr; ++ ip4pkt.ip.check = 0; ++ ++ ip4pkt.tcp.source = src->ip.sin_port; ++ ip4pkt.tcp.dest = dest->ip.sin_port; ++ ip4pkt.tcp.seq = seq; ++ ip4pkt.tcp.ack_seq = ack; ++ ip4pkt.tcp.ack = 1; ++ if (rst) { ++ ip4pkt.tcp.rst = 1; ++ } ++ ip4pkt.tcp.doff = sizeof(ip4pkt.tcp)/4; ++ /* this makes it easier to spot in a sniffer */ ++ ip4pkt.tcp.window = htons(1234); ++ ip4pkt.tcp.check = 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)); ++ if (s == -1) { ++ DEBUG(DEBUG_CRIT,(__location__ " 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,(__location__ " failed to setup IP headers (%s)\n", ++ strerror(errno))); ++ close(s); ++ return -1; ++ } ++ ++ set_nonblocking(s); ++ set_close_on_exec(s); ++ ++ ret = sendto(s, &ip4pkt, sizeof(ip4pkt), 0, &dest->ip, sizeof(dest->ip)); ++ close(s); ++ if (ret != sizeof(ip4pkt)) { ++ DEBUG(DEBUG_CRIT,(__location__ " failed sendto (%s)\n", strerror(errno))); ++ return -1; ++ } ++ break; ++ case AF_INET6: ++ ZERO_STRUCT(ip6pkt); ++ ip6pkt.ip6.ip6_vfc = 0x60; ++ ip6pkt.ip6.ip6_plen = htons(20); ++ ip6pkt.ip6.ip6_nxt = IPPROTO_TCP; ++ ip6pkt.ip6.ip6_hlim = 64; ++ ip6pkt.ip6.ip6_src = src->ip6.sin6_addr; ++ ip6pkt.ip6.ip6_dst = dest->ip6.sin6_addr; ++ ++ ip6pkt.tcp.source = src->ip6.sin6_port; ++ ip6pkt.tcp.dest = dest->ip6.sin6_port; ++ ip6pkt.tcp.seq = seq; ++ ip6pkt.tcp.ack_seq = ack; ++ ip6pkt.tcp.ack = 1; ++ if (rst) { ++ ip6pkt.tcp.rst = 1; ++ } ++ ip6pkt.tcp.doff = sizeof(ip6pkt.tcp)/4; ++ /* this makes it easier to spot in a sniffer */ ++ ip6pkt.tcp.window = htons(1234); ++ ip6pkt.tcp.check = tcp_checksum6((uint16_t *)&ip6pkt.tcp, sizeof(ip6pkt.tcp), &ip6pkt.ip6); ++ ++ s = socket(PF_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 ++ in raw mode. ++ */ ++ tmpdest = discard_const(dest); ++ tmpport = tmpdest->ip6.sin6_port; ++ ++ tmpdest->ip6.sin6_port = 0; ++ ret = sendto(s, &ip6pkt, sizeof(ip6pkt), 0, &dest->ip6, sizeof(dest->ip6)); ++ tmpdest->ip6.sin6_port = tmpport; ++ close(s); ++ ++ if (ret != sizeof(ip6pkt)) { ++ DEBUG(DEBUG_CRIT,(__location__ " failed sendto (%s)\n", strerror(errno))); ++ return -1; ++ } ++ break; ++ ++ default: ++ DEBUG(DEBUG_CRIT,(__location__ " not an ipv4/v6 address\n")); ++ return -1; ++ } ++ ++ return 0; ++} ++ ++/* ++ This function is used to open a raw socket to capture from ++ */ ++int ctdb_sys_open_capture_socket(const char *iface, void **private_data) ++{ ++ pcap_t *pt; ++ ++ pt=pcap_open_live(iface, 100, 0, 0, NULL); ++ if (pt == NULL) { ++ DEBUG(DEBUG_CRIT,("Failed to open capture device %s\n", iface)); ++ return -1; ++ } ++ *((pcap_t **)private_data) = pt; ++ ++ return pcap_fileno(pt); ++} ++ ++/* This function is used to close the capture socket ++ */ ++int ctdb_sys_close_capture_socket(void *private_data) ++{ ++ pcap_t *pt = (pcap_t *)private_data; ++ pcap_close(pt); ++ return 0; ++} ++ ++ ++/* ++ 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) ++{ ++ int ret; ++#define RCVPKTSIZE 100 ++ char pkt[RCVPKTSIZE]; ++ struct ether_header *eth; ++ struct iphdr *ip; ++ struct ip6_hdr *ip6; ++ struct tcphdr *tcp; ++ ++ ret = recv(s, pkt, RCVPKTSIZE, MSG_TRUNC); ++ if (ret < sizeof(*eth)+sizeof(*ip)) { ++ return -1; ++ } ++ ++ /* Ethernet */ ++ eth = (struct ether_header *)pkt; ++ ++ /* we want either IPv4 or IPv6 */ ++ if (ntohs(eth->ether_type) == ETHERTYPE_IP) { ++ /* IP */ ++ ip = (struct iphdr *)(eth+1); ++ ++ /* We only want IPv4 packets */ ++ if (ip->version != 4) { ++ return -1; ++ } ++ /* Dont look at fragments */ ++ if ((ntohs(ip->frag_off)&0x1fff) != 0) { ++ return -1; ++ } ++ /* we only want TCP */ ++ if (ip->protocol != IPPROTO_TCP) { ++ return -1; ++ } ++ ++ /* make sure its not a short packet */ ++ if (offsetof(struct tcphdr, ack_seq) + 4 + ++ (ip->ihl*4) + sizeof(*eth) > ret) { ++ return -1; ++ } ++ /* TCP */ ++ tcp = (struct tcphdr *)((ip->ihl*4) + (char *)ip); ++ ++ /* tell the caller which one we've found */ ++ src->ip.sin_family = AF_INET; ++ src->ip.sin_addr.s_addr = ip->saddr; ++ src->ip.sin_port = tcp->source; ++ dst->ip.sin_family = AF_INET; ++ dst->ip.sin_addr.s_addr = ip->daddr; ++ dst->ip.sin_port = tcp->dest; ++ *ack_seq = tcp->ack_seq; ++ *seq = tcp->seq; ++ ++ return 0; ++ } else if (ntohs(eth->ether_type) == ETHERTYPE_IP6) { ++ /* IP6 */ ++ ip6 = (struct ip6_hdr *)(eth+1); ++ ++ /* we only want TCP */ ++ if (ip6->ip6_nxt != IPPROTO_TCP) { ++ return -1; ++ } ++ ++ /* TCP */ ++ tcp = (struct tcphdr *)(ip6+1); ++ ++ /* tell the caller which one we've found */ ++ src->ip6.sin6_family = AF_INET6; ++ src->ip6.sin6_port = tcp->source; ++ src->ip6.sin6_addr = ip6->ip6_src; ++ ++ dst->ip6.sin6_family = AF_INET6; ++ dst->ip6.sin6_port = tcp->dest; ++ dst->ip6.sin6_addr = ip6->ip6_dst; ++ ++ *ack_seq = tcp->ack_seq; ++ *seq = tcp->seq; ++ ++ return 0; ++ } ++ ++ return -1; ++} ++ ++ diff -Nur orig/ctdb-1.0.82/debian/patches/series ctdb-1.0.82/debian/patches/series --- orig/ctdb-1.0.82/debian/patches/series 2009-05-24 17:17:11.000000000 +0200 +++ ctdb-1.0.82/debian/patches/series 2009-05-24 17:38:36.000000000 +0200 @@ -1,2 +1,3 @@ 02_ctdb_diagnostics.diff 10_no-lib64.diff +hurd_support diff -Nur orig/ctdb-1.0.82/debian/patches/sock_packet_obsolete ctdb-1.0.82/debian/patches/sock_packet_obsolete --- orig/ctdb-1.0.82/debian/patches/sock_packet_obsolete 1970-01-01 01:00:00.000000000 +0100 +++ ctdb-1.0.82/debian/patches/sock_packet_obsolete 2009-05-24 17:38:28.000000000 +0200 @@ -0,0 +1,22 @@ +Index: ctdb-1.0.82/common/system_linux.c +=================================================================== +--- ctdb-1.0.82.orig/common/system_linux.c 2009-05-24 17:21:03.000000000 +0200 ++++ ctdb-1.0.82/common/system_linux.c 2009-05-24 17:21:38.000000000 +0200 +@@ -84,7 +84,7 @@ + + switch (addr->ip.sin_family) { + case AF_INET: +- s = socket(AF_INET, SOCK_PACKET, htons(ETHERTYPE_ARP)); ++ s = socket(AF_INET, SOCK_RAW, htons(ETHERTYPE_ARP)); + if (s == -1){ + DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); + return -1; +@@ -166,7 +166,7 @@ + close(s); + break; + case AF_INET6: +- s = socket(AF_INET, SOCK_PACKET, htons(ETHERTYPE_IP6)); ++ s = socket(AF_INET, SOCK_RAW, htons(ETHERTYPE_IP6)); + if (s == -1){ + DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n")); + return -1;
pgpw6MQ2udsnT.pgp
Description: PGP Digital Signature