Source: libpcap Version: 1.10.6-1 Severity: important Tags: patch Hello,
Upstream updated some function names in the 1.10 branch, here is a patch to update the hurd support (already fixed upstream). I have also attached the resulting new patch, whichever is simpler for you to take. Samuel -- System Information: Debian Release: forky/sid APT prefers testing APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 'testing-debug'), (500, 'stable-security'), (500, 'stable-debug'), (500, 'proposed-updates'), (500, 'oldstable-debug'), (500, 'oldoldstable'), (500, 'buildd-unstable'), (500, 'unstable'), (500, 'stable'), (500, 'oldstable'), (1, 'experimental-debug'), (1, 'buildd-experimental'), (1, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386, arm64 Kernel: Linux 7.0.10+deb14-amd64 (SMP w/22 CPU threads; PREEMPT) Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8), LANGUAGE not set Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled -- Samuel <N> bon comment on fait de l'investigation pour savoir qui est le vilain ? <s> on débranche le routeur et on regarde qui s'affole -+- #ens-mim administre -+-
diff -ur libpcap-1.10.6/debian/patches/hurd.diff libpcap-1.10.6/debian/patches/hurd.diff --- libpcap-1.10.6/debian/patches/hurd.diff 2026-02-15 19:18:22.000000000 +0100 +++ libpcap-1.10.6/debian/patches/hurd.diff 2026-06-29 00:28:44.161910600 +0200 @@ -4,14 +4,14 @@ Forwarded: https://github.com/the-tcpdump-group/libpcap/commit/04b51af508caec959f695bc3bbb62afa97ca5b38 --- - configure.in | 6 ++ - pcap-hurd.c | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 261 insertions(+) + configure.ac | 11 ++ + pcap-hurd.c | 263 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 274 insertions(+) create mode 100644 pcap-hurd.c --- a/configure.ac +++ b/configure.ac -@@ -749,6 +749,7 @@ +@@ -749,6 +749,7 @@ else AC_CHECK_HEADERS(net/nit.h sys/net/nit.h) AC_CHECK_HEADERS(linux/socket.h net/raw.h sys/dlpi.h) AC_CHECK_HEADERS(config/HaikuConfig.h) @@ -19,7 +19,7 @@ if test "$ac_cv_lbl_bpf_h_defines_biocsetif" = yes; then # -@@ -810,6 +811,11 @@ +@@ -810,6 +811,11 @@ else # Haiku. # V_PCAP=haiku @@ -31,7 +31,7 @@ else # # We don't have any capture type we know about. -@@ -1163,6 +1169,11 @@ +@@ -1153,6 +1159,11 @@ snoop) PLATFORM_C_SRC="pcap-snoop.c" ;; @@ -191,7 +191,7 @@ + ph->mach_dev = MACH_PORT_NULL; + } + -+ pcap_cleanup_live_common(p); ++ pcapint_cleanup_live_common(p); +} + +static int @@ -268,7 +268,7 @@ + + p->read_op = pcap_read_hurd; + p->inject_op = pcap_inject_hurd; -+ p->setfilter_op = install_bpf_program; ++ p->setfilter_op = pcapint_install_bpf_program; + p->stats_op = pcap_stats_hurd; + + return 0; @@ -279,7 +279,7 @@ +} + +pcap_t * -+pcap_create_interface(const char *device _U_, char *ebuf) ++pcapint_create_interface(const char *device _U_, char *ebuf) +{ + struct pcap_hurd *ph; + pcap_t *p; @@ -296,7 +296,7 @@ +} + +int -+pcap_platform_finddevs(pcap_if_list_t *alldevsp, char *errbuf) ++pcapint_platform_finddevs(pcap_if_list_t *alldevsp, char *errbuf) +{ + return 0; +}
From: Richard Braun <[email protected]> Date: Thu, 10 Apr 2014 01:26:01 +0200 Subject: [PATCH] Debian GNU/Hurd (with NETDDE) support Forwarded: https://github.com/the-tcpdump-group/libpcap/commit/04b51af508caec959f695bc3bbb62afa97ca5b38 --- configure.ac | 11 ++ pcap-hurd.c | 263 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 274 insertions(+) create mode 100644 pcap-hurd.c --- a/configure.ac +++ b/configure.ac @@ -749,6 +749,7 @@ else AC_CHECK_HEADERS(net/nit.h sys/net/nit.h) AC_CHECK_HEADERS(linux/socket.h net/raw.h sys/dlpi.h) AC_CHECK_HEADERS(config/HaikuConfig.h) + AC_CHECK_HEADERS(hurd.h) if test "$ac_cv_lbl_bpf_h_defines_biocsetif" = yes; then # @@ -810,6 +811,11 @@ else # Haiku. # V_PCAP=haiku + elif test "$ac_cv_header_hurd_h" = yes; then + # + # Hurd. + # + V_PCAP=hurd else # # We don't have any capture type we know about. @@ -1153,6 +1159,11 @@ snoop) PLATFORM_C_SRC="pcap-snoop.c" ;; +hurd) + PLATFORM_C_SRC="pcap-hurd.c" + LIBS="$LIBS -lrt" + ;; + dag) # # --with-pcap=dag is the only way to get here, and it means --- /dev/null +++ b/pcap-hurd.c @@ -0,0 +1,263 @@ +#define _GNU_SOURCE + +/* XXX Hack not to include the Mach BPF interface */ +#define _DEVICE_BPF_H_ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <fcntl.h> +#include <hurd.h> +#include <mach.h> +#include <time.h> +#include <errno.h> +#include <stdio.h> +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#include <device/device.h> +#include <device/device_types.h> +#include <device/net_status.h> +#include <net/if_ether.h> + +#include "pcap-int.h" + +struct pcap_hurd { + struct pcap_stat stat; + device_t mach_dev; + mach_port_t rcv_port; +}; + +static struct bpf_insn filter[] = { + { NETF_IN | NETF_OUT | NETF_BPF, 0, 0, 0 }, + { BPF_RET | BPF_K, 0, 0, 1500 }, +}; + +#define FILTER_COUNT (sizeof(filter) / sizeof(short)) + +static int +pcap_read_hurd(pcap_t *p, int cnt, pcap_handler callback, u_char *user) +{ + struct net_rcv_msg *msg; + struct pcap_hurd *ph; + struct pcap_pkthdr h; + struct timespec ts; + int ret, wirelen, caplen; + u_char *pkt; + kern_return_t kr; + + ph = p->priv; + msg = (struct net_rcv_msg *)p->buffer; + +retry: + if (p->break_loop) { + p->break_loop = 0; + return PCAP_ERROR_BREAK; + } + + kr = mach_msg(&msg->msg_hdr, MACH_RCV_MSG | MACH_RCV_INTERRUPT, 0, + p->bufsize, ph->rcv_port, MACH_MSG_TIMEOUT_NONE, + MACH_PORT_NULL); + + if (kr) { + if (kr == MACH_RCV_INTERRUPTED) + goto retry; + + snprintf(p->errbuf, sizeof(p->errbuf), "mach_msg: %s", + pcap_strerror(kr)); + return PCAP_ERROR; + } + + ph->stat.ps_recv++; + + /* XXX Ethernet support only */ + wirelen = ETH_HLEN + msg->net_rcv_msg_packet_count + - sizeof(struct packet_header); + pkt = p->buffer + offsetof(struct net_rcv_msg, packet) + + sizeof(struct packet_header) - ETH_HLEN; + memmove(pkt, p->buffer + offsetof(struct net_rcv_msg, header), + ETH_HLEN); + + caplen = (wirelen > p->snapshot) ? p->snapshot : wirelen; + ret = bpf_filter(p->fcode.bf_insns, pkt, wirelen, caplen); + + if (!ret) + goto out; + + clock_gettime(CLOCK_REALTIME, &ts); + h.ts.tv_sec = ts.tv_sec; + h.ts.tv_usec = ts.tv_nsec / 1000; + h.len = wirelen; + h.caplen = caplen; + callback(user, &h, pkt); + +out: + return 1; +} + +static int +pcap_inject_hurd(pcap_t *p, const void *buf, int size) +{ + struct pcap_hurd *ph; + kern_return_t kr; + int count; + + ph = p->priv; + kr = device_write(ph->mach_dev, D_NOWAIT, 0, + (io_buf_ptr_t)buf, size, &count); + + if (kr) { + snprintf(p->errbuf, sizeof(p->errbuf), "device_write: %s", + pcap_strerror(kr)); + return -1; + } + + return count; +} + +static int +pcap_stats_hurd(pcap_t *p, struct pcap_stat *ps) +{ + struct pcap_hurd *ph; + + ph = p->priv; + *ps = ph->stat; + return 0; +} + +static void +pcap_cleanup_hurd(pcap_t *p) +{ + struct pcap_hurd *ph; + + ph = p->priv; + + if (ph->rcv_port != MACH_PORT_NULL) { + mach_port_deallocate(mach_task_self(), ph->rcv_port); + ph->rcv_port = MACH_PORT_NULL; + } + + if (ph->mach_dev != MACH_PORT_NULL) { + device_close(ph->mach_dev); + ph->mach_dev = MACH_PORT_NULL; + } + + pcapint_cleanup_live_common(p); +} + +static int +pcap_activate_hurd(pcap_t *p) +{ + struct pcap_hurd *ph; + mach_port_t master; + kern_return_t kr; + + ph = p->priv; + + /* Try devnode first */ + master = file_name_lookup(p->opt.device, O_READ | O_WRITE, 0); + + if (master != MACH_PORT_NULL) + kr = device_open(master, D_WRITE | D_READ, "eth", &ph->mach_dev); + else { + /* If unsuccessful, try Mach device */ + kr = get_privileged_ports(NULL, &master); + + if (kr) { + snprintf(p->errbuf, sizeof(p->errbuf), + "get_privileged_ports: %s", pcap_strerror(kr)); + goto error; + } + + kr = device_open(master, D_READ | D_WRITE, p->opt.device, + &ph->mach_dev); + } + + mach_port_deallocate(mach_task_self(), master); + + if (kr) { + snprintf(p->errbuf, sizeof(p->errbuf), "device_open: %s", + pcap_strerror(kr)); + goto error; + } + + kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, + &ph->rcv_port); + + if (kr) { + snprintf(p->errbuf, sizeof(p->errbuf), "mach_port_allocate: %s", + pcap_strerror(kr)); + goto error; + } + + kr = device_set_filter(ph->mach_dev, ph->rcv_port, + MACH_MSG_TYPE_MAKE_SEND, 0, + (filter_array_t)filter, FILTER_COUNT); + + if (kr) { + snprintf(p->errbuf, sizeof(p->errbuf), "device_set_filter: %s", + pcap_strerror(kr)); + goto error; + } + + /* XXX Ethernet only currently */ + p->linktype = DLT_EN10MB; + + p->bufsize = sizeof(struct net_rcv_msg); + p->buffer = malloc(p->bufsize); + + if (p->buffer == NULL) { + snprintf(p->errbuf, sizeof(p->errbuf), "malloc: %s", + pcap_strerror(errno)); + goto error; + } + + p->dlt_list = malloc(sizeof(*p->dlt_list)); + + if (p->dlt_list != NULL) + *p->dlt_list = DLT_EN10MB; + + p->read_op = pcap_read_hurd; + p->inject_op = pcap_inject_hurd; + p->setfilter_op = pcapint_install_bpf_program; + p->stats_op = pcap_stats_hurd; + + return 0; + +error: + pcap_cleanup_hurd(p); + return PCAP_ERROR; +} + +pcap_t * +pcapint_create_interface(const char *device _U_, char *ebuf) +{ + struct pcap_hurd *ph; + pcap_t *p; + + p = PCAP_CREATE_COMMON(ebuf, struct pcap_hurd); + if (p == NULL) + return NULL; + + ph = p->priv; + ph->mach_dev = MACH_PORT_NULL; + ph->rcv_port = MACH_PORT_NULL; + p->activate_op = pcap_activate_hurd; + return p; +} + +int +pcapint_platform_finddevs(pcap_if_list_t *alldevsp, char *errbuf) +{ + return 0; +} + +/* + * Libpcap version string. + */ +const char * +pcap_lib_version(void) +{ + return PCAP_VERSION_STRING; +}

