{
  liminix
, writeAshScript
, serviceFns
, lib
} :
{ interface }:
let
  inherit (liminix.services) longrun;
  name = "${interface.name}.dhcpc";
  script = writeAshScript "dhcp-notify"  { } ''
    . ${serviceFns}
    exec 2>&1
    action=$1

    set_address() {
        ip address replace $ip/$mask dev $interface
        (in_outputs ${name}
         for i in lease mask ip router siaddr dns serverid subnet opt53 interface ; do
            printenv $i > $i
         done)
    }
    case $action in
      deconfig)
        ip address flush $interface
        ip link set up dev $interface
        ;;
      bound)
        # this doesn't actually replace, it adds a new address.
        set_address
        echo  >/proc/self/fd/10
        ;;
      renew)
        set_address
        ;;
      nak)
        echo "received NAK on $interface"
        ;;
    esac
  '';
in longrun {
  inherit name;
  run = "/bin/udhcpc -f -i $(output ${interface} ifname) -x hostname:$(cat /proc/sys/kernel/hostname) -s ${script}";
  notification-fd = 10;
  dependencies = [ interface ];
}