config() {
  NEW="$1"
  OLD="$(dirname $NEW)/$(basename $NEW .new)"
  # If there's no config file by that name, mv it over:
  if [ ! -r $OLD ]; then
    mv $NEW $OLD
  elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then
    # toss the redundant copy
    rm $NEW
  fi
  # Otherwise, we leave the .new copy for the admin to consider...
}

preserve_perms() {
  NEW="$1"
  OLD="$(dirname $NEW)/$(basename $NEW .new)"
  if [ -e $OLD ]; then
    cp -a $OLD ${NEW}.incoming
    cat $NEW > ${NEW}.incoming
    mv ${NEW}.incoming $NEW
  fi
  config $NEW
}

preserve_perms etc/rc.d/rc.zfs.new

if [ -x /sbin/depmod ]; then
  chroot . /sbin/depmod -a >/dev/null 2>&1
fi
( cd etc/rc.d/init.d ; rm -rf zfs )
( cd etc/rc.d/init.d ; ln -sf ../rc.zfs zfs )
( cd etc/zfs/zed.d ; rm -rf all-syslog.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/all-syslog.sh all-syslog.sh )
( cd etc/zfs/zed.d ; rm -rf data-notify.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/data-notify.sh data-notify.sh )
( cd etc/zfs/zed.d ; rm -rf history_event-zfs-list-cacher.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/history_event-zfs-list-cacher.sh history_event-zfs-list-cacher.sh )
( cd etc/zfs/zed.d ; rm -rf pool_import-led.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/pool_import-led.sh pool_import-led.sh )
( cd etc/zfs/zed.d ; rm -rf resilver_finish-notify.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/resilver_finish-notify.sh resilver_finish-notify.sh )
( cd etc/zfs/zed.d ; rm -rf resilver_finish-start-scrub.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/resilver_finish-start-scrub.sh resilver_finish-start-scrub.sh )
( cd etc/zfs/zed.d ; rm -rf scrub_finish-notify.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/scrub_finish-notify.sh scrub_finish-notify.sh )
( cd etc/zfs/zed.d ; rm -rf statechange-led.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/statechange-led.sh statechange-led.sh )
( cd etc/zfs/zed.d ; rm -rf statechange-notify.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/statechange-notify.sh statechange-notify.sh )
( cd etc/zfs/zed.d ; rm -rf vdev_attach-led.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/vdev_attach-led.sh vdev_attach-led.sh )
( cd etc/zfs/zed.d ; rm -rf vdev_clear-led.sh )
( cd etc/zfs/zed.d ; ln -sf /usr/libexec/zfs/zed.d/vdev_clear-led.sh vdev_clear-led.sh )
( cd etc/zfs/zpool.d ; rm -rf ata_err )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/ata_err ata_err )
( cd etc/zfs/zpool.d ; rm -rf cmd_to )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/cmd_to cmd_to )
( cd etc/zfs/zpool.d ; rm -rf defect )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/defect defect )
( cd etc/zfs/zpool.d ; rm -rf dm-deps )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/dm-deps dm-deps )
( cd etc/zfs/zpool.d ; rm -rf enc )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/enc enc )
( cd etc/zfs/zpool.d ; rm -rf encdev )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/encdev encdev )
( cd etc/zfs/zpool.d ; rm -rf fault_led )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/fault_led fault_led )
( cd etc/zfs/zpool.d ; rm -rf health )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/health health )
( cd etc/zfs/zpool.d ; rm -rf hours_on )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/hours_on hours_on )
( cd etc/zfs/zpool.d ; rm -rf iostat )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/iostat iostat )
( cd etc/zfs/zpool.d ; rm -rf iostat-10s )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/iostat-10s iostat-10s )
( cd etc/zfs/zpool.d ; rm -rf iostat-1s )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/iostat-1s iostat-1s )
( cd etc/zfs/zpool.d ; rm -rf label )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/label label )
( cd etc/zfs/zpool.d ; rm -rf locate_led )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/locate_led locate_led )
( cd etc/zfs/zpool.d ; rm -rf lsblk )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/lsblk lsblk )
( cd etc/zfs/zpool.d ; rm -rf media )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/media media )
( cd etc/zfs/zpool.d ; rm -rf model )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/model model )
( cd etc/zfs/zpool.d ; rm -rf nonmed )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/nonmed nonmed )
( cd etc/zfs/zpool.d ; rm -rf nvme_err )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/nvme_err nvme_err )
( cd etc/zfs/zpool.d ; rm -rf off_ucor )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/off_ucor off_ucor )
( cd etc/zfs/zpool.d ; rm -rf pend_sec )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/pend_sec pend_sec )
( cd etc/zfs/zpool.d ; rm -rf pwr_cyc )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/pwr_cyc pwr_cyc )
( cd etc/zfs/zpool.d ; rm -rf r_proc )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/r_proc r_proc )
( cd etc/zfs/zpool.d ; rm -rf r_ucor )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/r_ucor r_ucor )
( cd etc/zfs/zpool.d ; rm -rf realloc )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/realloc realloc )
( cd etc/zfs/zpool.d ; rm -rf rep_ucor )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/rep_ucor rep_ucor )
( cd etc/zfs/zpool.d ; rm -rf serial )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/serial serial )
( cd etc/zfs/zpool.d ; rm -rf ses )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/ses ses )
( cd etc/zfs/zpool.d ; rm -rf size )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/size size )
( cd etc/zfs/zpool.d ; rm -rf slot )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/slot slot )
( cd etc/zfs/zpool.d ; rm -rf smart )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/smart smart )
( cd etc/zfs/zpool.d ; rm -rf smart_test )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/smart_test smart_test )
( cd etc/zfs/zpool.d ; rm -rf smartx )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/smartx smartx )
( cd etc/zfs/zpool.d ; rm -rf temp )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/temp temp )
( cd etc/zfs/zpool.d ; rm -rf test_ended )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/test_ended test_ended )
( cd etc/zfs/zpool.d ; rm -rf test_progress )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/test_progress test_progress )
( cd etc/zfs/zpool.d ; rm -rf test_status )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/test_status test_status )
( cd etc/zfs/zpool.d ; rm -rf test_type )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/test_type test_type )
( cd etc/zfs/zpool.d ; rm -rf upath )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/upath upath )
( cd etc/zfs/zpool.d ; rm -rf vendor )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/vendor vendor )
( cd etc/zfs/zpool.d ; rm -rf w_proc )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/w_proc w_proc )
( cd etc/zfs/zpool.d ; rm -rf w_ucor )
( cd etc/zfs/zpool.d ; ln -sf /usr/libexec/zfs/zpool.d/w_ucor w_ucor )
( cd lib64 ; rm -rf libnvpair.so )
( cd lib64 ; ln -sf libnvpair.so.3.0.0 libnvpair.so )
( cd lib64 ; rm -rf libnvpair.so.3 )
( cd lib64 ; ln -sf libnvpair.so.3.0.0 libnvpair.so.3 )
( cd lib64 ; rm -rf libuutil.so )
( cd lib64 ; ln -sf libuutil.so.3.0.0 libuutil.so )
( cd lib64 ; rm -rf libuutil.so.3 )
( cd lib64 ; ln -sf libuutil.so.3.0.0 libuutil.so.3 )
( cd lib64 ; rm -rf libzfs.so )
( cd lib64 ; ln -sf libzfs.so.4.1.0 libzfs.so )
( cd lib64 ; rm -rf libzfs.so.4 )
( cd lib64 ; ln -sf libzfs.so.4.1.0 libzfs.so.4 )
( cd lib64 ; rm -rf libzfs_core.so )
( cd lib64 ; ln -sf libzfs_core.so.3.0.0 libzfs_core.so )
( cd lib64 ; rm -rf libzfs_core.so.3 )
( cd lib64 ; ln -sf libzfs_core.so.3.0.0 libzfs_core.so.3 )
( cd lib64 ; rm -rf libzfsbootenv.so )
( cd lib64 ; ln -sf libzfsbootenv.so.1.0.0 libzfsbootenv.so )
( cd lib64 ; rm -rf libzfsbootenv.so.1 )
( cd lib64 ; ln -sf libzfsbootenv.so.1.0.0 libzfsbootenv.so.1 )
( cd lib64 ; rm -rf libzpool.so )
( cd lib64 ; ln -sf libzpool.so.5.0.0 libzpool.so )
( cd lib64 ; rm -rf libzpool.so.5 )
( cd lib64 ; ln -sf libzpool.so.5.0.0 libzpool.so.5 )
( cd sbin ; rm -rf zstreamdump )
( cd sbin ; ln -sf zstream zstreamdump )
( cd usr/share/zfs/compatibility.d ; rm -rf 2018 )
( cd usr/share/zfs/compatibility.d ; ln -sf compat-2018 2018 )
( cd usr/share/zfs/compatibility.d ; rm -rf 2019 )
( cd usr/share/zfs/compatibility.d ; ln -sf compat-2019 2019 )
( cd usr/share/zfs/compatibility.d ; rm -rf 2020 )
( cd usr/share/zfs/compatibility.d ; ln -sf compat-2020 2020 )
( cd usr/share/zfs/compatibility.d ; rm -rf 2021 )
( cd usr/share/zfs/compatibility.d ; ln -sf compat-2021 2021 )
( cd usr/share/zfs/compatibility.d ; rm -rf freebsd-11.1 )
( cd usr/share/zfs/compatibility.d ; ln -sf freebsd-11.0 freebsd-11.1 )
( cd usr/share/zfs/compatibility.d ; rm -rf freebsd-11.4 )
( cd usr/share/zfs/compatibility.d ; ln -sf freebsd-11.3 freebsd-11.4 )
( cd usr/share/zfs/compatibility.d ; rm -rf freebsd-12.0 )
( cd usr/share/zfs/compatibility.d ; ln -sf freebsd-11.3 freebsd-12.0 )
( cd usr/share/zfs/compatibility.d ; rm -rf freebsd-12.1 )
( cd usr/share/zfs/compatibility.d ; ln -sf freebsd-11.3 freebsd-12.1 )
( cd usr/share/zfs/compatibility.d ; rm -rf freebsd-12.2 )
( cd usr/share/zfs/compatibility.d ; ln -sf freebsd-11.3 freebsd-12.2 )
( cd usr/share/zfs/compatibility.d ; rm -rf freenas-11.0 )
( cd usr/share/zfs/compatibility.d ; ln -sf freebsd-11.0 freenas-11.0 )
( cd usr/share/zfs/compatibility.d ; rm -rf freenas-11.1 )
( cd usr/share/zfs/compatibility.d ; ln -sf freenas-11.0 freenas-11.1 )
( cd usr/share/zfs/compatibility.d ; rm -rf freenas-11.2 )
( cd usr/share/zfs/compatibility.d ; ln -sf freebsd-11.2 freenas-11.2 )
( cd usr/share/zfs/compatibility.d ; rm -rf freenas-11.3 )
( cd usr/share/zfs/compatibility.d ; ln -sf freebsd-11.3 freenas-11.3 )
( cd usr/share/zfs/compatibility.d ; rm -rf openzfsonosx-1.9.4 )
( cd usr/share/zfs/compatibility.d ; ln -sf openzfsonosx-1.9.3 openzfsonosx-1.9.4 )
( cd usr/share/zfs/compatibility.d ; rm -rf truenas-12.0 )
( cd usr/share/zfs/compatibility.d ; ln -sf openzfs-2.0-freebsd truenas-12.0 )
( cd usr/share/zfs/compatibility.d ; rm -rf ubuntu-18.04 )
( cd usr/share/zfs/compatibility.d ; ln -sf zol-0.7 ubuntu-18.04 )
( cd usr/share/zfs/compatibility.d ; rm -rf ubuntu-20.04 )
( cd usr/share/zfs/compatibility.d ; ln -sf zol-0.8 ubuntu-20.04 )
