{ pkgs, buildEnv, runCommand, hostPlatform }:

# These are some unix tools that are commonly included in the /usr/bin
# and /usr/sbin directory under more normal distributions. Along with
# coreutils, these are commonly assumed to be available by build
# systems, but we can't assume they are available. In Nix, we list
# each program by name directly through this unixtools attribute.

# You should always try to use single binaries when available. For
# instance, if your program needs to use "ps", just list it as a build
# input, not "procps" which requires Linux.

let

  singleBinary = cmd: providers: let
      provider = "${providers.${hostPlatform.parsed.kernel.name} or "missing-package"}/bin/${cmd}";
    in runCommand cmd {
      meta.platforms = map (n: { kernel.name = n; }) (pkgs.lib.attrNames providers);
    } ''
      mkdir -p $out/bin

      if ! [ -x "${provider}" ]; then
        echo "Cannot find command ${cmd}"
        exit 1
      fi

      ln -s "${provider}" "$out/bin/${cmd}"
    '';

in rec {

  # more is unavailable in darwin
  # just use less
  more_compat = runCommand "more" {} ''
    mkdir -p $out/bin
    ln -s ${pkgs.less}/bin/less $out/bin/more
  '';

  # singular binaries
  arp = singleBinary "arp" {
    linux = pkgs.nettools;
    darwin = pkgs.darwin.network_cmds;
  };
  eject = singleBinary "eject" {
    linux = pkgs.utillinux;
  };
  getopt = singleBinary "getopt" {
    linux = pkgs.utillinux;
    darwin = pkgs.getopt;
  };
  hexdump = singleBinary "hexdump" {
    linux = pkgs.procps;
    darwin = pkgs.darwin.shell_cmds;
  };
  hostname = singleBinary "hostname" {
    linux = pkgs.nettools;
    darwin = pkgs.darwin.shell_cmds;
  };
  ifconfig = singleBinary "ifconfig" {
    linux = pkgs.nettools;
    darwin = pkgs.darwin.network_cmds;
  };
  logger = singleBinary "logger" {
    linux = pkgs.utillinux;
  };
  modprobe = singleBinary "modprobe" {
    linux = pkgs.utillinux;
  };
  more = singleBinary "more" {
    linux = pkgs.utillinux;
    darwin = more_compat;
  };
  mount = singleBinary "mount" {
    linux = pkgs.utillinux;
  };
  netstat = singleBinary "netstat" {
    linux = pkgs.nettools;
    darwin = pkgs.darwin.network_cmds;
  };
  ping = singleBinary "ping" {
    linux = pkgs.iputils;
    darwin = pkgs.darwin.network_cmds;
  };
  ps = singleBinary "ps" {
    linux = pkgs.procps;
    darwin = pkgs.darwin.ps;
  };
  route = singleBinary "route" {
    linux = pkgs.nettools;
    darwin = pkgs.darwin.network_cmds;
  };
  script = singleBinary "script" {
    linux = pkgs.utillinux;
    darwin = pkgs.darwin.shell_cmds;
  };
  sysctl = singleBinary "sysctl" {
    linux = pkgs.procps;
    darwin = pkgs.darwin.system_cmds;
  };
  umount = singleBinary "umount" {
    linux = pkgs.utillinux;
  };
  whereis = singleBinary "whereis" {
    linux = pkgs.utillinux;
    darwin = pkgs.darwin.shell_cmds;
  };
  wall = singleBinary "wall" {
    linux = pkgs.utillinux;
  };
  write = singleBinary "write" {
    linux = pkgs.utillinux;
    darwin = pkgs.darwin.basic_cmds;
  };

  # Compatibility derivations
  # Provided for old usage of these commands.

  procps = buildEnv {
    name = "procps-compat";
    paths = [ sysctl ps ];
  };

  utillinux = buildEnv {
    name = "utillinux-compat";
    paths = [ getopt hexdump script whereis write ];
  };

  nettools = buildEnv {
    name = "nettools-compat";
    paths = [ arp hostname netstat route ];
  };
}