depot/pkgs/os-specific/darwin/apple-source-releases/network_cmds/package.nix
Luke Granger-Brown 57725ef3ec Squashed 'third_party/nixpkgs/' content from commit 76612b17c0ce
git-subtree-dir: third_party/nixpkgs
git-subtree-split: 76612b17c0ce71689921ca12d9ffdc9c23ce40b2
2024-11-10 23:59:47 +00:00

459 lines
16 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
lib,
apple-sdk_11,
developer_cmds,
fetchurl,
libpcap,
libresolv,
mkAppleDerivation,
openssl,
pkg-config,
stdenvNoCC,
unifdef,
}:
let
# Newer releases of ifconfig use `ioctls` and undocumented APIs newer than 11.x.
# Use files from an older release for now.
old_ifconfig = {
ifconfig = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/ifconfig.tproj/ifconfig.c";
hash = "sha256-yuUpdRHRwYLnivuaQuh8HJdLj/8ppq+K1NFqA8Bg+1k=";
};
af_inet = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/ifconfig.tproj/af_inet.c";
hash = "sha256-sqcCEzhTur43DG6Ac/1Rt8Kx0umWhDzlV58t+6FlzNU=";
};
af_inet6 = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/ifconfig.tproj/af_inet6.c";
hash = "sha256-jp0R0Ncwvp9G/lIzKW6wBTAiO8yNyII5c49feTanbIo=";
};
af_link = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/ifconfig.tproj/af_link.c";
hash = "sha256-5rXJg5azy9SjK675Djt4K1PaczsoVjQ/Lls/u5Kk1+A=";
};
};
# Newer releases of netstat use struct members that arent present with the 11.x headers.
# Use files from an older release for now.
old_netstat = {
"if.c" = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/netstat.tproj/if.c";
hash = "sha256-P87rexLkoV1BCyUghVrkGoG6r9rAoWynfpvlwIj7A40=";
};
"main.c" = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/netstat.tproj/main.c";
hash = "sha256-e3n54l6Wo+G5koMhGMfOTo8+QIkJRurr2fBOjg/nFgI=";
};
"inet.c" = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/netstat.tproj/inet.c";
hash = "sha256-X1+dz+D6xR2Xqoxypjmy65pKBCh4iGVfByJGI0wVGO0=";
};
"inet6.c" = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/netstat.tproj/inet6.c";
hash = "sha256-av5K1UQE3edUbzKN9FIn/DOeibsJaTZc0xJzDu9VZ5Q=";
};
"netstat.h" = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/netstat.tproj/netstat.h";
hash = "sha256-UYi3lmA8G0wRJqVA2NYyMj0yCBUlxu0gMoMYW7NauJg=";
};
"unix.c" = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/netstat.tproj/unix.c";
hash = "sha256-txs/mnR4WK8JAUN3PtqZsp6q2h+nx5VFKxI/itCTBNo=";
};
"systm.c" = fetchurl {
url = "https://github.com/apple-oss-distributions/network_cmds/raw/2e18102a14ab72b25caf3a5007c92b9f23e723fc/netstat.tproj/systm.c";
hash = "sha256-bISSIsA6OYfkHNOKB4dj9KNLBHfcelGVzwGiYiVqnRM=";
};
};
xnu = apple-sdk_11.sourceRelease "xnu";
privateHeaders = stdenvNoCC.mkDerivation {
name = "network_cmds-deps-private-headers";
nativeBuildInputs = [ unifdef ];
buildCommand = ''
# Different strategies are needed to make private headers available to network_cmds:
# - If the headers can be used as-is, copy them;
# - If the required symbols are hidden behind a 'PRIVATE' define, `unifdef` is used to expose only those symbols
# for that header. Processing the header avoids exposing unwanted private symbols and requiring more headers;
# - If the symbol is hidden behind a kernel-related define, grep them out of the header. Otherwise,
# the required headers can conflict with system-related headers and require many, many more headers be copied.
install -D -t "$out/include" \
'${xnu}/osfmk/kern/cs_blobs.h'
install -D -t "$out/firehose" \
'${xnu}/libkern/firehose/tracepoint_private.h'
install -D -t "$out/include/net" \
'${xnu}/bsd/net/if_bond_internal.h' \
'${xnu}/bsd/net/if_bond_var.h' \
'${xnu}/bsd/net/if_fake_var.h' \
'${xnu}/bsd/net/if_vlan_var.h' \
'${xnu}/bsd/net/lacp.h' \
'${xnu}/bsd/net/net_perf.h'
mkdir -p "$out/include/net/classq" "$out/include/net/pktsched"
# IFNET constants are defined as enums, so they have to be pre-processed and grepped from the file.
cat <<EOF > "$out/include/net/if.h"
#pragma once
#include <uuid/uuid.h>
$(sed \
-e 's/^\s*\(IFNET_[^=]*\)=\s*\([^,]*\),*/#define \1\2/' \
'${xnu}/bsd/net/if.h' | grep '^#define IFNET_')
#include_next <net/if.h>
#include <netinet/in.h>
#define ifreq ifreq_private
$(sed -n \
-e '/^#define IFEF_TXSTART/p' \
-e '/^#define IFLPRF/p' \
-e '/^#define IFNAMSIZ\s/p' \
-e '/^#define IFRLOGF/p' \
-e '/^#define IFRTYPE/p' \
-e '/^#define IF_DESCSIZE\s/p' \
-e '/^#define IF_NAMESIZE\s/p' \
-e '/^#define NAT64_MAX_NUM_PREFIXES\s/p' \
-e '/^#define ifr_fastlane_capable\s/p' \
-e '/^#define ifr_fastlane_enabled\s/p' \
-e '/^#define ifr_qosmarking_enabled\s/p' \
-e '/^#define ifr_qosmarking_mode\s/p' \
-e '/^struct if_agentidsreq\s*{/,/^};/p' \
-e '/^struct if_clat46req\s*{/,/^};/p' \
-e '/^struct if_descreq\s*{/,/^};/p' \
-e '/^struct if_ipv6_address\s*{/,/^};/p' \
-e '/^struct if_linkparamsreq\s*{/,/^};/p' \
-e '/^struct if_qstatsreq\s*{/,/^};/p' \
-e '/^struct if_nat64req\s*{/,/^};/p' \
-e '/^struct if_nexusreq\s*{/,/^};/p' \
-e '/^struct if_throttlereq\s*{/,/^};/p' \
-e '/^struct ipv6_prefix\s*{/,/^};/p' \
-e '/^struct ifreq\s*{/,/^};/p' \
'${xnu}/bsd/net/if.h')
#undef ifreq
EOF
unifdef -x 1 -DPRIVATE -m "$out/include/net/if.h"
cat <<EOF > "$out/include/net/content_filter.h"
#pragma once
#include <uuid/uuid.h>
#include <net/content_filter_impl.h>
EOF
cat <<EOF > "$out/include/net/if_var.h"
#pragma once
#include_next <net/if_var.h>
$(sed -n \
-e '/^#define IFNAMSIZ\s/p' \
-e '/^#define IF_NETEM/p' \
-e '/^struct if_bandwidths\s*{/,/^};/p' \
-e '/^struct if_data_extended\s*{/,/^};/p' \
-e '/^struct if_interface_state\s*{/,/^};/p' \
-e '/^struct if_latencies\s*{/,/^};/p' \
-e '/^struct if_linkparamsreq\s*{/,/^};/p' \
-e '/^struct if_netem_params\s*{/,/^};/p' \
-e '/^struct if_netif_stats\s*{/,/^};/p' \
-e '/^struct if_packet_stats\s*{/,/^};/p' \
-e '/^struct if_rxpoll_stats\s*{/,/^};/p' \
-e '/^struct if_traffic_class\s*{/,/^};/p' \
'${xnu}/bsd/net/if_var.h')
EOF
cat <<EOF > "$out/include/net/route.h"
#pragma once
#include_next <net/route.h>
$(sed -n \
-e '/^struct rt_msghdr_ext\s*{/,/^};/p' \
-e '/^struct rt_reach_info\s*{/,/^};/p' \
'${xnu}/bsd/net/route.h')
EOF
ln -s "$out/include/net/route.h" "$out/include/net/route_private.h"
install -D -t "$out/include/netinet" \
'${xnu}/bsd/netinet/ip_flowid.h'
cat <<EOF > "$out/include/netinet/in.h"
#pragma once
#include_next <netinet/in.h>
$(sed -n \
-e '/^#define _DSCP/p' \
-e '/^#define IP_NO/p' \
-e '/^union sockaddr_in_4_6\s*{/,/^};/p' \
'${xnu}/bsd/netinet/in.h')
#include <uuid/uuid.h>
EOF
cat <<EOF > "$out/include/netinet/tcp.h"
#pragma once
$(sed -n \
-e '/^struct tcp_info\s*{/,/^};/p' \
-e '/^struct tcp_conn_status\s*{/,/^};/p' \
-e '/^typedef struct conninfo_tcp\s*{/,/} conninfo_tcp_t;/p' \
'${xnu}/bsd/netinet/tcp.h')
#include_next <netinet/tcp.h>
EOF
install -D -t "$out/include/netinet6" \
'${xnu}/bsd/netinet6/in6_pcb.h' \
'${xnu}/bsd/netinet6/ip6_var.h'
cat <<EOF > "$out/include/netinet6/in6.h"
#pragma once
$(sed -n \
-e '/^#define IPV6_/p' \
'${xnu}/bsd/netinet6/in6.h')
#include_next <netinet6/in6.h>
EOF
cat <<EOF > "$out/include/netinet6/in6_var.h"
#pragma once
$(sed -n \
-e '/^#define IN6_CGA/p' \
-e '/^#define SIOCSETROUTERMODE_IN6\s/p' \
-e '/^struct in6_cga_modifier\s*{/,/^};/p' \
-e '/^struct in6_cga_nodecfg\s*{/,/^};/p' \
-e '/^struct in6_cga_prepare\s*{/,/^};/p' \
'${xnu}/bsd/netinet6/in6_var.h')
#include_next <netinet6/in6_var.h>
EOF
mkdir -p "$out/include/netinet6"
cat <<EOF > "$out/include/netinet6/nd6.h"
#pragma once
$(sed -n \
-e '/^#define ND6_IFF/p' \
'${xnu}/bsd/netinet6/nd6.h')
#include_next <netinet6/nd6.h>
EOF
install -D -t "$out/include/os" \
'${xnu}/libkern/os/log_private.h'
declare -a privateHeaders=(
net/classq/classq.h
net/classq/if_classq.h
net/if_bridgevar.h
net/if_llreach.h
net/if_mib.h
net/if_ports_used.h
net/net_api_stats.h
net/network_agent.h
net/ntstat.h
net/packet_mangler.h
net/pktap.h
net/pktsched/pktsched.h
net/pktsched/pktsched_fq_codel.h
net/radix.h
netinet/igmp_var.h
netinet/in_pcb.h
netinet/in_stat.h
netinet/ip_dummynet.h
netinet/mptcp_var.h
netinet/tcp_var.h
netinet6/mld6_var.h
sys/mbuf.h
)
mkdir -p "$out/include/sys"
for header in "''${privateHeaders[@]}"; do
unifdef -x 1 -DPRIVATE -o "$out/include/$header" '${xnu}/bsd/'$header
done
unifdef -x 1 -DPRIVATE -o "$out/include/net/content_filter_impl.h" '${xnu}/bsd/net/content_filter.h'
cat <<EOF > "$out/include/sys/kern_control.h"
#pragma once
$(sed -n \
-e '/^#define MAX_KCTL_NAME\s/p' \
-e '/^struct kctlstat\s*{/,/^};/p' \
-e '/^struct xkctl_reg\s*{/,/^};/p' \
-e '/^struct xkctlpcb\s*{/,/^};/p' \
'${xnu}/bsd/sys/kern_control.h')
#include_next <sys/kern_control.h>
EOF
cat <<EOF > "$out/include/sys/kern_event.h"
#pragma once
$(sed -n \
-e '/^struct kevtstat\s*{/,/^};/p' \
-e '/^struct xkevtpcb\s*{/,/^};/p' \
'${xnu}/bsd/sys/kern_event.h')
#include_next <sys/kern_event.h>
EOF
cat <<EOF > "$out/include/sys/socket.h"
#pragma once
#include <sys/param.h>
#include <sys/_types/_socklen_t.h>
$(sed -n \
-e '/^#define AF_MULTIPATH\s/p' \
-e '/^#define CIAUX_TCP\s/p' \
-e '/^#define NET_RT_/p' \
-e '/^#define SO_RECV/p' \
-e '/^#define SO_TRAFFIC_CLASS\s/,/^#define SO_TC_MAX/p' \
-e '/^typedef.*sae_associd_t/p' \
-e '/^typedef.*sae_connid_t/p' \
-e '/^struct so_aidreq\s*{/,/^};/p' \
-e '/^struct so_cidreq\s*{/,/^};/p' \
-e '/^struct so_cinforeq\s*{/,/^};/p' \
-e '/^struct so_cordreq\s*{/,/^};/p' \
'${xnu}/bsd/sys/socket.h')
#include_next <sys/socket.h>
EOF
cat <<EOF > "$out/include/sys/socketvar.h"
#pragma once
$(sed -n \
-e '/^#define SO_TC_STATS_MAX\s/p' \
-e '/^#define XSO_/p' \
-e '/^struct data_stats\s*{/,/^};/p' \
-e '/^struct soextbkidlestat\s*{/,/^};/p' \
-e '/^struct xsocket_n\s*{/,/^};/p' \
-e '/^struct xsockbuf_n\s*{/,/^};/p' \
-e '/^struct xsockstat_n\s*{/,/^};/p' \
'${xnu}/bsd/sys/socketvar.h')
#include_next <sys/socketvar.h>
EOF
cat <<EOF > "$out/include/sys/sockio.h"
#pragma once
#define ifreq ifreq_private
$(sed -n \
-e '/^#define SIOCGASSOCIDS\s/p' \
-e '/^#define SIOCGCONNIDS\s/p' \
-e '/^#define SIOCGCONNINFO\s/p' \
-e '/^#define SIOCGIFAGENTDATA\s/p' \
-e '/^#define SIOCGIFAGENTIDS\s/p' \
-e '/^#define SIOCGIFCLAT46ADDR\s/p' \
-e '/^#define SIOCGIFDELEGATE\s/p' \
-e '/^#define SIOCGIFDESC\s/p' \
-e '/^#define SIOCGIFEFLAGS\s/p' \
-e '/^#define SIOCGIFGETRTREFCNT\s/p' \
-e '/^#define SIOCGIFINTERFACESTATE\s/p' \
-e '/^#define SIOCGIFLINKPARAMS\s/p' \
-e '/^#define SIOCGIFLINKQUALITYMETRIC\s/p' \
-e '/^#define SIOCGIFLOG\s/p' \
-e '/^#define SIOCGIFLOWPOWER\s/p' \
-e '/^#define SIOCGIFMPKLOG\s/p' \
-e '/^#define SIOCGIFNAT64PREFIX\s/p' \
-e '/^#define SIOCGIFNEXUS\s/p' \
-e '/^#define SIOCGIFQUEUESTATS\s/p' \
-e '/^#define SIOCGIFTHROTTLE\s/p' \
-e '/^#define SIOCGIFTIMESTAMPENABLED\s/p' \
-e '/^#define SIOCGIFTYPE\s/p' \
-e '/^#define SIOCGIFXFLAGS\s/p' \
-e '/^#define SIOCGSTARTDELAY\s/p' \
-e '/^#define SIOCSECNMODE\s/p' \
-e '/^#define SIOCSETROUTERMODE\s/p' \
-e '/^#define SIOCSFASTLANECAPABLE\s/p' \
-e '/^#define SIOCSFASTLEENABLED\s/p' \
-e '/^#define SIOCSIF2KCL\s/p' \
-e '/^#define SIOCSIFDESC\s/p' \
-e '/^#define SIOCSIFDISABLEOUTPUT\s/p' \
-e '/^#define SIOCSIFEXPENSIVE\s/p' \
-e '/^#define SIOCSIFINTERFACESTATE\s/p' \
-e '/^#define SIOCSIFLINKPARAMS\s/p' \
-e '/^#define SIOCSIFLOG\s/p' \
-e '/^#define SIOCSIFLOWPOWER\s/p' \
-e '/^#define SIOCSIFMPKLOG\s/p' \
-e '/^#define SIOCSIFPROBECONNECTIVITY\s/p' \
-e '/^#define SIOCSIFSUBFAMILY\s/p' \
-e '/^#define SIOCSIFTHROTTLE\s/p' \
-e '/^#define SIOCSIFTIMESTAMPDISABLE\s/p' \
-e '/^#define SIOCSIFTIMESTAMPENABLE\s/p' \
-e '/^#define SIOCSQOSMARKINGENABLED\s/p' \
-e '/^#define SIOCSQOSMARKINGMODE\s/p' \
'${xnu}/bsd/sys/sockio.h')
#undef ifreq
#include_next <sys/sockio.h>
EOF
cat <<EOF > "$out/include/sys/sys_domain.h"
#pragma once
$(sed -n \
-e '/^#define AF_SYS/p' \
-e '/^#define SYSPROTO/p' \
-e '/^struct xsystmgen\s*{/,/^};/p' \
'${xnu}/bsd/sys/sys_domain.h')
#include_next <sys/sys_domain.h>
EOF
cat <<EOF > "$out/include/sys/syslimits.h"
#pragma once
$(grep '^#define LINE_MAX\s' '${xnu}/bsd/sys/syslimits.h')
#include_next <sys/syslimits.h>
EOF
cat <<EOF > "$out/include/sys/unpcb.h"
#pragma once
#include_next <sys/unpcb.h>
$(sed -n \
-e '/^#define xu_addr/p' \
-e '/^struct xunpcb64_list_entry\s*{/,/^};/p' \
-e '/^struct xunpcb64\s*{/,/^};/p' \
'${xnu}/bsd/sys/unpcb.h')
'';
};
in
mkAppleDerivation {
releaseName = "network_cmds";
outputs = [
"out"
"man"
];
xcodeHash = "sha256-L5upfoE6uHsdFOzylTTH+UPftA96qdpnvgFcK5dmhgY=";
patches = [
# Some private headers depend on corecrypto, which we cant use.
# Use the headers from the ld64 port, which delegates to OpenSSL.
./patches/0007-Add-OpenSSL-based-CoreCrypto-digest-functions.patch
];
postPatch = ''
# Fix invalid pointer conversion error from trying to pass `NULL` to a `size_t`.
substituteInPlace ndp.tproj/ndp.c --replace-fail 'NULL, NULL);' 'NULL, 0);'
# Copy older files that are more compatible with the current SDK.
${lib.concatLines (
lib.mapAttrsToList (name: path: "cp '${path}' 'ifconfig.tproj/${name}.c'") old_ifconfig
)}
${lib.concatLines (
lib.mapAttrsToList (name: path: "cp '${path}' 'netstat.tproj/${name}'") old_netstat
)}
# Use private struct ifreq instead of the one defined in the system header.
substituteInPlace ifconfig.tproj/ifconfig.c \
--replace-fail $'struct\tifreq' 'struct ifreq' \
--replace-fail 'struct ifreq' 'struct ifreq_private'
substituteInPlace ifconfig.tproj/ifvlan.c \
--replace-fail 'struct ifreq' 'struct ifreq_private'
substituteInPlace ifconfig.tproj/ifconfig.h \
--replace-fail 'struct ifreq' 'struct ifreq_private'
substituteInPlace netstat.tproj/if.c \
--replace-fail 'struct ifreq' 'struct ifreq_private'
'';
env.NIX_CFLAGS_COMPILE = "-I${privateHeaders}/include";
nativeBuildInputs = [
developer_cmds
pkg-config
];
buildInputs = [
apple-sdk_11
libpcap
libresolv
openssl
];
meta.description = "Network commands for Darwin";
}