aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.git-blame-ignore-revs2
-rw-r--r--.gitignore1
-rw-r--r--ObsoleteFiles.inc3
-rw-r--r--UPDATING13
-rw-r--r--cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c9
-rw-r--r--contrib/libxo/libxo/xo.h8
-rw-r--r--contrib/libxo/libxo/xo_encoder.h8
-rwxr-xr-xcontrib/unbound/config.guess17
-rw-r--r--contrib/unbound/config.h.in360
-rwxr-xr-xcontrib/unbound/config.sub28
-rwxr-xr-xcontrib/unbound/configure4435
-rw-r--r--contrib/unbound/configure.ac5
-rw-r--r--contrib/unbound/doc/README2
-rw-r--r--contrib/unbound/doc/example.conf300
-rw-r--r--contrib/unbound/doc/example.conf.in2
-rw-r--r--contrib/unbound/doc/libunbound.34
-rw-r--r--contrib/unbound/doc/libunbound.3.in4
-rw-r--r--contrib/unbound/doc/unbound-anchor.814
-rw-r--r--contrib/unbound/doc/unbound-anchor.8.in2
-rw-r--r--contrib/unbound/doc/unbound-checkconf.88
-rw-r--r--contrib/unbound/doc/unbound-checkconf.8.in2
-rw-r--r--contrib/unbound/doc/unbound-control.8343
-rw-r--r--contrib/unbound/doc/unbound-control.8.in2
-rw-r--r--contrib/unbound/doc/unbound-host.14
-rw-r--r--contrib/unbound/doc/unbound-host.1.in2
-rw-r--r--contrib/unbound/doc/unbound.88
-rw-r--r--contrib/unbound/doc/unbound.8.in4
-rw-r--r--contrib/unbound/doc/unbound.conf.5741
-rw-r--r--contrib/unbound/doc/unbound.conf.5.in2
-rw-r--r--contrib/unbound/edns-subnet/subnetmod.c152
-rw-r--r--contrib/unbound/edns-subnet/subnetmod.h4
-rw-r--r--contrib/unbound/ltmain.sh1555
-rw-r--r--[-rwxr-xr-x]contrib/unbound/smallapp/unbound-control-setup.sh227
-rw-r--r--etc/mtree/BSD.usr.dist2
-rw-r--r--include/dirent.h4
-rw-r--r--lib/clang/freebsd_cc_version.h2
-rw-r--r--lib/clang/include/lld/Common/Version.inc2
-rw-r--r--lib/libc/gen/Makefile.inc1
-rw-r--r--lib/libc/gen/Symbol.map1
-rw-r--r--lib/libc/gen/directory.351
-rw-r--r--lib/libc/gen/gen-compat.h1
-rw-r--r--lib/libc/gen/gen-private.h3
-rw-r--r--lib/libc/gen/readdir-compat11.c2
-rw-r--r--lib/libc/gen/readdir.c8
-rw-r--r--lib/libjail/jail.c64
-rw-r--r--lib/libkvm/kvm_proc.c9
-rw-r--r--lib/libsys/Symbol.sys.map2
-rw-r--r--lib/libsys/_libsys.h4
-rw-r--r--lib/libsys/jail.2253
-rw-r--r--lib/libsys/syscalls.map4
-rw-r--r--lib/libunbound/Makefile31
-rw-r--r--lib/libunbound/config.h521
-rw-r--r--libexec/rc/rc.conf8
-rw-r--r--libexec/rc/rc.d/Makefile1
-rwxr-xr-xlibexec/rc/rc.d/msconvd61
-rw-r--r--release/tools/oracle.conf1
-rw-r--r--release/tools/vmimage.subr2
-rw-r--r--sbin/devd/devd.cc21
-rw-r--r--sbin/dhclient/packet.c53
-rw-r--r--sbin/ifconfig/af_inet6.c2
-rw-r--r--sbin/pfctl/parse.y2
-rw-r--r--sbin/pfctl/pfctl.c29
-rw-r--r--sbin/pfctl/pfctl_parser.h1
-rw-r--r--sbin/pfctl/pfctl_table.c18
-rw-r--r--secure/lib/libcrypto/man/man3/Makefile4713
-rw-r--r--secure/lib/libcrypto/man/man7/Makefile38
-rw-r--r--share/man/man4/gpioled.415
-rw-r--r--share/man/man4/random.413
-rw-r--r--share/man/man4/tcp.410
-rw-r--r--share/man/man4/vtnet.42
-rw-r--r--share/man/man5/src.conf.513
-rw-r--r--share/man/man7/ports.74
-rw-r--r--share/man/man8/nanobsd.810
-rw-r--r--share/man/man9/g_geom.915
-rw-r--r--share/mk/bsd.cpu.mk7
-rw-r--r--share/mk/bsd.opts.mk2
-rw-r--r--share/mk/src.opts.mk1
-rw-r--r--share/mk/src.sys.mk4
-rw-r--r--stand/common/gfx_fb.c1
-rw-r--r--stand/efi/boot1/boot1.c4
-rw-r--r--stand/efi/loader/Makefile1
-rw-r--r--stand/efi/loader/arch/amd64/multiboot2.c2
-rw-r--r--stand/efi/loader/arch/amd64/trap.c1
-rw-r--r--stand/efi/loader/bootinfo.c5
-rw-r--r--stand/efi/loader/copy.c4
-rw-r--r--stand/efi/loader/efi_main.c2
-rw-r--r--stand/efi/loader/framebuffer.c7
-rw-r--r--stand/efi/loader/main.c18
-rw-r--r--stand/fonts/INDEX.fonts3
-rw-r--r--sys/amd64/conf/GENERIC2
-rw-r--r--sys/amd64/include/vmm.h1
-rw-r--r--sys/arm/conf/TEGRA1242
-rw-r--r--sys/arm64/include/vmm.h1
-rw-r--r--sys/arm64/vmm/vmm.c6
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c11
-rw-r--r--sys/compat/freebsd32/freebsd32_syscall.h4
-rw-r--r--sys/compat/freebsd32/freebsd32_syscalls.c2
-rw-r--r--sys/compat/freebsd32/freebsd32_sysent.c2
-rw-r--r--sys/compat/freebsd32/freebsd32_systrace_args.c44
-rw-r--r--sys/compat/linuxkpi/common/include/acpi/acpi.h2
-rw-r--r--sys/compat/linuxkpi/common/include/kunit/static_stub.h15
-rw-r--r--sys/compat/linuxkpi/common/include/linux/cleanup.h49
-rw-r--r--sys/compat/linuxkpi/common/include/linux/compiler.h6
-rw-r--r--sys/compat/linuxkpi/common/include/linux/device.h5
-rw-r--r--sys/compat/linuxkpi/common/include/linux/math.h2
-rw-r--r--sys/compat/linuxkpi/common/include/linux/math64.h6
-rw-r--r--sys/compat/linuxkpi/common/include/linux/overflow.h180
-rw-r--r--sys/compat/linuxkpi/common/include/linux/pci.h17
-rw-r--r--sys/compat/linuxkpi/common/include/linux/rcupdate.h5
-rw-r--r--sys/compat/linuxkpi/common/include/linux/slab.h4
-rw-r--r--sys/compat/linuxkpi/common/include/linux/timer.h21
-rw-r--r--sys/compat/linuxkpi/common/src/linux_80211.c2
-rw-r--r--sys/compat/linuxkpi/common/src/linux_compat.c11
-rw-r--r--sys/compat/linuxkpi/common/src/linux_devres.c26
-rw-r--r--sys/compat/linuxkpi/common/src/linux_pci.c128
-rw-r--r--sys/compat/linuxkpi/dummy/include/kunit/skbuff.h0
-rw-r--r--sys/compat/linuxkpi/dummy/include/kunit/test-bug.h0
-rw-r--r--sys/compat/linuxkpi/dummy/include/kunit/test.h0
-rw-r--r--sys/conf/NOTES10
-rw-r--r--sys/conf/files1
-rw-r--r--sys/conf/kern.pre.mk4
-rw-r--r--sys/conf/newvers.sh4
-rw-r--r--sys/contrib/libnv/nvlist.c10
-rwxr-xr-xsys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py2
-rw-r--r--sys/contrib/openzfs/.github/workflows/zfs-qemu.yml9
-rw-r--r--sys/contrib/openzfs/META4
-rw-r--r--sys/contrib/openzfs/Makefile.am4
-rw-r--r--sys/contrib/openzfs/cmd/Makefile.am6
-rwxr-xr-xsys/contrib/openzfs/cmd/arc_summary7
-rwxr-xr-xsys/contrib/openzfs/cmd/arcstat.in9
-rw-r--r--sys/contrib/openzfs/cmd/zdb/zdb.c2
-rw-r--r--sys/contrib/openzfs/cmd/zhack.c4
-rw-r--r--sys/contrib/openzfs/cmd/zpool/Makefile.am5
-rw-r--r--sys/contrib/openzfs/cmd/zpool/compatibility.d/openzfs-2.448
-rw-r--r--sys/contrib/openzfs/cmd/zstream/Makefile.am5
-rw-r--r--sys/contrib/openzfs/config/always-arch.m417
-rw-r--r--sys/contrib/openzfs/config/always-compiler-options.m462
-rw-r--r--sys/contrib/openzfs/config/kernel-blkdev.m49
-rw-r--r--sys/contrib/openzfs/config/kernel-dentry-operations.m412
-rw-r--r--sys/contrib/openzfs/config/kernel.m42
-rw-r--r--sys/contrib/openzfs/config/user-statx.m46
-rw-r--r--sys/contrib/openzfs/config/zfs-build.m42
-rw-r--r--sys/contrib/openzfs/contrib/debian/openzfs-zfsutils.install2
-rwxr-xr-xsys/contrib/openzfs/contrib/debian/rules.in2
-rw-r--r--sys/contrib/openzfs/contrib/initramfs/hooks/zfsunlock.in9
-rw-r--r--sys/contrib/openzfs/contrib/pam_zfs_key/pam_zfs_key.c4
-rw-r--r--sys/contrib/openzfs/include/os/linux/kernel/linux/dcache_compat.h26
-rw-r--r--sys/contrib/openzfs/include/os/linux/spl/sys/stat.h2
-rw-r--r--sys/contrib/openzfs/include/sys/zio.h3
-rw-r--r--sys/contrib/openzfs/include/sys/zvol.h2
-rw-r--r--sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h2
-rw-r--r--sys/contrib/openzfs/man/man1/arcstat.14
-rw-r--r--sys/contrib/openzfs/man/man1/cstyle.12
-rw-r--r--sys/contrib/openzfs/man/man1/zhack.12
-rw-r--r--sys/contrib/openzfs/man/man1/ztest.12
-rw-r--r--sys/contrib/openzfs/man/man4/spl.42
-rw-r--r--sys/contrib/openzfs/man/man4/zfs.42
-rw-r--r--sys/contrib/openzfs/man/man5/vdev_id.conf.52
-rw-r--r--sys/contrib/openzfs/man/man7/dracut.zfs.72
-rw-r--r--sys/contrib/openzfs/man/man7/vdevprops.72
-rw-r--r--sys/contrib/openzfs/man/man7/zfsconcepts.72
-rw-r--r--sys/contrib/openzfs/man/man7/zfsprops.72
-rw-r--r--sys/contrib/openzfs/man/man7/zpool-features.72
-rw-r--r--sys/contrib/openzfs/man/man7/zpoolconcepts.72
-rw-r--r--sys/contrib/openzfs/man/man7/zpoolprops.72
-rw-r--r--sys/contrib/openzfs/man/man8/zdb.82
-rw-r--r--sys/contrib/openzfs/man/man8/zed.8.in2
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-allow.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-bookmark.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-clone.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-create.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-destroy.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-diff.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-hold.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-jail.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-list.847
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-load-key.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-mount-generator.8.in2
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-mount.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-project.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-promote.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-rename.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-rewrite.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-send.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-set.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-share.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-snapshot.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-upgrade.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-userspace.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-wait.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs-zone.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs.82
-rw-r--r--sys/contrib/openzfs/man/man8/zfs_ids_to_path.82
-rw-r--r--sys/contrib/openzfs/man/man8/zgenhostid.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-attach.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-checkpoint.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-clear.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-create.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-destroy.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-detach.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-export.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-get.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-history.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-import.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-initialize.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-iostat.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-labelclear.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-list.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-offline.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-reguid.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-remove.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-reopen.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-replace.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-resilver.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-scrub.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-split.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-status.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-sync.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-trim.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-upgrade.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool-wait.82
-rw-r--r--sys/contrib/openzfs/man/man8/zpool.82
-rw-r--r--sys/contrib/openzfs/man/man8/zstream.82
-rw-r--r--sys/contrib/openzfs/module/Kbuild.in2
-rw-r--r--sys/contrib/openzfs/module/icp/algs/sha2/sha256_impl.c3
-rw-r--r--sys/contrib/openzfs/module/icp/algs/sha2/sha512_impl.c3
-rw-r--r--sys/contrib/openzfs/module/os/freebsd/zfs/sysctl_os.c244
-rw-r--r--sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c19
-rw-r--r--sys/contrib/openzfs/module/os/linux/zfs/zpl_ctldir.c55
-rw-r--r--sys/contrib/openzfs/module/zfs/arc.c32
-rw-r--r--sys/contrib/openzfs/module/zfs/ddt.c8
-rw-r--r--sys/contrib/openzfs/module/zfs/ddt_log.c12
-rw-r--r--sys/contrib/openzfs/module/zfs/dmu_zfetch.c10
-rw-r--r--sys/contrib/openzfs/module/zfs/vdev.c2
-rw-r--r--sys/contrib/openzfs/module/zfs/vdev_queue.c2
-rw-r--r--sys/contrib/openzfs/module/zfs/vdev_removal.c4
-rw-r--r--sys/contrib/openzfs/module/zfs/zfeature.c5
-rw-r--r--sys/contrib/openzfs/module/zfs/zfs_ioctl.c4
-rw-r--r--sys/contrib/openzfs/module/zfs/zvol.c23
-rw-r--r--sys/contrib/openzfs/rpm/generic/zfs.spec.in2
-rw-r--r--sys/contrib/openzfs/tests/runfiles/linux.run2
-rw-r--r--sys/contrib/openzfs/tests/zfs-tests/include/commands.cfg2
-rw-r--r--sys/contrib/openzfs/tests/zfs-tests/include/tunables.cfg4
-rw-r--r--sys/contrib/openzfs/tests/zfs-tests/tests/Makefile.am1
-rwxr-xr-xsys/contrib/openzfs/tests/zfs-tests/tests/functional/fault/fault_limits.ksh2
-rwxr-xr-xsys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/mount_loopback.ksh111
-rw-r--r--sys/ddb/db_ps.c11
-rw-r--r--sys/dev/ahci/ahci_pci.c1
-rw-r--r--sys/dev/axgbe/if_axgbe_pci.c3
-rw-r--r--sys/dev/cyapa/cyapa.c95
-rw-r--r--sys/dev/e1000/if_em.c4
-rw-r--r--sys/dev/enetc/if_enetc.c3
-rw-r--r--sys/dev/gpio/gpioled.c108
-rw-r--r--sys/dev/hwpmc/hwpmc_mod.c21
-rw-r--r--sys/dev/hwt/hwt_ioctl.c9
-rw-r--r--sys/dev/ice/ice_lib.c6
-rw-r--r--sys/dev/ichsmb/ichsmb_pci.c3
-rw-r--r--sys/dev/igc/if_igc.c4
-rw-r--r--sys/dev/iommu/busdma_iommu.c54
-rw-r--r--sys/dev/iommu/iommu.h2
-rw-r--r--sys/dev/irdma/irdma_cm.c2
-rw-r--r--sys/dev/irdma/irdma_utils.c4
-rw-r--r--sys/dev/ixgbe/if_ix.c36
-rw-r--r--sys/dev/ixgbe/ixgbe_e610.c34
-rw-r--r--sys/dev/ixl/if_ixl.c4
-rw-r--r--sys/dev/nvme/nvme_ctrlr.c8
-rw-r--r--sys/dev/qat/qat_common/adf_gen4_timer.c2
-rw-r--r--sys/dev/qlnx/qlnxe/ecore_dev.c6
-rw-r--r--sys/dev/qlnx/qlnxe/ecore_mcp.c2
-rw-r--r--sys/dev/qlnx/qlnxe/qlnx_def.h16
-rw-r--r--sys/dev/qlnx/qlnxe/qlnx_os.c25
-rw-r--r--sys/dev/random/random_harvestq.c148
-rw-r--r--sys/dev/random/randomdev.h3
-rw-r--r--sys/dev/re/if_re.c3
-rw-r--r--sys/dev/rtwn/if_rtwn.c3
-rw-r--r--sys/dev/rtwn/if_rtwn_tx.c8
-rw-r--r--sys/dev/rtwn/rtl8192c/r92c_tx.c11
-rw-r--r--sys/dev/rtwn/rtl8812a/r12a_tx.c12
-rw-r--r--sys/dev/sound/pci/hda/hdac.c11
-rw-r--r--sys/dev/sound/pci/hda/hdac.h1
-rw-r--r--sys/dev/tpm/tpm20.c13
-rw-r--r--sys/dev/usb/controller/xhci_pci.c2
-rw-r--r--sys/dev/usb/wlan/if_rsu.c66
-rw-r--r--sys/dev/usb/wlan/if_rsureg.h9
-rw-r--r--sys/dev/usb/wlan/if_run.c14
-rw-r--r--sys/dev/virtio/network/if_vtnet.c17
-rw-r--r--sys/dev/vmgenc/vmgenc_acpi.c8
-rw-r--r--sys/dev/vmm/vmm_dev.c1
-rw-r--r--sys/fs/nfs/nfs_commonport.c2
-rw-r--r--sys/fs/nfsclient/nfs_clport.c7
-rw-r--r--sys/fs/procfs/procfs_status.c8
-rw-r--r--sys/geom/cache/g_cache.c4
-rw-r--r--sys/geom/concat/g_concat.c4
-rw-r--r--sys/geom/eli/g_eli.c2
-rw-r--r--sys/geom/gate/g_gate.c2
-rw-r--r--sys/geom/geom.h5
-rw-r--r--sys/geom/geom_dev.c2
-rw-r--r--sys/geom/geom_event.c9
-rw-r--r--sys/geom/geom_slice.c2
-rw-r--r--sys/geom/geom_subr.c33
-rw-r--r--sys/geom/journal/g_journal.c2
-rw-r--r--sys/geom/label/g_label.c2
-rw-r--r--sys/geom/linux_lvm/g_linux_lvm.c4
-rw-r--r--sys/geom/mirror/g_mirror.c4
-rw-r--r--sys/geom/mirror/g_mirror_ctl.c2
-rw-r--r--sys/geom/mountver/g_mountver.c2
-rw-r--r--sys/geom/multipath/g_multipath.c4
-rw-r--r--sys/geom/nop/g_nop.c2
-rw-r--r--sys/geom/part/g_part.c4
-rw-r--r--sys/geom/raid/g_raid.c4
-rw-r--r--sys/geom/raid3/g_raid3.c4
-rw-r--r--sys/geom/raid3/g_raid3_ctl.c2
-rw-r--r--sys/geom/shsec/g_shsec.c4
-rw-r--r--sys/geom/stripe/g_stripe.c10
-rw-r--r--sys/geom/union/g_union.c3
-rw-r--r--sys/geom/virstor/g_virstor.c4
-rw-r--r--sys/geom/zero/g_zero.c2
-rw-r--r--sys/i386/conf/GENERIC2
-rw-r--r--sys/kern/imgact_elf.c4
-rw-r--r--sys/kern/init_sysent.c2
-rw-r--r--sys/kern/kern_descrip.c34
-rw-r--r--sys/kern/kern_environment.c32
-rw-r--r--sys/kern/kern_event.c2
-rw-r--r--sys/kern/kern_jail.c396
-rw-r--r--sys/kern/kern_jaildesc.c336
-rw-r--r--sys/kern/kern_malloc.c11
-rw-r--r--sys/kern/kern_mutex.c4
-rw-r--r--sys/kern/kern_proc.c16
-rw-r--r--sys/kern/kern_rmlock.c4
-rw-r--r--sys/kern/kern_rwlock.c4
-rw-r--r--sys/kern/kern_sx.c4
-rw-r--r--sys/kern/kern_thr.c11
-rw-r--r--sys/kern/kern_tslog.c10
-rw-r--r--sys/kern/subr_bus.c13
-rw-r--r--sys/kern/sys_procdesc.c4
-rw-r--r--sys/kern/syscalls.c2
-rw-r--r--sys/kern/syscalls.master10
-rw-r--r--sys/kern/systrace_args.c44
-rw-r--r--sys/libkern/arm64/crc32c_armv8.S8
-rw-r--r--sys/modules/dtb/rockchip/Makefile3
-rw-r--r--sys/modules/sound/driver/hda/Makefile4
-rw-r--r--sys/modules/zfs/zfs_config.h12
-rw-r--r--sys/modules/zfs/zfs_gitrev.h2
-rw-r--r--sys/net/iflib.c15
-rw-r--r--sys/net/pfvar.h2
-rw-r--r--sys/net80211/ieee80211_ht.c2
-rw-r--r--sys/net80211/ieee80211_output.c6
-rw-r--r--sys/net80211/ieee80211_var.h3
-rw-r--r--sys/netinet/tcp_log_buf.c3
-rw-r--r--sys/netinet/tcp_sack.c21
-rw-r--r--sys/netinet/tcp_subr.c6
-rw-r--r--sys/netinet6/in6_ifattach.c7
-rw-r--r--sys/netinet6/in6_ifattach.h1
-rw-r--r--sys/netinet6/nd6_rtr.c54
-rw-r--r--sys/netpfil/pf/pf.c88
-rw-r--r--sys/netpfil/pf/pf_norm.c12
-rw-r--r--sys/netpfil/pf/pf_osfp.c2
-rw-r--r--sys/powerpc/conf/GENERIC642
-rw-r--r--sys/powerpc/conf/GENERIC64LE2
-rw-r--r--sys/riscv/include/vmm.h1
-rw-r--r--sys/riscv/vmm/vmm.c6
-rw-r--r--sys/sys/cpu.h22
-rw-r--r--sys/sys/file.h1
-rw-r--r--sys/sys/jail.h15
-rw-r--r--sys/sys/jaildesc.h85
-rw-r--r--sys/sys/kernel.h27
-rw-r--r--sys/sys/mutex.h2
-rw-r--r--sys/sys/param.h2
-rw-r--r--sys/sys/power.h2
-rw-r--r--sys/sys/random.h3
-rw-r--r--sys/sys/rmlock.h2
-rw-r--r--sys/sys/rwlock.h2
-rw-r--r--sys/sys/sx.h2
-rw-r--r--sys/sys/syscall.h4
-rw-r--r--sys/sys/syscall.mk4
-rw-r--r--sys/sys/sysproto.h10
-rw-r--r--sys/sys/user.h4
-rw-r--r--sys/tools/makeobjops.awk4
-rw-r--r--sys/vm/uma_core.c10
-rw-r--r--sys/vm/vm_domainset.c265
-rw-r--r--sys/vm/vm_domainset.h15
-rw-r--r--sys/vm/vm_glue.c2
-rw-r--r--sys/vm/vm_kern.c12
-rw-r--r--sys/vm/vm_page.c21
-rw-r--r--sys/x86/iommu/amd_intrmap.c14
-rw-r--r--sys/x86/iommu/intel_intrmap.c8
-rw-r--r--sys/x86/x86/identcpu.c4
-rw-r--r--tests/sys/aio/Makefile1
-rw-r--r--tests/sys/aio/aio_kqueue_test.c2
-rw-r--r--tests/sys/aio/aio_test.c33
-rw-r--r--tests/sys/aio/lio_kqueue_test.c2
-rw-r--r--tests/sys/aio/lio_test.c2
-rw-r--r--tests/sys/kern/socket_accf.c32
-rw-r--r--tests/sys/mqueue/mqtest1.c4
-rw-r--r--tests/sys/mqueue/mqtest2.c6
-rw-r--r--tests/sys/mqueue/mqtest3.c4
-rw-r--r--tests/sys/mqueue/mqtest4.c4
-rw-r--r--tests/sys/mqueue/mqtest5.c4
-rw-r--r--tests/sys/mqueue/mqueue_test.sh14
-rw-r--r--tests/sys/net/if_epair.c4
-rw-r--r--tests/sys/net/if_ovpn/if_ovpn_c.c5
-rwxr-xr-xtests/sys/netinet/divert.sh11
-rw-r--r--tests/sys/netinet/tcp_md5_getsockopt.c5
-rw-r--r--tests/sys/netlink/netlink_socket.c27
-rw-r--r--tests/sys/netlink/test_snl.c19
-rw-r--r--tests/sys/netlink/test_snl_generic.c16
-rw-r--r--tests/sys/netmap/Makefile1
-rw-r--r--tests/sys/netmap/ctrl-api-test.c7
-rw-r--r--tests/sys/netpfil/pf/Makefile1
-rw-r--r--tests/sys/netpfil/pf/ioctl/validation.c25
-rw-r--r--tests/sys/netpfil/pf/killstate.sh63
-rw-r--r--tests/sys/netpfil/pf/nat44.py76
-rw-r--r--tests/sys/netpfil/pf/table.sh38
-rw-r--r--tests/sys/opencrypto/blake2_test.c42
-rw-r--r--tests/sys/opencrypto/poly1305_test.c13
-rw-r--r--tests/sys/sound/sndstat.c13
-rw-r--r--tests/sys/vmm/vmm_cred_jail.sh8
-rwxr-xr-xtools/build/depend-cleanup.sh6
-rw-r--r--tools/build/mk/OptionalObsoleteFiles.inc7
-rw-r--r--tools/build/options/WITH_PTHREADS_ASSERTIONS1
-rwxr-xr-xtools/build/options/makeman7
-rwxr-xr-xtools/tools/nanobsd/nanobsd.sh30
-rw-r--r--usr.bin/man/man.124
-rwxr-xr-xusr.bin/man/man.sh35
-rw-r--r--usr.bin/sockstat/main.c3
-rw-r--r--usr.sbin/bhyve/aarch64/vmexit.c2
-rw-r--r--usr.sbin/bhyve/amd64/vmexit.c2
-rw-r--r--usr.sbin/bhyve/bhyve.82
-rw-r--r--usr.sbin/bhyve/bhyverun.c6
-rw-r--r--usr.sbin/bhyve/riscv/vmexit.c2
-rw-r--r--usr.sbin/bsdinstall/bsdinstall.84
-rwxr-xr-xusr.sbin/bsdinstall/scripts/zfsboot4
-rw-r--r--usr.sbin/certctl/certctl.c3
-rw-r--r--usr.sbin/cpucontrol/cpucontrol.h1
-rw-r--r--usr.sbin/freebsd-update/freebsd-update.sh8
-rw-r--r--usr.sbin/moused/Makefile12
-rw-r--r--usr.sbin/moused/Makefile.depend17
-rw-r--r--usr.sbin/moused/moused/Makefile28
-rw-r--r--usr.sbin/moused/moused/event-names.h1656
-rw-r--r--usr.sbin/moused/moused/moused.8538
-rw-r--r--usr.sbin/moused/moused/moused.c3205
-rw-r--r--usr.sbin/moused/moused/moused.conf43
-rw-r--r--usr.sbin/moused/moused/moused.conf.5422
-rw-r--r--usr.sbin/moused/moused/quirks.c2033
-rw-r--r--usr.sbin/moused/moused/quirks.h369
-rw-r--r--usr.sbin/moused/moused/quirks/5-generic-touchpad.quirks9
-rw-r--r--usr.sbin/moused/moused/util-evdev.c173
-rw-r--r--usr.sbin/moused/moused/util-evdev.h35
-rw-r--r--usr.sbin/moused/moused/util-list.c86
-rw-r--r--usr.sbin/moused/moused/util-list.h194
-rw-r--r--usr.sbin/moused/moused/util.c423
-rw-r--r--usr.sbin/moused/moused/util.h413
-rw-r--r--usr.sbin/moused/msconvd/Makefile8
-rw-r--r--usr.sbin/moused/msconvd/msconvd.8 (renamed from usr.sbin/moused/moused.8)395
-rw-r--r--usr.sbin/moused/msconvd/msconvd.c (renamed from usr.sbin/moused/moused.c)1212
-rw-r--r--usr.sbin/newsyslog/newsyslog.conf.52
-rw-r--r--usr.sbin/ngctl/main.c4
-rw-r--r--usr.sbin/ntp/ntpd/leap-seconds8
458 files changed, 22361 insertions, 8157 deletions
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index 7b832c253b56..0cd1884c0bbf 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -8,6 +8,8 @@
#
# This file is sorted in git log order (newest commits first).
+# sys/cpu.h style(9) fixes
+0737e2a961cd712fff5b548bb6b823e48a8b527d
# witness white space cleanup and style(9) tweeks
f5377665253b2b107ee8a4690ad2e6682375b304
# style fixes for device_if.m
diff --git a/.gitignore b/.gitignore
index 3ed711f301ac..a53a26f16d4f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,4 @@ tags
.clangd
.ccls-cache
sys/*/compile
+/src.conf
diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index 02a727d631bd..5fe01af2eea7 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -51,6 +51,9 @@
# xargs -n1 | sort | uniq -d;
# done
+# 20250910: readdir_r(3) removed
+OLD_FILES+=usr/share/man/man3/readdir_r.3.gz
+
# 20250826: Remove a misspelled manual
OLD_FILES+=usr/share/man/man3/sysdecode_syscallnames.3.gz
diff --git a/UPDATING b/UPDATING
index 21c6e92d6454..51589f13e139 100644
--- a/UPDATING
+++ b/UPDATING
@@ -12,8 +12,8 @@ Items affecting the ports and packages system can be found in
/usr/ports/UPDATING. Please read that file before updating system packages
and/or ports.
-NOTE TO PEOPLE WHO THINK THAT FreeBSD 15.x IS SLOW:
- FreeBSD 15.x has many debugging features turned on, in both the kernel
+NOTE TO PEOPLE WHO THINK THAT FreeBSD 16.x IS SLOW:
+ FreeBSD 16.x has many debugging features turned on, in both the kernel
and userland. These features attempt to detect incorrect use of
system primitives, and encourage loud failure through extra sanity
checking and fail stop semantics. They also substantially impact
@@ -27,6 +27,15 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 15.x IS SLOW:
world, or to merely disable the most expensive debugging functionality
at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".)
+20250907:
+ The MANSPLITPKG knob has been turned off by default, so pkgbase builds
+ will no longer generate "-man" subpackages; instead the manpages will
+ be shipped in the packages they belong to. If you want to continue
+ building split man packages, set WITH_MANSPLITPKG=1.
+
+20250905:
+ FreeBSD 16.0-CURRENT.
+
20250903:
The BLOAT_KERNEL_WITH_EXTERR kernel config option has been renamed to
EXTERR_STRINGS.
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c
index 385c9d78bdfc..b311b5425587 100644
--- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c
+++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_consume.c
@@ -2242,11 +2242,10 @@ dt_format_bytes_get(dtrace_hdl_t *dtp, caddr_t addr, size_t nbytes)
static int
dt_format_memory(dtrace_hdl_t *dtp, caddr_t addr)
{
-
- size_t nbytes = *((uintptr_t *) addr);
+ size_t nbytes = *((size_t *) addr);
char *s;
- s = dt_format_bytes_get(dtp, addr + sizeof(uintptr_t), nbytes);
+ s = dt_format_bytes_get(dtp, addr + sizeof(size_t), nbytes);
if (s == NULL)
return (-1);
@@ -2260,9 +2259,9 @@ static int
dt_print_memory(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr)
{
int quiet = (dtp->dt_options[DTRACEOPT_QUIET] != DTRACEOPT_UNSET);
- size_t nbytes = *((uintptr_t *) addr);
+ size_t nbytes = *((size_t *) addr);
- return (dt_print_bytes(dtp, fp, addr + sizeof(uintptr_t),
+ return (dt_print_bytes(dtp, fp, addr + sizeof(size_t),
nbytes, 50, quiet, 1));
}
diff --git a/contrib/libxo/libxo/xo.h b/contrib/libxo/libxo/xo.h
index 6a61a16c7cae..7f37b469b54e 100644
--- a/contrib/libxo/libxo/xo.h
+++ b/contrib/libxo/libxo/xo.h
@@ -27,6 +27,10 @@
#include <stdlib.h>
#include <errno.h>
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
#ifdef __dead2
#define NORETURN __dead2
#else
@@ -699,4 +703,8 @@ xo_retain_clear_all (void);
void
xo_retain_clear (const char *fmt);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
#endif /* INCLUDE_XO_H */
diff --git a/contrib/libxo/libxo/xo_encoder.h b/contrib/libxo/libxo/xo_encoder.h
index 099248ae13a6..bb57194ab030 100644
--- a/contrib/libxo/libxo/xo_encoder.h
+++ b/contrib/libxo/libxo/xo_encoder.h
@@ -20,6 +20,10 @@
#include <string.h>
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
/*
* Expose libxo's memory allocation functions
*/
@@ -167,4 +171,8 @@ xo_encoder_op_name (xo_encoder_op_t op);
void
xo_failure (xo_handle_t *xop, const char *fmt, ...);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
#endif /* XO_ENCODER_H */
diff --git a/contrib/unbound/config.guess b/contrib/unbound/config.guess
index 48a684601bd2..a9d01fde4617 100755
--- a/contrib/unbound/config.guess
+++ b/contrib/unbound/config.guess
@@ -1,10 +1,10 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright 1992-2024 Free Software Foundation, Inc.
+# Copyright 1992-2025 Free Software Foundation, Inc.
# shellcheck disable=SC2006,SC2268 # see below for rationale
-timestamp='2024-07-27'
+timestamp='2025-07-10'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -60,7 +60,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright 1992-2024 Free Software Foundation, Inc.
+Copyright 1992-2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -1597,8 +1597,11 @@ EOF
*:Unleashed:*:*)
GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
;;
- *:Ironclad:*:*)
- GUESS=$UNAME_MACHINE-unknown-ironclad
+ x86_64:[Ii]ronclad:*:*|i?86:[Ii]ronclad:*:*)
+ GUESS=$UNAME_MACHINE-pc-ironclad-mlibc
+ ;;
+ *:[Ii]ronclad:*:*)
+ GUESS=$UNAME_MACHINE-unknown-ironclad-mlibc
;;
esac
@@ -1808,8 +1811,8 @@ fi
exit 1
# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp nil t)
# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-format: "%Y-%02m-%02d"
# time-stamp-end: "'"
# End:
diff --git a/contrib/unbound/config.h.in b/contrib/unbound/config.h.in
index f2dc8c8b92b3..584810398b91 100644
--- a/contrib/unbound/config.h.in
+++ b/contrib/unbound/config.h.in
@@ -48,13 +48,13 @@
internal symbols */
#undef EXPORT_ALL_SYMBOLS
-/* Define to 1 if you have the `accept4' function. */
+/* Define to 1 if you have the 'accept4' function. */
#undef HAVE_ACCEPT4
-/* Define to 1 if you have the `arc4random' function. */
+/* Define to 1 if you have the 'arc4random' function. */
#undef HAVE_ARC4RANDOM
-/* Define to 1 if you have the `arc4random_uniform' function. */
+/* Define to 1 if you have the 'arc4random_uniform' function. */
#undef HAVE_ARC4RANDOM_UNIFORM
/* Define to 1 if you have the <arpa/inet.h> header file. */
@@ -78,7 +78,7 @@
/* If we have be64toh */
#undef HAVE_BE64TOH
-/* Define to 1 if you have the `BIO_set_callback_ex' function. */
+/* Define to 1 if you have the 'BIO_set_callback_ex' function. */
#undef HAVE_BIO_SET_CALLBACK_EX
/* Define to 1 if you have the <bsd/stdlib.h> header file. */
@@ -87,241 +87,241 @@
/* Define to 1 if you have the <bsd/string.h> header file. */
#undef HAVE_BSD_STRING_H
-/* Define to 1 if you have the `chown' function. */
+/* Define to 1 if you have the 'chown' function. */
#undef HAVE_CHOWN
-/* Define to 1 if you have the `chroot' function. */
+/* Define to 1 if you have the 'chroot' function. */
#undef HAVE_CHROOT
-/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */
+/* Define to 1 if you have the 'CRYPTO_cleanup_all_ex_data' function. */
#undef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA
-/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+/* Define to 1 if you have the 'CRYPTO_THREADID_set_callback' function. */
#undef HAVE_CRYPTO_THREADID_SET_CALLBACK
-/* Define to 1 if you have the `ctime_r' function. */
+/* Define to 1 if you have the 'ctime_r' function. */
#undef HAVE_CTIME_R
-/* Define to 1 if you have the `daemon' function. */
+/* Define to 1 if you have the 'daemon' function. */
#undef HAVE_DAEMON
-/* Define to 1 if you have the declaration of `arc4random', and to 0 if you
+/* Define to 1 if you have the declaration of 'arc4random', and to 0 if you
don't. */
#undef HAVE_DECL_ARC4RANDOM
-/* Define to 1 if you have the declaration of `arc4random_uniform', and to 0
+/* Define to 1 if you have the declaration of 'arc4random_uniform', and to 0
if you don't. */
#undef HAVE_DECL_ARC4RANDOM_UNIFORM
-/* Define to 1 if you have the declaration of `evsignal_assign', and to 0 if
+/* Define to 1 if you have the declaration of 'evsignal_assign', and to 0 if
you don't. */
#undef HAVE_DECL_EVSIGNAL_ASSIGN
-/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you
+/* Define to 1 if you have the declaration of 'inet_ntop', and to 0 if you
don't. */
#undef HAVE_DECL_INET_NTOP
-/* Define to 1 if you have the declaration of `inet_pton', and to 0 if you
+/* Define to 1 if you have the declaration of 'inet_pton', and to 0 if you
don't. */
#undef HAVE_DECL_INET_PTON
-/* Define to 1 if you have the declaration of `nghttp2_session_server_new',
+/* Define to 1 if you have the declaration of 'nghttp2_session_server_new',
and to 0 if you don't. */
#undef HAVE_DECL_NGHTTP2_SESSION_SERVER_NEW
-/* Define to 1 if you have the declaration of `ngtcp2_conn_server_new', and to
+/* Define to 1 if you have the declaration of 'ngtcp2_conn_server_new', and to
0 if you don't. */
#undef HAVE_DECL_NGTCP2_CONN_SERVER_NEW
-/* Define to 1 if you have the declaration of `ngtcp2_crypto_encrypt_cb', and
+/* Define to 1 if you have the declaration of 'ngtcp2_crypto_encrypt_cb', and
to 0 if you don't. */
#undef HAVE_DECL_NGTCP2_CRYPTO_ENCRYPT_CB
-/* Define to 1 if you have the declaration of `NID_ED25519', and to 0 if you
+/* Define to 1 if you have the declaration of 'NID_ED25519', and to 0 if you
don't. */
#undef HAVE_DECL_NID_ED25519
-/* Define to 1 if you have the declaration of `NID_ED448', and to 0 if you
+/* Define to 1 if you have the declaration of 'NID_ED448', and to 0 if you
don't. */
#undef HAVE_DECL_NID_ED448
-/* Define to 1 if you have the declaration of `NID_secp384r1', and to 0 if you
+/* Define to 1 if you have the declaration of 'NID_secp384r1', and to 0 if you
don't. */
#undef HAVE_DECL_NID_SECP384R1
-/* Define to 1 if you have the declaration of `NID_X9_62_prime256v1', and to 0
+/* Define to 1 if you have the declaration of 'NID_X9_62_prime256v1', and to 0
if you don't. */
#undef HAVE_DECL_NID_X9_62_PRIME256V1
-/* Define to 1 if you have the declaration of `reallocarray', and to 0 if you
+/* Define to 1 if you have the declaration of 'reallocarray', and to 0 if you
don't. */
#undef HAVE_DECL_REALLOCARRAY
-/* Define to 1 if you have the declaration of `redisConnect', and to 0 if you
+/* Define to 1 if you have the declaration of 'redisConnect', and to 0 if you
don't. */
#undef HAVE_DECL_REDISCONNECT
-/* Define to 1 if you have the declaration of `sk_SSL_COMP_pop_free', and to 0
+/* Define to 1 if you have the declaration of 'sk_SSL_COMP_pop_free', and to 0
if you don't. */
#undef HAVE_DECL_SK_SSL_COMP_POP_FREE
/* Define to 1 if you have the declaration of
- `SSL_COMP_get_compression_methods', and to 0 if you don't. */
+ 'SSL_COMP_get_compression_methods', and to 0 if you don't. */
#undef HAVE_DECL_SSL_COMP_GET_COMPRESSION_METHODS
-/* Define to 1 if you have the declaration of `SSL_CTX_set_ecdh_auto', and to
+/* Define to 1 if you have the declaration of 'SSL_CTX_set_ecdh_auto', and to
0 if you don't. */
#undef HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
-/* Define to 1 if you have the declaration of `strlcat', and to 0 if you
+/* Define to 1 if you have the declaration of 'strlcat', and to 0 if you
don't. */
#undef HAVE_DECL_STRLCAT
-/* Define to 1 if you have the declaration of `strlcpy', and to 0 if you
+/* Define to 1 if you have the declaration of 'strlcpy', and to 0 if you
don't. */
#undef HAVE_DECL_STRLCPY
-/* Define to 1 if you have the declaration of `XML_StopParser', and to 0 if
+/* Define to 1 if you have the declaration of 'XML_StopParser', and to 0 if
you don't. */
#undef HAVE_DECL_XML_STOPPARSER
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
-/* Define to 1 if you have the `DSA_SIG_set0' function. */
+/* Define to 1 if you have the 'DSA_SIG_set0' function. */
#undef HAVE_DSA_SIG_SET0
/* Define to 1 if you have the <endian.h> header file. */
#undef HAVE_ENDIAN_H
-/* Define to 1 if you have the `endprotoent' function. */
+/* Define to 1 if you have the 'endprotoent' function. */
#undef HAVE_ENDPROTOENT
-/* Define to 1 if you have the `endpwent' function. */
+/* Define to 1 if you have the 'endpwent' function. */
#undef HAVE_ENDPWENT
-/* Define to 1 if you have the `endservent' function. */
+/* Define to 1 if you have the 'endservent' function. */
#undef HAVE_ENDSERVENT
-/* Define to 1 if you have the `ENGINE_cleanup' function. */
+/* Define to 1 if you have the 'ENGINE_cleanup' function. */
#undef HAVE_ENGINE_CLEANUP
-/* Define to 1 if you have the `ERR_free_strings' function. */
+/* Define to 1 if you have the 'ERR_free_strings' function. */
#undef HAVE_ERR_FREE_STRINGS
-/* Define to 1 if you have the `ERR_load_crypto_strings' function. */
+/* Define to 1 if you have the 'ERR_load_crypto_strings' function. */
#undef HAVE_ERR_LOAD_CRYPTO_STRINGS
-/* Define to 1 if you have the `event_assign' function. */
+/* Define to 1 if you have the 'event_assign' function. */
#undef HAVE_EVENT_ASSIGN
-/* Define to 1 if you have the `event_base_free' function. */
+/* Define to 1 if you have the 'event_base_free' function. */
#undef HAVE_EVENT_BASE_FREE
-/* Define to 1 if you have the `event_base_get_method' function. */
+/* Define to 1 if you have the 'event_base_get_method' function. */
#undef HAVE_EVENT_BASE_GET_METHOD
-/* Define to 1 if you have the `event_base_new' function. */
+/* Define to 1 if you have the 'event_base_new' function. */
#undef HAVE_EVENT_BASE_NEW
-/* Define to 1 if you have the `event_base_once' function. */
+/* Define to 1 if you have the 'event_base_once' function. */
#undef HAVE_EVENT_BASE_ONCE
/* Define to 1 if you have the <event.h> header file. */
#undef HAVE_EVENT_H
-/* Define to 1 if you have the `EVP_aes_256_cbc' function. */
+/* Define to 1 if you have the 'EVP_aes_256_cbc' function. */
#undef HAVE_EVP_AES_256_CBC
-/* Define to 1 if you have the `EVP_cleanup' function. */
+/* Define to 1 if you have the 'EVP_cleanup' function. */
#undef HAVE_EVP_CLEANUP
-/* Define to 1 if you have the `EVP_default_properties_is_fips_enabled'
+/* Define to 1 if you have the 'EVP_default_properties_is_fips_enabled'
function. */
#undef HAVE_EVP_DEFAULT_PROPERTIES_IS_FIPS_ENABLED
-/* Define to 1 if you have the `EVP_DigestVerify' function. */
+/* Define to 1 if you have the 'EVP_DigestVerify' function. */
#undef HAVE_EVP_DIGESTVERIFY
-/* Define to 1 if you have the `EVP_dss1' function. */
+/* Define to 1 if you have the 'EVP_dss1' function. */
#undef HAVE_EVP_DSS1
-/* Define to 1 if you have the `EVP_EncryptInit_ex' function. */
+/* Define to 1 if you have the 'EVP_EncryptInit_ex' function. */
#undef HAVE_EVP_ENCRYPTINIT_EX
-/* Define to 1 if you have the `EVP_MAC_CTX_set_params' function. */
+/* Define to 1 if you have the 'EVP_MAC_CTX_set_params' function. */
#undef HAVE_EVP_MAC_CTX_SET_PARAMS
-/* Define to 1 if you have the `EVP_MD_CTX_new' function. */
+/* Define to 1 if you have the 'EVP_MD_CTX_new' function. */
#undef HAVE_EVP_MD_CTX_NEW
-/* Define to 1 if you have the `EVP_sha1' function. */
+/* Define to 1 if you have the 'EVP_sha1' function. */
#undef HAVE_EVP_SHA1
-/* Define to 1 if you have the `EVP_sha256' function. */
+/* Define to 1 if you have the 'EVP_sha256' function. */
#undef HAVE_EVP_SHA256
-/* Define to 1 if you have the `EVP_sha512' function. */
+/* Define to 1 if you have the 'EVP_sha512' function. */
#undef HAVE_EVP_SHA512
-/* Define to 1 if you have the `ev_default_loop' function. */
+/* Define to 1 if you have the 'ev_default_loop' function. */
#undef HAVE_EV_DEFAULT_LOOP
-/* Define to 1 if you have the `ev_loop' function. */
+/* Define to 1 if you have the 'ev_loop' function. */
#undef HAVE_EV_LOOP
/* Define to 1 if you have the <expat.h> header file. */
#undef HAVE_EXPAT_H
-/* Define to 1 if you have the `explicit_bzero' function. */
+/* Define to 1 if you have the 'explicit_bzero' function. */
#undef HAVE_EXPLICIT_BZERO
-/* Define to 1 if you have the `fcntl' function. */
+/* Define to 1 if you have the 'fcntl' function. */
#undef HAVE_FCNTL
-/* Define to 1 if you have the `FIPS_mode' function. */
+/* Define to 1 if you have the 'FIPS_mode' function. */
#undef HAVE_FIPS_MODE
-/* Define to 1 if you have the `fork' function. */
+/* Define to 1 if you have the 'fork' function. */
#undef HAVE_FORK
-/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+/* Define to 1 if fseeko (and ftello) are declared in stdio.h. */
#undef HAVE_FSEEKO
-/* Define to 1 if you have the `fsync' function. */
+/* Define to 1 if you have the 'fsync' function. */
#undef HAVE_FSYNC
/* Whether getaddrinfo is available */
#undef HAVE_GETADDRINFO
-/* Define to 1 if you have the `getauxval' function. */
+/* Define to 1 if you have the 'getauxval' function. */
#undef HAVE_GETAUXVAL
-/* Define to 1 if you have the `getentropy' function. */
+/* Define to 1 if you have the 'getentropy' function. */
#undef HAVE_GETENTROPY
-/* Define to 1 if you have the `getifaddrs' function. */
+/* Define to 1 if you have the 'getifaddrs' function. */
#undef HAVE_GETIFADDRS
/* Define to 1 if you have the <getopt.h> header file. */
#undef HAVE_GETOPT_H
-/* Define to 1 if you have the `getpwnam' function. */
+/* Define to 1 if you have the 'getpwnam' function. */
#undef HAVE_GETPWNAM
-/* Define to 1 if you have the `getrlimit' function. */
+/* Define to 1 if you have the 'getrlimit' function. */
#undef HAVE_GETRLIMIT
-/* Define to 1 if you have the `gettid' function. */
+/* Define to 1 if you have the 'gettid' function. */
#undef HAVE_GETTID
-/* Define to 1 if you have the `glob' function. */
+/* Define to 1 if you have the 'glob' function. */
#undef HAVE_GLOB
/* Define to 1 if you have the <glob.h> header file. */
#undef HAVE_GLOB_H
-/* Define to 1 if you have the `gmtime_r' function. */
+/* Define to 1 if you have the 'gmtime_r' function. */
#undef HAVE_GMTIME_R
/* Define to 1 if you have the <grp.h> header file. */
@@ -330,7 +330,7 @@
/* Define to 1 if you have the <hiredis/hiredis.h> header file. */
#undef HAVE_HIREDIS_HIREDIS_H
-/* Define to 1 if you have the `HMAC_Init_ex' function. */
+/* Define to 1 if you have the 'HMAC_Init_ex' function. */
#undef HAVE_HMAC_INIT_EX
/* If we have htobe64 */
@@ -339,19 +339,19 @@
/* Define to 1 if you have the <ifaddrs.h> header file. */
#undef HAVE_IFADDRS_H
-/* Define to 1 if you have the `if_nametoindex' function. */
+/* Define to 1 if you have the 'if_nametoindex' function. */
#undef HAVE_IF_NAMETOINDEX
-/* Define to 1 if you have the `inet_aton' function. */
+/* Define to 1 if you have the 'inet_aton' function. */
#undef HAVE_INET_ATON
-/* Define to 1 if you have the `inet_ntop' function. */
+/* Define to 1 if you have the 'inet_ntop' function. */
#undef HAVE_INET_NTOP
-/* Define to 1 if you have the `inet_pton' function. */
+/* Define to 1 if you have the 'inet_pton' function. */
#undef HAVE_INET_PTON
-/* Define to 1 if you have the `initgroups' function. */
+/* Define to 1 if you have the 'initgroups' function. */
#undef HAVE_INITGROUPS
/* Define to 1 if you have the <inttypes.h> header file. */
@@ -363,10 +363,10 @@
/* Define to 1 if you have the <iphlpapi.h> header file. */
#undef HAVE_IPHLPAPI_H
-/* Define to 1 if you have the `isblank' function. */
+/* Define to 1 if you have the 'isblank' function. */
#undef HAVE_ISBLANK
-/* Define to 1 if you have the `kill' function. */
+/* Define to 1 if you have the 'kill' function. */
#undef HAVE_KILL
/* Use portable libbsd functions */
@@ -384,7 +384,7 @@
/* Define to 1 if you have the <linux/net_tstamp.h> header file. */
#undef HAVE_LINUX_NET_TSTAMP_H
-/* Define to 1 if you have the `localtime_r' function. */
+/* Define to 1 if you have the 'localtime_r' function. */
#undef HAVE_LOCALTIME_R
/* Define to 1 if you have the <login_cap.h> header file. */
@@ -393,7 +393,7 @@
/* If have GNU libc compatible malloc */
#undef HAVE_MALLOC
-/* Define to 1 if you have the `memmove' function. */
+/* Define to 1 if you have the 'memmove' function. */
#undef HAVE_MEMMOVE
/* Define to 1 if you have the <minix/config.h> header file. */
@@ -435,49 +435,49 @@
/* Define this to use ngtcp2. */
#undef HAVE_NGTCP2
-/* Define to 1 if you have the `ngtcp2_ccerr_default' function. */
+/* Define to 1 if you have the 'ngtcp2_ccerr_default' function. */
#undef HAVE_NGTCP2_CCERR_DEFAULT
-/* Define to 1 if you have the `ngtcp2_conn_encode_0rtt_transport_params'
+/* Define to 1 if you have the 'ngtcp2_conn_encode_0rtt_transport_params'
function. */
#undef HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS
-/* Define to 1 if you have the `ngtcp2_conn_get_max_local_streams_uni'
+/* Define to 1 if you have the 'ngtcp2_conn_get_max_local_streams_uni'
function. */
#undef HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI
-/* Define to 1 if you have the `ngtcp2_conn_get_num_scid' function. */
+/* Define to 1 if you have the 'ngtcp2_conn_get_num_scid' function. */
#undef HAVE_NGTCP2_CONN_GET_NUM_SCID
-/* Define to 1 if you have the `ngtcp2_conn_in_closing_period' function. */
+/* Define to 1 if you have the 'ngtcp2_conn_in_closing_period' function. */
#undef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD
-/* Define to 1 if you have the `ngtcp2_conn_in_draining_period' function. */
+/* Define to 1 if you have the 'ngtcp2_conn_in_draining_period' function. */
#undef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD
/* Define if ngtcp2_conn_shutdown_stream has 4 arguments. */
#undef HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4
-/* Define to 1 if you have the `ngtcp2_conn_tls_early_data_rejected' function.
+/* Define to 1 if you have the 'ngtcp2_conn_tls_early_data_rejected' function.
*/
#undef HAVE_NGTCP2_CONN_TLS_EARLY_DATA_REJECTED
-/* Define to 1 if you have the `ngtcp2_crypto_encrypt_cb' function. */
+/* Define to 1 if you have the 'ngtcp2_crypto_encrypt_cb' function. */
#undef HAVE_NGTCP2_CRYPTO_ENCRYPT_CB
/* Define to 1 if you have the
- `ngtcp2_crypto_quictls_configure_client_context' function. */
+ 'ngtcp2_crypto_quictls_configure_client_context' function. */
#undef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT
/* Define to 1 if you have the
- `ngtcp2_crypto_quictls_configure_server_context' function. */
+ 'ngtcp2_crypto_quictls_configure_server_context' function. */
#undef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT
/* Define to 1 if you have the
- `ngtcp2_crypto_quictls_from_ossl_encryption_level' function. */
+ 'ngtcp2_crypto_quictls_from_ossl_encryption_level' function. */
#undef HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL
-/* Define to 1 if the system has the type `ngtcp2_encryption_level'. */
+/* Define to 1 if the system has the type 'ngtcp2_encryption_level'. */
#undef HAVE_NGTCP2_ENCRYPTION_LEVEL
/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto_openssl.h> header file.
@@ -494,13 +494,13 @@
/* Use libnss for crypto */
#undef HAVE_NSS
-/* Define to 1 if you have the `OpenSSL_add_all_digests' function. */
+/* Define to 1 if you have the 'OpenSSL_add_all_digests' function. */
#undef HAVE_OPENSSL_ADD_ALL_DIGESTS
/* Define to 1 if you have the <openssl/bn.h> header file. */
#undef HAVE_OPENSSL_BN_H
-/* Define to 1 if you have the `OPENSSL_config' function. */
+/* Define to 1 if you have the 'OPENSSL_config' function. */
#undef HAVE_OPENSSL_CONFIG
/* Define to 1 if you have the <openssl/conf.h> header file. */
@@ -521,10 +521,10 @@
/* Define to 1 if you have the <openssl/err.h> header file. */
#undef HAVE_OPENSSL_ERR_H
-/* Define to 1 if you have the `OPENSSL_init_crypto' function. */
+/* Define to 1 if you have the 'OPENSSL_init_crypto' function. */
#undef HAVE_OPENSSL_INIT_CRYPTO
-/* Define to 1 if you have the `OPENSSL_init_ssl' function. */
+/* Define to 1 if you have the 'OPENSSL_init_ssl' function. */
#undef HAVE_OPENSSL_INIT_SSL
/* Define to 1 if you have the <openssl/param_build.h> header file. */
@@ -539,10 +539,10 @@
/* Define to 1 if you have the <openssl/ssl.h> header file. */
#undef HAVE_OPENSSL_SSL_H
-/* Define to 1 if you have the `OSSL_PARAM_BLD_new' function. */
+/* Define to 1 if you have the 'OSSL_PARAM_BLD_new' function. */
#undef HAVE_OSSL_PARAM_BLD_NEW
-/* Define to 1 if you have the `poll' function. */
+/* Define to 1 if you have the 'poll' function. */
#undef HAVE_POLL
/* Define to 1 if you have the <poll.h> header file. */
@@ -554,10 +554,10 @@
/* Have PTHREAD_PRIO_INHERIT. */
#undef HAVE_PTHREAD_PRIO_INHERIT
-/* Define to 1 if the system has the type `pthread_rwlock_t'. */
+/* Define to 1 if the system has the type 'pthread_rwlock_t'. */
#undef HAVE_PTHREAD_RWLOCK_T
-/* Define to 1 if the system has the type `pthread_spinlock_t'. */
+/* Define to 1 if the system has the type 'pthread_spinlock_t'. */
#undef HAVE_PTHREAD_SPINLOCK_T
/* Define to 1 if you have the <pwd.h> header file. */
@@ -566,101 +566,101 @@
/* Define if you have Python libraries and header files. */
#undef HAVE_PYTHON
-/* Define to 1 if you have the `random' function. */
+/* Define to 1 if you have the 'random' function. */
#undef HAVE_RANDOM
-/* Define to 1 if you have the `RAND_cleanup' function. */
+/* Define to 1 if you have the 'RAND_cleanup' function. */
#undef HAVE_RAND_CLEANUP
/* If we have reallocarray(3) */
#undef HAVE_REALLOCARRAY
-/* Define to 1 if you have the `recvmsg' function. */
+/* Define to 1 if you have the 'recvmsg' function. */
#undef HAVE_RECVMSG
-/* Define to 1 if you have the `sendmsg' function. */
+/* Define to 1 if you have the 'sendmsg' function. */
#undef HAVE_SENDMSG
-/* Define to 1 if you have the `setregid' function. */
+/* Define to 1 if you have the 'setregid' function. */
#undef HAVE_SETREGID
-/* Define to 1 if you have the `setresgid' function. */
+/* Define to 1 if you have the 'setresgid' function. */
#undef HAVE_SETRESGID
-/* Define to 1 if you have the `setresuid' function. */
+/* Define to 1 if you have the 'setresuid' function. */
#undef HAVE_SETRESUID
-/* Define to 1 if you have the `setreuid' function. */
+/* Define to 1 if you have the 'setreuid' function. */
#undef HAVE_SETREUID
-/* Define to 1 if you have the `setrlimit' function. */
+/* Define to 1 if you have the 'setrlimit' function. */
#undef HAVE_SETRLIMIT
-/* Define to 1 if you have the `setsid' function. */
+/* Define to 1 if you have the 'setsid' function. */
#undef HAVE_SETSID
-/* Define to 1 if you have the `setusercontext' function. */
+/* Define to 1 if you have the 'setusercontext' function. */
#undef HAVE_SETUSERCONTEXT
-/* Define to 1 if you have the `SHA512_Update' function. */
+/* Define to 1 if you have the 'SHA512_Update' function. */
#undef HAVE_SHA512_UPDATE
-/* Define to 1 if you have the `shmget' function. */
+/* Define to 1 if you have the 'shmget' function. */
#undef HAVE_SHMGET
-/* Define to 1 if you have the `sigprocmask' function. */
+/* Define to 1 if you have the 'sigprocmask' function. */
#undef HAVE_SIGPROCMASK
-/* Define to 1 if you have the `sleep' function. */
+/* Define to 1 if you have the 'sleep' function. */
#undef HAVE_SLEEP
-/* Define to 1 if you have the `snprintf' function. */
+/* Define to 1 if you have the 'snprintf' function. */
#undef HAVE_SNPRINTF
-/* Define to 1 if you have the `socketpair' function. */
+/* Define to 1 if you have the 'socketpair' function. */
#undef HAVE_SOCKETPAIR
/* Using Solaris threads */
#undef HAVE_SOLARIS_THREADS
-/* Define to 1 if you have the `srandom' function. */
+/* Define to 1 if you have the 'srandom' function. */
#undef HAVE_SRANDOM
/* Define if you have the SSL libraries installed. */
#undef HAVE_SSL
-/* Define to 1 if you have the `SSL_CTX_set_alpn_protos' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_alpn_protos' function. */
#undef HAVE_SSL_CTX_SET_ALPN_PROTOS
-/* Define to 1 if you have the `SSL_CTX_set_alpn_select_cb' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_alpn_select_cb' function. */
#undef HAVE_SSL_CTX_SET_ALPN_SELECT_CB
-/* Define to 1 if you have the `SSL_CTX_set_ciphersuites' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_ciphersuites' function. */
#undef HAVE_SSL_CTX_SET_CIPHERSUITES
-/* Define to 1 if you have the `SSL_CTX_set_security_level' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_security_level' function. */
#undef HAVE_SSL_CTX_SET_SECURITY_LEVEL
-/* Define to 1 if you have the `SSL_CTX_set_tlsext_ticket_key_evp_cb'
+/* Define to 1 if you have the 'SSL_CTX_set_tlsext_ticket_key_evp_cb'
function. */
#undef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
-/* Define to 1 if you have the `SSL_CTX_set_tmp_ecdh' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_tmp_ecdh' function. */
#undef HAVE_SSL_CTX_SET_TMP_ECDH
-/* Define to 1 if you have the `SSL_get0_alpn_selected' function. */
+/* Define to 1 if you have the 'SSL_get0_alpn_selected' function. */
#undef HAVE_SSL_GET0_ALPN_SELECTED
-/* Define to 1 if you have the `SSL_get0_peername' function. */
+/* Define to 1 if you have the 'SSL_get0_peername' function. */
#undef HAVE_SSL_GET0_PEERNAME
-/* Define to 1 if you have the `SSL_get1_peer_certificate' function. */
+/* Define to 1 if you have the 'SSL_get1_peer_certificate' function. */
#undef HAVE_SSL_GET1_PEER_CERTIFICATE
-/* Define to 1 if you have the `SSL_is_quic' function. */
+/* Define to 1 if you have the 'SSL_is_quic' function. */
#undef HAVE_SSL_IS_QUIC
-/* Define to 1 if you have the `SSL_set1_host' function. */
+/* Define to 1 if you have the 'SSL_set1_host' function. */
#undef HAVE_SSL_SET1_HOST
/* Define to 1 if you have the <stdarg.h> header file. */
@@ -681,7 +681,7 @@
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
-/* Define to 1 if you have the `strftime' function. */
+/* Define to 1 if you have the 'strftime' function. */
#undef HAVE_STRFTIME
/* Define to 1 if you have the <strings.h> header file. */
@@ -690,39 +690,39 @@
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
-/* Define to 1 if you have the `strlcat' function. */
+/* Define to 1 if you have the 'strlcat' function. */
#undef HAVE_STRLCAT
-/* Define to 1 if you have the `strlcpy' function. */
+/* Define to 1 if you have the 'strlcpy' function. */
#undef HAVE_STRLCPY
-/* Define to 1 if you have the `strptime' function. */
+/* Define to 1 if you have the 'strptime' function. */
#undef HAVE_STRPTIME
-/* Define to 1 if you have the `strsep' function. */
+/* Define to 1 if you have the 'strsep' function. */
#undef HAVE_STRSEP
-/* Define to 1 if `ipi_spec_dst' is a member of `struct in_pktinfo'. */
+/* Define to 1 if 'ipi_spec_dst' is a member of 'struct in_pktinfo'. */
#undef HAVE_STRUCT_IN_PKTINFO_IPI_SPEC_DST
-/* Define to 1 if `tokenlen' is a member of `struct ngtcp2_pkt_hd'. */
+/* Define to 1 if 'tokenlen' is a member of 'struct ngtcp2_pkt_hd'. */
#undef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN
-/* Define to 1 if `max_tx_udp_payload_size' is a member of `struct
+/* Define to 1 if 'max_tx_udp_payload_size' is a member of 'struct
ngtcp2_settings'. */
#undef HAVE_STRUCT_NGTCP2_SETTINGS_MAX_TX_UDP_PAYLOAD_SIZE
-/* Define to 1 if `tokenlen' is a member of `struct ngtcp2_settings'. */
+/* Define to 1 if 'tokenlen' is a member of 'struct ngtcp2_settings'. */
#undef HAVE_STRUCT_NGTCP2_SETTINGS_TOKENLEN
-/* Define to 1 if `original_dcid_present' is a member of `struct
+/* Define to 1 if 'original_dcid_present' is a member of 'struct
ngtcp2_transport_params'. */
#undef HAVE_STRUCT_NGTCP2_TRANSPORT_PARAMS_ORIGINAL_DCID_PRESENT
-/* Define to 1 if the system has the type `struct ngtcp2_version_cid'. */
+/* Define to 1 if the system has the type 'struct ngtcp2_version_cid'. */
#undef HAVE_STRUCT_NGTCP2_VERSION_CID
-/* Define to 1 if `sun_len' is a member of `struct sockaddr_un'. */
+/* Define to 1 if 'sun_len' is a member of 'struct sockaddr_un'. */
#undef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
/* Define if you have Swig libraries and header files. */
@@ -782,16 +782,16 @@
/* Define to 1 if you have the <time.h> header file. */
#undef HAVE_TIME_H
-/* Define to 1 if you have the `tzset' function. */
+/* Define to 1 if you have the 'tzset' function. */
#undef HAVE_TZSET
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
-/* Define to 1 if you have the `usleep' function. */
+/* Define to 1 if you have the 'usleep' function. */
#undef HAVE_USLEEP
-/* Define to 1 if you have the `vfork' function. */
+/* Define to 1 if you have the 'vfork' function. */
#undef HAVE_VFORK
/* Define to 1 if you have the <vfork.h> header file. */
@@ -809,22 +809,22 @@
/* Define to 1 if you have the <winsock2.h> header file. */
#undef HAVE_WINSOCK2_H
-/* Define to 1 if `fork' works. */
+/* Define to 1 if 'fork' works. */
#undef HAVE_WORKING_FORK
-/* Define to 1 if `vfork' works. */
+/* Define to 1 if 'vfork' works. */
#undef HAVE_WORKING_VFORK
-/* Define to 1 if you have the `writev' function. */
+/* Define to 1 if you have the 'writev' function. */
#undef HAVE_WRITEV
/* Define to 1 if you have the <ws2tcpip.h> header file. */
#undef HAVE_WS2TCPIP_H
-/* Define to 1 if you have the `X509_VERIFY_PARAM_set1_host' function. */
+/* Define to 1 if you have the 'X509_VERIFY_PARAM_set1_host' function. */
#undef HAVE_X509_VERIFY_PARAM_SET1_HOST
-/* Define to 1 if you have the `_beginthreadex' function. */
+/* Define to 1 if you have the '_beginthreadex' function. */
#undef HAVE__BEGINTHREADEX
/* If HMAC_Init_ex() returns void */
@@ -923,16 +923,16 @@
/* Shared data */
#undef SHARE_DIR
-/* The size of `pthread_t', as computed by sizeof. */
+/* The size of 'pthread_t', as computed by sizeof. */
#undef SIZEOF_PTHREAD_T
-/* The size of `size_t', as computed by sizeof. */
+/* The size of 'size_t', as computed by sizeof. */
#undef SIZEOF_SIZE_T
-/* The size of `time_t', as computed by sizeof. */
+/* The size of 'time_t', as computed by sizeof. */
#undef SIZEOF_TIME_T
-/* The size of `unsigned long', as computed by sizeof. */
+/* The size of 'unsigned long', as computed by sizeof. */
#undef SIZEOF_UNSIGNED_LONG
/* define if (v)snprintf does not return length needed, (but length used) */
@@ -941,7 +941,7 @@
/* Define to 1 if libsodium supports sodium_set_misuse_handler */
#undef SODIUM_MISUSE_HANDLER
-/* Define to 1 if all of the C90 standard headers exist (not just the ones
+/* Define to 1 if all of the C89 standard headers exist (not just the ones
required in a freestanding environment). This macro is provided for
backward compatibility; new code need not use it. */
#undef STDC_HEADERS
@@ -1035,7 +1035,7 @@
/* Define this to enable SHA256 and SHA512 support. */
#undef USE_SHA2
-/* Enable extensions on AIX 3, Interix. */
+/* Enable extensions on AIX, Interix, z/OS. */
#ifndef _ALL_SOURCE
# undef _ALL_SOURCE
#endif
@@ -1096,11 +1096,15 @@
#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
# undef __STDC_WANT_IEC_60559_DFP_EXT__
#endif
+/* Enable extensions specified by C23 Annex F. */
+#ifndef __STDC_WANT_IEC_60559_EXT__
+# undef __STDC_WANT_IEC_60559_EXT__
+#endif
/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
#endif
-/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
+/* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */
#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
# undef __STDC_WANT_IEC_60559_TYPES_EXT__
#endif
@@ -1141,30 +1145,36 @@
/* Define if you want PyUnbound. */
#undef WITH_PYUNBOUND
-/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
- `char[]'. */
+/* Define to 1 if 'lex' declares 'yytext' as a 'char *' by default, not a
+ 'char[]'. */
#undef YYTEXT_POINTER
/* Number of bits in a file offset, on hosts where this is settable. */
#undef _FILE_OFFSET_BITS
-/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* Define to 1 if necessary to make fseeko visible. */
#undef _LARGEFILE_SOURCE
-/* Define for large files, on AIX-style hosts. */
+/* Define to 1 on platforms where this makes off_t a 64-bit type. */
#undef _LARGE_FILES
/* Enable for compile on Minix */
#undef _NETBSD_SOURCE
+/* Number of bits in time_t, on hosts where this is settable. */
+#undef _TIME_BITS
+
+/* Define to 1 on platforms where this makes time_t a 64-bit type. */
+#undef __MINGW_USE_VC2005_COMPAT
+
/* defined to use gcc ansi snprintf and sscanf that understands %lld when
compiled for windows. */
#undef __USE_MINGW_ANSI_STDIO
-/* Define to empty if `const' does not conform to ANSI C. */
+/* Define to empty if 'const' does not conform to ANSI C. */
#undef const
-/* Define to `int' if <sys/types.h> doesn't define. */
+/* Define as 'int' if <sys/types.h> doesn't define. */
#undef gid_t
/* in_addr_t */
@@ -1173,28 +1183,28 @@
/* in_port_t */
#undef in_port_t
-/* Define to `__inline__' or `__inline' if that's what the C compiler
+/* Define to '__inline__' or '__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif
-/* Define to `short' if <sys/types.h> does not define. */
+/* Define to 'short' if <sys/types.h> does not define. */
#undef int16_t
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define to 'int' if <sys/types.h> does not define. */
#undef int32_t
-/* Define to `long long' if <sys/types.h> does not define. */
+/* Define to 'long long' if <sys/types.h> does not define. */
#undef int64_t
-/* Define to `signed char' if <sys/types.h> does not define. */
+/* Define to 'signed char' if <sys/types.h> does not define. */
#undef int8_t
/* Define if replacement function should be used. */
#undef malloc
-/* Define to `long int' if <sys/types.h> does not define. */
+/* Define to 'long int' if <sys/types.h> does not define. */
#undef off_t
/* Define as a signed integer type capable of holding a process identifier. */
@@ -1203,34 +1213,34 @@
/* Define to 'int' if not defined */
#undef rlim_t
-/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* Define as 'unsigned int' if <stddef.h> doesn't define. */
#undef size_t
/* Define to 'int' if not defined */
#undef socklen_t
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define to 'int' if <sys/types.h> does not define. */
#undef ssize_t
/* Define to 'unsigned char if not defined */
#undef u_char
-/* Define to `int' if <sys/types.h> doesn't define. */
+/* Define as 'int' if <sys/types.h> doesn't define. */
#undef uid_t
-/* Define to `unsigned short' if <sys/types.h> does not define. */
+/* Define to 'unsigned short' if <sys/types.h> does not define. */
#undef uint16_t
-/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* Define to 'unsigned int' if <sys/types.h> does not define. */
#undef uint32_t
-/* Define to `unsigned long long' if <sys/types.h> does not define. */
+/* Define to 'unsigned long long' if <sys/types.h> does not define. */
#undef uint64_t
-/* Define to `unsigned char' if <sys/types.h> does not define. */
+/* Define to 'unsigned char' if <sys/types.h> does not define. */
#undef uint8_t
-/* Define as `fork' if `vfork' does not work. */
+/* Define as 'fork' if 'vfork' does not work. */
#undef vfork
#if defined(OMITTED__D_GNU_SOURCE) && !defined(_GNU_SOURCE)
diff --git a/contrib/unbound/config.sub b/contrib/unbound/config.sub
index 4aaae46f6f74..3d35cde174de 100755
--- a/contrib/unbound/config.sub
+++ b/contrib/unbound/config.sub
@@ -1,10 +1,10 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright 1992-2024 Free Software Foundation, Inc.
+# Copyright 1992-2025 Free Software Foundation, Inc.
# shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale
-timestamp='2024-05-27'
+timestamp='2025-07-10'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -76,7 +76,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright 1992-2024 Free Software Foundation, Inc.
+Copyright 1992-2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -145,6 +145,7 @@ case $1 in
| kfreebsd*-gnu* \
| knetbsd*-gnu* \
| kopensolaris*-gnu* \
+ | ironclad-* \
| linux-* \
| managarm-* \
| netbsd*-eabi* \
@@ -242,7 +243,6 @@ case $1 in
| rombug \
| semi \
| sequent* \
- | siemens \
| sgi* \
| siemens \
| sim \
@@ -261,7 +261,7 @@ case $1 in
basic_machine=$field1-$field2
basic_os=
;;
- zephyr*)
+ tock* | zephyr*)
basic_machine=$field1-unknown
basic_os=$field2
;;
@@ -1194,7 +1194,7 @@ case $cpu-$vendor in
xscale-* | xscalee[bl]-*)
cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
;;
- arm64-* | aarch64le-*)
+ arm64-* | aarch64le-* | arm64_32-*)
cpu=aarch64
;;
@@ -1321,6 +1321,7 @@ case $cpu-$vendor in
| i960 \
| ia16 \
| ia64 \
+ | intelgt \
| ip2k \
| iq2000 \
| javascript \
@@ -1522,6 +1523,10 @@ EOF
kernel=nto
os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
;;
+ ironclad*)
+ kernel=ironclad
+ os=`echo "$basic_os" | sed -e 's|ironclad|mlibc|'`
+ ;;
linux*)
kernel=linux
os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
@@ -1976,6 +1981,7 @@ case $os in
| atheos* \
| auroraux* \
| aux* \
+ | banan_os* \
| beos* \
| bitrig* \
| bme* \
@@ -2022,7 +2028,6 @@ case $os in
| ios* \
| iris* \
| irix* \
- | ironclad* \
| isc* \
| its* \
| l4re* \
@@ -2118,6 +2123,7 @@ case $os in
| sysv* \
| tenex* \
| tirtos* \
+ | tock* \
| toppers* \
| tops10* \
| tops20* \
@@ -2214,6 +2220,8 @@ case $kernel-$os-$obj in
;;
uclinux-uclibc*- | uclinux-gnu*- )
;;
+ ironclad-mlibc*-)
+ ;;
managarm-mlibc*- | managarm-kernel*- )
;;
windows*-msvc*-)
@@ -2249,6 +2257,8 @@ case $kernel-$os-$obj in
;;
*-eabi*- | *-gnueabi*-)
;;
+ ios*-simulator- | tvos*-simulator- | watchos*-simulator- )
+ ;;
none--*)
# None (no kernel, i.e. freestanding / bare metal),
# can be paired with an machine code file format
@@ -2347,8 +2357,8 @@ echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"
exit
# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp nil t)
# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-format: "%Y-%02m-%02d"
# time-stamp-end: "'"
# End:
diff --git a/contrib/unbound/configure b/contrib/unbound/configure
index 0b78d97b16e9..c4c5de99d85d 100755
--- a/contrib/unbound/configure
+++ b/contrib/unbound/configure
@@ -1,11 +1,11 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for unbound 1.23.0.
+# Generated by GNU Autoconf 2.72 for unbound 1.23.1.
#
# Report bugs to <unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues>.
#
#
-# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
# Inc.
#
#
@@ -17,7 +17,6 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-as_nop=:
if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
then :
emulate sh
@@ -26,12 +25,13 @@ then :
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else $as_nop
- case `(set -o) 2>/dev/null` in #(
+else case e in #(
+ e) case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
+esac ;;
esac
fi
@@ -103,7 +103,7 @@ IFS=$as_save_IFS
;;
esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
+# We did not find ourselves, most probably we were run as 'sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
@@ -133,15 +133,14 @@ case $- in # ((((
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
+# out after a failed 'exec'.
printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="as_nop=:
-if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+ as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
then :
emulate sh
NULLCMD=:
@@ -149,12 +148,13 @@ then :
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else \$as_nop
- case \`(set -o) 2>/dev/null\` in #(
+else case e in #(
+ e) case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
+esac ;;
esac
fi
"
@@ -172,8 +172,9 @@ as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
if ( set x; as_fn_ret_success y && test x = \"\$1\" )
then :
-else \$as_nop
- exitcode=1; echo positional parameters were not saved.
+else case e in #(
+ e) exitcode=1; echo positional parameters were not saved. ;;
+esac
fi
test x\$exitcode = x0 || exit 1
blah=\$(echo \$(echo blah))
@@ -195,14 +196,15 @@ test \$(( 1 + 1 )) = 2 || exit 1
if (eval "$as_required") 2>/dev/null
then :
as_have_required=yes
-else $as_nop
- as_have_required=no
+else case e in #(
+ e) as_have_required=no ;;
+esac
fi
if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
then :
-else $as_nop
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+else case e in #(
+ e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
@@ -235,12 +237,13 @@ IFS=$as_save_IFS
if $as_found
then :
-else $as_nop
- if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+else case e in #(
+ e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
then :
CONFIG_SHELL=$SHELL as_have_required=yes
-fi
+fi ;;
+esac
fi
@@ -262,7 +265,7 @@ case $- in # ((((
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
+# out after a failed 'exec'.
printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
@@ -283,7 +286,8 @@ $0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
fi
exit 1
-fi
+fi ;;
+esac
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
@@ -322,14 +326,6 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
-# as_fn_nop
-# ---------
-# Do nothing but, unlike ":", preserve the value of $?.
-as_fn_nop ()
-{
- return $?
-}
-as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -398,11 +394,12 @@ then :
{
eval $1+=\$2
}'
-else $as_nop
- as_fn_append ()
+else case e in #(
+ e) as_fn_append ()
{
eval $1=\$$1\$2
- }
+ } ;;
+esac
fi # as_fn_append
# as_fn_arith ARG...
@@ -416,21 +413,14 @@ then :
{
as_val=$(( $* ))
}'
-else $as_nop
- as_fn_arith ()
+else case e in #(
+ e) as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
- }
+ } ;;
+esac
fi # as_fn_arith
-# as_fn_nop
-# ---------
-# Do nothing but, unlike ":", preserve the value of $?.
-as_fn_nop ()
-{
- return $?
-}
-as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -504,6 +494,8 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
/[$]LINENO/=
' <$as_myself |
sed '
+ t clear
+ :clear
s/[$]LINENO.*/&-/
t lineno
b
@@ -552,7 +544,6 @@ esac
as_echo='printf %s\n'
as_echo_n='printf %s'
-
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -564,9 +555,9 @@ if (echo >conf$$.file) 2>/dev/null; then
if ln -s conf$$.file conf$$ 2>/dev/null; then
as_ln_s='ln -s'
# ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -pR'.
+ # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable.
+ # In both cases, we have to default to 'cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
@@ -591,10 +582,12 @@ as_test_x='test -x'
as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated
# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+as_tr_sh="eval sed '$as_sed_sh'" # deprecated
SHELL=${CONFIG_SHELL-/bin/sh}
@@ -622,8 +615,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='unbound'
PACKAGE_TARNAME='unbound'
-PACKAGE_VERSION='1.23.0'
-PACKAGE_STRING='unbound 1.23.0'
+PACKAGE_VERSION='1.23.1'
+PACKAGE_STRING='unbound 1.23.1'
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues'
PACKAGE_URL=''
@@ -660,6 +653,7 @@ ac_includes_default="\
ac_header_c_list=
ac_func_c_list=
+enable_year2038=no
ac_subst_vars='LTLIBOBJS
date
version
@@ -746,6 +740,7 @@ PTHREAD_LIBS
PTHREAD_CXX
PTHREAD_CC
ax_pthread_config
+CPP
ASYNCLOOK_ALLOCCHECK_EXTRA_OBJ
SLDNS_ALLOCCHECK_EXTRA_OBJ
USE_SYSTEMD_FALSE
@@ -756,7 +751,6 @@ SYSTEMD_LIBS
SYSTEMD_CFLAGS
RUNTIME_PATH
LIBOBJS
-CPP
PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH
PKG_CONFIG
@@ -939,6 +933,7 @@ with_libmnl
enable_explicit_port_randomisation
enable_linux_ip_local_port_range
with_libunbound_only
+enable_year2038
'
ac_precious_vars='build_alias
host_alias
@@ -954,11 +949,11 @@ LT_SYS_LIBRARY_PATH
PKG_CONFIG
PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
-CPP
SYSTEMD_CFLAGS
SYSTEMD_LIBS
SYSTEMD_DAEMON_CFLAGS
SYSTEMD_DAEMON_LIBS
+CPP
PYTHON_VERSION
SOURCE_DATE_EPOCH
PROTOBUFC_CFLAGS
@@ -1071,7 +1066,7 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ as_fn_error $? "invalid feature name: '$ac_useropt'"
ac_useropt_orig=$ac_useropt
ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
@@ -1097,7 +1092,7 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ as_fn_error $? "invalid feature name: '$ac_useropt'"
ac_useropt_orig=$ac_useropt
ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
@@ -1310,7 +1305,7 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: \`$ac_useropt'"
+ as_fn_error $? "invalid package name: '$ac_useropt'"
ac_useropt_orig=$ac_useropt
ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
@@ -1326,7 +1321,7 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: \`$ac_useropt'"
+ as_fn_error $? "invalid package name: '$ac_useropt'"
ac_useropt_orig=$ac_useropt
ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
@@ -1356,8 +1351,8 @@ do
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
x_libraries=$ac_optarg ;;
- -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
+ -*) as_fn_error $? "unrecognized option: '$ac_option'
+Try '$0 --help' for more information"
;;
*=*)
@@ -1365,7 +1360,7 @@ Try \`$0 --help' for more information"
# Reject names that are not valid shell variable names.
case $ac_envvar in #(
'' | [0-9]* | *[!_$as_cr_alnum]* )
- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ as_fn_error $? "invalid variable name: '$ac_envvar'" ;;
esac
eval $ac_envvar=\$ac_optarg
export $ac_envvar ;;
@@ -1415,7 +1410,7 @@ do
as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done
-# There might be people who depend on the old broken behavior: `$host'
+# There might be people who depend on the old broken behavior: '$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
@@ -1483,7 +1478,7 @@ if test ! -r "$srcdir/$ac_unique_file"; then
test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work"
ac_abs_confdir=`(
cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
pwd)`
@@ -1511,7 +1506,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures unbound 1.23.0 to adapt to many kinds of systems.
+'configure' configures unbound 1.23.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1525,11 +1520,11 @@ Configuration:
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking ...' messages
+ -q, --quiet, --silent do not print 'checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
+ -C, --config-cache alias for '--cache-file=config.cache'
-n, --no-create do not create output files
- --srcdir=DIR find the sources in DIR [configure dir or \`..']
+ --srcdir=DIR find the sources in DIR [configure dir or '..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
@@ -1537,10 +1532,10 @@ Installation directories:
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
+By default, 'make install' will install all the files in
+'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than '$ac_default_prefix' using '--prefix',
+for instance '--prefix=\$HOME'.
For better control, use the options below.
@@ -1577,7 +1572,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of unbound 1.23.0:";;
+ short | recursive ) echo "Configuration of unbound 1.23.1:";;
esac
cat <<\_ACEOF
@@ -1653,6 +1648,7 @@ Optional Features:
randomness. Define this only when the target system
restricts (e.g. some of SELinux enabled
distributions) the use of non-ephemeral ports.
+ --enable-year2038 support timestamps after 2038
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@@ -1728,12 +1724,12 @@ Some influential environment variables:
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
- YACC The `Yet Another Compiler Compiler' implementation to use.
- Defaults to the first program found out of: `bison -y', `byacc',
- `yacc'.
+ YACC The 'Yet Another Compiler Compiler' implementation to use.
+ Defaults to the first program found out of: 'bison -y', 'byacc',
+ 'yacc'.
YFLAGS The list of arguments that will be passed by default to $YACC.
This script will default YFLAGS to the empty string to avoid a
- default value of `-d' given by some make applications.
+ default value of '-d' given by some make applications.
LT_SYS_LIBRARY_PATH
User-defined run-time library search path.
PKG_CONFIG path to pkg-config utility
@@ -1741,7 +1737,6 @@ Some influential environment variables:
directories to add to pkg-config's search path
PKG_CONFIG_LIBDIR
path overriding pkg-config's built-in search path
- CPP C preprocessor
SYSTEMD_CFLAGS
C compiler flags for SYSTEMD, overriding pkg-config
SYSTEMD_LIBS
@@ -1750,6 +1745,7 @@ Some influential environment variables:
C compiler flags for SYSTEMD_DAEMON, overriding pkg-config
SYSTEMD_DAEMON_LIBS
linker flags for SYSTEMD_DAEMON, overriding pkg-config
+ CPP C preprocessor
PYTHON_VERSION
The installed Python version to use, for example '2.3'. This
string will be appended to the Python interpreter canonical
@@ -1763,7 +1759,7 @@ Some influential environment variables:
PROTOBUFC_LIBS
linker flags for PROTOBUFC, overriding pkg-config
-Use these variables to override the choices made by `configure' or to help
+Use these variables to override the choices made by 'configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to <unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues>.
@@ -1830,10 +1826,10 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-unbound configure 1.23.0
-generated by GNU Autoconf 2.71
+unbound configure 1.23.1
+generated by GNU Autoconf 2.72
-Copyright (C) 2021 Free Software Foundation, Inc.
+Copyright (C) 2023 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1872,11 +1868,12 @@ printf "%s\n" "$ac_try_echo"; } >&5
} && test -s conftest.$ac_objext
then :
ac_retval=0
-else $as_nop
- printf "%s\n" "$as_me: failed program was:" >&5
+else case e in #(
+ e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
- ac_retval=1
+ ac_retval=1 ;;
+esac
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
@@ -1895,8 +1892,8 @@ printf %s "checking for $2... " >&6; }
if eval test \${$3+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
@@ -1904,10 +1901,12 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
eval "$3=yes"
-else $as_nop
- eval "$3=no"
+else case e in #(
+ e) eval "$3=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$3
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
@@ -1947,11 +1946,12 @@ printf "%s\n" "$ac_try_echo"; } >&5
}
then :
ac_retval=0
-else $as_nop
- printf "%s\n" "$as_me: failed program was:" >&5
+else case e in #(
+ e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
- ac_retval=1
+ ac_retval=1 ;;
+esac
fi
# Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
# created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
@@ -1974,15 +1974,15 @@ printf %s "checking for $2... " >&6; }
if eval test \${$3+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below. */
+ which can conflict with char $2 (void); below. */
#include <limits.h>
#undef $2
@@ -1993,7 +1993,7 @@ else $as_nop
#ifdef __cplusplus
extern "C"
#endif
-char $2 ();
+char $2 (void);
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
@@ -2012,11 +2012,13 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
eval "$3=yes"
-else $as_nop
- eval "$3=no"
+else case e in #(
+ e) eval "$3=no" ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
+ conftest$ac_exeext conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$3
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
@@ -2037,8 +2039,8 @@ printf %s "checking for $2... " >&6; }
if eval test \${$3+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- eval "$3=no"
+else case e in #(
+ e) eval "$3=no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
@@ -2068,12 +2070,14 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
-else $as_nop
- eval "$3=yes"
+else case e in #(
+ e) eval "$3=yes" ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$3
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
@@ -2082,44 +2086,6 @@ printf "%s\n" "$ac_res" >&6; }
} # ac_fn_c_check_type
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-printf "%s\n" "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }
-then :
- ac_retval=0
-else $as_nop
- printf "%s\n" "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
# ac_fn_c_try_run LINENO
# ----------------------
# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
@@ -2150,12 +2116,13 @@ printf "%s\n" "$ac_try_echo"; } >&5
test $ac_status = 0; }; }
then :
ac_retval=0
-else $as_nop
- printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+else case e in #(
+ e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5
printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
- ac_retval=$ac_status
+ ac_retval=$ac_status ;;
+esac
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
@@ -2208,18 +2175,19 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_hi=$ac_mid; break
-else $as_nop
- as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+else case e in #(
+ e) as_fn_arith $ac_mid + 1 && ac_lo=$as_val
if test $ac_lo -le $ac_mid; then
ac_lo= ac_hi=
break
fi
- as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
@@ -2254,20 +2222,23 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_lo=$ac_mid; break
-else $as_nop
- as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+else case e in #(
+ e) as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
if test $ac_mid -le $ac_hi; then
ac_lo= ac_hi=
break
fi
- as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else $as_nop
- ac_lo= ac_hi=
+else case e in #(
+ e) ac_lo= ac_hi= ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
# Binary search between lo and hi bounds.
@@ -2290,8 +2261,9 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_hi=$ac_mid
-else $as_nop
- as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+else case e in #(
+ e) as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
@@ -2339,8 +2311,9 @@ _ACEOF
if ac_fn_c_try_run "$LINENO"
then :
echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else $as_nop
- ac_retval=1
+else case e in #(
+ e) ac_retval=1 ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -2352,6 +2325,45 @@ rm -f conftest.val
} # ac_fn_c_compute_int
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else case e in #(
+ e) printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1 ;;
+esac
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR
# ------------------------------------------------------------------
# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
@@ -2365,8 +2377,8 @@ printf %s "checking whether $as_decl_name is declared... " >&6; }
if eval test \${$3+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+else case e in #(
+ e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
eval ac_save_FLAGS=\$$6
as_fn_append $6 " $5"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2390,12 +2402,14 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
eval "$3=yes"
-else $as_nop
- eval "$3=no"
+else case e in #(
+ e) eval "$3=no" ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
eval $6=\$ac_save_FLAGS
-
+ ;;
+esac
fi
eval ac_res=\$$3
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
@@ -2416,8 +2430,8 @@ printf %s "checking for $2.$3... " >&6; }
if eval test \${$4+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
@@ -2433,8 +2447,8 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
eval "$4=yes"
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
@@ -2450,12 +2464,15 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
eval "$4=yes"
-else $as_nop
- eval "$4=no"
+else case e in #(
+ e) eval "$4=no" ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
eval ac_res=\$$4
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
@@ -2487,8 +2504,8 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by unbound $as_me 1.23.0, which was
-generated by GNU Autoconf 2.71. Invocation command line was
+It was created by unbound $as_me 1.23.1, which was
+generated by GNU Autoconf 2.72. Invocation command line was
$ $0$ac_configure_args_raw
@@ -2734,10 +2751,10 @@ esac
printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
fi
done
@@ -2774,9 +2791,7 @@ struct stat;
/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
struct buf { int x; };
struct buf * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
+static char *e (char **p, int i)
{
return p[i];
}
@@ -2790,6 +2805,21 @@ static char *f (char * (*g) (char **, int), char **p, ...)
return s;
}
+/* C89 style stringification. */
+#define noexpand_stringify(a) #a
+const char *stringified = noexpand_stringify(arbitrary+token=sequence);
+
+/* C89 style token pasting. Exercises some of the corner cases that
+ e.g. old MSVC gets wrong, but not very hard. */
+#define noexpand_concat(a,b) a##b
+#define expand_concat(a,b) noexpand_concat(a,b)
+extern int vA;
+extern int vbee;
+#define aye A
+#define bee B
+int *pvA = &expand_concat(v,aye);
+int *pvbee = &noexpand_concat(v,bee);
+
/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
function prototypes and stuff, but not \xHH hex character constants.
These do not provoke an error unfortunately, instead are silently treated
@@ -2817,16 +2847,19 @@ ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
# Test code for whether the C compiler supports C99 (global declarations)
ac_c_conftest_c99_globals='
-// Does the compiler advertise C99 conformance?
+/* Does the compiler advertise C99 conformance? */
#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
# error "Compiler does not advertise C99 conformance"
#endif
+// See if C++-style comments work.
+
#include <stdbool.h>
extern int puts (const char *);
extern int printf (const char *, ...);
extern int dprintf (int, const char *, ...);
extern void *malloc (size_t);
+extern void free (void *);
// Check varargs macros. These examples are taken from C99 6.10.3.5.
// dprintf is used instead of fprintf to avoid needing to declare
@@ -2876,7 +2909,6 @@ typedef const char *ccp;
static inline int
test_restrict (ccp restrict text)
{
- // See if C++-style comments work.
// Iterate through items via the restricted pointer.
// Also check for declarations in for loops.
for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
@@ -2942,6 +2974,8 @@ ac_c_conftest_c99_main='
ia->datasize = 10;
for (int i = 0; i < ia->datasize; ++i)
ia->data[i] = i * 1.234;
+ // Work around memory leak warnings.
+ free (ia);
// Check named initializers.
struct named_init ni = {
@@ -2963,7 +2997,7 @@ ac_c_conftest_c99_main='
# Test code for whether the C compiler supports C11 (global declarations)
ac_c_conftest_c11_globals='
-// Does the compiler advertise C11 conformance?
+/* Does the compiler advertise C11 conformance? */
#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
# error "Compiler does not advertise C11 conformance"
#endif
@@ -3159,8 +3193,9 @@ IFS=$as_save_IFS
if $as_found
then :
-else $as_nop
- as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;;
+esac
fi
@@ -3188,12 +3223,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -3202,18 +3237,18 @@ printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
@@ -3229,11 +3264,11 @@ printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file'
and start over" "$LINENO" 5
fi
## -------------------- ##
@@ -3251,11 +3286,11 @@ UNBOUND_VERSION_MAJOR=1
UNBOUND_VERSION_MINOR=23
-UNBOUND_VERSION_MICRO=0
+UNBOUND_VERSION_MICRO=1
LIBUNBOUND_CURRENT=9
-LIBUNBOUND_REVISION=31
+LIBUNBOUND_REVISION=32
LIBUNBOUND_AGE=1
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -3354,6 +3389,7 @@ LIBUNBOUND_AGE=1
# 1.21.1 had 9:29:1
# 1.22.0 had 9:30:1
# 1.23.0 had 9:31:1
+# 1.23.1 had 9:32:1
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
@@ -3406,8 +3442,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3429,7 +3465,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -3451,8 +3488,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_CC"; then
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3474,7 +3511,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
@@ -3509,8 +3547,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3532,7 +3570,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -3554,8 +3593,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
ac_prog_rejected=no
@@ -3594,7 +3633,8 @@ if test $ac_prog_rejected = yes; then
ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -3618,8 +3658,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3641,7 +3681,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -3667,8 +3708,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_CC"; then
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3690,7 +3731,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
@@ -3728,8 +3770,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3751,7 +3793,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -3773,8 +3816,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_CC"; then
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3796,7 +3839,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
@@ -3825,10 +3869,10 @@ fi
fi
-test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
@@ -3900,8 +3944,8 @@ printf "%s\n" "$ac_try_echo"; } >&5
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
then :
- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+ # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'.
+# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
@@ -3921,7 +3965,7 @@ do
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
# We set ac_cv_exeext here because the later test for it is not
- # safe: cross compilers may not add the suffix if given an `-o'
+ # safe: cross compilers may not add the suffix if given an '-o'
# argument, so we may need to know it at that point already.
# Even if this section looks crufty: it has the advantage of
# actually working.
@@ -3932,8 +3976,9 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else $as_nop
- ac_file=''
+else case e in #(
+ e) ac_file='' ;;
+esac
fi
if test -z "$ac_file"
then :
@@ -3942,13 +3987,14 @@ printf "%s\n" "no" >&6; }
printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-printf "%s\n" "yes" >&6; }
+See 'config.log' for more details" "$LINENO" 5; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; } ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
printf %s "checking for C compiler default output file name... " >&6; }
@@ -3972,10 +4018,10 @@ printf "%s\n" "$ac_try_echo"; } >&5
printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
then :
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
+ # If both 'conftest.exe' and 'conftest' are 'present' (well, observable)
+# catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will
+# work properly (i.e., refer to 'conftest.exe'), while it won't with
+# 'rm'.
for ac_file in conftest.exe conftest conftest.*; do
test -f "$ac_file" || continue
case $ac_file in
@@ -3985,11 +4031,12 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else $as_nop
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+else case e in #(
+ e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; } ;;
+esac
fi
rm -f conftest conftest$ac_cv_exeext
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
@@ -4005,6 +4052,8 @@ int
main (void)
{
FILE *f = fopen ("conftest.out", "w");
+ if (!f)
+ return 1;
return ferror (f) || fclose (f) != 0;
;
@@ -4044,26 +4093,27 @@ printf "%s\n" "$ac_try_echo"; } >&5
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
+If you meant to cross compile, use '--host'.
+See 'config.log' for more details" "$LINENO" 5; }
fi
fi
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
printf "%s\n" "$cross_compiling" >&6; }
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+rm -f conftest.$ac_ext conftest$ac_cv_exeext \
+ conftest.o conftest.obj conftest.out
ac_clean_files=$ac_clean_files_save
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
printf %s "checking for suffix of object files... " >&6; }
if test ${ac_cv_objext+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -4095,16 +4145,18 @@ then :
break;;
esac
done
-else $as_nop
- printf "%s\n" "$as_me: failed program was:" >&5
+else case e in #(
+ e) printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; } ;;
+esac
fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
+rm -f conftest.$ac_cv_objext conftest.$ac_ext ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
printf "%s\n" "$ac_cv_objext" >&6; }
@@ -4115,8 +4167,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; }
if test ${ac_cv_c_compiler_gnu+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -4133,12 +4185,14 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_compiler_gnu=yes
-else $as_nop
- ac_compiler_gnu=no
+else case e in #(
+ e) ac_compiler_gnu=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
@@ -4156,8 +4210,8 @@ printf %s "checking whether $CC accepts -g... " >&6; }
if test ${ac_cv_prog_cc_g+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_save_c_werror_flag=$ac_c_werror_flag
+else case e in #(
+ e) ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
CFLAGS="-g"
@@ -4175,8 +4229,8 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_prog_cc_g=yes
-else $as_nop
- CFLAGS=""
+else case e in #(
+ e) CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -4191,8 +4245,8 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
-else $as_nop
- ac_c_werror_flag=$ac_save_c_werror_flag
+else case e in #(
+ e) ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -4209,12 +4263,15 @@ if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
+ ac_c_werror_flag=$ac_save_c_werror_flag ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
@@ -4241,8 +4298,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; }
if test ${ac_cv_prog_cc_c11+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_prog_cc_c11=no
+else case e in #(
+ e) ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -4259,25 +4316,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c11" != "xno" && break
done
rm -f conftest.$ac_ext
-CC=$ac_save_CC
+CC=$ac_save_CC ;;
+esac
fi
if test "x$ac_cv_prog_cc_c11" = xno
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
-else $as_nop
- if test "x$ac_cv_prog_cc_c11" = x
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c11" = x
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
- CC="$CC $ac_cv_prog_cc_c11"
+ CC="$CC $ac_cv_prog_cc_c11" ;;
+esac
fi
ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
- ac_prog_cc_stdc=c11
+ ac_prog_cc_stdc=c11 ;;
+esac
fi
fi
if test x$ac_prog_cc_stdc = xno
@@ -4287,8 +4347,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; }
if test ${ac_cv_prog_cc_c99+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_prog_cc_c99=no
+else case e in #(
+ e) ac_cv_prog_cc_c99=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -4305,25 +4365,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c99" != "xno" && break
done
rm -f conftest.$ac_ext
-CC=$ac_save_CC
+CC=$ac_save_CC ;;
+esac
fi
if test "x$ac_cv_prog_cc_c99" = xno
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
-else $as_nop
- if test "x$ac_cv_prog_cc_c99" = x
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c99" = x
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
- CC="$CC $ac_cv_prog_cc_c99"
+ CC="$CC $ac_cv_prog_cc_c99" ;;
+esac
fi
ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
- ac_prog_cc_stdc=c99
+ ac_prog_cc_stdc=c99 ;;
+esac
fi
fi
if test x$ac_prog_cc_stdc = xno
@@ -4333,8 +4396,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; }
if test ${ac_cv_prog_cc_c89+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_prog_cc_c89=no
+else case e in #(
+ e) ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -4351,25 +4414,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
-CC=$ac_save_CC
+CC=$ac_save_CC ;;
+esac
fi
if test "x$ac_cv_prog_cc_c89" = xno
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
-else $as_nop
- if test "x$ac_cv_prog_cc_c89" = x
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c89" = x
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
- CC="$CC $ac_cv_prog_cc_c89"
+ CC="$CC $ac_cv_prog_cc_c89" ;;
+esac
fi
ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
- ac_prog_cc_stdc=c89
+ ac_prog_cc_stdc=c89 ;;
+esac
fi
fi
@@ -4420,8 +4486,8 @@ printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; }
if test ${ac_cv_safe_to_define___extensions__+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
# define __EXTENSIONS__ 1
@@ -4437,10 +4503,12 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_safe_to_define___extensions__=yes
-else $as_nop
- ac_cv_safe_to_define___extensions__=no
+else case e in #(
+ e) ac_cv_safe_to_define___extensions__=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; }
@@ -4450,8 +4518,8 @@ printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; }
if test ${ac_cv_should_define__xopen_source+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_should_define__xopen_source=no
+else case e in #(
+ e) ac_cv_should_define__xopen_source=no
if test $ac_cv_header_wchar_h = yes
then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4470,8 +4538,8 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#define _XOPEN_SOURCE 500
@@ -4489,10 +4557,12 @@ if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_should_define__xopen_source=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
+fi ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; }
@@ -4517,6 +4587,8 @@ printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; }
printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_EXT__ 1" >>confdefs.h
+
printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h
printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h
@@ -4536,8 +4608,9 @@ then :
printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h
-else $as_nop
- MINIX=
+else case e in #(
+ e) MINIX= ;;
+esac
fi
if test $ac_cv_safe_to_define___extensions__ = yes
then :
@@ -4632,13 +4705,14 @@ printf "%s\n" X"$ub_conf_file" |
if test ${with_run_dir+y}
then :
withval=$with_run_dir; UNBOUND_RUN_DIR="$withval"
-else $as_nop
- if test $on_mingw = no; then
+else case e in #(
+ e) if test $on_mingw = no; then
UNBOUND_RUN_DIR=`dirname "$ub_conf_file"`
else
UNBOUND_RUN_DIR=""
fi
-
+ ;;
+esac
fi
@@ -4653,13 +4727,14 @@ printf "%s\n" "#define RUN_DIR \"$hdr_run\"" >>confdefs.h
if test ${with_chroot_dir+y}
then :
withval=$with_chroot_dir; UNBOUND_CHROOT_DIR="$withval"
-else $as_nop
- if test $on_mingw = no; then
+else case e in #(
+ e) if test $on_mingw = no; then
UNBOUND_CHROOT_DIR="$UNBOUND_RUN_DIR"
else
UNBOUND_CHROOT_DIR=""
fi
-
+ ;;
+esac
fi
@@ -4674,8 +4749,9 @@ printf "%s\n" "#define CHROOT_DIR \"$hdr_chroot\"" >>confdefs.h
if test ${with_share_dir+y}
then :
withval=$with_share_dir; UNBOUND_SHARE_DIR="$withval"
-else $as_nop
- UNBOUND_SHARE_DIR="$UNBOUND_RUN_DIR"
+else case e in #(
+ e) UNBOUND_SHARE_DIR="$UNBOUND_RUN_DIR" ;;
+esac
fi
@@ -4688,13 +4764,14 @@ printf "%s\n" "#define SHARE_DIR \"$UNBOUND_SHARE_DIR\"" >>confdefs.h
if test ${with_pidfile+y}
then :
withval=$with_pidfile; UNBOUND_PIDFILE="$withval"
-else $as_nop
- if test $on_mingw = no; then
+else case e in #(
+ e) if test $on_mingw = no; then
UNBOUND_PIDFILE="$UNBOUND_RUN_DIR/unbound.pid"
else
UNBOUND_PIDFILE=""
fi
-
+ ;;
+esac
fi
@@ -4709,13 +4786,14 @@ printf "%s\n" "#define PIDFILE \"$hdr_pid\"" >>confdefs.h
if test ${with_rootkey_file+y}
then :
withval=$with_rootkey_file; UNBOUND_ROOTKEY_FILE="$withval"
-else $as_nop
- if test $on_mingw = no; then
+else case e in #(
+ e) if test $on_mingw = no; then
UNBOUND_ROOTKEY_FILE="$UNBOUND_RUN_DIR/root.key"
else
UNBOUND_ROOTKEY_FILE="C:\\Program Files\\Unbound\\root.key"
fi
-
+ ;;
+esac
fi
@@ -4730,13 +4808,14 @@ printf "%s\n" "#define ROOT_ANCHOR_FILE \"$hdr_rkey\"" >>confdefs.h
if test ${with_rootcert_file+y}
then :
withval=$with_rootcert_file; UNBOUND_ROOTCERT_FILE="$withval"
-else $as_nop
- if test $on_mingw = no; then
+else case e in #(
+ e) if test $on_mingw = no; then
UNBOUND_ROOTCERT_FILE="$UNBOUND_RUN_DIR/icannbundle.pem"
else
UNBOUND_ROOTCERT_FILE="C:\\Program Files\\Unbound\\icannbundle.pem"
fi
-
+ ;;
+esac
fi
@@ -4751,8 +4830,9 @@ printf "%s\n" "#define ROOT_CERT_FILE \"$hdr_rpem\"" >>confdefs.h
if test ${with_username+y}
then :
withval=$with_username; UNBOUND_USERNAME="$withval"
-else $as_nop
- UNBOUND_USERNAME="unbound"
+else case e in #(
+ e) UNBOUND_USERNAME="unbound" ;;
+esac
fi
@@ -4775,8 +4855,8 @@ printf %s "checking for grep that handles long lines and -e... " >&6; }
if test ${ac_cv_path_GREP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -z "$GREP"; then
+else case e in #(
+ e) if test -z "$GREP"; then
ac_path_GREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -4795,9 +4875,10 @@ do
as_fn_executable_p "$ac_path_GREP" || continue
# Check for GNU ac_path_GREP and select it if it is found.
# Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
+case `"$ac_path_GREP" --version 2>&1` in #(
*GNU*)
ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+#(
*)
ac_count=0
printf %s 0123456789 >"conftest.in"
@@ -4832,7 +4913,8 @@ IFS=$as_save_IFS
else
ac_cv_path_GREP=$GREP
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
printf "%s\n" "$ac_cv_path_GREP" >&6; }
@@ -4846,8 +4928,8 @@ printf %s "checking for an ANSI C-conforming const... " >&6; }
if test ${ac_cv_c_const+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -4911,10 +4993,12 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_c_const=yes
-else $as_nop
- ac_cv_c_const=no
+else case e in #(
+ e) ac_cv_c_const=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
printf "%s\n" "$ac_cv_c_const" >&6; }
@@ -4941,8 +5025,8 @@ cache=`echo g | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -g -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -4950,7 +5034,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -4973,8 +5058,8 @@ cache=`echo O2 | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -O2 -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -4982,7 +5067,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -5012,8 +5098,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -5035,7 +5121,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -5057,8 +5144,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_CC"; then
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -5080,7 +5167,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
@@ -5115,8 +5203,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -5138,7 +5226,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -5160,8 +5249,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
ac_prog_rejected=no
@@ -5200,7 +5289,8 @@ if test $ac_prog_rejected = yes; then
ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -5224,8 +5314,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -5247,7 +5337,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -5273,8 +5364,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_CC"; then
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -5296,7 +5387,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
@@ -5334,8 +5426,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$CC"; then
+else case e in #(
+ e) if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -5357,7 +5449,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
@@ -5379,8 +5472,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_CC"; then
+else case e in #(
+ e) if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -5402,7 +5495,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
@@ -5431,10 +5525,10 @@ fi
fi
-test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
@@ -5466,8 +5560,8 @@ printf %s "checking whether the compiler supports GNU C... " >&6; }
if test ${ac_cv_c_compiler_gnu+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -5484,12 +5578,14 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_compiler_gnu=yes
-else $as_nop
- ac_compiler_gnu=no
+else case e in #(
+ e) ac_compiler_gnu=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
@@ -5507,8 +5603,8 @@ printf %s "checking whether $CC accepts -g... " >&6; }
if test ${ac_cv_prog_cc_g+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_save_c_werror_flag=$ac_c_werror_flag
+else case e in #(
+ e) ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
CFLAGS="-g"
@@ -5526,8 +5622,8 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_prog_cc_g=yes
-else $as_nop
- CFLAGS=""
+else case e in #(
+ e) CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5542,8 +5638,8 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
-else $as_nop
- ac_c_werror_flag=$ac_save_c_werror_flag
+else case e in #(
+ e) ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5560,12 +5656,15 @@ if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
+ ac_c_werror_flag=$ac_save_c_werror_flag ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
@@ -5592,8 +5691,8 @@ printf %s "checking for $CC option to enable C11 features... " >&6; }
if test ${ac_cv_prog_cc_c11+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_prog_cc_c11=no
+else case e in #(
+ e) ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5610,25 +5709,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c11" != "xno" && break
done
rm -f conftest.$ac_ext
-CC=$ac_save_CC
+CC=$ac_save_CC ;;
+esac
fi
if test "x$ac_cv_prog_cc_c11" = xno
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
-else $as_nop
- if test "x$ac_cv_prog_cc_c11" = x
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c11" = x
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
- CC="$CC $ac_cv_prog_cc_c11"
+ CC="$CC $ac_cv_prog_cc_c11" ;;
+esac
fi
ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
- ac_prog_cc_stdc=c11
+ ac_prog_cc_stdc=c11 ;;
+esac
fi
fi
if test x$ac_prog_cc_stdc = xno
@@ -5638,8 +5740,8 @@ printf %s "checking for $CC option to enable C99 features... " >&6; }
if test ${ac_cv_prog_cc_c99+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_prog_cc_c99=no
+else case e in #(
+ e) ac_cv_prog_cc_c99=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5656,25 +5758,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c99" != "xno" && break
done
rm -f conftest.$ac_ext
-CC=$ac_save_CC
+CC=$ac_save_CC ;;
+esac
fi
if test "x$ac_cv_prog_cc_c99" = xno
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
-else $as_nop
- if test "x$ac_cv_prog_cc_c99" = x
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c99" = x
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
- CC="$CC $ac_cv_prog_cc_c99"
+ CC="$CC $ac_cv_prog_cc_c99" ;;
+esac
fi
ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
- ac_prog_cc_stdc=c99
+ ac_prog_cc_stdc=c99 ;;
+esac
fi
fi
if test x$ac_prog_cc_stdc = xno
@@ -5684,8 +5789,8 @@ printf %s "checking for $CC option to enable C89 features... " >&6; }
if test ${ac_cv_prog_cc_c89+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_prog_cc_c89=no
+else case e in #(
+ e) ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5702,25 +5807,28 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
-CC=$ac_save_CC
+CC=$ac_save_CC ;;
+esac
fi
if test "x$ac_cv_prog_cc_c89" = xno
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
printf "%s\n" "unsupported" >&6; }
-else $as_nop
- if test "x$ac_cv_prog_cc_c89" = x
+else case e in #(
+ e) if test "x$ac_cv_prog_cc_c89" = x
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
printf "%s\n" "none needed" >&6; }
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
- CC="$CC $ac_cv_prog_cc_c89"
+ CC="$CC $ac_cv_prog_cc_c89" ;;
+esac
fi
ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
- ac_prog_cc_stdc=c89
+ ac_prog_cc_stdc=c89 ;;
+esac
fi
fi
@@ -5757,8 +5865,8 @@ cache=`echo Werror | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -Werror -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -5766,7 +5874,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -5789,8 +5898,8 @@ cache=`echo Wall | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -Wall -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -5798,7 +5907,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -5823,8 +5933,8 @@ cache=`echo std=c99 | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -std=c99 -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -5832,7 +5942,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -5855,8 +5966,8 @@ cache=`echo xc99 | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -xc99 -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -5864,7 +5975,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -5901,12 +6013,12 @@ fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we need $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE as a flag for $CC" >&5
printf %s "checking whether we need $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE as a flag for $CC... " >&6; }
-cache=`printf "%s\n" "$C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE" | $as_tr_sh`
+cache=`printf "%s\n" "$C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE" | sed "$as_sed_sh"`
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include "confdefs.h"
#include <stdlib.h>
@@ -5960,7 +6072,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -5993,12 +6106,12 @@ fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we need $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE as a flag for $CC" >&5
printf %s "checking whether we need $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE as a flag for $CC... " >&6; }
-cache=`printf "%s\n" "$C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE" | $as_tr_sh`
+cache=`printf "%s\n" "$C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE" | sed "$as_sed_sh"`
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include "confdefs.h"
#include <stdlib.h>
@@ -6052,7 +6165,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -6085,12 +6199,12 @@ fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we need $C99FLAG as a flag for $CC" >&5
printf %s "checking whether we need $C99FLAG as a flag for $CC... " >&6; }
-cache=`printf "%s\n" "$C99FLAG" | $as_tr_sh`
+cache=`printf "%s\n" "$C99FLAG" | sed "$as_sed_sh"`
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include <stdbool.h>
#include <ctype.h>
@@ -6117,7 +6231,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -6154,8 +6269,8 @@ cache=_D_BSD_SOURCE__D_DEFAULT_SOURCE
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include <ctype.h>
@@ -6183,7 +6298,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -6220,8 +6336,8 @@ cache=_D_GNU_SOURCE
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include <netinet/in.h>
@@ -6249,7 +6365,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -6289,8 +6406,8 @@ cache=_D_GNU_SOURCE__D_FRSRESGID
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include <unistd.h>
@@ -6318,7 +6435,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -6355,8 +6473,8 @@ cache=_D_POSIX_C_SOURCE_200112
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include "confdefs.h"
#ifdef HAVE_TIME_H
@@ -6395,7 +6513,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -6432,8 +6551,8 @@ cache=_D__EXTENSIONS__
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include "confdefs.h"
#include <stdlib.h>
@@ -6478,7 +6597,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -6534,8 +6654,8 @@ cache=`echo W | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -W -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -6543,7 +6663,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -6566,8 +6687,8 @@ cache=`echo Wall | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -Wall -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -6575,7 +6696,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -6598,8 +6720,8 @@ cache=`echo Wextra | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -Wextra -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -6607,7 +6729,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -6630,8 +6753,8 @@ cache=`echo Wdeclaration-after-statement | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -Wdeclaration-after-statement -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -6639,7 +6762,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -6704,9 +6828,10 @@ printf "%s\n" "yes" >&6; }
fi
rm -f conftest conftest.c conftest.o
-else $as_nop
- CFLAGS="$BAKCFLAGS" ; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
+else case e in #(
+ e) CFLAGS="$BAKCFLAGS" ; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -6753,9 +6878,10 @@ printf "%s\n" "yes" >&6; }
fi
rm -f conftest conftest.c conftest.o
-else $as_nop
- LDFLAGS="$BAKLDFLAGS" ; CFLAGS="$BAKCFLAGS" ; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
+else case e in #(
+ e) LDFLAGS="$BAKLDFLAGS" ; CFLAGS="$BAKCFLAGS" ; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -6800,9 +6926,10 @@ printf "%s\n" "yes" >&6; }
fi
rm -f conftest conftest.c conftest.o
-else $as_nop
- LDFLAGS="$BAKLDFLAGS" ; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
+else case e in #(
+ e) LDFLAGS="$BAKLDFLAGS" ; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -6816,8 +6943,8 @@ printf %s "checking for inline... " >&6; }
if test ${ac_cv_c_inline+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_c_inline=no
+else case e in #(
+ e) ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -6835,7 +6962,8 @@ fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
test "$ac_cv_c_inline" != no && break
done
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
printf "%s\n" "$ac_cv_c_inline" >&6; }
@@ -6861,8 +6989,8 @@ printf %s "checking whether the C compiler (${CC-cc}) accepts the \"format\" att
if test ${ac_cv_c_format_attribute+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_c_format_attribute=no
+else case e in #(
+ e) ac_cv_c_format_attribute=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
@@ -6882,11 +7010,13 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_c_format_attribute="yes"
-else $as_nop
- ac_cv_c_format_attribute="no"
+else case e in #(
+ e) ac_cv_c_format_attribute="no" ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-
+ ;;
+esac
fi
@@ -6904,8 +7034,8 @@ printf %s "checking whether the C compiler (${CC-cc}) accepts the \"unused\" att
if test ${ac_cv_c_unused_attribute+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_c_unused_attribute=no
+else case e in #(
+ e) ac_cv_c_unused_attribute=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
@@ -6924,11 +7054,13 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_c_unused_attribute="yes"
-else $as_nop
- ac_cv_c_unused_attribute="no"
+else case e in #(
+ e) ac_cv_c_unused_attribute="no" ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-
+ ;;
+esac
fi
@@ -6950,8 +7082,8 @@ printf %s "checking whether the C compiler (${CC-cc}) accepts the \"weak\" attri
if test ${ac_cv_c_weak_attribute+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_c_weak_attribute=no
+else case e in #(
+ e) ac_cv_c_weak_attribute=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
@@ -6970,11 +7102,13 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_c_weak_attribute="yes"
-else $as_nop
- ac_cv_c_weak_attribute="no"
+else case e in #(
+ e) ac_cv_c_weak_attribute="no" ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-
+ ;;
+esac
fi
@@ -7001,8 +7135,8 @@ printf %s "checking whether the C compiler (${CC-cc}) accepts the \"noreturn\" a
if test ${ac_cv_c_noreturn_attribute+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_c_noreturn_attribute=no
+else case e in #(
+ e) ac_cv_c_noreturn_attribute=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
@@ -7021,11 +7155,13 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_c_noreturn_attribute="yes"
-else $as_nop
- ac_cv_c_noreturn_attribute="no"
+else case e in #(
+ e) ac_cv_c_noreturn_attribute="no" ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-
+ ;;
+esac
fi
@@ -7054,8 +7190,8 @@ CFLAGS="$CFLAGS -Werror"
if test ${ac_cv_c_fallthrough_attribute+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_c_fallthrough_attribute=no
+else case e in #(
+ e) ac_cv_c_fallthrough_attribute=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
@@ -7089,11 +7225,13 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_cv_c_fallthrough_attribute="yes"
-else $as_nop
- ac_cv_c_fallthrough_attribute="no"
+else case e in #(
+ e) ac_cv_c_fallthrough_attribute="no" ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-
+ ;;
+esac
fi
CFLAGS="$BAKCFLAGS"
@@ -7131,8 +7269,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_LEX+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$LEX"; then
+else case e in #(
+ e) if test -n "$LEX"; then
ac_cv_prog_LEX="$LEX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -7154,7 +7292,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
LEX=$ac_cv_prog_LEX
if test -n "$LEX"; then
@@ -7212,8 +7351,8 @@ printf %s "checking for lex output file root... " >&6; }
if test ${ac_cv_prog_lex_root+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
ac_cv_prog_lex_root=unknown
{ { ac_try="$LEX conftest.l"
case "(($ac_try" in
@@ -7230,7 +7369,8 @@ if test -f lex.yy.c; then
ac_cv_prog_lex_root=lex.yy
elif test -f lexyy.c; then
ac_cv_prog_lex_root=lexyy
-fi
+fi ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5
printf "%s\n" "$ac_cv_prog_lex_root" >&6; }
@@ -7245,15 +7385,15 @@ LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
if test ${LEXLIB+y}
then :
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex library" >&5
printf %s "checking for lex library... " >&6; }
if test ${ac_cv_lib_lex+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
ac_save_LIBS="$LIBS"
ac_found=false
for ac_cv_lib_lex in 'none needed' -lfl -ll 'not found'; do
@@ -7283,7 +7423,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
fi
done
LIBS="$ac_save_LIBS"
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5
printf "%s\n" "$ac_cv_lib_lex" >&6; }
@@ -7295,10 +7436,12 @@ printf "%s\n" "$as_me: WARNING: required lex library not found; giving up on $LE
elif test "$ac_cv_lib_lex" = 'none needed'
then :
LEXLIB=''
-else $as_nop
- LEXLIB=$ac_cv_lib_lex
+else case e in #(
+ e) LEXLIB=$ac_cv_lib_lex ;;
+esac
fi
-
+ ;;
+esac
fi
@@ -7310,8 +7453,8 @@ printf %s "checking whether yytext is a pointer... " >&6; }
if test ${ac_cv_prog_lex_yytext_pointer+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- # POSIX says lex can declare yytext either as a pointer or an array; the
+else case e in #(
+ e) # POSIX says lex can declare yytext either as a pointer or an array; the
# default is implementation-dependent. Figure out which it is, since
# not all implementations provide the %pointer and %array declarations.
ac_cv_prog_lex_yytext_pointer=no
@@ -7326,7 +7469,8 @@ then :
ac_cv_prog_lex_yytext_pointer=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5
printf "%s\n" "$ac_cv_prog_lex_yytext_pointer" >&6; }
@@ -7386,8 +7530,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_YACC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$YACC"; then
+else case e in #(
+ e) if test -n "$YACC"; then
ac_cv_prog_YACC="$YACC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -7409,7 +7553,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
YACC=$ac_cv_prog_YACC
if test -n "$YACC"; then
@@ -7437,8 +7582,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_doxygen+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$doxygen"; then
+else case e in #(
+ e) if test -n "$doxygen"; then
ac_cv_prog_doxygen="$doxygen" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -7460,7 +7605,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
doxygen=$ac_cv_prog_doxygen
if test -n "$doxygen"; then
@@ -7480,8 +7626,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_STRIP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$STRIP"; then
+else case e in #(
+ e) if test -n "$STRIP"; then
ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -7503,7 +7649,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
@@ -7525,8 +7672,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_STRIP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_STRIP"; then
+else case e in #(
+ e) if test -n "$ac_ct_STRIP"; then
ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -7548,7 +7695,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
@@ -7586,15 +7734,16 @@ printf %s "checking build system type... " >&6; }
if test ${ac_cv_build+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_build_alias=$build_alias
+else case e in #(
+ e) ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
printf "%s\n" "$ac_cv_build" >&6; }
@@ -7621,14 +7770,15 @@ printf %s "checking host system type... " >&6; }
if test ${ac_cv_host+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test "x$host_alias" = x; then
+else case e in #(
+ e) if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
printf "%s\n" "$ac_cv_host" >&6; }
@@ -7678,8 +7828,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_AR+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $AR in
+else case e in #(
+ e) case $AR in
[\\/]* | ?:[\\/]*)
ac_cv_path_AR="$AR" # Let the user override the test with a path.
;;
@@ -7704,6 +7854,7 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
AR=$ac_cv_path_AR
@@ -7726,8 +7877,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_AR+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $ac_pt_AR in
+else case e in #(
+ e) case $ac_pt_AR in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_AR="$ac_pt_AR" # Let the user override the test with a path.
;;
@@ -7752,6 +7903,7 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
ac_pt_AR=$ac_cv_path_ac_pt_AR
@@ -7883,8 +8035,8 @@ printf %s "checking for a sed that does not truncate output... " >&6; }
if test ${ac_cv_path_SED+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+else case e in #(
+ e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
for ac_i in 1 2 3 4 5 6 7; do
ac_script="$ac_script$as_nl$ac_script"
done
@@ -7909,9 +8061,10 @@ do
as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
# Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
+case `"$ac_path_SED" --version 2>&1` in #(
*GNU*)
ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+#(
*)
ac_count=0
printf %s 0123456789 >"conftest.in"
@@ -7946,7 +8099,8 @@ IFS=$as_save_IFS
else
ac_cv_path_SED=$SED
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
printf "%s\n" "$ac_cv_path_SED" >&6; }
@@ -7971,8 +8125,8 @@ printf %s "checking for egrep... " >&6; }
if test ${ac_cv_path_EGREP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+else case e in #(
+ e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
then ac_cv_path_EGREP="$GREP -E"
else
if test -z "$EGREP"; then
@@ -7994,9 +8148,10 @@ do
as_fn_executable_p "$ac_path_EGREP" || continue
# Check for GNU ac_path_EGREP and select it if it is found.
# Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
+case `"$ac_path_EGREP" --version 2>&1` in #(
*GNU*)
ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+#(
*)
ac_count=0
printf %s 0123456789 >"conftest.in"
@@ -8032,20 +8187,23 @@ else
ac_cv_path_EGREP=$EGREP
fi
- fi
+ fi ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
printf "%s\n" "$ac_cv_path_EGREP" >&6; }
EGREP="$ac_cv_path_EGREP"
+ EGREP_TRADITIONAL=$EGREP
+ ac_cv_path_EGREP_TRADITIONAL=$EGREP
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
printf %s "checking for fgrep... " >&6; }
if test ${ac_cv_path_FGREP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+else case e in #(
+ e) if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
then ac_cv_path_FGREP="$GREP -F"
else
if test -z "$FGREP"; then
@@ -8067,9 +8225,10 @@ do
as_fn_executable_p "$ac_path_FGREP" || continue
# Check for GNU ac_path_FGREP and select it if it is found.
# Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
+case `"$ac_path_FGREP" --version 2>&1` in #(
*GNU*)
ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+#(
*)
ac_count=0
printf %s 0123456789 >"conftest.in"
@@ -8105,7 +8264,8 @@ else
ac_cv_path_FGREP=$FGREP
fi
- fi
+ fi ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
printf "%s\n" "$ac_cv_path_FGREP" >&6; }
@@ -8136,8 +8296,9 @@ test -z "$GREP" && GREP=grep
if test ${with_gnu_ld+y}
then :
withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
-else $as_nop
- with_gnu_ld=no
+else case e in #(
+ e) with_gnu_ld=no ;;
+esac
fi
ac_prog=ld
@@ -8182,8 +8343,8 @@ fi
if test ${lt_cv_path_LD+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -z "$LD"; then
+else case e in #(
+ e) if test -z "$LD"; then
lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
IFS=$lt_save_ifs
@@ -8206,7 +8367,8 @@ else $as_nop
IFS=$lt_save_ifs
else
lt_cv_path_LD=$LD # Let the user override the test with a path.
-fi
+fi ;;
+esac
fi
LD=$lt_cv_path_LD
@@ -8223,8 +8385,8 @@ printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
if test ${lt_cv_prog_gnu_ld+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- # I'd rather use --version here, but apparently some GNU lds only accept -v.
+else case e in #(
+ e) # I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
lt_cv_prog_gnu_ld=yes
@@ -8232,6 +8394,7 @@ case `$LD -v 2>&1 </dev/null` in
*)
lt_cv_prog_gnu_ld=no
;;
+esac ;;
esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
@@ -8251,8 +8414,8 @@ printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
if test ${lt_cv_path_NM+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$NM"; then
+else case e in #(
+ e) if test -n "$NM"; then
# Let the user override the test.
lt_cv_path_NM=$NM
else
@@ -8299,7 +8462,8 @@ else
IFS=$lt_save_ifs
done
: ${lt_cv_path_NM=no}
-fi
+fi ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
printf "%s\n" "$lt_cv_path_NM" >&6; }
@@ -8320,8 +8484,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_DUMPBIN+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$DUMPBIN"; then
+else case e in #(
+ e) if test -n "$DUMPBIN"; then
ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -8343,7 +8507,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
DUMPBIN=$ac_cv_prog_DUMPBIN
if test -n "$DUMPBIN"; then
@@ -8369,8 +8534,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_DUMPBIN+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_DUMPBIN"; then
+else case e in #(
+ e) if test -n "$ac_ct_DUMPBIN"; then
ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -8392,7 +8557,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
if test -n "$ac_ct_DUMPBIN"; then
@@ -8446,8 +8612,8 @@ printf %s "checking the name lister ($NM) interface... " >&6; }
if test ${lt_cv_nm_interface+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_nm_interface="BSD nm"
+else case e in #(
+ e) lt_cv_nm_interface="BSD nm"
echo "int some_variable = 0;" > conftest.$ac_ext
(eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
(eval "$ac_compile" 2>conftest.err)
@@ -8460,7 +8626,8 @@ else $as_nop
if $GREP 'External.*some_variable' conftest.out > /dev/null; then
lt_cv_nm_interface="MS dumpbin"
fi
- rm -f conftest*
+ rm -f conftest* ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
printf "%s\n" "$lt_cv_nm_interface" >&6; }
@@ -8482,8 +8649,8 @@ printf %s "checking the maximum length of command line arguments... " >&6; }
if test ${lt_cv_sys_max_cmd_len+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- i=0
+else case e in #(
+ e) i=0
teststring=ABCD
case $build_os in
@@ -8605,7 +8772,8 @@ else $as_nop
fi
;;
esac
-
+ ;;
+esac
fi
if test -n "$lt_cv_sys_max_cmd_len"; then
@@ -8662,8 +8830,8 @@ printf %s "checking how to convert $build file names to $host format... " >&6; }
if test ${lt_cv_to_host_file_cmd+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $host in
+else case e in #(
+ e) case $host in
*-*-mingw* )
case $build in
*-*-mingw* ) # actually msys
@@ -8694,7 +8862,8 @@ else $as_nop
lt_cv_to_host_file_cmd=func_convert_file_noop
;;
esac
-
+ ;;
+esac
fi
to_host_file_cmd=$lt_cv_to_host_file_cmd
@@ -8710,8 +8879,8 @@ printf %s "checking how to convert $build file names to toolchain format... " >&
if test ${lt_cv_to_tool_file_cmd+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- #assume ordinary cross tools, or native build.
+else case e in #(
+ e) #assume ordinary cross tools, or native build.
lt_cv_to_tool_file_cmd=func_convert_file_noop
case $host in
*-*-mingw* )
@@ -8722,7 +8891,8 @@ case $host in
esac
;;
esac
-
+ ;;
+esac
fi
to_tool_file_cmd=$lt_cv_to_tool_file_cmd
@@ -8738,8 +8908,9 @@ printf %s "checking for $LD option to reload object files... " >&6; }
if test ${lt_cv_ld_reload_flag+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_ld_reload_flag='-r'
+else case e in #(
+ e) lt_cv_ld_reload_flag='-r' ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
printf "%s\n" "$lt_cv_ld_reload_flag" >&6; }
@@ -8780,8 +8951,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_OBJDUMP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$OBJDUMP"; then
+else case e in #(
+ e) if test -n "$OBJDUMP"; then
ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -8803,7 +8974,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
OBJDUMP=$ac_cv_prog_OBJDUMP
if test -n "$OBJDUMP"; then
@@ -8825,8 +8997,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_OBJDUMP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_OBJDUMP"; then
+else case e in #(
+ e) if test -n "$ac_ct_OBJDUMP"; then
ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -8848,7 +9020,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
if test -n "$ac_ct_OBJDUMP"; then
@@ -8889,8 +9062,8 @@ printf %s "checking how to recognize dependent libraries... " >&6; }
if test ${lt_cv_deplibs_check_method+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_file_magic_cmd='$MAGIC_CMD'
+else case e in #(
+ e) lt_cv_file_magic_cmd='$MAGIC_CMD'
lt_cv_file_magic_test_file=
lt_cv_deplibs_check_method='unknown'
# Need to set the preceding variable on all platforms that support
@@ -9083,7 +9256,8 @@ os2*)
lt_cv_deplibs_check_method=pass_all
;;
esac
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
printf "%s\n" "$lt_cv_deplibs_check_method" >&6; }
@@ -9135,8 +9309,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_DLLTOOL+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$DLLTOOL"; then
+else case e in #(
+ e) if test -n "$DLLTOOL"; then
ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9158,7 +9332,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
DLLTOOL=$ac_cv_prog_DLLTOOL
if test -n "$DLLTOOL"; then
@@ -9180,8 +9355,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_DLLTOOL+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_DLLTOOL"; then
+else case e in #(
+ e) if test -n "$ac_ct_DLLTOOL"; then
ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9203,7 +9378,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
if test -n "$ac_ct_DLLTOOL"; then
@@ -9245,8 +9421,8 @@ printf %s "checking how to associate runtime and link libraries... " >&6; }
if test ${lt_cv_sharedlib_from_linklib_cmd+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_sharedlib_from_linklib_cmd='unknown'
+else case e in #(
+ e) lt_cv_sharedlib_from_linklib_cmd='unknown'
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
@@ -9266,7 +9442,8 @@ cygwin* | mingw* | pw32* | cegcc*)
lt_cv_sharedlib_from_linklib_cmd=$ECHO
;;
esac
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
@@ -9289,8 +9466,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_AR+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$AR"; then
+else case e in #(
+ e) if test -n "$AR"; then
ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9312,7 +9489,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
@@ -9338,8 +9516,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_AR+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_AR"; then
+else case e in #(
+ e) if test -n "$ac_ct_AR"; then
ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9361,7 +9539,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
@@ -9407,8 +9586,8 @@ printf %s "checking for archiver @FILE support... " >&6; }
if test ${lt_cv_ar_at_file+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_ar_at_file=no
+else case e in #(
+ e) lt_cv_ar_at_file=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -9445,7 +9624,8 @@ then :
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
printf "%s\n" "$lt_cv_ar_at_file" >&6; }
@@ -9470,8 +9650,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_STRIP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$STRIP"; then
+else case e in #(
+ e) if test -n "$STRIP"; then
ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9493,7 +9673,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
@@ -9515,8 +9696,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_STRIP+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_STRIP"; then
+else case e in #(
+ e) if test -n "$ac_ct_STRIP"; then
ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9538,7 +9719,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
@@ -9579,8 +9761,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_RANLIB+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$RANLIB"; then
+else case e in #(
+ e) if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9602,7 +9784,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
@@ -9624,8 +9807,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_RANLIB+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_RANLIB"; then
+else case e in #(
+ e) if test -n "$ac_ct_RANLIB"; then
ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9647,7 +9830,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
@@ -9733,8 +9917,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_AWK+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$AWK"; then
+else case e in #(
+ e) if test -n "$AWK"; then
ac_cv_prog_AWK="$AWK" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -9756,7 +9940,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
AWK=$ac_cv_prog_AWK
if test -n "$AWK"; then
@@ -9805,8 +9990,8 @@ printf %s "checking command to parse $NM output from $compiler object... " >&6;
if test ${lt_cv_sys_global_symbol_pipe+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
# These are sane defaults that work on at least a few old systems.
# [They come from Ultrix. What could be older than Ultrix?!! ;)]
@@ -10061,7 +10246,8 @@ _LT_EOF
lt_cv_sys_global_symbol_pipe=
fi
done
-
+ ;;
+esac
fi
if test -z "$lt_cv_sys_global_symbol_pipe"; then
@@ -10125,8 +10311,9 @@ printf %s "checking for sysroot... " >&6; }
if test ${with_sysroot+y}
then :
withval=$with_sysroot;
-else $as_nop
- with_sysroot=no
+else case e in #(
+ e) with_sysroot=no ;;
+esac
fi
@@ -10161,8 +10348,8 @@ printf %s "checking for a working dd... " >&6; }
if test ${ac_cv_path_lt_DD+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- printf 0123456789abcdef0123456789abcdef >conftest.i
+else case e in #(
+ e) printf 0123456789abcdef0123456789abcdef >conftest.i
cat conftest.i conftest.i >conftest2.i
: ${lt_DD:=$DD}
if test -z "$lt_DD"; then
@@ -10198,7 +10385,8 @@ else
ac_cv_path_lt_DD=$lt_DD
fi
-rm -f conftest.i conftest2.i conftest.out
+rm -f conftest.i conftest2.i conftest.out ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
printf "%s\n" "$ac_cv_path_lt_DD" >&6; }
@@ -10209,8 +10397,8 @@ printf %s "checking how to truncate binary pipes... " >&6; }
if test ${lt_cv_truncate_bin+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- printf 0123456789abcdef0123456789abcdef >conftest.i
+else case e in #(
+ e) printf 0123456789abcdef0123456789abcdef >conftest.i
cat conftest.i conftest.i >conftest2.i
lt_cv_truncate_bin=
if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
@@ -10218,7 +10406,8 @@ if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; the
&& lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
fi
rm -f conftest.i conftest2.i conftest.out
-test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
printf "%s\n" "$lt_cv_truncate_bin" >&6; }
@@ -10428,8 +10617,8 @@ printf %s "checking whether the C compiler needs -belf... " >&6; }
if test ${lt_cv_cc_needs_belf+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_ext=c
+else case e in #(
+ e) ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
@@ -10449,8 +10638,9 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
lt_cv_cc_needs_belf=yes
-else $as_nop
- lt_cv_cc_needs_belf=no
+else case e in #(
+ e) lt_cv_cc_needs_belf=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -10459,7 +10649,8 @@ ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
printf "%s\n" "$lt_cv_cc_needs_belf" >&6; }
@@ -10517,8 +10708,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_MANIFEST_TOOL+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$MANIFEST_TOOL"; then
+else case e in #(
+ e) if test -n "$MANIFEST_TOOL"; then
ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10540,7 +10731,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
if test -n "$MANIFEST_TOOL"; then
@@ -10562,8 +10754,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_MANIFEST_TOOL"; then
+else case e in #(
+ e) if test -n "$ac_ct_MANIFEST_TOOL"; then
ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10585,7 +10777,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
if test -n "$ac_ct_MANIFEST_TOOL"; then
@@ -10617,15 +10810,16 @@ printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
if test ${lt_cv_path_mainfest_tool+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_path_mainfest_tool=no
+else case e in #(
+ e) lt_cv_path_mainfest_tool=no
echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
$MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
cat conftest.err >&5
if $GREP 'Manifest Tool' conftest.out > /dev/null; then
lt_cv_path_mainfest_tool=yes
fi
- rm -f conftest*
+ rm -f conftest* ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; }
@@ -10648,8 +10842,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_DSYMUTIL+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$DSYMUTIL"; then
+else case e in #(
+ e) if test -n "$DSYMUTIL"; then
ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10671,7 +10865,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
DSYMUTIL=$ac_cv_prog_DSYMUTIL
if test -n "$DSYMUTIL"; then
@@ -10693,8 +10888,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_DSYMUTIL+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_DSYMUTIL"; then
+else case e in #(
+ e) if test -n "$ac_ct_DSYMUTIL"; then
ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10716,7 +10911,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
if test -n "$ac_ct_DSYMUTIL"; then
@@ -10750,8 +10946,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_NMEDIT+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$NMEDIT"; then
+else case e in #(
+ e) if test -n "$NMEDIT"; then
ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10773,7 +10969,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
NMEDIT=$ac_cv_prog_NMEDIT
if test -n "$NMEDIT"; then
@@ -10795,8 +10992,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_NMEDIT+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_NMEDIT"; then
+else case e in #(
+ e) if test -n "$ac_ct_NMEDIT"; then
ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10818,7 +11015,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
if test -n "$ac_ct_NMEDIT"; then
@@ -10852,8 +11050,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_LIPO+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$LIPO"; then
+else case e in #(
+ e) if test -n "$LIPO"; then
ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10875,7 +11073,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
LIPO=$ac_cv_prog_LIPO
if test -n "$LIPO"; then
@@ -10897,8 +11096,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_LIPO+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_LIPO"; then
+else case e in #(
+ e) if test -n "$ac_ct_LIPO"; then
ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10920,7 +11119,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
if test -n "$ac_ct_LIPO"; then
@@ -10954,8 +11154,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_OTOOL+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$OTOOL"; then
+else case e in #(
+ e) if test -n "$OTOOL"; then
ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -10977,7 +11177,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
OTOOL=$ac_cv_prog_OTOOL
if test -n "$OTOOL"; then
@@ -10999,8 +11200,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_OTOOL+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_OTOOL"; then
+else case e in #(
+ e) if test -n "$ac_ct_OTOOL"; then
ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -11022,7 +11223,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
if test -n "$ac_ct_OTOOL"; then
@@ -11056,8 +11258,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_OTOOL64+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$OTOOL64"; then
+else case e in #(
+ e) if test -n "$OTOOL64"; then
ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -11079,7 +11281,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
OTOOL64=$ac_cv_prog_OTOOL64
if test -n "$OTOOL64"; then
@@ -11101,8 +11304,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_OTOOL64+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_OTOOL64"; then
+else case e in #(
+ e) if test -n "$ac_ct_OTOOL64"; then
ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -11124,7 +11327,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
if test -n "$ac_ct_OTOOL64"; then
@@ -11181,8 +11385,8 @@ printf %s "checking for -single_module linker flag... " >&6; }
if test ${lt_cv_apple_cc_single_mod+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_apple_cc_single_mod=no
+else case e in #(
+ e) lt_cv_apple_cc_single_mod=no
if test -z "$LT_MULTI_MODULE"; then
# By default we will add the -single_module flag. You can override
# by either setting the environment variable LT_MULTI_MODULE
@@ -11208,7 +11412,8 @@ else $as_nop
fi
rm -rf libconftest.dylib*
rm -f conftest.*
- fi
+ fi ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; }
@@ -11218,8 +11423,8 @@ printf %s "checking for -exported_symbols_list linker flag... " >&6; }
if test ${lt_cv_ld_exported_symbols_list+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_ld_exported_symbols_list=no
+else case e in #(
+ e) lt_cv_ld_exported_symbols_list=no
save_LDFLAGS=$LDFLAGS
echo "_main" > conftest.sym
LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
@@ -11237,13 +11442,15 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
lt_cv_ld_exported_symbols_list=yes
-else $as_nop
- lt_cv_ld_exported_symbols_list=no
+else case e in #(
+ e) lt_cv_ld_exported_symbols_list=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; }
@@ -11253,8 +11460,8 @@ printf %s "checking for -force_load linker flag... " >&6; }
if test ${lt_cv_ld_force_load+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_ld_force_load=no
+else case e in #(
+ e) lt_cv_ld_force_load=no
cat > conftest.c << _LT_EOF
int forced_loaded() { return 2;}
_LT_EOF
@@ -11279,7 +11486,8 @@ _LT_EOF
fi
rm -f conftest.err libconftest.a conftest conftest.c
rm -rf conftest.dSYM
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
printf "%s\n" "$lt_cv_ld_force_load" >&6; }
@@ -11397,8 +11605,9 @@ then :
IFS=$lt_save_ifs
;;
esac
-else $as_nop
- enable_shared=yes
+else case e in #(
+ e) enable_shared=yes ;;
+esac
fi
@@ -11429,8 +11638,9 @@ then :
IFS=$lt_save_ifs
;;
esac
-else $as_nop
- enable_static=yes
+else case e in #(
+ e) enable_static=yes ;;
+esac
fi
@@ -11461,8 +11671,9 @@ then :
IFS=$lt_save_ifs
;;
esac
-else $as_nop
- pic_mode=default
+else case e in #(
+ e) pic_mode=default ;;
+esac
fi
@@ -11492,8 +11703,9 @@ then :
IFS=$lt_save_ifs
;;
esac
-else $as_nop
- enable_fast_install=yes
+else case e in #(
+ e) enable_fast_install=yes ;;
+esac
fi
@@ -11520,15 +11732,17 @@ then :
;;
esac
lt_cv_with_aix_soname=$with_aix_soname
-else $as_nop
- if test ${lt_cv_with_aix_soname+y}
+else case e in #(
+ e) if test ${lt_cv_with_aix_soname+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_with_aix_soname=aix
+else case e in #(
+ e) lt_cv_with_aix_soname=aix ;;
+esac
fi
- with_aix_soname=$lt_cv_with_aix_soname
+ with_aix_soname=$lt_cv_with_aix_soname ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
@@ -11619,8 +11833,8 @@ printf %s "checking for objdir... " >&6; }
if test ${lt_cv_objdir+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- rm -f .libs 2>/dev/null
+else case e in #(
+ e) rm -f .libs 2>/dev/null
mkdir .libs 2>/dev/null
if test -d .libs; then
lt_cv_objdir=.libs
@@ -11628,7 +11842,8 @@ else
# MS-DOS does not allow filenames that begin with a dot.
lt_cv_objdir=_libs
fi
-rmdir .libs 2>/dev/null
+rmdir .libs 2>/dev/null ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
printf "%s\n" "$lt_cv_objdir" >&6; }
@@ -11689,8 +11904,8 @@ printf %s "checking for ${ac_tool_prefix}file... " >&6; }
if test ${lt_cv_path_MAGIC_CMD+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $MAGIC_CMD in
+else case e in #(
+ e) case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
;;
@@ -11733,6 +11948,7 @@ _LT_EOF
IFS=$lt_save_ifs
MAGIC_CMD=$lt_save_MAGIC_CMD
;;
+esac ;;
esac
fi
@@ -11756,8 +11972,8 @@ printf %s "checking for file... " >&6; }
if test ${lt_cv_path_MAGIC_CMD+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $MAGIC_CMD in
+else case e in #(
+ e) case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
;;
@@ -11800,6 +12016,7 @@ _LT_EOF
IFS=$lt_save_ifs
MAGIC_CMD=$lt_save_MAGIC_CMD
;;
+esac ;;
esac
fi
@@ -11895,8 +12112,8 @@ printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
if test ${lt_cv_prog_compiler_rtti_exceptions+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_prog_compiler_rtti_exceptions=no
+else case e in #(
+ e) lt_cv_prog_compiler_rtti_exceptions=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
@@ -11924,7 +12141,8 @@ else $as_nop
fi
fi
$RM conftest*
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
@@ -12289,8 +12507,9 @@ printf %s "checking for $compiler option to produce PIC... " >&6; }
if test ${lt_cv_prog_compiler_pic+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+else case e in #(
+ e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; }
@@ -12305,8 +12524,8 @@ printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6;
if test ${lt_cv_prog_compiler_pic_works+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_prog_compiler_pic_works=no
+else case e in #(
+ e) lt_cv_prog_compiler_pic_works=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment
@@ -12334,7 +12553,8 @@ else $as_nop
fi
fi
$RM conftest*
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; }
@@ -12370,8 +12590,8 @@ printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6;
if test ${lt_cv_prog_compiler_static_works+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_prog_compiler_static_works=no
+else case e in #(
+ e) lt_cv_prog_compiler_static_works=no
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
echo "$lt_simple_link_test_code" > conftest.$ac_ext
@@ -12392,7 +12612,8 @@ else $as_nop
fi
$RM -r conftest*
LDFLAGS=$save_LDFLAGS
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; }
@@ -12414,8 +12635,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if test ${lt_cv_prog_compiler_c_o+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_prog_compiler_c_o=no
+else case e in #(
+ e) lt_cv_prog_compiler_c_o=no
$RM -r conftest 2>/dev/null
mkdir conftest
cd conftest
@@ -12455,7 +12676,8 @@ else $as_nop
cd ..
$RM -r conftest
$RM conftest*
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
@@ -12470,8 +12692,8 @@ printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if test ${lt_cv_prog_compiler_c_o+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_prog_compiler_c_o=no
+else case e in #(
+ e) lt_cv_prog_compiler_c_o=no
$RM -r conftest 2>/dev/null
mkdir conftest
cd conftest
@@ -12511,7 +12733,8 @@ else $as_nop
cd ..
$RM -r conftest
$RM conftest*
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; }
@@ -13105,8 +13328,8 @@ else
if test ${lt_cv_aix_libpath_+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -13138,7 +13361,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
if test -z "$lt_cv_aix_libpath_"; then
lt_cv_aix_libpath_=/usr/lib:/lib
fi
-
+ ;;
+esac
fi
aix_libpath=$lt_cv_aix_libpath_
@@ -13160,8 +13384,8 @@ else
if test ${lt_cv_aix_libpath_+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -13193,7 +13417,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
if test -z "$lt_cv_aix_libpath_"; then
lt_cv_aix_libpath_=/usr/lib:/lib
fi
-
+ ;;
+esac
fi
aix_libpath=$lt_cv_aix_libpath_
@@ -13444,8 +13669,8 @@ printf %s "checking if $CC understands -b... " >&6; }
if test ${lt_cv_prog_compiler__b+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_prog_compiler__b=no
+else case e in #(
+ e) lt_cv_prog_compiler__b=no
save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -b"
echo "$lt_simple_link_test_code" > conftest.$ac_ext
@@ -13466,7 +13691,8 @@ else $as_nop
fi
$RM -r conftest*
LDFLAGS=$save_LDFLAGS
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
printf "%s\n" "$lt_cv_prog_compiler__b" >&6; }
@@ -13514,8 +13740,8 @@ printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&
if test ${lt_cv_irix_exported_symbol+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- save_LDFLAGS=$LDFLAGS
+else case e in #(
+ e) save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -13524,12 +13750,14 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
lt_cv_irix_exported_symbol=yes
-else $as_nop
- lt_cv_irix_exported_symbol=no
+else case e in #(
+ e) lt_cv_irix_exported_symbol=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$save_LDFLAGS
+ LDFLAGS=$save_LDFLAGS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; }
@@ -13854,8 +14082,8 @@ printf %s "checking whether -lc should be explicitly linked in... " >&6; }
if test ${lt_cv_archive_cmds_need_lc+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- $RM conftest*
+else case e in #(
+ e) $RM conftest*
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
@@ -13891,7 +14119,8 @@ else $as_nop
cat conftest.err 1>&5
fi
$RM conftest*
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; }
@@ -14618,8 +14847,8 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
if test ${lt_cv_shlibpath_overrides_runpath+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- lt_cv_shlibpath_overrides_runpath=no
+else case e in #(
+ e) lt_cv_shlibpath_overrides_runpath=no
save_LDFLAGS=$LDFLAGS
save_libdir=$libdir
eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
@@ -14646,7 +14875,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LDFLAGS=$save_LDFLAGS
libdir=$save_libdir
-
+ ;;
+esac
fi
shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
@@ -15074,16 +15304,22 @@ printf %s "checking for dlopen in -ldl... " >&6; }
if test ${ac_cv_lib_dl_dlopen+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char dlopen ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen (void);
int
main (void)
{
@@ -15095,24 +15331,27 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_dl_dlopen=yes
-else $as_nop
- ac_cv_lib_dl_dlopen=no
+else case e in #(
+ e) ac_cv_lib_dl_dlopen=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes
then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
-else $as_nop
-
+else case e in #(
+ e)
lt_cv_dlopen=dyld
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
-
+ ;;
+esac
fi
;;
@@ -15130,22 +15369,28 @@ fi
if test "x$ac_cv_func_shl_load" = xyes
then :
lt_cv_dlopen=shl_load
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
printf %s "checking for shl_load in -ldld... " >&6; }
if test ${ac_cv_lib_dld_shl_load+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char shl_load ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load (void);
int
main (void)
{
@@ -15157,39 +15402,47 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_dld_shl_load=yes
-else $as_nop
- ac_cv_lib_dld_shl_load=no
+else case e in #(
+ e) ac_cv_lib_dld_shl_load=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = xyes
then :
lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
-else $as_nop
- ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+else case e in #(
+ e) ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = xyes
then :
lt_cv_dlopen=dlopen
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
printf %s "checking for dlopen in -ldl... " >&6; }
if test ${ac_cv_lib_dl_dlopen+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char dlopen ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen (void);
int
main (void)
{
@@ -15201,34 +15454,42 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_dl_dlopen=yes
-else $as_nop
- ac_cv_lib_dl_dlopen=no
+else case e in #(
+ e) ac_cv_lib_dl_dlopen=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes
then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
printf %s "checking for dlopen in -lsvld... " >&6; }
if test ${ac_cv_lib_svld_dlopen+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char dlopen ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen (void);
int
main (void)
{
@@ -15240,34 +15501,42 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_svld_dlopen=yes
-else $as_nop
- ac_cv_lib_svld_dlopen=no
+else case e in #(
+ e) ac_cv_lib_svld_dlopen=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; }
if test "x$ac_cv_lib_svld_dlopen" = xyes
then :
lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
printf %s "checking for dld_link in -ldld... " >&6; }
if test ${ac_cv_lib_dld_dld_link+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char dld_link ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link (void);
int
main (void)
{
@@ -15279,12 +15548,14 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_dld_dld_link=yes
-else $as_nop
- ac_cv_lib_dld_dld_link=no
+else case e in #(
+ e) ac_cv_lib_dld_dld_link=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; }
@@ -15293,19 +15564,24 @@ then :
lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
fi
-
+ ;;
+esac
fi
-
+ ;;
+esac
fi
-
+ ;;
+esac
fi
-
+ ;;
+esac
fi
-
+ ;;
+esac
fi
;;
@@ -15333,8 +15609,8 @@ printf %s "checking whether a program can dlopen itself... " >&6; }
if test ${lt_cv_dlopen_self+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test yes = "$cross_compiling"; then :
+else case e in #(
+ e) if test yes = "$cross_compiling"; then :
lt_cv_dlopen_self=cross
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -15428,7 +15704,8 @@ _LT_EOF
fi
rm -fr conftest*
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
printf "%s\n" "$lt_cv_dlopen_self" >&6; }
@@ -15440,8 +15717,8 @@ printf %s "checking whether a statically linked program can dlopen itself... " >
if test ${lt_cv_dlopen_self_static+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test yes = "$cross_compiling"; then :
+else case e in #(
+ e) if test yes = "$cross_compiling"; then :
lt_cv_dlopen_self_static=cross
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -15535,7 +15812,8 @@ _LT_EOF
fi
rm -fr conftest*
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
printf "%s\n" "$lt_cv_dlopen_self_static" >&6; }
@@ -15710,8 +15988,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_PKG_CONFIG+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $PKG_CONFIG in
+else case e in #(
+ e) case $PKG_CONFIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
;;
@@ -15736,6 +16014,7 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
PKG_CONFIG=$ac_cv_path_PKG_CONFIG
@@ -15758,8 +16037,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_ac_pt_PKG_CONFIG+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $ac_pt_PKG_CONFIG in
+else case e in #(
+ e) case $ac_pt_PKG_CONFIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
;;
@@ -15784,6 +16063,7 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
@@ -16115,265 +16395,132 @@ ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default"
if test "x$ac_cv_type_int8_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define int8_t signed char" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "$ac_includes_default"
if test "x$ac_cv_type_int16_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define int16_t short" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "$ac_includes_default"
if test "x$ac_cv_type_int32_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define int32_t int" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "int64_t" "ac_cv_type_int64_t" "$ac_includes_default"
if test "x$ac_cv_type_int64_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define int64_t long long" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default"
if test "x$ac_cv_type_uint8_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define uint8_t unsigned char" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "uint16_t" "ac_cv_type_uint16_t" "$ac_includes_default"
if test "x$ac_cv_type_uint16_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define uint16_t unsigned short" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default"
if test "x$ac_cv_type_uint32_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define uint32_t unsigned int" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "$ac_includes_default"
if test "x$ac_cv_type_uint64_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define uint64_t unsigned long long" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
if test "x$ac_cv_type_size_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define size_t unsigned int" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
if test "x$ac_cv_type_ssize_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define ssize_t int" >>confdefs.h
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-printf %s "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if test ${ac_cv_prog_CPP+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- # Double quotes because $CC needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <limits.h>
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"
-then :
-
-else $as_nop
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"
-then :
- # Broken: success on invalid input.
-continue
-else $as_nop
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok
-then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-printf "%s\n" "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <limits.h>
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"
-then :
-
-else $as_nop
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"
-then :
- # Broken: success on invalid input.
-continue
-else $as_nop
- # Passes both tests.
-ac_preproc_ok=:
-break
+ ;;
+esac
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok
+ac_fn_c_check_type "$LINENO" "uid_t" "ac_cv_type_uid_t" "$ac_includes_default"
+if test "x$ac_cv_type_uid_t" = xyes
then :
-else $as_nop
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
+else case e in #(
+ e)
+printf "%s\n" "#define uid_t int" >>confdefs.h
+ ;;
+esac
fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
-printf %s "checking for uid_t in sys/types.h... " >&6; }
-if test ${ac_cv_type_uid_t+y}
+ac_fn_c_check_type "$LINENO" "gid_t" "ac_cv_type_gid_t" "$ac_includes_default"
+if test "x$ac_cv_type_gid_t" = xyes
then :
- printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "uid_t" >/dev/null 2>&1
-then :
- ac_cv_type_uid_t=yes
-else $as_nop
- ac_cv_type_uid_t=no
-fi
-rm -rf conftest*
-
-fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
-printf "%s\n" "$ac_cv_type_uid_t" >&6; }
-if test $ac_cv_type_uid_t = no; then
-
-printf "%s\n" "#define uid_t int" >>confdefs.h
-
+else case e in #(
+ e)
printf "%s\n" "#define gid_t int" >>confdefs.h
-
+ ;;
+esac
fi
@@ -16382,8 +16529,8 @@ fi
if test "x$ac_cv_type_pid_t" = xyes
then :
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#if defined _WIN64 && !defined __CYGWIN__
@@ -16402,14 +16549,16 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
ac_pid_type='int'
-else $as_nop
- ac_pid_type='__int64'
+else case e in #(
+ e) ac_pid_type='__int64' ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h
-
+ ;;
+esac
fi
@@ -16417,10 +16566,11 @@ ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
if test "x$ac_cv_type_off_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define off_t long int" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "u_char" "ac_cv_type_u_char" "
@@ -16433,10 +16583,11 @@ $ac_includes_default
if test "x$ac_cv_type_u_char" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define u_char unsigned char" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "rlim_t" "ac_cv_type_rlim_t" "
@@ -16449,10 +16600,11 @@ $ac_includes_default
if test "x$ac_cv_type_rlim_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define rlim_t unsigned long" >>confdefs.h
-
+ ;;
+esac
fi
@@ -16469,10 +16621,11 @@ $ac_includes_default
if test "x$ac_cv_type_socklen_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define socklen_t int" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "in_addr_t" "ac_cv_type_in_addr_t" "
@@ -16488,10 +16641,11 @@ $ac_includes_default
if test "x$ac_cv_type_in_addr_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define in_addr_t uint32_t" >>confdefs.h
-
+ ;;
+esac
fi
ac_fn_c_check_type "$LINENO" "in_port_t" "ac_cv_type_in_port_t" "
@@ -16507,10 +16661,11 @@ $ac_includes_default
if test "x$ac_cv_type_in_port_t" = xyes
then :
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define in_port_t uint16_t" >>confdefs.h
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if memcmp compares unsigned" >&5
@@ -16529,8 +16684,8 @@ printf "%s\n" "#define MEMCMP_IS_BROKEN 1" >>confdefs.h
esac
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
@@ -16549,8 +16704,8 @@ if ac_fn_c_try_run "$LINENO"
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
printf "%s\n" "#define MEMCMP_IS_BROKEN 1" >>confdefs.h
@@ -16561,24 +16716,26 @@ printf "%s\n" "#define MEMCMP_IS_BROKEN 1" >>confdefs.h
;;
esac
-
+ ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
printf %s "checking size of time_t... " >&6; }
if test ${ac_cv_sizeof_time_t+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "
+else case e in #(
+ e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "
$ac_includes_default
#ifdef TIME_WITH_SYS_TIME
# include <sys/time.h>
@@ -16594,17 +16751,19 @@ $ac_includes_default
"
then :
-else $as_nop
- if test "$ac_cv_type_time_t" = yes; then
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+else case e in #(
+ e) if test "$ac_cv_type_time_t" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (time_t)
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
else
ac_cv_sizeof_time_t=0
- fi
+ fi ;;
+esac
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5
printf "%s\n" "$ac_cv_sizeof_time_t" >&6; }
@@ -16616,28 +16775,30 @@ printf "%s\n" "#define SIZEOF_TIME_T $ac_cv_sizeof_time_t" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
printf %s "checking size of size_t... " >&6; }
if test ${ac_cv_sizeof_size_t+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"
+else case e in #(
+ e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"
then :
-else $as_nop
- if test "$ac_cv_type_size_t" = yes; then
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+else case e in #(
+ e) if test "$ac_cv_type_size_t" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (size_t)
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
else
ac_cv_sizeof_size_t=0
- fi
+ fi ;;
+esac
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
printf "%s\n" "$ac_cv_sizeof_size_t" >&6; }
@@ -16654,8 +16815,9 @@ printf "%s\n" "#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t" >>confdefs.h
if test ${enable_rpath+y}
then :
enableval=$enable_rpath; enable_rpath=$enableval
-else $as_nop
- enable_rpath=yes
+else case e in #(
+ e) enable_rpath=yes ;;
+esac
fi
if test "x$enable_rpath" = xno; then
@@ -16671,15 +16833,21 @@ printf %s "checking for library containing inet_pton... " >&6; }
if test ${ac_cv_search_inet_pton+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char inet_pton ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inet_pton (void);
int
main (void)
{
@@ -16710,11 +16878,13 @@ done
if test ${ac_cv_search_inet_pton+y}
then :
-else $as_nop
- ac_cv_search_inet_pton=no
+else case e in #(
+ e) ac_cv_search_inet_pton=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_pton" >&5
printf "%s\n" "$ac_cv_search_inet_pton" >&6; }
@@ -16730,15 +16900,21 @@ printf %s "checking for library containing socket... " >&6; }
if test ${ac_cv_search_socket+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char socket ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char socket (void);
int
main (void)
{
@@ -16769,11 +16945,13 @@ done
if test ${ac_cv_search_socket+y}
then :
-else $as_nop
- ac_cv_search_socket=no
+else case e in #(
+ e) ac_cv_search_socket=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5
printf "%s\n" "$ac_cv_search_socket" >&6; }
@@ -16793,8 +16971,8 @@ printf %s "checking for working chown... " >&6; }
if test ${ac_cv_func_chown_works+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test "$cross_compiling" = yes
+else case e in #(
+ e) if test "$cross_compiling" = yes
then :
case "$host_os" in # ((
# Guess yes on glibc systems.
@@ -16802,8 +16980,8 @@ then :
# If we don't know, assume the worst.
*) ac_cv_func_chown_works=no ;;
esac
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
#include <fcntl.h>
@@ -16831,15 +17009,18 @@ _ACEOF
if ac_fn_c_try_run "$LINENO"
then :
ac_cv_func_chown_works=yes
-else $as_nop
- ac_cv_func_chown_works=no
+else case e in #(
+ e) ac_cv_func_chown_works=no ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
rm -f conftest.chown
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_chown_works" >&5
printf "%s\n" "$ac_cv_func_chown_works" >&6; }
@@ -16872,19 +17053,19 @@ printf %s "checking for working fork... " >&6; }
if test ${ac_cv_func_fork_works+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test "$cross_compiling" = yes
+else case e in #(
+ e) if test "$cross_compiling" = yes
then :
ac_cv_func_fork_works=cross
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
int
main (void)
{
- /* By Ruediger Kuhlmann. */
+ /* By R. Kuhlmann. */
return fork () < 0;
;
@@ -16894,13 +17075,16 @@ _ACEOF
if ac_fn_c_try_run "$LINENO"
then :
ac_cv_func_fork_works=yes
-else $as_nop
- ac_cv_func_fork_works=no
+else case e in #(
+ e) ac_cv_func_fork_works=no ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5
printf "%s\n" "$ac_cv_func_fork_works" >&6; }
@@ -16928,12 +17112,12 @@ printf %s "checking for working vfork... " >&6; }
if test ${ac_cv_func_vfork_works+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test "$cross_compiling" = yes
+else case e in #(
+ e) if test "$cross_compiling" = yes
then :
ac_cv_func_vfork_works=cross
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Thanks to Paul Eggert for this test. */
$ac_includes_default
@@ -17044,13 +17228,16 @@ _ACEOF
if ac_fn_c_try_run "$LINENO"
then :
ac_cv_func_vfork_works=yes
-else $as_nop
- ac_cv_func_vfork_works=no
+else case e in #(
+ e) ac_cv_func_vfork_works=no ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5
printf "%s\n" "$ac_cv_func_vfork_works" >&6; }
@@ -17080,74 +17267,99 @@ fi
printf "%s\n" "#define RETSIGTYPE void" >>confdefs.h
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
-printf %s "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
-if test ${ac_cv_sys_largefile_source+y}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for declarations of fseeko and ftello" >&5
+printf %s "checking for declarations of fseeko and ftello... " >&6; }
+if test ${ac_cv_func_fseeko_ftello+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- while :; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+
+#if defined __hpux && !defined _LARGEFILE_SOURCE
+# include <limits.h>
+# if LONG_MAX >> 31 == 0
+# error "32-bit HP-UX 11/ia64 needs _LARGEFILE_SOURCE for fseeko in C++"
+# endif
+#endif
#include <sys/types.h> /* for off_t */
- #include <stdio.h>
+#include <stdio.h>
+
int
main (void)
{
-int (*fp) (FILE *, off_t, int) = fseeko;
- return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+
+ int (*fp1) (FILE *, off_t, int) = fseeko;
+ off_t (*fp2) (FILE *) = ftello;
+ return fseeko (stdin, 0, 0)
+ && fp1 (stdin, 0, 0)
+ && ftello (stdin) >= 0
+ && fp2 (stdin) >= 0;
+
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"
+if ac_fn_c_try_compile "$LINENO"
then :
- ac_cv_sys_largefile_source=no; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ ac_cv_func_fseeko_ftello=yes
+else case e in #(
+ e) ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -D_LARGEFILE_SOURCE=1"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#define _LARGEFILE_SOURCE 1
+
+#if defined __hpux && !defined _LARGEFILE_SOURCE
+# include <limits.h>
+# if LONG_MAX >> 31 == 0
+# error "32-bit HP-UX 11/ia64 needs _LARGEFILE_SOURCE for fseeko in C++"
+# endif
+#endif
#include <sys/types.h> /* for off_t */
- #include <stdio.h>
+#include <stdio.h>
+
int
main (void)
{
-int (*fp) (FILE *, off_t, int) = fseeko;
- return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+
+ int (*fp1) (FILE *, off_t, int) = fseeko;
+ off_t (*fp2) (FILE *) = ftello;
+ return fseeko (stdin, 0, 0)
+ && fp1 (stdin, 0, 0)
+ && ftello (stdin) >= 0
+ && fp2 (stdin) >= 0;
+
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"
+if ac_fn_c_try_compile "$LINENO"
then :
- ac_cv_sys_largefile_source=1; break
+ ac_cv_func_fseeko_ftello="need _LARGEFILE_SOURCE"
+else case e in #(
+ e) ac_cv_func_fseeko_ftello=no ;;
+esac
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam \
- conftest$ac_exeext conftest.$ac_ext
- ac_cv_sys_largefile_source=unknown
- break
-done
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
-printf "%s\n" "$ac_cv_sys_largefile_source" >&6; }
-case $ac_cv_sys_largefile_source in #(
- no | unknown) ;;
- *)
-printf "%s\n" "#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source" >>confdefs.h
-;;
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
esac
-rm -rf conftest*
-
-# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
-# in glibc 2.1.3, but that breaks too many other things.
-# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
-if test $ac_cv_sys_largefile_source != unknown; then
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fseeko_ftello" >&5
+printf "%s\n" "$ac_cv_func_fseeko_ftello" >&6; }
+if test "$ac_cv_func_fseeko_ftello" != no
+then :
printf "%s\n" "#define HAVE_FSEEKO 1" >>confdefs.h
fi
+if test "$ac_cv_func_fseeko_ftello" = "need _LARGEFILE_SOURCE"
+then :
+
+printf "%s\n" "#define _LARGEFILE_SOURCE 1" >>confdefs.h
+
+fi
# Check whether --enable-largefile was given.
@@ -17155,31 +17367,34 @@ if test ${enable_largefile+y}
then :
enableval=$enable_largefile;
fi
-
-if test "$enable_largefile" != no; then
-
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
-printf %s "checking for special C compiler options needed for large files... " >&6; }
-if test ${ac_cv_sys_largefile_CC+y}
+if test "$enable_largefile,$enable_year2038" != no,no
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable large file support" >&5
+printf %s "checking for $CC option to enable large file support... " >&6; }
+if test ${ac_cv_sys_largefile_opts+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_cv_sys_largefile_CC=no
- if test "$GCC" != yes; then
- ac_save_CC=$CC
- while :; do
- # IRIX 6.2 and later do not support large files by default,
- # so use the C compiler's -n32 option if that helps.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) ac_save_CC="$CC"
+ ac_opt_found=no
+ for ac_opt in "none needed" "-D_FILE_OFFSET_BITS=64" "-D_LARGE_FILES=1" "-n32"; do
+ if test x"$ac_opt" != x"none needed"
+then :
+ CC="$ac_save_CC $ac_opt"
+fi
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
+#ifndef FTYPE
+# define FTYPE off_t
+#endif
+ /* Check that FTYPE can represent 2**63 - 1 correctly.
+ We can't simply define LARGE_FTYPE to be 9223372036854775807,
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
+#define LARGE_FTYPE (((FTYPE) 1 << 31 << 31) - 1 + ((FTYPE) 1 << 31 << 31))
+ int FTYPE_is_large[(LARGE_FTYPE % 2147483629 == 721
+ && LARGE_FTYPE % 2147483647 == 1)
? 1 : -1];
int
main (void)
@@ -17189,142 +17404,88 @@ main (void)
return 0;
}
_ACEOF
- if ac_fn_c_try_compile "$LINENO"
+if ac_fn_c_try_compile "$LINENO"
then :
- break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam
- CC="$CC -n32"
+ if test x"$ac_opt" = x"none needed"
+then :
+ # GNU/Linux s390x and alpha need _FILE_OFFSET_BITS=64 for wide ino_t.
+ CC="$CC -DFTYPE=ino_t"
if ac_fn_c_try_compile "$LINENO"
then :
- ac_cv_sys_largefile_CC=' -n32'; break
+
+else case e in #(
+ e) CC="$CC -D_FILE_OFFSET_BITS=64"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_opt='-D_FILE_OFFSET_BITS=64'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam
- break
- done
- CC=$ac_save_CC
- rm -f conftest.$ac_ext
- fi
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
-printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; }
- if test "$ac_cv_sys_largefile_CC" != no; then
- CC=$CC$ac_cv_sys_largefile_CC
- fi
-
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
-printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
-if test ${ac_cv_sys_file_offset_bits+y}
-then :
- printf %s "(cached) " >&6
-else $as_nop
- while :; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-int
-main (void)
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"
-then :
- ac_cv_sys_file_offset_bits=no; break
+ ac_cv_sys_largefile_opts=$ac_opt
+ ac_opt_found=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#define _FILE_OFFSET_BITS 64
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-int
-main (void)
-{
+ test $ac_opt_found = no || break
+ done
+ CC="$ac_save_CC"
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"
-then :
- ac_cv_sys_file_offset_bits=64; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- ac_cv_sys_file_offset_bits=unknown
- break
-done
+ test $ac_opt_found = yes || ac_cv_sys_largefile_opts="support not detected" ;;
+esac
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
-printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; }
-case $ac_cv_sys_file_offset_bits in #(
- no | unknown) ;;
- *)
-printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h
-;;
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_opts" >&5
+printf "%s\n" "$ac_cv_sys_largefile_opts" >&6; }
+
+ac_have_largefile=yes
+case $ac_cv_sys_largefile_opts in #(
+ "none needed") :
+ ;; #(
+ "supported through gnulib") :
+ ;; #(
+ "support not detected") :
+ ac_have_largefile=no ;; #(
+ "-D_FILE_OFFSET_BITS=64") :
+
+printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h
+ ;; #(
+ "-D_LARGE_FILES=1") :
+
+printf "%s\n" "#define _LARGE_FILES 1" >>confdefs.h
+ ;; #(
+ "-n32") :
+ CC="$CC -n32" ;; #(
+ *) :
+ as_fn_error $? "internal error: bad value for \$ac_cv_sys_largefile_opts" "$LINENO" 5 ;;
esac
-rm -rf conftest*
- if test $ac_cv_sys_file_offset_bits = unknown; then
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
-printf %s "checking for _LARGE_FILES value needed for large files... " >&6; }
-if test ${ac_cv_sys_large_files+y}
+
+if test "$enable_year2038" != no
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option for timestamps after 2038" >&5
+printf %s "checking for $CC option for timestamps after 2038... " >&6; }
+if test ${ac_cv_sys_year2038_opts+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- while :; do
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-int
-main (void)
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"
+else case e in #(
+ e) ac_save_CPPFLAGS="$CPPFLAGS"
+ ac_opt_found=no
+ for ac_opt in "none needed" "-D_TIME_BITS=64" "-D__MINGW_USE_VC2005_COMPAT" "-U_USE_32_BIT_TIME_T -D__MINGW_USE_VC2005_COMPAT"; do
+ if test x"$ac_opt" != x"none needed"
then :
- ac_cv_sys_large_files=no; break
+ CPPFLAGS="$ac_save_CPPFLAGS $ac_opt"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#define _LARGE_FILES 1
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
+
+ #include <time.h>
+ /* Check that time_t can represent 2**32 - 1 correctly. */
+ #define LARGE_TIME_T \\
+ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30)))
+ int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535
+ && LARGE_TIME_T % 65537 == 0)
+ ? 1 : -1];
+
int
main (void)
{
@@ -17335,25 +17496,47 @@ main (void)
_ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
- ac_cv_sys_large_files=1; break
+ ac_cv_sys_year2038_opts="$ac_opt"
+ ac_opt_found=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- ac_cv_sys_large_files=unknown
- break
-done
+ test $ac_opt_found = no || break
+ done
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ test $ac_opt_found = yes || ac_cv_sys_year2038_opts="support not detected" ;;
+esac
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
-printf "%s\n" "$ac_cv_sys_large_files" >&6; }
-case $ac_cv_sys_large_files in #(
- no | unknown) ;;
- *)
-printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h
-;;
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_year2038_opts" >&5
+printf "%s\n" "$ac_cv_sys_year2038_opts" >&6; }
+
+ac_have_year2038=yes
+case $ac_cv_sys_year2038_opts in #(
+ "none needed") :
+ ;; #(
+ "support not detected") :
+ ac_have_year2038=no ;; #(
+ "-D_TIME_BITS=64") :
+
+printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h
+ ;; #(
+ "-D__MINGW_USE_VC2005_COMPAT") :
+
+printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h
+ ;; #(
+ "-U_USE_32_BIT_TIME_T"*) :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
+as_fn_error $? "the 'time_t' type is currently forced to be 32-bit. It
+will stop working after mid-January 2038. Remove
+_USE_32BIT_TIME_T from the compiler flags.
+See 'config.log' for more details" "$LINENO" 5; } ;; #(
+ *) :
+ as_fn_error $? "internal error: bad value for \$ac_cv_sys_year2038_opts" "$LINENO" 5 ;;
esac
-rm -rf conftest*
- fi
+
fi
+fi
@@ -17363,8 +17546,8 @@ cache=_D_LARGEFILE_SOURCE_1
if eval test \${cv_prog_cc_flag_needed_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include <stdio.h>
int test(void) {
@@ -17390,7 +17573,8 @@ fi
fi
rm -f conftest conftest.c conftest.o
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then
@@ -17434,8 +17618,8 @@ then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: crosscompile(yes)" >&5
printf "%s\n" "crosscompile(yes)" >&6; }
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -17570,17 +17754,19 @@ then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
printf "%s\n" "#define NONBLOCKING_IS_BROKEN 1" >>confdefs.h
-
+ ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
fi
@@ -17618,10 +17804,11 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define MKDIR_HAS_ONE_ARG 1" >>confdefs.h
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -17639,8 +17826,8 @@ if test c${cross_compiling} = cno; then
if test "$cross_compiling" = yes
then :
eval "ac_cv_c_strptime_works=maybe"
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#define _XOPEN_SOURCE 600
@@ -17655,11 +17842,13 @@ _ACEOF
if ac_fn_c_try_run "$LINENO"
then :
eval "ac_cv_c_strptime_works=yes"
-else $as_nop
- eval "ac_cv_c_strptime_works=no"
+else case e in #(
+ e) eval "ac_cv_c_strptime_works=no" ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
else
@@ -17680,13 +17869,14 @@ printf "%s\n" "#define STRPTIME_WORKS 1" >>confdefs.h
fi
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" strptime.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS strptime.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
done
@@ -17713,8 +17903,9 @@ fi
if test ${enable_systemd+y}
then :
enableval=$enable_systemd;
-else $as_nop
- enable_systemd=no
+else case e in #(
+ e) enable_systemd=no ;;
+esac
fi
have_systemd=no
@@ -17795,8 +17986,8 @@ See the pkg-config man page for more details." "$LINENO" 5
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
@@ -17806,7 +17997,7 @@ and SYSTEMD_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
else
SYSTEMD_CFLAGS=$pkg_cv_SYSTEMD_CFLAGS
SYSTEMD_LIBS=$pkg_cv_SYSTEMD_LIBS
@@ -17890,8 +18081,8 @@ See the pkg-config man page for more details." "$LINENO" 5
elif test $pkg_failed = untried; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
@@ -17901,7 +18092,7 @@ and SYSTEMD_DAEMON_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
else
SYSTEMD_DAEMON_CFLAGS=$pkg_cv_SYSTEMD_DAEMON_CFLAGS
SYSTEMD_DAEMON_LIBS=$pkg_cv_SYSTEMD_DAEMON_LIBS
@@ -17998,8 +18189,8 @@ esac
printf "%s\n" "#define malloc rpl_malloc_unbound" >>confdefs.h
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#if defined STDC_HEADERS || defined HAVE_STDLIB_H
#include <stdlib.h>
@@ -18029,15 +18220,17 @@ esac
printf "%s\n" "#define malloc rpl_malloc_unbound" >>confdefs.h
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_MALLOC 1" >>confdefs.h
-
+ ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
@@ -18082,10 +18275,11 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_WINDOWS_THREADS 1" >>confdefs.h
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -18101,12 +18295,286 @@ else
if test ${with_pthreads+y}
then :
withval=$with_pthreads;
-else $as_nop
- withval="yes"
+else case e in #(
+ e) withval="yes" ;;
+esac
fi
ub_have_pthreads=no
if test x_$withval != x_no; then
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else case e in #(
+ e) # Broken: fails on valid input.
+continue ;;
+esac
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else case e in #(
+ e) # Passes both tests.
+ac_preproc_ok=:
+break ;;
+esac
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+ ;;
+esac
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else case e in #(
+ e) # Broken: fails on valid input.
+continue ;;
+esac
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else case e in #(
+ e) # Passes both tests.
+ac_preproc_ok=:
+break ;;
+esac
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else case e in #(
+ e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See 'config.log' for more details" "$LINENO" 5; } ;;
+esac
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5
+printf %s "checking for egrep -e... " >&6; }
+if test ${ac_cv_path_EGREP_TRADITIONAL+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) if test -z "$EGREP_TRADITIONAL"; then
+ ac_path_EGREP_TRADITIONAL_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue
+# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found.
+ # Check for GNU $ac_path_EGREP_TRADITIONAL
+case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #(
+*GNU*)
+ ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;;
+#(
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl"
+ "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL"
+ ac_path_EGREP_TRADITIONAL_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_TRADITIONAL_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then
+ :
+ fi
+else
+ ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL
+fi
+
+ if test "$ac_cv_path_EGREP_TRADITIONAL"
+then :
+ ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E"
+else case e in #(
+ e) if test -z "$EGREP_TRADITIONAL"; then
+ ac_path_EGREP_TRADITIONAL_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue
+# Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found.
+ # Check for GNU $ac_path_EGREP_TRADITIONAL
+case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #(
+*GNU*)
+ ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;;
+#(
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl"
+ "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL"
+ ac_path_EGREP_TRADITIONAL_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_TRADITIONAL_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL
+fi
+ ;;
+esac
+fi ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5
+printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; }
+ EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL
+
@@ -18147,8 +18615,14 @@ printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS...
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char pthread_join ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_join (void);
int
main (void)
{
@@ -18242,7 +18716,7 @@ case $host_os in
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1
+ $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5
printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;}
@@ -18272,8 +18746,8 @@ printf %s "checking whether $CC is Clang... " >&6; }
if test ${ax_cv_PTHREAD_CLANG+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ax_cv_PTHREAD_CLANG=no
+else case e in #(
+ e) ax_cv_PTHREAD_CLANG=no
# Note that Autoconf sets GCC=yes for Clang as well as GCC
if test "x$GCC" = "xyes"; then
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -18285,14 +18759,15 @@ else $as_nop
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1
+ $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1
then :
ax_cv_PTHREAD_CLANG=yes
fi
rm -rf conftest*
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5
printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; }
@@ -18342,8 +18817,9 @@ esac
if test "x$ax_pthread_check_macro" = "x--"
then :
ax_pthread_check_cond=0
-else $as_nop
- ax_pthread_check_cond="!defined($ax_pthread_check_macro)"
+else case e in #(
+ e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;;
+esac
fi
@@ -18377,8 +18853,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ax_pthread_config+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ax_pthread_config"; then
+else case e in #(
+ e) if test -n "$ax_pthread_config"; then
ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -18401,7 +18877,8 @@ done
IFS=$as_save_IFS
test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
-fi
+fi ;;
+esac
fi
ax_pthread_config=$ac_cv_prog_ax_pthread_config
if test -n "$ax_pthread_config"; then
@@ -18534,8 +19011,8 @@ printf %s "checking whether Clang needs flag to prevent \"argument unused\" warn
if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+else case e in #(
+ e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
# Create an alternate version of $ac_link that compiles and
# links in two steps (.c -> .o, .o -> exe) instead of one
# (.c -> exe), because the warning occurs only in the second
@@ -18581,7 +19058,8 @@ then :
ax_pthread_try=no
fi
ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5
printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; }
@@ -18608,8 +19086,8 @@ printf %s "checking for joinable pthread attribute... " >&6; }
if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+else case e in #(
+ e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown
for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -18629,7 +19107,8 @@ fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
done
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5
printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; }
@@ -18649,14 +19128,15 @@ printf %s "checking whether more special flags are required for pthreads... " >&
if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ax_cv_PTHREAD_SPECIAL_FLAGS=no
+else case e in #(
+ e) ax_cv_PTHREAD_SPECIAL_FLAGS=no
case $host_os in
solaris*)
ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
;;
esac
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5
printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; }
@@ -18672,8 +19152,8 @@ printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; }
if test ${ax_cv_PTHREAD_PRIO_INHERIT+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
@@ -18688,12 +19168,14 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ax_cv_PTHREAD_PRIO_INHERIT=yes
-else $as_nop
- ax_cv_PTHREAD_PRIO_INHERIT=no
+else case e in #(
+ e) ax_cv_PTHREAD_PRIO_INHERIT=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
@@ -18743,8 +19225,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_PTHREAD_CC+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$PTHREAD_CC"; then
+else case e in #(
+ e) if test -n "$PTHREAD_CC"; then
ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -18766,7 +19248,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
if test -n "$PTHREAD_CC"; then
@@ -18793,8 +19276,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_PTHREAD_CXX+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$PTHREAD_CXX"; then
+else case e in #(
+ e) if test -n "$PTHREAD_CXX"; then
ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -18816,7 +19299,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX
if test -n "$PTHREAD_CXX"; then
@@ -18886,28 +19370,30 @@ fi
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5
printf %s "checking size of unsigned long... " >&6; }
if test ${ac_cv_sizeof_unsigned_long+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"
+else case e in #(
+ e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"
then :
-else $as_nop
- if test "$ac_cv_type_unsigned_long" = yes; then
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+else case e in #(
+ e) if test "$ac_cv_type_unsigned_long" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (unsigned long)
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
else
ac_cv_sizeof_unsigned_long=0
- fi
+ fi ;;
+esac
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5
printf "%s\n" "$ac_cv_sizeof_unsigned_long" >&6; }
@@ -18919,28 +19405,30 @@ printf "%s\n" "#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long" >>confd
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of pthread_t" >&5
printf %s "checking size of pthread_t... " >&6; }
if test ${ac_cv_sizeof_pthread_t+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))" "ac_cv_sizeof_pthread_t" "$ac_includes_default"
+else case e in #(
+ e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))" "ac_cv_sizeof_pthread_t" "$ac_includes_default"
then :
-else $as_nop
- if test "$ac_cv_type_pthread_t" = yes; then
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+else case e in #(
+ e) if test "$ac_cv_type_pthread_t" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (pthread_t)
-See \`config.log' for more details" "$LINENO" 5; }
+See 'config.log' for more details" "$LINENO" 5; }
else
ac_cv_sizeof_pthread_t=0
- fi
+ fi ;;
+esac
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_pthread_t" >&5
printf "%s\n" "$ac_cv_sizeof_pthread_t" >&6; }
@@ -19008,8 +19496,9 @@ fi
if test ${with_solaris_threads+y}
then :
withval=$with_solaris_threads;
-else $as_nop
- withval="no"
+else case e in #(
+ e) withval="no" ;;
+esac
fi
ub_have_sol_threads=no
@@ -19023,15 +19512,21 @@ printf %s "checking for library containing thr_create... " >&6; }
if test ${ac_cv_search_thr_create+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char thr_create ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char thr_create (void);
int
main (void)
{
@@ -19062,11 +19557,13 @@ done
if test ${ac_cv_search_thr_create+y}
then :
-else $as_nop
- ac_cv_search_thr_create=no
+else case e in #(
+ e) ac_cv_search_thr_create=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_thr_create" >&5
printf "%s\n" "$ac_cv_search_thr_create" >&6; }
@@ -19087,8 +19584,8 @@ cache=`echo mt | sed 'y%.=/+-%___p_%'`
if eval test \${cv_prog_cc_flag_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo 'void f(void){}' >conftest.c
if test -z "`$CC $CPPFLAGS $CFLAGS -mt -c conftest.c 2>&1`"; then
eval "cv_prog_cc_flag_$cache=yes"
@@ -19096,7 +19593,8 @@ else
eval "cv_prog_cc_flag_$cache=no"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then
@@ -19113,10 +19611,11 @@ fi
ub_have_sol_threads=yes
-else $as_nop
-
+else case e in #(
+ e)
as_fn_error $? "no solaris threads found." "$LINENO" 5
-
+ ;;
+esac
fi
fi
@@ -19149,8 +19648,9 @@ printf "%s\n" "#define UB_SYSLOG_FACILITY ${UNBOUND_SYSLOG_FACILITY}" >>confdefs
if test ${with_dynlibmodule+y}
then :
withval=$with_dynlibmodule;
-else $as_nop
- withval="no"
+else case e in #(
+ e) withval="no" ;;
+esac
fi
@@ -19173,15 +19673,21 @@ printf %s "checking for library containing dlopen... " >&6; }
if test ${ac_cv_search_dlopen+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char dlopen ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen (void);
int
main (void)
{
@@ -19212,11 +19718,13 @@ done
if test ${ac_cv_search_dlopen+y}
then :
-else $as_nop
- ac_cv_search_dlopen=no
+else case e in #(
+ e) ac_cv_search_dlopen=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5
printf "%s\n" "$ac_cv_search_dlopen" >&6; }
@@ -19240,8 +19748,9 @@ fi
if test ${with_pyunbound+y}
then :
withval=$with_pyunbound;
-else $as_nop
- withval="no"
+else case e in #(
+ e) withval="no" ;;
+esac
fi
@@ -19258,8 +19767,9 @@ fi
if test ${with_pythonmodule+y}
then :
withval=$with_pythonmodule;
-else $as_nop
- withval="no"
+else case e in #(
+ e) withval="no" ;;
+esac
fi
@@ -19287,8 +19797,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_PYTHON+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $PYTHON in
+else case e in #(
+ e) case $PYTHON in
[\\/]* | ?:[\\/]*)
ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
;;
@@ -19313,6 +19823,7 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
PYTHON=$ac_cv_path_PYTHON
@@ -19490,8 +20001,9 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
pythonexists=yes
-else $as_nop
- pythonexists=no
+else case e in #(
+ e) pythonexists=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -19601,8 +20113,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_SWIG+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $SWIG in
+else case e in #(
+ e) case $SWIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path.
;;
@@ -19627,6 +20139,7 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
SWIG=$ac_cv_path_SWIG
@@ -19727,8 +20240,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_SWIG+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $SWIG in
+else case e in #(
+ e) case $SWIG in
[\\/]* | ?:[\\/]*)
ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path.
;;
@@ -19753,6 +20266,7 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
SWIG=$ac_cv_path_SWIG
@@ -19914,15 +20428,17 @@ ax_date_fmt="%Y%m%d"
if test x"$SOURCE_DATE_EPOCH" = x
then :
CONFIG_DATE=`date "+$ax_date_fmt"`
-else $as_nop
- ax_build_date=`date -u -d "@$SOURCE_DATE_EPOCH" "+$ax_date_fmt" 2>/dev/null \
+else case e in #(
+ e) ax_build_date=`date -u -d "@$SOURCE_DATE_EPOCH" "+$ax_date_fmt" 2>/dev/null \
|| date -u -r "$SOURCE_DATE_EPOCH" "+$ax_date_fmt" 2>/dev/null`
if test x"$ax_build_date" = x
then :
as_fn_error $? "malformed SOURCE_DATE_EPOCH" "$LINENO" 5
-else $as_nop
- CONFIG_DATE=$ax_build_date
-fi
+else case e in #(
+ e) CONFIG_DATE=$ax_build_date ;;
+esac
+fi ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CONFIG_DATE" >&5
printf "%s\n" "$CONFIG_DATE" >&6; }
@@ -20017,10 +20533,11 @@ if test ${with_ssl+y}
then :
withval=$with_ssl;
-else $as_nop
-
+else case e in #(
+ e)
withval="yes"
-
+ ;;
+esac
fi
if test x_$withval = x_no; then
@@ -20116,8 +20633,8 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_EVP_SHA256 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
# check if -lwsock32 or -lgdi32 are needed.
@@ -20150,8 +20667,8 @@ printf "%s\n" "#define HAVE_EVP_SHA256 1" >>confdefs.h
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
LIBS="$BAKLIBS"
@@ -20184,8 +20701,8 @@ printf "%s\n" "#define HAVE_EVP_SHA256 1" >>confdefs.h
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
LIBS="$BAKLIBS"
@@ -20218,8 +20735,8 @@ printf "%s\n" "#define HAVE_EVP_SHA256 1" >>confdefs.h
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
LIBS="$BAKLIBS"
@@ -20252,8 +20769,8 @@ printf "%s\n" "#define HAVE_EVP_SHA256 1" >>confdefs.h
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
LIBS="$BAKLIBS"
@@ -20285,32 +20802,38 @@ printf "%s\n" "#define HAVE_EVP_SHA256 1" >>confdefs.h
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
as_fn_error $? "OpenSSL found in $ssldir, but version 0.9.7 or higher is required" "$LINENO" 5
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -20355,8 +20878,14 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char SSL_CTX_new ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SSL_CTX_new (void);
int
main (void)
{
@@ -20372,8 +20901,8 @@ then :
printf "%s\n" "no" >&6; }
LIBS="$BAKLIBS"
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
LIBS="$BAKLIBS"
@@ -20382,15 +20911,21 @@ printf %s "checking for library containing dlopen... " >&6; }
if test ${ac_cv_search_dlopen+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char dlopen ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen (void);
int
main (void)
{
@@ -20421,11 +20956,13 @@ done
if test ${ac_cv_search_dlopen+y}
then :
-else $as_nop
- ac_cv_search_dlopen=no
+else case e in #(
+ e) ac_cv_search_dlopen=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5
printf "%s\n" "$ac_cv_search_dlopen" >&6; }
@@ -20436,7 +20973,8 @@ then :
fi
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -20471,13 +21009,14 @@ then :
printf "%s\n" "no" >&6; }
LIBS="$BAKLIBS"
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
LIBS="$BAKLIBS"
LIBS="$LIBS -lcrypt32"
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -20497,8 +21036,8 @@ printf %s "checking for $CC options needed to detect all undeclared functions...
if test ${ac_cv_c_undeclared_builtin_options+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_save_CFLAGS=$CFLAGS
+else case e in #(
+ e) ac_save_CFLAGS=$CFLAGS
ac_cv_c_undeclared_builtin_options='cannot detect'
for ac_arg in '' -fno-builtin; do
CFLAGS="$ac_save_CFLAGS $ac_arg"
@@ -20517,8 +21056,8 @@ _ACEOF
if ac_fn_c_try_compile "$LINENO"
then :
-else $as_nop
- # This test program should compile successfully.
+else case e in #(
+ e) # This test program should compile successfully.
# No library function is consistently available on
# freestanding implementations, so test against a dummy
# declaration. Include always-available headers on the
@@ -20546,26 +21085,29 @@ then :
if test x"$ac_arg" = x
then :
ac_cv_c_undeclared_builtin_options='none needed'
-else $as_nop
- ac_cv_c_undeclared_builtin_options=$ac_arg
+else case e in #(
+ e) ac_cv_c_undeclared_builtin_options=$ac_arg ;;
+esac
fi
break
fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
CFLAGS=$ac_save_CFLAGS
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5
printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; }
case $ac_cv_c_undeclared_builtin_options in #(
'cannot detect') :
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
as_fn_error $? "cannot make $CC report undeclared builtins
-See \`config.log' for more details" "$LINENO" 5; } ;; #(
+See 'config.log' for more details" "$LINENO" 5; } ;; #(
'none needed') :
ac_c_undeclared_builtin_options='' ;; #(
*) :
@@ -20576,32 +21118,36 @@ ac_fn_check_decl "$LINENO" "strlcpy" "ac_cv_have_decl_strlcpy" "$ac_includes_def
if test "x$ac_cv_have_decl_strlcpy" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_STRLCPY $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "strlcat" "ac_cv_have_decl_strlcat" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_strlcat" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_STRLCAT $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "arc4random" "ac_cv_have_decl_arc4random" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_arc4random" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_ARC4RANDOM $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "arc4random_uniform" "ac_cv_have_decl_arc4random_uniform" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
if test "x$ac_cv_have_decl_arc4random_uniform" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_ARC4RANDOM_UNIFORM $ac_have_decl" >>confdefs.h
@@ -20920,8 +21466,9 @@ $ac_includes_default
if test "x$ac_cv_have_decl_SSL_COMP_get_compression_methods" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_SSL_COMP_GET_COMPRESSION_METHODS $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "sk_SSL_COMP_pop_free" "ac_cv_have_decl_sk_SSL_COMP_pop_free" "
@@ -20948,8 +21495,9 @@ $ac_includes_default
if test "x$ac_cv_have_decl_sk_SSL_COMP_pop_free" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_SK_SSL_COMP_POP_FREE $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "SSL_CTX_set_ecdh_auto" "ac_cv_have_decl_SSL_CTX_set_ecdh_auto" "
@@ -20976,8 +21524,9 @@ $ac_includes_default
if test "x$ac_cv_have_decl_SSL_CTX_set_ecdh_auto" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_SSL_CTX_SET_ECDH_AUTO $ac_have_decl" >>confdefs.h
@@ -21027,14 +21576,15 @@ then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: int" >&5
printf "%s\n" "int" >&6; }
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: void" >&5
printf "%s\n" "void" >&6; }
printf "%s\n" "#define HMAC_INIT_EX_RETURNS_VOID 1" >>confdefs.h
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
@@ -21065,21 +21615,27 @@ fi
if test "x$ac_cv_header_bsd_string_h" = xyes -a "x$ac_cv_header_bsd_stdlib_h" = xyes; then
for func in strlcpy strlcat arc4random arc4random_uniform reallocarray; do
- as_ac_Search=`printf "%s\n" "ac_cv_search_$func" | $as_tr_sh`
+ as_ac_Search=`printf "%s\n" "ac_cv_search_$func" | sed "$as_sed_sh"`
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing $func" >&5
printf %s "checking for library containing $func... " >&6; }
if eval test \${$as_ac_Search+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char $func ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $func (void);
int
main (void)
{
@@ -21110,11 +21666,13 @@ done
if eval test \${$as_ac_Search+y}
then :
-else $as_nop
- eval "$as_ac_Search=no"
+else case e in #(
+ e) eval "$as_ac_Search=no" ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
eval ac_res=\$$as_ac_Search
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
@@ -21209,16 +21767,18 @@ case "$enable_gost" in
if test "x$ac_cv_func_EVP_PKEY_set_type_str" = xyes
then :
:
-else $as_nop
- as_fn_error $? "OpenSSL 1.0.0 is needed for GOST support" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "OpenSSL 1.0.0 is needed for GOST support" "$LINENO" 5 ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "EC_KEY_new" "ac_cv_func_EC_KEY_new"
if test "x$ac_cv_func_EC_KEY_new" = xyes
then :
-else $as_nop
- as_fn_error $? "OpenSSL does not support ECC, needed for GOST support" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "OpenSSL does not support ECC, needed for GOST support" "$LINENO" 5 ;;
+esac
fi
@@ -21232,8 +21792,8 @@ fi
if test "$cross_compiling" = yes
then :
eval "ac_cv_c_gost_works=maybe"
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <string.h>
@@ -21321,11 +21881,13 @@ _ACEOF
if ac_fn_c_try_run "$LINENO"
then :
eval "ac_cv_c_gost_works=yes"
-else $as_nop
- eval "ac_cv_c_gost_works=no"
+else case e in #(
+ e) eval "ac_cv_c_gost_works=no" ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
CFLAGS="$BAKCFLAGS"
@@ -21371,26 +21933,29 @@ then :
fi
-else $as_nop
-
+else case e in #(
+ e)
# without EVP_PKEY_fromdata, older openssl, check for support
ac_fn_c_check_func "$LINENO" "ECDSA_sign" "ac_cv_func_ECDSA_sign"
if test "x$ac_cv_func_ECDSA_sign" = xyes
then :
-else $as_nop
- as_fn_error $? "OpenSSL does not support ECDSA: please upgrade or rerun with --disable-ecdsa" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "OpenSSL does not support ECDSA: please upgrade or rerun with --disable-ecdsa" "$LINENO" 5 ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "SHA384_Init" "ac_cv_func_SHA384_Init"
if test "x$ac_cv_func_SHA384_Init" = xyes
then :
-else $as_nop
- as_fn_error $? "OpenSSL does not support SHA384: please upgrade or rerun with --disable-ecdsa" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "OpenSSL does not support SHA384: please upgrade or rerun with --disable-ecdsa" "$LINENO" 5 ;;
+esac
fi
-
+ ;;
+esac
fi
ac_fn_check_decl "$LINENO" "NID_X9_62_prime256v1" "ac_cv_have_decl_NID_X9_62_prime256v1" "$ac_includes_default
@@ -21400,15 +21965,17 @@ fi
if test "x$ac_cv_have_decl_NID_X9_62_prime256v1" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_NID_X9_62_PRIME256V1 $ac_have_decl" >>confdefs.h
if test $ac_have_decl = 1
then :
-else $as_nop
- as_fn_error $? "OpenSSL does not support the ECDSA curves: please upgrade or rerun with --disable-ecdsa" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "OpenSSL does not support the ECDSA curves: please upgrade or rerun with --disable-ecdsa" "$LINENO" 5 ;;
+esac
fi
ac_fn_check_decl "$LINENO" "NID_secp384r1" "ac_cv_have_decl_NID_secp384r1" "$ac_includes_default
#include <openssl/evp.h>
@@ -21417,15 +21984,17 @@ ac_fn_check_decl "$LINENO" "NID_secp384r1" "ac_cv_have_decl_NID_secp384r1" "$ac_
if test "x$ac_cv_have_decl_NID_secp384r1" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_NID_SECP384R1 $ac_have_decl" >>confdefs.h
if test $ac_have_decl = 1
then :
-else $as_nop
- as_fn_error $? "OpenSSL does not support the ECDSA curves: please upgrade or rerun with --disable-ecdsa" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "OpenSSL does not support the ECDSA curves: please upgrade or rerun with --disable-ecdsa" "$LINENO" 5 ;;
+esac
fi
# see if OPENSSL 1.0.0 or later (has EVP MD and Verify independency)
@@ -21471,7 +22040,7 @@ case "$enable_dsa" in
if test "x$ac_cv_func_DSA_SIG_new" = xyes
then :
- as_ac_Type=`printf "%s\n" "ac_cv_type_DSA_SIG*" | $as_tr_sh`
+ as_ac_Type=`printf "%s\n" "ac_cv_type_DSA_SIG*" | sed "$as_sed_sh"`
ac_fn_c_check_type "$LINENO" "DSA_SIG*" "$as_ac_Type" "
$ac_includes_default
#ifdef HAVE_OPENSSL_ERR_H
@@ -21498,15 +22067,17 @@ then :
printf "%s\n" "#define USE_DSA 1" >>confdefs.h
-else $as_nop
- if test "x$enable_dsa" = "xyes"; then as_fn_error $? "OpenSSL does not support DSA and you used --enable-dsa." "$LINENO" 5
- fi
+else case e in #(
+ e) if test "x$enable_dsa" = "xyes"; then as_fn_error $? "OpenSSL does not support DSA and you used --enable-dsa." "$LINENO" 5
+ fi ;;
+esac
fi
-else $as_nop
- if test "x$enable_dsa" = "xyes"; then as_fn_error $? "OpenSSL does not support DSA and you used --enable-dsa." "$LINENO" 5
- fi
+else case e in #(
+ e) if test "x$enable_dsa" = "xyes"; then as_fn_error $? "OpenSSL does not support DSA and you used --enable-dsa." "$LINENO" 5
+ fi ;;
+esac
fi
else
@@ -21553,8 +22124,9 @@ case "$enable_ed25519" in
if test "x$ac_cv_have_decl_NID_ED25519" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_NID_ED25519 $ac_have_decl" >>confdefs.h
if test $ac_have_decl = 1
@@ -21562,9 +22134,10 @@ then :
use_ed25519="yes"
-else $as_nop
- if test "x$enable_ed25519" = "xyes"; then as_fn_error $? "OpenSSL does not support ED25519 and you used --enable-ed25519." "$LINENO" 5
- fi
+else case e in #(
+ e) if test "x$enable_ed25519" = "xyes"; then as_fn_error $? "OpenSSL does not support ED25519 and you used --enable-ed25519." "$LINENO" 5
+ fi ;;
+esac
fi
fi
@@ -21608,8 +22181,9 @@ case "$enable_ed448" in
if test "x$ac_cv_have_decl_NID_ED448" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_NID_ED448 $ac_have_decl" >>confdefs.h
if test $ac_have_decl = 1
@@ -21617,9 +22191,10 @@ then :
use_ed448="yes"
-else $as_nop
- if test "x$enable_ed448" = "xyes"; then as_fn_error $? "OpenSSL does not support ED448 and you used --enable-ed448." "$LINENO" 5
- fi
+else case e in #(
+ e) if test "x$enable_ed448" = "xyes"; then as_fn_error $? "OpenSSL does not support ED448 and you used --enable-ed448." "$LINENO" 5
+ fi ;;
+esac
fi
fi
@@ -21665,8 +22240,9 @@ if test "x$ac_cv_have_decl_MSG_FASTOPEN" = xyes
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO" >&5
printf "%s\n" "$as_me: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO" >&2;}
-else $as_nop
- as_fn_error $? "TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client" "$LINENO" 5 ;;
+esac
fi
printf "%s\n" "#define USE_MSG_FASTOPEN 1" >>confdefs.h
@@ -21680,8 +22256,9 @@ if test "x$ac_cv_have_decl_CONNECT_RESUME_ON_READ_WRITE" = xyes
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO" >&5
printf "%s\n" "$as_me: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO" >&2;}
-else $as_nop
- as_fn_error $? "TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client" "$LINENO" 5 ;;
+esac
fi
printf "%s\n" "#define USE_OSX_MSG_FASTOPEN 1" >>confdefs.h
@@ -21709,8 +22286,9 @@ if test "x$ac_cv_have_decl_TCP_FASTOPEN" = xyes
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support server mode TFO" >&5
printf "%s\n" "$as_me: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support server mode TFO" >&2;}
-else $as_nop
- as_fn_error $? "TCP Fast Open is not available for server mode: please rerun without --enable-tfo-server" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "TCP Fast Open is not available for server mode: please rerun without --enable-tfo-server" "$LINENO" 5 ;;
+esac
fi
printf "%s\n" "#define USE_TCP_FASTOPEN 1" >>confdefs.h
@@ -21726,8 +22304,9 @@ esac
if test ${with_libevent+y}
then :
withval=$with_libevent;
-else $as_nop
- with_libevent="no"
+else case e in #(
+ e) with_libevent="no" ;;
+esac
fi
if test "x_$with_libevent" != x_no; then
@@ -21806,15 +22385,21 @@ printf %s "checking for library containing clock_gettime... " >&6; }
if test ${ac_cv_search_clock_gettime+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char clock_gettime ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char clock_gettime (void);
int
main (void)
{
@@ -21845,11 +22430,13 @@ done
if test ${ac_cv_search_clock_gettime+y}
then :
-else $as_nop
- ac_cv_search_clock_gettime=no
+else case e in #(
+ e) ac_cv_search_clock_gettime=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
printf "%s\n" "$ac_cv_search_clock_gettime" >&6; }
@@ -21882,15 +22469,21 @@ printf %s "checking for library containing event_set... " >&6; }
if test ${ac_cv_search_event_set+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char event_set ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char event_set (void);
int
main (void)
{
@@ -21921,11 +22514,13 @@ done
if test ${ac_cv_search_event_set+y}
then :
-else $as_nop
- ac_cv_search_event_set=no
+else case e in #(
+ e) ac_cv_search_event_set=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_event_set" >&5
printf "%s\n" "$ac_cv_search_event_set" >&6; }
@@ -21937,22 +22532,28 @@ then :
fi
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing event_set" >&5
printf %s "checking for library containing event_set... " >&6; }
if test ${ac_cv_search_event_set+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char event_set ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char event_set (void);
int
main (void)
{
@@ -21983,11 +22584,13 @@ done
if test ${ac_cv_search_event_set+y}
then :
-else $as_nop
- ac_cv_search_event_set=no
+else case e in #(
+ e) ac_cv_search_event_set=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_event_set" >&5
printf "%s\n" "$ac_cv_search_event_set" >&6; }
@@ -21998,7 +22601,8 @@ then :
fi
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "event_base_free" "ac_cv_func_event_base_free"
if test "x$ac_cv_func_event_base_free" = xyes
@@ -22060,8 +22664,9 @@ fi
if test "x$ac_cv_have_decl_evsignal_assign" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_EVSIGNAL_ASSIGN $ac_have_decl" >>confdefs.h
@@ -22082,8 +22687,9 @@ fi
if test ${with_libexpat+y}
then :
withval=$with_libexpat;
-else $as_nop
- withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr"
+else case e in #(
+ e) withval="/usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr" ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libexpat" >&5
@@ -22119,8 +22725,9 @@ ac_fn_check_decl "$LINENO" "XML_StopParser" "ac_cv_have_decl_XML_StopParser" "$a
if test "x$ac_cv_have_decl_XML_StopParser" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_XML_STOPPARSER $ac_have_decl" >>confdefs.h
@@ -22131,8 +22738,9 @@ printf "%s\n" "#define HAVE_DECL_XML_STOPPARSER $ac_have_decl" >>confdefs.h
if test ${with_libhiredis+y}
then :
withval=$with_libhiredis;
-else $as_nop
- withval="no"
+else case e in #(
+ e) withval="no" ;;
+esac
fi
found_libhiredis="no"
@@ -22176,8 +22784,9 @@ fi
if test "x$ac_cv_have_decl_redisConnect" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_REDISCONNECT $ac_have_decl" >>confdefs.h
@@ -22189,8 +22798,9 @@ fi
if test ${with_libnghttp2+y}
then :
withval=$with_libnghttp2;
-else $as_nop
- withval="no"
+else case e in #(
+ e) withval="no" ;;
+esac
fi
found_libnghttp2="no"
@@ -22234,8 +22844,9 @@ fi
if test "x$ac_cv_have_decl_nghttp2_session_server_new" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_NGHTTP2_SESSION_SERVER_NEW $ac_have_decl" >>confdefs.h
@@ -22247,8 +22858,9 @@ fi
if test ${with_libngtcp2+y}
then :
withval=$with_libngtcp2;
-else $as_nop
- withval="no"
+else case e in #(
+ e) withval="no" ;;
+esac
fi
found_libngtcp2="no"
@@ -22306,8 +22918,9 @@ fi
if test "x$ac_cv_have_decl_ngtcp2_conn_server_new" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_NGTCP2_CONN_SERVER_NEW $ac_have_decl" >>confdefs.h
@@ -22318,8 +22931,9 @@ printf "%s\n" "#define HAVE_DECL_NGTCP2_CONN_SERVER_NEW $ac_have_decl" >>confdef
if test "x$ac_cv_have_decl_ngtcp2_crypto_encrypt_cb" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_NGTCP2_CRYPTO_ENCRYPT_CB $ac_have_decl" >>confdefs.h
@@ -22328,16 +22942,22 @@ printf %s "checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_openssl... "
if test ${ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lngtcp2_crypto_openssl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char ngtcp2_crypto_encrypt_cb ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngtcp2_crypto_encrypt_cb (void);
int
main (void)
{
@@ -22349,12 +22969,14 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb=yes
-else $as_nop
- ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb=no
+else case e in #(
+ e) ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb" >&5
printf "%s\n" "$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_encrypt_cb" >&6; }
@@ -22368,16 +22990,22 @@ printf %s "checking for ngtcp2_crypto_encrypt_cb in -lngtcp2_crypto_quictls... "
if test ${ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lngtcp2_crypto_quictls $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char ngtcp2_crypto_encrypt_cb ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ngtcp2_crypto_encrypt_cb (void);
int
main (void)
{
@@ -22389,12 +23017,14 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb=yes
-else $as_nop
- ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb=no
+else case e in #(
+ e) ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb" >&5
printf "%s\n" "$ac_cv_lib_ngtcp2_crypto_quictls_ngtcp2_crypto_encrypt_cb" >&6; }
@@ -22478,8 +23108,9 @@ if test "x$ac_cv_func_SSL_is_quic" = xyes
then :
printf "%s\n" "#define HAVE_SSL_IS_QUIC 1" >>confdefs.h
-else $as_nop
- as_fn_error $? "No QUIC support detected in OpenSSL. Need OpenSSL version with QUIC support to enable DNS over QUIC with libngtcp2." "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "No QUIC support detected in OpenSSL. Need OpenSSL version with QUIC support to enable DNS over QUIC with libngtcp2." "$LINENO" 5 ;;
+esac
fi
done
@@ -22578,11 +23209,12 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
@@ -22612,16 +23244,22 @@ printf %s "checking for compress in -lz... " >&6; }
if test ${ac_cv_lib_z_compress+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lz $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char compress ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char compress (void);
int
main (void)
{
@@ -22633,12 +23271,14 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_z_compress=yes
-else $as_nop
- ac_cv_lib_z_compress=no
+else case e in #(
+ e) ac_cv_lib_z_compress=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5
printf "%s\n" "$ac_cv_lib_z_compress" >&6; }
@@ -22676,16 +23316,22 @@ printf %s "checking for compress in -lz... " >&6; }
if test ${ac_cv_lib_z_compress+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_check_lib_save_LIBS=$LIBS
+else case e in #(
+ e) ac_check_lib_save_LIBS=$LIBS
LIBS="-lz $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char compress ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char compress (void);
int
main (void)
{
@@ -22697,12 +23343,14 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_lib_z_compress=yes
-else $as_nop
- ac_cv_lib_z_compress=no
+else case e in #(
+ e) ac_cv_lib_z_compress=no ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+LIBS=$ac_check_lib_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5
printf "%s\n" "$ac_cv_lib_z_compress" >&6; }
@@ -22771,8 +23419,8 @@ printf "%s\n" "#define USE_WINSOCK 1" >>confdefs.h
fi
fi
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifdef HAVE_WS2TCPIP_H
@@ -22799,8 +23447,8 @@ printf "%s\n" "#define USE_WINSOCK 1" >>confdefs.h
USE_WINSOCK="1"
-else $as_nop
- ORIGLIBS="$LIBS"
+else case e in #(
+ e) ORIGLIBS="$LIBS"
LIBS="$LIBS -lws2_32"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -22829,19 +23477,22 @@ printf "%s\n" "#define USE_WINSOCK 1" >>confdefs.h
USE_WINSOCK="1"
-else $as_nop
-
+else case e in #(
+ e)
ac_cv_func_getaddrinfo="no"
LIBS="$ORIGLIBS"
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -22876,8 +23527,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_WINDRES+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$WINDRES"; then
+else case e in #(
+ e) if test -n "$WINDRES"; then
ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -22899,7 +23550,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
WINDRES=$ac_cv_prog_WINDRES
if test -n "$WINDRES"; then
@@ -22921,8 +23573,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_prog_ac_ct_WINDRES+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- if test -n "$ac_ct_WINDRES"; then
+else case e in #(
+ e) if test -n "$ac_ct_WINDRES"; then
ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -22944,7 +23596,8 @@ done
done
IFS=$as_save_IFS
-fi
+fi ;;
+esac
fi
ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES
if test -n "$ac_ct_WINDRES"; then
@@ -23034,9 +23687,10 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_IOCTLSOCKET 1" >>confdefs.h
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -23059,8 +23713,8 @@ cache=`echo daemon | sed 'y%.=/+-%___p_%'`
if eval test \${cv_cc_deprecated_$cache+y}
then :
printf %s "(cached) " >&6
-else $as_nop
-
+else case e in #(
+ e)
echo '
#include <stdlib.h>
#include <unistd.h>
@@ -23072,7 +23726,8 @@ else
eval "cv_cc_deprecated_$cache=yes"
fi
rm -f conftest conftest.o conftest.c
-
+ ;;
+esac
fi
if eval "test \"`echo '$cv_cc_deprecated_'$cache`\" = yes"; then
@@ -23179,9 +23834,10 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_HTOBE64 1" >>confdefs.h
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -23214,9 +23870,10 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_BE64TOH 1" >>confdefs.h
-else $as_nop
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
-printf "%s\n" "no" >&6; }
+else case e in #(
+ e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; } ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -23226,15 +23883,21 @@ printf %s "checking for library containing setusercontext... " >&6; }
if test ${ac_cv_search_setusercontext+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char setusercontext ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char setusercontext (void);
int
main (void)
{
@@ -23265,11 +23928,13 @@ done
if test ${ac_cv_search_setusercontext+y}
then :
-else $as_nop
- ac_cv_search_setusercontext=no
+else case e in #(
+ e) ac_cv_search_setusercontext=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_setusercontext" >&5
printf "%s\n" "$ac_cv_search_setusercontext" >&6; }
@@ -23493,14 +24158,15 @@ if test "x$ac_cv_func_setresuid" = xyes
then :
printf "%s\n" "#define HAVE_SETRESUID 1" >>confdefs.h
-else $as_nop
- ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid"
+else case e in #(
+ e) ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid"
if test "x$ac_cv_func_setreuid" = xyes
then :
printf "%s\n" "#define HAVE_SETREUID 1" >>confdefs.h
fi
-
+ ;;
+esac
fi
done
@@ -23512,14 +24178,15 @@ if test "x$ac_cv_func_setresgid" = xyes
then :
printf "%s\n" "#define HAVE_SETRESGID 1" >>confdefs.h
-else $as_nop
- ac_fn_c_check_func "$LINENO" "setregid" "ac_cv_func_setregid"
+else case e in #(
+ e) ac_fn_c_check_func "$LINENO" "setregid" "ac_cv_func_setregid"
if test "x$ac_cv_func_setregid" = xyes
then :
printf "%s\n" "#define HAVE_SETREGID 1" >>confdefs.h
fi
-
+ ;;
+esac
fi
done
@@ -23563,11 +24230,12 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_LINK_ATOMIC_STORE 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -23598,8 +24266,9 @@ $ac_includes_default
if test "x$ac_cv_have_decl_inet_pton" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_INET_PTON $ac_have_decl" >>confdefs.h
ac_fn_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "
@@ -23628,8 +24297,9 @@ $ac_includes_default
if test "x$ac_cv_have_decl_inet_ntop" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_INET_NTOP $ac_have_decl" >>confdefs.h
@@ -23638,13 +24308,14 @@ if test "x$ac_cv_func_inet_aton" = xyes
then :
printf "%s\n" "#define HAVE_INET_ATON 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" inet_aton.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS inet_aton.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "inet_pton" "ac_cv_func_inet_pton"
@@ -23652,13 +24323,14 @@ if test "x$ac_cv_func_inet_pton" = xyes
then :
printf "%s\n" "#define HAVE_INET_PTON 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" inet_pton.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS inet_pton.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop"
@@ -23666,13 +24338,14 @@ if test "x$ac_cv_func_inet_ntop" = xyes
then :
printf "%s\n" "#define HAVE_INET_NTOP 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" inet_ntop.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS inet_ntop.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
@@ -23680,13 +24353,14 @@ if test "x$ac_cv_func_snprintf" = xyes
then :
printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" snprintf.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS snprintf.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
# test if snprintf return the proper length
@@ -23698,8 +24372,8 @@ printf %s "checking for correct snprintf return value... " >&6; }
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: maybe" >&5
printf "%s\n" "maybe" >&6; }
-else $as_nop
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else case e in #(
+ e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
@@ -23710,8 +24384,8 @@ if ac_fn_c_try_run "$LINENO"
then :
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
printf "%s\n" "yes" >&6; }
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
@@ -23723,10 +24397,12 @@ printf "%s\n" "#define SNPRINTF_RET_BROKEN /**/" >>confdefs.h
;;
esac
-
+ ;;
+esac
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
fi
fi
@@ -23736,13 +24412,14 @@ if test "x$ac_cv_func_strlcat" = xyes
then :
printf "%s\n" "#define HAVE_STRLCAT 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" strlcat.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS strlcat.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy"
@@ -23750,13 +24427,14 @@ if test "x$ac_cv_func_strlcpy" = xyes
then :
printf "%s\n" "#define HAVE_STRLCPY 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" strlcpy.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS strlcpy.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove"
@@ -23764,13 +24442,14 @@ if test "x$ac_cv_func_memmove" = xyes
then :
printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" memmove.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS memmove.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "gmtime_r" "ac_cv_func_gmtime_r"
@@ -23778,13 +24457,14 @@ if test "x$ac_cv_func_gmtime_r" = xyes
then :
printf "%s\n" "#define HAVE_GMTIME_R 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" gmtime_r.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS gmtime_r.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "isblank" "ac_cv_func_isblank"
@@ -23792,13 +24472,14 @@ if test "x$ac_cv_func_isblank" = xyes
then :
printf "%s\n" "#define HAVE_ISBLANK 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" isblank.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS isblank.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "explicit_bzero" "ac_cv_func_explicit_bzero"
@@ -23806,13 +24487,14 @@ if test "x$ac_cv_func_explicit_bzero" = xyes
then :
printf "%s\n" "#define HAVE_EXPLICIT_BZERO 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" explicit_bzero.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS explicit_bzero.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
LIBOBJ_WITHOUT_CTIMEARC4="$LIBOBJS"
@@ -23842,8 +24524,8 @@ printf "%s\n" "yes" >&6; }
printf "%s\n" "#define HAVE_REALLOCARRAY 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
printf "%s\n" "no" >&6; }
case " $LIBOBJS " in
@@ -23852,7 +24534,8 @@ printf "%s\n" "no" >&6; }
;;
esac
-
+ ;;
+esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
@@ -23860,8 +24543,9 @@ ac_fn_check_decl "$LINENO" "reallocarray" "ac_cv_have_decl_reallocarray" "$ac_in
if test "x$ac_cv_have_decl_reallocarray" = xyes
then :
ac_have_decl=1
-else $as_nop
- ac_have_decl=0
+else case e in #(
+ e) ac_have_decl=0 ;;
+esac
fi
printf "%s\n" "#define HAVE_DECL_REALLOCARRAY $ac_have_decl" >>confdefs.h
@@ -23871,13 +24555,14 @@ if test "x$ac_cv_func_arc4random" = xyes
then :
printf "%s\n" "#define HAVE_ARC4RANDOM 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" arc4random.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS arc4random.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "arc4random_uniform" "ac_cv_func_arc4random_uniform"
@@ -23885,13 +24570,14 @@ if test "x$ac_cv_func_arc4random_uniform" = xyes
then :
printf "%s\n" "#define HAVE_ARC4RANDOM_UNIFORM 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" arc4random_uniform.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS arc4random_uniform.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
if test "$ac_cv_func_arc4random" = "no"; then
@@ -23909,8 +24595,8 @@ if test "x$ac_cv_func_getentropy" = xyes
then :
printf "%s\n" "#define HAVE_GETENTROPY 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
if test "$USE_WINSOCK" = 1; then
case " $LIBOBJS " in
*" getentropy_win.$ac_objext "* ) ;;
@@ -23943,8 +24629,8 @@ if test "x$ac_cv_header_sys_sha2_h" = xyes
then :
printf "%s\n" "#define HAVE_SYS_SHA2_H 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
for ac_func in SHA512_Update
do :
@@ -23953,19 +24639,21 @@ if test "x$ac_cv_func_SHA512_Update" = xyes
then :
printf "%s\n" "#define HAVE_SHA512_UPDATE 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
case " $LIBOBJS " in
*" sha512.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS sha512.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
done
-
+ ;;
+esac
fi
done
@@ -23978,15 +24666,21 @@ printf %s "checking for library containing clock_gettime... " >&6; }
if test ${ac_cv_search_clock_gettime+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char clock_gettime ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char clock_gettime (void);
int
main (void)
{
@@ -24017,11 +24711,13 @@ done
if test ${ac_cv_search_clock_gettime+y}
then :
-else $as_nop
- ac_cv_search_clock_gettime=no
+else case e in #(
+ e) ac_cv_search_clock_gettime=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
printf "%s\n" "$ac_cv_search_clock_gettime" >&6; }
@@ -24056,8 +24752,8 @@ if test "x$ac_cv_func_SHA512_Update" = xyes
then :
printf "%s\n" "#define HAVE_SHA512_UPDATE 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
printf "%s\n" "#define COMPAT_SHA512 1" >>confdefs.h
@@ -24067,7 +24763,8 @@ printf "%s\n" "#define COMPAT_SHA512 1" >>confdefs.h
;;
esac
-
+ ;;
+esac
fi
done
@@ -24091,15 +24788,21 @@ printf %s "checking for library containing clock_gettime... " >&6; }
if test ${ac_cv_search_clock_gettime+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char clock_gettime ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char clock_gettime (void);
int
main (void)
{
@@ -24130,11 +24833,13 @@ done
if test ${ac_cv_search_clock_gettime+y}
then :
-else $as_nop
- ac_cv_search_clock_gettime=no
+else case e in #(
+ e) ac_cv_search_clock_gettime=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
printf "%s\n" "$ac_cv_search_clock_gettime" >&6; }
@@ -24148,7 +24853,8 @@ fi
;;
esac
fi
-
+ ;;
+esac
fi
done
@@ -24161,13 +24867,14 @@ if test "x$ac_cv_func_ctime_r" = xyes
then :
printf "%s\n" "#define HAVE_CTIME_R 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" ctime_r.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS ctime_r.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep"
@@ -24175,13 +24882,14 @@ if test "x$ac_cv_func_strsep" = xyes
then :
printf "%s\n" "#define HAVE_STRSEP 1" >>confdefs.h
-else $as_nop
- case " $LIBOBJS " in
+else case e in #(
+ e) case " $LIBOBJS " in
*" strsep.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS strsep.$ac_objext"
;;
esac
-
+ ;;
+esac
fi
@@ -24232,8 +24940,9 @@ fi
if test ${enable_dnstap+y}
then :
enableval=$enable_dnstap; opt_dnstap=$enableval
-else $as_nop
- opt_dnstap=no
+else case e in #(
+ e) opt_dnstap=no ;;
+esac
fi
@@ -24242,8 +24951,9 @@ fi
if test ${with_dnstap_socket_path+y}
then :
withval=$with_dnstap_socket_path; opt_dnstap_socket_path=$withval
-else $as_nop
- opt_dnstap_socket_path="$UNBOUND_RUN_DIR/dnstap.sock"
+else case e in #(
+ e) opt_dnstap_socket_path="$UNBOUND_RUN_DIR/dnstap.sock" ;;
+esac
fi
@@ -24255,8 +24965,8 @@ printf %s "checking for $ac_word... " >&6; }
if test ${ac_cv_path_PROTOC_C+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- case $PROTOC_C in
+else case e in #(
+ e) case $PROTOC_C in
[\\/]* | ?:[\\/]*)
ac_cv_path_PROTOC_C="$PROTOC_C" # Let the user override the test with a path.
;;
@@ -24281,6 +24991,7 @@ done
IFS=$as_save_IFS
;;
+esac ;;
esac
fi
PROTOC_C=$ac_cv_path_PROTOC_C
@@ -24309,8 +25020,8 @@ then :
fi
LDFLAGS="$LDFLAGS -L$withval/lib"
-else $as_nop
-
+else case e in #(
+ e)
if test -n "$PKG_CONFIG"; then
pkg_failed=no
@@ -24426,7 +25137,8 @@ fi
fi
fi
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing protobuf_c_message_pack" >&5
@@ -24434,15 +25146,21 @@ printf %s "checking for library containing protobuf_c_message_pack... " >&6; }
if test ${ac_cv_search_protobuf_c_message_pack+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char protobuf_c_message_pack ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char protobuf_c_message_pack (void);
int
main (void)
{
@@ -24473,11 +25191,13 @@ done
if test ${ac_cv_search_protobuf_c_message_pack+y}
then :
-else $as_nop
- ac_cv_search_protobuf_c_message_pack=no
+else case e in #(
+ e) ac_cv_search_protobuf_c_message_pack=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_protobuf_c_message_pack" >&5
printf "%s\n" "$ac_cv_search_protobuf_c_message_pack" >&6; }
@@ -24486,8 +25206,9 @@ if test "$ac_res" != no
then :
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-else $as_nop
- as_fn_error $? "The protobuf-c library was not found. Please install the development libraries for protobuf-c!" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "The protobuf-c library was not found. Please install the development libraries for protobuf-c!" "$LINENO" 5 ;;
+esac
fi
@@ -24527,8 +25248,9 @@ printf "%s\n" "#define DNSTAP_SOCKET_PATH \"$hdr_dnstap_socket_path\"" >>confdef
if test ${enable_dnscrypt+y}
then :
enableval=$enable_dnscrypt; opt_dnscrypt=$enableval
-else $as_nop
- opt_dnscrypt=no
+else case e in #(
+ e) opt_dnscrypt=no ;;
+esac
fi
@@ -24548,15 +25270,21 @@ printf %s "checking for library containing sodium_init... " >&6; }
if test ${ac_cv_search_sodium_init+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char sodium_init ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sodium_init (void);
int
main (void)
{
@@ -24587,11 +25315,13 @@ done
if test ${ac_cv_search_sodium_init+y}
then :
-else $as_nop
- ac_cv_search_sodium_init=no
+else case e in #(
+ e) ac_cv_search_sodium_init=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sodium_init" >&5
printf "%s\n" "$ac_cv_search_sodium_init" >&6; }
@@ -24600,8 +25330,9 @@ if test "$ac_res" != no
then :
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-else $as_nop
- as_fn_error $? "The sodium library was not found. Please install sodium!" "$LINENO" 5
+else case e in #(
+ e) as_fn_error $? "The sodium library was not found. Please install sodium!" "$LINENO" 5 ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing crypto_box_curve25519xchacha20poly1305_beforenm" >&5
@@ -24609,15 +25340,21 @@ printf %s "checking for library containing crypto_box_curve25519xchacha20poly130
if test ${ac_cv_search_crypto_box_curve25519xchacha20poly1305_beforenm+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char crypto_box_curve25519xchacha20poly1305_beforenm ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char crypto_box_curve25519xchacha20poly1305_beforenm (void);
int
main (void)
{
@@ -24648,11 +25385,13 @@ done
if test ${ac_cv_search_crypto_box_curve25519xchacha20poly1305_beforenm+y}
then :
-else $as_nop
- ac_cv_search_crypto_box_curve25519xchacha20poly1305_beforenm=no
+else case e in #(
+ e) ac_cv_search_crypto_box_curve25519xchacha20poly1305_beforenm=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypto_box_curve25519xchacha20poly1305_beforenm" >&5
printf "%s\n" "$ac_cv_search_crypto_box_curve25519xchacha20poly1305_beforenm" >&6; }
@@ -24667,11 +25406,12 @@ then :
printf "%s\n" "#define USE_DNSCRYPT_XCHACHA20 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
ENABLE_DNSCRYPT_XCHACHA20=0
-
+ ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing sodium_set_misuse_handler" >&5
@@ -24679,15 +25419,21 @@ printf %s "checking for library containing sodium_set_misuse_handler... " >&6; }
if test ${ac_cv_search_sodium_set_misuse_handler+y}
then :
printf %s "(cached) " >&6
-else $as_nop
- ac_func_search_save_LIBS=$LIBS
+else case e in #(
+ e) ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-char sodium_set_misuse_handler ();
+ builtin and then its argument prototype would still apply.
+ The 'extern "C"' is for builds by C++ compilers;
+ although this is not generally supported in C code supporting it here
+ has little cost and some practical benefit (sr 110532). */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sodium_set_misuse_handler (void);
int
main (void)
{
@@ -24718,11 +25464,13 @@ done
if test ${ac_cv_search_sodium_set_misuse_handler+y}
then :
-else $as_nop
- ac_cv_search_sodium_set_misuse_handler=no
+else case e in #(
+ e) ac_cv_search_sodium_set_misuse_handler=no ;;
+esac
fi
rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+LIBS=$ac_func_search_save_LIBS ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sodium_set_misuse_handler" >&5
printf "%s\n" "$ac_cv_search_sodium_set_misuse_handler" >&6; }
@@ -24835,16 +25583,17 @@ if test "x$ac_cv_header_net_pfvar_h" = xyes
then :
printf "%s\n" "#define HAVE_NET_PFVAR_H 1" >>confdefs.h
-else $as_nop
-
+else case e in #(
+ e)
# mnl
# Check whether --with-libmnl was given.
if test ${with_libmnl+y}
then :
withval=$with_libmnl;
-else $as_nop
- withval="yes"
+else case e in #(
+ e) withval="yes" ;;
+esac
fi
found_libmnl="no"
@@ -24875,7 +25624,8 @@ printf "%s\n" "found in $dir" >&6; }
if test x_$found_libmnl != x_yes; then
as_fn_error $? "Could not find libmnl, libmnl.h" "$LINENO" 5
fi
-
+ ;;
+esac
fi
done
@@ -25073,7 +25823,7 @@ printf "%s\n" "#define MAXSYSLOGMSGLEN 10240" >>confdefs.h
-version=1.23.0
+version=1.23.1
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for build time" >&5
printf %s "checking for build time... " >&6; }
@@ -25081,15 +25831,17 @@ ax_date_fmt="%b %e, %Y"
if test x"$SOURCE_DATE_EPOCH" = x
then :
date=`date "+$ax_date_fmt"`
-else $as_nop
- ax_build_date=`date -u -d "@$SOURCE_DATE_EPOCH" "+$ax_date_fmt" 2>/dev/null \
+else case e in #(
+ e) ax_build_date=`date -u -d "@$SOURCE_DATE_EPOCH" "+$ax_date_fmt" 2>/dev/null \
|| date -u -r "$SOURCE_DATE_EPOCH" "+$ax_date_fmt" 2>/dev/null`
if test x"$ax_build_date" = x
then :
as_fn_error $? "malformed SOURCE_DATE_EPOCH" "$LINENO" 5
-else $as_nop
- date=$ax_build_date
-fi
+else case e in #(
+ e) date=$ax_build_date ;;
+esac
+fi ;;
+esac
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $date" >&5
printf "%s\n" "$date" >&6; }
@@ -25110,8 +25862,8 @@ cat >confcache <<\_ACEOF
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# 'ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* 'ac_cv_foo' will be assigned the
# following values.
_ACEOF
@@ -25141,14 +25893,14 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;}
(set) 2>&1 |
case $as_nl`(ac_space=' '; set) 2>&1` in #(
*${as_nl}ac_space=\ *)
- # `set' does not quote correctly, so add quotes: double-quote
+ # 'set' does not quote correctly, so add quotes: double-quote
# substitution turns \\\\ into \\, and sed turns \\ into \.
sed -n \
"s/'/'\\\\''/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
;; #(
*)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
+ # 'set' quotes correctly as required by POSIX, so do not add quotes.
sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
;;
esac |
@@ -25209,6 +25961,12 @@ LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
+# Check whether --enable-year2038 was given.
+if test ${enable_year2038+y}
+then :
+ enableval=$enable_year2038;
+fi
+
if test -z "${USE_SYSTEMD_TRUE}" && test -z "${USE_SYSTEMD_FALSE}"; then
as_fn_error $? "conditional \"USE_SYSTEMD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -25242,7 +26000,6 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-as_nop=:
if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
then :
emulate sh
@@ -25251,12 +26008,13 @@ then :
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else $as_nop
- case `(set -o) 2>/dev/null` in #(
+else case e in #(
+ e) case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
+esac ;;
esac
fi
@@ -25328,7 +26086,7 @@ IFS=$as_save_IFS
;;
esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
+# We did not find ourselves, most probably we were run as 'sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
@@ -25357,7 +26115,6 @@ as_fn_error ()
} # as_fn_error
-
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -25397,11 +26154,12 @@ then :
{
eval $1+=\$2
}'
-else $as_nop
- as_fn_append ()
+else case e in #(
+ e) as_fn_append ()
{
eval $1=\$$1\$2
- }
+ } ;;
+esac
fi # as_fn_append
# as_fn_arith ARG...
@@ -25415,11 +26173,12 @@ then :
{
as_val=$(( $* ))
}'
-else $as_nop
- as_fn_arith ()
+else case e in #(
+ e) as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
- }
+ } ;;
+esac
fi # as_fn_arith
@@ -25502,9 +26261,9 @@ if (echo >conf$$.file) 2>/dev/null; then
if ln -s conf$$.file conf$$ 2>/dev/null; then
as_ln_s='ln -s'
# ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -pR'.
+ # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable.
+ # In both cases, we have to default to 'cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
@@ -25585,10 +26344,12 @@ as_test_x='test -x'
as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated
# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+as_tr_sh="eval sed '$as_sed_sh'" # deprecated
exec 6>&1
@@ -25603,8 +26364,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by unbound $as_me 1.23.0, which was
-generated by GNU Autoconf 2.71. Invocation command line was
+This file was extended by unbound $as_me 1.23.1, which was
+generated by GNU Autoconf 2.72. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -25636,7 +26397,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
+'$as_me' instantiates files and other configuration actions
from templates according to the current configuration. Unless the files
and actions are specified as TAGs, all are instantiated by default.
@@ -25671,11 +26432,11 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-unbound config.status 1.23.0
-configured by $0, generated by GNU Autoconf 2.71,
+unbound config.status 1.23.1
+configured by $0, generated by GNU Autoconf 2.72,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2021 Free Software Foundation, Inc.
+Copyright (C) 2023 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -25735,8 +26496,8 @@ do
ac_need_defaults=false;;
--he | --h)
# Conflict between --help and --header
- as_fn_error $? "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
+ as_fn_error $? "ambiguous option: '$1'
+Try '$0 --help' for more information.";;
--help | --hel | -h )
printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
@@ -25744,8 +26505,8 @@ Try \`$0 --help' for more information.";;
ac_cs_silent=: ;;
# This is an error.
- -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
+ -*) as_fn_error $? "unrecognized option: '$1'
+Try '$0 --help' for more information." ;;
*) as_fn_append ac_config_targets " $1"
ac_need_defaults=false ;;
@@ -26100,7 +26861,7 @@ do
"contrib/unbound_portable.service") CONFIG_FILES="$CONFIG_FILES contrib/unbound_portable.service" ;;
"config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;;
esac
done
@@ -26120,7 +26881,7 @@ fi
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
+# after its creation but before its name has been assigned to '$tmp'.
$debug ||
{
tmp= ac_tmp=
@@ -26144,7 +26905,7 @@ ac_tmp=$tmp
# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
+# This happens for instance with './config.status config.h'.
if test -n "$CONFIG_FILES"; then
@@ -26302,13 +27063,13 @@ fi # test -n "$CONFIG_FILES"
# Set up the scripts for CONFIG_HEADERS section.
# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
+# This happens for instance with './config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF
-# Transform confdefs.h into an awk script `defines.awk', embedded as
+# Transform confdefs.h into an awk script 'defines.awk', embedded as
# here-document in config.status, that substitutes the proper values into
# config.h.in to produce config.h.
@@ -26418,7 +27179,7 @@ do
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;;
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
@@ -26440,19 +27201,19 @@ do
-) ac_f="$ac_tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
- # because $ac_f cannot contain `:'.
+ # because $ac_f cannot contain ':'.
test -f "$ac_f" ||
case $ac_f in
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;;
esac
case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
- # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # Let's still pretend it is 'configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
@@ -26576,7 +27337,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
esac
_ACEOF
-# Neutralize VPATH when `$srcdir' = `.'.
+# Neutralize VPATH when '$srcdir' = '.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
@@ -26605,9 +27366,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
diff --git a/contrib/unbound/configure.ac b/contrib/unbound/configure.ac
index 76239c099572..051e7b392e33 100644
--- a/contrib/unbound/configure.ac
+++ b/contrib/unbound/configure.ac
@@ -12,14 +12,14 @@ sinclude(dnscrypt/dnscrypt.m4)
# must be numbers. ac_defun because of later processing
m4_define([VERSION_MAJOR],[1])
m4_define([VERSION_MINOR],[23])
-m4_define([VERSION_MICRO],[0])
+m4_define([VERSION_MICRO],[1])
AC_INIT([unbound],m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]),[unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues],[unbound])
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
LIBUNBOUND_CURRENT=9
-LIBUNBOUND_REVISION=31
+LIBUNBOUND_REVISION=32
LIBUNBOUND_AGE=1
# 1.0.0 had 0:12:0
# 1.0.1 had 0:13:0
@@ -118,6 +118,7 @@ LIBUNBOUND_AGE=1
# 1.21.1 had 9:29:1
# 1.22.0 had 9:30:1
# 1.23.0 had 9:31:1
+# 1.23.1 had 9:32:1
# Current -- the number of the binary API that we're implementing
# Revision -- which iteration of the implementation of the binary
diff --git a/contrib/unbound/doc/README b/contrib/unbound/doc/README
index 50d9022dbdca..1cd60bb0b12d 100644
--- a/contrib/unbound/doc/README
+++ b/contrib/unbound/doc/README
@@ -1,4 +1,4 @@
-README for Unbound 1.23.0
+README for Unbound 1.23.1
Copyright 2007 NLnet Labs
http://unbound.net
diff --git a/contrib/unbound/doc/example.conf b/contrib/unbound/doc/example.conf
index ab9445fc69f1..3a5188f00477 100644
--- a/contrib/unbound/doc/example.conf
+++ b/contrib/unbound/doc/example.conf
@@ -1,7 +1,7 @@
#
# Example configuration file.
#
-# See unbound.conf(5) man page, version 1.15.0.
+# See unbound.conf(5) man page, version 1.23.1.
#
# this is a comment.
@@ -17,7 +17,7 @@ server:
# whitespace is not necessary, but looks cleaner.
# verbosity number, 0 is least verbose. 1 is default.
- verbosity: 1
+ # verbosity: 1
# print statistics to the log (for every thread) every N seconds.
# Set to "" or 0 to disable. Default is disabled.
@@ -35,9 +35,14 @@ server:
# statistics-cumulative: no
# enable extended statistics (query types, answer codes, status)
- # printed from unbound-control. default off, because of speed.
+ # printed from unbound-control. Default off, because of speed.
# extended-statistics: no
+ # Inhibits selected extended statistics (qtype, qclass, qopcode, rcode,
+ # rpz-actions) from printing if their value is 0.
+ # Default on.
+ # statistics-inhibit-zero: yes
+
# number of threads to create. 1 disables threading.
# num-threads: 1
@@ -50,11 +55,16 @@ server:
# interface: 192.0.2.154
# interface: 192.0.2.154@5003
# interface: 2001:DB8::5
+ # interface: eth0@5003
# enable this feature to copy the source address of queries to reply.
# Socket options are not supported on all platforms. experimental.
# interface-automatic: no
+ # instead of the default port, open additional ports separated by
+ # spaces when interface-automatic is enabled, by listing them here.
+ # interface-automatic-ports: ""
+
# port to answer queries from
# port: 53
@@ -133,8 +143,8 @@ server:
# edns-buffer-size: 1232
# Maximum UDP response size (not applied to TCP response).
- # Suggested values are 512 to 4096. Default is 4096. 65536 disables it.
- # max-udp-size: 4096
+ # Suggested values are 512 to 4096. Default is 1232. 65536 disables it.
+ # max-udp-size: 1232
# max memory to use for stream(tcp and tls) waiting result buffers.
# stream-wait-size: 4m
@@ -164,13 +174,53 @@ server:
# perform connect for UDP sockets to mitigate ICMP side channel.
# udp-connect: yes
- # The number of retries when a non-positive response is received.
+ # The number of retries, per upstream nameserver in a delegation, when
+ # a throwaway response (also timeouts) is received.
# outbound-msg-retry: 5
+ # Hard limit on the number of outgoing queries Unbound will make while
+ # resolving a name, making sure large NS sets do not loop.
+ # It resets on query restarts (e.g., CNAME) and referrals.
+ # max-sent-count: 32
+
+ # Hard limit on the number of times Unbound is allowed to restart a
+ # query upon encountering a CNAME record.
+ # max-query-restarts: 11
+
+ # Limit on number of NS records in NS RRset for incoming packets.
+ # iter-scrub-ns: 20
+
+ # Limit on number of CNAME, DNAME records for incoming packets.
+ # iter-scrub-cname: 11
+
+ # Limit on upstream queries for an incoming query and its recursion.
+ # max-global-quota: 200
+
# msec for waiting for an unknown server to reply. Increase if you
# are behind a slow satellite link, to eg. 1128.
# unknown-server-time-limit: 376
+ # msec before recursion replies are dropped. The work item continues.
+ # discard-timeout: 1900
+
+ # Max number of replies waiting for recursion per IP address.
+ # wait-limit: 1000
+
+ # Max replies waiting for recursion for IP address with cookie.
+ # wait-limit-cookie: 10000
+
+ # Apart from the default, the wait limit can be set for a netblock.
+ # wait-limit-netblock: 192.0.2.0/24 50000
+
+ # Apart from the default, the wait limit with cookie can be adjusted.
+ # wait-limit-cookie-netblock: 192.0.2.0/24 50000
+
+ # Defaults for loopback, it has no wait limit.
+ # wait-limit-netblock: 127.0.0.0/8 -1
+ # wait-limit-netblock: ::1/128 -1
+ # wait-limit-cookie-netblock: 127.0.0.0/8 -1
+ # wait-limit-cookie-netblock: ::1/128 -1
+
# the amount of memory to use for the RRset cache.
# plain value in bytes or you can append k, m or G. default is "4Mb".
# rrset-cache-size: 4m
@@ -191,6 +241,11 @@ server:
# the time to live (TTL) value cap for negative responses in the cache
# cache-max-negative-ttl: 3600
+ # the time to live (TTL) value lower bound, in seconds. Default 0.
+ # For negative responses in the cache. If disabled, default,
+ # cache-min-ttl applies if configured.
+ # cache-min-negative-ttl: 0
+
# the time to live (TTL) value for cached roundtrip times, lameness and
# EDNS version information for hosts. In seconds.
# infra-host-ttl: 900
@@ -198,6 +253,9 @@ server:
# minimum wait time for responses, increase if uplink is long. In msec.
# infra-cache-min-rtt: 50
+ # maximum wait time for responses. In msec.
+ # infra-cache-max-rtt: 120000
+
# enable to make server probe down hosts more frequently.
# infra-keep-probing: no
@@ -209,7 +267,8 @@ server:
# the maximum number of hosts that are cached (roundtrip, EDNS, lame).
# infra-cache-numhosts: 10000
- # define a number of tags here, use with local-zone, access-control.
+ # define a number of tags here, use with local-zone, access-control,
+ # interface-*.
# repeat the define-tag statement to add additional tags.
# define-tag: "tag1 tag2 tag3"
@@ -219,6 +278,18 @@ server:
# Enable IPv6, "yes" or "no".
# do-ip6: yes
+ # If running unbound on an IPv6-only host, domains that only have
+ # IPv4 servers would become unresolveable. If NAT64 is available in
+ # the network, unbound can use NAT64 to reach these servers with
+ # the following option. This is NOT needed for enabling DNS64 on a
+ # system that has IPv4 connectivity.
+ # Consider also enabling prefer-ip6 to prefer native IPv6 connections
+ # to nameservers.
+ # do-nat64: no
+
+ # NAT64 prefix. Defaults to using dns64-prefix value.
+ # nat64-prefix: 64:ff9b::0/96
+
# Enable UDP, "yes" or "no".
# do-udp: yes
@@ -247,9 +318,14 @@ server:
# Enable EDNS TCP keepalive option.
# edns-tcp-keepalive: no
- # Timeout for EDNS TCP keepalive, in msec.
+ # Timeout for EDNS TCP keepalive, in msec. Overrides tcp-idle-timeout
+ # if edns-tcp-keepalive is set.
# edns-tcp-keepalive-timeout: 120000
+ # UDP queries that have waited in the socket buffer for a long time
+ # can be dropped. Default is 0, disabled. In seconds, such as 3.
+ # sock-queue-timeout: 0
+
# Use systemd socket activation for UDP, TCP, and control sockets.
# use-systemd: no
@@ -263,11 +339,10 @@ server:
# Choose deny (drop message), refuse (polite error reply),
# allow (recursive ok), allow_setrd (recursive ok, rd bit is forced on),
# allow_snoop (recursive and nonrecursive ok)
+ # allow_cookie (allow UDP with valid cookie or stateful transport)
# deny_non_local (drop queries unless can be answered from local-data)
# refuse_non_local (like deny_non_local but polite error reply).
- # access-control: 0.0.0.0/0 refuse
# access-control: 127.0.0.0/8 allow
- # access-control: ::0/0 refuse
# access-control: ::1 allow
# access-control: ::ffff:127.0.0.1 allow
@@ -276,7 +351,7 @@ server:
# are tagged with one of these tags.
# access-control-tag: 192.0.2.0/24 "tag2 tag3"
- # set action for particular tag for given access control element
+ # set action for particular tag for given access control element.
# if you have multiple tag values, the tag used to lookup the action
# is the first tag match between access-control-tag and local-zone-tag
# where "first" comes from the order of the define-tag values.
@@ -288,6 +363,58 @@ server:
# Set view for access control element
# access-control-view: 192.0.2.0/24 viewname
+ # Similar to 'access-control:' but for interfaces.
+ # Control which listening interfaces are allowed to accept (recursive)
+ # queries for this server.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the action.
+ # The actions are the same as 'access-control:' above.
+ # By default all the interfaces configured are refused.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-action: 192.0.2.153 allow
+ # interface-action: 192.0.2.154 allow
+ # interface-action: 192.0.2.154@5003 allow
+ # interface-action: 2001:DB8::5 allow
+ # interface-action: eth0@5003 allow
+
+ # Similar to 'access-control-tag:' but for interfaces.
+ # Tag interfaces with a list of tags (in "" with spaces between).
+ # Interfaces using these tags use localzones that are tagged with one
+ # of these tags.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the list of tags.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-tag: eth0@5003 "tag2 tag3"
+
+ # Similar to 'access-control-tag-action:' but for interfaces.
+ # Set action for particular tag for a given interface element.
+ # If you have multiple tag values, the tag used to lookup the action
+ # is the first tag match between interface-tag and local-zone-tag
+ # where "first" comes from the order of the define-tag values.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the tag and action.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-tag-action: eth0@5003 tag3 refuse
+
+ # Similar to 'access-control-tag-data:' but for interfaces.
+ # Set redirect data for a particular tag for an interface element.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the tag and the redirect data.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-tag-data: eth0@5003 tag2 "A 127.0.0.1"
+
+ # Similar to 'access-control-view:' but for interfaces.
+ # Set view for an interface element.
+ # The specified interfaces should be the same as the ones specified in
+ # 'interface:' followed by the view name.
+ # Note: any 'access-control*:' setting overrides all 'interface-*:'
+ # settings for targeted clients.
+ # interface-view: eth0@5003 viewname
+
# if given, a chroot(2) is done to the given directory.
# i.e. you can chroot to the working directory, for example,
# for extra security, but make sure all files are in that directory.
@@ -311,19 +438,19 @@ server:
# How to do this is specific to your OS.
#
# If you give "" no chroot is performed. The path must not end in a /.
- # chroot: "@UNBOUND_CHROOT_DIR@"
+ # chroot: "/var/unbound"
# if given, user privileges are dropped (after binding port),
# and the given username is assumed. Default is user "unbound".
# If you give "" no privileges are dropped.
- # username: "@UNBOUND_USERNAME@"
+ # username: "unbound"
# the working directory. The relative files in this config are
# relative to this directory. If you give "" the working directory
# is not changed.
# If you give a server: directory: dir before include: file statements
# then those includes can be relative to the working directory.
- # directory: "@UNBOUND_RUN_DIR@"
+ # directory: "/var/unbound"
# the log file, "" means log to stderr.
# Use of this option sets use-syslog to "no".
@@ -340,6 +467,10 @@ server:
# print UTC timestamp in ascii to logfile, default is epoch in seconds.
# log-time-ascii: no
+ # log timestamp in ISO8601 format if also log-time-ascii is enabled.
+ # (y-m-dTh:m:s.msec[+-]tzhours:tzminutes)
+ # log-time-iso: no
+
# print one line with time, IP, name, type, class for every query.
# log-queries: no
@@ -351,6 +482,9 @@ server:
# filtering log-queries and log-replies from the log.
# log-tag-queryreply: no
+ # log with destination address, port and type for log-replies.
+ # log-destaddr: no
+
# log the local-zone actions, like local-zone type inform is enabled
# also for the other local zone types.
# log-local-actions: no
@@ -359,7 +493,7 @@ server:
# log-servfail: no
# the pid file. Can be an absolute path outside of chroot/work dir.
- # pidfile: "@UNBOUND_PIDFILE@"
+ # pidfile: "/var/unbound/unbound.pid"
# file to read root hints from.
# get one from https://www.internic.net/domain/named.cache
@@ -409,6 +543,9 @@ server:
# Harden against out of zone rrsets, to avoid spoofing attempts.
# harden-glue: yes
+ # Harden against unverified (outside-zone, including sibling zone) glue rrsets
+ # harden-unverified-glue: no
+
# Harden against receiving dnssec-stripped data. If you turn it
# off, failing to validate dnskey data for a trustanchor will
# trigger insecure mode for that zone (like without a trustanchor).
@@ -425,10 +562,15 @@ server:
# harden-referral-path: no
# Harden against algorithm downgrade when multiple algorithms are
- # advertised in the DS record. If no, allows the weakest algorithm
- # to validate the zone.
+ # advertised in the DS record. If no, allows any algorithm
+ # to validate the zone which is the standard behavior for validators.
+ # Check the manpage for detailed information.
# harden-algo-downgrade: no
+ # Harden against unknown records in the authority section and the
+ # additional section.
+ # harden-unknown-additional: no
+
# Sent minimum amount of information to upstream servers to enhance
# privacy. Only sent minimum required labels of the QNAME and set QTYPE
# to A when possible.
@@ -521,7 +663,7 @@ server:
# And then enable the auto-trust-anchor-file config item.
# Please note usage of unbound-anchor root anchor is at your own risk
# and under the terms of our LICENSE (see that file in the source).
- # auto-trust-anchor-file: "@UNBOUND_ROOTKEY_FILE@"
+ # auto-trust-anchor-file: "/var/unbound/root.key"
# trust anchor signaling sends a RFC8145 key tag query after priming.
# trust-anchor-signaling: yes
@@ -589,13 +731,19 @@ server:
# that set CD but cannot validate themselves.
# ignore-cd-flag: no
+ # Disable the DO flag in outgoing requests. It is helpful for upstream
+ # devices that cannot handle DNSSEC information. But do not enable it
+ # otherwise, because it would stop DNSSEC validation.
+ # disable-edns-do: no
+
# Serve expired responses from cache, with serve-expired-reply-ttl in
- # the response, and then attempt to fetch the data afresh.
+ # the response. By default it first tries to refresh an expired answer.
+ # Can be configured with serve-expired-client-timeout.
# serve-expired: no
#
# Limit serving of expired responses to configured seconds after
# expiration. 0 disables the limit.
- # serve-expired-ttl: 0
+ # serve-expired-ttl: 86400
#
# Set the TTL of expired records to the serve-expired-ttl value after a
# failed attempt to retrieve the record from upstream. This makes sure
@@ -608,10 +756,9 @@ server:
#
# Time in milliseconds before replying to the client with expired data.
# This essentially enables the serve-stale behavior as specified in
- # RFC 8767 that first tries to resolve before
- # immediately responding with expired data. 0 disables this behavior.
- # A recommended value is 1800.
- # serve-expired-client-timeout: 0
+ # RFC 8767 that first tries to resolve before immediately responding
+ # with expired data. 0 disables this behavior.
+ # serve-expired-client-timeout: 1800
# Return the original TTL as received from the upstream name server rather
# than the decrementing TTL as stored in the cache. Enabling this feature
@@ -670,6 +817,8 @@ server:
# local-zone: "127.in-addr.arpa." nodefault
# local-zone: "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa." nodefault
# local-zone: "home.arpa." nodefault
+ # local-zone: "resolver.arpa." nodefault
+ # local-zone: "service.arpa." nodefault
# local-zone: "onion." nodefault
# local-zone: "test." nodefault
# local-zone: "invalid." nodefault
@@ -736,6 +885,8 @@ server:
# o always_transparent, always_refuse, always_nxdomain, always_nodata,
# always_deny resolve in that way but ignore local data for
# that name
+ # o block_a resolves all records normally but returns
+ # NODATA for A queries and ignores local data for that name
# o always_null returns 0.0.0.0 or ::0 for any name in the zone.
# o noview breaks out of that view towards global local-zones.
#
@@ -778,6 +929,7 @@ server:
# tls-service-pem: "path/to/publiccertfile.pem"
# tls-port: 853
# https-port: 443
+ # quic-port: 853
# cipher setting for TLSv1.2
# tls-ciphers: "DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256"
@@ -811,6 +963,8 @@ server:
# Add system certs to the cert bundle, from the Windows Cert Store
# tls-win-cert: no
+ # and on other systems, the default openssl certificates
+ # tls-system-cert: no
# Pad queries over TLS upstreams
# pad-queries: yes
@@ -840,6 +994,13 @@ server:
# Disable TLS for DNS-over-HTTP downstream service.
# http-notls-downstream: no
+ # Maximum number of bytes used for QUIC buffers.
+ # quic-size: 8m
+
+ # The interfaces that use these listed port numbers will support and
+ # expect PROXYv2. For UDP and TCP/TLS interfaces.
+ # proxy-protocol-port: portno for each of the port numbers.
+
# DNS64 prefix. Must be specified when DNS64 is use.
# Enable dns64 in module-config. Used to synthesize IPv6 from IPv4.
# dns64-prefix: 64:ff9b::0/96
@@ -876,6 +1037,13 @@ server:
# if 0(default) it is disabled, otherwise states qps allowed per ip address
# ip-ratelimit: 0
+ # global query ratelimit for all ip addresses with a valid DNS Cookie.
+ # feature is experimental.
+ # if 0(default) it is disabled, otherwise states qps allowed per ip address
+ # useful in combination with 'allow_cookie'.
+ # If used, suggested to be higher than ip-ratelimit, tenfold.
+ # ip-ratelimit-cookie: 0
+
# ip ratelimits are tracked in a cache, size in bytes of cache (or k,m).
# ip-ratelimit-size: 4m
# ip ratelimit cache slabs, reduces lock contention if equal to cpucount.
@@ -897,6 +1065,32 @@ server:
# the number of servers that will be used in the fast server selection.
# fast-server-num: 3
+ # reply to requests containing DNS Cookies as specified in RFC 7873 and RFC 9018.
+ # answer-cookie: no
+
+ # secret for DNS Cookie generation.
+ # useful for anycast deployments.
+ # example value "000102030405060708090a0b0c0d0e0f".
+ # cookie-secret: <128 bit random hex string>
+
+ # File with cookie secrets, the 'cookie-secret:' option is ignored
+ # and the file can be managed to have staging and active secrets
+ # with remote control commands. Disabled with "". Default is "".
+ # cookie-secret-file: "/usr/local/etc/unbound_cookiesecrets.txt"
+
+ # Enable to attach Extended DNS Error codes (RFC8914) to responses.
+ # ede: no
+
+ # Enable to attach an Extended DNS Error (RFC8914) Code 3 - Stale
+ # Answer as EDNS0 option to expired responses.
+ # Note that the ede option above needs to be enabled for this to work.
+ # ede-serve-expired: no
+
+ # Enable DNS Error Reporting (RFC9567).
+ # qname-minimisation is advised to be turned on as well to increase
+ # privacy on the outgoing reports.
+ # dns-error-reporting: no
+
# Specific options for ipsecmod. Unbound needs to be configured with
# --enable-ipsecmod for these to take effect.
#
@@ -941,7 +1135,7 @@ server:
# o and give a python-script to run.
python:
# Script file to load
- # python-script: "@UNBOUND_SHARE_DIR@/ubmodule-tst.py"
+ # python-script: "/var/unbound/ubmodule-tst.py"
# Dynamic library config section. To enable:
# o use --with-dynlibmodule to configure before compiling.
@@ -952,7 +1146,7 @@ python:
# the module-config then you need one dynlib-file per instance.
dynlib:
# Script file to load
- # dynlib-file: "@UNBOUND_SHARE_DIR@/dynlib.so"
+ # dynlib-file: "/var/unbound/dynlib.so"
# Remote control config section.
remote-control:
@@ -975,16 +1169,16 @@ remote-control:
# control-use-cert: "yes"
# Unbound server key file.
- # server-key-file: "@UNBOUND_RUN_DIR@/unbound_server.key"
+ # server-key-file: "/var/unbound/unbound_server.key"
# Unbound server certificate file.
- # server-cert-file: "@UNBOUND_RUN_DIR@/unbound_server.pem"
+ # server-cert-file: "/var/unbound/unbound_server.pem"
# unbound-control key file.
- # control-key-file: "@UNBOUND_RUN_DIR@/unbound_control.key"
+ # control-key-file: "/var/unbound/unbound_control.key"
# unbound-control certificate file.
- # control-cert-file: "@UNBOUND_RUN_DIR@/unbound_control.pem"
+ # control-cert-file: "/var/unbound/unbound_control.pem"
# Stub zones.
# Create entries like below, to make all queries for 'example.com' and
@@ -1031,11 +1225,11 @@ remote-control:
# has a copy of the root for local usage. The second serves example.org
# authoritatively. zonefile: reads from file (and writes to it if you also
# download it), primary: fetches with AXFR and IXFR, or url to zonefile.
-# With allow-notify: you can give additional (apart from primaries) sources of
-# notifies.
+# With allow-notify: you can give additional (apart from primaries and urls)
+# sources of notifies.
# auth-zone:
# name: "."
-# primary: 199.9.14.201 # b.root-servers.net
+# primary: 170.247.170.2 # b.root-servers.net
# primary: 192.33.4.12 # c.root-servers.net
# primary: 199.7.91.13 # d.root-servers.net
# primary: 192.5.5.241 # f.root-servers.net
@@ -1043,7 +1237,7 @@ remote-control:
# primary: 193.0.14.129 # k.root-servers.net
# primary: 192.0.47.132 # xfr.cjr.dns.icann.org
# primary: 192.0.32.132 # xfr.lax.dns.icann.org
-# primary: 2001:500:200::b # b.root-servers.net
+# primary: 2801:1b8:10::b # b.root-servers.net
# primary: 2001:500:2::c # c.root-servers.net
# primary: 2001:500:2d::d # d.root-servers.net
# primary: 2001:500:2f::f # f.root-servers.net
@@ -1111,6 +1305,11 @@ remote-control:
# backend: "testframe"
# # secret seed string to calculate hashed keys
# secret-seed: "default"
+# # if the backend should be read from, but not written to.
+# cachedb-no-store: no
+# # if the cachedb should be checked before a serve-expired response is
+# # given, when serve-expired is enabled.
+# cachedb-check-when-serve-expired: yes
#
# # For "redis" backend:
# # (to enable, use --with-libhiredis to configure before compiling)
@@ -1118,10 +1317,36 @@ remote-control:
# redis-server-host: 127.0.0.1
# # redis server's TCP port
# redis-server-port: 6379
+# # if the server uses a unix socket, set its path, or "" when not used.
+# redis-server-path: "/var/lib/redis/redis-server.sock"
+# # if the server uses an AUTH password, specify here, or "" when not used.
+# redis-server-password: ""
# # timeout (in ms) for communication with the redis server
# redis-timeout: 100
+# # timeout (in ms) for commands, if 0, uses redis-timeout.
+# redis-command-timeout: 0
+# # timeout (in ms) for connection set up, if 0, uses redis-timeout.
+# redis-connect-timeout: 0
# # set timeout on redis records based on DNS response TTL
# redis-expire-records: no
+# # redis logical database to use, 0 is the default database.
+# redis-logical-db: 0
+# # redis replica server's IP address or host name
+# redis-replica-server-host: 127.0.0.1
+# # redis replica server's TCP port
+# redis-replica-server-port: 6379
+# # if the replica server uses a unix socket, set its path, or "" when not used.
+# redis-replica-server-path: "/var/lib/redis/redis-server.sock"
+# # if the replica server uses an AUTH password, specify here, or "" when not used.
+# redis-replica-server-password: ""
+# # timeout (in ms) for communication with the redis replica server
+# redis-replica-timeout: 100
+# # timeout (in ms) for redis replica commands, if 0, uses redis-replica-timeout.
+# redis-replica-command-timeout: 0
+# # timeout (in ms) for redis replica connection set up, if 0, uses redis-replica-timeout.
+# redis-replica-connect-timeout: 0
+# # redis logical database to use for the replica server, 0 is the default database.
+# redis-replica-logical-db: 0
# IPSet
# Add specify domain into set via ipset.
@@ -1143,7 +1368,7 @@ remote-control:
# dnstap-enable: no
# # if set to yes frame streams will be used in bidirectional mode
# dnstap-bidirectional: yes
-# dnstap-socket-path: "@DNSTAP_SOCKET_PATH@"
+# dnstap-socket-path: ""
# # if "" use the unix socket in dnstap-socket-path, otherwise,
# # set it to "IPaddress[@port]" of the destination.
# dnstap-ip: ""
@@ -1163,6 +1388,8 @@ remote-control:
# dnstap-identity: ""
# # if "" it uses the package version.
# dnstap-version: ""
+# # log only 1/N messages, if 0 it is disabled. default 0.
+# dnstap-sample-rate: 0
# dnstap-log-resolver-query-messages: no
# dnstap-log-resolver-response-messages: no
# dnstap-log-client-query-messages: no
@@ -1171,7 +1398,8 @@ remote-control:
# dnstap-log-forwarder-response-messages: no
# Response Policy Zones
-# RPZ policies. Applied in order of configuration. QNAME, Response IP
+# RPZ policies. Applied in order of configuration. Any match from an earlier
+# RPZ zone will terminate the RPZ lookup. QNAME, Response IP
# Address, nsdname, nsip and clientip triggers are supported. Supported
# actions are: NXDOMAIN, NODATA, PASSTHRU, DROP, Local Data, tcp-only
# and drop. Policies can be loaded from a file, or using zone
diff --git a/contrib/unbound/doc/example.conf.in b/contrib/unbound/doc/example.conf.in
index ba817288bb62..e0149a2df6aa 100644
--- a/contrib/unbound/doc/example.conf.in
+++ b/contrib/unbound/doc/example.conf.in
@@ -1,7 +1,7 @@
#
# Example configuration file.
#
-# See unbound.conf(5) man page, version 1.23.0.
+# See unbound.conf(5) man page, version 1.23.1.
#
# this is a comment.
diff --git a/contrib/unbound/doc/libunbound.3 b/contrib/unbound/doc/libunbound.3
index 7df4f59d7831..8ef33b0998a2 100644
--- a/contrib/unbound/doc/libunbound.3
+++ b/contrib/unbound/doc/libunbound.3
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Feb 10, 2022" "NLnet Labs" "unbound 1.15.0"
+.TH "libunbound" "3" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" libunbound.3 -- unbound library functions manual
.\"
@@ -44,7 +44,7 @@
.B ub_ctx_zone_remove,
.B ub_ctx_data_add,
.B ub_ctx_data_remove
-\- Unbound DNS validating resolver 1.15.0 functions.
+\- Unbound DNS validating resolver 1.23.1 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
diff --git a/contrib/unbound/doc/libunbound.3.in b/contrib/unbound/doc/libunbound.3.in
index 4edc9b3c30af..8ef33b0998a2 100644
--- a/contrib/unbound/doc/libunbound.3.in
+++ b/contrib/unbound/doc/libunbound.3.in
@@ -1,4 +1,4 @@
-.TH "libunbound" "3" "Apr 24, 2025" "NLnet Labs" "unbound 1.23.0"
+.TH "libunbound" "3" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" libunbound.3 -- unbound library functions manual
.\"
@@ -44,7 +44,7 @@
.B ub_ctx_zone_remove,
.B ub_ctx_data_add,
.B ub_ctx_data_remove
-\- Unbound DNS validating resolver 1.23.0 functions.
+\- Unbound DNS validating resolver 1.23.1 functions.
.SH "SYNOPSIS"
.B #include <unbound.h>
.LP
diff --git a/contrib/unbound/doc/unbound-anchor.8 b/contrib/unbound/doc/unbound-anchor.8
index 268640d8155c..23c1dd4b060f 100644
--- a/contrib/unbound/doc/unbound-anchor.8
+++ b/contrib/unbound/doc/unbound-anchor.8
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Feb 10, 2022" "NLnet Labs" "unbound 1.15.0"
+.TH "unbound-anchor" "8" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
@@ -26,13 +26,13 @@ Suggested usage:
.nf
# in the init scripts.
# provide or update the root anchor (if necessary)
- unbound-anchor \-a "@UNBOUND_ROOTKEY_FILE@"
+ unbound-anchor \-a "/var/unbound/root.key"
# Please note usage of this root anchor is at your own risk
# and under the terms of our LICENSE (see source).
#
# start validating resolver
# the unbound.conf contains:
- # auto-trust-anchor-file: "@UNBOUND_ROOTKEY_FILE@"
+ # auto-trust-anchor-file: "/var/unbound/root.key"
unbound \-c unbound.conf
.fi
.P
@@ -53,12 +53,12 @@ The available options are:
.TP
.B \-a \fIfile
The root anchor key file, that is read in and written out.
-Default is @UNBOUND_ROOTKEY_FILE@.
+Default is /var/unbound/root.key.
If the file does not exist, or is empty, a builtin root key is written to it.
.TP
.B \-c \fIfile
The root update certificate file, that is read in.
-Default is @UNBOUND_ROOTCERT_FILE@.
+Default is /var/unbound/icannbundle.pem.
If the file does not exist, or is empty, a builtin certificate is used.
.TP
.B \-l
@@ -169,11 +169,11 @@ The build\-in configuration can be overridden by providing a root\-cert
file and a rootkey file.
.SH "FILES"
.TP
-.I @UNBOUND_ROOTKEY_FILE@
+.I /var/unbound/root.key
The root anchor file, updated with 5011 tracking, and read and written to.
The file is created if it does not exist.
.TP
-.I @UNBOUND_ROOTCERT_FILE@
+.I /var/unbound/icannbundle.pem
The trusted self\-signed certificate that is used to verify the downloaded
DNSSEC root trust anchor. You can update it by fetching it from
https://data.iana.org/root\-anchors/icannbundle.pem (and validate it).
diff --git a/contrib/unbound/doc/unbound-anchor.8.in b/contrib/unbound/doc/unbound-anchor.8.in
index c3a8d64cabbe..f93c5d0cd045 100644
--- a/contrib/unbound/doc/unbound-anchor.8.in
+++ b/contrib/unbound/doc/unbound-anchor.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-anchor" "8" "Apr 24, 2025" "NLnet Labs" "unbound 1.23.0"
+.TH "unbound-anchor" "8" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
.\"
diff --git a/contrib/unbound/doc/unbound-checkconf.8 b/contrib/unbound/doc/unbound-checkconf.8
index ac8782dcde40..9afc0df10de3 100644
--- a/contrib/unbound/doc/unbound-checkconf.8
+++ b/contrib/unbound/doc/unbound-checkconf.8
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Feb 10, 2022" "NLnet Labs" "unbound 1.15.0"
+.TH "unbound-checkconf" "8" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
@@ -14,6 +14,7 @@ unbound\-checkconf
.B unbound\-checkconf
.RB [ \-h ]
.RB [ \-f ]
+.RB [ \-q ]
.RB [ \-o
.IR option ]
.RI [ cfgfile ]
@@ -37,6 +38,9 @@ Print full pathname, with chroot applied to it. Use with the \-o option.
If given, after checking the config file the value of this option is
printed to stdout. For "" (disabled) options an empty line is printed.
.TP
+.B \-q
+Make the operation quiet, suppress output on success.
+.TP
.I cfgfile
The config file to read with settings for Unbound. It is checked.
If omitted, the config file at the default location is checked.
@@ -45,7 +49,7 @@ The unbound\-checkconf program exits with status code 1 on error,
0 for a correct config file.
.SH "FILES"
.TP
-.I @ub_conf_file@
+.I /var/unbound/unbound.conf
Unbound configuration file.
.SH "SEE ALSO"
\fIunbound.conf\fR(5),
diff --git a/contrib/unbound/doc/unbound-checkconf.8.in b/contrib/unbound/doc/unbound-checkconf.8.in
index 73cb0ebcbb5f..8902784bf0c9 100644
--- a/contrib/unbound/doc/unbound-checkconf.8.in
+++ b/contrib/unbound/doc/unbound-checkconf.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-checkconf" "8" "Apr 24, 2025" "NLnet Labs" "unbound 1.23.0"
+.TH "unbound-checkconf" "8" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound-checkconf.8 -- unbound configuration checker manual
.\"
diff --git a/contrib/unbound/doc/unbound-control.8 b/contrib/unbound/doc/unbound-control.8
index 9d0c10e942bd..abc333c42ff9 100644
--- a/contrib/unbound/doc/unbound-control.8
+++ b/contrib/unbound/doc/unbound-control.8
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Feb 10, 2022" "NLnet Labs" "unbound 1.15.0"
+.TH "unbound-control" "8" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
@@ -32,7 +32,7 @@ Show the version and commandline option help.
.TP
.B \-c \fIcfgfile
The config file to read with settings. If not given the default
-config file @ub_conf_file@ is used.
+config file /var/unbound/unbound.conf is used.
.TP
.B \-s \fIserver[@port]
IPv4 or IPv6 address of the server to contact. If not given, the
@@ -54,6 +54,161 @@ Stop the server. The server daemon exits.
.B reload
Reload the server. This flushes the cache and reads the config file fresh.
.TP
+.B reload_keep_cache
+Reload the server but try to keep the RRset and message cache if
+(re)configuration allows for it.
+That means the caches sizes and the number of threads must not change between
+reloads.
+.TP
+.B fast_reload \fR[\fI+dpv\fR]
+Reload the server, but keep downtime to a minimum, so that user queries
+keep seeing service. This needs the code compiled with threads. The config
+is loaded in a thread, and prepared, then it briefly pauses the existing
+server and updates config options. The intent is that the pause does not
+impact the service of user queries. The cache is kept. Also user queries
+worked on are kept and continue, but with the new config options.
+.IP
+This command is experimental at this time.
+.IP
+The amount of temporal memory needed during a fast_reload is twice the
+amount needed for configuration.
+This is because Unbound temporarily needs to store both current configuration
+values and new ones while trying to fast_reload.
+Zones loaded from disk (authority zones and RPZ zones) are included in such
+memory needs.
+.IP
+Options that can be changed are for
+forwards,
+stubs,
+views,
+authority zones,
+RPZ zones and
+local zones.
+.IP
+Also
+access-control and similar options,
+interface-action and similar options and
+tcp-connection-limit.
+It can reload some
+define-tag
+changes, more on that below.
+Further options include
+insecure-lan-zones,
+domain-insecure,
+trust-anchor-file,
+trust-anchor,
+trusted-keys-file,
+auto-trust-anchor-file,
+edns-client-string,
+ipset,
+log-identity,
+infra-cache-numhosts,
+msg-cache-size,
+rrset-cache-size,
+key-cache-size,
+ratelimit-size,
+neg-cache-size,
+num-queries-per-thread,
+jostle-timeout,
+use-caps-for-id,
+unwanted-reply-threshold,
+tls-use-sni,
+outgoing-tcp-mss,
+ip-dscp,
+max-reuse-tcp-queries,
+tcp-reuse-timeout,
+tcp-auth-query-timeout,
+delay-close.
+.IP
+It does not work with
+interface and
+outgoing-interface changes,
+also not with
+remote control,
+outgoing-port-permit,
+outgoing-port-avoid,
+msg-buffer-size,
+any **\*-slabs** options and
+statistics-interval changes.
+.IP
+For dnstap these options can be changed:
+dnstap-log-resolver-query-messages,
+dnstap-log-resolver-response-messages,
+dnstap-log-client-query-messages,
+dnstap-log-client-response-messages,
+dnstap-log-forwarder-query-messages and
+dnstap-log-forwarder-response-messages.
+.IP
+It does not work with these options:
+dnstap-enable,
+dnstap-bidirectional,
+dnstap-socket-path,
+dnstap-ip,
+dnstap-tls,
+dnstap-tls-server-name,
+dnstap-tls-cert-bundle,
+dnstap-tls-client-key-file and
+dnstap-tls-client-cert-file.
+.IP
+The options
+dnstap-send-identity,
+dnstap-send-version,
+dnstap-identity, and
+dnstap-version can be loaded
+when ``+p`` is not used.
+.IP
+The '+v' option makes the output verbose which includes the time it took to do
+the reload.
+With '+vv' it is more verbose which includes the amount of memory that was
+allocated temporarily to perform the reload; this amount of memory can be big
+if the config has large contents.
+In the timing output the 'reload' time is the time during which the server was
+paused.
+.IP
+The '+p' option makes the reload not pause threads, they keep running.
+Locks are acquired, but items are updated in sequence, so it is possible
+for threads to see an inconsistent state with some options from the old
+and some options from the new config, such as cache TTL parameters from the
+old config and forwards from the new config. The stubs and forwards are
+updated at the same time, so that they are viewed consistently, either old
+or new values together. The option makes the reload time take eg. 3
+microseconds instead of 0.3 milliseconds during which the worker threads are
+interrupted. So, the interruption is much shorter, at the expense of some
+inconsistency. After the reload itself, every worker thread is briefly
+contacted to make them release resources, this makes the delete timing
+a little longer, and takes up time from the remote control servicing
+worker thread.
+.IP
+With the nopause option, the reload does not work to reload some options,
+that fast reload works on without the nopause option: val-bogus-ttl,
+val-override-date, val-sig-skew-min, val-sig-skew-max, val-max-restart,
+val-nsec3-keysize-iterations, target-fetch-policy, outbound-msg-retry,
+max-sent-count, max-query-restarts, do-not-query-address,
+do-not-query-localhost, private-address, private-domain, caps-exempt,
+nat64-prefix, do-nat64, infra-host-ttl, infra-keep-probing, ratelimit,
+ip-ratelimit, ip-ratelimit-cookie, wait-limit-netblock,
+wait-limit-cookie-netblock, ratelimit-below-domain, ratelimit-for-domain.
+.IP
+The '+d' option makes the reload drop queries that the worker threads are
+working on. This is like flush_requestlist. Without it the queries are kept
+so that users keep getting answers for those queries that are currently
+processed. The drop makes it so that queries during the life time of the
+query processing see only old, or only new config options.
+.IP
+When there are changes to the config tags, from the \fBdefine\-tag\fR option,
+then the '+d' option is implicitly turned on with a warning printout, and
+queries are dropped.
+This is to stop references to the old tag information, by the old
+queries. If the number of tags is increased in the newly loaded config, by
+adding tags at the end, then the implicit '+d' option is not needed.
+.IP
+For response ip, that is actions associated with IP addresses, and perhaps
+intersected with access control tag and action information, those settings
+are stored with a query when it comes in based on its source IP address.
+The old information is kept with the query until the queries are done.
+This is gone when those queries are resolved and finished, or it is possible
+to flush the requestlist with '+d'.
+.TP
.B verbosity \fInumber
Change verbosity value for logging. Same values as \fBverbosity\fR keyword in
\fIunbound.conf\fR(5). This new setting lasts until the server is issued
@@ -115,31 +270,38 @@ Remove local data RRs read from stdin of unbound\-control. Input is one name per
line. For bulk removals.
.TP
.B dump_cache
-The contents of the cache is printed in a text format to stdout. You can
-redirect it to a file to store the cache in a file.
+The content of the cache is printed in a text format to stdout.
+You can redirect it to a file to store the cache in a file.
+Not supported in remote Unbounds in multi-process operation.
.TP
.B load_cache
-The contents of the cache is loaded from stdin. Uses the same format as
-dump_cache uses. Loading the cache with old, or wrong data can result
-in old or wrong data returned to clients. Loading data into the cache
-in this way is supported in order to aid with debugging.
+The content of the cache is loaded from stdin.
+Uses the same format as dump_cache uses.
+Loading the cache with old, or wrong data can result in old or wrong data
+returned to clients.
+Loading data into the cache in this way is supported in order to aid with
+debugging.
+Not supported in remote Unbounds in multi-process operation.
.TP
.B lookup \fIname
Print to stdout the name servers that would be used to look up the
name specified.
.TP
-.B flush \fIname
+.B flush \fR[\fI+c\fR] \fIname
Remove the name from the cache. Removes the types
-A, AAAA, NS, SOA, CNAME, DNAME, MX, PTR, SRV and NAPTR.
+A, AAAA, NS, SOA, CNAME, DNAME, MX, PTR, SRV, NAPTR, SVCB and HTTPS.
Because that is fast to do. Other record types can be removed using
.B flush_type
or
.B flush_zone\fR.
+.IP
+The '+c' option removes the items also from the cachedb cache. If
+cachedb is in use.
.TP
-.B flush_type \fIname\fR \fItype
+.B flush_type \fR[\fI+c\fR] \fIname\fR \fItype
Remove the name, type information from the cache.
.TP
-.B flush_zone \fIname
+.B flush_zone \fR[\fI+c\fR] \fIname
Remove all information at or below the name from the cache.
The rrsets and key entries are removed so that new lookups will be performed.
This needs to walk and inspect the entire cache, and is a slow operation.
@@ -147,10 +309,10 @@ The entries are set to expired in the implementation of this command (so,
with serve\-expired enabled, it'll serve that information but schedule a
prefetch for new information).
.TP
-.B flush_bogus
+.B flush_bogus \fR[\fI+c\fR]
Remove all bogus data from the cache.
.TP
-.B flush_negative
+.B flush_negative \fR[\fI+c\fR]
Remove all negative data from the cache. This is nxdomain answers,
nodata answers and servfail answers. Also removes bad key entries
(which could be due to failed lookups) from the dnssec key cache, and
@@ -233,22 +395,24 @@ still be bogus, use \fBflush_zone\fR to remove it), does not affect the config f
.B insecure_remove \fIzone
Removes domain\-insecure for the given zone.
.TP
-.B forward_add \fR[\fI+i\fR] \fIzone addr ...
+.B forward_add \fR[\fI+it\fR] \fIzone addr ...
Add a new forward zone to running Unbound. With +i option also adds a
\fIdomain\-insecure\fR for the zone (so it can resolve insecurely if you have
a DNSSEC root trust anchor configured for other names).
The addr can be IP4, IP6 or nameserver names, like \fIforward-zone\fR config
in unbound.conf.
+The +t option sets it to use tls upstream, like \fIforward\-tls\-upstream\fR: yes.
.TP
.B forward_remove \fR[\fI+i\fR] \fIzone
Remove a forward zone from running Unbound. The +i also removes a
\fIdomain\-insecure\fR for the zone.
.TP
-.B stub_add \fR[\fI+ip\fR] \fIzone addr ...
+.B stub_add \fR[\fI+ipt\fR] \fIzone addr ...
Add a new stub zone to running Unbound. With +i option also adds a
\fIdomain\-insecure\fR for the zone. With +p the stub zone is set to prime,
without it it is set to notprime. The addr can be IP4, IP6 or nameserver
names, like the \fIstub-zone\fR config in unbound.conf.
+The +t option sets it to use tls upstream, like \fIstub\-tls\-upstream\fR: yes.
.TP
.B stub_remove \fR[\fI+i\fR] \fIzone
Remove a stub zone from running Unbound. The +i also removes a
@@ -289,20 +453,22 @@ just the ratelimited ips, with their estimated qps. The ratelimited
ips are dropped before checking the cache.
.TP
.B list_auth_zones
-List the auth zones that are configured. Printed one per line with a
-status, indicating if the zone is expired and current serial number.
+List the auth zones that are configured. Printed one per line with a status,
+indicating if the zone is expired and current serial number. Configured RPZ
+zones are included.
.TP
.B auth_zone_reload \fIzone\fR
-Reload the auth zone from zonefile. The zonefile is read in overwriting
-the current contents of the zone in memory. This changes the auth zone
-contents itself, not the cache contents. Such cache contents exists if
-you set Unbound to validate with for-upstream yes and that can be cleared
-with \fBflush_zone\fR \fIzone\fR.
+Reload the auth zone (or RPZ zone) from zonefile. The zonefile is read in
+overwriting the current contents of the zone in memory. This changes the auth
+zone contents itself, not the cache contents. Such cache contents exists if
+you set Unbound to validate with for-upstream yes and that can be cleared with
+\fBflush_zone\fR \fIzone\fR.
.TP
.B auth_zone_transfer \fIzone\fR
-Transfer the auth zone from master. The auth zone probe sequence is started,
-where the masters are probed to see if they have an updated zone (with the SOA
-serial check). And then the zone is transferred for a newer zone version.
+Transfer the auth zone (or RPZ zone) from master. The auth zone probe sequence
+is started, where the masters are probed to see if they have an updated zone
+(with the SOA serial check). And then the zone is transferred for a newer zone
+version.
.TP
.B rpz_enable \fIzone\fR
Enable the RPZ zone if it had previously been disabled.
@@ -333,6 +499,41 @@ Remove a list of \fIlocal_data\fR for given view from stdin. Like local_datas_re
.TP
.B view_local_datas \fIview\fR
Add a list of \fIlocal_data\fR for given view from stdin. Like local_datas.
+.TP
+.B add_cookie_secret <secret>
+Add or replace a cookie secret persistently. <secret> needs to be an 128 bit
+hex string.
+.IP
+Cookie secrets can be either \fIactive\fR or \fIstaging\fR. \fIActive\fR cookie
+secrets are used to create DNS Cookies, but verification of a DNS Cookie
+succeeds with any of the \fIactive\fR or \fIstaging\fR cookie secrets. The
+state of the current cookie secrets can be printed with the
+\fBprint_cookie_secrets\fR command.
+.IP
+When there are no cookie secrets configured yet, the <secret> is added as
+\fIactive\fR. If there is already an \fIactive\fR cookie secret, the <secret>
+is added as \fIstaging\fR or replacing an existing \fIstaging\fR secret.
+.IP
+To "roll" a cookie secret used in an anycast set. The new secret has to be
+added as staging secret to \fBall\fR nodes in the anycast set. When \fBall\fR
+nodes can verify DNS Cookies with the new secret, the new secret can be
+activated with the \fBactivate_cookie_secret\fR command. After \fBall\fR nodes
+have the new secret \fIactive\fR for at least one hour, the previous secret can
+be dropped with the \fBdrop_cookie_secret\fR command.
+.IP
+Persistence is accomplished by writing to a file which if configured with the
+\fBcookie\-secret\-file\fR option in the server section of the config file.
+This is disabled by default, "".
+.TP
+.B drop_cookie_secret
+Drop the \fIstaging\fR cookie secret.
+.TP
+.B activate_cookie_secret
+Make the current \fIstaging\fR cookie secret \fIactive\fR, and the current
+\fIactive\fR cookie secret \fIstaging\fR.
+.TP
+.B print_cookie_secrets
+Show the current configured cookie secrets with their status.
.SH "EXIT CODE"
The unbound\-control program exits with status code 1 on error, 0 on success.
.SH "SET UP"
@@ -361,6 +562,21 @@ number of queries received by thread
.I threadX.num.queries_ip_ratelimited
number of queries rate limited by thread
.TP
+.I threadX.num.queries_cookie_valid
+number of queries with a valid DNS Cookie by thread
+.TP
+.I threadX.num.queries_cookie_client
+number of queries with a client part only DNS Cookie by thread
+.TP
+.I threadX.num.queries_cookie_invalid
+number of queries with an invalid DNS Cookie by thread
+.TP
+.I threadX.num.queries_discard_timeout
+number of queries removed due to discard-timeout by thread
+.TP
+.I threadX.num.queries_wait_limit
+number of queries removed due to wait-limit by thread
+.TP
.I threadX.num.cachehits
number of queries that were successfully answered using a cache lookup
.TP
@@ -380,6 +596,9 @@ request for certificates.
.I threadX.num.dnscrypt.malformed
number of request that were neither cleartext, not valid dnscrypt messages.
.TP
+.I threadX.num.dns_error_reports
+number of DNS Error Reports generated by thread
+.TP
.I threadX.num.prefetch
number of cache prefetches performed. This number is included in
cachehits, as the original query had the unprefetched answer from cache,
@@ -390,6 +609,14 @@ as a cache response was sent.
.I threadX.num.expired
number of replies that served an expired cache entry.
.TP
+.I threadX.num.queries_timed_out
+number of queries that are dropped because they waited in the UDP socket buffer
+for too long.
+.TP
+.I threadX.query.queue_time_us.max
+The maximum wait time for packets in the socket buffer, in microseconds. This
+is only reported when sock-queue-timeout is enabled.
+.TP
.I threadX.num.recursivereplies
The number of replies sent to queries that needed recursive processing. Could be smaller than threadX.num.cachemiss if due to timeouts no replies were sent for some queries.
.TP
@@ -430,6 +657,24 @@ buffers are full.
.I total.num.queries
summed over threads.
.TP
+.I total.num.queries_ip_ratelimited
+summed over threads.
+.TP
+.I total.num.queries_cookie_valid
+summed over threads.
+.TP
+.I total.num.queries_cookie_client
+summed over threads.
+.TP
+.I total.num.queries_cookie_invalid
+summed over threads.
+.TP
+.I total.num.queries_discard_timeout
+summed over threads.
+.TP
+.I total.num.queries_wait_limit
+summed over threads.
+.TP
.I total.num.cachehits
summed over threads.
.TP
@@ -448,12 +693,21 @@ summed over threads.
.I total.num.dnscrypt.malformed
summed over threads.
.TP
+.I total.num.dns_error_reports
+summed over threads.
+.TP
.I total.num.prefetch
summed over threads.
.TP
.I total.num.expired
summed over threads.
.TP
+.I total.num.queries_timed_out
+summed over threads.
+.TP
+.I total.query.queue_time_us.max
+the maximum of the thread values.
+.TP
.I total.num.recursivereplies
summed over threads.
.TP
@@ -519,6 +773,10 @@ queries waiting for request stream completion.
Memory in bytes used by the HTTP/2 response buffers. Containing DNS responses
waiting to be written back to the clients.
.TP
+.I mem.quic
+Memory in bytes used by QUIC. Containing connection information, stream
+information, queries read and responses written back to the clients.
+.TP
.I histogram.<sec>.<usec>.to.<sec>.<usec>
Shows a histogram, summed over all threads. Every element counts the
recursive queries whose reply time fit between the lower and upper bound.
@@ -550,6 +808,10 @@ Number of queries that were made using TCP towards the Unbound server.
Number of queries that the Unbound server made using TCP outgoing towards
other servers.
.TP
+.I num.query.udpout
+Number of queries that the Unbound server made using UDP outgoing towards
+other servers.
+.TP
.I num.query.tls
Number of queries that were made using TLS towards the Unbound server.
These are also counted in num.query.tcp, because TLS uses TCP.
@@ -563,6 +825,10 @@ Number of queries that were made using HTTPS towards the Unbound server.
These are also counted in num.query.tcp and num.query.tls, because HTTPS
uses TLS and TCP.
.TP
+.I num.query.quic
+Number of queries that were made using QUIC towards the Unbound server.
+These are also counted in num.query.tls, because TLS is used for these queries.
+.TP
.I num.query.ipv6
Number of queries that were made using IPv6 towards the Unbound server.
.TP
@@ -585,7 +851,7 @@ ratelimiting.
.TP
.I num.query.dnscrypt.shared_secret.cachemiss
The number of dnscrypt queries that did not find a shared secret in the cache.
-The can be use to compute the shared secret hitrate.
+This can be used to compute the shared secret hitrate.
.TP
.I num.query.dnscrypt.replay
The number of dnscrypt queries that found a nonce hit in the nonce cache and
@@ -641,6 +907,18 @@ timing and protocol support information.
The number of items in the key cache. These are DNSSEC keys, one item
per delegation point, and their validation status.
.TP
+.I msg.cache.max_collisions
+The maximum number of hash table collisions in the msg cache. This is the
+number of hashes that are identical when a new element is inserted in the
+hash table. If the value is very large, like hundreds, something is wrong
+with the performance of the hash table, hash values are incorrect or malicious.
+.TP
+.I rrset.cache.max_collisions
+The maximum number of hash table collisions in the rrset cache. This is the
+number of hashes that are identical when a new element is inserted in the
+hash table. If the value is very large, like hundreds, something is wrong
+with the performance of the hash table, hash values are incorrect or malicious.
+.TP
.I dnscrypt_shared_secret.cache.count
The number of items in the shared secret cache. These are precomputed shared
secrets for a given client public key/server secret key pair. Shared secrets
@@ -680,7 +958,12 @@ Number of queries that got an answer that contained EDNS client subnet data.
.I num.query.subnet_cache
Number of queries answered from the edns client subnet cache. These are
counted as cachemiss by the main counters, but hit the client subnet
-specific cache, after getting processed by the edns client subnet module.
+specific cache after getting processed by the edns client subnet module.
+.TP
+.I num.query.cachedb
+Number of queries answered from the external cache of cachedb.
+These are counted as cachemiss by the main counters, but hit the cachedb
+external cache after getting processed by the cachedb module.
.TP
.I num.rpz.action.<rpz_action>
Number of queries answered using configured RPZ policy, per RPZ action type.
@@ -688,10 +971,10 @@ Possible actions are: nxdomain, nodata, passthru, drop, tcp\-only, local\-data,
disabled, and cname\-override.
.SH "FILES"
.TP
-.I @ub_conf_file@
+.I /var/unbound/unbound.conf
Unbound configuration file.
.TP
-.I @UNBOUND_RUN_DIR@
+.I /var/unbound
directory with private keys (unbound_server.key and unbound_control.key) and
self\-signed certificates (unbound_server.pem and unbound_control.pem).
.SH "SEE ALSO"
diff --git a/contrib/unbound/doc/unbound-control.8.in b/contrib/unbound/doc/unbound-control.8.in
index 449c279d6499..f7a497782701 100644
--- a/contrib/unbound/doc/unbound-control.8.in
+++ b/contrib/unbound/doc/unbound-control.8.in
@@ -1,4 +1,4 @@
-.TH "unbound-control" "8" "Apr 24, 2025" "NLnet Labs" "unbound 1.23.0"
+.TH "unbound-control" "8" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound-control.8 -- unbound remote control manual
.\"
diff --git a/contrib/unbound/doc/unbound-host.1 b/contrib/unbound/doc/unbound-host.1
index 94c8ca3dd569..7fba066968ec 100644
--- a/contrib/unbound/doc/unbound-host.1
+++ b/contrib/unbound/doc/unbound-host.1
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Feb 10, 2022" "NLnet Labs" "unbound 1.15.0"
+.TH "unbound\-host" "1" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
@@ -73,7 +73,7 @@ For example \-y "example.com DS 31560 5 1 1CFED84787E6E19CCF9372C1187325972FE546
.TP
.B \-D
Enables DNSSEC validation. Reads the root anchor from the default configured
-root anchor at the default location, \fI@UNBOUND_ROOTKEY_FILE@\fR.
+root anchor at the default location, \fI/var/unbound/root.key\fR.
.TP
.B \-f \fIkeyfile
Reads keys from a file. Every line has a DS or DNSKEY record, in the format
diff --git a/contrib/unbound/doc/unbound-host.1.in b/contrib/unbound/doc/unbound-host.1.in
index f56a8d4d18ed..a99bab0f7be6 100644
--- a/contrib/unbound/doc/unbound-host.1.in
+++ b/contrib/unbound/doc/unbound-host.1.in
@@ -1,4 +1,4 @@
-.TH "unbound\-host" "1" "Apr 24, 2025" "NLnet Labs" "unbound 1.23.0"
+.TH "unbound\-host" "1" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound-host.1 -- unbound DNS lookup utility
.\"
diff --git a/contrib/unbound/doc/unbound.8 b/contrib/unbound/doc/unbound.8
index 723f23238b8e..331fc47f358e 100644
--- a/contrib/unbound/doc/unbound.8
+++ b/contrib/unbound/doc/unbound.8
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Feb 10, 2022" "NLnet Labs" "unbound 1.15.0"
+.TH "unbound" "8" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.15.0.
+\- Unbound DNS validating resolver 1.23.1.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
@@ -58,7 +58,7 @@ Show the version number and commandline option help, and exit.
.TP
.B \-c\fI cfgfile
Set the config file with settings for Unbound to read instead of reading the
-file at the default location, @ub_conf_file@. The syntax is
+file at the default location, /var/unbound/unbound.conf. The syntax is
described in \fIunbound.conf\fR(5).
.TP
.B \-d
@@ -75,7 +75,7 @@ concurrently.
.TP
.B \-v
Increase verbosity. If given multiple times, more information is logged.
-This is in addition to the verbosity (if any) from the config file.
+This is added to the verbosity (if any) from the config file.
.TP
.B \-V
Show the version number and build options, and exit.
diff --git a/contrib/unbound/doc/unbound.8.in b/contrib/unbound/doc/unbound.8.in
index 33c87cde4edf..1ec4c304b70c 100644
--- a/contrib/unbound/doc/unbound.8.in
+++ b/contrib/unbound/doc/unbound.8.in
@@ -1,4 +1,4 @@
-.TH "unbound" "8" "Apr 24, 2025" "NLnet Labs" "unbound 1.23.0"
+.TH "unbound" "8" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound.8 -- unbound manual
.\"
@@ -9,7 +9,7 @@
.\"
.SH "NAME"
.B unbound
-\- Unbound DNS validating resolver 1.23.0.
+\- Unbound DNS validating resolver 1.23.1.
.SH "SYNOPSIS"
.B unbound
.RB [ \-h ]
diff --git a/contrib/unbound/doc/unbound.conf.5 b/contrib/unbound/doc/unbound.conf.5
index e1cc5c020756..af03aefb1855 100644
--- a/contrib/unbound/doc/unbound.conf.5
+++ b/contrib/unbound/doc/unbound.conf.5
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Feb 10, 2022" "NLnet Labs" "unbound 1.15.0"
+.TH "unbound.conf" "5" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
@@ -112,13 +112,21 @@ If enabled, extended statistics are printed from \fIunbound\-control\fR(8).
Default is off, because keeping track of more statistics takes time. The
counters are listed in \fIunbound\-control\fR(8).
.TP
+.B statistics\-inhibit\-zero: \fI<yes or no>
+If enabled, selected extended statistics with a value of 0 are inhibited from
+printing with \fIunbound\-control\fR(8).
+These are query types, query classes, query opcodes, answer rcodes
+(except NOERROR, FORMERR, SERVFAIL, NXDOMAIN, NOTIMPL, REFUSED) and
+RPZ actions.
+Default is on.
+.TP
.B num\-threads: \fI<number>
The number of threads to create to serve clients. Use 1 for no threading.
.TP
.B port: \fI<port number>
The port number, default 53, on which the server responds to queries.
.TP
-.B interface: \fI<ip address[@port]>
+.B interface: \fI<ip address or interface name [@port]>
Interface to use to connect to the network. This interface is listened to
for queries from clients, and answers to clients are given from it.
Can be given multiple times to work on several interfaces. If none are
@@ -129,7 +137,7 @@ A port number can be specified with @port (without spaces between
interface and port number), if not specified the default port (from
\fBport\fR) is used.
.TP
-.B ip\-address: \fI<ip address[@port]>
+.B ip\-address: \fI<ip address or interface name [@port]>
Same as interface: (for ease of compatibility with nsd.conf).
.TP
.B interface\-automatic: \fI<yes or no>
@@ -140,6 +148,15 @@ ip\-transparent you can select which (future) interfaces Unbound provides
service on. This feature is experimental, and needs support in your OS for
particular socket options. Default value is no.
.TP
+.B interface\-automatic\-ports: \fI<string>
+List the port numbers that interface-automatic listens on. If empty, the
+default port is listened on. The port numbers are separated by spaces in the
+string. Default is "".
+.IP
+This can be used to have interface automatic to deal with the interface,
+and listen on the normal port number, by including it in the list, and
+also https or dns over tls port numbers by putting them in the list as well.
+.TP
.B outgoing\-interface: \fI<ip address or ip6 netblock>
Interface to use to connect to the network. This interface is used to send
queries to authoritative servers and receive their replies. Can be given
@@ -216,7 +233,8 @@ number).
.B max\-udp\-size: \fI<number>
Maximum UDP response size (not applied to TCP response). 65536 disables the
udp response size maximum, and uses the choice from the client, always.
-Suggested values are 512 to 4096. Default is 4096.
+Suggested values are 512 to 4096. Default is 1232. The default value is the
+same as the default for edns\-buffer\-size.
.TP
.B stream\-wait\-size: \fI<number>
Number of bytes size maximum to use for waiting stream buffers. Default is
@@ -284,6 +302,40 @@ Increase this if you are behind a slow satellite link, to eg. 1128.
That would then avoid re\-querying every initial query because it times out.
Default is 376 msec.
.TP
+.B discard\-timeout: \fI<msec>
+The wait time in msec where recursion requests are dropped. This is
+to stop a large number of replies from accumulating. They receive
+no reply, the work item continues to recurse. It is nice to be a bit
+larger than serve\-expired\-client\-timeout if that is enabled.
+A value of 1900 msec is suggested. The value 0 disables it.
+Default 1900 msec.
+.TP
+.B wait\-limit: \fI<number>
+The number of replies that can wait for recursion, for an IP address.
+This makes a ratelimit per IP address of waiting replies for recursion.
+It stops very large amounts of queries waiting to be returned to one
+destination. The value 0 disables wait limits. Default is 1000.
+.TP
+.B wait\-limit\-cookie: \fI<number>
+The number of replies that can wait for recursion, for an IP address
+that sent the query with a valid DNS cookie. Since the cookie validates
+the client address, the limit can be higher. Default is 10000.
+.TP
+.B wait\-limit\-netblock: \fI<netblock> <number>
+The wait limit for the netblock. If not given the wait\-limit value is
+used. The most specific netblock is used to determine the limit. Useful for
+overriding the default for a specific, group or individual, server.
+The value -1 disables wait limits for the netblock.
+By default the loopback has a wait limit netblock of -1, it is not limited,
+because it is separated from the rest of network for spoofed packets.
+The loopback addresses 127.0.0.0/8 and ::1/128 are default at -1.
+.TP
+.B wait\-limit\-cookie\-netblock: \fI<netblock> <number>
+The wait limit for the netblock, when the query has a DNS cookie.
+If not given, the wait\-limit\-cookie value is used.
+The value -1 disables wait limits for the netblock.
+The loopback addresses 127.0.0.0/8 and ::1/128 are default at -1.
+.TP
.B so\-rcvbuf: \fI<number>
If not 0, then set the SO_RCVBUF socket option to get more buffer
space on UDP port 53 incoming queries. So that short spikes on busy
@@ -340,7 +392,7 @@ ip\-transparent option is also available.
The value of the Differentiated Services Codepoint (DSCP) in the
differentiated services field (DS) of the outgoing IP packet headers.
The field replaces the outdated IPv4 Type-Of-Service field and the
-IPV6 traffic class field.
+IPv6 traffic class field.
.TP
.B rrset\-cache\-size: \fI<number>
Number of bytes size of the RRset cache. Default is 4 megabytes.
@@ -370,6 +422,15 @@ Time to live maximum for negative responses, these have a SOA in the
authority section that is limited in time. Default is 3600.
This applies to nxdomain and nodata answers.
.TP
+.B cache\-min\-negative\-ttl: \fI<seconds>
+Time to live minimum for negative responses, these have a SOA in the
+authority section that is limited in time.
+Default is 0 (disabled).
+If this is disabled and \fBcache-min-ttl\fR is configured, it will take effect
+instead.
+In that case you can set this to 1 to honor the upstream TTL.
+This applies to nxdomain and nodata answers.
+.TP
.B infra\-host\-ttl: \fI<seconds>
Time to live for entries in the host cache. The host cache contains
roundtrip timing, lameness and EDNS support information. Default is 900.
@@ -386,6 +447,10 @@ Lower limit for dynamic retransmit timeout calculation in infrastructure
cache. Default is 50 milliseconds. Increase this value if using forwarders
needing more time to do recursive name resolution.
.TP
+.B infra\-cache\-max\-rtt: \fI<msec>
+Upper limit for dynamic retransmit timeout calculation in infrastructure
+cache. Default is 2 minutes.
+.TP
.B infra\-keep\-probing: \fI<yes or no>
If enabled the server keeps probing hosts that are down, in the one probe
at a time regime. Default is no. Hosts that are down, eg. they did
@@ -403,7 +468,7 @@ Enable or disable whether ip4 queries are answered or issued. Default is yes.
Enable or disable whether ip6 queries are answered or issued. Default is yes.
If disabled, queries are not answered on IPv6, and queries are not sent on
IPv6 to the internet nameservers. With this option you can disable the
-ipv6 transport for sending DNS traffic, it does not impact the contents of
+IPv6 transport for sending DNS traffic, it does not impact the contents of
the DNS traffic, which may have ip4 and ip6 addresses in it.
.TP
.B prefer\-ip4: \fI<yes or no>
@@ -450,6 +515,8 @@ configured value if the number of free buffers falls below 35% of the
total number configured, and finally to 0 if the number of free buffers
falls below 20% of the total number configured. A minimum timeout of
200 milliseconds is observed regardless of the option value used.
+It will be overridden by \fBedns\-tcp\-keepalive\-timeout\fR if
+\fBedns\-tcp\-keepalive\fR is enabled.
.TP
.B tcp-reuse-timeout: \fI<msec>\fR
The period Unbound will keep TCP persistent connections open to
@@ -468,20 +535,19 @@ This option defaults to 3000 milliseconds.
Enable or disable EDNS TCP Keepalive. Default is no.
.TP
.B edns-tcp-keepalive-timeout: \fI<msec>\fR
-The period Unbound will wait for a query on a TCP connection when
-EDNS TCP Keepalive is active. If this timeout expires Unbound closes
-the connection. If the client supports the EDNS TCP Keepalive option,
+Overrides \fBtcp\-idle\-timeout\fR when \fBedns\-tcp\-keepalive\fR is enabled.
+If the client supports the EDNS TCP Keepalive option,
Unbound sends the timeout value to the client to encourage it to
close the connection before the server times out.
This option defaults to 120000 milliseconds.
-When the number of free incoming TCP buffers falls below 50% of
-the total number configured, the advertised timeout is progressively
-reduced to 1% of the configured value, then to 0.2% of the configured
-value if the number of free buffers falls below 35% of the total number
-configured, and finally to 0 if the number of free buffers falls below
-20% of the total number configured.
-A minimum actual timeout of 200 milliseconds is observed regardless of the
-advertised timeout.
+.TP
+.B sock\-queue\-timeout: \fI<sec>\fR
+UDP queries that have waited in the socket buffer for a long time can be
+dropped. Default is 0, disabled. The time is set in seconds, 3 could be a
+good value to ignore old queries that likely the client does not need a reply
+for any more. This could happen if the host has not been able to service
+the queries for a while, i.e. Unbound is not running, and then is enabled
+again. It uses timestamp socket options.
.TP
.B tcp\-upstream: \fI<yes or no>
Enable or disable whether the upstream queries use TCP only for transport.
@@ -499,10 +565,14 @@ Enabled or disable whether the upstream queries use TLS only for transport.
Default is no. Useful in tunneling scenarios. The TLS contains plain DNS in
TCP wireformat. The other server must support this (see
\fBtls\-service\-key\fR).
-If you enable this, also configure a tls\-cert\-bundle or use tls\-win\-cert to
-load CA certs, otherwise the connections cannot be authenticated.
-This option enables TLS for all of them, but if you do not set this you can
-configure TLS specifically for some forward zones with forward\-tls\-upstream. And also with stub\-tls\-upstream.
+If you enable this, also configure a tls\-cert\-bundle or use tls\-win\-cert or
+tls\-system\-cert to load CA certs, otherwise the connections cannot be
+authenticated. This option enables TLS for all of them, but if you do not set
+this you can configure TLS specifically for some forward zones with
+forward\-tls\-upstream. And also with stub\-tls\-upstream.
+If the tls\-upstream option is enabled, it is for all the forwards and stubs,
+where the forward\-tls\-upstream and stub\-tls\-upstream options are ignored,
+as if they had been set to yes.
.TP
.B ssl\-upstream: \fI<yes or no>
Alternate syntax for \fBtls\-upstream\fR. If both are present in the config
@@ -551,7 +621,12 @@ Alternate syntax for \fBtls\-cert\-bundle\fR.
Add the system certificates to the cert bundle certificates for authentication.
If no cert bundle, it uses only these certificates. Default is no.
On windows this option uses the certificates from the cert store. Use
-the tls\-cert\-bundle option on other systems.
+the tls\-cert\-bundle option on other systems. On other systems, this option
+enables the system certificates.
+.TP
+.B tls\-system\-cert: \fI<yes or no>
+This the same setting as the tls\-win\-cert setting, under a different name.
+Because it is not windows specific.
.TP
.B tls\-additional\-port: \fI<portnr>
List portnumbers as tls\-additional\-port, and when interfaces are defined,
@@ -637,6 +712,29 @@ Ignored if the option is not available. Default is yes.
Disable use of TLS for the downstream DNS-over-HTTP connections. Useful for
local back end servers. Default is no.
.TP
+.B proxy\-protocol\-port: \fI<portnr>
+List port numbers as proxy\-protocol\-port, and when interfaces are defined,
+eg. with the @port suffix, as this port number, they support and expect PROXYv2.
+In this case the proxy address will only be used for the network communication
+and initial ACL (check if the proxy itself is denied/refused by configuration).
+The proxied address (if any) will then be used as the true client address and
+will be used where applicable for logging, ACL, DNSTAP, RPZ and IP ratelimiting.
+PROXYv2 is supported for UDP and TCP/TLS listening interfaces.
+There is no support for PROXYv2 on a DoH, DoQ or DNSCrypt listening interface.
+Can list multiple, each on a new statement.
+.TP
+.B quic\-port: \fI<number>
+The port number on which to provide DNS-over-QUIC service, default 853, only
+interfaces configured with that port number as @number get the QUIC service.
+The interface uses QUIC for the UDP traffic on that port number.
+.TP
+.B quic\-size: \fI<size in bytes>
+Maximum number of bytes for all QUIC buffers and data combined. Default is 8
+megabytes. A plain number is in bytes, append 'k', 'm' or 'g' for kilobytes,
+megabytes or gigabytes (1024*1024 bytes in a megabyte). New connections receive
+connection refused when the limit is exceeded. New streams are reset when the
+limit is exceeded.
+.TP
.B use\-systemd: \fI<yes or no>
Enable or disable systemd socket activation.
Default is no.
@@ -652,19 +750,25 @@ When at the limit, further connections are accepted but closed immediately.
This option is experimental at this time.
.TP
.B access\-control: \fI<IP netblock> <action>
+Specify treatment of incoming queries from their originating IP address.
+Queries can be allowed to have access to this server that gives DNS
+answers, or refused, with other actions possible. The IP address range
+can be specified as a netblock, it is possible to give the statement
+several times in order to specify the treatment of different netblocks.
+.IP
The netblock is given as an IP4 or IP6 address with /size appended for a
classless network block. The action can be \fIdeny\fR, \fIrefuse\fR,
-\fIallow\fR, \fIallow_setrd\fR, \fIallow_snoop\fR, \fIdeny_non_local\fR or
-\fIrefuse_non_local\fR.
-The most specific netblock match is used, if none match \fIdeny\fR is used.
+\fIallow\fR, \fIallow_setrd\fR, \fIallow_snoop\fR, \fIallow_cookie\fR,
+\fIdeny_non_local\fR or \fIrefuse_non_local\fR.
+The most specific netblock match is used, if none match \fIrefuse\fR is used.
The order of the access\-control statements therefore does not matter.
.IP
-The action \fIdeny\fR stops queries from hosts from that netblock.
+The \fIdeny\fR action stops queries from hosts from that netblock.
.IP
-The action \fIrefuse\fR stops queries too, but sends a DNS rcode REFUSED
+The \fIrefuse\fR action stops queries too, but sends a DNS rcode REFUSED
error message back.
.IP
-The action \fIallow\fR gives access to clients from that netblock.
+The \fIallow\fR action gives access to clients from that netblock.
It gives only access for recursion clients (which is
what almost all clients need). Nonrecursive queries are refused.
.IP
@@ -684,14 +788,27 @@ may be useful if another DNS server must forward requests for specific
zones to a resolver DNS server, but only supports stub domains and
sends queries to the resolver DNS server with the RD bit cleared.
.IP
-The action \fIallow_snoop\fR gives nonrecursive access too. This give
+The \fIallow_snoop\fR action gives nonrecursive access too. This give
both recursive and non recursive access. The name \fIallow_snoop\fR refers
to cache snooping, a technique to use nonrecursive queries to examine
the cache contents (for malicious acts). However, nonrecursive queries can
also be a valuable debugging tool (when you want to examine the cache
contents). In that case use \fIallow_snoop\fR for your administration host.
.IP
-By default only localhost is \fIallow\fRed, the rest is \fIrefuse\fRd.
+The \fIallow_cookie\fR action allows access only to UDP queries that contain a
+valid DNS Cookie as specified in RFC 7873 and RFC 9018, when the
+\fBanswer\-cookie\fR option is enabled.
+UDP queries containing only a DNS Client Cookie and no Server Cookie, or an
+invalid DNS Cookie, will receive a BADCOOKIE response including a newly
+generated DNS Cookie, allowing clients to retry with that DNS Cookie.
+The \fIallow_cookie\fR action will also accept requests over stateful
+transports, regardless of the presence of an DNS Cookie and regardless of the
+\fBanswer\-cookie\fR setting.
+UDP queries without a DNS Cookie receive REFUSED responses with the TC flag set,
+that may trigger fall back to TCP for those clients.
+.IP
+By default only localhost (the 127.0.0.0/8 IP netblock, not the loopback
+interface) is implicitly \fIallow\fRed, the rest is \fIrefuse\fRd.
The default is \fIrefuse\fRd, because that is protocol\-friendly. The DNS
protocol is not designed to handle dropped packets due to policy, and
dropping may result in (possibly excessive) retried queries.
@@ -722,6 +839,50 @@ Set redirect data for particular tag for given access control element.
.B access\-control\-view: \fI<IP netblock> <view name>
Set view for given access control element.
.TP
+.B interface\-action: \fI<ip address or interface name [@port]> <action>
+Similar to \fBaccess\-control:\fR but for interfaces.
+.IP
+The action is the same as the ones defined under \fBaccess\-control:\fR.
+Interfaces are \fIrefuse\fRd by default.
+By default only localhost (the 127.0.0.0/8 IP netblock, not the loopback
+interface) is implicitly \fIallow\fRed through the default
+\fBaccess\-control:\fR behavior.
+This also means that any attempt to use the \fBinterface-*:\fR options for the
+loopback interface will not work as they will be overridden by the implicit
+default "\fBaccess\-control:\fR 127.0.0.0/8 allow" option.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
+.B interface\-tag: \fI<ip address or interface name [@port]> <"list of tags">
+Similar to \fBaccess\-control-tag:\fR but for interfaces.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
+.B interface\-tag\-action: \fI<ip address or interface name [@port]> <tag> <action>
+Similar to \fBaccess\-control-tag-action:\fR but for interfaces.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
+.B interface\-tag\-data: \fI<ip address or interface name [@port]> <tag> <"resource record string">
+Similar to \fBaccess\-control-tag-data:\fR but for interfaces.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
+.B interface\-view: \fI<ip address or interface name [@port]> <view name>
+Similar to \fBaccess\-control-view:\fR but for interfaces.
+.IP
+Note that the interface needs to be already specified with \fBinterface:\fR
+and that any \fBaccess-control*:\fR setting overrides all \fBinterface-*:\fR
+settings for targeted clients.
+.TP
.B chroot: \fI<directory>
If chroot is enabled, you should pass the configfile (from the
commandline) as a full path from the original root. After the
@@ -745,13 +906,12 @@ outside of the chroot directory.
Additionally, Unbound may need to access /dev/urandom (for entropy)
from inside the chroot.
.IP
-If given a chroot is done to the given directory. By default chroot is
-enabled and the default is "@UNBOUND_CHROOT_DIR@". If you give "" no
-chroot is performed.
+If given a chroot is done to the given directory. The chroot is by default
+set to "/var/unbound". If you give "" no chroot is performed.
.TP
.B username: \fI<name>
If given, after binding the port the user privileges are dropped. Default is
-"@UNBOUND_USERNAME@". If you give username: "" no user change is performed.
+"unbound". If you give username: "" no user change is performed.
.IP
If this user is not capable of binding the
port, reloads (by signal HUP) will still retain the opened ports.
@@ -759,7 +919,7 @@ If you change the port number in the config file, and that new port number
requires privileges, then a reload will fail; a restart is needed.
.TP
.B directory: \fI<directory>
-Sets the working directory for the program. Default is "@UNBOUND_RUN_DIR@".
+Sets the working directory for the program. Default is "/var/unbound".
On Windows the string "%EXECUTABLE%" tries to change to the directory
that unbound.exe resides in.
If you give a server: directory: dir before include: file statements
@@ -794,6 +954,10 @@ Sets logfile lines to use a timestamp in UTC ascii. Default is no, which
prints the seconds since 1970 in brackets. No effect if using syslog, in
that case syslog formats the timestamp printed into the log files.
.TP
+.B log\-time\-iso:\fR <yes or no>
+Log time in ISO8601 format, if \fBlog\-time\-ascii:\fR yes is also set.
+Default is no.
+.TP
.B log\-queries: \fI<yes or no>
Prints one line per query to the log, with the log timestamp and IP address,
name, type and class. Default is no. Note that it takes time to print these
@@ -812,6 +976,11 @@ Prints the word 'query' and 'reply' with log\-queries and log\-replies.
This makes filtering logs easier. The default is off (for backwards
compatibility).
.TP
+.B log\-destaddr: \fI<yes or no>
+Prints the destination address, port and type in the log\-replies output.
+This disambiguates what type of traffic, eg. udp or tcp, and to what local
+port the traffic was sent to.
+.TP
.B log\-local\-actions: \fI<yes or no>
Print log lines to inform about local zone actions. These lines are like the
local\-zone type inform prints out, but they are also printed for the other
@@ -823,14 +992,14 @@ This is separate from the verbosity debug logs, much smaller, and printed
at the error level, not the info level of debug info from verbosity.
.TP
.B pidfile: \fI<filename>
-The process id is written to the file. Default is "@UNBOUND_PIDFILE@".
+The process id is written to the file. Default is "/var/unbound/unbound.pid".
So,
.nf
-kill \-HUP `cat @UNBOUND_PIDFILE@`
+kill \-HUP `cat /var/unbound/unbound.pid`
.fi
triggers a reload,
.nf
-kill \-TERM `cat @UNBOUND_PIDFILE@`
+kill \-TERM `cat /var/unbound/unbound.pid`
.fi
gracefully terminates.
.TP
@@ -890,17 +1059,22 @@ closer to that of BIND 9, while setting "\-1 \-1 \-1 \-1 \-1" gives behaviour
rumoured to be closer to that of BIND 8.
.TP
.B harden\-short\-bufsize: \fI<yes or no>
-Very small EDNS buffer sizes from queries are ignored. Default is on, as
+Very small EDNS buffer sizes from queries are ignored. Default is yes, as
described in the standard.
.TP
.B harden\-large\-queries: \fI<yes or no>
-Very large queries are ignored. Default is off, since it is legal protocol
+Very large queries are ignored. Default is no, since it is legal protocol
wise to send these, and could be necessary for operation if TSIG or EDNS
payload is very large.
.TP
.B harden\-glue: \fI<yes or no>
Will trust glue only if it is within the servers authority. Default is yes.
.TP
+.B harden\-unverified\-glue: \fI<yes or no>
+Will trust only in-zone glue. Will try to resolve all out of zone
+(\fI<unverfied>) glue. Will fallback to the original glue if unable to resolve.
+Default is no.
+.TP
.B harden\-dnssec\-stripped: \fI<yes or no>
Require DNSSEC data for trust\-anchored zones, if such data is absent,
the zone becomes bogus. If turned off, and no DNSSEC data is received
@@ -936,10 +1110,29 @@ to increase the max depth that is checked to.
.TP
.B harden\-algo\-downgrade: \fI<yes or no>
Harden against algorithm downgrade when multiple algorithms are
-advertised in the DS record. If no, allows the weakest algorithm to
-validate the zone. Default is no. Zone signers must produce zones
-that allow this feature to work, but sometimes they do not, and turning
-this option off avoids that validation failure.
+advertised in the DS record.
+This works by first choosing only the strongest DS digest type as per RFC 4509
+(Unbound treats the highest algorithm as the strongest) and then
+expecting signatures from all the advertised signing algorithms from the chosen
+DS(es) to be present.
+If no, allows any one supported algorithm to validate the zone, even if other advertised algorithms are broken.
+Default is no.
+RFC 6840 mandates that zone signers must produce zones signed with all
+advertised algorithms, but sometimes they do not.
+RFC 6840 also clarifies that this requirement is not for validators and
+validators should accept any single valid path.
+It should thus be explicitly noted that this option violates RFC 6840 for
+DNSSEC validation and should only be used to perform a signature
+completeness test to support troubleshooting.
+Using this option may break DNSSEC resolution with non-RFC6840-conforming
+signers and/or in multi-signer configurations that don't send all the
+advertised signatures.
+.TP
+.B harden\-unknown\-additional: \fI<yes or no>
+Harden against unknown records in the authority section and additional
+section. Default is no. If no, such records are copied from the upstream
+and presented to the client together with the answer. If yes, it could
+hamper future protocol developments that want to add records.
.TP
.B use\-caps\-for\-id: \fI<yes or no>
Use 0x20\-encoded random bits in the query to foil spoof attempts.
@@ -954,7 +1147,7 @@ queries. For domains that do not support 0x20 and also fail with fallback
because they keep sending different answers, like some load balancers.
Can be given multiple times, for different domains.
.TP
-.B caps\-whitelist: \fI<yes or no>
+.B caps\-whitelist: \fI<domain>
Alternate syntax for \fBcaps\-exempt\fR.
.TP
.B qname\-minimisation: \fI<yes or no>
@@ -1018,10 +1211,11 @@ IP6 ::1 and IP4 127.0.0.1/8. If no, then localhost can be used to send
queries to. Default is yes.
.TP
.B prefetch: \fI<yes or no>
-If yes, message cache elements are prefetched before they expire to
-keep the cache up to date. Default is no. Turning it on gives about
-10 percent more traffic and load on the machine, but popular items do
-not expire from the cache.
+If yes, cache hits on message cache elements that are on their last 10 percent
+of their TTL value trigger a prefetch to keep the cache up to date.
+Default is no.
+Turning it on gives about 10 percent more traffic and load on the machine, but
+popular items do not expire from the cache.
.TP
.B prefetch\-key: \fI<yes or no>
If yes, fetch the DNSKEYs earlier in the validation process, when a DS
@@ -1041,12 +1235,13 @@ from the query ID, for speed and thread safety). Default is yes.
.B minimal-responses: \fI<yes or no>
If yes, Unbound does not insert authority/additional sections into response
messages when those sections are not required. This reduces response
-size significantly, and may avoid TCP fallback for some responses.
-This may cause a slight speedup. The default is yes, even though the DNS
+size significantly, and may avoid TCP fallback for some responses which may
+cause a slight speedup. The default is yes, even though the DNS
protocol RFCs mandate these sections, and the additional content could
-be of use and save roundtrips for clients. Because they are not used,
-and the saved roundtrips are easier saved with prefetch, whilst this is
-faster.
+save roundtrips for clients that use the additional content.
+However these sections are hardly used by clients.
+Enabling prefetch can benefit clients that need the additional content
+by trying to keep that content fresh in the cache.
.TP
.B disable-dnssec-lame-check: \fI<yes or no>
If true, disables the DNSSEC lameness check in the iterator. This check
@@ -1069,9 +1264,6 @@ Adding \fIrespip\fR to the front will cause RPZ processing to be done on
all queries.
The default is "\fIvalidator iterator\fR".
.IP
-When the server is built with
-EDNS client subnet support the default is "\fIsubnetcache validator
-iterator\fR".
Most modules that need to be listed here have to be listed at the beginning
of the line. The subnetcachedb module has to be listed just before
the iterator.
@@ -1195,17 +1387,33 @@ servers that set the CD flag but cannot validate DNSSEC themselves are
the clients, and then Unbound provides them with DNSSEC protection.
The default value is "no".
.TP
+.B disable\-edns\-do: \fI<yes or no>
+Disable the EDNS DO flag in upstream requests.
+It breaks DNSSEC validation for Unbound's clients.
+This results in the upstream name servers to not include DNSSEC records in
+their replies and could be helpful for devices that cannot handle DNSSEC
+information.
+When the option is enabled, clients that set the DO flag receive no EDNS
+record in the response to indicate the lack of support to them.
+If this option is enabled but Unbound is already configured for DNSSEC
+validation (i.e., the validator module is enabled; default) this option is
+implicitly turned off with a warning as to not break DNSSEC validation in
+Unbound.
+Default is no.
+.TP
.B serve\-expired: \fI<yes or no>
If enabled, Unbound attempts to serve old responses from cache with a
-TTL of \fBserve\-expired\-reply\-ttl\fR in the response without waiting for the
-actual resolution to finish. The actual resolution answer ends up in the cache
-later on. Default is "no".
+TTL of \fBserve\-expired\-reply\-ttl\fR in the response.
+By default the expired answer will be used after a resolution attempt errored
+out or is taking more than serve\-expired\-client\-timeout to resolve.
+Default is "no".
.TP
.B serve\-expired\-ttl: \fI<seconds>
-Limit serving of expired responses to configured seconds after expiration. 0
-disables the limit. This option only applies when \fBserve\-expired\fR is
-enabled. A suggested value per RFC 8767 is between
-86400 (1 day) and 259200 (3 days). The default is 0.
+Limit serving of expired responses to configured seconds after expiration.
+0 disables the limit.
+This option only applies when \fBserve\-expired\fR is enabled.
+A suggested value per RFC 8767 is between 86400 (1 day) and 259200 (3 days).
+The default is 86400.
.TP
.B serve\-expired\-ttl\-reset: \fI<yes or no>
Set the TTL of expired records to the \fBserve\-expired\-ttl\fR value after a
@@ -1219,12 +1427,14 @@ TTL value to use when replying with expired data. If
use 30 as the value (RFC 8767). The default is 30.
.TP
.B serve\-expired\-client\-timeout: \fI<msec>
-Time in milliseconds before replying to the client with expired data. This
-essentially enables the serve-stale behavior as specified in
+Time in milliseconds before replying to the client with expired data.
+This essentially enables the serve-stale behavior as specified in
RFC 8767 that first tries to resolve before immediately
-responding with expired data. A recommended value per
-RFC 8767 is 1800. Setting this to 0 will disable this
-behavior. Default is 0.
+responding with expired data.
+Setting this to 0 will disable this behavior and instead serve the expired
+record immediately from the cache before attempting to refresh it via
+resolution.
+Default is 1800.
.TP
.B serve\-original\-ttl: \fI<yes or no>
If enabled, Unbound will always return the original TTL as received from
@@ -1313,14 +1523,24 @@ address space are not validated. This is usually required whenever
Configure a local zone. The type determines the answer to give if
there is no match from local\-data. The types are deny, refuse, static,
transparent, redirect, nodefault, typetransparent, inform, inform_deny,
-inform_redirect, always_transparent, always_refuse, always_nxdomain, always_null, noview,
-and are explained below. After that the default settings are listed. Use
-local\-data: to enter data into the local zone. Answers for local zones
-are authoritative DNS answers. By default the zones are class IN.
+inform_redirect, always_transparent, block_a, always_refuse, always_nxdomain,
+always_null, noview, and are explained below. After that the default settings
+are listed. Use local\-data: to enter data into the local zone. Answers for
+local zones are authoritative DNS answers. By default the zones are class IN.
.IP
If you need more complicated authoritative data, with referrals, wildcards,
CNAME/DNAME support, or DNSSEC authoritative service, setup a stub\-zone for
-it as detailed in the stub zone section below.
+it as detailed in the stub zone section below. A stub\-zone can be used to
+have unbound send queries to another server, an authoritative server, to
+fetch the information. With a forward\-zone, unbound sends queries to a server
+that is a recursive server to fetch the information. With an auth\-zone a
+zone can be loaded from file and used, it can be used like a local\-zone
+for users downstream, or the auth\-zone information can be used to fetch
+information from when resolving like it is an upstream server. The
+forward\-zone and auth\-zone options are described in their sections below.
+If you want to perform filtering of the information that the users can fetch,
+the local\-zone and local\-data statements allow for this, but also the
+rpz functionality can be used, described in the RPZ section.
.TP 10
\h'5'\fIdeny\fR
Do not send an answer, drop the query.
@@ -1381,6 +1601,12 @@ Ie. answer queries with fixed data and also log the machines that ask.
\h'5'\fIalways_transparent\fR
Like transparent, but ignores local data and resolves normally.
.TP 10
+\h'5'\fIblock_a\fR
+Like transparent, but ignores local data and resolves normally all query
+types excluding A. For A queries it unconditionally returns NODATA.
+Useful in cases when there is a need to explicitly force all apps to use
+IPv6 protocol and avoid any queries to IPv4.
+.TP 10
\h'5'\fIalways_refuse\fR
Like refuse, but ignores local data and refuses the query.
.TP 10
@@ -1413,6 +1639,7 @@ given zone. Use \fInodefault\fR if you use exactly that zone, if you want to
use a subzone, use \fItransparent\fR.
.P
The default zones are localhost, reverse 127.0.0.1 and ::1, the home.arpa,
+the resolver.arpa, the service.arpa,
the onion, test, invalid and the AS112 zones. The AS112 zones are reverse
DNS zones for private use and reserved IP addresses for which the servers
on the internet cannot provide correct answers. They are configured by
@@ -1468,6 +1695,24 @@ local\-data: "home.arpa. 10800 IN
SOA localhost. nobody.invalid. 1 3600 1200 604800 10800"
.fi
.TP 10
+\h'5'\fIresolver.arpa (RFC 9462)\fR
+Default content:
+.nf
+local\-zone: "resolver.arpa." static
+local\-data: "resolver.arpa. 10800 IN NS localhost."
+local\-data: "resolver.arpa. 10800 IN
+ SOA localhost. nobody.invalid. 1 3600 1200 604800 10800"
+.fi
+.TP 10
+\h'5'\fIservice.arpa (draft-ietf-dnssd-srp-25)\fR
+Default content:
+.nf
+local\-zone: "service.arpa." static
+local\-data: "service.arpa. 10800 IN NS localhost."
+local\-data: "service.arpa. 10800 IN
+ SOA localhost. nobody.invalid. 1 3600 1200 604800 10800"
+.fi
+.TP 10
\h'5'\fIonion (RFC 7686)\fR
Default content:
.nf
@@ -1591,7 +1836,7 @@ This specifies the action data for \fIresponse-ip\fR with action being
to redirect as specified by "\fIresource record string\fR". "Resource
record string" is similar to that of \fIaccess-control-tag-action\fR,
but it must be of either AAAA, A or CNAME types.
-If the IP-netblock is an IPv6/IPV4 prefix, the record
+If the IP-netblock is an IPv6/IPv4 prefix, the record
must be AAAA/A respectively, unless it is a CNAME (which can be used
for both versions of IP netblocks). If it is CNAME there must not be
more than one \fIresponse-ip-data\fR for the same IP-netblock.
@@ -1697,11 +1942,30 @@ A value of 0 will disable ratelimiting for domain names that end in this name.
.TP 5
.B ip\-ratelimit: \fI<number or 0>
Enable global ratelimiting of queries accepted per IP address.
-If 0, the default, it is disabled. This option is experimental at this time.
+This option is experimental at this time.
The ratelimit is in queries per second that are allowed. More queries are
completely dropped and will not receive a reply, SERVFAIL or otherwise.
IP ratelimiting happens before looking in the cache. This may be useful for
mitigating amplification attacks.
+Clients with a valid DNS Cookie will bypass the ratelimit.
+If a ratelimit for such clients is still needed, \fBip\-ratelimit\-cookie\fR
+can be used instead.
+Default is 0 (disabled).
+.TP 5
+.B ip\-ratelimit\-cookie: \fI<number or 0>
+Enable global ratelimiting of queries accepted per IP address with a valid DNS
+Cookie.
+This option is experimental at this time.
+The ratelimit is in queries per second that are allowed.
+More queries are completely dropped and will not receive a reply, SERVFAIL or
+otherwise.
+IP ratelimiting happens before looking in the cache.
+This option could be useful in combination with \fIallow_cookie\fR in an
+attempt to mitigate other amplification attacks than UDP reflections (e.g.,
+attacks targeting Unbound itself) which are already handled with DNS Cookies.
+If used, the value is suggested to be higher than \fBip\-ratelimit\fR e.g.,
+tenfold.
+Default is 0 (disabled).
.TP 5
.B ip\-ratelimit\-size: \fI<memory size>
Give the size of the data structure in which the current ongoing rates are
@@ -1733,9 +1997,44 @@ set ip\-ratelimit to a suspicious rate to aggressively limit unusually high
traffic. Default is off.
.TP 5
.B outbound\-msg\-retry: \fI<number>
-The number of retries Unbound will do in case of a non positive response is
-received. If a forward nameserver is used, this is the number of retries per
-forward nameserver in case of throwaway response.
+The number of retries, per upstream nameserver in a delegation, that Unbound
+will attempt in case a throwaway response is received.
+No response (timeout) contributes to the retry counter.
+If a forward/stub zone is used, this is the number of retries per nameserver in
+the zone.
+Default is 5.
+.TP 5
+.B max\-sent\-count: \fI<number>
+Hard limit on the number of outgoing queries Unbound will make while resolving
+a name, making sure large NS sets do not loop.
+Results in SERVFAIL when reached.
+It resets on query restarts (e.g., CNAME) and referrals.
+Default is 32.
+.TP 5
+.B max\-query\-restarts: \fI<number>
+Hard limit on the number of times Unbound is allowed to restart a query upon
+encountering a CNAME record.
+Results in SERVFAIL when reached.
+Changing this value needs caution as it can allow long CNAME chains to be
+accepted, where Unbound needs to verify (resolve) each link individually.
+Default is 11.
+.TP 5
+.B iter\-scrub\-ns: \fI<number>
+Limit on the number of NS records allowed in an rrset of type NS, from the
+iterator scrubber. This protects the internals of the resolver from overly
+large NS sets. Default is 20.
+.TP 5
+.B iter\-scrub\-cname: \fI<number>
+Limit on the number of CNAME, DNAME records in an answer, from the iterator
+scrubber. This protects the internals of the resolver from overly long
+indirection chains. Clips off the remainder of the reply packet at that point.
+Default is 11.
+.TP 5
+.B max\-global\-quota: \fI<number>
+Limit on the number of upstream queries sent out for an incoming query and
+its subqueries from recursion. It is not reset during the resolution. When
+it is exceeded the query is failed and the lookup process stops.
+Default is 200.
.TP 5
.B fast\-server\-permil: \fI<number>
Specify how many times out of 1000 to pick from the set of fastest servers.
@@ -1752,6 +2051,32 @@ Set the number of servers that should be used for fast server selection. Only
use the fastest specified number of servers with the fast\-server\-permil
option, that turns this on or off. The default is to use the fastest 3 servers.
.TP 5
+.B answer\-cookie: \fI<yes or no>
+If enabled, Unbound will answer to requests containing DNS Cookies as
+specified in RFC 7873 and RFC 9018.
+Default is no.
+.TP 5
+.B cookie\-secret: \fI<128 bit hex string>
+Server's secret for DNS Cookie generation.
+Useful to explicitly set for servers in an anycast deployment that need to
+share the secret in order to verify each other's Server Cookies.
+An example hex string would be "000102030405060708090a0b0c0d0e0f".
+Default is a 128 bits random secret generated at startup time.
+This option is ignored if a \fBcookie\-secret\-file\fR is
+present. In that case the secrets from that file are used in DNS Cookie
+calculations.
+.TP 5
+.B cookie\-secret\-file: \fI<filename>
+File from which the secrets are read used in DNS Cookie calculations. When this
+file exists, the secrets in this file are used and the secret specified by the
+\fBcookie-secret\fR option is ignored.
+Enable it by setting a filename, like "/usr/local/etc/unbound_cookiesecrets.txt".
+The content of this file must be manipulated with the \fBadd_cookie_secret\fR,
+\fBdrop_cookie_secret\fR and \fBactivate_cookie_secret\fR commands to the
+\fIunbound\-control\fR(8) tool. Please see that manpage on how to perform a
+safe cookie secret rollover.
+Default is "" (disabled).
+.TP 5
.B edns\-client\-string: \fI<IP netblock> <string>
Include an EDNS0 option containing configured ascii string in queries with
destination address matching the configured IP netblock. This configuration
@@ -1761,6 +2086,34 @@ option can be used multiple times. The most specific match will be used.
EDNS0 option code for the \fIedns\-client\-string\fR option, from 0 to 65535.
A value from the `Reserved for Local/Experimental` range (65001-65534) should
be used. Default is 65001.
+.TP 5
+.B ede: \fI<yes or no>
+If enabled, Unbound will respond with Extended DNS Error codes (RFC8914).
+These EDEs provide additional information with a response mainly for, but not
+limited to, DNS and DNSSEC errors.
+
+When the \fBval-log-level\fR option is also set to \fB2\fR, responses with
+Extended DNS Errors concerning DNSSEC failures will also contain a descriptive
+text message about the reason for the failure.
+Default is "no".
+.TP 5
+.B ede\-serve\-expired: \fI<yes or no>
+If enabled, Unbound will attach an Extended DNS Error (RFC8914) Code 3 - Stale
+Answer as EDNS0 option to the expired response.
+The \fBede\fR option needs to be enabled as well for this to work.
+Default is "no".
+.TP 5
+.B dns\-error\-reporting: \fI<yes or no>
+If enabled, Unbound will send DNS Error Reports (RFC9567).
+The name servers need to express support by attaching the Report-Channel EDNS0
+option on their replies specifying the reporting agent for the zone.
+Any errors encountered during resolution that would result in Unbound
+generating an Extended DNS Error (RFC8914) will be reported to the zone's
+reporting agent.
+The \fBede\fR option does not need to be enabled for this to work.
+It is advised that the \fBqname\-minimisation\fR option is also enabled to
+increase privacy on the outgoing reports.
+Default is "no".
.SS "Remote Control Options"
In the
.B remote\-control:
@@ -1776,15 +2129,17 @@ section for options. To setup the correct self\-signed certificates use the
The option is used to enable remote control, default is "no".
If turned off, the server does not listen for control commands.
.TP 5
-.B control\-interface: \fI<ip address or path>
+.B control\-interface: \fI<ip address or interface name or path>
Give IPv4 or IPv6 addresses or local socket path to listen on for
control commands.
+If an interface name is used instead of an ip address, the list of ip addresses
+on that interface are used.
By default localhost (127.0.0.1 and ::1) is listened to.
Use 0.0.0.0 and ::0 to listen to all interfaces.
If you change this and permissions have been dropped, you must restart
the server for the change to take effect.
.IP
-If you set it to an absolute path, a local socket is used. The local socket
+If you set it to an absolute path, a unix domain socket is used. This socket
does not use the certificates and keys, so those files need not be present.
To restrict access, Unbound sets permissions on the file to the user and
group that is configured, the access bits are set to allow the group members
@@ -1968,13 +2323,32 @@ useful when you want immediate changes to be visible.
Authority zones are configured with \fBauth\-zone:\fR, and each one must
have a \fBname:\fR. There can be multiple ones, by listing multiple auth\-zone clauses, each with a different name, pertaining to that part of the namespace.
The authority zone with the name closest to the name looked up is used.
-Authority zones are processed after \fBlocal\-zones\fR and before
-cache (\fBfor\-downstream:\fR \fIyes\fR), and when used in this manner
-make Unbound respond like an authority server. Authority zones are also
-processed after cache, just before going to the network to fetch
-information for recursion (\fBfor\-upstream:\fR \fIyes\fR), and when used
-in this manner provide a local copy of an authority server that speeds up
-lookups of that data.
+Authority zones can be processed on two distinct, non-exclusive, configurable
+stages.
+.LP
+With \fBfor\-downstream:\fR \fIyes\fR (default), authority zones are processed
+after \fBlocal\-zones\fR and before cache.
+When used in this manner, Unbound responds like an authority server with no
+further processing other than returning an answer from the zone contents.
+A notable example, in this case, is CNAME records which are returned verbatim
+to downstream clients without further resolution.
+.LP
+With \fBfor\-upstream:\fR \fIyes\fR (default), authority zones are processed
+after the cache lookup, just before going to the network to fetch
+information for recursion.
+When used in this manner they provide a local copy of an authority server
+that speeds up lookups for that data during resolving.
+.LP
+If both options are enabled (default), client queries for an authority zone are
+answered authoritatively from Unbound, while internal queries that require data
+from the authority zone consult the local zone data instead of going to the
+network.
+.LP
+An interesting configuration is \fBfor\-downstream:\fR \fIno\fR,
+\fBfor\-upstream:\fR \fIyes\fR that allows for hyperlocal behavior where both
+client and internal queries consult the local zone data while resolving.
+In this case, the aforementioned CNAME example will result in a thoroughly
+resolved answer.
.LP
Authority zones can be read from zonefile. And can be kept updated via
AXFR and IXFR. After update the zonefile is rewritten. The update mechanism
@@ -2027,8 +2401,8 @@ With allow\-notify you can specify additional sources of notifies.
When notified, the server attempts to first probe and then zone transfer.
If the notify is from a primary, it first attempts that primary. Otherwise
other primaries are attempted. If there are no primaries, but only urls, the
-file is downloaded when notified. The primaries from primary: statements are
-allowed notify by default.
+file is downloaded when notified. The primaries from primary: and url:
+statements are allowed notify by default.
.TP
.B fallback\-enabled: \fI<yes or no>
Default no. If enabled, Unbound falls back to querying the internet as
@@ -2151,8 +2525,8 @@ The dynamic library file to load. Repeat this option for every dynlib module
instance added to the \fBmodule\-config:\fR option.
.SS "DNS64 Module Options"
.LP
-The dns64 module must be configured in the \fBmodule\-config:\fR "dns64
-validator iterator" directive and be compiled into the daemon to be
+The dns64 module must be configured in the \fBmodule\-config:\fR directive
+e.g., "dns64 validator iterator" and be compiled into the daemon to be
enabled. These settings go in the \fBserver:\fR section.
.TP
.B dns64\-prefix: \fI<IPv6 prefix>\fR
@@ -2168,6 +2542,21 @@ List domain for which the AAAA records are ignored and the A record is
used by dns64 processing instead. Can be entered multiple times, list a
new domain for which it applies, one per line. Applies also to names
underneath the name given.
+.SS "NAT64 Operation"
+.LP
+NAT64 operation allows using a NAT64 prefix for outbound requests to IPv4-only
+servers. It is controlled by two options in the \fBserver:\fR section:
+.TP
+.B do\-nat64: \fI<yes or no>\fR
+Use NAT64 to reach IPv4-only servers.
+Consider also enabling \fBprefer\-ip6\fR to prefer native IPv6 connections to
+nameservers.
+Default no.
+.TP
+.B nat64\-prefix: \fI<IPv6 prefix>\fR
+Use a specific NAT64 prefix to reach IPv4-only servers. Defaults to using
+the prefix configured in \fBdns64\-prefix\fR, which in turn defaults to
+64:ff9b::/96. The prefix length must be one of /32, /40, /48, /56, /64 or /96.
.SS "DNSCrypt Options"
.LP
The
@@ -2237,8 +2626,8 @@ in the dnscrypt nonce cache. Close to the number of cpus is
a fairly good setting.
.SS "EDNS Client Subnet Module Options"
.LP
-The ECS module must be configured in the \fBmodule\-config:\fR "subnetcache
-validator iterator" directive and be compiled into the daemon to be
+The ECS module must be configured in the \fBmodule\-config:\fR directive e.g.,
+"subnetcache validator iterator" and be compiled into the daemon to be
enabled. These settings go in the \fBserver:\fR section.
.LP
If the destination address is allowed in the configuration Unbound will add the
@@ -2258,6 +2647,18 @@ The maximum size of the ECS cache is controlled by 'msg-cache-size' in the
configuration file. On top of that, for each query only 100 different subnets
are allowed to be stored for each address family. Exceeding that number, older
entries will be purged from cache.
+.LP
+Note that due to the nature of how EDNS Client Subnet works, by segregating the
+client IP space in order to try and have tailored responses for prefixes of
+unknown sizes, resolution and cache response performance are impacted as a
+result.
+Usage of the subnetcache module should only be enabled in installations that
+require such functionality where the resolver and the clients belong to
+different networks.
+An example of that is an open resolver installation.
+.LP
+This module does not interact with the \fBserve\-expired*\fR and
+\fBprefetch:\fR options.
.TP
.B send\-client\-subnet: \fI<IP address>\fR
Send client source address to this authority. Append /num to indicate a
@@ -2306,8 +2707,8 @@ Specifies the maximum number of subnets ECS answers kept in the ECS radix tree.
This number applies for each qname/qclass/qtype tuple. Defaults to 100.
.SS "Opportunistic IPsec Support Module Options"
.LP
-The IPsec module must be configured in the \fBmodule\-config:\fR "ipsecmod
-validator iterator" directive and be compiled into Unbound by using
+The IPsec module must be configured in the \fBmodule\-config:\fR directive
+e.g., "ipsecmod validator iterator" and be compiled into Unbound by using
\fB\-\-enable\-ipsecmod\fR to be enabled.
These settings go in the \fBserver:\fR section.
.LP
@@ -2372,12 +2773,12 @@ Allow the ipsecmod functionality for the domain so that the module logic will be
executed. Can be given multiple times, for different domains. If the option is
not specified, all domains are treated as being allowed (default).
.TP
-.B ipsecmod\-whitelist: \fI<yes or no>
+.B ipsecmod\-whitelist: \fI<domain>
Alternate syntax for \fBipsecmod\-allow\fR.
.SS "Cache DB Module Options"
.LP
-The Cache DB module must be configured in the \fBmodule\-config:\fR
-"validator cachedb iterator" directive and be compiled into the daemon
+The Cache DB module must be configured in the \fBmodule\-config:\fR directive
+e.g., "validator cachedb iterator" and be compiled into the daemon
with \fB\-\-enable\-cachedb\fR.
If this module is enabled and configured, the specified backend database
works as a second level cache:
@@ -2389,11 +2790,7 @@ If Unbound cannot even find an answer in the backend, it resolves the
query as usual, and stores the answer in the backend.
.P
This module interacts with the \fBserve\-expired\-*\fR options and will reply
-with expired data if Unbound is configured for that. Currently the use
-of \fBserve\-expired\-client\-timeout:\fR and
-\fBserve\-expired\-reply\-ttl:\fR is not consistent for data originating from
-the external cache as these will result in a reply with 0 TTL without trying to
-update the data first, ignoring the configured values.
+with expired data if Unbound is configured for that.
.P
If Unbound was built with
\fB\-\-with\-libhiredis\fR
@@ -2444,6 +2841,21 @@ operationally.
If the backend database is shared by multiple Unbound instances,
all instances must use the same secret seed.
This option defaults to "default".
+.TP
+.B cachedb-no-store: \fI<yes or no>\fR
+If the backend should be read from, but not written to. This makes this
+instance not store dns messages in the backend. But if data is available it
+is retrieved. The default is no.
+.TP
+.B cachedb-check-when-serve-expired: \fI<yes or no>\fR
+If enabled, the cachedb is checked before an expired response is returned.
+When \fBserve\-expired\fR is enabled, without \fBserve\-expired\-client\-timeout\fR, it then
+does not immediately respond with an expired response from cache, but instead
+first checks the cachedb for valid contents, and if so returns it. If the
+cachedb also has no valid contents, the serve expired response is sent.
+If also \fBserve\-expired\-client\-timeout\fR is enabled, the expired response
+is delayed until the timeout expires. Unless the lookup succeeds within the
+timeout. The default is yes.
.P
The following
.B cachedb
@@ -2460,6 +2872,16 @@ This option defaults to "127.0.0.1".
The TCP port number of the Redis server.
This option defaults to 6379.
.TP
+.B redis-server-path: \fI<unix socket path>\fR
+The unix socket path to connect to the Redis server. Off by default, and it
+can be set to "" to turn this off. Unix sockets may have better throughput
+than the IP address option.
+.TP
+.B redis-server-password: \fI"<password>"\fR
+The Redis AUTH password to use for the Redis server.
+Only relevant if Redis is configured for client password authorisation.
+Off by default, and it can be set to "" to turn this off.
+.TP
.B redis-timeout: \fI<msec>\fR
The period until when Unbound waits for a response from the Redis sever.
If this timeout expires Unbound closes the connection, treats it as
@@ -2467,6 +2889,16 @@ if the Redis server does not have the requested data, and will try to
re-establish a new connection later.
This option defaults to 100 milliseconds.
.TP
+.B redis-command-timeout: \fI<msec>\fR
+The timeout to use for Redis commands, in milliseconds.
+If 0, it uses the \fBredis\-timeout\fR value.
+The default is 0.
+.TP
+.B redis-connect-timeout: \fI<msec>\fR
+The timeout to use for Redis connection set up, in milliseconds.
+If 0, it uses the \fBredis\-timeout\fR value.
+The default is 0.
+.TP
.B redis-expire-records: \fI<yes or no>
If Redis record expiration is enabled. If yes, Unbound sets timeout for Redis
records so that Redis can evict keys that have expired automatically. If
@@ -2474,6 +2906,63 @@ Unbound is configured with \fBserve-expired\fR and \fBserve-expired-ttl\fR is 0,
this option is internally reverted to "no". Redis SETEX support is required
for this option (Redis >= 2.0.0).
This option defaults to no.
+.TP
+.B redis-logical-db: \fI<logical database index>
+The logical database in Redis to use.
+These are databases in the same Redis instance sharing the same configuration
+and persisted in the same RDB/AOF file.
+If unsure about using this option, Redis documentation
+(https://redis.io/commands/select/) suggests not to use a single Redis instance
+for multiple unrelated applications.
+The default database in Redis is 0 while other logical databases need to be
+explicitly SELECT'ed upon connecting.
+This option defaults to 0.
+.TP
+.B redis-replica-server-host: \fI<server address or name>\fR
+The IP (either v6 or v4) address or domain name of the Redis replica server.
+In general an IP address should be specified as otherwise Unbound will have to
+resolve the name of the server every time it establishes a connection
+to the server.
+This server is treated as a read-only replica server
+(https://redis.io/docs/management/replication/#read-only-replica).
+If specified, all Redis read commands will go to this replica server, while
+the write commands will go to the \fBredis-server-host\fR.
+This option defaults to "" (disabled).
+.TP
+.B redis-replica-server-port: \fI<port number>\fR
+The TCP port number of the Redis replica server.
+This option defaults to 6379.
+.TP
+.B redis-replica-server-path: \fI<unix socket path>\fR
+The unix socket path to connect to the Redis server. Off by default, and it
+can be set to "" to turn this off. Unix sockets may have better throughput
+than the IP address option.
+.TP
+.B redis-replica-server-password: \fI"<password>"\fR
+The Redis AUTH password to use for the Redis replica server.
+Only relevant if Redis is configured for client password authorisation.
+Off by default, and it can be set to "" to turn this off.
+.TP
+.B redis-replica-timeout: \fI<msec>\fR
+The period until when Unbound waits for a response from the Redis replica sever.
+If this timeout expires Unbound closes the connection, treats it as
+if the Redis replica server does not have the requested data, and will try to
+re-establish a new connection later.
+This option defaults to 100 milliseconds.
+.TP
+.B redis-replica-command-timeout: \fI<msec>\fR
+The timeout to use for Redis replica commands, in milliseconds.
+If 0, it uses the \fBredis\-replica\-timeout\fR value.
+The default is 0.
+.TP
+.B redis-replica-connect-timeout: \fI<msec>\fR
+The timeout to use for Redis replica connection set up, in milliseconds.
+If 0, it uses the \fBredis\-replica\-timeout\fR value.
+The default is 0.
+.TP
+.B redis-replica-logical-db: \fI<logical database index>
+Same as \fBredis-logical-db\fR but for the Redis replica server.
+This option defaults to 0.
.SS DNSTAP Logging Options
DNSTAP support, when compiled in by using \fB\-\-enable\-dnstap\fR, is enabled
in the \fBdnstap:\fR section.
@@ -2493,7 +2982,7 @@ yes.
.TP
.B dnstap-socket-path: \fI<file name>
Sets the unix socket file name for connecting to the server that is
-listening on that socket. Default is "@DNSTAP_SOCKET_PATH@".
+listening on that socket. Default is "".
.TP
.B dnstap-ip: \fI<IPaddress[@port]>
If "", the unix socket is used, if set with an IP address (IPv4 or IPv6)
@@ -2534,6 +3023,13 @@ Default is "".
The version to send with messages, if "" the package version is used.
Default is "".
.TP
+.B dnstap-sample-rate: \fI<number>
+The sample rate for log of messages, it logs only 1/N messages. With 0 it
+is disabled. Default is 0. This is useful in a high volume environment,
+where log functionality would otherwise not be reliable. For example 10
+would spend only 1/10th time on logging, and 100 would only spend a
+hundredth of the time on logging.
+.TP
.B dnstap-log-resolver-query-messages: \fI<yes or no>
Enable to log resolver query messages. Default is no.
These are messages from Unbound to upstream servers.
@@ -2558,9 +3054,11 @@ Enable to log forwarder response messages. Default is no.
.SS Response Policy Zone Options
.LP
Response Policy Zones are configured with \fBrpz:\fR, and each one must have a
-\fBname:\fR. There can be multiple ones, by listing multiple rpz clauses, each
-with a different name. RPZ clauses are applied in order of configuration. The
-\fBrespip\fR module needs to be added to the \fBmodule-config\fR, e.g.:
+\fBname:\fR. There can be multiple ones, by listing multiple RPZ clauses, each
+with a different name. RPZ clauses are applied in order of configuration and
+any match from an earlier RPZ zone will terminate the RPZ lookup. Note that a
+PASSTHRU action is still considered a match.
+The \fBrespip\fR module needs to be added to the \fBmodule-config\fR, e.g.:
\fBmodule-config: "respip validator iterator"\fR.
.P
QNAME, Response IP Address, nsdname, nsip and clientip triggers are supported.
@@ -2568,12 +3066,13 @@ Supported actions are: NXDOMAIN, NODATA, PASSTHRU, DROP, Local Data, tcp\-only
and drop. RPZ QNAME triggers are applied after \fBlocal\-zones\fR and
before \fBauth\-zones\fR.
.P
-The rpz zone is formatted with a SOA start record as usual. The items in
-the zone are entries, that specify what to act on (the trigger) and what to
-do (the action). The trigger to act on is recorded in the name, the action
-to do is recorded as the resource record. The names all end in the zone
-name, so you could type the trigger names without a trailing dot in the
-zonefile.
+The RPZ zone is a regular DNS zone formatted with a SOA start record as usual.
+The items in the zone are entries, that specify what to act on (the trigger)
+and what to do (the action).
+The trigger to act on is recorded in the name, the action to do is recorded as
+the resource record.
+The names all end in the zone name, so you could type the trigger names without
+a trailing dot in the zonefile.
.P
An example RPZ record, that answers example.com with NXDOMAIN
.nf
@@ -2642,8 +3141,8 @@ With allow\-notify you can specify additional sources of notifies.
When notified, the server attempts to first probe and then zone transfer.
If the notify is from a primary, it first attempts that primary. Otherwise
other primaries are attempted. If there are no primaries, but only urls, the
-file is downloaded when notified. The primaries from primary: statements are
-allowed notify by default.
+file is downloaded when notified. The primaries from primary: and url:
+statements are allowed notify by default.
.TP
.B zonefile: \fI<filename>
The filename where the zone is stored. If not given then no zonefile is used.
@@ -2673,7 +3172,7 @@ externally blocked. Default is no.
If enabled the zone is authoritatively answered for and queries for the RPZ
zone information are answered to downstream clients. This is useful for
monitoring scripts, that can then access the SOA information to check if
-the rpz information is up to date. Default is no.
+the RPZ information is up to date. Default is no.
.TP
.B tags: \fI<list of tags>
Limit the policies from this RPZ clause to clients with a matching tag. Tags
@@ -2714,18 +3213,18 @@ server:
.fi
.SH "FILES"
.TP
-.I @UNBOUND_RUN_DIR@
+.I /var/unbound
default Unbound working directory.
.TP
-.I @UNBOUND_CHROOT_DIR@
+.I /var/unbound
default
\fIchroot\fR(2)
location.
.TP
-.I @ub_conf_file@
+.I /var/unbound/unbound.conf
Unbound configuration file.
.TP
-.I @UNBOUND_PIDFILE@
+.I /var/unbound/unbound.pid
default Unbound pidfile with process ID of the running daemon.
.TP
.I unbound.log
diff --git a/contrib/unbound/doc/unbound.conf.5.in b/contrib/unbound/doc/unbound.conf.5.in
index 4484267dbc79..46af53802479 100644
--- a/contrib/unbound/doc/unbound.conf.5.in
+++ b/contrib/unbound/doc/unbound.conf.5.in
@@ -1,4 +1,4 @@
-.TH "unbound.conf" "5" "Apr 24, 2025" "NLnet Labs" "unbound 1.23.0"
+.TH "unbound.conf" "5" "Jul 16, 2025" "NLnet Labs" "unbound 1.23.1"
.\"
.\" unbound.conf.5 -- unbound.conf manual
.\"
diff --git a/contrib/unbound/edns-subnet/subnetmod.c b/contrib/unbound/edns-subnet/subnetmod.c
index ead720f34006..c5e215b8b684 100644
--- a/contrib/unbound/edns-subnet/subnetmod.c
+++ b/contrib/unbound/edns-subnet/subnetmod.c
@@ -51,6 +51,7 @@
#include "services/cache/dns.h"
#include "util/module.h"
#include "util/regional.h"
+#include "util/fptr_wlist.h"
#include "util/storage/slabhash.h"
#include "util/config_file.h"
#include "util/data/msgreply.h"
@@ -155,7 +156,8 @@ int ecs_whitelist_check(struct query_info* qinfo,
/* Cache by default, might be disabled after parsing EDNS option
* received from nameserver. */
- if(!iter_stub_fwd_no_cache(qstate, &qstate->qinfo, NULL, NULL, NULL, 0)) {
+ if(!iter_stub_fwd_no_cache(qstate, &qstate->qinfo, NULL, NULL, NULL, 0)
+ && sq->ecs_client_in.subnet_validdata) {
qstate->no_cache_store = 0;
}
@@ -522,6 +524,69 @@ common_prefix(uint8_t *a, uint8_t *b, uint8_t net)
return !memcmp(a, b, n) && ((net % 8) == 0 || a[n] == b[n]);
}
+/**
+ * Create sub request that looks up the query.
+ * @param qstate: query state
+ * @param sq: subnet qstate
+ * @return false on failure.
+ */
+static int
+generate_sub_request(struct module_qstate *qstate, struct subnet_qstate* sq)
+{
+ struct module_qstate* subq = NULL;
+ uint16_t qflags = 0; /* OPCODE QUERY, no flags */
+ int prime = 0;
+ int valrec = 0;
+ struct query_info qinf;
+ qinf.qname = qstate->qinfo.qname;
+ qinf.qname_len = qstate->qinfo.qname_len;
+ qinf.qtype = qstate->qinfo.qtype;
+ qinf.qclass = qstate->qinfo.qclass;
+ qinf.local_alias = NULL;
+
+ qflags |= BIT_RD;
+ if((qstate->query_flags & BIT_CD)!=0) {
+ qflags |= BIT_CD;
+ valrec = 1;
+ }
+
+ fptr_ok(fptr_whitelist_modenv_attach_sub(qstate->env->attach_sub));
+ if(!(*qstate->env->attach_sub)(qstate, &qinf, qflags, prime, valrec,
+ &subq)) {
+ return 0;
+ }
+ if(subq) {
+ /* It is possible to access the subquery module state. */
+ if(sq->ecs_client_in.subnet_source_mask == 0 &&
+ edns_opt_list_find(qstate->edns_opts_front_in,
+ qstate->env->cfg->client_subnet_opcode)) {
+ subq->no_cache_store = 1;
+ }
+ }
+ return 1;
+}
+
+/**
+ * Perform the query without subnet
+ * @param qstate: query state
+ * @param sq: subnet qstate
+ * @return module state
+ */
+static enum module_ext_state
+generate_lookup_without_subnet(struct module_qstate *qstate,
+ struct subnet_qstate* sq)
+{
+ verbose(VERB_ALGO, "subnetcache: make subquery to look up without subnet");
+ if(!generate_sub_request(qstate, sq)) {
+ verbose(VERB_ALGO, "Could not generate sub query");
+ qstate->return_rcode = LDNS_RCODE_FORMERR;
+ qstate->return_msg = NULL;
+ return module_finished;
+ }
+ sq->wait_subquery = 1;
+ return module_wait_subquery;
+}
+
static enum module_ext_state
eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
{
@@ -557,14 +622,7 @@ eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
* is still useful to put it in the edns subnet cache for
* when a client explicitly asks for subnet specific answer. */
verbose(VERB_QUERY, "subnetcache: Authority indicates no support");
- if(!sq->started_no_cache_store) {
- lock_rw_wrlock(&sne->biglock);
- update_cache(qstate, id);
- lock_rw_unlock(&sne->biglock);
- }
- if (sq->subnet_downstream)
- cp_edns_bad_response(c_out, c_in);
- return module_finished;
+ return generate_lookup_without_subnet(qstate, sq);
}
/* Purposefully there was no sent subnet, and there is consequently
@@ -589,14 +647,14 @@ eval_response(struct module_qstate *qstate, int id, struct subnet_qstate *sq)
!common_prefix(s_out->subnet_addr, s_in->subnet_addr,
s_out->subnet_source_mask))
{
- /* we can not accept, restart query without option */
+ /* we can not accept, perform query without option */
verbose(VERB_QUERY, "subnetcache: forged data");
s_out->subnet_validdata = 0;
(void)edns_opt_list_remove(&qstate->edns_opts_back_out,
qstate->env->cfg->client_subnet_opcode);
sq->subnet_sent = 0;
sq->subnet_sent_no_subnet = 0;
- return module_restart_next;
+ return generate_lookup_without_subnet(qstate, sq);
}
lock_rw_wrlock(&sne->biglock);
@@ -795,6 +853,9 @@ ecs_edns_back_parsed(struct module_qstate* qstate, int id,
} else if(sq->subnet_sent_no_subnet) {
/* The answer can be stored as scope 0, not in global cache. */
qstate->no_cache_store = 1;
+ } else if(sq->subnet_sent) {
+ /* Need another query to be able to store in global cache. */
+ qstate->no_cache_store = 1;
}
return 1;
@@ -812,6 +873,32 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
strmodulevent(event));
log_query_info(VERB_QUERY, "subnetcache operate: query", &qstate->qinfo);
+ if(sq && sq->wait_subquery_done) {
+ /* The subquery lookup returned. */
+ if(sq->ecs_client_in.subnet_source_mask == 0 &&
+ edns_opt_list_find(qstate->edns_opts_front_in,
+ qstate->env->cfg->client_subnet_opcode)) {
+ if(!sq->started_no_cache_store &&
+ qstate->return_msg) {
+ lock_rw_wrlock(&sne->biglock);
+ update_cache(qstate, id);
+ lock_rw_unlock(&sne->biglock);
+ }
+ if (sq->subnet_downstream)
+ cp_edns_bad_response(&sq->ecs_client_out,
+ &sq->ecs_client_in);
+ /* It is a scope zero lookup, append edns subnet
+ * option to the querier. */
+ subnet_ecs_opt_list_append(&sq->ecs_client_out,
+ &qstate->edns_opts_front_out, qstate,
+ qstate->region);
+ }
+ sq->wait_subquery_done = 0;
+ qstate->ext_state[id] = module_finished;
+ qstate->no_cache_store = sq->started_no_cache_store;
+ qstate->no_cache_lookup = sq->started_no_cache_lookup;
+ return;
+ }
if((event == module_event_new || event == module_event_pass) &&
sq == NULL) {
struct edns_option* ecs_opt;
@@ -822,6 +909,8 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
}
sq = (struct subnet_qstate*)qstate->minfo[id];
+ if(sq->wait_subquery)
+ return; /* Wait for that subquery to return */
if((ecs_opt = edns_opt_list_find(
qstate->edns_opts_front_in,
@@ -851,6 +940,14 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
/* No clients are interested in result or we could not
* parse it, we don't do client subnet */
sq->ecs_server_out.subnet_validdata = 0;
+ if(edns_opt_list_find(qstate->edns_opts_front_in,
+ qstate->env->cfg->client_subnet_opcode)) {
+ /* aggregated this deaggregated state */
+ qstate->ext_state[id] =
+ generate_lookup_without_subnet(
+ qstate, sq);
+ return;
+ }
verbose(VERB_ALGO, "subnetcache: pass to next module");
qstate->ext_state[id] = module_wait_module;
return;
@@ -891,6 +988,14 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
}
lock_rw_unlock(&sne->biglock);
}
+ if(sq->ecs_client_in.subnet_source_mask == 0 &&
+ edns_opt_list_find(qstate->edns_opts_front_in,
+ qstate->env->cfg->client_subnet_opcode)) {
+ /* client asked for resolution without edns subnet */
+ qstate->ext_state[id] = generate_lookup_without_subnet(
+ qstate, sq);
+ return;
+ }
sq->ecs_server_out.subnet_addr_fam =
sq->ecs_client_in.subnet_addr_fam;
@@ -927,6 +1032,8 @@ subnetmod_operate(struct module_qstate *qstate, enum module_ev event,
qstate->ext_state[id] = module_wait_module;
return;
}
+ if(sq && sq->wait_subquery)
+ return; /* Wait for that subquery to return */
/* Query handed back by next module, we have a 'final' answer */
if(sq && event == module_event_moddone) {
qstate->ext_state[id] = eval_response(qstate, id, sq);
@@ -975,10 +1082,27 @@ subnetmod_clear(struct module_qstate *ATTR_UNUSED(qstate),
}
void
-subnetmod_inform_super(struct module_qstate *ATTR_UNUSED(qstate),
- int ATTR_UNUSED(id), struct module_qstate *ATTR_UNUSED(super))
+subnetmod_inform_super(struct module_qstate *qstate, int id,
+ struct module_qstate *super)
{
- /* Not used */
+ struct subnet_qstate* super_sq =
+ (struct subnet_qstate*)super->minfo[id];
+ log_query_info(VERB_ALGO, "subnetcache inform_super: query",
+ &super->qinfo);
+ super_sq->wait_subquery = 0;
+ super_sq->wait_subquery_done = 1;
+ if(qstate->return_rcode != LDNS_RCODE_NOERROR ||
+ !qstate->return_msg) {
+ super->return_msg = NULL;
+ super->return_rcode = LDNS_RCODE_SERVFAIL;
+ return;
+ }
+ super->return_rcode = LDNS_RCODE_NOERROR;
+ super->return_msg = dns_copy_msg(qstate->return_msg, super->region);
+ if(!super->return_msg) {
+ log_err("subnetcache: copy response, out of memory");
+ super->return_rcode = LDNS_RCODE_SERVFAIL;
+ }
}
size_t
diff --git a/contrib/unbound/edns-subnet/subnetmod.h b/contrib/unbound/edns-subnet/subnetmod.h
index 1ff8a23ecdba..3893820fabaf 100644
--- a/contrib/unbound/edns-subnet/subnetmod.h
+++ b/contrib/unbound/edns-subnet/subnetmod.h
@@ -102,6 +102,10 @@ struct subnet_qstate {
int started_no_cache_store;
/** has the subnet module been started with no_cache_lookup? */
int started_no_cache_lookup;
+ /** Wait for subquery that has been started for nonsubnet lookup. */
+ int wait_subquery;
+ /** The subquery waited for is done. */
+ int wait_subquery_done;
};
void subnet_data_delete(void* d, void* ATTR_UNUSED(arg));
diff --git a/contrib/unbound/ltmain.sh b/contrib/unbound/ltmain.sh
index 7f3523d335c5..3e6a3db3a5a1 100644
--- a/contrib/unbound/ltmain.sh
+++ b/contrib/unbound/ltmain.sh
@@ -1,12 +1,12 @@
-#! /bin/sh
+#! /usr/bin/env sh
## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
-## by inline-source v2014-01-03.01
+## by inline-source v2019-02-19.15
-# libtool (GNU libtool) 2.4.6
+# libtool (GNU libtool) 2.5.4
# Provide generalized library-building support services.
# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-# Copyright (C) 1996-2015 Free Software Foundation, Inc.
+# Copyright (C) 1996-2019, 2021-2024 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -31,8 +31,8 @@
PROGRAM=libtool
PACKAGE=libtool
-VERSION=2.4.6
-package_revision=2.4.6
+VERSION=2.5.4
+package_revision=2.5.4
## ------ ##
@@ -64,34 +64,25 @@ package_revision=2.4.6
# libraries, which are installed to $pkgauxdir.
# Set a version string for this script.
-scriptversion=2015-01-20.17; # UTC
+scriptversion=2019-02-19.15; # UTC
# General shell script boiler plate, and helper functions.
# Written by Gary V. Vaughan, 2004
-# Copyright (C) 2004-2015 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions. There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-
-# As a special exception to the GNU General Public License, if you distribute
-# this file as part of a program or library that is built using GNU Libtool,
-# you may include this file under the same distribution terms that you use
-# for the rest of that program.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# This is free software. There is NO warranty; not even for
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors
+#
+# This file is dual licensed under the terms of the MIT license
+# <https://opensource.org/licenses/MIT>, and GPL version 2 or later
+# <https://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of
+# these licenses when using or redistributing this software or any of
+# the files within it. See the URLs above, or the file `LICENSE`
+# included in the Bootstrap distribution for the full license texts.
-# Please report bugs or propose patches to gary@gnu.org.
+# Please report bugs or propose patches to:
+# <https://github.com/gnulib-modules/bootstrap/issues>
## ------ ##
@@ -139,9 +130,12 @@ do
_G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
fi"
done
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+# These NLS vars are set unconditionally (bootstrap issue #24). Unset those
+# in case the environment reset is needed later and the $save_* variant is not
+# defined (see the code above).
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
# Make sure IFS has a sensible default
sp=' '
@@ -149,7 +143,7 @@ nl='
'
IFS="$sp $nl"
-# There are apparently some retarded systems that use ';' as a PATH separator!
+# There are apparently some systems that use ';' as a PATH separator!
if test "${PATH_SEPARATOR+set}" != set; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
@@ -159,6 +153,26 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
+# func_unset VAR
+# --------------
+# Portably unset VAR.
+# In some shells, an 'unset VAR' statement leaves a non-zero return
+# status if VAR is already unset, which might be problematic if the
+# statement is used at the end of a function (thus poisoning its return
+# value) or when 'set -e' is active (causing even a spurious abort of
+# the script in this case).
+func_unset ()
+{
+ { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; }
+}
+
+
+# Make sure CDPATH doesn't cause `cd` commands to output the target dir.
+func_unset CDPATH
+
+# Make sure ${,E,F}GREP behave sanely.
+func_unset GREP_OPTIONS
+
## ------------------------- ##
## Locate command utilities. ##
@@ -259,7 +273,7 @@ test -z "$SED" && {
rm -f conftest.in conftest.tmp conftest.nl conftest.out
}
- func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+ func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin"
rm -f conftest.sed
SED=$func_path_progs_result
}
@@ -295,7 +309,7 @@ test -z "$GREP" && {
rm -f conftest.in conftest.tmp conftest.nl conftest.out
}
- func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+ func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin"
GREP=$func_path_progs_result
}
@@ -360,6 +374,35 @@ sed_double_backslash="\
s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
s/\n//g"
+# require_check_ifs_backslash
+# ---------------------------
+# Check if we can use backslash as IFS='\' separator, and set
+# $check_ifs_backshlash_broken to ':' or 'false'.
+require_check_ifs_backslash=func_require_check_ifs_backslash
+func_require_check_ifs_backslash ()
+{
+ _G_save_IFS=$IFS
+ IFS='\'
+ _G_check_ifs_backshlash='a\\b'
+ for _G_i in $_G_check_ifs_backshlash
+ do
+ case $_G_i in
+ a)
+ check_ifs_backshlash_broken=false
+ ;;
+ '')
+ break
+ ;;
+ *)
+ check_ifs_backshlash_broken=:
+ break
+ ;;
+ esac
+ done
+ IFS=$_G_save_IFS
+ require_check_ifs_backslash=:
+}
+
## ----------------- ##
## Global variables. ##
@@ -546,7 +589,7 @@ func_require_term_colors ()
# _G_HAVE_PLUSEQ_OP
# Can be empty, in which case the shell is probed, "yes" if += is
- # useable or anything else if it does not work.
+ # usable or anything else if it does not work.
test -z "$_G_HAVE_PLUSEQ_OP" \
&& (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
&& _G_HAVE_PLUSEQ_OP=yes
@@ -580,16 +623,16 @@ if test yes = "$_G_HAVE_PLUSEQ_OP"; then
{
$debug_cmd
- func_quote_for_eval "$2"
- eval "$1+=\\ \$func_quote_for_eval_result"
+ func_quote_arg pretty "$2"
+ eval "$1+=\\ \$func_quote_arg_result"
}'
else
func_append_quoted ()
{
$debug_cmd
- func_quote_for_eval "$2"
- eval "$1=\$$1\\ \$func_quote_for_eval_result"
+ func_quote_arg pretty "$2"
+ eval "$1=\$$1\\ \$func_quote_arg_result"
}
fi
@@ -696,7 +739,7 @@ eval 'func_dirname ()
# to NONDIR_REPLACEMENT.
# value returned in "$func_dirname_result"
# basename: Compute filename of FILE.
-# value retuned in "$func_basename_result"
+# value returned in "$func_basename_result"
# For efficiency, we do not delegate to the functions above but instead
# duplicate the functionality here.
eval 'func_dirname_and_basename ()
@@ -854,7 +897,7 @@ func_mkdir_p ()
# While some portion of DIR does not yet exist...
while test ! -d "$_G_directory_path"; do
# ...make a list in topmost first order. Use a colon delimited
- # list incase some portion of path contains whitespace.
+ # list in case some portion of path contains whitespace.
_G_dir_list=$_G_directory_path:$_G_dir_list
# If the last portion added has no slash in it, the list is done
@@ -1091,85 +1134,203 @@ func_relative_path ()
}
-# func_quote_for_eval ARG...
-# --------------------------
-# Aesthetically quote ARGs to be evaled later.
-# This function returns two values:
-# i) func_quote_for_eval_result
-# double-quoted, suitable for a subsequent eval
-# ii) func_quote_for_eval_unquoted_result
-# has all characters that are still active within double
-# quotes backslashified.
-func_quote_for_eval ()
+# func_quote_portable EVAL ARG
+# ----------------------------
+# Internal function to portably implement func_quote_arg. Note that we still
+# keep attention to performance here so we as much as possible try to avoid
+# calling sed binary (so far O(N) complexity as long as func_append is O(1)).
+func_quote_portable ()
{
$debug_cmd
- func_quote_for_eval_unquoted_result=
- func_quote_for_eval_result=
- while test 0 -lt $#; do
- case $1 in
- *[\\\`\"\$]*)
- _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
- *)
- _G_unquoted_arg=$1 ;;
- esac
- if test -n "$func_quote_for_eval_unquoted_result"; then
- func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
- else
- func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+ $require_check_ifs_backslash
+
+ func_quote_portable_result=$2
+
+ # one-time-loop (easy break)
+ while true
+ do
+ if $1; then
+ func_quote_portable_result=`$ECHO "$2" | $SED \
+ -e "$sed_double_quote_subst" -e "$sed_double_backslash"`
+ break
fi
- case $_G_unquoted_arg in
- # Double-quote args containing shell metacharacters to delay
- # word splitting, command substitution and variable expansion
- # for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- _G_quoted_arg=\"$_G_unquoted_arg\"
+ # Quote for eval.
+ case $func_quote_portable_result in
+ *[\\\`\"\$]*)
+ # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string
+ # contains the shell wildcard characters.
+ case $check_ifs_backshlash_broken$func_quote_portable_result in
+ :*|*[\[\*\?]*)
+ func_quote_portable_result=`$ECHO "$func_quote_portable_result" \
+ | $SED "$sed_quote_subst"`
+ break
+ ;;
+ esac
+
+ func_quote_portable_old_IFS=$IFS
+ for _G_char in '\' '`' '"' '$'
+ do
+ # STATE($1) PREV($2) SEPARATOR($3)
+ set start "" ""
+ func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy
+ IFS=$_G_char
+ for _G_part in $func_quote_portable_result
+ do
+ case $1 in
+ quote)
+ func_append func_quote_portable_result "$3$2"
+ set quote "$_G_part" "\\$_G_char"
+ ;;
+ start)
+ set first "" ""
+ func_quote_portable_result=
+ ;;
+ first)
+ set quote "$_G_part" ""
+ ;;
+ esac
+ done
+ done
+ IFS=$func_quote_portable_old_IFS
;;
- *)
- _G_quoted_arg=$_G_unquoted_arg
- ;;
+ *) ;;
esac
-
- if test -n "$func_quote_for_eval_result"; then
- func_append func_quote_for_eval_result " $_G_quoted_arg"
- else
- func_append func_quote_for_eval_result "$_G_quoted_arg"
- fi
- shift
+ break
done
+
+ func_quote_portable_unquoted_result=$func_quote_portable_result
+ case $func_quote_portable_result in
+ # double-quote args containing shell metacharacters to delay
+ # word splitting, command substitution and variable expansion
+ # for a subsequent eval.
+ # many bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ func_quote_portable_result=\"$func_quote_portable_result\"
+ ;;
+ esac
}
-# func_quote_for_expand ARG
-# -------------------------
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
- $debug_cmd
+# func_quotefast_eval ARG
+# -----------------------
+# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG',
+# but optimized for speed. Result is stored in $func_quotefast_eval.
+if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then
+ printf -v _GL_test_printf_tilde %q '~'
+ if test '\~' = "$_GL_test_printf_tilde"; then
+ func_quotefast_eval ()
+ {
+ printf -v func_quotefast_eval_result %q "$1"
+ }
+ else
+ # Broken older Bash implementations. Make those faster too if possible.
+ func_quotefast_eval ()
+ {
+ case $1 in
+ '~'*)
+ func_quote_portable false "$1"
+ func_quotefast_eval_result=$func_quote_portable_result
+ ;;
+ *)
+ printf -v func_quotefast_eval_result %q "$1"
+ ;;
+ esac
+ }
+ fi
+else
+ func_quotefast_eval ()
+ {
+ func_quote_portable false "$1"
+ func_quotefast_eval_result=$func_quote_portable_result
+ }
+fi
- case $1 in
- *[\\\`\"]*)
- _G_arg=`$ECHO "$1" | $SED \
- -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
- *)
- _G_arg=$1 ;;
+
+# func_quote_arg MODEs ARG
+# ------------------------
+# Quote one ARG to be evaled later. MODEs argument may contain zero or more
+# specifiers listed below separated by ',' character. This function returns two
+# values:
+# i) func_quote_arg_result
+# double-quoted (when needed), suitable for a subsequent eval
+# ii) func_quote_arg_unquoted_result
+# has all characters that are still active within double
+# quotes backslashified. Available only if 'unquoted' is specified.
+#
+# Available modes:
+# ----------------
+# 'eval' (default)
+# - escape shell special characters
+# 'expand'
+# - the same as 'eval'; but do not quote variable references
+# 'pretty'
+# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might
+# be used later in func_quote to get output like: 'echo "a b"' instead
+# of 'echo a\ b'. This is slower than default on some shells.
+# 'unquoted'
+# - produce also $func_quote_arg_unquoted_result which does not contain
+# wrapping double-quotes.
+#
+# Examples for 'func_quote_arg pretty,unquoted string':
+#
+# string | *_result | *_unquoted_result
+# ------------+-----------------------+-------------------
+# " | \" | \"
+# a b | "a b" | a b
+# "a b" | "\"a b\"" | \"a b\"
+# * | "*" | *
+# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\"
+#
+# Examples for 'func_quote_arg pretty,unquoted,expand string':
+#
+# string | *_result | *_unquoted_result
+# --------------+---------------------+--------------------
+# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\"
+func_quote_arg ()
+{
+ _G_quote_expand=false
+ case ,$1, in
+ *,expand,*)
+ _G_quote_expand=:
+ ;;
esac
- case $_G_arg in
- # Double-quote args containing shell metacharacters to delay
- # word splitting and command substitution for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- _G_arg=\"$_G_arg\"
+ case ,$1, in
+ *,pretty,*|*,expand,*|*,unquoted,*)
+ func_quote_portable $_G_quote_expand "$2"
+ func_quote_arg_result=$func_quote_portable_result
+ func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result
+ ;;
+ *)
+ # Faster quote-for-eval for some shells.
+ func_quotefast_eval "$2"
+ func_quote_arg_result=$func_quotefast_eval_result
;;
esac
+}
- func_quote_for_expand_result=$_G_arg
+
+# func_quote MODEs ARGs...
+# ------------------------
+# Quote all ARGs to be evaled later and join them into single command. See
+# func_quote_arg's description for more info.
+func_quote ()
+{
+ $debug_cmd
+ _G_func_quote_mode=$1 ; shift
+ func_quote_result=
+ while test 0 -lt $#; do
+ func_quote_arg "$_G_func_quote_mode" "$1"
+ if test -n "$func_quote_result"; then
+ func_append func_quote_result " $func_quote_arg_result"
+ else
+ func_append func_quote_result "$func_quote_arg_result"
+ fi
+ shift
+ done
}
@@ -1215,8 +1376,8 @@ func_show_eval ()
_G_cmd=$1
_G_fail_exp=${2-':'}
- func_quote_for_expand "$_G_cmd"
- eval "func_notquiet $func_quote_for_expand_result"
+ func_quote_arg pretty,expand "$_G_cmd"
+ eval "func_notquiet $func_quote_arg_result"
$opt_dry_run || {
eval "$_G_cmd"
@@ -1241,8 +1402,8 @@ func_show_eval_locale ()
_G_fail_exp=${2-':'}
$opt_quiet || {
- func_quote_for_expand "$_G_cmd"
- eval "func_echo $func_quote_for_expand_result"
+ func_quote_arg expand,pretty "$_G_cmd"
+ eval "func_echo $func_quote_arg_result"
}
$opt_dry_run || {
@@ -1369,30 +1530,26 @@ func_lt_ver ()
# End:
#! /bin/sh
-# Set a version string for this script.
-scriptversion=2014-01-07.03; # UTC
-
# A portable, pluggable option parser for Bourne shell.
# Written by Gary V. Vaughan, 2010
-# Copyright (C) 2010-2015 Free Software Foundation, Inc.
-# This is free software; see the source for copying conditions. There is NO
-# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
+# This is free software. There is NO warranty; not even for
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors
+#
+# This file is dual licensed under the terms of the MIT license
+# <https://opensource.org/licenses/MIT>, and GPL version 2 or later
+# <https://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of
+# these licenses when using or redistributing this software or any of
+# the files within it. See the URLs above, or the file `LICENSE`
+# included in the Bootstrap distribution for the full license texts.
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
+# Please report bugs or propose patches to:
+# <https://github.com/gnulib-modules/bootstrap/issues>
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# Please report bugs or propose patches to gary@gnu.org.
+# Set a version string for this script.
+scriptversion=2019-02-19.15; # UTC
## ------ ##
@@ -1415,7 +1572,7 @@ scriptversion=2014-01-07.03; # UTC
#
# In order for the '--version' option to work, you will need to have a
# suitably formatted comment like the one at the top of this file
-# starting with '# Written by ' and ending with '# warranty; '.
+# starting with '# Written by ' and ending with '# Copyright'.
#
# For '-h' and '--help' to work, you will also need a one line
# description of your script's purpose in a comment directly above the
@@ -1427,7 +1584,7 @@ scriptversion=2014-01-07.03; # UTC
# to display verbose messages only when your user has specified
# '--verbose'.
#
-# After sourcing this file, you can plug processing for additional
+# After sourcing this file, you can plug in processing for additional
# options by amending the variables from the 'Configuration' section
# below, and following the instructions in the 'Option parsing'
# section further down.
@@ -1476,8 +1633,8 @@ fatal_help="Try '\$progname --help' for more information."
## ------------------------- ##
# This section contains functions for adding, removing, and running hooks
-# to the main code. A hook is just a named list of of function, that can
-# be run in order later on.
+# in the main code. A hook is just a list of function names that can be
+# run in order later on.
# func_hookable FUNC_NAME
# -----------------------
@@ -1510,7 +1667,8 @@ func_add_hook ()
# func_remove_hook FUNC_NAME HOOK_FUNC
# ------------------------------------
-# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+# Remove HOOK_FUNC from the list of hook functions to be called by
+# FUNC_NAME.
func_remove_hook ()
{
$debug_cmd
@@ -1519,10 +1677,28 @@ func_remove_hook ()
}
+# func_propagate_result FUNC_NAME_A FUNC_NAME_B
+# ---------------------------------------------
+# If the *_result variable of FUNC_NAME_A _is set_, assign its value to
+# *_result variable of FUNC_NAME_B.
+func_propagate_result ()
+{
+ $debug_cmd
+
+ func_propagate_result_result=:
+ if eval "test \"\${${1}_result+set}\" = set"
+ then
+ eval "${2}_result=\$${1}_result"
+ else
+ func_propagate_result_result=false
+ fi
+}
+
+
# func_run_hooks FUNC_NAME [ARG]...
# ---------------------------------
# Run all hook functions registered to FUNC_NAME.
-# It is assumed that the list of hook functions contains nothing more
+# It's assumed that the list of hook functions contains nothing more
# than a whitespace-delimited list of legal shell function names, and
# no effort is wasted trying to catch shell meta-characters or preserve
# whitespace.
@@ -1532,22 +1708,19 @@ func_run_hooks ()
case " $hookable_fns " in
*" $1 "*) ;;
- *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+ *) func_fatal_error "'$1' does not support hook functions." ;;
esac
eval _G_hook_fns=\$$1_hooks; shift
for _G_hook in $_G_hook_fns; do
- eval $_G_hook '"$@"'
-
- # store returned options list back into positional
- # parameters for next 'cmd' execution.
- eval _G_hook_result=\$${_G_hook}_result
- eval set dummy "$_G_hook_result"; shift
+ func_unset "${_G_hook}_result"
+ eval $_G_hook '${1+"$@"}'
+ func_propagate_result $_G_hook func_run_hooks
+ if $func_propagate_result_result; then
+ eval set dummy "$func_run_hooks_result"; shift
+ fi
done
-
- func_quote_for_eval ${1+"$@"}
- func_run_hooks_result=$func_quote_for_eval_result
}
@@ -1557,10 +1730,18 @@ func_run_hooks ()
## --------------- ##
# In order to add your own option parsing hooks, you must accept the
-# full positional parameter list in your hook function, remove any
-# options that you action, and then pass back the remaining unprocessed
-# options in '<hooked_function_name>_result', escaped suitably for
-# 'eval'. Like this:
+# full positional parameter list from your hook function. You may remove
+# or edit any options that you action, and then pass back the remaining
+# unprocessed options in '<hooked_function_name>_result', escaped
+# suitably for 'eval'.
+#
+# The '<hooked_function_name>_result' variable is automatically unset
+# before your hook gets called; for best performance, only set the
+# *_result variable when necessary (i.e. don't call the 'func_quote'
+# function unnecessarily because it can be an expensive operation on some
+# machines).
+#
+# Like this:
#
# my_options_prep ()
# {
@@ -1570,9 +1751,8 @@ func_run_hooks ()
# usage_message=$usage_message'
# -s, --silent don'\''t print informational messages
# '
-#
-# func_quote_for_eval ${1+"$@"}
-# my_options_prep_result=$func_quote_for_eval_result
+# # No change in '$@' (ignored completely by this hook). Leave
+# # my_options_prep_result variable intact.
# }
# func_add_hook func_options_prep my_options_prep
#
@@ -1581,25 +1761,36 @@ func_run_hooks ()
# {
# $debug_cmd
#
-# # Note that for efficiency, we parse as many options as we can
+# args_changed=false
+#
+# # Note that, for efficiency, we parse as many options as we can
# # recognise in a loop before passing the remainder back to the
# # caller on the first unrecognised argument we encounter.
# while test $# -gt 0; do
# opt=$1; shift
# case $opt in
-# --silent|-s) opt_silent=: ;;
+# --silent|-s) opt_silent=:
+# args_changed=:
+# ;;
# # Separate non-argument short options:
# -s*) func_split_short_opt "$_G_opt"
# set dummy "$func_split_short_opt_name" \
# "-$func_split_short_opt_arg" ${1+"$@"}
# shift
+# args_changed=:
# ;;
-# *) set dummy "$_G_opt" "$*"; shift; break ;;
+# *) # Make sure the first unrecognised option "$_G_opt"
+# # is added back to "$@" in case we need it later,
+# # if $args_changed was set to 'true'.
+# set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
# esac
# done
#
-# func_quote_for_eval ${1+"$@"}
-# my_silent_option_result=$func_quote_for_eval_result
+# # Only call 'func_quote' here if we processed at least one argument.
+# if $args_changed; then
+# func_quote eval ${1+"$@"}
+# my_silent_option_result=$func_quote_result
+# fi
# }
# func_add_hook func_parse_options my_silent_option
#
@@ -1610,17 +1801,26 @@ func_run_hooks ()
#
# $opt_silent && $opt_verbose && func_fatal_help "\
# '--silent' and '--verbose' options are mutually exclusive."
-#
-# func_quote_for_eval ${1+"$@"}
-# my_option_validation_result=$func_quote_for_eval_result
# }
# func_add_hook func_validate_options my_option_validation
#
-# You'll alse need to manually amend $usage_message to reflect the extra
+# You'll also need to manually amend $usage_message to reflect the extra
# options you parse. It's preferable to append if you can, so that
# multiple option parsing hooks can be added safely.
+# func_options_finish [ARG]...
+# ----------------------------
+# Finishing the option parse loop (call 'func_options' hooks ATM).
+func_options_finish ()
+{
+ $debug_cmd
+
+ func_run_hooks func_options ${1+"$@"}
+ func_propagate_result func_run_hooks func_options_finish
+}
+
+
# func_options [ARG]...
# ---------------------
# All the functions called inside func_options are hookable. See the
@@ -1630,17 +1830,27 @@ func_options ()
{
$debug_cmd
- func_options_prep ${1+"$@"}
- eval func_parse_options \
- ${func_options_prep_result+"$func_options_prep_result"}
- eval func_validate_options \
- ${func_parse_options_result+"$func_parse_options_result"}
+ _G_options_quoted=false
- eval func_run_hooks func_options \
- ${func_validate_options_result+"$func_validate_options_result"}
+ for my_func in options_prep parse_options validate_options options_finish
+ do
+ func_unset func_${my_func}_result
+ func_unset func_run_hooks_result
+ eval func_$my_func '${1+"$@"}'
+ func_propagate_result func_$my_func func_options
+ if $func_propagate_result_result; then
+ eval set dummy "$func_options_result"; shift
+ _G_options_quoted=:
+ fi
+ done
- # save modified positional parameters for caller
- func_options_result=$func_run_hooks_result
+ $_G_options_quoted || {
+ # As we (func_options) are top-level options-parser function and
+ # nobody quoted "$@" for us yet, we need to do it explicitly for
+ # caller.
+ func_quote eval ${1+"$@"}
+ func_options_result=$func_quote_result
+ }
}
@@ -1649,9 +1859,8 @@ func_options ()
# All initialisations required before starting the option parse loop.
# Note that when calling hook functions, we pass through the list of
# positional parameters. If a hook function modifies that list, and
-# needs to propogate that back to rest of this script, then the complete
-# modified list must be put in 'func_run_hooks_result' before
-# returning.
+# needs to propagate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before returning.
func_hookable func_options_prep
func_options_prep ()
{
@@ -1662,9 +1871,7 @@ func_options_prep ()
opt_warning_types=
func_run_hooks func_options_prep ${1+"$@"}
-
- # save modified positional parameters for caller
- func_options_prep_result=$func_run_hooks_result
+ func_propagate_result func_run_hooks func_options_prep
}
@@ -1676,25 +1883,32 @@ func_parse_options ()
{
$debug_cmd
- func_parse_options_result=
-
+ _G_parse_options_requote=false
# this just eases exit handling
while test $# -gt 0; do
# Defer to hook functions for initial option parsing, so they
# get priority in the event of reusing an option name.
func_run_hooks func_parse_options ${1+"$@"}
-
- # Adjust func_parse_options positional parameters to match
- eval set dummy "$func_run_hooks_result"; shift
+ func_propagate_result func_run_hooks func_parse_options
+ if $func_propagate_result_result; then
+ eval set dummy "$func_parse_options_result"; shift
+ # Even though we may have changed "$@", we passed the "$@" array
+ # down into the hook and it quoted it for us (because we are in
+ # this if-branch). No need to quote it again.
+ _G_parse_options_requote=false
+ fi
# Break out of the loop if we already parsed every option.
test $# -gt 0 || break
+ # We expect that one of the options parsed in this function matches
+ # and thus we remove _G_opt from "$@" and need to re-quote.
+ _G_match_parse_options=:
_G_opt=$1
shift
case $_G_opt in
--debug|-x) debug_cmd='set -x'
- func_echo "enabling shell trace mode"
+ func_echo "enabling shell trace mode" >&2
$debug_cmd
;;
@@ -1704,7 +1918,10 @@ func_parse_options ()
;;
--warnings|--warning|-W)
- test $# = 0 && func_missing_arg $_G_opt && break
+ if test $# = 0 && func_missing_arg $_G_opt; then
+ _G_parse_options_requote=:
+ break
+ fi
case " $warning_categories $1" in
*" $1 "*)
# trailing space prevents matching last $1 above
@@ -1757,15 +1974,24 @@ func_parse_options ()
shift
;;
- --) break ;;
+ --) _G_parse_options_requote=: ; break ;;
-*) func_fatal_help "unrecognised option: '$_G_opt'" ;;
- *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+ *) set dummy "$_G_opt" ${1+"$@"}; shift
+ _G_match_parse_options=false
+ break
+ ;;
esac
+
+ if $_G_match_parse_options; then
+ _G_parse_options_requote=:
+ fi
done
- # save modified positional parameters for caller
- func_quote_for_eval ${1+"$@"}
- func_parse_options_result=$func_quote_for_eval_result
+ if $_G_parse_options_requote; then
+ # save modified positional parameters for caller
+ func_quote eval ${1+"$@"}
+ func_parse_options_result=$func_quote_result
+ fi
}
@@ -1782,12 +2008,10 @@ func_validate_options ()
test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
func_run_hooks func_validate_options ${1+"$@"}
+ func_propagate_result func_run_hooks func_validate_options
# Bail if the options were screwed!
$exit_cmd $EXIT_FAILURE
-
- # save modified positional parameters for caller
- func_validate_options_result=$func_run_hooks_result
}
@@ -1843,8 +2067,8 @@ func_missing_arg ()
# func_split_equals STRING
# ------------------------
-# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
-# splitting STRING at the '=' sign.
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables
+# after splitting STRING at the '=' sign.
test -z "$_G_HAVE_XSI_OPS" \
&& (eval 'x=a/b/c;
test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
@@ -1859,8 +2083,9 @@ then
func_split_equals_lhs=${1%%=*}
func_split_equals_rhs=${1#*=}
- test "x$func_split_equals_lhs" = "x$1" \
- && func_split_equals_rhs=
+ if test "x$func_split_equals_lhs" = "x$1"; then
+ func_split_equals_rhs=
+ fi
}'
else
# ...otherwise fall back to using expr, which is often a shell builtin.
@@ -1870,7 +2095,7 @@ else
func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
func_split_equals_rhs=
- test "x$func_split_equals_lhs" = "x$1" \
+ test "x$func_split_equals_lhs=" = "x$1" \
|| func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
}
fi #func_split_equals
@@ -1896,7 +2121,7 @@ else
{
$debug_cmd
- func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+ func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'`
func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
}
fi #func_split_short_opt
@@ -1938,31 +2163,44 @@ func_usage_message ()
# func_version
# ------------
# Echo version message to standard output and exit.
+# The version message is extracted from the calling file's header
+# comments, with leading '# ' stripped:
+# 1. First display the progname and version
+# 2. Followed by the header comment line matching /^# Written by /
+# 3. Then a blank line followed by the first following line matching
+# /^# Copyright /
+# 4. Immediately followed by any lines between the previous matches,
+# except lines preceding the intervening completely blank line.
+# For example, see the header comments of this file.
func_version ()
{
$debug_cmd
printf '%s\n' "$progname $scriptversion"
$SED -n '
- /(C)/!b go
- :more
- /\./!{
- N
- s|\n# | |
- b more
- }
- :go
- /^# Written by /,/# warranty; / {
- s|^# ||
- s|^# *$||
- s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
- p
+ /^# Written by /!b
+ s|^# ||; p; n
+
+ :fwd2blnk
+ /./ {
+ n
+ b fwd2blnk
}
- /^# Written by / {
- s|^# ||
- p
+ p; n
+
+ :holdwrnt
+ s|^# ||
+ s|^# *$||
+ /^Copyright /!{
+ /./H
+ n
+ b holdwrnt
}
- /^warranty; /q' < "$progpath"
+
+ s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+ G
+ s|\(\n\)\n*|\1|g
+ p; q' < "$progpath"
exit $?
}
@@ -1972,12 +2210,35 @@ func_version ()
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC"
# time-stamp-time-zone: "UTC"
# End:
# Set a version string.
-scriptversion='(GNU libtool) 2.4.6'
+scriptversion='(GNU libtool) 2.5.4'
+
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+ $debug_cmd
+
+ year=`date +%Y`
+
+ cat <<EOF
+$progname $scriptversion
+Copyright (C) $year Free Software Foundation, Inc.
+License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Originally written by Gordon Matzigkeit, 1996
+(See AUTHORS for complete contributor listing)
+EOF
+
+ exit $?
+}
# func_echo ARG...
@@ -2000,18 +2261,6 @@ func_echo ()
}
-# func_warning ARG...
-# -------------------
-# Libtool warnings are not categorized, so override funclib.sh
-# func_warning with this simpler definition.
-func_warning ()
-{
- $debug_cmd
-
- $warning_func ${1+"$@"}
-}
-
-
## ---------------- ##
## Options parsing. ##
## ---------------- ##
@@ -2023,19 +2272,23 @@ usage='$progpath [OPTION]... [MODE-ARG]...'
# Short help message in response to '-h'.
usage_message="Options:
- --config show all configuration variables
- --debug enable verbose shell tracing
- -n, --dry-run display commands without modifying any files
- --features display basic configuration information and exit
- --mode=MODE use operation mode MODE
- --no-warnings equivalent to '-Wnone'
- --preserve-dup-deps don't remove duplicate dependency libraries
- --quiet, --silent don't print informational messages
- --tag=TAG use configuration variables from tag TAG
- -v, --verbose print more informational messages than default
- --version print version information
- -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all]
- -h, --help, --help-all print short, long, or detailed help message
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+ -n, --dry-run display commands without modifying any files
+ --features display basic configuration information
+ --finish use operation '--mode=finish'
+ --mode=MODE use operation mode MODE
+ --no-finish don't update shared library cache
+ --no-quiet, --no-silent print default informational messages
+ --no-warnings equivalent to '-Wnone'
+ --preserve-dup-deps don't remove duplicate dependency libraries
+ --quiet, --silent don't print informational messages
+ --reorder-cache=DIRS reorder shared library cache for preferred DIRS
+ --tag=TAG use configuration variables from tag TAG
+ -v, --verbose print more informational messages than default
+ --version print version information
+ -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all]
+ -h, --help, --help-all print short, long, or detailed help message
"
# Additional text appended to 'usage_message' in response to '--help'.
@@ -2068,13 +2321,13 @@ include the following information:
compiler: $LTCC
compiler flags: $LTCFLAGS
linker: $LD (gnu? $with_gnu_ld)
- version: $progname (GNU libtool) 2.4.6
+ version: $progname $scriptversion
automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
Report bugs to <bug-libtool@gnu.org>.
-GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-General help using GNU software: <http://www.gnu.org/gethelp/>."
+GNU libtool home page: <https://www.gnu.org/software/libtool/>.
+General help using GNU software: <https://www.gnu.org/gethelp/>."
exit 0
}
@@ -2264,12 +2517,17 @@ libtool_options_prep ()
opt_dry_run=false
opt_help=false
opt_mode=
+ opt_reorder_cache=false
opt_preserve_dup_deps=false
opt_quiet=false
+ opt_finishing=true
+ opt_warning=
nonopt=
preserve_args=
+ _G_rc_lt_options_prep=:
+
# Shorthand for --mode=foo, only valid as the first argument
case $1 in
clean|clea|cle|cl)
@@ -2293,11 +2551,16 @@ libtool_options_prep ()
uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
shift; set dummy --mode uninstall ${1+"$@"}; shift
;;
+ *)
+ _G_rc_lt_options_prep=false
+ ;;
esac
- # Pass back the list of options.
- func_quote_for_eval ${1+"$@"}
- libtool_options_prep_result=$func_quote_for_eval_result
+ if $_G_rc_lt_options_prep; then
+ # Pass back the list of options.
+ func_quote eval ${1+"$@"}
+ libtool_options_prep_result=$func_quote_result
+ fi
}
func_add_hook func_options_prep libtool_options_prep
@@ -2309,9 +2572,12 @@ libtool_parse_options ()
{
$debug_cmd
+ _G_rc_lt_parse_options=false
+
# Perform our own loop to consume as many options as possible in
# each iteration.
while test $# -gt 0; do
+ _G_match_lt_parse_options=:
_G_opt=$1
shift
case $_G_opt in
@@ -2345,14 +2611,18 @@ libtool_parse_options ()
clean|compile|execute|finish|install|link|relink|uninstall) ;;
# Catch anything else as an error
- *) func_error "invalid argument for $_G_opt"
+ *) func_error "invalid argument '$1' for $_G_opt"
exit_cmd=exit
- break
;;
esac
shift
;;
+ --no-finish)
+ opt_finishing=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
--no-silent|--no-quiet)
opt_quiet=false
func_append preserve_args " $_G_opt"
@@ -2368,6 +2638,24 @@ libtool_parse_options ()
func_append preserve_args " $_G_opt"
;;
+ --reorder-cache)
+ opt_reorder_cache=true
+ shared_lib_dirs=$1
+ if test -n "$shared_lib_dirs"; then
+ case $1 in
+ # Must begin with /:
+ /*) ;;
+
+ # Catch anything else as an error (relative paths)
+ *) func_error "invalid argument '$1' for $_G_opt"
+ func_error "absolute paths are required for $_G_opt"
+ exit_cmd=exit
+ ;;
+ esac
+ fi
+ shift
+ ;;
+
--silent|--quiet)
opt_quiet=:
opt_verbose=false
@@ -2386,19 +2674,36 @@ libtool_parse_options ()
func_append preserve_args " $_G_opt"
;;
- # An option not handled by this hook function:
- *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+ # An option not handled by this hook function:
+ *) set dummy "$_G_opt" ${1+"$@"} ; shift
+ _G_match_lt_parse_options=false
+ break
+ ;;
esac
+ $_G_match_lt_parse_options && _G_rc_lt_parse_options=:
done
-
- # save modified positional parameters for caller
- func_quote_for_eval ${1+"$@"}
- libtool_parse_options_result=$func_quote_for_eval_result
+ if $_G_rc_lt_parse_options; then
+ # save modified positional parameters for caller
+ func_quote eval ${1+"$@"}
+ libtool_parse_options_result=$func_quote_result
+ fi
}
func_add_hook func_parse_options libtool_parse_options
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
+{
+ if $opt_warning; then
+ $debug_cmd
+ $warning_func ${1+"$@"}
+ fi
+}
+
# libtool_validate_options [ARG]...
# ---------------------------------
@@ -2415,10 +2720,10 @@ libtool_validate_options ()
# preserve --debug
test : = "$debug_cmd" || func_append preserve_args " --debug"
- case $host in
+ case $host_os in
# Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
# see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
- *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+ cygwin* | mingw* | windows* | pw32* | cegcc* | solaris2* | os2*)
# don't eliminate duplications in $postdeps and $predeps
opt_duplicate_compiler_generated_deps=:
;;
@@ -2451,8 +2756,8 @@ libtool_validate_options ()
}
# Pass back the unparsed argument list
- func_quote_for_eval ${1+"$@"}
- libtool_validate_options_result=$func_quote_for_eval_result
+ func_quote eval ${1+"$@"}
+ libtool_validate_options_result=$func_quote_result
}
func_add_hook func_validate_options libtool_validate_options
@@ -2750,7 +3055,7 @@ EOF
# func_convert_core_file_wine_to_w32 ARG
# Helper function used by file name conversion functions when $build is *nix,
-# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# and $host is mingw, windows, cygwin, or some other w32 environment. Relies on a
# correctly configured wine environment available, with the winepath program
# in $build's $PATH.
#
@@ -2782,9 +3087,10 @@ func_convert_core_file_wine_to_w32 ()
# func_convert_core_path_wine_to_w32 ARG
# Helper function used by path conversion functions when $build is *nix, and
-# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
-# configured wine environment available, with the winepath program in $build's
-# $PATH. Assumes ARG has no leading or trailing path separator characters.
+# $host is mingw, windows, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH. Assumes ARG has no leading or trailing path separator
+# characters.
#
# ARG is path to be converted from $build format to win32.
# Result is available in $func_convert_core_path_wine_to_w32_result.
@@ -2927,6 +3233,15 @@ func_convert_path_front_back_pathsep ()
# end func_convert_path_front_back_pathsep
+# func_convert_delimited_path PATH ORIG_DELIMITER NEW_DELIMITER
+# Replaces a delimiter for a given path.
+func_convert_delimited_path ()
+{
+ converted_path=`$ECHO "$1" | $SED "s#$2#$3#g"`
+}
+# end func_convert_delimited_path
+
+
##################################################
# $build to $host FILE NAME CONVERSION FUNCTIONS #
##################################################
@@ -3261,6 +3576,65 @@ func_dll_def_p ()
}
+# func_reorder_shared_lib_cache DIRS
+# Reorder the shared library cache by unconfiguring previous shared library cache
+# and configuring preferred search directories before previous search directories.
+# Previous shared library cache: /usr/lib /usr/local/lib
+# Preferred search directories: /tmp/testing
+# Reordered shared library cache: /tmp/testing /usr/lib /usr/local/lib
+func_reorder_shared_lib_cache ()
+{
+ $debug_cmd
+
+ case $host_os in
+ openbsd*)
+ get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"`
+ func_convert_delimited_path "$get_search_directories" ':' '\ '
+ save_search_directories=$converted_path
+ func_convert_delimited_path "$1" ':' '\ '
+
+ # Ensure directories exist
+ for dir in $converted_path; do
+ # Ensure each directory is an absolute path
+ case $dir in
+ /*) ;;
+ *) func_error "Directory '$dir' is not an absolute path"
+ exit $EXIT_FAILURE ;;
+ esac
+ # Ensure no trailing slashes
+ func_stripname '' '/' "$dir"
+ dir=$func_stripname_result
+ if test -d "$dir"; then
+ if test -n "$preferred_search_directories"; then
+ preferred_search_directories="$preferred_search_directories $dir"
+ else
+ preferred_search_directories=$dir
+ fi
+ else
+ func_error "Directory '$dir' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ done
+
+ PATH="$PATH:/sbin" ldconfig -U $save_search_directories
+ PATH="$PATH:/sbin" ldconfig -m $preferred_search_directories $save_search_directories
+ get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"`
+ func_convert_delimited_path "$get_search_directories" ':' '\ '
+ reordered_search_directories=$converted_path
+
+ $ECHO "Original: $save_search_directories"
+ $ECHO "Reordered: $reordered_search_directories"
+ exit $EXIT_SUCCESS
+ ;;
+ *)
+ func_error "--reorder-cache is not supported for host_os=$host_os."
+ exit $EXIT_FAILURE
+ ;;
+ esac
+}
+# end func_reorder_shared_lib_cache
+
+
# func_mode_compile arg...
func_mode_compile ()
{
@@ -3418,8 +3792,8 @@ func_mode_compile ()
esac
done
- func_quote_for_eval "$libobj"
- test "X$libobj" != "X$func_quote_for_eval_result" \
+ func_quote_arg pretty "$libobj"
+ test "X$libobj" != "X$func_quote_arg_result" \
&& $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
&& func_warning "libobj name '$libobj' may not contain shell special characters."
func_dirname_and_basename "$obj" "/" ""
@@ -3439,7 +3813,7 @@ func_mode_compile ()
# On Cygwin there's no "real" PIC flag so we must build both object types
case $host_os in
- cygwin* | mingw* | pw32* | os2* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | os2* | cegcc*)
pic_mode=default
;;
esac
@@ -3492,8 +3866,8 @@ compiler."
func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
srcfile=$func_to_tool_file_result
- func_quote_for_eval "$srcfile"
- qsrcfile=$func_quote_for_eval_result
+ func_quote_arg pretty "$srcfile"
+ qsrcfile=$func_quote_arg_result
# Only build a PIC object if we are building libtool libraries.
if test yes = "$build_libtool_libs"; then
@@ -3648,7 +4022,8 @@ This mode accepts the following additional options:
-prefer-non-pic try to build non-PIC objects only
-shared do not build a '.o' file suitable for static linking
-static only build a '.o' file suitable for static linking
- -Wc,FLAG pass FLAG directly to the compiler
+ -Wc,FLAG
+ -Xcompiler FLAG pass FLAG directly to the compiler
COMPILE-COMMAND is a command to be used in creating a 'standard' object file
from the given SOURCEFILE.
@@ -3754,6 +4129,8 @@ The following components of LINK-COMMAND are treated specially:
-weak LIBNAME declare that the target provides the LIBNAME interface
-Wc,FLAG
-Xcompiler FLAG pass linker-specific FLAG directly to the compiler
+ -Wa,FLAG
+ -Xassembler FLAG pass linker-specific FLAG directly to the assembler
-Wl,FLAG
-Xlinker FLAG pass linker-specific FLAG directly to the linker
-XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
@@ -3830,6 +4207,12 @@ if $opt_help; then
fi
+# If option '--reorder-cache', reorder the shared library cache and exit.
+if $opt_reorder_cache; then
+ func_reorder_shared_lib_cache $shared_lib_dirs
+fi
+
+
# func_mode_execute arg...
func_mode_execute ()
{
@@ -4014,7 +4397,7 @@ func_mode_finish ()
fi
fi
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs" && $opt_finishing; then
for libdir in $libdirs; do
if test -n "$finish_cmds"; then
# Do each command in the finish commands.
@@ -4039,6 +4422,12 @@ func_mode_finish ()
for libdir in $libdirs; do
$ECHO " $libdir"
done
+ if test "false" = "$opt_finishing"; then
+ echo
+ echo "NOTE: finish_cmds were not executed during testing, so you must"
+ echo "manually run ldconfig to add a given test directory, LIBDIR, to"
+ echo "the search path for generated executables."
+ fi
echo
echo "If you ever happen to want to link against installed libraries"
echo "in a given directory, LIBDIR, you must either use libtool, and"
@@ -4096,8 +4485,8 @@ func_mode_install ()
case $nonopt in *shtool*) :;; *) false;; esac
then
# Aesthetically quote it.
- func_quote_for_eval "$nonopt"
- install_prog="$func_quote_for_eval_result "
+ func_quote_arg pretty "$nonopt"
+ install_prog="$func_quote_arg_result "
arg=$1
shift
else
@@ -4107,8 +4496,8 @@ func_mode_install ()
# The real first argument should be the name of the installation program.
# Aesthetically quote it.
- func_quote_for_eval "$arg"
- func_append install_prog "$func_quote_for_eval_result"
+ func_quote_arg pretty "$arg"
+ func_append install_prog "$func_quote_arg_result"
install_shared_prog=$install_prog
case " $install_prog " in
*[\\\ /]cp\ *) install_cp=: ;;
@@ -4165,12 +4554,12 @@ func_mode_install ()
esac
# Aesthetically quote the argument.
- func_quote_for_eval "$arg"
- func_append install_prog " $func_quote_for_eval_result"
+ func_quote_arg pretty "$arg"
+ func_append install_prog " $func_quote_arg_result"
if test -n "$arg2"; then
- func_quote_for_eval "$arg2"
+ func_quote_arg pretty "$arg2"
fi
- func_append install_shared_prog " $func_quote_for_eval_result"
+ func_append install_shared_prog " $func_quote_arg_result"
done
test -z "$install_prog" && \
@@ -4181,8 +4570,8 @@ func_mode_install ()
if test -n "$install_override_mode" && $no_mode; then
if $install_cp; then :; else
- func_quote_for_eval "$install_override_mode"
- func_append install_shared_prog " -m $func_quote_for_eval_result"
+ func_quote_arg pretty "$install_override_mode"
+ func_append install_shared_prog " -m $func_quote_arg_result"
fi
fi
@@ -4275,8 +4664,15 @@ func_mode_install ()
func_append dir "$objdir"
if test -n "$relink_command"; then
+ # Strip any trailing slash from the destination.
+ func_stripname '' '/' "$libdir"
+ destlibdir=$func_stripname_result
+
+ func_stripname '' '/' "$destdir"
+ s_destdir=$func_stripname_result
+
# Determine the prefix the user has applied to our future dir.
- inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+ inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"`
# Don't allow the user to place us outside of our expected
# location b/c this prevents finding dependent libraries that
@@ -4313,7 +4709,7 @@ func_mode_install ()
'exit $?'
tstripme=$stripme
case $host_os in
- cygwin* | mingw* | pw32* | cegcc*)
+ cygwin* | mingw* | windows* | pw32* | cegcc*)
case $realname in
*.dll.a)
tstripme=
@@ -4426,7 +4822,7 @@ func_mode_install ()
# Do a test to see if this is really a libtool program.
case $host in
- *cygwin* | *mingw*)
+ *cygwin* | *mingw* | *windows*)
if func_ltwrapper_executable_p "$file"; then
func_ltwrapper_scriptname "$file"
wrapper=$func_ltwrapper_scriptname_result
@@ -4478,8 +4874,8 @@ func_mode_install ()
relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
$opt_quiet || {
- func_quote_for_expand "$relink_command"
- eval "func_echo $func_quote_for_expand_result"
+ func_quote_arg expand,pretty "$relink_command"
+ eval "func_echo $func_quote_arg_result"
}
if eval "$relink_command"; then :
else
@@ -4654,7 +5050,7 @@ extern \"C\" {
$RM $export_symbols
eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
case $host in
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
;;
@@ -4666,7 +5062,7 @@ extern \"C\" {
eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
eval '$MV "$nlist"T "$nlist"'
case $host in
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
;;
@@ -4680,7 +5076,7 @@ extern \"C\" {
func_basename "$dlprefile"
name=$func_basename_result
case $host in
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
# if an import library, we need to obtain dlname
if func_win32_import_lib_p "$dlprefile"; then
func_tr_sh "$dlprefile"
@@ -4706,8 +5102,16 @@ extern \"C\" {
eval '$ECHO ": $name " >> "$nlist"'
fi
func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
- eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
- $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+ case $host in
+ i[3456]86-*-mingw32*)
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+ $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+ ;;
+ *)
+ eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+ $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'"
+ ;;
+ esac
}
else # not an import lib
$opt_dry_run || {
@@ -4855,7 +5259,7 @@ static const void *lt_preloaded_setup() {
# Transform the symbol file into the correct name.
symfileobj=$output_objdir/${my_outputname}S.$objext
case $host in
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
if test -f "$output_objdir/$my_outputname.def"; then
compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
@@ -4931,7 +5335,7 @@ func_win32_libid ()
*ar\ archive*) # could be an import, or static
# Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
- $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+ $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then
case $nm_interface in
"MS dumpbin")
if func_cygming_ms_implib_p "$1" ||
@@ -5198,7 +5602,7 @@ func_extract_archives ()
#
# Emit a libtool wrapper script on stdout.
# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
+# incorporate the script contents within a cygwin/mingw/windows
# wrapper executable. Must ONLY be called from within
# func_mode_link because it depends on a number of variables
# set therein.
@@ -5206,7 +5610,7 @@ func_extract_archives ()
# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
# variable will take. If 'yes', then the emitted script
# will assume that the directory where it is stored is
-# the $objdir directory. This is a cygwin/mingw-specific
+# the $objdir directory. This is a cygwin/mingw/windows-specific
# behavior.
func_emit_wrapper ()
{
@@ -5258,7 +5662,8 @@ else
if test \"\$libtool_execute_magic\" != \"$magic\"; then
file=\"\$0\""
- qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+ func_quote_arg pretty "$ECHO"
+ qECHO=$func_quote_arg_result
$ECHO "\
# A function that is used when there is no print builtin or printf.
@@ -5268,7 +5673,7 @@ func_fallback_echo ()
\$1
_LTECHO_EOF'
}
- ECHO=\"$qECHO\"
+ ECHO=$qECHO
fi
# Very basic option parsing. These options are (a) specific to
@@ -5330,7 +5735,7 @@ func_exec_program_core ()
"
case $host in
# Backslashes separate directories on plain windows
- *-*-mingw | *-*-os2* | *-cegcc*)
+ *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*)
$ECHO "\
if test -n \"\$lt_option_debug\"; then
\$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
@@ -5398,7 +5803,7 @@ func_exec_program ()
file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
done
- # Usually 'no', except on cygwin/mingw when embedded into
+ # Usually 'no', except on cygwin/mingw/windows when embedded into
# the cwrapper.
WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
@@ -5530,7 +5935,7 @@ EOF
#endif
#include <stdio.h>
#include <stdlib.h>
-#ifdef _MSC_VER
+#if defined _WIN32 && !defined __GNUC__
# include <direct.h>
# include <process.h>
# include <io.h>
@@ -5555,7 +5960,7 @@ EOF
/* declarations of non-ANSI functions */
#if defined __MINGW32__
# ifdef __STRICT_ANSI__
-int _putenv (const char *);
+_CRTIMP int __cdecl _putenv (const char *);
# endif
#elif defined __CYGWIN__
# ifdef __STRICT_ANSI__
@@ -5753,7 +6158,7 @@ main (int argc, char *argv[])
{
EOF
case $host in
- *mingw* | *cygwin* )
+ *mingw* | *windows* | *cygwin* )
# make stdout use "unix" line endings
echo " setmode(1,_O_BINARY);"
;;
@@ -5772,7 +6177,7 @@ EOF
{
/* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
namespace, but it is not one of the ones we know about and
- have already dealt with, above (inluding dump-script), then
+ have already dealt with, above (including dump-script), then
report an error. Otherwise, targets might begin to believe
they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
namespace. The first time any user complains about this, we'll
@@ -5856,7 +6261,7 @@ EOF
EOF
case $host_os in
- mingw*)
+ mingw* | windows*)
cat <<"EOF"
{
char* p;
@@ -5898,7 +6303,7 @@ EOF
EOF
case $host_os in
- mingw*)
+ mingw* | windows*)
cat <<"EOF"
/* execv doesn't actually work on mingw as expected on unix */
newargz = prepare_spawn (newargz);
@@ -6317,7 +6722,7 @@ lt_update_lib_path (const char *name, const char *value)
EOF
case $host_os in
- mingw*)
+ mingw* | windows*)
cat <<"EOF"
/* Prepares an argument vector before calling spawn().
@@ -6492,7 +6897,7 @@ func_mode_link ()
$debug_cmd
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*)
# It is impossible to link a dll without this setting, and
# we shouldn't force the makefile maintainer to figure out
# what system we are compiling for in order to pass an extra
@@ -6516,6 +6921,7 @@ func_mode_link ()
finalize_command=$nonopt
compile_rpath=
+ compile_rpath_tail=
finalize_rpath=
compile_shlibpath=
finalize_shlibpath=
@@ -6556,10 +6962,12 @@ func_mode_link ()
xrpath=
perm_rpath=
temp_rpath=
+ temp_rpath_tail=
thread_safe=no
vinfo=
vinfo_number=no
weak_libs=
+ rpath_arg=
single_module=$wl-single_module
func_infer_tag $base_compile
@@ -6611,9 +7019,9 @@ func_mode_link ()
while test "$#" -gt 0; do
arg=$1
shift
- func_quote_for_eval "$arg"
- qarg=$func_quote_for_eval_unquoted_result
- func_append libtool_args " $func_quote_for_eval_result"
+ func_quote_arg pretty,unquoted "$arg"
+ qarg=$func_quote_arg_unquoted_result
+ func_append libtool_args " $func_quote_arg_result"
# If the previous option needs an argument, assign it.
if test -n "$prev"; then
@@ -6822,7 +7230,7 @@ func_mode_link ()
case $arg in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
- func_fatal_error "only absolute run-paths are allowed"
+ func_fatal_error "argument to -rpath is not absolute: $arg"
;;
esac
if test rpath = "$prev"; then
@@ -6849,6 +7257,13 @@ func_mode_link ()
prev=
continue
;;
+ xassembler)
+ func_append compiler_flags " -Xassembler $qarg"
+ prev=
+ func_append compile_command " -Xassembler $qarg"
+ func_append finalize_command " -Xassembler $qarg"
+ continue
+ ;;
xcclinker)
func_append linker_flags " $qarg"
func_append compiler_flags " $qarg"
@@ -6991,7 +7406,7 @@ func_mode_link ()
;;
esac
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*)
testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$dir:"*) ;;
@@ -7011,7 +7426,7 @@ func_mode_link ()
-l*)
if test X-lc = "X$arg" || test X-lm = "X$arg"; then
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
# These systems don't actually have a C or math library (as such)
continue
;;
@@ -7019,7 +7434,7 @@ func_mode_link ()
# These systems don't actually have a C library (as such)
test X-lc = "X$arg" && continue
;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*)
# Do not include libc due to us having libc/libc_r.
test X-lc = "X$arg" && continue
;;
@@ -7039,7 +7454,7 @@ func_mode_link ()
esac
elif test X-lc_r = "X$arg"; then
case $host in
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*)
# Do not include libc_r directly, use -pthread flag.
continue
;;
@@ -7062,16 +7477,29 @@ func_mode_link ()
# Tru64 UNIX uses -model [arg] to determine the layout of C++
# classes, name mangling, and exception handling.
# Darwin uses the -arch flag to determine output architecture.
- -model|-arch|-isysroot|--sysroot)
+ # -q <option> for IBM XL C/C++ compiler.
+ -model|-arch|-isysroot|--sysroot|-q)
func_append compiler_flags " $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
prev=xcompiler
continue
;;
-
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199.
+ -pthread)
+ case $host in
+ *solaris2*) ;;
+ *)
+ case "$new_inherited_linker_flags " in
+ *" $arg "*) ;;
+ * ) func_append new_inherited_linker_flags " $arg" ;;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+ -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
func_append compiler_flags " $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
@@ -7094,7 +7522,7 @@ func_mode_link ()
-no-install)
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
# The PATH hackery in wrapper scripts is required on Windows
# and Darwin in order for the loader to find any dlls it needs.
func_warning "'-no-install' is ignored for $host"
@@ -7154,7 +7582,7 @@ func_mode_link ()
dir=$lt_sysroot$func_stripname_result
;;
*)
- func_fatal_error "only absolute run-paths are allowed"
+ func_fatal_error "argument ($arg) to '-R' is not an absolute path: $dir"
;;
esac
case "$xrpath " in
@@ -7211,9 +7639,9 @@ func_mode_link ()
save_ifs=$IFS; IFS=,
for flag in $args; do
IFS=$save_ifs
- func_quote_for_eval "$flag"
- func_append arg " $func_quote_for_eval_result"
- func_append compiler_flags " $func_quote_for_eval_result"
+ func_quote_arg pretty "$flag"
+ func_append arg " $func_quote_arg_result"
+ func_append compiler_flags " $func_quote_arg_result"
done
IFS=$save_ifs
func_stripname ' ' '' "$arg"
@@ -7227,16 +7655,21 @@ func_mode_link ()
save_ifs=$IFS; IFS=,
for flag in $args; do
IFS=$save_ifs
- func_quote_for_eval "$flag"
- func_append arg " $wl$func_quote_for_eval_result"
- func_append compiler_flags " $wl$func_quote_for_eval_result"
- func_append linker_flags " $func_quote_for_eval_result"
+ func_quote_arg pretty "$flag"
+ func_append arg " $wl$func_quote_arg_result"
+ func_append compiler_flags " $wl$func_quote_arg_result"
+ func_append linker_flags " $func_quote_arg_result"
done
IFS=$save_ifs
func_stripname ' ' '' "$arg"
arg=$func_stripname_result
;;
+ -Xassembler)
+ prev=xassembler
+ continue
+ ;;
+
-Xcompiler)
prev=xcompiler
continue
@@ -7254,8 +7687,8 @@ func_mode_link ()
# -msg_* for osf cc
-msg_*)
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
;;
# Flags to be passed through unchanged, with rationale:
@@ -7274,12 +7707,31 @@ func_mode_link ()
# -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
# -specs=* GCC specs files
# -stdlib=* select c++ std lib with clang
+ # -fdiagnostics-color* simply affects output
+ # -frecord-gcc-switches used to verify flags were respected
+ # -fsanitize=* Clang/GCC memory and address sanitizer
+ # -fno-sanitize* Clang/GCC memory and address sanitizer
+ # -shared-libsan Link with shared sanitizer runtimes (Clang)
+ # -static-libsan Link with static sanitizer runtimes (Clang)
+ # -no-canonical-prefixes Do not expand any symbolic links
+ # -fuse-ld=* Linker select flags for GCC
+ # -static-* direct GCC to link specific libraries statically
+ # -fcilkplus Cilk Plus language extension features for C/C++
+ # -rtlib=* select c runtime lib with clang
+ # --unwindlib=* select unwinder library with clang
+ # -f{file|debug|macro|profile}-prefix-map=* needed for lto linking
+ # -Wa,* Pass flags directly to the assembler
+ # -Werror, -Werror=* Report (specified) warnings as errors
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
- -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
- -specs=*)
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-no-canonical-prefixes| \
+ -stdlib=*|-rtlib=*|--unwindlib=*| \
+ -specs=*|-fsanitize=*|-fno-sanitize*|-shared-libsan|-static-libsan| \
+ -ffile-prefix-map=*|-fdebug-prefix-map=*|-fmacro-prefix-map=*|-fprofile-prefix-map=*| \
+ -fdiagnostics-color*|-frecord-gcc-switches| \
+ -fuse-ld=*|-static-*|-fcilkplus|-Wa,*|-Werror|-Werror=*)
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
func_append compile_command " $arg"
func_append finalize_command " $arg"
func_append compiler_flags " $arg"
@@ -7300,15 +7752,15 @@ func_mode_link ()
continue
else
# Otherwise treat like 'Some other compiler flag' below
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
fi
;;
# Some other compiler flag.
-* | +*)
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
;;
*.$objext)
@@ -7428,15 +7880,27 @@ func_mode_link ()
*)
# Unknown arguments in both finalize_command and compile_command need
# to be aesthetically quoted because they are evaled later.
- func_quote_for_eval "$arg"
- arg=$func_quote_for_eval_result
+ func_quote_arg pretty "$arg"
+ arg=$func_quote_arg_result
;;
esac # arg
# Now actually substitute the argument into the commands.
if test -n "$arg"; then
- func_append compile_command " $arg"
- func_append finalize_command " $arg"
+ if test -n "$rpath_arg"; then
+ func_append finalize_rpath " ${arg##*,}"
+ unset rpath_arg
+ else
+ case $arg in
+ -Wl,-rpath,*)
+ func_append finalize_rpath " ${arg##*,}";;
+ -Wl,-rpath)
+ rpath_arg=1;;
+ *)
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ esac
+ fi
fi
done # argument parsing loop
@@ -7607,7 +8071,7 @@ func_mode_link ()
found=false
case $deplib in
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
- |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
if test prog,link = "$linkmode,$pass"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
@@ -7784,18 +8248,15 @@ func_mode_link ()
;;
esac
if $valid_a_lib; then
- echo
- $ECHO "*** Warning: Linking the shared library $output against the"
- $ECHO "*** static library $deplib is not portable!"
+ func_warning "Linking the shared library $output against the static library $deplib is not portable!"
deplibs="$deplib $deplibs"
else
- echo
- $ECHO "*** Warning: Trying to link with static lib archive $deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because the file extensions .$libext of this argument makes me believe"
- echo "*** that it is just a static archive that I should not use here."
+ func_warning "Trying to link with static lib archive $deplib."
+ func_warning "I have the capability to make that library automatically link in when"
+ func_warning "you link to this library. But I can only do this if you have a"
+ func_warning "shared version of the library, which you do not appear to have"
+ func_warning "because the file extensions .$libext of this argument makes me believe"
+ func_warning "that it is just a static archive that I should not use here."
fi
;;
esac
@@ -7990,7 +8451,7 @@ func_mode_link ()
fi
case $host in
# special handling for platforms with PE-DLLs.
- *cygwin* | *mingw* | *cegcc* )
+ *cygwin* | *mingw* | *windows* | *cegcc* )
# Linker will automatically link against shared library if both
# static and shared are present. Therefore, ensure we extract
# symbols from the import library if a shared library is present
@@ -8090,7 +8551,10 @@ func_mode_link ()
# Make sure the rpath contains only unique directories.
case $temp_rpath: in
*"$absdir:"*) ;;
- *) func_append temp_rpath "$absdir:" ;;
+ *) case $absdir in
+ "$progdir/"*) func_append temp_rpath "$absdir:" ;;
+ *) func_append temp_rpath_tail "$absdir:" ;;
+ esac
esac
fi
@@ -8100,9 +8564,12 @@ func_mode_link ()
case " $sys_lib_dlsearch_path " in
*" $absdir "*) ;;
*)
- case "$compile_rpath " in
+ case "$compile_rpath$compile_rpath_tail " in
*" $absdir "*) ;;
- *) func_append compile_rpath " $absdir" ;;
+ *) case $absdir in
+ "$progdir/"*) func_append compile_rpath " $absdir" ;;
+ *) func_append compile_rpath_tail " $absdir" ;;
+ esac
esac
;;
esac
@@ -8133,8 +8600,8 @@ func_mode_link ()
fi
if test -n "$library_names" &&
{ test no = "$use_static_libs" || test -z "$old_library"; }; then
- case $host in
- *cygwin* | *mingw* | *cegcc* | *os2*)
+ case $host_os in
+ cygwin* | mingw* | windows* | cegcc* | os2*)
# No point in relinking DLLs because paths are not encoded
func_append notinst_deplibs " $lib"
need_relink=no
@@ -8160,11 +8627,11 @@ func_mode_link ()
if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
echo
if test prog = "$linkmode"; then
- $ECHO "*** Warning: Linking the executable $output against the loadable module"
+ func_warning "Linking the executable $output against the loadable module"
else
- $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+ func_warning "Linking the shared library $output against the loadable module"
fi
- $ECHO "*** $linklib is not portable!"
+ func_warning "$linklib is not portable!"
fi
if test lib = "$linkmode" &&
test yes = "$hardcode_into_libs"; then
@@ -8174,9 +8641,12 @@ func_mode_link ()
case " $sys_lib_dlsearch_path " in
*" $absdir "*) ;;
*)
- case "$compile_rpath " in
+ case "$compile_rpath$compile_rpath_tail " in
*" $absdir "*) ;;
- *) func_append compile_rpath " $absdir" ;;
+ *) case $absdir in
+ "$progdir/"*) func_append compile_rpath " $absdir" ;;
+ *) func_append compile_rpath_tail " $absdir" ;;
+ esac
esac
;;
esac
@@ -8203,8 +8673,8 @@ func_mode_link ()
soname=$dlname
elif test -n "$soname_spec"; then
# bleh windows
- case $host in
- *cygwin* | mingw* | *cegcc* | *os2*)
+ case $host_os in
+ cygwin* | mingw* | windows* | cegcc* | os2*)
func_arith $current - $age
major=$func_arith_result
versuffix=-$major
@@ -8251,6 +8721,7 @@ func_mode_link ()
case $host in
*-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
*-*-sysv4*uw2*) add_dir=-L$dir ;;
+ *-*-emscripten*) add_dir=-L$dir ;;
*-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
*-*-unixware7*) add_dir=-L$dir ;;
*-*-darwin* )
@@ -8259,11 +8730,10 @@ func_mode_link ()
if /usr/bin/file -L $add 2> /dev/null |
$GREP ": [^:]* bundle" >/dev/null; then
if test "X$dlopenmodule" != "X$lib"; then
- $ECHO "*** Warning: lib $linklib is a module, not a shared library"
+ func_warning "lib $linklib is a module, not a shared library"
if test -z "$old_library"; then
- echo
- echo "*** And there doesn't seem to be a static archive available"
- echo "*** The link will probably fail, sorry"
+ func_warning "And there doesn't seem to be a static archive available"
+ func_warning "The link will probably fail, sorry"
else
add=$dir/$old_library
fi
@@ -8346,7 +8816,7 @@ func_mode_link ()
test no = "$hardcode_direct_absolute"; then
add=$libdir/$linklib
elif test yes = "$hardcode_minus_L"; then
- add_dir=-L$libdir
+ add_dir=-L$lt_sysroot$libdir
add=-l$name
elif test yes = "$hardcode_shlibpath_var"; then
case :$finalize_shlibpath: in
@@ -8363,7 +8833,7 @@ func_mode_link ()
fi
else
# We cannot seem to hardcode it, guess we'll fake it.
- add_dir=-L$libdir
+ add_dir=-L$lt_sysroot$libdir
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
@@ -8403,21 +8873,19 @@ func_mode_link ()
# Just print a warning and add the library to dependency_libs so
# that the program can be linked against the static library.
- echo
- $ECHO "*** Warning: This system cannot link to static lib archive $lib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
+ func_warning "This system cannot link to static lib archive $lib."
+ func_warning "I have the capability to make that library automatically link in when"
+ func_warning "you link to this library. But I can only do this if you have a"
+ func_warning "shared version of the library, which you do not appear to have."
if test yes = "$module"; then
- echo "*** But as you try to build a module library, libtool will still create "
- echo "*** a static module, that should work as long as the dlopening application"
- echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ func_warning "But as you try to build a module library, libtool will still create "
+ func_warning "a static module, that should work as long as the dlopening application"
+ func_warning "is linked with the -dlopen flag to resolve symbols at runtime."
if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** 'nm' from GNU binutils and a full rebuild may help."
+ func_warning "However, this would only work if libtool was able to extract symbol"
+ func_warning "lists from a program, using 'nm' or equivalent, but libtool could"
+ func_warning "not find such a program. So, this module is probably useless."
+ func_warning "'nm' from GNU binutils and a full rebuild may help."
fi
if test no = "$build_old_libs"; then
build_libtool_libs=module
@@ -8540,6 +9008,10 @@ func_mode_link ()
fi # link_all_deplibs != no
fi # linkmode = lib
done # for deplib in $libs
+
+ func_append temp_rpath "$temp_rpath_tail"
+ func_append compile_rpath "$compile_rpath_tail"
+
if test link = "$pass"; then
if test prog = "$linkmode"; then
compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
@@ -8577,42 +9049,46 @@ func_mode_link ()
# Add libraries to $var in reverse order
eval tmp_libs=\"\$$var\"
new_libs=
+ # FIXME: Pedantically, this is the right thing to do, so
+ # that some nasty dependency loop isn't accidentally
+ # broken: new_libs="$deplib $new_libs"
for deplib in $tmp_libs; do
- # FIXME: Pedantically, this is the right thing to do, so
- # that some nasty dependency loop isn't accidentally
- # broken:
- #new_libs="$deplib $new_libs"
- # Pragmatically, this seems to cause very few problems in
- # practice:
- case $deplib in
- -L*) new_libs="$deplib $new_libs" ;;
- -R*) ;;
- *)
- # And here is the reason: when a library appears more
- # than once as an explicit dependence of a library, or
- # is implicitly linked in more than once by the
- # compiler, it is considered special, and multiple
- # occurrences thereof are not removed. Compare this
- # with having the same library being listed as a
- # dependency of multiple other libraries: in this case,
- # we know (pedantically, we assume) the library does not
- # need to be listed more than once, so we keep only the
- # last copy. This is not always right, but it is rare
- # enough that we require users that really mean to play
- # such unportable linking tricks to link the library
- # using -Wl,-lname, so that libtool does not consider it
- # for duplicate removal.
- case " $specialdeplibs " in
- *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ if $opt_preserve_dup_deps; then
+ new_libs="$deplib $new_libs"
+ else
+ # Pragmatically, this seems to cause very few problems in
+ # practice:
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ -R*) ;;
*)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) new_libs="$deplib $new_libs" ;;
- esac
- ;;
+ # And here is the reason: when a library appears more
+ # than once as an explicit dependence of a library, or
+ # is implicitly linked in more than once by the
+ # compiler, it is considered special, and multiple
+ # occurrences thereof are not removed. Compare this
+ # with having the same library being listed as a
+ # dependency of multiple other libraries: in this case,
+ # we know (pedantically, we assume) the library does not
+ # need to be listed more than once, so we keep only the
+ # last copy. This is not always right, but it is rare
+ # enough that we require users that really mean to play
+ # such unportable linking tricks to link the library
+ # using -Wl,-lname, so that libtool does not consider it
+ # for duplicate removal. And if not possible for portability
+ # reasons, then --preserve-dup-deps should be used.
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
esac
- ;;
- esac
+ fi
done
tmp_libs=
for deplib in $new_libs; do
@@ -8634,7 +9110,7 @@ func_mode_link ()
test CXX = "$tagname" && {
case $host_os in
linux*)
- case `$CC -V 2>&1 | sed 5q` in
+ case `$CC -V 2>&1 | $SED 5q` in
*Sun\ C*) # Sun C++ 5.9
func_suncc_cstd_abi
@@ -8744,9 +9220,7 @@ func_mode_link ()
if test pass_all != "$deplibs_check_method"; then
func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
else
- echo
- $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
- $ECHO "*** objects $objs is not portable!"
+ func_warning "Linking the shared library $output against the non-libtool objects $objs is not portable!"
func_append libobjs " $objs"
fi
fi
@@ -8807,13 +9281,13 @@ func_mode_link ()
#
case $version_type in
# correct linux to gnu/linux during the next big refactor
- darwin|freebsd-elf|linux|osf|windows|none)
+ darwin|freebsd-elf|linux|midnightbsd-elf|osf|qnx|windows|none)
func_arith $number_major + $number_minor
current=$func_arith_result
age=$number_minor
revision=$number_revision
;;
- freebsd-aout|qnx|sunos)
+ freebsd-aout|sco|sunos)
current=$number_major
revision=$number_minor
age=0
@@ -8825,6 +9299,9 @@ func_mode_link ()
revision=$number_minor
lt_irix_increment=no
;;
+ *)
+ func_fatal_configuration "$modename: unknown library version type '$version_type'"
+ ;;
esac
;;
no)
@@ -8898,7 +9375,7 @@ func_mode_link ()
versuffix=.$current.$revision
;;
- freebsd-elf)
+ freebsd-elf | midnightbsd-elf)
func_arith $current - $age
major=.$func_arith_result
versuffix=$major.$age.$revision
@@ -8960,8 +9437,9 @@ func_mode_link ()
;;
qnx)
- major=.$current
- versuffix=.$current
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=$major.$age.$revision
;;
sco)
@@ -9114,7 +9592,7 @@ func_mode_link ()
if test yes = "$build_libtool_libs"; then
if test -n "$rpath"; then
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
# these systems don't actually have a c library (as such)!
;;
*-*-rhapsody* | *-*-darwin1.[012])
@@ -9124,7 +9602,7 @@ func_mode_link ()
*-*-netbsd*)
# Don't link with libc until the a.out ld.so is fixed.
;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*)
# Do not include libc due to us having libc/libc_r.
;;
*-*-sco3.2v5* | *-*-sco5v6*)
@@ -9165,108 +9643,6 @@ func_mode_link ()
# implementing what was already the behavior.
newdeplibs=$deplibs
;;
- test_compile)
- # This code stresses the "libraries are programs" paradigm to its
- # limits. Maybe even breaks it. We compile a program, linking it
- # against the deplibs as a proxy for the library. Then we can check
- # whether they linked in statically or dynamically with ldd.
- $opt_dry_run || $RM conftest.c
- cat > conftest.c <<EOF
- int main() { return 0; }
-EOF
- $opt_dry_run || $RM conftest
- if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
- ldd_output=`ldd conftest`
- for i in $deplibs; do
- case $i in
- -l*)
- func_stripname -l '' "$i"
- name=$func_stripname_result
- if test yes = "$allow_libtool_libs_with_static_runtimes"; then
- case " $predeps $postdeps " in
- *" $i "*)
- func_append newdeplibs " $i"
- i=
- ;;
- esac
- fi
- if test -n "$i"; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
- set dummy $deplib_matches; shift
- deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
- func_append newdeplibs " $i"
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning: dynamic linker does not accept needed library $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which I believe you do not have"
- echo "*** because a test_compile did reveal that the linker did not use it for"
- echo "*** its dynamic dependency list that programs get resolved with at runtime."
- fi
- fi
- ;;
- *)
- func_append newdeplibs " $i"
- ;;
- esac
- done
- else
- # Error occurred in the first compile. Let's try to salvage
- # the situation: Compile a separate program for each library.
- for i in $deplibs; do
- case $i in
- -l*)
- func_stripname -l '' "$i"
- name=$func_stripname_result
- $opt_dry_run || $RM conftest
- if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
- ldd_output=`ldd conftest`
- if test yes = "$allow_libtool_libs_with_static_runtimes"; then
- case " $predeps $postdeps " in
- *" $i "*)
- func_append newdeplibs " $i"
- i=
- ;;
- esac
- fi
- if test -n "$i"; then
- libname=`eval "\\$ECHO \"$libname_spec\""`
- deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
- set dummy $deplib_matches; shift
- deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
- func_append newdeplibs " $i"
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning: dynamic linker does not accept needed library $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because a test_compile did reveal that the linker did not use this one"
- echo "*** as a dynamic dependency that programs can get resolved with at runtime."
- fi
- fi
- else
- droppeddeps=yes
- echo
- $ECHO "*** Warning! Library $i is needed by this library but I was not able to"
- echo "*** make it link in! You will probably need to install it or some"
- echo "*** library that it depends on before this library will be fully"
- echo "*** functional. Installing it before continuing would be even better."
- fi
- ;;
- *)
- func_append newdeplibs " $i"
- ;;
- esac
- done
- fi
- ;;
file_magic*)
set dummy $deplibs_check_method; shift
file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
@@ -9330,17 +9706,16 @@ EOF
fi
if test -n "$a_deplib"; then
droppeddeps=yes
- echo
- $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because I did check the linker path looking for a file starting"
+ func_warning "Linker path does not have real file for library $a_deplib."
+ func_warning "I have the capability to make that library automatically link in when"
+ func_warning "you link to this library. But I can only do this if you have a"
+ func_warning "shared version of the library, which you do not appear to have"
+ func_warning "because I did check the linker path looking for a file starting"
if test -z "$potlib"; then
- $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+ func_warning "with $libname but no candidates were found. (...for file magic test)"
else
- $ECHO "*** with $libname and none of the candidates passed a file format test"
- $ECHO "*** using a file magic. Last file checked: $potlib"
+ func_warning "with $libname and none of the candidates passed a file format test"
+ func_warning "using a file magic. Last file checked: $potlib"
fi
fi
;;
@@ -9384,17 +9759,16 @@ EOF
fi
if test -n "$a_deplib"; then
droppeddeps=yes
- echo
- $ECHO "*** Warning: linker path does not have real file for library $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have"
- echo "*** because I did check the linker path looking for a file starting"
+ func_warning "Linker path does not have real file for library $a_deplib."
+ func_warning "I have the capability to make that library automatically link in when"
+ func_warning "you link to this library. But I can only do this if you have a"
+ func_warning "shared version of the library, which you do not appear to have"
+ func_warning "because I did check the linker path looking for a file starting"
if test -z "$potlib"; then
- $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+ func_warning "with $libname but no candidates were found. (...for regex pattern test)"
else
- $ECHO "*** with $libname and none of the candidates passed a file format test"
- $ECHO "*** using a regex pattern. Last file checked: $potlib"
+ func_warning "with $libname and none of the candidates passed a file format test"
+ func_warning "using a regex pattern. Last file checked: $potlib"
fi
fi
;;
@@ -9418,11 +9792,11 @@ EOF
*[!\ \ ]*)
echo
if test none = "$deplibs_check_method"; then
- echo "*** Warning: inter-library dependencies are not supported in this platform."
+ func_warning "Inter-library dependencies are not supported in this platform."
else
- echo "*** Warning: inter-library dependencies are not known to be supported."
+ func_warning "Inter-library dependencies are not known to be supported."
fi
- echo "*** All declared inter-library dependencies are being dropped."
+ func_warning "All declared inter-library dependencies are being dropped."
droppeddeps=yes
;;
esac
@@ -9443,17 +9817,15 @@ EOF
if test yes = "$droppeddeps"; then
if test yes = "$module"; then
- echo
- echo "*** Warning: libtool could not satisfy all declared inter-library"
- $ECHO "*** dependencies of module $libname. Therefore, libtool will create"
- echo "*** a static module, that should work as long as the dlopening"
- echo "*** application is linked with the -dlopen flag."
+ func_warning "libtool could not satisfy all declared inter-library"
+ func_warning "dependencies of module $libname. Therefore, libtool will create"
+ func_warning "a static module, that should work as long as the dlopening"
+ func_warning "application is linked with the -dlopen flag."
if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** 'nm' from GNU binutils and a full rebuild may help."
+ func_warning "However, this would only work if libtool was able to extract symbol"
+ func_warning "lists from a program, using 'nm' or equivalent, but libtool could"
+ func_warning "not find such a program. So, this module is probably useless."
+ func_warning "'nm' from GNU binutils and a full rebuild may help."
fi
if test no = "$build_old_libs"; then
oldlibs=$output_objdir/$libname.$libext
@@ -9628,7 +10000,7 @@ EOF
orig_export_symbols=
case $host_os in
- cygwin* | mingw* | cegcc*)
+ cygwin* | mingw* | windows* | cegcc*)
if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
# exporting using user supplied symfile
func_dll_def_p "$export_symbols" || {
@@ -9826,20 +10198,7 @@ EOF
last_robj=
k=1
- if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
- output=$output_objdir/$output_la.lnkscript
- func_verbose "creating GNU ld script: $output"
- echo 'INPUT (' > $output
- for obj in $save_libobjs
- do
- func_to_tool_file "$obj"
- $ECHO "$func_to_tool_file_result" >> $output
- done
- echo ')' >> $output
- func_append delfiles " $output"
- func_to_tool_file "$output"
- output=$func_to_tool_file_result
- elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+ if test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
output=$output_objdir/$output_la.lnk
func_verbose "creating linker input file list: $output"
: > $output
@@ -9858,6 +10217,19 @@ EOF
func_append delfiles " $output"
func_to_tool_file "$output"
output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+ elif test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+ output=$output_objdir/$output_la.lnkscript
+ func_verbose "creating GNU ld script: $output"
+ echo 'INPUT (' > $output
+ for obj in $save_libobjs
+ do
+ func_to_tool_file "$obj"
+ $ECHO "$func_to_tool_file_result" >> $output
+ done
+ echo ')' >> $output
+ func_append delfiles " $output"
+ func_to_tool_file "$output"
+ output=$func_to_tool_file_result
else
if test -n "$save_libobjs"; then
func_verbose "creating reloadable object files..."
@@ -9935,8 +10307,8 @@ EOF
for cmd in $concat_cmds; do
IFS=$save_ifs
$opt_quiet || {
- func_quote_for_expand "$cmd"
- eval "func_echo $func_quote_for_expand_result"
+ func_quote_arg expand,pretty "$cmd"
+ eval "func_echo $func_quote_arg_result"
}
$opt_dry_run || eval "$cmd" || {
lt_exit=$?
@@ -10029,8 +10401,8 @@ EOF
eval cmd=\"$cmd\"
IFS=$save_ifs
$opt_quiet || {
- func_quote_for_expand "$cmd"
- eval "func_echo $func_quote_for_expand_result"
+ func_quote_arg expand,pretty "$cmd"
+ eval "func_echo $func_quote_arg_result"
}
$opt_dry_run || eval "$cmd" || {
lt_exit=$?
@@ -10298,7 +10670,7 @@ EOF
esac
fi
case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+ *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*)
testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$libdir:"*) ;;
@@ -10376,7 +10748,7 @@ EOF
# Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
wrappers_required=false
;;
- *cygwin* | *mingw* )
+ *cygwin* | *mingw* | *windows* )
test yes = "$build_libtool_libs" || wrappers_required=false
;;
*)
@@ -10504,12 +10876,13 @@ EOF
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
- func_quote_for_eval "$var_value"
- relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+ func_quote_arg pretty "$var_value"
+ relink_command="$var=$func_quote_arg_result; export $var; $relink_command"
fi
done
- relink_command="(cd `pwd`; $relink_command)"
- relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+ func_quote eval cd "`pwd`"
+ func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)"
+ relink_command=$func_quote_arg_unquoted_result
fi
# Only actually do things if not in dry run mode.
@@ -10529,7 +10902,7 @@ EOF
*) exeext= ;;
esac
case $host in
- *cygwin* | *mingw* )
+ *cygwin* | *mingw* | windows* )
func_dirname_and_basename "$output" "" "."
output_name=$func_basename_result
output_path=$func_dirname_result
@@ -10749,13 +11122,15 @@ EOF
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
- func_quote_for_eval "$var_value"
- relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+ func_quote_arg pretty,unquoted "$var_value"
+ relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command"
fi
done
# Quote the link command for shipping.
- relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
- relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+ func_quote eval cd "`pwd`"
+ relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ func_quote_arg pretty,unquoted "$relink_command"
+ relink_command=$func_quote_arg_unquoted_result
if test yes = "$hardcode_automatic"; then
relink_command=
fi
@@ -10861,7 +11236,7 @@ EOF
# tests/bindir.at for full details.
tdlname=$dlname
case $host,$output,$installed,$module,$dlname in
- *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *windows*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
# If a -bindir argument was supplied, place the dll there.
if test -n "$bindir"; then
func_relative_path "$install_libdir" "$bindir"
diff --git a/contrib/unbound/smallapp/unbound-control-setup.sh b/contrib/unbound/smallapp/unbound-control-setup.sh
index 3709a8c3118b..872133ccc536 100755..100644
--- a/contrib/unbound/smallapp/unbound-control-setup.sh
+++ b/contrib/unbound/smallapp/unbound-control-setup.sh
@@ -5,22 +5,22 @@
# Copyright (c) 2008, NLnet Labs. All rights reserved.
#
# This software is open source.
-#
+#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
-#
+#
# Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
-#
+#
# Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
-#
+#
# Neither the name of the NLNET LABS nor the names of its contributors may
# be used to endorse or promote products derived from this software without
# specific prior written permission.
-#
+#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -57,87 +57,162 @@ SVR_BASE=unbound_server
# base name for unbound-control keys
CTL_BASE=unbound_control
+# flag to recreate generated certificates
+RECREATE=0
+
# we want -rw-r----- access (say you run this as root: grp=yes (server), all=no).
umask 0027
# end of options
-# functions:
-error ( ) {
- echo "$0 fatal error: $1"
- exit 1
+set -eu
+
+cleanup() {
+ echo "removing artifacts"
+
+ rm -rf \
+ server.cnf \
+ client.cnf \
+ "${SVR_BASE}_trust.pem" \
+ "${CTL_BASE}_trust.pem" \
+ "${SVR_BASE}_trust.srl"
}
-# check arguments:
-while test $# -ne 0; do
- case $1 in
- -d)
- if test $# -eq 1; then error "need argument for -d"; fi
- DESTDIR="$2"
- shift
- ;;
- *)
- echo "unbound-control-setup.sh - setup SSL keys for unbound-control"
- echo " -d dir use directory to store keys and certificates."
- echo " default: $DESTDIR"
- echo "please run this command using the same user id that the "
- echo "unbound daemon uses, it needs read privileges."
- exit 1
- ;;
- esac
- shift
+fatal() {
+ printf "fatal error: $*\n" >/dev/stderr
+ exit 1
+}
+
+usage() {
+ cat <<EOF
+usage: $0 OPTIONS
+OPTIONS
+-d <dir> used directory to store keys and certificates (default: $DESTDIR)
+-h show help notice
+-r recreate certificates
+EOF
+}
+
+OPTIND=1
+while getopts 'd:hr' arg; do
+ case "$arg" in
+ d) DESTDIR="$OPTARG" ;;
+ h) usage; exit 1 ;;
+ r) RECREATE=1 ;;
+ ?) fatal "'$arg' unknown option" ;;
+ esac
done
+shift $((OPTIND - 1))
+
+if ! openssl version </dev/null >/dev/null 2>&1; then
+ echo "$0 requires openssl to be installed for keys/certificates generation." >&2
+ exit 1
+fi
-# go!:
echo "setup in directory $DESTDIR"
-cd "$DESTDIR" || error "could not cd to $DESTDIR"
-
-# create certificate keys; do not recreate if they already exist.
-if test -f $SVR_BASE.key; then
- echo "$SVR_BASE.key exists"
-else
- echo "generating $SVR_BASE.key"
- openssl genrsa -out $SVR_BASE.key $BITS || error "could not genrsa"
+cd "$DESTDIR"
+
+trap cleanup INT
+
+# ===
+# Generate server certificate
+# ===
+
+# generate private key; do no recreate it if they already exist.
+if [ ! -f "$SVR_BASE.key" ]; then
+ openssl genrsa -out "$SVR_BASE.key" "$BITS"
+fi
+
+cat >server.cnf <<EOF
+[req]
+default_bits=$BITS
+default_md=$HASH
+prompt=no
+distinguished_name=req_distinguished_name
+x509_extensions=v3_ca
+[req_distinguished_name]
+commonName=$SERVERNAME
+[v3_ca]
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid:always,issuer:always
+basicConstraints=critical,CA:TRUE,pathlen:0
+subjectAltName=DNS:$SERVERNAME
+EOF
+
+[ -f server.cnf ] || fatal "cannot create openssl configuration"
+
+if [ ! -f "$SVR_BASE.pem" -o $RECREATE -eq 1 ]; then
+ openssl req \
+ -new -x509 \
+ -key "$SVR_BASE.key" \
+ -config server.cnf \
+ -days "$DAYS" \
+ -out "$SVR_BASE.pem"
+
+ [ ! -f "SVR_BASE.pem" ] || fatal "cannot create server certificate"
fi
-if test -f $CTL_BASE.key; then
- echo "$CTL_BASE.key exists"
-else
- echo "generating $CTL_BASE.key"
- openssl genrsa -out $CTL_BASE.key $BITS || error "could not genrsa"
+
+# ===
+# Generate client certificate
+# ===
+
+# generate private key; do no recreate it if they already exist.
+if [ ! -f "$CTL_BASE.key" ]; then
+ openssl genrsa -out "$CTL_BASE.key" "$BITS"
fi
-# create self-signed cert for server
-echo "[req]" > request.cfg
-echo "default_bits=$BITS" >> request.cfg
-echo "default_md=$HASH" >> request.cfg
-echo "prompt=no" >> request.cfg
-echo "distinguished_name=req_distinguished_name" >> request.cfg
-echo "" >> request.cfg
-echo "[req_distinguished_name]" >> request.cfg
-echo "commonName=$SERVERNAME" >> request.cfg
+cat >client.cnf <<EOF
+[req]
+default_bits=$BITS
+default_md=$HASH
+prompt=no
+distinguished_name=req_distinguished_name
+req_extensions=v3_req
+[req_distinguished_name]
+commonName=$CLIENTNAME
+[v3_req]
+basicConstraints=critical,CA:FALSE
+subjectAltName=DNS:$CLIENTNAME
+EOF
+
+[ -f client.cnf ] || fatal "cannot create openssl configuration"
+
+if [ ! -f "$CTL_BASE.pem" -o $RECREATE -eq 1 ]; then
+ openssl x509 \
+ -addtrust serverAuth \
+ -in "$SVR_BASE.pem" \
+ -out "${SVR_BASE}_trust.pem"
+
+ openssl req \
+ -new \
+ -config client.cnf \
+ -key "$CTL_BASE.key" \
+ | openssl x509 \
+ -req \
+ -days "$DAYS" \
+ -CA "${SVR_BASE}_trust.pem" \
+ -CAkey "$SVR_BASE.key" \
+ -CAcreateserial \
+ -$HASH \
+ -extfile client.cnf \
+ -extensions v3_req \
+ -out "$CTL_BASE.pem"
+
+ [ ! -f "CTL_BASE.pem" ] || fatal "cannot create signed client certificate"
+fi
-test -f request.cfg || error "could not create request.cfg"
+# remove unused permissions
+chmod o-rw \
+ "$SVR_BASE.pem" \
+ "$SVR_BASE.key"
+chmod g+r,o-rw \
+ "$CTL_BASE.pem" \
+ "$CTL_BASE.key"
+
+cleanup
+
+echo "Setup success. Certificates created. Enable in unbound.conf file to use"
-echo "create $SVR_BASE.pem (self signed certificate)"
-openssl req -key $SVR_BASE.key -config request.cfg -new -x509 -days $DAYS -out $SVR_BASE.pem || error "could not create $SVR_BASE.pem"
-# create trusted usage pem
-openssl x509 -in $SVR_BASE.pem -addtrust serverAuth -out $SVR_BASE"_trust.pem"
-
-# create client request and sign it, piped
-echo "[req]" > request.cfg
-echo "default_bits=$BITS" >> request.cfg
-echo "default_md=$HASH" >> request.cfg
-echo "prompt=no" >> request.cfg
-echo "distinguished_name=req_distinguished_name" >> request.cfg
-echo "" >> request.cfg
-echo "[req_distinguished_name]" >> request.cfg
-echo "commonName=$CLIENTNAME" >> request.cfg
-
-test -f request.cfg || error "could not create request.cfg"
-
-echo "create $CTL_BASE.pem (signed client certificate)"
-openssl req -key $CTL_BASE.key -config request.cfg -new | openssl x509 -req -days $DAYS -CA $SVR_BASE"_trust.pem" -CAkey $SVR_BASE.key -CAcreateserial -$HASH -out $CTL_BASE.pem
-test -f $CTL_BASE.pem || error "could not create $CTL_BASE.pem"
# create trusted usage pem
# openssl x509 -in $CTL_BASE.pem -addtrust clientAuth -out $CTL_BASE"_trust.pem"
@@ -148,13 +223,3 @@ test -f $CTL_BASE.pem || error "could not create $CTL_BASE.pem"
# echo "empty password is used, simply click OK on the password dialog box."
# openssl pkcs12 -export -in $CTL_BASE"_trust.pem" -inkey $CTL_BASE.key -name "unbound remote control client cert" -out $CTL_BASE"_browser.pfx" -password "pass:" || error "could not create browser certificate"
-# set desired permissions
-chmod 0640 $SVR_BASE.pem $SVR_BASE.key $CTL_BASE.pem $CTL_BASE.key
-
-# remove crap
-rm -f request.cfg
-rm -f $CTL_BASE"_trust.pem" $SVR_BASE"_trust.pem" $SVR_BASE"_trust.srl"
-
-echo "Setup success. Certificates created. Enable in unbound.conf file to use"
-
-exit 0
diff --git a/etc/mtree/BSD.usr.dist b/etc/mtree/BSD.usr.dist
index ffdd82ae9911..7d3a72f43fa1 100644
--- a/etc/mtree/BSD.usr.dist
+++ b/etc/mtree/BSD.usr.dist
@@ -286,8 +286,6 @@
..
dma
..
- drivers
- ..
dwatch
..
etc
diff --git a/include/dirent.h b/include/dirent.h
index 7fcdceb10b23..8df38a707856 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -115,10 +115,6 @@ DIR *opendir(const char *);
DIR *fdopendir(int);
struct dirent *
readdir(DIR *);
-#if __POSIX_VISIBLE >= 199506 || __XSI_VISIBLE >= 500
-int readdir_r(DIR *, struct dirent *, struct dirent **)
- __deprecated1("Does not take variable {NAME_MAX} into account");
-#endif
void rewinddir(DIR *);
#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700
int scandir(const char *, struct dirent ***,
diff --git a/lib/clang/freebsd_cc_version.h b/lib/clang/freebsd_cc_version.h
index 277744ae8624..b493dc96db5e 100644
--- a/lib/clang/freebsd_cc_version.h
+++ b/lib/clang/freebsd_cc_version.h
@@ -1 +1 @@
-#define FREEBSD_CC_VERSION 1500000
+#define FREEBSD_CC_VERSION 1600000
diff --git a/lib/clang/include/lld/Common/Version.inc b/lib/clang/include/lld/Common/Version.inc
index 0643da4abbf4..0def3da7469c 100644
--- a/lib/clang/include/lld/Common/Version.inc
+++ b/lib/clang/include/lld/Common/Version.inc
@@ -1,4 +1,4 @@
// Local identifier in __FreeBSD_version style
-#define LLD_FREEBSD_VERSION 1500001
+#define LLD_FREEBSD_VERSION 1600000
#define LLD_VERSION_STRING "19.1.7 (FreeBSD llvmorg-19.1.7-0-gcd708029e0b2-" __XSTRING(LLD_FREEBSD_VERSION) ")"
diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index 4d064d18d36e..c32f514d7176 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -342,7 +342,6 @@ MLINKS+=directory.3 closedir.3 \
directory.3 fdopendir.3 \
directory.3 opendir.3 \
directory.3 readdir.3 \
- directory.3 readdir_r.3 \
directory.3 rewinddir.3 \
directory.3 seekdir.3 \
directory.3 telldir.3
diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map
index 26f638568efc..86a8712ef12f 100644
--- a/lib/libc/gen/Symbol.map
+++ b/lib/libc/gen/Symbol.map
@@ -418,7 +418,6 @@ FBSD_1.5 {
globfree;
nftw;
readdir;
- readdir_r;
scandir;
sem_clockwait_np;
setproctitle_fast;
diff --git a/lib/libc/gen/directory.3 b/lib/libc/gen/directory.3
index 263dfdd6eb95..a92d51980aab 100644
--- a/lib/libc/gen/directory.3
+++ b/lib/libc/gen/directory.3
@@ -25,14 +25,13 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 1, 2020
+.Dd September 5, 2025
.Dt DIRECTORY 3
.Os
.Sh NAME
.Nm opendir ,
.Nm fdopendir ,
.Nm readdir ,
-.Nm readdir_r ,
.Nm telldir ,
.Nm seekdir ,
.Nm rewinddir ,
@@ -50,8 +49,6 @@
.Fn fdopendir "int fd"
.Ft struct dirent *
.Fn readdir "DIR *dirp"
-.Ft int
-.Fn readdir_r "DIR *dirp" "struct dirent *entry" "struct dirent **result"
.Ft long
.Fn telldir "DIR *dirp"
.Ft void
@@ -65,15 +62,6 @@
.Ft int
.Fn dirfd "DIR *dirp"
.Sh DESCRIPTION
-.Bf -symbolic
-The
-.Fn readdir_r
-interface is deprecated
-because it cannot be used correctly unless
-.Brq Va NAME_MAX
-is a fixed value.
-.Ef
-.Pp
The
.Fn opendir
function
@@ -112,7 +100,6 @@ or to modify the state of the associated description other than by means
of
.Fn closedir ,
.Fn readdir ,
-.Fn readdir_r ,
or
.Fn rewinddir ,
the behavior is undefined.
@@ -144,34 +131,6 @@ may be set to any of the values documented for the
system call.
.Pp
The
-.Fn readdir_r
-function
-provides the same functionality as
-.Fn readdir ,
-but the caller must provide a directory
-.Fa entry
-buffer to store the results in.
-The buffer must be large enough for a
-.Vt struct dirent
-with a
-.Va d_name
-array with
-.Brq Va NAME_MAX
-+ 1 elements.
-If the read succeeds,
-.Fa result
-is pointed at the
-.Fa entry ;
-upon reaching the end of the directory
-.Fa result
-is set to
-.Dv NULL .
-The
-.Fn readdir_r
-function
-returns 0 on success or an error number to indicate failure.
-.Pp
-The
.Fn telldir
function
returns a token representing the current location associated with the named
@@ -305,9 +264,7 @@ is not associated with a directory.
.Pp
The
.Fn readdir
-and
-.Fn readdir_r
-functions may also fail and set
+function may also fail and set
.Va errno
for any of the errors specified for the routine
.Xr getdents 2 .
@@ -338,7 +295,6 @@ The
.Fn fdopendir ,
.Fn opendir ,
.Fn readdir ,
-.Fn readdir_r ,
.Fn rewinddir ,
.Fn seekdir
and
@@ -391,7 +347,8 @@ will always set the correct location to return the same value as that last
.Fn readdir
performed.
This is enough for some applications which want to
-"push back the last entry read", e.g., Samba.
+.Dq push back the last entry read ,
+e.g. Samba.
Seeks back to any other location,
other than the beginning of the directory,
may result in unexpected behaviour if deletes are present.
diff --git a/lib/libc/gen/gen-compat.h b/lib/libc/gen/gen-compat.h
index 08e80ede6b6e..4518c3f130d1 100644
--- a/lib/libc/gen/gen-compat.h
+++ b/lib/libc/gen/gen-compat.h
@@ -37,6 +37,7 @@ struct freebsd11_dirent;
struct freebsd11_stat;
struct freebsd11_statfs;
+int freebsd15_readdir_r(DIR *, struct dirent *, struct dirent **);
struct freebsd11_dirent *freebsd11_readdir(DIR *);
int freebsd11_readdir_r(DIR *, struct freebsd11_dirent *,
struct freebsd11_dirent **);
diff --git a/lib/libc/gen/gen-private.h b/lib/libc/gen/gen-private.h
index b6749b3435cd..97dd41ffbdfc 100644
--- a/lib/libc/gen/gen-private.h
+++ b/lib/libc/gen/gen-private.h
@@ -60,7 +60,4 @@ struct _dirdesc {
#define _dirfd(dirp) ((dirp)->dd_fd)
-struct dirent;
-int __readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
-
#endif /* !_GEN_PRIVATE_H_ */
diff --git a/lib/libc/gen/readdir-compat11.c b/lib/libc/gen/readdir-compat11.c
index 606e15bd7b36..71c223f00b5a 100644
--- a/lib/libc/gen/readdir-compat11.c
+++ b/lib/libc/gen/readdir-compat11.c
@@ -95,7 +95,7 @@ freebsd11_readdir_r(DIR *dirp, struct freebsd11_dirent *entry,
struct dirent xentry, *xresult;
int error;
- error = __readdir_r(dirp, &xentry, &xresult);
+ error = freebsd15_readdir_r(dirp, &xentry, &xresult);
if (error != 0)
return (error);
if (xresult != NULL) {
diff --git a/lib/libc/gen/readdir.c b/lib/libc/gen/readdir.c
index 94d2b2e8d877..d0bbe72237e1 100644
--- a/lib/libc/gen/readdir.c
+++ b/lib/libc/gen/readdir.c
@@ -41,6 +41,8 @@
#include "gen-private.h"
#include "telldir.h"
+#include "gen-compat.h"
+
/*
* get next entry in a directory.
*/
@@ -104,7 +106,7 @@ readdir(DIR *dirp)
}
int
-__readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
+freebsd15_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
{
struct dirent *dp;
int saved_errno;
@@ -133,6 +135,4 @@ __readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
return (0);
}
-__strong_reference(__readdir_r, readdir_r);
-__warn_references(readdir_r,
- "warning: this program uses readdir_r(), which is unsafe.");
+__sym_compat(readdir_r, freebsd15_readdir_r, FBSD_1.5);
diff --git a/lib/libjail/jail.c b/lib/libjail/jail.c
index 30282e67866c..f761bc6993e5 100644
--- a/lib/libjail/jail.c
+++ b/lib/libjail/jail.c
@@ -75,8 +75,9 @@ int
jail_setv(int flags, ...)
{
va_list ap, tap;
- struct jailparam *jp;
- const char *name, *value;
+ struct jailparam *jp, *jp_desc;
+ const char *name;
+ char *value, *desc_value;
int njp, jid;
/* Create the parameter list and import the parameters. */
@@ -86,15 +87,24 @@ jail_setv(int flags, ...)
(void)va_arg(tap, char *);
va_end(tap);
jp = alloca(njp * sizeof(struct jailparam));
- for (njp = 0; (name = va_arg(ap, char *)) != NULL;) {
+ jp_desc = NULL;
+ desc_value = NULL;
+ for (njp = 0; (name = va_arg(ap, char *)) != NULL; njp++) {
value = va_arg(ap, char *);
if (jailparam_init(jp + njp, name) < 0)
goto error;
- if (jailparam_import(jp + njp++, value) < 0)
+ if (jailparam_import(jp + njp, value) < 0)
goto error;
+ if (!strcmp(name, "desc") &&
+ (flags & (JAIL_GET_DESC | JAIL_OWN_DESC))) {
+ jp_desc = jp + njp;
+ desc_value = value;
+ }
}
va_end(ap);
jid = jailparam_set(jp, njp, flags);
+ if (jid > 0 && jp_desc != NULL)
+ sprintf(desc_value, "%d", *(int *)jp_desc->jp_value);
jailparam_free(jp, njp);
return (jid);
@@ -112,9 +122,10 @@ int
jail_getv(int flags, ...)
{
va_list ap, tap;
- struct jailparam *jp, *jp_lastjid, *jp_jid, *jp_name, *jp_key;
+ struct jailparam *jp, *jp_desc, *jp_lastjid, *jp_jid, *jp_name, *jp_key;
char *valarg, *value;
- const char *name, *key_value, *lastjid_value, *jid_value, *name_value;
+ const char *name, *key_value, *desc_value, *lastjid_value, *jid_value;
+ const char *name_value;
int njp, i, jid;
/* Create the parameter list and find the key. */
@@ -126,15 +137,19 @@ jail_getv(int flags, ...)
jp = alloca(njp * sizeof(struct jailparam));
va_copy(tap, ap);
- jp_lastjid = jp_jid = jp_name = NULL;
- lastjid_value = jid_value = name_value = NULL;
+ jp_desc = jp_lastjid = jp_jid = jp_name = NULL;
+ desc_value = lastjid_value = jid_value = name_value = NULL;
for (njp = 0; (name = va_arg(tap, char *)) != NULL; njp++) {
value = va_arg(tap, char *);
if (jailparam_init(jp + njp, name) < 0) {
va_end(tap);
goto error;
}
- if (!strcmp(jp[njp].jp_name, "lastjid")) {
+ if (!strcmp(jp[njp].jp_name, "desc") &&
+ (flags & (JAIL_USE_DESC | JAIL_AT_DESC))) {
+ jp_desc = jp + njp;
+ desc_value = value;
+ } else if (!strcmp(jp[njp].jp_name, "lastjid")) {
jp_lastjid = jp + njp;
lastjid_value = value;
} else if (!strcmp(jp[njp].jp_name, "jid")) {
@@ -147,7 +162,10 @@ jail_getv(int flags, ...)
}
va_end(tap);
/* Import the key parameter. */
- if (jp_lastjid != NULL) {
+ if (jp_desc != NULL && (flags & JAIL_USE_DESC)) {
+ jp_key = jp_desc;
+ key_value = desc_value;
+ } else if (jp_lastjid != NULL) {
jp_key = jp_lastjid;
key_value = lastjid_value;
} else if (jp_jid != NULL && strtol(jid_value, NULL, 10) != 0) {
@@ -163,6 +181,9 @@ jail_getv(int flags, ...)
}
if (jailparam_import(jp_key, key_value) < 0)
goto error;
+ if (jp_desc != NULL && jp_desc != jp_key &&
+ jailparam_import(jp_desc, desc_value) < 0)
+ goto error;
/* Get the jail and export the parameters. */
jid = jailparam_get(jp, njp, flags);
if (jid < 0)
@@ -571,7 +592,7 @@ int
jailparam_get(struct jailparam *jp, unsigned njp, int flags)
{
struct iovec *jiov;
- struct jailparam *jp_lastjid, *jp_jid, *jp_name, *jp_key;
+ struct jailparam *jp_desc, *jp_lastjid, *jp_jid, *jp_name, *jp_key;
int i, ai, ki, jid, arrays, sanity;
unsigned j;
@@ -580,10 +601,13 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
* Find the key and any array parameters.
*/
jiov = alloca(sizeof(struct iovec) * 2 * (njp + 1));
- jp_lastjid = jp_jid = jp_name = NULL;
+ jp_desc = jp_lastjid = jp_jid = jp_name = NULL;
arrays = 0;
for (ai = j = 0; j < njp; j++) {
- if (!strcmp(jp[j].jp_name, "lastjid"))
+ if (!strcmp(jp[j].jp_name, "desc") &&
+ (flags & (JAIL_USE_DESC | JAIL_AT_DESC)))
+ jp_desc = jp + j;
+ else if (!strcmp(jp[j].jp_name, "lastjid"))
jp_lastjid = jp + j;
else if (!strcmp(jp[j].jp_name, "jid"))
jp_jid = jp + j;
@@ -599,7 +623,9 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
ai++;
}
}
- jp_key = jp_lastjid ? jp_lastjid :
+ jp_key = jp_desc && jp_desc->jp_valuelen == sizeof(int) &&
+ jp_desc->jp_value && (flags & JAIL_USE_DESC) ? jp_desc :
+ jp_lastjid ? jp_lastjid :
jp_jid && jp_jid->jp_valuelen == sizeof(int) &&
jp_jid->jp_value && *(int *)jp_jid->jp_value ? jp_jid : jp_name;
if (jp_key == NULL || jp_key->jp_value == NULL) {
@@ -622,6 +648,14 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
jiov[ki].iov_len = JAIL_ERRMSGLEN;
ki++;
jail_errmsg[0] = 0;
+ if (jp_desc != NULL && jp_desc != jp_key) {
+ jiov[ki].iov_base = jp_desc->jp_name;
+ jiov[ki].iov_len = strlen(jp_desc->jp_name) + 1;
+ ki++;
+ jiov[ki].iov_base = jp_desc->jp_value;
+ jiov[ki].iov_len = jp_desc->jp_valuelen;
+ ki++;
+ }
if (arrays && jail_get(jiov, ki, flags) < 0) {
if (!jail_errmsg[0])
snprintf(jail_errmsg, sizeof(jail_errmsg),
@@ -649,7 +683,7 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
jiov[ai].iov_base = jp[j].jp_value;
memset(jiov[ai].iov_base, 0, jiov[ai].iov_len);
ai++;
- } else if (jp + j != jp_key) {
+ } else if (jp + j != jp_key && jp + j != jp_desc) {
jiov[i].iov_base = jp[j].jp_name;
jiov[i].iov_len = strlen(jp[j].jp_name) + 1;
i++;
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
index b2b7c6ecce56..fed483978e62 100644
--- a/lib/libkvm/kvm_proc.c
+++ b/lib/libkvm/kvm_proc.c
@@ -150,13 +150,14 @@ kvm_proclist(kvm_t *kd, int what, int arg, struct proc *p,
kp->ki_cr_flags = 0;
if (ucred.cr_flags & CRED_FLAG_CAPMODE)
kp->ki_cr_flags |= KI_CRF_CAPABILITY_MODE;
- if (ucred.cr_ngroups > KI_NGROUPS) {
+ if (1 + ucred.cr_ngroups > KI_NGROUPS) {
kp->ki_ngroups = KI_NGROUPS;
kp->ki_cr_flags |= KI_CRF_GRP_OVERFLOW;
} else
- kp->ki_ngroups = ucred.cr_ngroups;
- kvm_read(kd, (u_long)ucred.cr_groups, kp->ki_groups,
- kp->ki_ngroups * sizeof(gid_t));
+ kp->ki_ngroups = 1 + ucred.cr_ngroups;
+ kp->ki_groups[0] = ucred.cr_gid;
+ kvm_read(kd, (u_long)ucred.cr_groups, kp->ki_groups + 1,
+ (kp->ki_ngroups - 1) * sizeof(gid_t));
if (ucred.cr_prison != NULL) {
if (KREAD(kd, (u_long)ucred.cr_prison, &pr)) {
_kvm_err(kd, kd->program,
diff --git a/lib/libsys/Symbol.sys.map b/lib/libsys/Symbol.sys.map
index 1a297f9df581..e3fd8ac10621 100644
--- a/lib/libsys/Symbol.sys.map
+++ b/lib/libsys/Symbol.sys.map
@@ -382,6 +382,8 @@ FBSD_1.8 {
getrlimitusage;
inotify_add_watch_at;
inotify_rm_watch;
+ jail_attach_jd;
+ jail_remove_jd;
kcmp;
setcred;
setgroups;
diff --git a/lib/libsys/_libsys.h b/lib/libsys/_libsys.h
index 34eebc1aa67a..6bd768708a78 100644
--- a/lib/libsys/_libsys.h
+++ b/lib/libsys/_libsys.h
@@ -468,6 +468,8 @@ typedef int (__sys_inotify_add_watch_at_t)(int, int, const char *, uint32_t);
typedef int (__sys_inotify_rm_watch_t)(int, int);
typedef int (__sys_getgroups_t)(int, gid_t *);
typedef int (__sys_setgroups_t)(int, const gid_t *);
+typedef int (__sys_jail_attach_jd_t)(int);
+typedef int (__sys_jail_remove_jd_t)(int);
_Noreturn void __sys__exit(int rval);
int __sys_fork(void);
@@ -872,6 +874,8 @@ int __sys_inotify_add_watch_at(int fd, int dfd, const char * path, uint32_t mask
int __sys_inotify_rm_watch(int fd, int wd);
int __sys_getgroups(int gidsetsize, gid_t * gidset);
int __sys_setgroups(int gidsetsize, const gid_t * gidset);
+int __sys_jail_attach_jd(int fd);
+int __sys_jail_remove_jd(int fd);
__END_DECLS
#endif /* __LIBSYS_H_ */
diff --git a/lib/libsys/jail.2 b/lib/libsys/jail.2
index 8f8b9925c712..a2640071d1f0 100644
--- a/lib/libsys/jail.2
+++ b/lib/libsys/jail.2
@@ -23,7 +23,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd November 29, 2023
+.Dd September 9, 2025
.Dt JAIL 2
.Os
.Sh NAME
@@ -31,7 +31,9 @@
.Nm jail_get ,
.Nm jail_set ,
.Nm jail_remove ,
-.Nm jail_attach
+.Nm jail_attach ,
+.Nm jail_remove_jd ,
+.Nm jail_attach_jd
.Nd create and manage system jails
.Sh LIBRARY
.Lb libc
@@ -44,6 +46,10 @@
.Fn jail_attach "int jid"
.Ft int
.Fn jail_remove "int jid"
+.Ft int
+.Fn jail_attach_jd "int fd"
+.Ft int
+.Fn jail_remove_jd "int fd"
.In sys/uio.h
.Ft int
.Fn jail_get "struct iovec *iov" "u_int niov" "int flags"
@@ -188,6 +194,29 @@ system call.
This is deprecated in
.Fn jail_set
and has no effect.
+.It Dv JAIL_USE_DESC
+Identify the jail by a descriptor in the
+.Va desc
+parameter.
+.It Dv JAIL_AT_DESC
+Operate in the context of the jail described by the
+.Va desc
+parameter, instead of the current jail.
+Only one of
+.Dv JAIL_USE_DESC
+or
+.Dv JAIL_AT_DESC
+may be specified.
+.It Dv JAIL_GET_DESC
+Return a new jail descriptor for the jail in the
+.Va desc
+parameter.
+.It Dv JAIL_OWN_DESC
+Return an
+.Dq owning
+jail descriptor in the
+.Va desc
+parameter.
.El
.Pp
The
@@ -221,6 +250,9 @@ arguments consists of one or more following flags:
.Bl -tag -width indent
.It Dv JAIL_DYING
Allow getting a jail that is in the process of being removed.
+.It Dv JAIL_USE_DESC , Dv JAIL_AT_DESC , Dv JAIL_GET_DESC , Dv JAIL_OWN_DESC
+These have the same meaning as they do in
+.Fn jail_set .
.El
.Pp
The
@@ -238,6 +270,101 @@ system call removes the jail identified by
.Fa jid .
It will kill all processes belonging to the jail, and remove any children
of that jail.
+.Pp
+The
+.Fn jail_attach_fd
+and
+.Fn jail_remove_fd
+system calls work the same as
+.Fn jail_attach
+and
+.Fn jail_remove ,
+except that they operate on the jail identified by jail descriptor
+.Fa fd .
+.Ss Jail Descriptors
+In addition to the jail ID,
+jails can be referred to using a jail descriptor,
+a type of file descriptor tied to a particular jail.
+Jail descriptors are created by calling
+.Fn jail_set
+or
+.Fn jail_get
+with the special parameter
+.Va desc ,
+and either the
+.Dv JAIL_GET_DESC
+or
+.Dv JAIL_OWN_DESC
+flags set.
+The difference between the two flags is that descriptors created with
+.Dv JAIL_OWN_DESC
+.Po
+called
+.Dq owning
+descriptors
+.Pc
+will automatically remove the jail when the descriptor is closed.
+.Pp
+Jail descriptors can be passed back to
+.Fn jail_set
+or
+.Fm jail_get
+with the
+.Va desc
+parameter,
+and either the
+.Dv JAIL_USE_DESC
+or
+.Dv JAIL_AT_DESC
+flags set.
+With
+.Dv JAIL_USE_DESC ,
+the descriptor identifies the jail to operate on,
+instead of the
+.Va jid
+or
+.Va name
+parameter.
+With
+.Dv JAIL_AT_DESC ,
+the descriptor is used in place of the current jail,
+allowing accessing or creating jails that are children of the
+descriptor jail.
+.Pp
+The system calls
+.Fn jail_attach_jd
+and
+.Fn jail_aremove_jd
+work the same as
+.Fn jail_attach
+and
+.Fn jail_remove ,
+except that they operate on the jail referred to by the passed descriptor.
+.Pp
+Jail operations via descriptors can be done by processes that do not
+normally have permission to see or affect the jail,
+as long as they are allowed by the file permissions of the jail
+descriptor itself.
+These permissions can be changed by the descriptor owner via
+.Xr fchmod 2
+and
+.Xr fchown 2 .
+.Fn jail_get
+requires read permission,
+.Fn jail_set
+and
+.Fn jail_remove
+require write permission,
+and
+.Fn jail_attach
+requires execute permission.
+Also, use of a descriptor with the
+.Dv JAIL_AT_DESC
+flag requires execute permission.
+An owning descriptor is identified by the
+.Em sticky bit ,
+which may also be changed via
+.Xr fchmod 2 .
.Sh RETURN VALUES
If successful,
.Fn jail ,
@@ -249,7 +376,7 @@ They return \-1 on failure, and set
.Va errno
to indicate the error.
.Pp
-.Rv -std jail_attach jail_remove
+.Rv -std jail_attach jail_remove jail_attach_jd jail_remove_jd
.Sh ERRORS
The
.Fn jail
@@ -275,12 +402,35 @@ The
system call
will fail if:
.Bl -tag -width Er
+.It Bq Er EACCES
+Write permission is denied on the jail descriptor in the
+.Va desc
+parameter,
+and the
+.Dv JAIL_USE_DESC
+flag was set.
+.It Bq Er EACCES
+Execute permission is denied on the jail descriptor in the
+.Va desc
+parameter,
+and either the
+.Dv JAIL_AT_DESC
+or
+.Dv JAIL_ATTACH
+flag was set.
.It Bq Er EPERM
This process is not allowed to create a jail, either because it is not
the super-user, or because it would exceed the jail's
.Va children.max
limit.
.It Bq Er EPERM
+The jail descriptor in the
+.Va desc
+parameter was created by a user other than the super-user,
+and the
+.Dv JAIL_USE_DESC
+flag was set.
+.It Bq Er EPERM
A jail parameter was set to a less restrictive value then the current
environment.
.It Bq Er EFAULT
@@ -298,8 +448,12 @@ flag is not set.
.It Bq Er ENOENT
The jail referred to by a
.Va jid
-is not accessible by the process, because the process is in a different
-jail.
+parameter is not accessible by the process, because the process is in a
+different jail.
+.It Bq Er ENOENT
+The jail referred to by a
+.Va desc
+parameter has been removed.
.It Bq Er EEXIST
The jail referred to by a
.Va jid
@@ -326,6 +480,24 @@ flags is not set.
A supplied string parameter is longer than allowed.
.It Bq Er EAGAIN
There are no jail IDs left.
+.It Bq Er EMFILE
+A jail descriptor could not be created for the
+.Va desc
+parameter with either the
+.Dv JAIL_GET_DESC
+or
+.Dv JAIL_OWN_DESC
+flag set,
+because the process has already reached its limit for open file descriptors.
+.It Bq Er ENFILE
+A jail descriptor could not be created for the
+.Va desc
+parameter with either the
+.Dv JAIL_GET_DESC
+or
+.Dv JAIL_OWN_DESC
+flag set,
+because the system file table is full.
.El
.Pp
The
@@ -333,6 +505,20 @@ The
system call
will fail if:
.Bl -tag -width Er
+.It Bq Er EACCES
+Read permission is denied on the jail descriptor in the
+.Va desc
+parameter,
+and the
+.Dv JAIL_USE_DESC
+flag was set.
+.It Bq Er EACCES
+Execute permission is denied on the jail descriptor in the
+.Va desc
+parameter,
+and the
+.Dv JAIL_AT_DESC
+flag was set.
.It Bq Er EFAULT
.Fa Iov ,
or one of the addresses contained within it,
@@ -352,10 +538,37 @@ jail.
The
.Va lastjid
parameter is greater than the highest current jail ID.
+.It Bq Er ENOENT
+The jail referred to by a
+.Va desc
+parameter has been removed
+.Pq even if the Dv JAIL_CREATE flag has been set .
.It Bq Er EINVAL
A supplied parameter is the wrong size.
.It Bq Er EINVAL
+A supplied parameter is out of range.
+.It Bq Er EINVAL
+A supplied string parameter is not null-terminated.
+.It Bq Er EINVAL
A supplied parameter name does not match any known parameters.
+.It Bq Er EMFILE
+A jail descriptor could not be created for the
+.Va desc
+parameter with either the
+.Dv JAIL_GET_DESC
+or
+.Dv JAIL_OWN_DESC
+flag set,
+because the process has already reached its limit for open file descriptors.
+.It Bq Er ENFILE
+A jail descriptor could not be created for the
+.Va desc
+parameter with either the
+.Dv JAIL_GET_DESC
+or
+.Dv JAIL_OWN_DESC
+flag set,
+because the system file table is full.
.El
.Pp
The
@@ -373,11 +586,39 @@ The jail specified by
does not exist.
.El
.Pp
+The
+.Fn jail_attach_jd
+and
+.Fn jail_remove_jd
+system calls
+will fail if:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+The
+.Fa fd
+argument is not a valid jail descriptor.
+.It Bq Er EACCES
+Permission is denied on the jail descriptor
+.Po
+execute permission for
+.Fn jail_attach_fd ,
+or write permission for
+.Fn jail_remove_fd
+.Pc .
+.It Bq Er EPERM
+The jail descriptor was created by a user other than the super-user.
+.It Bq Er EINVAL
+The jail specified by
+.Fa jid
+has been removed.
+.El
+.Pp
Further
.Fn jail ,
.Fn jail_set ,
+.Fn jail_attach ,
and
-.Fn jail_attach
+.Fn jail_attach_jd
call
.Xr chroot 2
internally, so they can fail for all the same reasons.
diff --git a/lib/libsys/syscalls.map b/lib/libsys/syscalls.map
index 4cf80a2ffc69..b5400b9849b3 100644
--- a/lib/libsys/syscalls.map
+++ b/lib/libsys/syscalls.map
@@ -813,4 +813,8 @@ FBSDprivate_1.0 {
__sys_getgroups;
_setgroups;
__sys_setgroups;
+ _jail_attach_jd;
+ __sys_jail_attach_jd;
+ _jail_remove_jd;
+ __sys_jail_remove_jd;
};
diff --git a/lib/libunbound/Makefile b/lib/libunbound/Makefile
index cdc965c20763..e2cd25ea8b34 100644
--- a/lib/libunbound/Makefile
+++ b/lib/libunbound/Makefile
@@ -13,23 +13,20 @@ PACKAGE= unbound
CFLAGS+= -I${UNBOUNDDIR} -I${LDNSDIR} -I${.OBJDIR} -I${.CURDIR}
CFLAGS+= -DOPENSSL_API_COMPAT=0x10100000L
-SRCS= alloc.c as112.c authzone.c autotrust.c cachedb.c config_file.c \
- configlexer.l configparser.y context.c dname.c dns.c dns64.c \
- dnstree.c edns.c fptr_wlist.c infra.c iter_delegpt.c iter_donotq.c \
- iter_fwd.c iter_hints.c iter_priv.c iter_resptype.c iter_scrub.c \
- iter_utils.c iterator.c keyraw.c libunbound.c libworker.c \
- listen_dnsport.c localzone.c locks.c log.c lookup3.c lruhash.c \
- mesh.c mini_event.c modstack.c module.c msgencode.c msgparse.c \
- msgreply.c net_help.c netevent.c outbound_list.c outside_network.c \
- packed_rrset.c parse.c parseutil.c proxy_protocol.c \
- random.c rbtree.c redis.c \
- regional.c respip.c rfc_1982.c rpz.c rrdef.c rrset.c rtt.c sbuffer.c \
- siphash.c slabhash.c \
- str2wire.c tcp_conn_limit.c timehist.c timeval_func.c \
- tube.c ub_event_pluggable.c \
- val_anchor.c val_kcache.c val_kentry.c val_neg.c val_nsec.c \
- val_nsec3.c val_secalgo.c val_sigcrypt.c val_utils.c validator.c \
- view.c winsock_event.c wire2str.c
+SRCS= alloc.c as112.c authzone.c autotrust.c config_file.c configlexer.l \
+ configparser.y context.c dname.c dns.c dns64.c dnstree.c edns.c \
+ fptr_wlist.c infra.c iter_delegpt.c iter_donotq.c iter_fwd.c \
+ iter_hints.c iter_priv.c iter_resptype.c iter_scrub.c iter_utils.c \
+ iterator.c keyraw.c libunbound.c libworker.c listen_dnsport.c \
+ localzone.c locks.c log.c lookup3.c lruhash.c mesh.c mini_event.c \
+ modstack.c module.c msgencode.c msgparse.c msgreply.c net_help.c \
+ netevent.c outbound_list.c outside_network.c packed_rrset.c parse.c \
+ parseutil.c proxy_protocol.c random.c rbtree.c regional.c respip.c \
+ rfc_1982.c rpz.c rrdef.c rrset.c rtt.c sbuffer.c siphash.c \
+ slabhash.c str2wire.c tcp_conn_limit.c timehist.c timeval_func.c \
+ tube.c ub_event_pluggable.c val_anchor.c val_kcache.c val_kentry.c \
+ val_neg.c val_nsec.c val_nsec3.c val_secalgo.c val_sigcrypt.c \
+ val_utils.c validator.c view.c winsock_event.c wire2str.c
WARNS?= 2
NO_WTHREAD_SAFETY= true
diff --git a/lib/libunbound/config.h b/lib/libunbound/config.h
index a986bfc869a3..51105977b20a 100644
--- a/lib/libunbound/config.h
+++ b/lib/libunbound/config.h
@@ -20,7 +20,7 @@
/* #undef COMPAT_SHA512 */
/* Command line arguments used with configure */
-#define CONFCMDLINE "--with-ssl=/usr --with-libexpat=/usr --disable-dnscrypt --disable-dnstap --enable-ecdsa --disable-event-api --enable-gost --with-libevent --disable-subnet --disable-tfo-client --disable-tfo-server --with-pthreads--prefix=/usr --localstatedir=/var/unbound --mandir=/usr/share/man --build=freebsd"
+#define CONFCMDLINE "--prefix= --exec-prefix=/usr --with-conf-file=/var/unbound/unbound.conf --with-run-dir=/var/unbound --with-username=unbound"
/* Pathname to the Unbound configuration file */
#define CONFIGFILE "/var/unbound/unbound.conf"
@@ -49,13 +49,13 @@
internal symbols */
/* #undef EXPORT_ALL_SYMBOLS */
-/* Define to 1 if you have the `accept4' function. */
+/* Define to 1 if you have the 'accept4' function. */
#define HAVE_ACCEPT4 1
-/* Define to 1 if you have the `arc4random' function. */
+/* Define to 1 if you have the 'arc4random' function. */
#define HAVE_ARC4RANDOM 1
-/* Define to 1 if you have the `arc4random_uniform' function. */
+/* Define to 1 if you have the 'arc4random_uniform' function. */
#define HAVE_ARC4RANDOM_UNIFORM 1
/* Define to 1 if you have the <arpa/inet.h> header file. */
@@ -77,13 +77,10 @@
#define HAVE_ATTR_WEAK 1
/* If we have be64toh */
-/* #undef HAVE_BE64TOH */
+#define HAVE_BE64TOH 1
-/* Define to 1 if you have the `BIO_set_callback_ex' function. */
-/* #undef HAVE_BIO_SET_CALLBACK_EX */
-
-/* Define to 1 if you have the `BIO_set_callback_ex' function. */
-/* #undef HAVE_BIO_SET_CALLBACK_EX */
+/* Define to 1 if you have the 'BIO_set_callback_ex' function. */
+#define HAVE_BIO_SET_CALLBACK_EX 1
/* Define to 1 if you have the <bsd/stdlib.h> header file. */
/* #undef HAVE_BSD_STDLIB_H */
@@ -91,241 +88,241 @@
/* Define to 1 if you have the <bsd/string.h> header file. */
/* #undef HAVE_BSD_STRING_H */
-/* Define to 1 if you have the `chown' function. */
+/* Define to 1 if you have the 'chown' function. */
#define HAVE_CHOWN 1
-/* Define to 1 if you have the `chroot' function. */
+/* Define to 1 if you have the 'chroot' function. */
#define HAVE_CHROOT 1
-/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */
+/* Define to 1 if you have the 'CRYPTO_cleanup_all_ex_data' function. */
/* #undef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA */
-/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */
+/* Define to 1 if you have the 'CRYPTO_THREADID_set_callback' function. */
/* #undef HAVE_CRYPTO_THREADID_SET_CALLBACK */
-/* Define to 1 if you have the `ctime_r' function. */
+/* Define to 1 if you have the 'ctime_r' function. */
#define HAVE_CTIME_R 1
-/* Define to 1 if you have the `daemon' function. */
+/* Define to 1 if you have the 'daemon' function. */
#define HAVE_DAEMON 1
-/* Define to 1 if you have the declaration of `arc4random', and to 0 if you
+/* Define to 1 if you have the declaration of 'arc4random', and to 0 if you
don't. */
/* #undef HAVE_DECL_ARC4RANDOM */
-/* Define to 1 if you have the declaration of `arc4random_uniform', and to 0
+/* Define to 1 if you have the declaration of 'arc4random_uniform', and to 0
if you don't. */
/* #undef HAVE_DECL_ARC4RANDOM_UNIFORM */
-/* Define to 1 if you have the declaration of `evsignal_assign', and to 0 if
+/* Define to 1 if you have the declaration of 'evsignal_assign', and to 0 if
you don't. */
/* #undef HAVE_DECL_EVSIGNAL_ASSIGN */
-/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you
+/* Define to 1 if you have the declaration of 'inet_ntop', and to 0 if you
don't. */
#define HAVE_DECL_INET_NTOP 1
-/* Define to 1 if you have the declaration of `inet_pton', and to 0 if you
+/* Define to 1 if you have the declaration of 'inet_pton', and to 0 if you
don't. */
#define HAVE_DECL_INET_PTON 1
-/* Define to 1 if you have the declaration of `nghttp2_session_server_new',
+/* Define to 1 if you have the declaration of 'nghttp2_session_server_new',
and to 0 if you don't. */
/* #undef HAVE_DECL_NGHTTP2_SESSION_SERVER_NEW */
-/* Define to 1 if you have the declaration of `NID_ED25519', and to 0 if you
+/* Define to 1 if you have the declaration of 'ngtcp2_conn_server_new', and to
+ 0 if you don't. */
+/* #undef HAVE_DECL_NGTCP2_CONN_SERVER_NEW */
+
+/* Define to 1 if you have the declaration of 'ngtcp2_crypto_encrypt_cb', and
+ to 0 if you don't. */
+/* #undef HAVE_DECL_NGTCP2_CRYPTO_ENCRYPT_CB */
+
+/* Define to 1 if you have the declaration of 'NID_ED25519', and to 0 if you
don't. */
#define HAVE_DECL_NID_ED25519 1
-/* Define to 1 if you have the declaration of `NID_ED448', and to 0 if you
+/* Define to 1 if you have the declaration of 'NID_ED448', and to 0 if you
don't. */
#define HAVE_DECL_NID_ED448 1
-/* Define to 1 if you have the declaration of `NID_secp384r1', and to 0 if you
+/* Define to 1 if you have the declaration of 'NID_secp384r1', and to 0 if you
don't. */
#define HAVE_DECL_NID_SECP384R1 1
-/* Define to 1 if you have the declaration of `NID_X9_62_prime256v1', and to 0
+/* Define to 1 if you have the declaration of 'NID_X9_62_prime256v1', and to 0
if you don't. */
#define HAVE_DECL_NID_X9_62_PRIME256V1 1
-/* Define to 1 if you have the declaration of `reallocarray', and to 0 if you
+/* Define to 1 if you have the declaration of 'reallocarray', and to 0 if you
don't. */
#define HAVE_DECL_REALLOCARRAY 1
-/* Define to 1 if you have the declaration of `redisConnect', and to 0 if you
+/* Define to 1 if you have the declaration of 'redisConnect', and to 0 if you
don't. */
/* #undef HAVE_DECL_REDISCONNECT */
-/* Define to 1 if you have the declaration of `sk_SSL_COMP_pop_free', and to 0
+/* Define to 1 if you have the declaration of 'sk_SSL_COMP_pop_free', and to 0
if you don't. */
#define HAVE_DECL_SK_SSL_COMP_POP_FREE 1
/* Define to 1 if you have the declaration of
- `SSL_COMP_get_compression_methods', and to 0 if you don't. */
+ 'SSL_COMP_get_compression_methods', and to 0 if you don't. */
#define HAVE_DECL_SSL_COMP_GET_COMPRESSION_METHODS 1
-/* Define to 1 if you have the declaration of `SSL_CTX_set_ecdh_auto', and to
+/* Define to 1 if you have the declaration of 'SSL_CTX_set_ecdh_auto', and to
0 if you don't. */
-/* #undef HAVE_DECL_SSL_CTX_SET_ECDH_AUTO */
+#define HAVE_DECL_SSL_CTX_SET_ECDH_AUTO 1
-/* Define to 1 if you have the declaration of `strlcat', and to 0 if you
+/* Define to 1 if you have the declaration of 'strlcat', and to 0 if you
don't. */
/* #undef HAVE_DECL_STRLCAT */
-/* Define to 1 if you have the declaration of `strlcpy', and to 0 if you
+/* Define to 1 if you have the declaration of 'strlcpy', and to 0 if you
don't. */
/* #undef HAVE_DECL_STRLCPY */
-/* Define to 1 if you have the declaration of `XML_StopParser', and to 0 if
+/* Define to 1 if you have the declaration of 'XML_StopParser', and to 0 if
you don't. */
#define HAVE_DECL_XML_STOPPARSER 1
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
-/* Define to 1 if you have the `DSA_SIG_set0' function. */
+/* Define to 1 if you have the 'DSA_SIG_set0' function. */
#define HAVE_DSA_SIG_SET0 1
/* Define to 1 if you have the <endian.h> header file. */
-/* #undef HAVE_ENDIAN_H */
+#define HAVE_ENDIAN_H 1
-/* Define to 1 if you have the `endprotoent' function. */
+/* Define to 1 if you have the 'endprotoent' function. */
#define HAVE_ENDPROTOENT 1
-/* Define to 1 if you have the `endpwent' function. */
+/* Define to 1 if you have the 'endpwent' function. */
#define HAVE_ENDPWENT 1
-/* Define to 1 if you have the `endservent' function. */
+/* Define to 1 if you have the 'endservent' function. */
#define HAVE_ENDSERVENT 1
-/* Define to 1 if you have the `ENGINE_cleanup' function. */
+/* Define to 1 if you have the 'ENGINE_cleanup' function. */
/* #undef HAVE_ENGINE_CLEANUP */
-/* Define to 1 if you have the `ERR_free_strings' function. */
+/* Define to 1 if you have the 'ERR_free_strings' function. */
/* #undef HAVE_ERR_FREE_STRINGS */
-/* Define to 1 if you have the `ERR_load_crypto_strings' function. */
+/* Define to 1 if you have the 'ERR_load_crypto_strings' function. */
/* #undef HAVE_ERR_LOAD_CRYPTO_STRINGS */
-/* Define to 1 if you have the `event_assign' function. */
+/* Define to 1 if you have the 'event_assign' function. */
/* #undef HAVE_EVENT_ASSIGN */
-/* Define to 1 if you have the `event_base_free' function. */
+/* Define to 1 if you have the 'event_base_free' function. */
/* #undef HAVE_EVENT_BASE_FREE */
-/* Define to 1 if you have the `event_base_get_method' function. */
+/* Define to 1 if you have the 'event_base_get_method' function. */
/* #undef HAVE_EVENT_BASE_GET_METHOD */
-/* Define to 1 if you have the `event_base_new' function. */
+/* Define to 1 if you have the 'event_base_new' function. */
/* #undef HAVE_EVENT_BASE_NEW */
-/* Define to 1 if you have the `event_base_once' function. */
+/* Define to 1 if you have the 'event_base_once' function. */
/* #undef HAVE_EVENT_BASE_ONCE */
/* Define to 1 if you have the <event.h> header file. */
/* #undef HAVE_EVENT_H */
-/* Define to 1 if you have the `EVP_aes_256_cbc' function. */
+/* Define to 1 if you have the 'EVP_aes_256_cbc' function. */
#define HAVE_EVP_AES_256_CBC 1
-/* Define to 1 if you have the `EVP_cleanup' function. */
+/* Define to 1 if you have the 'EVP_cleanup' function. */
/* #undef HAVE_EVP_CLEANUP */
-/* Define to 1 if you have the `EVP_default_properties_is_fips_enabled'
+/* Define to 1 if you have the 'EVP_default_properties_is_fips_enabled'
function. */
-/* #undef HAVE_EVP_DEFAULT_PROPERTIES_IS_FIPS_ENABLED */
-
+#define HAVE_EVP_DEFAULT_PROPERTIES_IS_FIPS_ENABLED 1
-/* Define to 1 if you have the `EVP_default_properties_is_fips_enabled'
- function. */
-/* #undef HAVE_EVP_DEFAULT_PROPERTIES_IS_FIPS_ENABLED */
-
-/* Define to 1 if you have the `EVP_DigestVerify' function. */
+/* Define to 1 if you have the 'EVP_DigestVerify' function. */
#define HAVE_EVP_DIGESTVERIFY 1
-/* Define to 1 if you have the `EVP_dss1' function. */
+/* Define to 1 if you have the 'EVP_dss1' function. */
/* #undef HAVE_EVP_DSS1 */
-/* Define to 1 if you have the `EVP_EncryptInit_ex' function. */
+/* Define to 1 if you have the 'EVP_EncryptInit_ex' function. */
#define HAVE_EVP_ENCRYPTINIT_EX 1
-/* Define to 1 if you have the `EVP_MAC_CTX_set_params' function. */
-/* #undef HAVE_EVP_MAC_CTX_SET_PARAMS */
+/* Define to 1 if you have the 'EVP_MAC_CTX_set_params' function. */
+#define HAVE_EVP_MAC_CTX_SET_PARAMS 1
-/* Define to 1 if you have the `EVP_MD_CTX_new' function. */
+/* Define to 1 if you have the 'EVP_MD_CTX_new' function. */
#define HAVE_EVP_MD_CTX_NEW 1
-/* Define to 1 if you have the `EVP_sha1' function. */
+/* Define to 1 if you have the 'EVP_sha1' function. */
#define HAVE_EVP_SHA1 1
-/* Define to 1 if you have the `EVP_sha256' function. */
+/* Define to 1 if you have the 'EVP_sha256' function. */
#define HAVE_EVP_SHA256 1
-/* Define to 1 if you have the `EVP_sha512' function. */
+/* Define to 1 if you have the 'EVP_sha512' function. */
#define HAVE_EVP_SHA512 1
-/* Define to 1 if you have the `ev_default_loop' function. */
+/* Define to 1 if you have the 'ev_default_loop' function. */
/* #undef HAVE_EV_DEFAULT_LOOP */
-/* Define to 1 if you have the `ev_loop' function. */
+/* Define to 1 if you have the 'ev_loop' function. */
/* #undef HAVE_EV_LOOP */
/* Define to 1 if you have the <expat.h> header file. */
#define HAVE_EXPAT_H 1
-/* Define to 1 if you have the `explicit_bzero' function. */
+/* Define to 1 if you have the 'explicit_bzero' function. */
#define HAVE_EXPLICIT_BZERO 1
-/* Define to 1 if you have the `fcntl' function. */
+/* Define to 1 if you have the 'fcntl' function. */
#define HAVE_FCNTL 1
-/* Define to 1 if you have the `FIPS_mode' function. */
-#define HAVE_FIPS_MODE 1
+/* Define to 1 if you have the 'FIPS_mode' function. */
+/* #undef HAVE_FIPS_MODE */
-/* Define to 1 if you have the `fork' function. */
+/* Define to 1 if you have the 'fork' function. */
#define HAVE_FORK 1
-/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+/* Define to 1 if fseeko (and ftello) are declared in stdio.h. */
#define HAVE_FSEEKO 1
-/* Define to 1 if you have the `fsync' function. */
+/* Define to 1 if you have the 'fsync' function. */
#define HAVE_FSYNC 1
/* Whether getaddrinfo is available */
#define HAVE_GETADDRINFO 1
-/* Define to 1 if you have the `getauxval' function. */
+/* Define to 1 if you have the 'getauxval' function. */
/* #undef HAVE_GETAUXVAL */
-/* Define to 1 if you have the `getentropy' function. */
+/* Define to 1 if you have the 'getentropy' function. */
/* #undef HAVE_GETENTROPY */
-/* Define to 1 if you have the `getifaddrs' function. */
+/* Define to 1 if you have the 'getifaddrs' function. */
#define HAVE_GETIFADDRS 1
/* Define to 1 if you have the <getopt.h> header file. */
#define HAVE_GETOPT_H 1
-/* Define to 1 if you have the `getpwnam' function. */
+/* Define to 1 if you have the 'getpwnam' function. */
#define HAVE_GETPWNAM 1
-/* Define to 1 if you have the `getrlimit' function. */
+/* Define to 1 if you have the 'getrlimit' function. */
#define HAVE_GETRLIMIT 1
-/* Define to 1 if you have the `gettid' function. */
-/* #undef HAVE_GETTID */
-
-/* Define to 1 if you have the `gettid' function. */
+/* Define to 1 if you have the 'gettid' function. */
/* #undef HAVE_GETTID */
-/* Define to 1 if you have the `glob' function. */
+/* Define to 1 if you have the 'glob' function. */
#define HAVE_GLOB 1
/* Define to 1 if you have the <glob.h> header file. */
#define HAVE_GLOB_H 1
-/* Define to 1 if you have the `gmtime_r' function. */
+/* Define to 1 if you have the 'gmtime_r' function. */
#define HAVE_GMTIME_R 1
/* Define to 1 if you have the <grp.h> header file. */
@@ -334,31 +331,28 @@
/* Define to 1 if you have the <hiredis/hiredis.h> header file. */
/* #undef HAVE_HIREDIS_HIREDIS_H */
-/* Define to 1 if you have the `HMAC_Init_ex' function. */
+/* Define to 1 if you have the 'HMAC_Init_ex' function. */
#define HAVE_HMAC_INIT_EX 1
/* If we have htobe64 */
-/* #undef HAVE_HTOBE64 */
+#define HAVE_HTOBE64 1
/* Define to 1 if you have the <ifaddrs.h> header file. */
#define HAVE_IFADDRS_H 1
-/* Define to 1 if you have the `if_nametoindex' function. */
+/* Define to 1 if you have the 'if_nametoindex' function. */
#define HAVE_IF_NAMETOINDEX 1
-/* Define to 1 if you have the `if_nametoindex' function. */
-#define HAVE_IF_NAMETOINDEX 1
-
-/* Define to 1 if you have the `inet_aton' function. */
+/* Define to 1 if you have the 'inet_aton' function. */
#define HAVE_INET_ATON 1
-/* Define to 1 if you have the `inet_ntop' function. */
+/* Define to 1 if you have the 'inet_ntop' function. */
#define HAVE_INET_NTOP 1
-/* Define to 1 if you have the `inet_pton' function. */
+/* Define to 1 if you have the 'inet_pton' function. */
#define HAVE_INET_PTON 1
-/* Define to 1 if you have the `initgroups' function. */
+/* Define to 1 if you have the 'initgroups' function. */
#define HAVE_INITGROUPS 1
/* Define to 1 if you have the <inttypes.h> header file. */
@@ -370,10 +364,10 @@
/* Define to 1 if you have the <iphlpapi.h> header file. */
/* #undef HAVE_IPHLPAPI_H */
-/* Define to 1 if you have the `isblank' function. */
+/* Define to 1 if you have the 'isblank' function. */
#define HAVE_ISBLANK 1
-/* Define to 1 if you have the `kill' function. */
+/* Define to 1 if you have the 'kill' function. */
#define HAVE_KILL 1
/* Use portable libbsd functions */
@@ -385,7 +379,13 @@
/* Define if we have LibreSSL */
/* #undef HAVE_LIBRESSL */
-/* Define to 1 if you have the `localtime_r' function. */
+/* If we have atomic_store */
+#define HAVE_LINK_ATOMIC_STORE 1
+
+/* Define to 1 if you have the <linux/net_tstamp.h> header file. */
+/* #undef HAVE_LINUX_NET_TSTAMP_H */
+
+/* Define to 1 if you have the 'localtime_r' function. */
#define HAVE_LOCALTIME_R 1
/* Define to 1 if you have the <login_cap.h> header file. */
@@ -394,7 +394,7 @@
/* If have GNU libc compatible malloc */
#define HAVE_MALLOC 1
-/* Define to 1 if you have the `memmove' function. */
+/* Define to 1 if you have the 'memmove' function. */
#define HAVE_MEMMOVE 1
/* Define to 1 if you have the <minix/config.h> header file. */
@@ -424,29 +424,91 @@
/* Define to 1 if you have the <net/if.h> header file. */
#define HAVE_NET_IF_H 1
+/* Define to 1 if you have the <net/pfvar.h> header file. */
+/* #undef HAVE_NET_PFVAR_H */
+
/* Define this to use nghttp2 client. */
/* #undef HAVE_NGHTTP2 */
/* Define to 1 if you have the <nghttp2/nghttp2.h> header file. */
/* #undef HAVE_NGHTTP2_NGHTTP2_H */
+/* Define this to use ngtcp2. */
+/* #undef HAVE_NGTCP2 */
+
+/* Define to 1 if you have the 'ngtcp2_ccerr_default' function. */
+/* #undef HAVE_NGTCP2_CCERR_DEFAULT */
+
+/* Define to 1 if you have the 'ngtcp2_conn_encode_0rtt_transport_params'
+ function. */
+/* #undef HAVE_NGTCP2_CONN_ENCODE_0RTT_TRANSPORT_PARAMS */
+
+/* Define to 1 if you have the 'ngtcp2_conn_get_max_local_streams_uni'
+ function. */
+/* #undef HAVE_NGTCP2_CONN_GET_MAX_LOCAL_STREAMS_UNI */
+
+/* Define to 1 if you have the 'ngtcp2_conn_get_num_scid' function. */
+/* #undef HAVE_NGTCP2_CONN_GET_NUM_SCID */
+
+/* Define to 1 if you have the 'ngtcp2_conn_in_closing_period' function. */
+/* #undef HAVE_NGTCP2_CONN_IN_CLOSING_PERIOD */
+
+/* Define to 1 if you have the 'ngtcp2_conn_in_draining_period' function. */
+/* #undef HAVE_NGTCP2_CONN_IN_DRAINING_PERIOD */
+
+/* Define if ngtcp2_conn_shutdown_stream has 4 arguments. */
+/* #undef HAVE_NGTCP2_CONN_SHUTDOWN_STREAM4 */
+
+/* Define to 1 if you have the 'ngtcp2_conn_tls_early_data_rejected' function.
+ */
+/* #undef HAVE_NGTCP2_CONN_TLS_EARLY_DATA_REJECTED */
+
+/* Define to 1 if you have the 'ngtcp2_crypto_encrypt_cb' function. */
+/* #undef HAVE_NGTCP2_CRYPTO_ENCRYPT_CB */
+
+/* Define to 1 if you have the
+ 'ngtcp2_crypto_quictls_configure_client_context' function. */
+/* #undef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_CLIENT_CONTEXT */
+
+/* Define to 1 if you have the
+ 'ngtcp2_crypto_quictls_configure_server_context' function. */
+/* #undef HAVE_NGTCP2_CRYPTO_QUICTLS_CONFIGURE_SERVER_CONTEXT */
+
+/* Define to 1 if you have the
+ 'ngtcp2_crypto_quictls_from_ossl_encryption_level' function. */
+/* #undef HAVE_NGTCP2_CRYPTO_QUICTLS_FROM_OSSL_ENCRYPTION_LEVEL */
+
+/* Define to 1 if the system has the type 'ngtcp2_encryption_level'. */
+/* #undef HAVE_NGTCP2_ENCRYPTION_LEVEL */
+
+/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto_openssl.h> header file.
+ */
+/* #undef HAVE_NGTCP2_NGTCP2_CRYPTO_OPENSSL_H */
+
+/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto_quictls.h> header file.
+ */
+/* #undef HAVE_NGTCP2_NGTCP2_CRYPTO_QUICTLS_H */
+
+/* Define to 1 if you have the <ngtcp2/ngtcp2.h> header file. */
+/* #undef HAVE_NGTCP2_NGTCP2_H */
+
/* Use libnss for crypto */
/* #undef HAVE_NSS */
-/* Define to 1 if you have the `OpenSSL_add_all_digests' function. */
+/* Define to 1 if you have the 'OpenSSL_add_all_digests' function. */
/* #undef HAVE_OPENSSL_ADD_ALL_DIGESTS */
/* Define to 1 if you have the <openssl/bn.h> header file. */
#define HAVE_OPENSSL_BN_H 1
-/* Define to 1 if you have the `OPENSSL_config' function. */
+/* Define to 1 if you have the 'OPENSSL_config' function. */
#define HAVE_OPENSSL_CONFIG 1
/* Define to 1 if you have the <openssl/conf.h> header file. */
#define HAVE_OPENSSL_CONF_H 1
/* Define to 1 if you have the <openssl/core_names.h> header file. */
-/* #undef HAVE_OPENSSL_CORE_NAMES_H */
+#define HAVE_OPENSSL_CORE_NAMES_H 1
/* Define to 1 if you have the <openssl/dh.h> header file. */
#define HAVE_OPENSSL_DH_H 1
@@ -460,14 +522,14 @@
/* Define to 1 if you have the <openssl/err.h> header file. */
#define HAVE_OPENSSL_ERR_H 1
-/* Define to 1 if you have the `OPENSSL_init_crypto' function. */
+/* Define to 1 if you have the 'OPENSSL_init_crypto' function. */
#define HAVE_OPENSSL_INIT_CRYPTO 1
-/* Define to 1 if you have the `OPENSSL_init_ssl' function. */
+/* Define to 1 if you have the 'OPENSSL_init_ssl' function. */
#define HAVE_OPENSSL_INIT_SSL 1
/* Define to 1 if you have the <openssl/param_build.h> header file. */
-/* #undef HAVE_OPENSSL_PARAM_BUILD_H */
+#define HAVE_OPENSSL_PARAM_BUILD_H 1
/* Define to 1 if you have the <openssl/rand.h> header file. */
#define HAVE_OPENSSL_RAND_H 1
@@ -478,10 +540,10 @@
/* Define to 1 if you have the <openssl/ssl.h> header file. */
#define HAVE_OPENSSL_SSL_H 1
-/* Define to 1 if you have the `OSSL_PARAM_BLD_new' function. */
-/* #undef HAVE_OSSL_PARAM_BLD_NEW */
+/* Define to 1 if you have the 'OSSL_PARAM_BLD_new' function. */
+#define HAVE_OSSL_PARAM_BLD_NEW 1
-/* Define to 1 if you have the `poll' function. */
+/* Define to 1 if you have the 'poll' function. */
#define HAVE_POLL 1
/* Define to 1 if you have the <poll.h> header file. */
@@ -493,10 +555,10 @@
/* Have PTHREAD_PRIO_INHERIT. */
#define HAVE_PTHREAD_PRIO_INHERIT 1
-/* Define to 1 if the system has the type `pthread_rwlock_t'. */
+/* Define to 1 if the system has the type 'pthread_rwlock_t'. */
#define HAVE_PTHREAD_RWLOCK_T 1
-/* Define to 1 if the system has the type `pthread_spinlock_t'. */
+/* Define to 1 if the system has the type 'pthread_spinlock_t'. */
#define HAVE_PTHREAD_SPINLOCK_T 1
/* Define to 1 if you have the <pwd.h> header file. */
@@ -505,100 +567,109 @@
/* Define if you have Python libraries and header files. */
/* #undef HAVE_PYTHON */
-/* Define to 1 if you have the `random' function. */
+/* Define to 1 if you have the 'random' function. */
#define HAVE_RANDOM 1
-/* Define to 1 if you have the `RAND_cleanup' function. */
+/* Define to 1 if you have the 'RAND_cleanup' function. */
/* #undef HAVE_RAND_CLEANUP */
/* If we have reallocarray(3) */
#define HAVE_REALLOCARRAY 1
-/* Define to 1 if you have the `recvmsg' function. */
+/* Define to 1 if you have the 'recvmsg' function. */
#define HAVE_RECVMSG 1
-/* Define to 1 if you have the `sendmsg' function. */
+/* Define to 1 if you have the 'sendmsg' function. */
#define HAVE_SENDMSG 1
-/* Define to 1 if you have the `setregid' function. */
+/* Define to 1 if you have the 'setregid' function. */
/* #undef HAVE_SETREGID */
-/* Define to 1 if you have the `setresgid' function. */
+/* Define to 1 if you have the 'setresgid' function. */
#define HAVE_SETRESGID 1
-/* Define to 1 if you have the `setresuid' function. */
+/* Define to 1 if you have the 'setresuid' function. */
#define HAVE_SETRESUID 1
-/* Define to 1 if you have the `setreuid' function. */
+/* Define to 1 if you have the 'setreuid' function. */
/* #undef HAVE_SETREUID */
-/* Define to 1 if you have the `setrlimit' function. */
+/* Define to 1 if you have the 'setrlimit' function. */
#define HAVE_SETRLIMIT 1
-/* Define to 1 if you have the `setsid' function. */
+/* Define to 1 if you have the 'setsid' function. */
#define HAVE_SETSID 1
-/* Define to 1 if you have the `setusercontext' function. */
+/* Define to 1 if you have the 'setusercontext' function. */
#define HAVE_SETUSERCONTEXT 1
-/* Define to 1 if you have the `SHA512_Update' function. */
+/* Define to 1 if you have the 'SHA512_Update' function. */
/* #undef HAVE_SHA512_UPDATE */
-/* Define to 1 if you have the `shmget' function. */
+/* Define to 1 if you have the 'shmget' function. */
#define HAVE_SHMGET 1
-/* Define to 1 if you have the `sigprocmask' function. */
+/* Define to 1 if you have the 'sigprocmask' function. */
#define HAVE_SIGPROCMASK 1
-/* Define to 1 if you have the `sleep' function. */
+/* Define to 1 if you have the 'sleep' function. */
#define HAVE_SLEEP 1
-/* Define to 1 if you have the `snprintf' function. */
+/* Define to 1 if you have the 'snprintf' function. */
#define HAVE_SNPRINTF 1
-/* Define to 1 if you have the `socketpair' function. */
+/* Define to 1 if you have the 'socketpair' function. */
#define HAVE_SOCKETPAIR 1
/* Using Solaris threads */
/* #undef HAVE_SOLARIS_THREADS */
-/* Define to 1 if you have the `srandom' function. */
+/* Define to 1 if you have the 'srandom' function. */
#define HAVE_SRANDOM 1
/* Define if you have the SSL libraries installed. */
#define HAVE_SSL /**/
-/* Define to 1 if you have the `SSL_CTX_set_alpn_protos' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_alpn_protos' function. */
#define HAVE_SSL_CTX_SET_ALPN_PROTOS 1
-/* Define to 1 if you have the `SSL_CTX_set_alpn_select_cb' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_alpn_select_cb' function. */
#define HAVE_SSL_CTX_SET_ALPN_SELECT_CB 1
-/* Define to 1 if you have the `SSL_CTX_set_ciphersuites' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_ciphersuites' function. */
#define HAVE_SSL_CTX_SET_CIPHERSUITES 1
-/* Define to 1 if you have the `SSL_CTX_set_security_level' function. */
+/* Define to 1 if you have the 'SSL_CTX_set_security_level' function. */
#define HAVE_SSL_CTX_SET_SECURITY_LEVEL 1
-/* Define to 1 if you have the `SSL_CTX_set_tlsext_ticket_key_evp_cb'
+/* Define to 1 if you have the 'SSL_CTX_set_tlsext_ticket_key_evp_cb'
function. */
-/* #undef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB */
+#define HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB 1
+
+/* Define to 1 if you have the 'SSL_CTX_set_tmp_ecdh' function. */
+/* #undef HAVE_SSL_CTX_SET_TMP_ECDH */
-/* Define to 1 if you have the `SSL_get0_alpn_selected' function. */
+/* Define to 1 if you have the 'SSL_get0_alpn_selected' function. */
#define HAVE_SSL_GET0_ALPN_SELECTED 1
-/* Define to 1 if you have the `SSL_get0_peername' function. */
+/* Define to 1 if you have the 'SSL_get0_peername' function. */
#define HAVE_SSL_GET0_PEERNAME 1
-/* Define to 1 if you have the `SSL_get1_peer_certificate' function. */
-/* #undef HAVE_SSL_GET1_PEER_CERTIFICATE */
+/* Define to 1 if you have the 'SSL_get1_peer_certificate' function. */
+#define HAVE_SSL_GET1_PEER_CERTIFICATE 1
-/* Define to 1 if you have the `SSL_set1_host' function. */
+/* Define to 1 if you have the 'SSL_is_quic' function. */
+/* #undef HAVE_SSL_IS_QUIC */
+
+/* Define to 1 if you have the 'SSL_set1_host' function. */
#define HAVE_SSL_SET1_HOST 1
/* Define to 1 if you have the <stdarg.h> header file. */
#define HAVE_STDARG_H 1
+/* Define to 1 if you have the <stdatomic.h> header file. */
+#define HAVE_STDATOMIC_H 1
+
/* Define to 1 if you have the <stdbool.h> header file. */
#define HAVE_STDBOOL_H 1
@@ -611,7 +682,7 @@
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
-/* Define to 1 if you have the `strftime' function. */
+/* Define to 1 if you have the 'strftime' function. */
#define HAVE_STRFTIME 1
/* Define to 1 if you have the <strings.h> header file. */
@@ -620,22 +691,39 @@
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
-/* Define to 1 if you have the `strlcat' function. */
+/* Define to 1 if you have the 'strlcat' function. */
#define HAVE_STRLCAT 1
-/* Define to 1 if you have the `strlcpy' function. */
+/* Define to 1 if you have the 'strlcpy' function. */
#define HAVE_STRLCPY 1
-/* Define to 1 if you have the `strptime' function. */
+/* Define to 1 if you have the 'strptime' function. */
#define HAVE_STRPTIME 1
-/* Define to 1 if you have the `strsep' function. */
+/* Define to 1 if you have the 'strsep' function. */
#define HAVE_STRSEP 1
-/* Define to 1 if `ipi_spec_dst' is a member of `struct in_pktinfo'. */
+/* Define to 1 if 'ipi_spec_dst' is a member of 'struct in_pktinfo'. */
/* #undef HAVE_STRUCT_IN_PKTINFO_IPI_SPEC_DST */
-/* Define to 1 if `sun_len' is a member of `struct sockaddr_un'. */
+/* Define to 1 if 'tokenlen' is a member of 'struct ngtcp2_pkt_hd'. */
+/* #undef HAVE_STRUCT_NGTCP2_PKT_HD_TOKENLEN */
+
+/* Define to 1 if 'max_tx_udp_payload_size' is a member of 'struct
+ ngtcp2_settings'. */
+/* #undef HAVE_STRUCT_NGTCP2_SETTINGS_MAX_TX_UDP_PAYLOAD_SIZE */
+
+/* Define to 1 if 'tokenlen' is a member of 'struct ngtcp2_settings'. */
+/* #undef HAVE_STRUCT_NGTCP2_SETTINGS_TOKENLEN */
+
+/* Define to 1 if 'original_dcid_present' is a member of 'struct
+ ngtcp2_transport_params'. */
+/* #undef HAVE_STRUCT_NGTCP2_TRANSPORT_PARAMS_ORIGINAL_DCID_PRESENT */
+
+/* Define to 1 if the system has the type 'struct ngtcp2_version_cid'. */
+/* #undef HAVE_STRUCT_NGTCP2_VERSION_CID */
+
+/* Define to 1 if 'sun_len' is a member of 'struct sockaddr_un'. */
#define HAVE_STRUCT_SOCKADDR_UN_SUN_LEN 1
/* Define if you have Swig libraries and header files. */
@@ -695,16 +783,16 @@
/* Define to 1 if you have the <time.h> header file. */
#define HAVE_TIME_H 1
-/* Define to 1 if you have the `tzset' function. */
+/* Define to 1 if you have the 'tzset' function. */
#define HAVE_TZSET 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
-/* Define to 1 if you have the `usleep' function. */
+/* Define to 1 if you have the 'usleep' function. */
#define HAVE_USLEEP 1
-/* Define to 1 if you have the `vfork' function. */
+/* Define to 1 if you have the 'vfork' function. */
#define HAVE_VFORK 1
/* Define to 1 if you have the <vfork.h> header file. */
@@ -722,22 +810,22 @@
/* Define to 1 if you have the <winsock2.h> header file. */
/* #undef HAVE_WINSOCK2_H */
-/* Define to 1 if `fork' works. */
+/* Define to 1 if 'fork' works. */
#define HAVE_WORKING_FORK 1
-/* Define to 1 if `vfork' works. */
+/* Define to 1 if 'vfork' works. */
#define HAVE_WORKING_VFORK 1
-/* Define to 1 if you have the `writev' function. */
+/* Define to 1 if you have the 'writev' function. */
#define HAVE_WRITEV 1
/* Define to 1 if you have the <ws2tcpip.h> header file. */
/* #undef HAVE_WS2TCPIP_H */
-/* Define to 1 if you have the `X509_VERIFY_PARAM_set1_host' function. */
+/* Define to 1 if you have the 'X509_VERIFY_PARAM_set1_host' function. */
#define HAVE_X509_VERIFY_PARAM_SET1_HOST 1
-/* Define to 1 if you have the `_beginthreadex' function. */
+/* Define to 1 if you have the '_beginthreadex' function. */
/* #undef HAVE__BEGINTHREADEX */
/* If HMAC_Init_ex() returns void */
@@ -796,7 +884,7 @@
#define PACKAGE_NAME "unbound"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "unbound 1.23.0"
+#define PACKAGE_STRING "unbound 1.23.1"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "unbound"
@@ -805,7 +893,7 @@
#define PACKAGE_URL ""
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.23.0"
+#define PACKAGE_VERSION "1.23.1"
/* default pidfile location */
#define PIDFILE "/var/unbound/unbound.pid"
@@ -828,7 +916,7 @@
#define ROOT_CERT_FILE "/var/unbound/icannbundle.pem"
/* version number for resource files */
-#define RSRC_PACKAGE_VERSION 1,23,0,0
+#define RSRC_PACKAGE_VERSION 1,23,1,0
/* Directory to chdir to */
#define RUN_DIR "/var/unbound"
@@ -836,32 +924,17 @@
/* Shared data */
#define SHARE_DIR "/var/unbound"
-#ifdef __LP64__
-/* The size of `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 8
-/* The size of `size_t'. */
-/* The size of `pthread_t', as computed by sizeof. */
+/* The size of 'pthread_t', as computed by sizeof. */
#define SIZEOF_PTHREAD_T 8
-#else
-#define SIZEOF_SIZE_T 4
-/* The size of `size_t'. */
-/* The size of `pthread_t', as computed by sizeof. */
-#define SIZEOF_PTHREAD_T 4
-#endif
-/* The size of `time_t', as computed by sizeof. */
-#ifdef __i386__
-#define SIZEOF_TIME_T 4
-#else
+/* The size of 'size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 8
+
+/* The size of 'time_t', as computed by sizeof. */
#define SIZEOF_TIME_T 8
-#endif
-/* The size of `unsigned long', as computed by sizeof. */
-#ifdef __LP64__
+/* The size of 'unsigned long', as computed by sizeof. */
#define SIZEOF_UNSIGNED_LONG 8
-#else
-#define SIZEOF_UNSIGNED_LONG 4
-#endif
/* define if (v)snprintf does not return length needed, (but length used) */
/* #undef SNPRINTF_RET_BROKEN */
@@ -869,7 +942,7 @@
/* Define to 1 if libsodium supports sodium_set_misuse_handler */
/* #undef SODIUM_MISUSE_HANDLER */
-/* Define to 1 if all of the C90 standard headers exist (not just the ones
+/* Define to 1 if all of the C89 standard headers exist (not just the ones
required in a freestanding environment). This macro is provided for
backward compatibility; new code need not use it. */
#define STDC_HEADERS 1
@@ -911,7 +984,7 @@
/* #undef USE_DNSTAP */
/* Define this to enable DSA support. */
-#define USE_DSA 1
+/* #undef USE_DSA */
/* Define this to enable ECDSA support. */
#define USE_ECDSA 1
@@ -935,7 +1008,7 @@
/* #undef USE_IPSET */
/* Define if you enable libevent */
-#define USE_LIBEVENT 1
+/* #undef USE_LIBEVENT */
/* Define this to enable use of /proc/sys/net/ipv4/ip_local_port_range as a
default outgoing port range. This is only for the libunbound on Linux and
@@ -963,7 +1036,7 @@
/* Define this to enable SHA256 and SHA512 support. */
#define USE_SHA2 1
-/* Enable extensions on AIX 3, Interix. */
+/* Enable extensions on AIX, Interix, z/OS. */
#ifndef _ALL_SOURCE
# define _ALL_SOURCE 1
#endif
@@ -1024,11 +1097,15 @@
#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
# define __STDC_WANT_IEC_60559_DFP_EXT__ 1
#endif
+/* Enable extensions specified by C23 Annex F. */
+#ifndef __STDC_WANT_IEC_60559_EXT__
+# define __STDC_WANT_IEC_60559_EXT__ 1
+#endif
/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1
#endif
-/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
+/* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */
#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1
#endif
@@ -1069,30 +1146,36 @@
/* Define if you want PyUnbound. */
/* #undef WITH_PYUNBOUND */
-/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
- `char[]'. */
+/* Define to 1 if 'lex' declares 'yytext' as a 'char *' by default, not a
+ 'char[]'. */
#define YYTEXT_POINTER 1
/* Number of bits in a file offset, on hosts where this is settable. */
/* #undef _FILE_OFFSET_BITS */
-/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* Define to 1 if necessary to make fseeko visible. */
/* #undef _LARGEFILE_SOURCE */
-/* Define for large files, on AIX-style hosts. */
+/* Define to 1 on platforms where this makes off_t a 64-bit type. */
/* #undef _LARGE_FILES */
/* Enable for compile on Minix */
#define _NETBSD_SOURCE 1
+/* Number of bits in time_t, on hosts where this is settable. */
+/* #undef _TIME_BITS */
+
+/* Define to 1 on platforms where this makes time_t a 64-bit type. */
+/* #undef __MINGW_USE_VC2005_COMPAT */
+
/* defined to use gcc ansi snprintf and sscanf that understands %lld when
compiled for windows. */
/* #undef __USE_MINGW_ANSI_STDIO */
-/* Define to empty if `const' does not conform to ANSI C. */
+/* Define to empty if 'const' does not conform to ANSI C. */
/* #undef const */
-/* Define to `int' if <sys/types.h> doesn't define. */
+/* Define as 'int' if <sys/types.h> doesn't define. */
/* #undef gid_t */
/* in_addr_t */
@@ -1101,28 +1184,28 @@
/* in_port_t */
/* #undef in_port_t */
-/* Define to `__inline__' or `__inline' if that's what the C compiler
+/* Define to '__inline__' or '__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
/* #undef inline */
#endif
-/* Define to `short' if <sys/types.h> does not define. */
+/* Define to 'short' if <sys/types.h> does not define. */
/* #undef int16_t */
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define to 'int' if <sys/types.h> does not define. */
/* #undef int32_t */
-/* Define to `long long' if <sys/types.h> does not define. */
+/* Define to 'long long' if <sys/types.h> does not define. */
/* #undef int64_t */
-/* Define to `signed char' if <sys/types.h> does not define. */
+/* Define to 'signed char' if <sys/types.h> does not define. */
/* #undef int8_t */
/* Define if replacement function should be used. */
/* #undef malloc */
-/* Define to `long int' if <sys/types.h> does not define. */
+/* Define to 'long int' if <sys/types.h> does not define. */
/* #undef off_t */
/* Define as a signed integer type capable of holding a process identifier. */
@@ -1131,71 +1214,71 @@
/* Define to 'int' if not defined */
/* #undef rlim_t */
-/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* Define as 'unsigned int' if <stddef.h> doesn't define. */
/* #undef size_t */
/* Define to 'int' if not defined */
/* #undef socklen_t */
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define to 'int' if <sys/types.h> does not define. */
/* #undef ssize_t */
/* Define to 'unsigned char if not defined */
/* #undef u_char */
-/* Define to `int' if <sys/types.h> doesn't define. */
+/* Define as 'int' if <sys/types.h> doesn't define. */
/* #undef uid_t */
-/* Define to `unsigned short' if <sys/types.h> does not define. */
+/* Define to 'unsigned short' if <sys/types.h> does not define. */
/* #undef uint16_t */
-/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* Define to 'unsigned int' if <sys/types.h> does not define. */
/* #undef uint32_t */
-/* Define to `unsigned long long' if <sys/types.h> does not define. */
+/* Define to 'unsigned long long' if <sys/types.h> does not define. */
/* #undef uint64_t */
-/* Define to `unsigned char' if <sys/types.h> does not define. */
+/* Define to 'unsigned char' if <sys/types.h> does not define. */
/* #undef uint8_t */
-/* Define as `fork' if `vfork' does not work. */
+/* Define as 'fork' if 'vfork' does not work. */
/* #undef vfork */
#if defined(OMITTED__D_GNU_SOURCE) && !defined(_GNU_SOURCE)
#define _GNU_SOURCE 1
-#endif
+#endif
#if defined(OMITTED__D_BSD_SOURCE) && !defined(_BSD_SOURCE)
#define _BSD_SOURCE 1
-#endif
+#endif
#if defined(OMITTED__D_DEFAULT_SOURCE) && !defined(_DEFAULT_SOURCE)
#define _DEFAULT_SOURCE 1
-#endif
+#endif
#if defined(OMITTED__D__EXTENSIONS__) && !defined(__EXTENSIONS__)
#define __EXTENSIONS__ 1
-#endif
+#endif
#if defined(OMITTED__D_POSIX_C_SOURCE_200112) && !defined(_POSIX_C_SOURCE)
#define _POSIX_C_SOURCE 200112
-#endif
+#endif
#if defined(OMITTED__D_XOPEN_SOURCE_600) && !defined(_XOPEN_SOURCE)
#define _XOPEN_SOURCE 600
-#endif
+#endif
#if defined(OMITTED__D_XOPEN_SOURCE_EXTENDED_1) && !defined(_XOPEN_SOURCE_EXTENDED)
#define _XOPEN_SOURCE_EXTENDED 1
-#endif
+#endif
#if defined(OMITTED__D_ALL_SOURCE) && !defined(_ALL_SOURCE)
#define _ALL_SOURCE 1
-#endif
+#endif
#if defined(OMITTED__D_LARGEFILE_SOURCE_1) && !defined(_LARGEFILE_SOURCE)
#define _LARGEFILE_SOURCE 1
-#endif
+#endif
@@ -1279,7 +1362,7 @@
#endif
-
+
#ifdef HAVE_ATTR_FORMAT
# define ATTR_FORMAT(archetype, string_index, first_to_check) \
__attribute__ ((format (archetype, string_index, first_to_check)))
@@ -1389,7 +1472,7 @@ void* reallocarray(void *ptr, size_t nmemb, size_t size);
#ifdef HAVE_WINSOCK2_H
#define FD_SET_T (u_int)
#else
-#define FD_SET_T
+#define FD_SET_T
#endif
@@ -1517,6 +1600,10 @@ struct sockaddr_storage;
# define calloc(n,s) unbound_stat_calloc_log(n, s, __FILE__, __LINE__, __func__)
# define free(p) unbound_stat_free_log(p, __FILE__, __LINE__, __func__)
# define realloc(p,s) unbound_stat_realloc_log(p, s, __FILE__, __LINE__, __func__)
+# define strdup(s) unbound_stat_strdup_log(s, __FILE__, __LINE__, __func__)
+#ifdef HAVE_REALLOCARRAY
+# define reallocarray(p,n,s) unbound_stat_reallocarray_log(p, n, s, __FILE__, __LINE__, __func__)
+#endif
void *unbound_stat_malloc(size_t size);
void *unbound_stat_calloc(size_t nmemb, size_t size);
void unbound_stat_free(void *ptr);
@@ -1529,6 +1616,10 @@ void unbound_stat_free_log(void *ptr, const char* file, int line,
const char* func);
void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file,
int line, const char* func);
+void *unbound_stat_reallocarray_log(void *ptr, size_t nmemb, size_t size,
+ const char* file, int line, const char* func);
+char *unbound_stat_strdup_log(const char *s, const char* file, int line,
+ const char* func);
#elif defined(UNBOUND_ALLOC_LITE)
# include "util/alloc.h"
#endif /* UNBOUND_ALLOC_LITE and UNBOUND_ALLOC_STATS */
diff --git a/libexec/rc/rc.conf b/libexec/rc/rc.conf
index bfa46bd343a6..0ef3012892dd 100644
--- a/libexec/rc/rc.conf
+++ b/libexec/rc/rc.conf
@@ -586,15 +586,19 @@ font8x14="NO" # font 8x14 from /usr/share/{syscons,vt}/fonts/* (or NO).
font8x8="NO" # font 8x8 from /usr/share/{syscons,vt}/fonts/* (or NO).
blanktime="300" # blank time (in seconds) or "NO" to turn it off.
saver="NO" # screen saver: Uses /boot/kernel/${saver}_saver.ko
-moused_nondefault_enable="YES" # Treat non-default mice as enabled unless
+moused_nondefault_enable="NO" # Treat non-default mice as enabled unless
# specifically overridden in rc.conf(5).
moused_enable="NO" # Run the mouse daemon.
moused_type="auto" # See man page for rc.conf(5) for available settings.
-moused_port="/dev/psm0" # Set to your mouse port.
+moused_port="auto" # Set to your mouse port.
moused_flags="" # Any additional flags to moused.
mousechar_start="NO" # if 0xd0-0xd3 default range is occupied in your
# language code table, specify alternative range
# start like mousechar_start=3, see vidcontrol(1)
+msconvd_enable="NO" # Run the mouse protocol conversion daemon.
+msconvd_type="auto" # See rc.conf(5) man page for available moused_type-s.
+msconvd_ports="" # List of msconvd ports.
+msconvd_flags="" # Any additional flags to msconvd.
allscreens_flags="" # Set this vidcontrol mode for all virtual screens
allscreens_kbdflags="" # Set this kbdcontrol mode for all virtual screens
diff --git a/libexec/rc/rc.d/Makefile b/libexec/rc/rc.d/Makefile
index 7c1f50b027a9..e5ee34e62185 100644
--- a/libexec/rc/rc.d/Makefile
+++ b/libexec/rc/rc.d/Makefile
@@ -273,6 +273,7 @@ JAILPACKAGE= jail
.if ${MK_LEGACY_CONSOLE} != "no"
CONFGROUPS+= CONSOLE
CONSOLE+= moused
+CONSOLE+= msconvd
CONSOLE+= syscons
CONSOLEPACKAGE= console-tools
.endif
diff --git a/libexec/rc/rc.d/msconvd b/libexec/rc/rc.d/msconvd
new file mode 100755
index 000000000000..c2a96bf2eb68
--- /dev/null
+++ b/libexec/rc/rc.d/msconvd
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+#
+
+# PROVIDE: msconvd
+# REQUIRE: DAEMON FILESYSTEMS
+# KEYWORD: nojail shutdown
+
+. /etc/rc.subr
+
+name="msconvd"
+desc="Mouse protocol conversion daemon"
+command="/usr/sbin/${name}"
+start_cmd="msconvd_start"
+pidprefix="/var/run/msconvd"
+load_rc_config $name
+
+: ${msconvd_enable="NO"}
+: ${msconvd_type="auto"}
+
+# doesn't make sense to run in a svcj: nojail keyword
+# XXX: How does msconvd communiacte with the kernel?
+# XXX: Does the kernel prevent this communcation in jails?
+msconvd_svcj="NO"
+
+# Set the pid file and variable name. The second argument, if it exists, is
+# expected to be the mouse device.
+#
+if [ -n "$2" ]; then
+ eval msconvd_$2_enable=\${msconvd_$2_enable-${msconvd_enable}}
+ rcvar="msconvd_$2_enable"
+ pidfile="${pidprefix}.$2.pid"
+else
+ for ms in ${msconvd_ports}; do
+ /etc/rc.d/msconvd $1 ${ms}
+ done
+ exit 0
+fi
+
+msconvd_start()
+{
+ local ms myflags myport mytype
+
+ # Set the mouse device and get any related variables. If
+ # a msconvd device has been specified on the commandline, then
+ # rc.conf(5) variables defined for that device take precedence
+ # over the generic msconvd_* variables. The only exception is
+ # the msconvd_port variable, which if not defined sets it to
+ # the passed in device name.
+ #
+ ms=$1
+ eval myflags=\${msconvd_${ms}_flags-$msconvd_flags}
+ eval myport=\${msconvd_${ms}_port-/dev/${ms}}
+ eval mytype=\${msconvd_${ms}_type-$msconvd_type}
+
+ startmsg -n "Starting ${ms} ${name}"
+ ${command} ${myflags} -p ${myport} -t ${mytype} -I ${pidfile}
+ startmsg '.'
+}
+
+run_rc_command $*
diff --git a/release/tools/oracle.conf b/release/tools/oracle.conf
index 8a4206c05623..72c8dd9ded78 100644
--- a/release/tools/oracle.conf
+++ b/release/tools/oracle.conf
@@ -17,7 +17,6 @@ export VM_EXTRA_PACKAGES="
net/py-netifaces
net/py-oauth
net/rsync
- panicmail
security/ca_root_nss
security/sudo@default
sysutils/firstboot-freebsd-update
diff --git a/release/tools/vmimage.subr b/release/tools/vmimage.subr
index 156987e33457..20ffe3b2dac7 100644
--- a/release/tools/vmimage.subr
+++ b/release/tools/vmimage.subr
@@ -82,7 +82,7 @@ vm_install_base() {
echo '# Custom /etc/fstab for FreeBSD VM images' \
> ${DESTDIR}/etc/fstab
if [ "${VMFS}" != zfs ]; then
- echo "/dev/${ROOTLABEL}/rootfs / ${VMFS} rw 1 1" \
+ echo "/dev/${ROOTLABEL}/rootfs / ${VMFS} rw,noatime 1 1" \
>> ${DESTDIR}/etc/fstab
fi
if [ -z "${NOSWAP}" ]; then
diff --git a/sbin/devd/devd.cc b/sbin/devd/devd.cc
index 1ff405244cde..ee38fbb2ccee 100644
--- a/sbin/devd/devd.cc
+++ b/sbin/devd/devd.cc
@@ -1208,27 +1208,6 @@ new_action(const char *cmd)
eps *
new_match(const char *var, const char *re)
{
- /*
- * In FreeBSD 14, we changed the system=kern to system=kernel for the
- * resume message to match all the other 'kernel' messages. Generate a
- * warning for the life of 14.x that we've 'fixed' the file on the fly,
- * but make it a fatal error in 15.x and newer.
- */
- if (strcmp(var, "kern") == 0) {
-#if __FreeBSD_version < 1500000
- devdlog(LOG_WARNING,
- "Changing deprecated system='kern' to new name 'kernel' in %s line %d.",
- curr_cf, lineno);
- free(const_cast<char *>(var));
- var = strdup("kernel");
-#elif __FreeBSD_version < 1600000
- errx(1, "Encountered deprecated system=\"kern\" rule in %s line %d",
- curr_cf, lineno);
-#else
-#error "Remove this gross hack"
-#endif
- }
-
eps *e = new match(cfg, var, re);
free(const_cast<char *>(var));
free(const_cast<char *>(re));
diff --git a/sbin/dhclient/packet.c b/sbin/dhclient/packet.c
index 3d7390c06ee0..fc0305a8cb0c 100644
--- a/sbin/dhclient/packet.c
+++ b/sbin/dhclient/packet.c
@@ -135,11 +135,14 @@ assemble_udp_ip_header(unsigned char *buf, int *bufix, u_int32_t from,
udp.uh_ulen = htons(sizeof(udp) + len);
memset(&udp.uh_sum, 0, sizeof(udp.uh_sum));
- udp.uh_sum = wrapsum(checksum((unsigned char *)&udp, sizeof(udp),
- checksum(data, len, checksum((unsigned char *)&ip.ip_src,
+ udp.uh_sum = wrapsum(checksum(data, len, checksum((unsigned char *)&udp,
+ sizeof(udp), checksum((unsigned char *)&ip.ip_src,
2 * sizeof(ip.ip_src),
IPPROTO_UDP + (u_int32_t)ntohs(udp.uh_ulen)))));
+ if (udp.uh_sum == htons(0))
+ udp.uh_sum = htons(0xffff);
+
memcpy(&buf[*bufix], &udp, sizeof(udp));
*bufix += sizeof(udp);
}
@@ -166,7 +169,7 @@ decode_udp_ip_header(unsigned char *buf, int bufix, struct sockaddr_in *from,
struct ip *ip;
struct udphdr *udp;
u_int32_t ip_len = (buf[bufix] & 0xf) << 2;
- u_int32_t sum, usum;
+ u_int32_t sum, usum, pseudo_sum;
static int ip_packets_seen;
static int ip_packets_bad_checksum;
static int udp_packets_seen;
@@ -224,23 +227,37 @@ decode_udp_ip_header(unsigned char *buf, int bufix, struct sockaddr_in *from,
}
usum = udp->uh_sum;
- udp->uh_sum = 0;
-
- sum = wrapsum(checksum((unsigned char *)udp, sizeof(*udp),
- checksum(data, len, checksum((unsigned char *)&ip->ip_src,
- 2 * sizeof(ip->ip_src),
- IPPROTO_UDP + (u_int32_t)ntohs(udp->uh_ulen)))));
-
udp_packets_seen++;
- if (usum && usum != sum) {
- udp_packets_bad_checksum++;
- if (udp_packets_seen > 4 && udp_packets_bad_checksum != 0 &&
- (udp_packets_seen / udp_packets_bad_checksum) < 2) {
- note("%d bad udp checksums in %d packets",
- udp_packets_bad_checksum, udp_packets_seen);
- udp_packets_seen = udp_packets_bad_checksum = 0;
+
+ if (usum != htons(0)) {
+ udp->uh_sum = 0;
+
+ pseudo_sum = checksum((unsigned char *)&ip->ip_src,
+ 2 * sizeof(ip->ip_src),
+ IPPROTO_UDP + (u_int32_t)ntohs(udp->uh_ulen));
+ sum = wrapsum(checksum(data, len,
+ checksum((unsigned char *)udp, sizeof(*udp), pseudo_sum)));
+ if (sum == htons(0))
+ sum = htons(0xffff);
+
+ /*
+ * In addition to accepting UDP packets with the correct
+ * checksum in the checksum field, accept also the ones which
+ * have the correct pseudo header checksum in the checksum
+ * field. This allows to process UDP packets, which have been
+ * marked for transmit checksum offloading by the sender side.
+ */
+ if (usum != sum && usum != htons(pseudo_sum & 0x0000ffff)) {
+ udp_packets_bad_checksum++;
+ if (udp_packets_seen > 4 &&
+ udp_packets_bad_checksum != 0 &&
+ (udp_packets_seen / udp_packets_bad_checksum) < 2) {
+ note("%d bad udp checksums in %d packets",
+ udp_packets_bad_checksum, udp_packets_seen);
+ udp_packets_seen = udp_packets_bad_checksum = 0;
+ }
+ return (-1);
}
- return (-1);
}
memcpy(&from->sin_port, &udp->uh_sport, sizeof(udp->uh_sport));
diff --git a/sbin/ifconfig/af_inet6.c b/sbin/ifconfig/af_inet6.c
index 7986edf490b4..e0f34f0c4d82 100644
--- a/sbin/ifconfig/af_inet6.c
+++ b/sbin/ifconfig/af_inet6.c
@@ -753,7 +753,7 @@ static struct afswtch af_inet6 = {
#ifdef WITHOUT_NETLINK
.af_difaddr = SIOCDIFADDR_IN6,
.af_aifaddr = SIOCAIFADDR_IN6,
- .af_ridreq = &in6_addreq,
+ .af_ridreq = &in6_ridreq,
.af_addreq = &in6_addreq,
.af_exec = af_exec_ioctl,
#else
diff --git a/sbin/pfctl/parse.y b/sbin/pfctl/parse.y
index dce5800df27a..46e9f60fe48e 100644
--- a/sbin/pfctl/parse.y
+++ b/sbin/pfctl/parse.y
@@ -7091,7 +7091,7 @@ pushfile(const char *name, int secret)
free(nfile);
return (NULL);
}
- } else if ((nfile->stream = fopen(nfile->name, "r")) == NULL) {
+ } else if ((nfile->stream = pfctl_fopen(nfile->name, "r")) == NULL) {
warn("%s: %s", __func__, nfile->name);
free(nfile->name);
free(nfile);
diff --git a/sbin/pfctl/pfctl.c b/sbin/pfctl/pfctl.c
index 36bdd9705830..2c12387ee388 100644
--- a/sbin/pfctl/pfctl.c
+++ b/sbin/pfctl/pfctl.c
@@ -137,6 +137,7 @@ int pfctl_recurse(int, int, const char *,
int pfctl_call_clearrules(int, int, struct pfr_anchoritem *);
int pfctl_call_cleartables(int, int, struct pfr_anchoritem *);
int pfctl_call_clearanchors(int, int, struct pfr_anchoritem *);
+int pfctl_call_showtables(int, int, struct pfr_anchoritem *);
static struct pfctl_anchor_global pf_anchors;
struct pfctl_anchor pf_main_anchor;
@@ -700,7 +701,7 @@ pfctl_kill_src_nodes(int dev, int opts)
dests++;
- copy_satopfaddr(&psnk.psnk_src.addr.v.a.addr,
+ copy_satopfaddr(&psnk.psnk_dst.addr.v.a.addr,
resp[1]->ai_addr);
if (ioctl(dev, DIOCKILLSRCNODES, &psnk))
err(1, "DIOCKILLSRCNODES");
@@ -789,7 +790,7 @@ pfctl_net_kill_states(int dev, const char *iface, int opts)
dests++;
- copy_satopfaddr(&kill.src.addr.v.a.addr,
+ copy_satopfaddr(&kill.dst.addr.v.a.addr,
resp[1]->ai_addr);
if ((ret = pfctl_kill_states_h(pfh, &kill, &newkilled)) != 0)
@@ -3057,6 +3058,13 @@ pfctl_call_clearanchors(int dev, int opts, struct pfr_anchoritem *pfra)
}
int
+pfctl_call_showtables(int dev, int opts, struct pfr_anchoritem *pfra)
+{
+ pfctl_show_tables(pfra->pfra_anchorname, opts);
+ return (0);
+}
+
+int
pfctl_recurse(int dev, int opts, const char *anchorname,
int(*walkf)(int, int, struct pfr_anchoritem *))
{
@@ -3070,11 +3078,13 @@ pfctl_recurse(int dev, int opts, const char *anchorname,
* so that failures on one anchor do not prevent clearing others.
*/
opts |= PF_OPT_IGNFAIL;
- printf("Removing:\n");
+ if ((opts & PF_OPT_CALLSHOW) == 0)
+ printf("Removing:\n");
SLIST_FOREACH_SAFE(pfra, anchors, pfra_sle, pfra_save) {
- printf(" %s\n",
- (*pfra->pfra_anchorname == '\0') ? "/" :
- pfra->pfra_anchorname);
+ if ((opts & PF_OPT_CALLSHOW) == 0)
+ printf(" %s\n",
+ (*pfra->pfra_anchorname == '\0') ? "/" :
+ pfra->pfra_anchorname);
rv |= walkf(dev, opts, pfra);
SLIST_REMOVE(anchors, pfra, pfr_anchoritem, pfra_sle);
free(pfra->pfra_anchorname);
@@ -3477,7 +3487,12 @@ main(int argc, char *argv[])
pfctl_show_fingerprints(opts);
break;
case 'T':
- pfctl_show_tables(anchorname, opts);
+ if (opts & PF_OPT_RECURSE) {
+ opts |= PF_OPT_CALLSHOW;
+ pfctl_recurse(dev, opts, anchorname,
+ pfctl_call_showtables);
+ } else
+ pfctl_show_tables(anchorname, opts);
break;
case 'o':
pfctl_load_fingerprints(dev, opts);
diff --git a/sbin/pfctl/pfctl_parser.h b/sbin/pfctl/pfctl_parser.h
index 721950967661..58d3abc36691 100644
--- a/sbin/pfctl/pfctl_parser.h
+++ b/sbin/pfctl/pfctl_parser.h
@@ -56,6 +56,7 @@
#define PF_OPT_KILLMATCH 0x08000
#define PF_OPT_NODNS 0x10000
#define PF_OPT_IGNFAIL 0x20000
+#define PF_OPT_CALLSHOW 0x40000
#define PF_NAT_PROXY_PORT_LOW 50001
#define PF_NAT_PROXY_PORT_HIGH 65535
diff --git a/sbin/pfctl/pfctl_table.c b/sbin/pfctl/pfctl_table.c
index f583f5ef8e79..0845f765a063 100644
--- a/sbin/pfctl/pfctl_table.c
+++ b/sbin/pfctl/pfctl_table.c
@@ -417,21 +417,21 @@ print_table(const struct pfr_table *ta, int verbose, int debug)
{
if (!debug && !(ta->pfrt_flags & PFR_TFLAG_ACTIVE))
return;
- if (verbose) {
- printf("%c%c%c%c%c%c%c\t%s",
+ if (verbose)
+ printf("%c%c%c%c%c%c%c\t",
(ta->pfrt_flags & PFR_TFLAG_CONST) ? 'c' : '-',
(ta->pfrt_flags & PFR_TFLAG_PERSIST) ? 'p' : '-',
(ta->pfrt_flags & PFR_TFLAG_ACTIVE) ? 'a' : '-',
(ta->pfrt_flags & PFR_TFLAG_INACTIVE) ? 'i' : '-',
(ta->pfrt_flags & PFR_TFLAG_REFERENCED) ? 'r' : '-',
(ta->pfrt_flags & PFR_TFLAG_REFDANCHOR) ? 'h' : '-',
- (ta->pfrt_flags & PFR_TFLAG_COUNTERS) ? 'C' : '-',
- ta->pfrt_name);
- if (ta->pfrt_anchor[0])
- printf("\t%s", ta->pfrt_anchor);
- puts("");
- } else
- puts(ta->pfrt_name);
+ (ta->pfrt_flags & PFR_TFLAG_COUNTERS) ? 'C' : '-');
+
+ printf("%s", ta->pfrt_name);
+ if (ta->pfrt_anchor[0] != '\0')
+ printf("@%s", ta->pfrt_anchor);
+
+ printf("\n");
}
int
diff --git a/secure/lib/libcrypto/man/man3/Makefile b/secure/lib/libcrypto/man/man3/Makefile
index 46d20013e0ac..0fc9cc100077 100644
--- a/secure/lib/libcrypto/man/man3/Makefile
+++ b/secure/lib/libcrypto/man/man3/Makefile
@@ -670,67 +670,81 @@ MAN+= i2d_PKCS7_bio_stream.3
MAN+= i2d_re_X509_tbs.3
MAN+= o2i_SCT_LIST.3
MAN+= s2i_ASN1_IA5STRING.3
-MLINKS+= X509_dup.3 ACCESS_DESCRIPTION_free.3
-MLINKS+= X509_dup.3 ACCESS_DESCRIPTION_new.3
-MLINKS+= X509_dup.3 ADMISSIONS_free.3
MLINKS+= ADMISSIONS.3 ADMISSIONS_get0_admissionAuthority.3
MLINKS+= ADMISSIONS.3 ADMISSIONS_get0_namingAuthority.3
MLINKS+= ADMISSIONS.3 ADMISSIONS_get0_professionInfos.3
-MLINKS+= X509_dup.3 ADMISSIONS_new.3
MLINKS+= ADMISSIONS.3 ADMISSIONS_set0_admissionAuthority.3
MLINKS+= ADMISSIONS.3 ADMISSIONS_set0_namingAuthority.3
MLINKS+= ADMISSIONS.3 ADMISSIONS_set0_professionInfos.3
MLINKS+= ADMISSIONS.3 ADMISSION_SYNTAX.3
-MLINKS+= X509_dup.3 ADMISSION_SYNTAX_free.3
MLINKS+= ADMISSIONS.3 ADMISSION_SYNTAX_get0_admissionAuthority.3
MLINKS+= ADMISSIONS.3 ADMISSION_SYNTAX_get0_contentsOfAdmissions.3
-MLINKS+= X509_dup.3 ADMISSION_SYNTAX_new.3
MLINKS+= ADMISSIONS.3 ADMISSION_SYNTAX_set0_admissionAuthority.3
MLINKS+= ADMISSIONS.3 ADMISSION_SYNTAX_set0_contentsOfAdmissions.3
-MLINKS+= X509_dup.3 ASIdOrRange_free.3
-MLINKS+= X509_dup.3 ASIdOrRange_new.3
-MLINKS+= X509_dup.3 ASIdentifierChoice_free.3
-MLINKS+= X509_dup.3 ASIdentifierChoice_new.3
-MLINKS+= X509_dup.3 ASIdentifiers_free.3
-MLINKS+= X509_dup.3 ASIdentifiers_new.3
-MLINKS+= ASN1_aux_cb.3 ASN1_AUX.3
+MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY.3
+MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_get0_authorityId.3
+MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_get0_authorityText.3
+MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_get0_authorityURL.3
+MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_set0_authorityId.3
+MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_set0_authorityText.3
+MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_set0_authorityURL.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFOS.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_addProfessionInfo.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_namingAuthority.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_professionItems.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_professionOIDs.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_registrationNumber.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_addProfessionInfo.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_namingAuthority.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_professionItems.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_professionOIDs.3
+MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_registrationNumber.3
+MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_d2i.3
+MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_d2i_ex.3
+MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_free_func.3
+MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_i2d.3
+MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_new_ex_func.3
+MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_new_func.3
+MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_print_func.3
+MLINKS+= ASN1_EXTERN_FUNCS.3 IMPLEMENT_EXTERN_ASN1.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_ENUMERATED_get.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_ENUMERATED_get_int64.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_ENUMERATED_set.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_ENUMERATED_set_int64.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_ENUMERATED_to_BN.3
-MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_adj.3
-MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_check.3
-MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_dup.3
-MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_print.3
-MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_set.3
-MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_set_string.3
-MLINKS+= ASN1_INTEGER_new.3 ASN1_INTEGER_free.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_INTEGER_get.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_INTEGER_get_uint64.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_INTEGER_set.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_INTEGER_set_int64.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_INTEGER_set_uint64.3
MLINKS+= ASN1_INTEGER_get_int64.3 ASN1_INTEGER_to_BN.3
-MLINKS+= X509_dup.3 ASN1_ITEM.3
+MLINKS+= ASN1_INTEGER_get_int64.3 BN_to_ASN1_ENUMERATED.3
+MLINKS+= ASN1_INTEGER_get_int64.3 BN_to_ASN1_INTEGER.3
+MLINKS+= ASN1_INTEGER_new.3 ASN1_INTEGER_free.3
MLINKS+= ASN1_ITEM_lookup.3 ASN1_ITEM_get.3
MLINKS+= ASN1_OBJECT_new.3 ASN1_OBJECT_free.3
-MLINKS+= ASN1_aux_cb.3 ASN1_PRINT_ARG.3
-MLINKS+= ASN1_aux_cb.3 ASN1_STREAM_ARG.3
MLINKS+= ASN1_STRING_TABLE_add.3 ASN1_STRING_TABLE.3
MLINKS+= ASN1_STRING_TABLE_add.3 ASN1_STRING_TABLE_cleanup.3
MLINKS+= ASN1_STRING_TABLE_add.3 ASN1_STRING_TABLE_get.3
MLINKS+= ASN1_STRING_length.3 ASN1_STRING_cmp.3
MLINKS+= ASN1_STRING_length.3 ASN1_STRING_data.3
MLINKS+= ASN1_STRING_length.3 ASN1_STRING_dup.3
-MLINKS+= ASN1_STRING_new.3 ASN1_STRING_free.3
MLINKS+= ASN1_STRING_length.3 ASN1_STRING_get0_data.3
-MLINKS+= ASN1_STRING_print_ex.3 ASN1_STRING_print.3
-MLINKS+= ASN1_STRING_print_ex.3 ASN1_STRING_print_ex_fp.3
MLINKS+= ASN1_STRING_length.3 ASN1_STRING_set.3
MLINKS+= ASN1_STRING_length.3 ASN1_STRING_to_UTF8.3
MLINKS+= ASN1_STRING_length.3 ASN1_STRING_type.3
+MLINKS+= ASN1_STRING_new.3 ASN1_STRING_free.3
MLINKS+= ASN1_STRING_new.3 ASN1_STRING_type_new.3
+MLINKS+= ASN1_STRING_print_ex.3 ASN1_STRING_print.3
+MLINKS+= ASN1_STRING_print_ex.3 ASN1_STRING_print_ex_fp.3
+MLINKS+= ASN1_STRING_print_ex.3 ASN1_tag2str.3
+MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_adj.3
+MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_check.3
+MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_dup.3
+MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_print.3
+MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_set.3
+MLINKS+= ASN1_TIME_set.3 ASN1_GENERALIZEDTIME_set_string.3
MLINKS+= ASN1_TIME_set.3 ASN1_TIME_adj.3
MLINKS+= ASN1_TIME_set.3 ASN1_TIME_check.3
MLINKS+= ASN1_TIME_set.3 ASN1_TIME_cmp_time_t.3
@@ -744,11 +758,6 @@ MLINKS+= ASN1_TIME_set.3 ASN1_TIME_set_string.3
MLINKS+= ASN1_TIME_set.3 ASN1_TIME_set_string_X509.3
MLINKS+= ASN1_TIME_set.3 ASN1_TIME_to_generalizedtime.3
MLINKS+= ASN1_TIME_set.3 ASN1_TIME_to_tm.3
-MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_cmp.3
-MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_pack_sequence.3
-MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_set.3
-MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_set1.3
-MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_unpack_sequence.3
MLINKS+= ASN1_TIME_set.3 ASN1_UTCTIME_adj.3
MLINKS+= ASN1_TIME_set.3 ASN1_UTCTIME_check.3
MLINKS+= ASN1_TIME_set.3 ASN1_UTCTIME_cmp_time_t.3
@@ -756,15 +765,15 @@ MLINKS+= ASN1_TIME_set.3 ASN1_UTCTIME_dup.3
MLINKS+= ASN1_TIME_set.3 ASN1_UTCTIME_print.3
MLINKS+= ASN1_TIME_set.3 ASN1_UTCTIME_set.3
MLINKS+= ASN1_TIME_set.3 ASN1_UTCTIME_set_string.3
-MLINKS+= OPENSSL_load_builtin_modules.3 ASN1_add_oid_module.3
+MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_cmp.3
+MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_pack_sequence.3
+MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_set.3
+MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_set1.3
+MLINKS+= ASN1_TYPE_get.3 ASN1_TYPE_unpack_sequence.3
+MLINKS+= ASN1_aux_cb.3 ASN1_AUX.3
+MLINKS+= ASN1_aux_cb.3 ASN1_PRINT_ARG.3
+MLINKS+= ASN1_aux_cb.3 ASN1_STREAM_ARG.3
MLINKS+= ASN1_aux_cb.3 ASN1_aux_const_cb.3
-MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_d2i.3
-MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_d2i_ex.3
-MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_free_func.3
-MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_i2d.3
-MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_new_ex_func.3
-MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_new_func.3
-MLINKS+= ASN1_EXTERN_FUNCS.3 ASN1_ex_print_func.3
MLINKS+= ASN1_generate_nconf.3 ASN1_generate_v3.3
MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_d2i.3
MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_d2i_bio_ex.3
@@ -772,15 +781,15 @@ MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_d2i_ex.3
MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_d2i_fp.3
MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_d2i_fp_ex.3
MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_i2d_mem_bio.3
+MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_pack.3
+MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_unpack.3
+MLINKS+= ASN1_item_d2i_bio.3 ASN1_item_unpack_ex.3
MLINKS+= ASN1_item_new.3 ASN1_item_new_ex.3
MLINKS+= ASN1_item_sign.3 ASN1_item_sign_ctx.3
MLINKS+= ASN1_item_sign.3 ASN1_item_sign_ex.3
MLINKS+= ASN1_item_sign.3 ASN1_item_verify.3
MLINKS+= ASN1_item_sign.3 ASN1_item_verify_ctx.3
MLINKS+= ASN1_item_sign.3 ASN1_item_verify_ex.3
-MLINKS+= ASN1_STRING_print_ex.3 ASN1_tag2str.3
-MLINKS+= X509_dup.3 ASRange_free.3
-MLINKS+= X509_dup.3 ASRange_new.3
MLINKS+= ASYNC_WAIT_CTX_new.3 ASYNC_STATUS_EAGAIN.3
MLINKS+= ASYNC_WAIT_CTX_new.3 ASYNC_STATUS_ERR.3
MLINKS+= ASYNC_WAIT_CTX_new.3 ASYNC_STATUS_OK.3
@@ -795,21 +804,19 @@ MLINKS+= ASYNC_WAIT_CTX_new.3 ASYNC_WAIT_CTX_get_status.3
MLINKS+= ASYNC_WAIT_CTX_new.3 ASYNC_WAIT_CTX_set_callback.3
MLINKS+= ASYNC_WAIT_CTX_new.3 ASYNC_WAIT_CTX_set_status.3
MLINKS+= ASYNC_WAIT_CTX_new.3 ASYNC_WAIT_CTX_set_wait_fd.3
-MLINKS+= ASYNC_start_job.3 ASYNC_block_pause.3
MLINKS+= ASYNC_WAIT_CTX_new.3 ASYNC_callback_fn.3
+MLINKS+= ASYNC_start_job.3 ASYNC_block_pause.3
MLINKS+= ASYNC_start_job.3 ASYNC_cleanup_thread.3
MLINKS+= ASYNC_start_job.3 ASYNC_get_current_job.3
+MLINKS+= ASYNC_start_job.3 ASYNC_get_mem_functions.3
MLINKS+= ASYNC_start_job.3 ASYNC_get_wait_ctx.3
MLINKS+= ASYNC_start_job.3 ASYNC_init_thread.3
MLINKS+= ASYNC_start_job.3 ASYNC_is_capable.3
MLINKS+= ASYNC_start_job.3 ASYNC_pause_job.3
+MLINKS+= ASYNC_start_job.3 ASYNC_set_mem_functions.3
+MLINKS+= ASYNC_start_job.3 ASYNC_stack_alloc_fn.3
+MLINKS+= ASYNC_start_job.3 ASYNC_stack_free_fn.3
MLINKS+= ASYNC_start_job.3 ASYNC_unblock_pause.3
-MLINKS+= X509_dup.3 AUTHORITY_INFO_ACCESS_free.3
-MLINKS+= X509_dup.3 AUTHORITY_INFO_ACCESS_new.3
-MLINKS+= X509_dup.3 AUTHORITY_KEYID_free.3
-MLINKS+= X509_dup.3 AUTHORITY_KEYID_new.3
-MLINKS+= X509_dup.3 BASIC_CONSTRAINTS_free.3
-MLINKS+= X509_dup.3 BASIC_CONSTRAINTS_new.3
MLINKS+= BF_encrypt.3 BF_cbc_encrypt.3
MLINKS+= BF_encrypt.3 BF_cfb64_encrypt.3
MLINKS+= BF_encrypt.3 BF_decrypt.3
@@ -817,13 +824,9 @@ MLINKS+= BF_encrypt.3 BF_ecb_encrypt.3
MLINKS+= BF_encrypt.3 BF_ofb64_encrypt.3
MLINKS+= BF_encrypt.3 BF_options.3
MLINKS+= BF_encrypt.3 BF_set_key.3
-MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_address.3
-MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_family.3
-MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_free.3
-MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_next.3
-MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_protocol.3
-MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_socktype.3
MLINKS+= BIO_ADDR.3 BIO_ADDR_clear.3
+MLINKS+= BIO_ADDR.3 BIO_ADDR_copy.3
+MLINKS+= BIO_ADDR.3 BIO_ADDR_dup.3
MLINKS+= BIO_ADDR.3 BIO_ADDR_family.3
MLINKS+= BIO_ADDR.3 BIO_ADDR_free.3
MLINKS+= BIO_ADDR.3 BIO_ADDR_hostname_string.3
@@ -833,85 +836,132 @@ MLINKS+= BIO_ADDR.3 BIO_ADDR_rawaddress.3
MLINKS+= BIO_ADDR.3 BIO_ADDR_rawmake.3
MLINKS+= BIO_ADDR.3 BIO_ADDR_rawport.3
MLINKS+= BIO_ADDR.3 BIO_ADDR_service_string.3
+MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_address.3
+MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_family.3
+MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_free.3
+MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_next.3
+MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_protocol.3
+MLINKS+= BIO_ADDRINFO.3 BIO_ADDRINFO_socktype.3
+MLINKS+= BIO_ADDRINFO.3 BIO_lookup.3
+MLINKS+= BIO_ADDRINFO.3 BIO_lookup_ex.3
+MLINKS+= BIO_ADDRINFO.3 BIO_lookup_type.3
MLINKS+= BIO_connect.3 BIO_accept_ex.3
-MLINKS+= BIO_s_file.3 BIO_append_filename.3
MLINKS+= BIO_connect.3 BIO_bind.3
-MLINKS+= BIO_ctrl.3 BIO_callback_ctrl.3
-MLINKS+= BIO_set_callback.3 BIO_callback_fn.3
-MLINKS+= BIO_set_callback.3 BIO_callback_fn_ex.3
MLINKS+= BIO_connect.3 BIO_closesocket.3
-MLINKS+= BIO_s_datagram.3 BIO_ctrl_dgram_connect.3
-MLINKS+= BIO_s_bio.3 BIO_ctrl_get_read_request.3
-MLINKS+= BIO_s_bio.3 BIO_ctrl_get_write_guarantee.3
+MLINKS+= BIO_connect.3 BIO_listen.3
+MLINKS+= BIO_connect.3 BIO_socket.3
+MLINKS+= BIO_ctrl.3 BIO_callback_ctrl.3
MLINKS+= BIO_ctrl.3 BIO_ctrl_pending.3
-MLINKS+= BIO_s_bio.3 BIO_ctrl_reset_read_request.3
-MLINKS+= BIO_s_datagram.3 BIO_ctrl_set_connected.3
MLINKS+= BIO_ctrl.3 BIO_ctrl_wpending.3
-MLINKS+= BIO_set_callback.3 BIO_debug_callback.3
-MLINKS+= BIO_set_callback.3 BIO_debug_callback_ex.3
-MLINKS+= BIO_s_bio.3 BIO_destroy_bio_pair.3
-MLINKS+= BIO_s_datagram.3 BIO_dgram_get_mtu_overhead.3
-MLINKS+= BIO_s_datagram.3 BIO_dgram_get_peer.3
-MLINKS+= BIO_s_datagram.3 BIO_dgram_recv_timedout.3
-MLINKS+= BIO_s_datagram.3 BIO_dgram_send_timedout.3
-MLINKS+= BIO_s_datagram.3 BIO_dgram_set_peer.3
-MLINKS+= BIO_s_accept.3 BIO_do_accept.3
-MLINKS+= BIO_s_connect.3 BIO_do_connect.3
-MLINKS+= BIO_socket_wait.3 BIO_do_connect_retry.3
-MLINKS+= BIO_f_ssl.3 BIO_do_handshake.3
MLINKS+= BIO_ctrl.3 BIO_eof.3
MLINKS+= BIO_ctrl.3 BIO_flush.3
-MLINKS+= BIO_new.3 BIO_free.3
-MLINKS+= BIO_new.3 BIO_free_all.3
-MLINKS+= BIO_s_accept.3 BIO_get_accept_ip_family.3
-MLINKS+= BIO_s_accept.3 BIO_get_accept_name.3
-MLINKS+= BIO_s_accept.3 BIO_get_accept_port.3
-MLINKS+= BIO_get_ex_new_index.3 BIO_get_app_data.3
-MLINKS+= BIO_s_accept.3 BIO_get_bind_mode.3
-MLINKS+= BIO_f_buffer.3 BIO_get_buffer_num_lines.3
-MLINKS+= BIO_set_callback.3 BIO_get_callback.3
-MLINKS+= BIO_set_callback.3 BIO_get_callback_arg.3
-MLINKS+= BIO_set_callback.3 BIO_get_callback_ex.3
-MLINKS+= BIO_f_cipher.3 BIO_get_cipher_ctx.3
-MLINKS+= BIO_f_cipher.3 BIO_get_cipher_status.3
MLINKS+= BIO_ctrl.3 BIO_get_close.3
-MLINKS+= BIO_s_connect.3 BIO_get_conn_address.3
-MLINKS+= BIO_s_connect.3 BIO_get_conn_hostname.3
-MLINKS+= BIO_s_connect.3 BIO_get_conn_ip_family.3
-MLINKS+= BIO_s_connect.3 BIO_get_conn_port.3
-MLINKS+= BIO_get_ex_new_index.3 BIO_get_ex_data.3
-MLINKS+= BIO_s_fd.3 BIO_get_fd.3
-MLINKS+= BIO_s_file.3 BIO_get_fp.3
-MLINKS+= BIO_f_prefix.3 BIO_get_indent.3
+MLINKS+= BIO_ctrl.3 BIO_get_conn_mode.3
MLINKS+= BIO_ctrl.3 BIO_get_info_callback.3
-MLINKS+= BIO_get_data.3 BIO_get_init.3
MLINKS+= BIO_ctrl.3 BIO_get_ktls_recv.3
MLINKS+= BIO_ctrl.3 BIO_get_ktls_send.3
-MLINKS+= BIO_read.3 BIO_get_line.3
+MLINKS+= BIO_ctrl.3 BIO_info_cb.3
+MLINKS+= BIO_ctrl.3 BIO_int_ctrl.3
+MLINKS+= BIO_ctrl.3 BIO_pending.3
+MLINKS+= BIO_ctrl.3 BIO_ptr_ctrl.3
+MLINKS+= BIO_ctrl.3 BIO_reset.3
+MLINKS+= BIO_ctrl.3 BIO_seek.3
+MLINKS+= BIO_ctrl.3 BIO_set_close.3
+MLINKS+= BIO_ctrl.3 BIO_set_conn_mode.3
+MLINKS+= BIO_ctrl.3 BIO_set_info_callback.3
+MLINKS+= BIO_ctrl.3 BIO_set_tfo.3
+MLINKS+= BIO_ctrl.3 BIO_tell.3
+MLINKS+= BIO_ctrl.3 BIO_wpending.3
+MLINKS+= BIO_f_buffer.3 BIO_get_buffer_num_lines.3
+MLINKS+= BIO_f_buffer.3 BIO_set_buffer_read_data.3
+MLINKS+= BIO_f_buffer.3 BIO_set_buffer_size.3
+MLINKS+= BIO_f_buffer.3 BIO_set_read_buffer_size.3
+MLINKS+= BIO_f_buffer.3 BIO_set_write_buffer_size.3
+MLINKS+= BIO_f_cipher.3 BIO_get_cipher_ctx.3
+MLINKS+= BIO_f_cipher.3 BIO_get_cipher_status.3
+MLINKS+= BIO_f_cipher.3 BIO_set_cipher.3
MLINKS+= BIO_f_md.3 BIO_get_md.3
MLINKS+= BIO_f_md.3 BIO_get_md_ctx.3
-MLINKS+= BIO_s_mem.3 BIO_get_mem_data.3
-MLINKS+= BIO_s_mem.3 BIO_get_mem_ptr.3
-MLINKS+= BIO_meth_new.3 BIO_get_new_index.3
+MLINKS+= BIO_f_md.3 BIO_set_md.3
+MLINKS+= BIO_f_prefix.3 BIO_get_indent.3
+MLINKS+= BIO_f_prefix.3 BIO_set_indent.3
+MLINKS+= BIO_f_prefix.3 BIO_set_prefix.3
+MLINKS+= BIO_f_ssl.3 BIO_do_handshake.3
MLINKS+= BIO_f_ssl.3 BIO_get_num_renegotiates.3
-MLINKS+= BIO_s_accept.3 BIO_get_peer_name.3
-MLINKS+= BIO_s_accept.3 BIO_get_peer_port.3
-MLINKS+= BIO_s_bio.3 BIO_get_read_request.3
-MLINKS+= BIO_should_retry.3 BIO_get_retry_BIO.3
-MLINKS+= BIO_should_retry.3 BIO_get_retry_reason.3
-MLINKS+= BIO_get_data.3 BIO_get_shutdown.3
MLINKS+= BIO_f_ssl.3 BIO_get_ssl.3
-MLINKS+= BIO_s_bio.3 BIO_get_write_buf_size.3
-MLINKS+= BIO_s_bio.3 BIO_get_write_guarantee.3
-MLINKS+= BIO_read.3 BIO_gets.3
-MLINKS+= BIO_parse_hostserv.3 BIO_hostserv_priorities.3
-MLINKS+= BIO_ctrl.3 BIO_info_cb.3
-MLINKS+= BIO_ctrl.3 BIO_int_ctrl.3
-MLINKS+= BIO_connect.3 BIO_listen.3
-MLINKS+= BIO_ADDRINFO.3 BIO_lookup.3
-MLINKS+= BIO_ADDRINFO.3 BIO_lookup_ex.3
-MLINKS+= BIO_ADDRINFO.3 BIO_lookup_type.3
-MLINKS+= BIO_s_bio.3 BIO_make_bio_pair.3
+MLINKS+= BIO_f_ssl.3 BIO_new_buffer_ssl_connect.3
+MLINKS+= BIO_f_ssl.3 BIO_new_ssl.3
+MLINKS+= BIO_f_ssl.3 BIO_new_ssl_connect.3
+MLINKS+= BIO_f_ssl.3 BIO_set_ssl.3
+MLINKS+= BIO_f_ssl.3 BIO_set_ssl_mode.3
+MLINKS+= BIO_f_ssl.3 BIO_set_ssl_renegotiate_bytes.3
+MLINKS+= BIO_f_ssl.3 BIO_set_ssl_renegotiate_timeout.3
+MLINKS+= BIO_f_ssl.3 BIO_ssl_copy_session_id.3
+MLINKS+= BIO_f_ssl.3 BIO_ssl_shutdown.3
+MLINKS+= BIO_find_type.3 BIO_method_type.3
+MLINKS+= BIO_find_type.3 BIO_next.3
+MLINKS+= BIO_get_data.3 BIO_get_init.3
+MLINKS+= BIO_get_data.3 BIO_get_shutdown.3
+MLINKS+= BIO_get_data.3 BIO_set_data.3
+MLINKS+= BIO_get_data.3 BIO_set_init.3
+MLINKS+= BIO_get_data.3 BIO_set_shutdown.3
+MLINKS+= BIO_get_ex_new_index.3 BIO_get_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 BIO_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 BIO_set_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 BIO_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 DH_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 DH_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 DH_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 DSA_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 DSA_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 DSA_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 EC_KEY_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 EC_KEY_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 EC_KEY_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 ENGINE_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 ENGINE_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 ENGINE_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 EVP_PKEY_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 EVP_PKEY_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 EVP_PKEY_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 RSA_get_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 RSA_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 RSA_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 RSA_set_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 RSA_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_get_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_set_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_get_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_set_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_get_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_set_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 SSL_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 UI_get_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 UI_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 UI_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 UI_set_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 UI_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_get_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_set_app_data.3
+MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 X509_STORE_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 X509_STORE_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 X509_STORE_set_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 X509_get_ex_data.3
+MLINKS+= BIO_get_ex_new_index.3 X509_get_ex_new_index.3
+MLINKS+= BIO_get_ex_new_index.3 X509_set_ex_data.3
+MLINKS+= BIO_get_rpoll_descriptor.3 BIO_get_wpoll_descriptor.3
+MLINKS+= BIO_meth_new.3 BIO_get_new_index.3
MLINKS+= BIO_meth_new.3 BIO_meth_free.3
MLINKS+= BIO_meth_new.3 BIO_meth_get_callback_ctrl.3
MLINKS+= BIO_meth_new.3 BIO_meth_get_create.3
@@ -921,6 +971,8 @@ MLINKS+= BIO_meth_new.3 BIO_meth_get_gets.3
MLINKS+= BIO_meth_new.3 BIO_meth_get_puts.3
MLINKS+= BIO_meth_new.3 BIO_meth_get_read.3
MLINKS+= BIO_meth_new.3 BIO_meth_get_read_ex.3
+MLINKS+= BIO_meth_new.3 BIO_meth_get_recvmmsg.3
+MLINKS+= BIO_meth_new.3 BIO_meth_get_sendmmsg.3
MLINKS+= BIO_meth_new.3 BIO_meth_get_write.3
MLINKS+= BIO_meth_new.3 BIO_meth_get_write_ex.3
MLINKS+= BIO_meth_new.3 BIO_meth_set_callback_ctrl.3
@@ -931,92 +983,128 @@ MLINKS+= BIO_meth_new.3 BIO_meth_set_gets.3
MLINKS+= BIO_meth_new.3 BIO_meth_set_puts.3
MLINKS+= BIO_meth_new.3 BIO_meth_set_read.3
MLINKS+= BIO_meth_new.3 BIO_meth_set_read_ex.3
+MLINKS+= BIO_meth_new.3 BIO_meth_set_recvmmsg.3
+MLINKS+= BIO_meth_new.3 BIO_meth_set_sendmmsg.3
MLINKS+= BIO_meth_new.3 BIO_meth_set_write.3
MLINKS+= BIO_meth_new.3 BIO_meth_set_write_ex.3
-MLINKS+= BIO_find_type.3 BIO_method_type.3
-MLINKS+= BIO_s_accept.3 BIO_new_accept.3
-MLINKS+= BIO_s_bio.3 BIO_new_bio_pair.3
-MLINKS+= BIO_f_ssl.3 BIO_new_buffer_ssl_connect.3
-MLINKS+= BIO_s_connect.3 BIO_new_connect.3
-MLINKS+= BIO_s_datagram.3 BIO_new_dgram.3
+MLINKS+= BIO_new.3 BIO_free.3
+MLINKS+= BIO_new.3 BIO_free_all.3
MLINKS+= BIO_new.3 BIO_new_ex.3
-MLINKS+= BIO_s_fd.3 BIO_new_fd.3
-MLINKS+= BIO_s_file.3 BIO_new_file.3
-MLINKS+= BIO_s_file.3 BIO_new_fp.3
-MLINKS+= BIO_s_core.3 BIO_new_from_core_bio.3
-MLINKS+= BIO_s_mem.3 BIO_new_mem_buf.3
-MLINKS+= BIO_s_socket.3 BIO_new_socket.3
-MLINKS+= BIO_f_ssl.3 BIO_new_ssl.3
-MLINKS+= BIO_f_ssl.3 BIO_new_ssl_connect.3
-MLINKS+= BIO_find_type.3 BIO_next.3
-MLINKS+= BIO_ctrl.3 BIO_pending.3
+MLINKS+= BIO_new.3 BIO_up_ref.3
+MLINKS+= BIO_new.3 BIO_vfree.3
+MLINKS+= BIO_parse_hostserv.3 BIO_hostserv_priorities.3
+MLINKS+= BIO_printf.3 BIO_snprintf.3
+MLINKS+= BIO_printf.3 BIO_vprintf.3
+MLINKS+= BIO_printf.3 BIO_vsnprintf.3
MLINKS+= BIO_push.3 BIO_pop.3
-MLINKS+= BIO_ctrl.3 BIO_ptr_ctrl.3
+MLINKS+= BIO_push.3 BIO_set_next.3
+MLINKS+= BIO_read.3 BIO_get_line.3
+MLINKS+= BIO_read.3 BIO_gets.3
MLINKS+= BIO_read.3 BIO_puts.3
MLINKS+= BIO_read.3 BIO_read_ex.3
-MLINKS+= BIO_s_file.3 BIO_read_filename.3
-MLINKS+= BIO_ctrl.3 BIO_reset.3
-MLINKS+= BIO_should_retry.3 BIO_retry_type.3
-MLINKS+= BIO_s_file.3 BIO_rw_filename.3
-MLINKS+= BIO_s_mem.3 BIO_s_secmem.3
-MLINKS+= BIO_ctrl.3 BIO_seek.3
+MLINKS+= BIO_read.3 BIO_write.3
+MLINKS+= BIO_read.3 BIO_write_ex.3
+MLINKS+= BIO_s_accept.3 BIO_do_accept.3
+MLINKS+= BIO_s_accept.3 BIO_get_accept_ip_family.3
+MLINKS+= BIO_s_accept.3 BIO_get_accept_name.3
+MLINKS+= BIO_s_accept.3 BIO_get_accept_port.3
+MLINKS+= BIO_s_accept.3 BIO_get_bind_mode.3
+MLINKS+= BIO_s_accept.3 BIO_get_peer_name.3
+MLINKS+= BIO_s_accept.3 BIO_get_peer_port.3
+MLINKS+= BIO_s_accept.3 BIO_new_accept.3
MLINKS+= BIO_s_accept.3 BIO_set_accept_bios.3
MLINKS+= BIO_s_accept.3 BIO_set_accept_ip_family.3
MLINKS+= BIO_s_accept.3 BIO_set_accept_name.3
MLINKS+= BIO_s_accept.3 BIO_set_accept_port.3
-MLINKS+= BIO_get_ex_new_index.3 BIO_set_app_data.3
MLINKS+= BIO_s_accept.3 BIO_set_bind_mode.3
-MLINKS+= BIO_f_buffer.3 BIO_set_buffer_read_data.3
-MLINKS+= BIO_f_buffer.3 BIO_set_buffer_size.3
-MLINKS+= BIO_set_callback.3 BIO_set_callback_arg.3
-MLINKS+= BIO_set_callback.3 BIO_set_callback_ex.3
-MLINKS+= BIO_f_cipher.3 BIO_set_cipher.3
-MLINKS+= BIO_ctrl.3 BIO_set_close.3
+MLINKS+= BIO_s_accept.3 BIO_set_nbio_accept.3
+MLINKS+= BIO_s_accept.3 BIO_set_tfo_accept.3
+MLINKS+= BIO_s_bio.3 BIO_ctrl_get_read_request.3
+MLINKS+= BIO_s_bio.3 BIO_ctrl_get_write_guarantee.3
+MLINKS+= BIO_s_bio.3 BIO_ctrl_reset_read_request.3
+MLINKS+= BIO_s_bio.3 BIO_destroy_bio_pair.3
+MLINKS+= BIO_s_bio.3 BIO_get_read_request.3
+MLINKS+= BIO_s_bio.3 BIO_get_write_buf_size.3
+MLINKS+= BIO_s_bio.3 BIO_get_write_guarantee.3
+MLINKS+= BIO_s_bio.3 BIO_make_bio_pair.3
+MLINKS+= BIO_s_bio.3 BIO_new_bio_pair.3
+MLINKS+= BIO_s_bio.3 BIO_set_write_buf_size.3
+MLINKS+= BIO_s_bio.3 BIO_shutdown_wr.3
+MLINKS+= BIO_s_connect.3 BIO_do_connect.3
+MLINKS+= BIO_s_connect.3 BIO_get0_dgram_bio.3
+MLINKS+= BIO_s_connect.3 BIO_get_conn_address.3
+MLINKS+= BIO_s_connect.3 BIO_get_conn_hostname.3
+MLINKS+= BIO_s_connect.3 BIO_get_conn_ip_family.3
+MLINKS+= BIO_s_connect.3 BIO_get_conn_port.3
+MLINKS+= BIO_s_connect.3 BIO_get_sock_type.3
+MLINKS+= BIO_s_connect.3 BIO_new_connect.3
MLINKS+= BIO_s_connect.3 BIO_set_conn_address.3
MLINKS+= BIO_s_connect.3 BIO_set_conn_hostname.3
MLINKS+= BIO_s_connect.3 BIO_set_conn_ip_family.3
MLINKS+= BIO_s_connect.3 BIO_set_conn_port.3
-MLINKS+= BIO_get_data.3 BIO_set_data.3
-MLINKS+= BIO_get_ex_new_index.3 BIO_set_ex_data.3
+MLINKS+= BIO_s_connect.3 BIO_set_nbio.3
+MLINKS+= BIO_s_connect.3 BIO_set_sock_type.3
+MLINKS+= BIO_s_core.3 BIO_new_from_core_bio.3
+MLINKS+= BIO_s_datagram.3 BIO_ctrl_dgram_connect.3
+MLINKS+= BIO_s_datagram.3 BIO_ctrl_set_connected.3
+MLINKS+= BIO_s_datagram.3 BIO_dgram_detect_peer_addr.3
+MLINKS+= BIO_s_datagram.3 BIO_dgram_get_mtu_overhead.3
+MLINKS+= BIO_s_datagram.3 BIO_dgram_get_peer.3
+MLINKS+= BIO_s_datagram.3 BIO_dgram_recv_timedout.3
+MLINKS+= BIO_s_datagram.3 BIO_dgram_send_timedout.3
+MLINKS+= BIO_s_datagram.3 BIO_dgram_set_peer.3
+MLINKS+= BIO_s_datagram.3 BIO_new_dgram.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_dgram_get_caps.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_dgram_get_effective_caps.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_dgram_get_mtu.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_dgram_get_no_trunc.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_dgram_set0_local_addr.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_dgram_set_caps.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_dgram_set_mtu.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_dgram_set_no_trunc.3
+MLINKS+= BIO_s_dgram_pair.3 BIO_new_bio_dgram_pair.3
+MLINKS+= BIO_s_fd.3 BIO_get_fd.3
+MLINKS+= BIO_s_fd.3 BIO_new_fd.3
MLINKS+= BIO_s_fd.3 BIO_set_fd.3
+MLINKS+= BIO_s_file.3 BIO_append_filename.3
+MLINKS+= BIO_s_file.3 BIO_get_fp.3
+MLINKS+= BIO_s_file.3 BIO_new_file.3
+MLINKS+= BIO_s_file.3 BIO_new_fp.3
+MLINKS+= BIO_s_file.3 BIO_read_filename.3
+MLINKS+= BIO_s_file.3 BIO_rw_filename.3
MLINKS+= BIO_s_file.3 BIO_set_fp.3
-MLINKS+= BIO_f_prefix.3 BIO_set_indent.3
-MLINKS+= BIO_ctrl.3 BIO_set_info_callback.3
-MLINKS+= BIO_get_data.3 BIO_set_init.3
-MLINKS+= BIO_f_md.3 BIO_set_md.3
+MLINKS+= BIO_s_file.3 BIO_write_filename.3
+MLINKS+= BIO_s_mem.3 BIO_get_mem_data.3
+MLINKS+= BIO_s_mem.3 BIO_get_mem_ptr.3
+MLINKS+= BIO_s_mem.3 BIO_new_mem_buf.3
+MLINKS+= BIO_s_mem.3 BIO_s_dgram_mem.3
+MLINKS+= BIO_s_mem.3 BIO_s_secmem.3
MLINKS+= BIO_s_mem.3 BIO_set_mem_buf.3
MLINKS+= BIO_s_mem.3 BIO_set_mem_eof_return.3
-MLINKS+= BIO_s_connect.3 BIO_set_nbio.3
-MLINKS+= BIO_s_accept.3 BIO_set_nbio_accept.3
-MLINKS+= BIO_push.3 BIO_set_next.3
-MLINKS+= BIO_f_prefix.3 BIO_set_prefix.3
-MLINKS+= BIO_f_buffer.3 BIO_set_read_buffer_size.3
+MLINKS+= BIO_s_socket.3 BIO_new_socket.3
+MLINKS+= BIO_sendmmsg.3 BIO_dgram_get_local_addr_cap.3
+MLINKS+= BIO_sendmmsg.3 BIO_dgram_get_local_addr_enable.3
+MLINKS+= BIO_sendmmsg.3 BIO_dgram_set_local_addr_enable.3
+MLINKS+= BIO_sendmmsg.3 BIO_err_is_non_fatal.3
+MLINKS+= BIO_sendmmsg.3 BIO_recvmmsg.3
+MLINKS+= BIO_set_callback.3 BIO_callback_fn.3
+MLINKS+= BIO_set_callback.3 BIO_callback_fn_ex.3
+MLINKS+= BIO_set_callback.3 BIO_debug_callback.3
+MLINKS+= BIO_set_callback.3 BIO_debug_callback_ex.3
+MLINKS+= BIO_set_callback.3 BIO_get_callback.3
+MLINKS+= BIO_set_callback.3 BIO_get_callback_arg.3
+MLINKS+= BIO_set_callback.3 BIO_get_callback_ex.3
+MLINKS+= BIO_set_callback.3 BIO_set_callback_arg.3
+MLINKS+= BIO_set_callback.3 BIO_set_callback_ex.3
+MLINKS+= BIO_should_retry.3 BIO_get_retry_BIO.3
+MLINKS+= BIO_should_retry.3 BIO_get_retry_reason.3
+MLINKS+= BIO_should_retry.3 BIO_retry_type.3
MLINKS+= BIO_should_retry.3 BIO_set_retry_reason.3
-MLINKS+= BIO_get_data.3 BIO_set_shutdown.3
-MLINKS+= BIO_f_ssl.3 BIO_set_ssl.3
-MLINKS+= BIO_f_ssl.3 BIO_set_ssl_mode.3
-MLINKS+= BIO_f_ssl.3 BIO_set_ssl_renegotiate_bytes.3
-MLINKS+= BIO_f_ssl.3 BIO_set_ssl_renegotiate_timeout.3
-MLINKS+= BIO_s_bio.3 BIO_set_write_buf_size.3
-MLINKS+= BIO_f_buffer.3 BIO_set_write_buffer_size.3
MLINKS+= BIO_should_retry.3 BIO_should_io_special.3
MLINKS+= BIO_should_retry.3 BIO_should_read.3
MLINKS+= BIO_should_retry.3 BIO_should_write.3
-MLINKS+= BIO_s_bio.3 BIO_shutdown_wr.3
-MLINKS+= BIO_printf.3 BIO_snprintf.3
-MLINKS+= BIO_connect.3 BIO_socket.3
-MLINKS+= BIO_f_ssl.3 BIO_ssl_copy_session_id.3
-MLINKS+= BIO_f_ssl.3 BIO_ssl_shutdown.3
-MLINKS+= BIO_ctrl.3 BIO_tell.3
-MLINKS+= BIO_new.3 BIO_up_ref.3
-MLINKS+= BIO_new.3 BIO_vfree.3
-MLINKS+= BIO_printf.3 BIO_vprintf.3
-MLINKS+= BIO_printf.3 BIO_vsnprintf.3
+MLINKS+= BIO_socket_wait.3 BIO_do_connect_retry.3
MLINKS+= BIO_socket_wait.3 BIO_wait.3
-MLINKS+= BIO_ctrl.3 BIO_wpending.3
-MLINKS+= BIO_read.3 BIO_write.3
-MLINKS+= BIO_read.3 BIO_write_ex.3
-MLINKS+= BIO_s_file.3 BIO_write_filename.3
MLINKS+= BN_BLINDING_new.3 BN_BLINDING_convert.3
MLINKS+= BN_BLINDING_new.3 BN_BLINDING_convert_ex.3
MLINKS+= BN_BLINDING_new.3 BN_BLINDING_create_param.3
@@ -1030,26 +1118,30 @@ MLINKS+= BN_BLINDING_new.3 BN_BLINDING_set_current_thread.3
MLINKS+= BN_BLINDING_new.3 BN_BLINDING_set_flags.3
MLINKS+= BN_BLINDING_new.3 BN_BLINDING_unlock.3
MLINKS+= BN_BLINDING_new.3 BN_BLINDING_update.3
-MLINKS+= BN_CTX_start.3 BN_CTX_end.3
MLINKS+= BN_CTX_new.3 BN_CTX_free.3
-MLINKS+= BN_CTX_start.3 BN_CTX_get.3
MLINKS+= BN_CTX_new.3 BN_CTX_new_ex.3
MLINKS+= BN_CTX_new.3 BN_CTX_secure_new.3
MLINKS+= BN_CTX_new.3 BN_CTX_secure_new_ex.3
-MLINKS+= BN_generate_prime.3 BN_GENCB_call.3
-MLINKS+= BN_generate_prime.3 BN_GENCB_free.3
-MLINKS+= BN_generate_prime.3 BN_GENCB_get_arg.3
-MLINKS+= BN_generate_prime.3 BN_GENCB_new.3
-MLINKS+= BN_generate_prime.3 BN_GENCB_set.3
-MLINKS+= BN_generate_prime.3 BN_GENCB_set_old.3
-MLINKS+= BN_mod_mul_montgomery.3 BN_MONT_CTX_copy.3
-MLINKS+= BN_mod_mul_montgomery.3 BN_MONT_CTX_free.3
-MLINKS+= BN_mod_mul_montgomery.3 BN_MONT_CTX_new.3
-MLINKS+= BN_mod_mul_montgomery.3 BN_MONT_CTX_set.3
-MLINKS+= BN_mod_mul_reciprocal.3 BN_RECP_CTX_free.3
-MLINKS+= BN_mod_mul_reciprocal.3 BN_RECP_CTX_new.3
-MLINKS+= BN_mod_mul_reciprocal.3 BN_RECP_CTX_set.3
-MLINKS+= BN_cmp.3 BN_abs_is_word.3
+MLINKS+= BN_CTX_start.3 BN_CTX_end.3
+MLINKS+= BN_CTX_start.3 BN_CTX_get.3
+MLINKS+= BN_add.3 BN_div.3
+MLINKS+= BN_add.3 BN_exp.3
+MLINKS+= BN_add.3 BN_gcd.3
+MLINKS+= BN_add.3 BN_mod.3
+MLINKS+= BN_add.3 BN_mod_add.3
+MLINKS+= BN_add.3 BN_mod_exp.3
+MLINKS+= BN_add.3 BN_mod_mul.3
+MLINKS+= BN_add.3 BN_mod_sqr.3
+MLINKS+= BN_add.3 BN_mod_sqrt.3
+MLINKS+= BN_add.3 BN_mod_sub.3
+MLINKS+= BN_add.3 BN_mul.3
+MLINKS+= BN_add.3 BN_nnmod.3
+MLINKS+= BN_add.3 BN_sqr.3
+MLINKS+= BN_add.3 BN_sub.3
+MLINKS+= BN_add_word.3 BN_div_word.3
+MLINKS+= BN_add_word.3 BN_mod_word.3
+MLINKS+= BN_add_word.3 BN_mul_word.3
+MLINKS+= BN_add_word.3 BN_sub_word.3
MLINKS+= BN_bn2bin.3 BN_bin2bn.3
MLINKS+= BN_bn2bin.3 BN_bn2binpad.3
MLINKS+= BN_bn2bin.3 BN_bn2dec.3
@@ -1057,69 +1149,59 @@ MLINKS+= BN_bn2bin.3 BN_bn2hex.3
MLINKS+= BN_bn2bin.3 BN_bn2lebinpad.3
MLINKS+= BN_bn2bin.3 BN_bn2mpi.3
MLINKS+= BN_bn2bin.3 BN_bn2nativepad.3
-MLINKS+= BN_generate_prime.3 BN_check_prime.3
-MLINKS+= BN_new.3 BN_clear.3
-MLINKS+= BN_set_bit.3 BN_clear_bit.3
-MLINKS+= BN_new.3 BN_clear_free.3
MLINKS+= BN_bn2bin.3 BN_dec2bn.3
-MLINKS+= BN_add.3 BN_div.3
-MLINKS+= BN_mod_mul_reciprocal.3 BN_div_recp.3
-MLINKS+= BN_add_word.3 BN_div_word.3
-MLINKS+= BN_copy.3 BN_dup.3
-MLINKS+= BN_add.3 BN_exp.3
-MLINKS+= BN_new.3 BN_free.3
-MLINKS+= BN_mod_mul_montgomery.3 BN_from_montgomery.3
-MLINKS+= BN_add.3 BN_gcd.3
-MLINKS+= BN_generate_prime.3 BN_generate_prime_ex.3
-MLINKS+= BN_generate_prime.3 BN_generate_prime_ex2.3
-MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_192.3
-MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_224.3
-MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_256.3
-MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_384.3
-MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_521.3
-MLINKS+= DH_get_1024_160.3 BN_get_rfc2409_prime_1024.3
-MLINKS+= DH_get_1024_160.3 BN_get_rfc2409_prime_768.3
-MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_1536.3
-MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_2048.3
-MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_3072.3
-MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_4096.3
-MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_6144.3
-MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_8192.3
-MLINKS+= BN_zero.3 BN_get_word.3
MLINKS+= BN_bn2bin.3 BN_hex2bn.3
-MLINKS+= BN_set_bit.3 BN_is_bit_set.3
+MLINKS+= BN_bn2bin.3 BN_lebin2bn.3
+MLINKS+= BN_bn2bin.3 BN_mpi2bn.3
+MLINKS+= BN_bn2bin.3 BN_native2bn.3
+MLINKS+= BN_bn2bin.3 BN_print.3
+MLINKS+= BN_bn2bin.3 BN_print_fp.3
+MLINKS+= BN_bn2bin.3 BN_signed_bin2bn.3
+MLINKS+= BN_bn2bin.3 BN_signed_bn2bin.3
+MLINKS+= BN_bn2bin.3 BN_signed_bn2lebin.3
+MLINKS+= BN_bn2bin.3 BN_signed_bn2native.3
+MLINKS+= BN_bn2bin.3 BN_signed_lebin2bn.3
+MLINKS+= BN_bn2bin.3 BN_signed_native2bn.3
+MLINKS+= BN_cmp.3 BN_abs_is_word.3
+MLINKS+= BN_cmp.3 BN_are_coprime.3
MLINKS+= BN_cmp.3 BN_is_odd.3
MLINKS+= BN_cmp.3 BN_is_one.3
+MLINKS+= BN_cmp.3 BN_is_word.3
+MLINKS+= BN_cmp.3 BN_is_zero.3
+MLINKS+= BN_cmp.3 BN_ucmp.3
+MLINKS+= BN_copy.3 BN_dup.3
+MLINKS+= BN_copy.3 BN_with_flags.3
+MLINKS+= BN_generate_prime.3 BN_GENCB_call.3
+MLINKS+= BN_generate_prime.3 BN_GENCB_free.3
+MLINKS+= BN_generate_prime.3 BN_GENCB_get_arg.3
+MLINKS+= BN_generate_prime.3 BN_GENCB_new.3
+MLINKS+= BN_generate_prime.3 BN_GENCB_set.3
+MLINKS+= BN_generate_prime.3 BN_GENCB_set_old.3
+MLINKS+= BN_generate_prime.3 BN_check_prime.3
+MLINKS+= BN_generate_prime.3 BN_generate_prime_ex.3
+MLINKS+= BN_generate_prime.3 BN_generate_prime_ex2.3
MLINKS+= BN_generate_prime.3 BN_is_prime.3
MLINKS+= BN_generate_prime.3 BN_is_prime_ex.3
MLINKS+= BN_generate_prime.3 BN_is_prime_fasttest.3
MLINKS+= BN_generate_prime.3 BN_is_prime_fasttest_ex.3
-MLINKS+= BN_cmp.3 BN_is_word.3
-MLINKS+= BN_cmp.3 BN_is_zero.3
-MLINKS+= BN_bn2bin.3 BN_lebin2bn.3
-MLINKS+= BN_set_bit.3 BN_lshift.3
-MLINKS+= BN_set_bit.3 BN_lshift1.3
-MLINKS+= BN_set_bit.3 BN_mask_bits.3
-MLINKS+= BN_add.3 BN_mod.3
-MLINKS+= BN_add.3 BN_mod_add.3
-MLINKS+= BN_add.3 BN_mod_exp.3
MLINKS+= BN_mod_exp_mont.3 BN_mod_exp_mont_consttime.3
MLINKS+= BN_mod_exp_mont.3 BN_mod_exp_mont_consttime_x2.3
-MLINKS+= BN_add.3 BN_mod_mul.3
-MLINKS+= BN_add.3 BN_mod_sqr.3
-MLINKS+= BN_add.3 BN_mod_sqrt.3
-MLINKS+= BN_add.3 BN_mod_sub.3
-MLINKS+= BN_add_word.3 BN_mod_word.3
-MLINKS+= BN_bn2bin.3 BN_mpi2bn.3
-MLINKS+= BN_add.3 BN_mul.3
-MLINKS+= BN_add_word.3 BN_mul_word.3
-MLINKS+= BN_bn2bin.3 BN_native2bn.3
-MLINKS+= BN_add.3 BN_nnmod.3
+MLINKS+= BN_mod_mul_montgomery.3 BN_MONT_CTX_copy.3
+MLINKS+= BN_mod_mul_montgomery.3 BN_MONT_CTX_free.3
+MLINKS+= BN_mod_mul_montgomery.3 BN_MONT_CTX_new.3
+MLINKS+= BN_mod_mul_montgomery.3 BN_MONT_CTX_set.3
+MLINKS+= BN_mod_mul_montgomery.3 BN_from_montgomery.3
+MLINKS+= BN_mod_mul_montgomery.3 BN_to_montgomery.3
+MLINKS+= BN_mod_mul_reciprocal.3 BN_RECP_CTX_free.3
+MLINKS+= BN_mod_mul_reciprocal.3 BN_RECP_CTX_new.3
+MLINKS+= BN_mod_mul_reciprocal.3 BN_RECP_CTX_set.3
+MLINKS+= BN_mod_mul_reciprocal.3 BN_div_recp.3
+MLINKS+= BN_new.3 BN_clear.3
+MLINKS+= BN_new.3 BN_clear_free.3
+MLINKS+= BN_new.3 BN_free.3
+MLINKS+= BN_new.3 BN_secure_new.3
MLINKS+= BN_num_bytes.3 BN_num_bits.3
MLINKS+= BN_num_bytes.3 BN_num_bits_word.3
-MLINKS+= BN_zero.3 BN_one.3
-MLINKS+= BN_bn2bin.3 BN_print.3
-MLINKS+= BN_bn2bin.3 BN_print_fp.3
MLINKS+= BN_rand.3 BN_priv_rand.3
MLINKS+= BN_rand.3 BN_priv_rand_ex.3
MLINKS+= BN_rand.3 BN_priv_rand_range.3
@@ -1129,39 +1211,51 @@ MLINKS+= BN_rand.3 BN_pseudo_rand_range.3
MLINKS+= BN_rand.3 BN_rand_ex.3
MLINKS+= BN_rand.3 BN_rand_range.3
MLINKS+= BN_rand.3 BN_rand_range_ex.3
+MLINKS+= BN_set_bit.3 BN_clear_bit.3
+MLINKS+= BN_set_bit.3 BN_is_bit_set.3
+MLINKS+= BN_set_bit.3 BN_lshift.3
+MLINKS+= BN_set_bit.3 BN_lshift1.3
+MLINKS+= BN_set_bit.3 BN_mask_bits.3
MLINKS+= BN_set_bit.3 BN_rshift.3
MLINKS+= BN_set_bit.3 BN_rshift1.3
-MLINKS+= BN_new.3 BN_secure_new.3
+MLINKS+= BN_zero.3 BN_get_word.3
+MLINKS+= BN_zero.3 BN_one.3
MLINKS+= BN_zero.3 BN_set_word.3
-MLINKS+= BN_add.3 BN_sqr.3
-MLINKS+= BN_add.3 BN_sub.3
-MLINKS+= BN_add_word.3 BN_sub_word.3
-MLINKS+= ASN1_INTEGER_get_int64.3 BN_to_ASN1_ENUMERATED.3
-MLINKS+= ASN1_INTEGER_get_int64.3 BN_to_ASN1_INTEGER.3
-MLINKS+= BN_mod_mul_montgomery.3 BN_to_montgomery.3
-MLINKS+= BN_cmp.3 BN_ucmp.3
MLINKS+= BN_zero.3 BN_value_one.3
-MLINKS+= BN_copy.3 BN_with_flags.3
MLINKS+= BUF_MEM_new.3 BUF_MEM_free.3
MLINKS+= BUF_MEM_new.3 BUF_MEM_grow.3
MLINKS+= BUF_MEM_new.3 BUF_MEM_grow_clean.3
MLINKS+= BUF_MEM_new.3 BUF_MEM_new_ex.3
MLINKS+= BUF_MEM_new.3 BUF_reverse.3
-MLINKS+= X509_dup.3 CERTIFICATEPOLICIES_free.3
-MLINKS+= X509_dup.3 CERTIFICATEPOLICIES_new.3
+MLINKS+= CMAC_CTX.3 CMAC_CTX_cleanup.3
+MLINKS+= CMAC_CTX.3 CMAC_CTX_copy.3
+MLINKS+= CMAC_CTX.3 CMAC_CTX_free.3
+MLINKS+= CMAC_CTX.3 CMAC_CTX_get0_cipher_ctx.3
+MLINKS+= CMAC_CTX.3 CMAC_CTX_new.3
+MLINKS+= CMAC_CTX.3 CMAC_Final.3
+MLINKS+= CMAC_CTX.3 CMAC_Init.3
+MLINKS+= CMAC_CTX.3 CMAC_Update.3
+MLINKS+= CMAC_CTX.3 CMAC_resume.3
+MLINKS+= CMS_EncryptedData_decrypt.3 CMS_EnvelopedData_decrypt.3
+MLINKS+= CMS_EncryptedData_encrypt.3 CMS_EncryptedData_encrypt_ex.3
MLINKS+= CMS_EnvelopedData_create.3 CMS_AuthEnvelopedData_create.3
MLINKS+= CMS_EnvelopedData_create.3 CMS_AuthEnvelopedData_create_ex.3
-MLINKS+= X509_dup.3 CMS_ContentInfo_free.3
-MLINKS+= X509_dup.3 CMS_ContentInfo_new.3
-MLINKS+= X509_dup.3 CMS_ContentInfo_new_ex.3
-MLINKS+= X509_dup.3 CMS_ContentInfo_print_ctx.3
-MLINKS+= CMS_EncryptedData_encrypt.3 CMS_EncryptedData_encrypt_ex.3
MLINKS+= CMS_EnvelopedData_create.3 CMS_EnvelopedData_create_ex.3
-MLINKS+= CMS_get1_ReceiptRequest.3 CMS_ReceiptRequest_create0.3
-MLINKS+= CMS_get1_ReceiptRequest.3 CMS_ReceiptRequest_create0_ex.3
-MLINKS+= X509_dup.3 CMS_ReceiptRequest_free.3
-MLINKS+= CMS_get1_ReceiptRequest.3 CMS_ReceiptRequest_get0_values.3
-MLINKS+= X509_dup.3 CMS_ReceiptRequest_new.3
+MLINKS+= CMS_add0_cert.3 CMS_add0_crl.3
+MLINKS+= CMS_add0_cert.3 CMS_add1_cert.3
+MLINKS+= CMS_add0_cert.3 CMS_add1_crl.3
+MLINKS+= CMS_add0_cert.3 CMS_get1_certs.3
+MLINKS+= CMS_add0_cert.3 CMS_get1_crls.3
+MLINKS+= CMS_add1_recipient_cert.3 CMS_add0_recipient_key.3
+MLINKS+= CMS_add1_recipient_cert.3 CMS_add1_recipient.3
+MLINKS+= CMS_add1_signer.3 CMS_SignerInfo_sign.3
+MLINKS+= CMS_data_create.3 CMS_data_create_ex.3
+MLINKS+= CMS_decrypt.3 CMS_decrypt_set1_password.3
+MLINKS+= CMS_decrypt.3 CMS_decrypt_set1_pkey.3
+MLINKS+= CMS_decrypt.3 CMS_decrypt_set1_pkey_and_peer.3
+MLINKS+= CMS_digest_create.3 CMS_digest_create_ex.3
+MLINKS+= CMS_encrypt.3 CMS_encrypt_ex.3
+MLINKS+= CMS_final.3 CMS_final_digest.3
MLINKS+= CMS_get0_RecipientInfos.3 CMS_RecipientInfo_decrypt.3
MLINKS+= CMS_get0_RecipientInfos.3 CMS_RecipientInfo_encrypt.3
MLINKS+= CMS_get0_RecipientInfos.3 CMS_RecipientInfo_kari_set0_pkey.3
@@ -1177,80 +1271,82 @@ MLINKS+= CMS_get0_SignerInfos.3 CMS_SignerInfo_cert_cmp.3
MLINKS+= CMS_get0_SignerInfos.3 CMS_SignerInfo_get0_signature.3
MLINKS+= CMS_get0_SignerInfos.3 CMS_SignerInfo_get0_signer_id.3
MLINKS+= CMS_get0_SignerInfos.3 CMS_SignerInfo_set1_signer_cert.3
-MLINKS+= CMS_add1_signer.3 CMS_SignerInfo_sign.3
-MLINKS+= CMS_add0_cert.3 CMS_add0_crl.3
-MLINKS+= CMS_add1_recipient_cert.3 CMS_add0_recipient_key.3
-MLINKS+= CMS_get1_ReceiptRequest.3 CMS_add1_ReceiptRequest.3
-MLINKS+= CMS_add0_cert.3 CMS_add1_cert.3
-MLINKS+= CMS_add0_cert.3 CMS_add1_crl.3
-MLINKS+= CMS_add1_recipient_cert.3 CMS_add1_recipient.3
-MLINKS+= CMS_data_create.3 CMS_data_create_ex.3
-MLINKS+= CMS_decrypt.3 CMS_decrypt_set1_password.3
-MLINKS+= CMS_decrypt.3 CMS_decrypt_set1_pkey.3
-MLINKS+= CMS_decrypt.3 CMS_decrypt_set1_pkey_and_peer.3
-MLINKS+= CMS_digest_create.3 CMS_digest_create_ex.3
-MLINKS+= CMS_encrypt.3 CMS_encrypt_ex.3
MLINKS+= CMS_get0_type.3 CMS_get0_content.3
MLINKS+= CMS_get0_type.3 CMS_get0_eContentType.3
-MLINKS+= CMS_verify.3 CMS_get0_signers.3
-MLINKS+= CMS_add0_cert.3 CMS_get1_certs.3
-MLINKS+= CMS_add0_cert.3 CMS_get1_crls.3
MLINKS+= CMS_get0_type.3 CMS_set1_eContentType.3
+MLINKS+= CMS_get1_ReceiptRequest.3 CMS_ReceiptRequest_create0.3
+MLINKS+= CMS_get1_ReceiptRequest.3 CMS_ReceiptRequest_create0_ex.3
+MLINKS+= CMS_get1_ReceiptRequest.3 CMS_ReceiptRequest_get0_values.3
+MLINKS+= CMS_get1_ReceiptRequest.3 CMS_add1_ReceiptRequest.3
MLINKS+= CMS_sign.3 CMS_sign_ex.3
-MLINKS+= CONF_modules_load_file.3 CONF_get1_default_config_file.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_add1_attr.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_add1_attr_by_NID.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_add1_attr_by_OBJ.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_add1_attr_by_txt.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_delete_attr.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_get0_data_by_OBJ.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_get_attr_by_NID.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_get_attr_by_OBJ.3
+MLINKS+= CMS_signed_get_attr.3 CMS_signed_get_attr_count.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_add1_attr.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_add1_attr_by_NID.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_add1_attr_by_OBJ.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_add1_attr_by_txt.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_delete_attr.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_get0_data_by_OBJ.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_get_attr.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_get_attr_by_NID.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_get_attr_by_OBJ.3
+MLINKS+= CMS_signed_get_attr.3 CMS_unsigned_get_attr_count.3
+MLINKS+= CMS_verify.3 CMS_SignedData_verify.3
+MLINKS+= CMS_verify.3 CMS_get0_signers.3
+MLINKS+= COMP_CTX_new.3 BIO_f_brotli.3
+MLINKS+= COMP_CTX_new.3 BIO_f_zlib.3
+MLINKS+= COMP_CTX_new.3 BIO_f_zstd.3
+MLINKS+= COMP_CTX_new.3 COMP_CTX_free.3
+MLINKS+= COMP_CTX_new.3 COMP_CTX_get_method.3
+MLINKS+= COMP_CTX_new.3 COMP_CTX_get_type.3
+MLINKS+= COMP_CTX_new.3 COMP_brotli.3
+MLINKS+= COMP_CTX_new.3 COMP_brotli_oneshot.3
+MLINKS+= COMP_CTX_new.3 COMP_compress_block.3
+MLINKS+= COMP_CTX_new.3 COMP_expand_block.3
+MLINKS+= COMP_CTX_new.3 COMP_get_name.3
+MLINKS+= COMP_CTX_new.3 COMP_get_type.3
+MLINKS+= COMP_CTX_new.3 COMP_zlib.3
+MLINKS+= COMP_CTX_new.3 COMP_zlib_oneshot.3
+MLINKS+= COMP_CTX_new.3 COMP_zstd.3
+MLINKS+= COMP_CTX_new.3 COMP_zstd_oneshot.3
MLINKS+= CONF_modules_free.3 CONF_modules_finish.3
+MLINKS+= CONF_modules_free.3 CONF_modules_unload.3
+MLINKS+= CONF_modules_load_file.3 CONF_get1_default_config_file.3
MLINKS+= CONF_modules_load_file.3 CONF_modules_load.3
MLINKS+= CONF_modules_load_file.3 CONF_modules_load_file_ex.3
-MLINKS+= CONF_modules_free.3 CONF_modules_unload.3
-MLINKS+= X509_dup.3 CRL_DIST_POINTS_free.3
-MLINKS+= X509_dup.3 CRL_DIST_POINTS_new.3
-MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_EX_dup.3
-MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_EX_free.3
-MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_EX_new.3
MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_THREAD_lock_free.3
MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_THREAD_lock_new.3
MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_THREAD_read_lock.3
MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_THREAD_unlock.3
MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_THREAD_write_lock.3
-MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_alloc_ex_data.3
MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_atomic_add.3
+MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_atomic_add64.3
+MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_atomic_and.3
MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_atomic_load.3
+MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_atomic_load_int.3
MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_atomic_or.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_clear_free.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_clear_realloc.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_free.3
+MLINKS+= CRYPTO_THREAD_run_once.3 CRYPTO_atomic_store.3
+MLINKS+= CRYPTO_THREAD_run_once.3 OSSL_THREAD_SUPPORT_FLAG_DEFAULT_SPAWN.3
+MLINKS+= CRYPTO_THREAD_run_once.3 OSSL_THREAD_SUPPORT_FLAG_THREAD_POOL.3
+MLINKS+= CRYPTO_THREAD_run_once.3 OSSL_get_max_threads.3
+MLINKS+= CRYPTO_THREAD_run_once.3 OSSL_get_thread_support_flags.3
+MLINKS+= CRYPTO_THREAD_run_once.3 OSSL_set_max_threads.3
+MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_EX_dup.3
+MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_EX_free.3
+MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_EX_new.3
+MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_alloc_ex_data.3
MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_free_ex_data.3
MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_free_ex_index.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_free_fn.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_get_alloc_counts.3
MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_get_ex_data.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_get_mem_functions.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_malloc.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_malloc_fn.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_ctrl.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_debug_pop.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_debug_push.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_leaks.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_leaks_cb.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_leaks_fp.3
MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_new_ex_data.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_realloc.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_realloc_fn.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_allocated.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_clear_free.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_free.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_malloc.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_malloc_done.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_malloc_init.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_malloc_initialized.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_used.3
-MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_zalloc.3
MLINKS+= CRYPTO_get_ex_new_index.3 CRYPTO_set_ex_data.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_set_mem_debug.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_set_mem_functions.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_strdup.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_strndup.3
-MLINKS+= OPENSSL_malloc.3 CRYPTO_zalloc.3
MLINKS+= CTLOG_STORE_new.3 CTLOG_STORE_free.3
MLINKS+= CTLOG_STORE_new.3 CTLOG_STORE_load_default_file.3
MLINKS+= CTLOG_STORE_new.3 CTLOG_STORE_load_file.3
@@ -1272,12 +1368,59 @@ MLINKS+= CT_POLICY_EVAL_CTX_new.3 CT_POLICY_EVAL_CTX_set1_cert.3
MLINKS+= CT_POLICY_EVAL_CTX_new.3 CT_POLICY_EVAL_CTX_set1_issuer.3
MLINKS+= CT_POLICY_EVAL_CTX_new.3 CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE.3
MLINKS+= CT_POLICY_EVAL_CTX_new.3 CT_POLICY_EVAL_CTX_set_time.3
-MLINKS+= X509_dup.3 DECLARE_ASN1_FUNCTIONS.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 DECLARE_LHASH_OF.3
-MLINKS+= PEM_read_CMS.3 DECLARE_PEM_rw.3
MLINKS+= DEFINE_STACK_OF.3 DEFINE_SPECIAL_STACK_OF.3
MLINKS+= DEFINE_STACK_OF.3 DEFINE_SPECIAL_STACK_OF_CONST.3
MLINKS+= DEFINE_STACK_OF.3 DEFINE_STACK_OF_CONST.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_deep_copy.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_delete.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_delete_ptr.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_dup.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_find.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_find_all.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_find_ex.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_free.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_insert.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_is_sorted.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_new.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_new_null.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_new_reserve.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_num.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_pop.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_pop_free.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_push.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_reserve.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_set.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_set_cmp_func.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_shift.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_sort.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_unshift.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_value.3
+MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_zero.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_deep_copy.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_delete.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_delete_ptr.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_dup.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_find.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_find_all.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_find_ex.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_free.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_insert.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_is_sorted.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_new.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_new_null.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_new_reserve.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_num.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_pop.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_pop_free.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_push.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_reserve.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_set.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_set_cmp_func.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_shift.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_sort.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_unshift.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_value.3
+MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_zero.3
MLINKS+= DES_random_key.3 DES_cbc_cksum.3
MLINKS+= DES_random_key.3 DES_cfb64_encrypt.3
MLINKS+= DES_random_key.3 DES_cfb_encrypt.3
@@ -1306,18 +1449,15 @@ MLINKS+= DES_random_key.3 DES_set_odd_parity.3
MLINKS+= DES_random_key.3 DES_string_to_2keys.3
MLINKS+= DES_random_key.3 DES_string_to_key.3
MLINKS+= DES_random_key.3 DES_xcbc_encrypt.3
-MLINKS+= DH_set_method.3 DH_OpenSSL.3
-MLINKS+= DH_size.3 DH_bits.3
+MLINKS+= DH_generate_key.3 DH_compute_key.3
+MLINKS+= DH_generate_key.3 DH_compute_key_padded.3
MLINKS+= DH_generate_parameters.3 DH_check.3
MLINKS+= DH_generate_parameters.3 DH_check_ex.3
MLINKS+= DH_generate_parameters.3 DH_check_params.3
MLINKS+= DH_generate_parameters.3 DH_check_params_ex.3
MLINKS+= DH_generate_parameters.3 DH_check_pub_key_ex.3
-MLINKS+= DH_get0_pqg.3 DH_clear_flags.3
-MLINKS+= DH_generate_key.3 DH_compute_key.3
-MLINKS+= DH_generate_key.3 DH_compute_key_padded.3
-MLINKS+= DH_new.3 DH_free.3
MLINKS+= DH_generate_parameters.3 DH_generate_parameters_ex.3
+MLINKS+= DH_get0_pqg.3 DH_clear_flags.3
MLINKS+= DH_get0_pqg.3 DH_get0_engine.3
MLINKS+= DH_get0_pqg.3 DH_get0_g.3
MLINKS+= DH_get0_pqg.3 DH_get0_key.3
@@ -1325,13 +1465,27 @@ MLINKS+= DH_get0_pqg.3 DH_get0_p.3
MLINKS+= DH_get0_pqg.3 DH_get0_priv_key.3
MLINKS+= DH_get0_pqg.3 DH_get0_pub_key.3
MLINKS+= DH_get0_pqg.3 DH_get0_q.3
+MLINKS+= DH_get0_pqg.3 DH_get_length.3
+MLINKS+= DH_get0_pqg.3 DH_set0_key.3
+MLINKS+= DH_get0_pqg.3 DH_set0_pqg.3
+MLINKS+= DH_get0_pqg.3 DH_set_flags.3
+MLINKS+= DH_get0_pqg.3 DH_set_length.3
+MLINKS+= DH_get0_pqg.3 DH_test_flags.3
+MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_192.3
+MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_224.3
+MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_256.3
+MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_384.3
+MLINKS+= DH_get_1024_160.3 BN_get0_nist_prime_521.3
+MLINKS+= DH_get_1024_160.3 BN_get_rfc2409_prime_1024.3
+MLINKS+= DH_get_1024_160.3 BN_get_rfc2409_prime_768.3
+MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_1536.3
+MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_2048.3
+MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_3072.3
+MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_4096.3
+MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_6144.3
+MLINKS+= DH_get_1024_160.3 BN_get_rfc3526_prime_8192.3
MLINKS+= DH_get_1024_160.3 DH_get_2048_224.3
MLINKS+= DH_get_1024_160.3 DH_get_2048_256.3
-MLINKS+= DH_set_method.3 DH_get_default_method.3
-MLINKS+= BIO_get_ex_new_index.3 DH_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 DH_get_ex_new_index.3
-MLINKS+= DH_get0_pqg.3 DH_get_length.3
-MLINKS+= DH_new_by_nid.3 DH_get_nid.3
MLINKS+= DH_meth_new.3 DH_meth_dup.3
MLINKS+= DH_meth_new.3 DH_meth_free.3
MLINKS+= DH_meth_new.3 DH_meth_get0_app_data.3
@@ -1352,34 +1506,20 @@ MLINKS+= DH_meth_new.3 DH_meth_set_flags.3
MLINKS+= DH_meth_new.3 DH_meth_set_generate_key.3
MLINKS+= DH_meth_new.3 DH_meth_set_generate_params.3
MLINKS+= DH_meth_new.3 DH_meth_set_init.3
+MLINKS+= DH_new.3 DH_free.3
+MLINKS+= DH_new_by_nid.3 DH_get_nid.3
+MLINKS+= DH_set_method.3 DH_OpenSSL.3
+MLINKS+= DH_set_method.3 DH_get_default_method.3
MLINKS+= DH_set_method.3 DH_new_method.3
-MLINKS+= DH_size.3 DH_security_bits.3
-MLINKS+= DH_get0_pqg.3 DH_set0_key.3
-MLINKS+= DH_get0_pqg.3 DH_set0_pqg.3
MLINKS+= DH_set_method.3 DH_set_default_method.3
-MLINKS+= BIO_get_ex_new_index.3 DH_set_ex_data.3
-MLINKS+= DH_get0_pqg.3 DH_set_flags.3
-MLINKS+= DH_get0_pqg.3 DH_set_length.3
-MLINKS+= DH_get0_pqg.3 DH_test_flags.3
-MLINKS+= RSA_print.3 DHparams_print.3
-MLINKS+= RSA_print.3 DHparams_print_fp.3
-MLINKS+= X509_dup.3 DIRECTORYSTRING_free.3
-MLINKS+= X509_dup.3 DIRECTORYSTRING_new.3
-MLINKS+= X509_dup.3 DISPLAYTEXT_free.3
-MLINKS+= X509_dup.3 DISPLAYTEXT_new.3
-MLINKS+= X509_dup.3 DIST_POINT_NAME_free.3
-MLINKS+= X509_dup.3 DIST_POINT_NAME_new.3
-MLINKS+= X509_dup.3 DIST_POINT_free.3
-MLINKS+= X509_dup.3 DIST_POINT_new.3
-MLINKS+= DSA_set_method.3 DSA_OpenSSL.3
+MLINKS+= DH_size.3 DH_bits.3
+MLINKS+= DH_size.3 DH_security_bits.3
MLINKS+= DSA_SIG_new.3 DSA_SIG_free.3
MLINKS+= DSA_SIG_new.3 DSA_SIG_get0.3
MLINKS+= DSA_SIG_new.3 DSA_SIG_set0.3
-MLINKS+= DSA_size.3 DSA_bits.3
-MLINKS+= DSA_get0_pqg.3 DSA_clear_flags.3
MLINKS+= DSA_do_sign.3 DSA_do_verify.3
-MLINKS+= DSA_new.3 DSA_free.3
MLINKS+= DSA_generate_parameters.3 DSA_generate_parameters_ex.3
+MLINKS+= DSA_get0_pqg.3 DSA_clear_flags.3
MLINKS+= DSA_get0_pqg.3 DSA_get0_engine.3
MLINKS+= DSA_get0_pqg.3 DSA_get0_g.3
MLINKS+= DSA_get0_pqg.3 DSA_get0_key.3
@@ -1387,9 +1527,10 @@ MLINKS+= DSA_get0_pqg.3 DSA_get0_p.3
MLINKS+= DSA_get0_pqg.3 DSA_get0_priv_key.3
MLINKS+= DSA_get0_pqg.3 DSA_get0_pub_key.3
MLINKS+= DSA_get0_pqg.3 DSA_get0_q.3
-MLINKS+= DSA_set_method.3 DSA_get_default_method.3
-MLINKS+= BIO_get_ex_new_index.3 DSA_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 DSA_get_ex_new_index.3
+MLINKS+= DSA_get0_pqg.3 DSA_set0_key.3
+MLINKS+= DSA_get0_pqg.3 DSA_set0_pqg.3
+MLINKS+= DSA_get0_pqg.3 DSA_set_flags.3
+MLINKS+= DSA_get0_pqg.3 DSA_test_flags.3
MLINKS+= DSA_meth_new.3 DSA_meth_dup.3
MLINKS+= DSA_meth_new.3 DSA_meth_free.3
MLINKS+= DSA_meth_new.3 DSA_meth_get0_app_data.3
@@ -1416,31 +1557,17 @@ MLINKS+= DSA_meth_new.3 DSA_meth_set_paramgen.3
MLINKS+= DSA_meth_new.3 DSA_meth_set_sign.3
MLINKS+= DSA_meth_new.3 DSA_meth_set_sign_setup.3
MLINKS+= DSA_meth_new.3 DSA_meth_set_verify.3
+MLINKS+= DSA_new.3 DSA_free.3
+MLINKS+= DSA_set_method.3 DSA_OpenSSL.3
+MLINKS+= DSA_set_method.3 DSA_get_default_method.3
MLINKS+= DSA_set_method.3 DSA_new_method.3
-MLINKS+= RSA_print.3 DSA_print.3
-MLINKS+= RSA_print.3 DSA_print_fp.3
-MLINKS+= DSA_size.3 DSA_security_bits.3
-MLINKS+= DSA_get0_pqg.3 DSA_set0_key.3
-MLINKS+= DSA_get0_pqg.3 DSA_set0_pqg.3
MLINKS+= DSA_set_method.3 DSA_set_default_method.3
-MLINKS+= BIO_get_ex_new_index.3 DSA_set_ex_data.3
-MLINKS+= DSA_get0_pqg.3 DSA_set_flags.3
MLINKS+= DSA_sign.3 DSA_sign_setup.3
-MLINKS+= DSA_get0_pqg.3 DSA_test_flags.3
MLINKS+= DSA_sign.3 DSA_verify.3
-MLINKS+= X509_dup.3 DSAparams_dup.3
-MLINKS+= RSA_print.3 DSAparams_print.3
-MLINKS+= RSA_print.3 DSAparams_print_fp.3
-MLINKS+= SSL_CTX_new.3 DTLS_client_method.3
-MLINKS+= SSL_CTX_new.3 DTLS_method.3
-MLINKS+= SSL_CTX_new.3 DTLS_server_method.3
+MLINKS+= DSA_size.3 DSA_bits.3
+MLINKS+= DSA_size.3 DSA_security_bits.3
MLINKS+= DTLS_set_timer_cb.3 DTLS_timer_cb.3
-MLINKS+= SSL_CTX_new.3 DTLSv1_2_client_method.3
-MLINKS+= SSL_CTX_new.3 DTLSv1_2_method.3
-MLINKS+= SSL_CTX_new.3 DTLSv1_2_server_method.3
-MLINKS+= SSL_CTX_new.3 DTLSv1_client_method.3
-MLINKS+= SSL_CTX_new.3 DTLSv1_method.3
-MLINKS+= SSL_CTX_new.3 DTLSv1_server_method.3
+MLINKS+= DTLSv1_listen.3 SSL_stateless.3
MLINKS+= ECDSA_SIG_new.3 ECDSA_SIG_free.3
MLINKS+= ECDSA_SIG_new.3 ECDSA_SIG_get0.3
MLINKS+= ECDSA_SIG_new.3 ECDSA_SIG_get0_r.3
@@ -1453,10 +1580,6 @@ MLINKS+= ECDSA_sign.3 ECDSA_sign_ex.3
MLINKS+= ECDSA_sign.3 ECDSA_sign_setup.3
MLINKS+= ECDSA_sign.3 ECDSA_size.3
MLINKS+= ECDSA_sign.3 ECDSA_verify.3
-MLINKS+= X509_dup.3 ECPARAMETERS_free.3
-MLINKS+= X509_dup.3 ECPARAMETERS_new.3
-MLINKS+= X509_dup.3 ECPKPARAMETERS_free.3
-MLINKS+= X509_dup.3 ECPKPARAMETERS_new.3
MLINKS+= ECPKParameters_print.3 ECPKParameters_print_fp.3
MLINKS+= EC_GFp_simple_method.3 EC_GF2m_simple_method.3
MLINKS+= EC_GFp_simple_method.3 EC_GFp_mont_method.3
@@ -1464,13 +1587,12 @@ MLINKS+= EC_GFp_simple_method.3 EC_GFp_nist_method.3
MLINKS+= EC_GFp_simple_method.3 EC_GFp_nistp224_method.3
MLINKS+= EC_GFp_simple_method.3 EC_GFp_nistp256_method.3
MLINKS+= EC_GFp_simple_method.3 EC_GFp_nistp521_method.3
+MLINKS+= EC_GFp_simple_method.3 EC_METHOD_get_field_type.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_check.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_check_discriminant.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_check_named_curve.3
-MLINKS+= EC_GROUP_new.3 EC_GROUP_clear_free.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_cmp.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_dup.3
-MLINKS+= EC_GROUP_new.3 EC_GROUP_free.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get0_cofactor.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get0_field.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get0_generator.3
@@ -1479,21 +1601,28 @@ MLINKS+= EC_GROUP_copy.3 EC_GROUP_get0_seed.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_asn1_flag.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_basis_type.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_cofactor.3
-MLINKS+= EC_GROUP_new.3 EC_GROUP_get_curve.3
-MLINKS+= EC_GROUP_new.3 EC_GROUP_get_curve_GF2m.3
-MLINKS+= EC_GROUP_new.3 EC_GROUP_get_curve_GFp.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_curve_name.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_degree.3
-MLINKS+= EC_GROUP_new.3 EC_GROUP_get_ecparameters.3
-MLINKS+= EC_GROUP_new.3 EC_GROUP_get_ecpkparameters.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_field_type.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_order.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_pentanomial_basis.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_point_conversion_form.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_seed_len.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_get_trinomial_basis.3
-MLINKS+= EC_POINT_add.3 EC_GROUP_have_precompute_mult.3
MLINKS+= EC_GROUP_copy.3 EC_GROUP_method_of.3
+MLINKS+= EC_GROUP_copy.3 EC_GROUP_order_bits.3
+MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_asn1_flag.3
+MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_curve_name.3
+MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_generator.3
+MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_point_conversion_form.3
+MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_seed.3
+MLINKS+= EC_GROUP_new.3 EC_GROUP_clear_free.3
+MLINKS+= EC_GROUP_new.3 EC_GROUP_free.3
+MLINKS+= EC_GROUP_new.3 EC_GROUP_get_curve.3
+MLINKS+= EC_GROUP_new.3 EC_GROUP_get_curve_GF2m.3
+MLINKS+= EC_GROUP_new.3 EC_GROUP_get_curve_GFp.3
+MLINKS+= EC_GROUP_new.3 EC_GROUP_get_ecparameters.3
+MLINKS+= EC_GROUP_new.3 EC_GROUP_get_ecpkparameters.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_new_by_curve_name.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_new_by_curve_name_ex.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_new_curve_GF2m.3
@@ -1501,16 +1630,13 @@ MLINKS+= EC_GROUP_new.3 EC_GROUP_new_curve_GFp.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_new_from_ecparameters.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_new_from_ecpkparameters.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_new_from_params.3
-MLINKS+= EC_GROUP_copy.3 EC_GROUP_order_bits.3
-MLINKS+= EC_POINT_add.3 EC_GROUP_precompute_mult.3
-MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_asn1_flag.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_set_curve.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_set_curve_GF2m.3
MLINKS+= EC_GROUP_new.3 EC_GROUP_set_curve_GFp.3
-MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_curve_name.3
-MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_generator.3
-MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_point_conversion_form.3
-MLINKS+= EC_GROUP_copy.3 EC_GROUP_set_seed.3
+MLINKS+= EC_GROUP_new.3 EC_GROUP_to_params.3
+MLINKS+= EC_GROUP_new.3 EC_get_builtin_curves.3
+MLINKS+= EC_GROUP_new.3 OSSL_EC_curve_nid2name.3
+MLINKS+= EC_KEY_get_enc_flags.3 EC_KEY_set_enc_flags.3
MLINKS+= EC_KEY_new.3 EC_KEY_check_key.3
MLINKS+= EC_KEY_new.3 EC_KEY_clear_flags.3
MLINKS+= EC_KEY_new.3 EC_KEY_copy.3
@@ -1523,8 +1649,6 @@ MLINKS+= EC_KEY_new.3 EC_KEY_get0_group.3
MLINKS+= EC_KEY_new.3 EC_KEY_get0_private_key.3
MLINKS+= EC_KEY_new.3 EC_KEY_get0_public_key.3
MLINKS+= EC_KEY_new.3 EC_KEY_get_conv_form.3
-MLINKS+= BIO_get_ex_new_index.3 EC_KEY_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 EC_KEY_get_ex_new_index.3
MLINKS+= EC_KEY_new.3 EC_KEY_get_flags.3
MLINKS+= EC_KEY_new.3 EC_KEY_get_method.3
MLINKS+= EC_KEY_new.3 EC_KEY_key2buf.3
@@ -1538,8 +1662,6 @@ MLINKS+= EC_KEY_new.3 EC_KEY_priv2buf.3
MLINKS+= EC_KEY_new.3 EC_KEY_priv2oct.3
MLINKS+= EC_KEY_new.3 EC_KEY_set_asn1_flag.3
MLINKS+= EC_KEY_new.3 EC_KEY_set_conv_form.3
-MLINKS+= EC_KEY_get_enc_flags.3 EC_KEY_set_enc_flags.3
-MLINKS+= BIO_get_ex_new_index.3 EC_KEY_set_ex_data.3
MLINKS+= EC_KEY_new.3 EC_KEY_set_flags.3
MLINKS+= EC_KEY_new.3 EC_KEY_set_group.3
MLINKS+= EC_KEY_new.3 EC_KEY_set_method.3
@@ -1547,12 +1669,21 @@ MLINKS+= EC_KEY_new.3 EC_KEY_set_private_key.3
MLINKS+= EC_KEY_new.3 EC_KEY_set_public_key.3
MLINKS+= EC_KEY_new.3 EC_KEY_set_public_key_affine_coordinates.3
MLINKS+= EC_KEY_new.3 EC_KEY_up_ref.3
-MLINKS+= EC_GFp_simple_method.3 EC_METHOD_get_field_type.3
+MLINKS+= EC_KEY_new.3 EVP_EC_gen.3
+MLINKS+= EC_POINT_add.3 EC_GROUP_have_precompute_mult.3
+MLINKS+= EC_POINT_add.3 EC_GROUP_precompute_mult.3
+MLINKS+= EC_POINT_add.3 EC_POINT_cmp.3
+MLINKS+= EC_POINT_add.3 EC_POINT_dbl.3
+MLINKS+= EC_POINT_add.3 EC_POINT_invert.3
+MLINKS+= EC_POINT_add.3 EC_POINT_is_at_infinity.3
+MLINKS+= EC_POINT_add.3 EC_POINT_is_on_curve.3
+MLINKS+= EC_POINT_add.3 EC_POINT_make_affine.3
+MLINKS+= EC_POINT_add.3 EC_POINT_mul.3
+MLINKS+= EC_POINT_add.3 EC_POINTs_make_affine.3
+MLINKS+= EC_POINT_add.3 EC_POINTs_mul.3
MLINKS+= EC_POINT_new.3 EC_POINT_bn2point.3
MLINKS+= EC_POINT_new.3 EC_POINT_clear_free.3
-MLINKS+= EC_POINT_add.3 EC_POINT_cmp.3
MLINKS+= EC_POINT_new.3 EC_POINT_copy.3
-MLINKS+= EC_POINT_add.3 EC_POINT_dbl.3
MLINKS+= EC_POINT_new.3 EC_POINT_dup.3
MLINKS+= EC_POINT_new.3 EC_POINT_free.3
MLINKS+= EC_POINT_new.3 EC_POINT_get_Jprojective_coordinates_GFp.3
@@ -1560,12 +1691,7 @@ MLINKS+= EC_POINT_new.3 EC_POINT_get_affine_coordinates.3
MLINKS+= EC_POINT_new.3 EC_POINT_get_affine_coordinates_GF2m.3
MLINKS+= EC_POINT_new.3 EC_POINT_get_affine_coordinates_GFp.3
MLINKS+= EC_POINT_new.3 EC_POINT_hex2point.3
-MLINKS+= EC_POINT_add.3 EC_POINT_invert.3
-MLINKS+= EC_POINT_add.3 EC_POINT_is_at_infinity.3
-MLINKS+= EC_POINT_add.3 EC_POINT_is_on_curve.3
-MLINKS+= EC_POINT_add.3 EC_POINT_make_affine.3
MLINKS+= EC_POINT_new.3 EC_POINT_method_of.3
-MLINKS+= EC_POINT_add.3 EC_POINT_mul.3
MLINKS+= EC_POINT_new.3 EC_POINT_oct2point.3
MLINKS+= EC_POINT_new.3 EC_POINT_point2bn.3
MLINKS+= EC_POINT_new.3 EC_POINT_point2buf.3
@@ -1579,12 +1705,6 @@ MLINKS+= EC_POINT_new.3 EC_POINT_set_compressed_coordinates.3
MLINKS+= EC_POINT_new.3 EC_POINT_set_compressed_coordinates_GF2m.3
MLINKS+= EC_POINT_new.3 EC_POINT_set_compressed_coordinates_GFp.3
MLINKS+= EC_POINT_new.3 EC_POINT_set_to_infinity.3
-MLINKS+= EC_POINT_add.3 EC_POINTs_make_affine.3
-MLINKS+= EC_POINT_add.3 EC_POINTs_mul.3
-MLINKS+= EC_GROUP_new.3 EC_get_builtin_curves.3
-MLINKS+= X509_dup.3 EDIPARTYNAME_free.3
-MLINKS+= X509_dup.3 EDIPARTYNAME_new.3
-MLINKS+= OPENSSL_load_builtin_modules.3 ENGINE_add_conf_module.3
MLINKS+= ENGINE_add.3 ENGINE_by_id.3
MLINKS+= ENGINE_add.3 ENGINE_cleanup.3
MLINKS+= ENGINE_add.3 ENGINE_cmd_is_executable.3
@@ -1610,8 +1730,6 @@ MLINKS+= ENGINE_add.3 ENGINE_get_destroy_function.3
MLINKS+= ENGINE_add.3 ENGINE_get_digest.3
MLINKS+= ENGINE_add.3 ENGINE_get_digest_engine.3
MLINKS+= ENGINE_add.3 ENGINE_get_digests.3
-MLINKS+= BIO_get_ex_new_index.3 ENGINE_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 ENGINE_get_ex_new_index.3
MLINKS+= ENGINE_add.3 ENGINE_get_finish_function.3
MLINKS+= ENGINE_add.3 ENGINE_get_first.3
MLINKS+= ENGINE_add.3 ENGINE_get_flags.3
@@ -1661,7 +1779,6 @@ MLINKS+= ENGINE_add.3 ENGINE_set_default_digests.3
MLINKS+= ENGINE_add.3 ENGINE_set_default_string.3
MLINKS+= ENGINE_add.3 ENGINE_set_destroy_function.3
MLINKS+= ENGINE_add.3 ENGINE_set_digests.3
-MLINKS+= BIO_get_ex_new_index.3 ENGINE_set_ex_data.3
MLINKS+= ENGINE_add.3 ENGINE_set_finish_function.3
MLINKS+= ENGINE_add.3 ENGINE_set_flags.3
MLINKS+= ENGINE_add.3 ENGINE_set_id.3
@@ -1679,20 +1796,13 @@ MLINKS+= ENGINE_add.3 ENGINE_unregister_digests.3
MLINKS+= ENGINE_add.3 ENGINE_up_ref.3
MLINKS+= ERR_GET_LIB.3 ERR_FATAL_ERROR.3
MLINKS+= ERR_GET_LIB.3 ERR_GET_REASON.3
-MLINKS+= ERR_load_strings.3 ERR_PACK.3
-MLINKS+= ERR_put_error.3 ERR_add_error_data.3
-MLINKS+= ERR_put_error.3 ERR_add_error_mem_bio.3
-MLINKS+= ERR_put_error.3 ERR_add_error_txt.3
-MLINKS+= ERR_put_error.3 ERR_add_error_vdata.3
-MLINKS+= ERR_set_mark.3 ERR_clear_last_mark.3
MLINKS+= ERR_error_string.3 ERR_error_string_n.3
-MLINKS+= ERR_load_crypto_strings.3 ERR_free_strings.3
MLINKS+= ERR_error_string.3 ERR_func_error_string.3
+MLINKS+= ERR_error_string.3 ERR_lib_error_string.3
+MLINKS+= ERR_error_string.3 ERR_reason_error_string.3
MLINKS+= ERR_get_error.3 ERR_get_error_all.3
MLINKS+= ERR_get_error.3 ERR_get_error_line.3
MLINKS+= ERR_get_error.3 ERR_get_error_line_data.3
-MLINKS+= ERR_load_strings.3 ERR_get_next_error_library.3
-MLINKS+= ERR_error_string.3 ERR_lib_error_string.3
MLINKS+= ERR_get_error.3 ERR_peek_error.3
MLINKS+= ERR_get_error.3 ERR_peek_error_all.3
MLINKS+= ERR_get_error.3 ERR_peek_error_data.3
@@ -1705,33 +1815,26 @@ MLINKS+= ERR_get_error.3 ERR_peek_last_error_data.3
MLINKS+= ERR_get_error.3 ERR_peek_last_error_func.3
MLINKS+= ERR_get_error.3 ERR_peek_last_error_line.3
MLINKS+= ERR_get_error.3 ERR_peek_last_error_line_data.3
-MLINKS+= ERR_set_mark.3 ERR_pop_to_mark.3
+MLINKS+= ERR_load_crypto_strings.3 ERR_free_strings.3
+MLINKS+= ERR_load_crypto_strings.3 SSL_load_error_strings.3
+MLINKS+= ERR_load_strings.3 ERR_PACK.3
+MLINKS+= ERR_load_strings.3 ERR_get_next_error_library.3
+MLINKS+= ERR_new.3 ERR_set_debug.3
+MLINKS+= ERR_new.3 ERR_set_error.3
+MLINKS+= ERR_new.3 ERR_vset_error.3
MLINKS+= ERR_print_errors.3 ERR_print_errors_cb.3
MLINKS+= ERR_print_errors.3 ERR_print_errors_fp.3
+MLINKS+= ERR_put_error.3 ERR_add_error_data.3
+MLINKS+= ERR_put_error.3 ERR_add_error_mem_bio.3
+MLINKS+= ERR_put_error.3 ERR_add_error_txt.3
+MLINKS+= ERR_put_error.3 ERR_add_error_vdata.3
MLINKS+= ERR_put_error.3 ERR_raise.3
MLINKS+= ERR_put_error.3 ERR_raise_data.3
-MLINKS+= ERR_error_string.3 ERR_reason_error_string.3
MLINKS+= ERR_remove_state.3 ERR_remove_thread_state.3
-MLINKS+= ERR_new.3 ERR_set_debug.3
-MLINKS+= ERR_new.3 ERR_set_error.3
-MLINKS+= ERR_new.3 ERR_vset_error.3
-MLINKS+= X509_dup.3 ESS_CERT_ID_V2_dup.3
-MLINKS+= X509_dup.3 ESS_CERT_ID_V2_free.3
-MLINKS+= X509_dup.3 ESS_CERT_ID_V2_new.3
-MLINKS+= X509_dup.3 ESS_CERT_ID_dup.3
-MLINKS+= X509_dup.3 ESS_CERT_ID_free.3
-MLINKS+= X509_dup.3 ESS_CERT_ID_new.3
-MLINKS+= X509_dup.3 ESS_ISSUER_SERIAL_dup.3
-MLINKS+= X509_dup.3 ESS_ISSUER_SERIAL_free.3
-MLINKS+= X509_dup.3 ESS_ISSUER_SERIAL_new.3
-MLINKS+= X509_dup.3 ESS_SIGNING_CERT_V2_dup.3
-MLINKS+= X509_dup.3 ESS_SIGNING_CERT_V2_free.3
-MLINKS+= X509_dup.3 ESS_SIGNING_CERT_V2_it.3
-MLINKS+= X509_dup.3 ESS_SIGNING_CERT_V2_new.3
-MLINKS+= X509_dup.3 ESS_SIGNING_CERT_dup.3
-MLINKS+= X509_dup.3 ESS_SIGNING_CERT_free.3
-MLINKS+= X509_dup.3 ESS_SIGNING_CERT_it.3
-MLINKS+= X509_dup.3 ESS_SIGNING_CERT_new.3
+MLINKS+= ERR_set_mark.3 ERR_clear_last_mark.3
+MLINKS+= ERR_set_mark.3 ERR_count_to_mark.3
+MLINKS+= ERR_set_mark.3 ERR_pop.3
+MLINKS+= ERR_set_mark.3 ERR_pop_to_mark.3
MLINKS+= EVP_ASYM_CIPHER_free.3 EVP_ASYM_CIPHER_do_all_provided.3
MLINKS+= EVP_ASYM_CIPHER_free.3 EVP_ASYM_CIPHER_fetch.3
MLINKS+= EVP_ASYM_CIPHER_free.3 EVP_ASYM_CIPHER_get0_description.3
@@ -1742,10 +1845,124 @@ MLINKS+= EVP_ASYM_CIPHER_free.3 EVP_ASYM_CIPHER_is_a.3
MLINKS+= EVP_ASYM_CIPHER_free.3 EVP_ASYM_CIPHER_names_do_all.3
MLINKS+= EVP_ASYM_CIPHER_free.3 EVP_ASYM_CIPHER_settable_ctx_params.3
MLINKS+= EVP_ASYM_CIPHER_free.3 EVP_ASYM_CIPHER_up_ref.3
+MLINKS+= EVP_CIPHER_CTX_get_cipher_data.3 EVP_CIPHER_CTX_set_cipher_data.3
+MLINKS+= EVP_CIPHER_CTX_get_original_iv.3 EVP_CIPHER_CTX_get_updated_iv.3
+MLINKS+= EVP_CIPHER_CTX_get_original_iv.3 EVP_CIPHER_CTX_iv.3
+MLINKS+= EVP_CIPHER_CTX_get_original_iv.3 EVP_CIPHER_CTX_iv_noconst.3
+MLINKS+= EVP_CIPHER_CTX_get_original_iv.3 EVP_CIPHER_CTX_original_iv.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_dup.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_free.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_cleanup.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_ctrl.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_do_cipher.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_get_asn1_params.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_init.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_set_asn1_params.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_cleanup.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_ctrl.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_do_cipher.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_flags.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_get_asn1_params.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_impl_ctx_size.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_init.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_iv_length.3
+MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_set_asn1_params.3
+MLINKS+= EVP_DigestInit.3 EVP_Digest.3
+MLINKS+= EVP_DigestInit.3 EVP_DigestFinal.3
+MLINKS+= EVP_DigestInit.3 EVP_DigestFinalXOF.3
+MLINKS+= EVP_DigestInit.3 EVP_DigestFinal_ex.3
+MLINKS+= EVP_DigestInit.3 EVP_DigestInit_ex.3
+MLINKS+= EVP_DigestInit.3 EVP_DigestInit_ex2.3
+MLINKS+= EVP_DigestInit.3 EVP_DigestSqueeze.3
+MLINKS+= EVP_DigestInit.3 EVP_DigestUpdate.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_block_size.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_clear_flags.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_copy.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_copy_ex.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_ctrl.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_dup.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_free.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get0_md.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get0_md_data.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get0_name.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get1_md.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_block_size.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_params.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_pkey_ctx.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_size.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_size_ex.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_type.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_gettable_params.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_md.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_md_data.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_new.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_pkey_ctx.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_reset.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_set_flags.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_set_params.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_set_pkey_ctx.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_set_update_fn.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_settable_params.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_size.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_test_flags.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_type.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_update_fn.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_block_size.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_do_all_provided.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_fetch.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_flags.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_free.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get0_description.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get0_name.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get0_provider.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get_block_size.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get_flags.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get_params.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get_pkey_type.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get_size.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_get_type.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_gettable_ctx_params.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_gettable_params.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_is_a.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_name.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_names_do_all.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_nid.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_pkey_type.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_settable_ctx_params.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_size.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_type.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_up_ref.3
+MLINKS+= EVP_DigestInit.3 EVP_MD_xof.3
+MLINKS+= EVP_DigestInit.3 EVP_Q_digest.3
+MLINKS+= EVP_DigestInit.3 EVP_get_digestbyname.3
+MLINKS+= EVP_DigestInit.3 EVP_get_digestbynid.3
+MLINKS+= EVP_DigestInit.3 EVP_get_digestbyobj.3
+MLINKS+= EVP_DigestInit.3 EVP_md_null.3
+MLINKS+= EVP_DigestSignInit.3 EVP_DigestSign.3
+MLINKS+= EVP_DigestSignInit.3 EVP_DigestSignFinal.3
+MLINKS+= EVP_DigestSignInit.3 EVP_DigestSignInit_ex.3
+MLINKS+= EVP_DigestSignInit.3 EVP_DigestSignUpdate.3
+MLINKS+= EVP_DigestVerifyInit.3 EVP_DigestVerify.3
+MLINKS+= EVP_DigestVerifyInit.3 EVP_DigestVerifyFinal.3
+MLINKS+= EVP_DigestVerifyInit.3 EVP_DigestVerifyInit_ex.3
+MLINKS+= EVP_DigestVerifyInit.3 EVP_DigestVerifyUpdate.3
+MLINKS+= EVP_EncodeInit.3 EVP_DecodeBlock.3
+MLINKS+= EVP_EncodeInit.3 EVP_DecodeFinal.3
+MLINKS+= EVP_EncodeInit.3 EVP_DecodeInit.3
+MLINKS+= EVP_EncodeInit.3 EVP_DecodeUpdate.3
+MLINKS+= EVP_EncodeInit.3 EVP_ENCODE_CTX_copy.3
+MLINKS+= EVP_EncodeInit.3 EVP_ENCODE_CTX_free.3
+MLINKS+= EVP_EncodeInit.3 EVP_ENCODE_CTX_new.3
+MLINKS+= EVP_EncodeInit.3 EVP_ENCODE_CTX_num.3
+MLINKS+= EVP_EncodeInit.3 EVP_EncodeBlock.3
+MLINKS+= EVP_EncodeInit.3 EVP_EncodeFinal.3
+MLINKS+= EVP_EncodeInit.3 EVP_EncodeUpdate.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_block_size.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_cipher.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_clear_flags.3
+MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_copy.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_ctrl.3
+MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_dup.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_encrypting.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_flags.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_free.3
@@ -1762,21 +1979,16 @@ MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_get_num.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_get_params.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_get_tag_length.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_get_type.3
-MLINKS+= EVP_CIPHER_CTX_get_original_iv.3 EVP_CIPHER_CTX_get_updated_iv.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_gettable_params.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_is_encrypting.3
-MLINKS+= EVP_CIPHER_CTX_get_original_iv.3 EVP_CIPHER_CTX_iv.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_iv_length.3
-MLINKS+= EVP_CIPHER_CTX_get_original_iv.3 EVP_CIPHER_CTX_iv_noconst.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_key_length.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_mode.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_new.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_nid.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_num.3
-MLINKS+= EVP_CIPHER_CTX_get_original_iv.3 EVP_CIPHER_CTX_original_iv.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_reset.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_set_app_data.3
-MLINKS+= EVP_CIPHER_CTX_get_cipher_data.3 EVP_CIPHER_CTX_set_cipher_data.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_set_flags.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_set_key_length.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_set_num.3
@@ -1788,6 +2000,7 @@ MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_test_flags.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_CTX_type.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_asn1_to_param.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_block_size.3
+MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_can_pipeline.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_do_all_provided.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_fetch.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_flags.3
@@ -1808,23 +2021,6 @@ MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_gettable_params.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_is_a.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_iv_length.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_key_length.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_dup.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_free.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_cleanup.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_ctrl.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_do_cipher.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_get_asn1_params.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_init.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_get_set_asn1_params.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_cleanup.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_ctrl.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_do_cipher.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_flags.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_get_asn1_params.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_impl_ctx_size.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_init.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_iv_length.3
-MLINKS+= EVP_CIPHER_meth_new.3 EVP_CIPHER_meth_set_set_asn1_params.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_mode.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_name.3
MLINKS+= EVP_EncryptInit.3 EVP_CIPHER_names_do_all.3
@@ -1837,47 +2033,29 @@ MLINKS+= EVP_EncryptInit.3 EVP_Cipher.3
MLINKS+= EVP_EncryptInit.3 EVP_CipherFinal.3
MLINKS+= EVP_EncryptInit.3 EVP_CipherFinal_ex.3
MLINKS+= EVP_EncryptInit.3 EVP_CipherInit.3
+MLINKS+= EVP_EncryptInit.3 EVP_CipherInit_SKEY.3
MLINKS+= EVP_EncryptInit.3 EVP_CipherInit_ex.3
MLINKS+= EVP_EncryptInit.3 EVP_CipherInit_ex2.3
+MLINKS+= EVP_EncryptInit.3 EVP_CipherPipelineDecryptInit.3
+MLINKS+= EVP_EncryptInit.3 EVP_CipherPipelineEncryptInit.3
+MLINKS+= EVP_EncryptInit.3 EVP_CipherPipelineFinal.3
+MLINKS+= EVP_EncryptInit.3 EVP_CipherPipelineUpdate.3
MLINKS+= EVP_EncryptInit.3 EVP_CipherUpdate.3
-MLINKS+= EVP_EncodeInit.3 EVP_DecodeBlock.3
-MLINKS+= EVP_EncodeInit.3 EVP_DecodeFinal.3
-MLINKS+= EVP_EncodeInit.3 EVP_DecodeInit.3
-MLINKS+= EVP_EncodeInit.3 EVP_DecodeUpdate.3
MLINKS+= EVP_EncryptInit.3 EVP_DecryptFinal.3
MLINKS+= EVP_EncryptInit.3 EVP_DecryptFinal_ex.3
MLINKS+= EVP_EncryptInit.3 EVP_DecryptInit.3
MLINKS+= EVP_EncryptInit.3 EVP_DecryptInit_ex.3
MLINKS+= EVP_EncryptInit.3 EVP_DecryptInit_ex2.3
MLINKS+= EVP_EncryptInit.3 EVP_DecryptUpdate.3
-MLINKS+= EVP_DigestInit.3 EVP_Digest.3
-MLINKS+= EVP_DigestInit.3 EVP_DigestFinal.3
-MLINKS+= EVP_DigestInit.3 EVP_DigestFinalXOF.3
-MLINKS+= EVP_DigestInit.3 EVP_DigestFinal_ex.3
-MLINKS+= EVP_DigestInit.3 EVP_DigestInit_ex.3
-MLINKS+= EVP_DigestInit.3 EVP_DigestInit_ex2.3
-MLINKS+= EVP_DigestSignInit.3 EVP_DigestSign.3
-MLINKS+= EVP_DigestSignInit.3 EVP_DigestSignFinal.3
-MLINKS+= EVP_DigestSignInit.3 EVP_DigestSignInit_ex.3
-MLINKS+= EVP_DigestSignInit.3 EVP_DigestSignUpdate.3
-MLINKS+= EVP_DigestInit.3 EVP_DigestUpdate.3
-MLINKS+= EVP_DigestVerifyInit.3 EVP_DigestVerify.3
-MLINKS+= EVP_DigestVerifyInit.3 EVP_DigestVerifyFinal.3
-MLINKS+= EVP_DigestVerifyInit.3 EVP_DigestVerifyInit_ex.3
-MLINKS+= EVP_DigestVerifyInit.3 EVP_DigestVerifyUpdate.3
-MLINKS+= EC_KEY_new.3 EVP_EC_gen.3
-MLINKS+= EVP_EncodeInit.3 EVP_ENCODE_CTX_copy.3
-MLINKS+= EVP_EncodeInit.3 EVP_ENCODE_CTX_free.3
-MLINKS+= EVP_EncodeInit.3 EVP_ENCODE_CTX_new.3
-MLINKS+= EVP_EncodeInit.3 EVP_ENCODE_CTX_num.3
-MLINKS+= EVP_EncodeInit.3 EVP_EncodeBlock.3
-MLINKS+= EVP_EncodeInit.3 EVP_EncodeFinal.3
-MLINKS+= EVP_EncodeInit.3 EVP_EncodeUpdate.3
MLINKS+= EVP_EncryptInit.3 EVP_EncryptFinal.3
MLINKS+= EVP_EncryptInit.3 EVP_EncryptFinal_ex.3
MLINKS+= EVP_EncryptInit.3 EVP_EncryptInit_ex.3
MLINKS+= EVP_EncryptInit.3 EVP_EncryptInit_ex2.3
MLINKS+= EVP_EncryptInit.3 EVP_EncryptUpdate.3
+MLINKS+= EVP_EncryptInit.3 EVP_enc_null.3
+MLINKS+= EVP_EncryptInit.3 EVP_get_cipherbyname.3
+MLINKS+= EVP_EncryptInit.3 EVP_get_cipherbynid.3
+MLINKS+= EVP_EncryptInit.3 EVP_get_cipherbyobj.3
MLINKS+= EVP_KDF.3 EVP_KDF_CTX.3
MLINKS+= EVP_KDF.3 EVP_KDF_CTX_dup.3
MLINKS+= EVP_KDF.3 EVP_KDF_CTX_free.3
@@ -1926,6 +2104,7 @@ MLINKS+= EVP_KEYEXCH_free.3 EVP_KEYEXCH_up_ref.3
MLINKS+= EVP_KEYMGMT.3 EVP_KEYMGMT_do_all_provided.3
MLINKS+= EVP_KEYMGMT.3 EVP_KEYMGMT_fetch.3
MLINKS+= EVP_KEYMGMT.3 EVP_KEYMGMT_free.3
+MLINKS+= EVP_KEYMGMT.3 EVP_KEYMGMT_gen_gettable_params.3
MLINKS+= EVP_KEYMGMT.3 EVP_KEYMGMT_gen_settable_params.3
MLINKS+= EVP_KEYMGMT.3 EVP_KEYMGMT_get0_description.3
MLINKS+= EVP_KEYMGMT.3 EVP_KEYMGMT_get0_name.3
@@ -1958,58 +2137,13 @@ MLINKS+= EVP_MAC.3 EVP_MAC_get_params.3
MLINKS+= EVP_MAC.3 EVP_MAC_gettable_ctx_params.3
MLINKS+= EVP_MAC.3 EVP_MAC_gettable_params.3
MLINKS+= EVP_MAC.3 EVP_MAC_init.3
+MLINKS+= EVP_MAC.3 EVP_MAC_init_SKEY.3
MLINKS+= EVP_MAC.3 EVP_MAC_is_a.3
MLINKS+= EVP_MAC.3 EVP_MAC_names_do_all.3
MLINKS+= EVP_MAC.3 EVP_MAC_settable_ctx_params.3
MLINKS+= EVP_MAC.3 EVP_MAC_up_ref.3
MLINKS+= EVP_MAC.3 EVP_MAC_update.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_block_size.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_clear_flags.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_copy.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_copy_ex.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_ctrl.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_free.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get0_md.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get0_md_data.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get0_name.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get1_md.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_block_size.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_params.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_pkey_ctx.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_size.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_get_type.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_gettable_params.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_md.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_md_data.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_new.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_pkey_ctx.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_reset.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_set_flags.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_set_params.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_set_pkey_ctx.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_set_update_fn.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_settable_params.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_size.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_test_flags.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_type.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_CTX_update_fn.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_block_size.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_do_all_provided.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_fetch.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_flags.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_free.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get0_description.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get0_name.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get0_provider.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get_block_size.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get_flags.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get_params.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get_pkey_type.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get_size.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_get_type.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_gettable_ctx_params.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_gettable_params.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_is_a.3
+MLINKS+= EVP_MAC.3 EVP_Q_mac.3
MLINKS+= EVP_MD_meth_new.3 EVP_MD_meth_dup.3
MLINKS+= EVP_MD_meth_new.3 EVP_MD_meth_free.3
MLINKS+= EVP_MD_meth_new.3 EVP_MD_meth_get_app_datasize.3
@@ -2032,14 +2166,6 @@ MLINKS+= EVP_MD_meth_new.3 EVP_MD_meth_set_init.3
MLINKS+= EVP_MD_meth_new.3 EVP_MD_meth_set_input_blocksize.3
MLINKS+= EVP_MD_meth_new.3 EVP_MD_meth_set_result_size.3
MLINKS+= EVP_MD_meth_new.3 EVP_MD_meth_set_update.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_name.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_names_do_all.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_nid.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_pkey_type.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_settable_ctx_params.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_size.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_type.3
-MLINKS+= EVP_DigestInit.3 EVP_MD_up_ref.3
MLINKS+= EVP_OpenInit.3 EVP_OpenFinal.3
MLINKS+= EVP_OpenInit.3 EVP_OpenUpdate.3
MLINKS+= EVP_PBE_CipherInit.3 EVP_PBE_CipherInit_ex.3
@@ -2047,28 +2173,37 @@ MLINKS+= EVP_PBE_CipherInit.3 EVP_PBE_alg_add.3
MLINKS+= EVP_PBE_CipherInit.3 EVP_PBE_alg_add_type.3
MLINKS+= EVP_PBE_CipherInit.3 EVP_PBE_find.3
MLINKS+= EVP_PBE_CipherInit.3 EVP_PBE_find_ex.3
-MLINKS+= PKCS5_PBE_keyivgen.3 EVP_PBE_scrypt.3
-MLINKS+= PKCS5_PBE_keyivgen.3 EVP_PBE_scrypt_ex.3
MLINKS+= EVP_PKEY2PKCS8.3 EVP_PKCS82PKEY.3
MLINKS+= EVP_PKEY2PKCS8.3 EVP_PKCS82PKEY_ex.3
-MLINKS+= EVP_PKEY_new.3 EVP_PKEY.3
-MLINKS+= EVP_PKEY_CTX_set_hkdf_md.3 EVP_PKEY_CTX_add1_hkdf_info.3
-MLINKS+= EVP_PKEY_CTX_set_tls1_prf_md.3 EVP_PKEY_CTX_add1_tls1_prf_seed.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_add0.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_add_alias.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_copy.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_free.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_new.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_check.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_ctrl.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_free.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_get_priv_key.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_get_pub_key.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_item.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_param.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_param_check.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_private.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_public.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_public_check.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_security_bits.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_set_priv_key.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_set_pub_key.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_siginf.3
+MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_get0_asn1.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_ctrl_str.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_ctrl_uint64.3
-MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_dup.3
-MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_free.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get0_dh_kdf_oid.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get0_dh_kdf_ukm.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get0_ecdh_kdf_ukm.3
-MLINKS+= EVP_PKEY_CTX_get0_pkey.3 EVP_PKEY_CTX_get0_peerkey.3
-MLINKS+= EVP_PKEY_CTX_get0_libctx.3 EVP_PKEY_CTX_get0_propq.3
-MLINKS+= EVP_PKEY_CTX_get0_libctx.3 EVP_PKEY_CTX_get0_provider.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get0_rsa_oaep_label.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get1_id.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get1_id_len.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_get_app_data.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_get_cb.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_dh_kdf_md.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_dh_kdf_outlen.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_dh_kdf_type.3
@@ -2077,8 +2212,6 @@ MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_ecdh_kdf_md.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_ecdh_kdf_outlen.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_ecdh_kdf_type.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_group_name.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_get_keygen_info.3
-MLINKS+= EVP_PKEY_CTX_set_params.3 EVP_PKEY_CTX_get_params.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_rsa_mgf1_md.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_rsa_mgf1_md_name.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_rsa_oaep_md.3
@@ -2086,24 +2219,13 @@ MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_rsa_oaep_md_name.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_rsa_padding.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_rsa_pss_saltlen.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_get_signature_md.3
-MLINKS+= EVP_PKEY_CTX_set_params.3 EVP_PKEY_CTX_gettable_params.3
-MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_is_a.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_md.3
-MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_new_from_name.3
-MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_new_from_pkey.3
-MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_new_id.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set0_dh_kdf_oid.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set0_dh_kdf_ukm.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set0_ecdh_kdf_ukm.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set0_rsa_oaep_label.3
-MLINKS+= EVP_PKEY_CTX_set_hkdf_md.3 EVP_PKEY_CTX_set1_hkdf_key.3
-MLINKS+= EVP_PKEY_CTX_set_hkdf_md.3 EVP_PKEY_CTX_set1_hkdf_salt.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set1_id.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set1_rsa_keygen_pubexp.3
-MLINKS+= EVP_PKEY_CTX_set_scrypt_N.3 EVP_PKEY_CTX_set1_scrypt_salt.3
-MLINKS+= EVP_PKEY_CTX_set_tls1_prf_md.3 EVP_PKEY_CTX_set1_tls1_prf_secret.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_set_app_data.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_set_cb.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_dh_kdf_md.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_dh_kdf_outlen.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_dh_kdf_type.3
@@ -2131,7 +2253,6 @@ MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_ecdh_kdf_md.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_ecdh_kdf_outlen.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_ecdh_kdf_type.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_group_name.3
-MLINKS+= EVP_PKEY_CTX_set_hkdf_md.3 EVP_PKEY_CTX_set_hkdf_mode.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_kem_op.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_mac_key.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_rsa_keygen_bits.3
@@ -2142,53 +2263,55 @@ MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_rsa_mgf1_md_name.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_rsa_oaep_md.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_rsa_oaep_md_name.3
MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_rsa_padding.3
+MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_rsa_pss_saltlen.3
+MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_signature_md.3
+MLINKS+= EVP_PKEY_CTX_get0_libctx.3 EVP_PKEY_CTX_get0_propq.3
+MLINKS+= EVP_PKEY_CTX_get0_libctx.3 EVP_PKEY_CTX_get0_provider.3
+MLINKS+= EVP_PKEY_CTX_get0_pkey.3 EVP_PKEY_CTX_get0_peerkey.3
+MLINKS+= EVP_PKEY_CTX_get_algor.3 EVP_CIPHER_CTX_get_algor.3
+MLINKS+= EVP_PKEY_CTX_get_algor.3 EVP_CIPHER_CTX_get_algor_params.3
+MLINKS+= EVP_PKEY_CTX_get_algor.3 EVP_CIPHER_CTX_set_algor_params.3
+MLINKS+= EVP_PKEY_CTX_get_algor.3 EVP_PKEY_CTX_get_algor_params.3
+MLINKS+= EVP_PKEY_CTX_get_algor.3 EVP_PKEY_CTX_set_algor_params.3
+MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_dup.3
+MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_free.3
+MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_is_a.3
+MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_new_from_name.3
+MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_new_from_pkey.3
+MLINKS+= EVP_PKEY_CTX_new.3 EVP_PKEY_CTX_new_id.3
+MLINKS+= EVP_PKEY_CTX_set_hkdf_md.3 EVP_PKEY_CTX_add1_hkdf_info.3
+MLINKS+= EVP_PKEY_CTX_set_hkdf_md.3 EVP_PKEY_CTX_set1_hkdf_key.3
+MLINKS+= EVP_PKEY_CTX_set_hkdf_md.3 EVP_PKEY_CTX_set1_hkdf_salt.3
+MLINKS+= EVP_PKEY_CTX_set_hkdf_md.3 EVP_PKEY_CTX_set_hkdf_mode.3
+MLINKS+= EVP_PKEY_CTX_set_params.3 EVP_PKEY_CTX_get_params.3
+MLINKS+= EVP_PKEY_CTX_set_params.3 EVP_PKEY_CTX_gettable_params.3
+MLINKS+= EVP_PKEY_CTX_set_params.3 EVP_PKEY_CTX_settable_params.3
MLINKS+= EVP_PKEY_CTX_set_rsa_pss_keygen_md.3 EVP_PKEY_CTX_set_rsa_pss_keygen_md_name.3
MLINKS+= EVP_PKEY_CTX_set_rsa_pss_keygen_md.3 EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md.3
MLINKS+= EVP_PKEY_CTX_set_rsa_pss_keygen_md.3 EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md_name.3
MLINKS+= EVP_PKEY_CTX_set_rsa_pss_keygen_md.3 EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen.3
-MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_rsa_pss_saltlen.3
+MLINKS+= EVP_PKEY_CTX_set_scrypt_N.3 EVP_PKEY_CTX_set1_scrypt_salt.3
MLINKS+= EVP_PKEY_CTX_set_scrypt_N.3 EVP_PKEY_CTX_set_scrypt_maxmem_bytes.3
MLINKS+= EVP_PKEY_CTX_set_scrypt_N.3 EVP_PKEY_CTX_set_scrypt_p.3
MLINKS+= EVP_PKEY_CTX_set_scrypt_N.3 EVP_PKEY_CTX_set_scrypt_r.3
-MLINKS+= EVP_PKEY_CTX_ctrl.3 EVP_PKEY_CTX_set_signature_md.3
-MLINKS+= EVP_PKEY_CTX_set_params.3 EVP_PKEY_CTX_settable_params.3
-MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_METHOD.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_Q_keygen.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_add0.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_add_alias.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_copy.3
+MLINKS+= EVP_PKEY_CTX_set_tls1_prf_md.3 EVP_PKEY_CTX_add1_tls1_prf_seed.3
+MLINKS+= EVP_PKEY_CTX_set_tls1_prf_md.3 EVP_PKEY_CTX_set1_tls1_prf_secret.3
MLINKS+= EVP_PKEY_asn1_get_count.3 EVP_PKEY_asn1_find.3
MLINKS+= EVP_PKEY_asn1_get_count.3 EVP_PKEY_asn1_find_str.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_free.3
MLINKS+= EVP_PKEY_asn1_get_count.3 EVP_PKEY_asn1_get0.3
MLINKS+= EVP_PKEY_asn1_get_count.3 EVP_PKEY_asn1_get0_info.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_new.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_check.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_ctrl.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_free.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_get_priv_key.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_get_pub_key.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_item.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_param.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_param_check.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_private.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_public.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_public_check.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_security_bits.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_set_priv_key.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_set_pub_key.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_asn1_set_siginf.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_DH.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_DSA.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_EC_KEY.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_POLY1305.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_RSA.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_SIPHASH.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_base_id.3
-MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_bits.3
-MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_can_sign.3
+MLINKS+= EVP_PKEY_check.3 EVP_PKEY_pairwise_check.3
+MLINKS+= EVP_PKEY_check.3 EVP_PKEY_param_check.3
+MLINKS+= EVP_PKEY_check.3 EVP_PKEY_param_check_quick.3
+MLINKS+= EVP_PKEY_check.3 EVP_PKEY_private_check.3
+MLINKS+= EVP_PKEY_check.3 EVP_PKEY_public_check.3
+MLINKS+= EVP_PKEY_check.3 EVP_PKEY_public_check_quick.3
MLINKS+= EVP_PKEY_copy_parameters.3 EVP_PKEY_cmp.3
MLINKS+= EVP_PKEY_copy_parameters.3 EVP_PKEY_cmp_parameters.3
+MLINKS+= EVP_PKEY_copy_parameters.3 EVP_PKEY_eq.3
+MLINKS+= EVP_PKEY_copy_parameters.3 EVP_PKEY_missing_parameters.3
+MLINKS+= EVP_PKEY_copy_parameters.3 EVP_PKEY_parameters_eq.3
+MLINKS+= EVP_PKEY_decapsulate.3 EVP_PKEY_auth_decapsulate_init.3
MLINKS+= EVP_PKEY_decapsulate.3 EVP_PKEY_decapsulate_init.3
MLINKS+= EVP_PKEY_decrypt.3 EVP_PKEY_decrypt_init.3
MLINKS+= EVP_PKEY_decrypt.3 EVP_PKEY_decrypt_init_ex.3
@@ -2196,60 +2319,56 @@ MLINKS+= EVP_PKEY_derive.3 EVP_PKEY_derive_init.3
MLINKS+= EVP_PKEY_derive.3 EVP_PKEY_derive_init_ex.3
MLINKS+= EVP_PKEY_derive.3 EVP_PKEY_derive_set_peer.3
MLINKS+= EVP_PKEY_derive.3 EVP_PKEY_derive_set_peer_ex.3
-MLINKS+= EVP_PKEY_new.3 EVP_PKEY_dup.3
+MLINKS+= EVP_PKEY_encapsulate.3 EVP_PKEY_auth_encapsulate_init.3
MLINKS+= EVP_PKEY_encapsulate.3 EVP_PKEY_encapsulate_init.3
MLINKS+= EVP_PKEY_encrypt.3 EVP_PKEY_encrypt_init.3
MLINKS+= EVP_PKEY_encrypt.3 EVP_PKEY_encrypt_init_ex.3
-MLINKS+= EVP_PKEY_copy_parameters.3 EVP_PKEY_eq.3
-MLINKS+= EVP_PKEY_todata.3 EVP_PKEY_export.3
-MLINKS+= EVP_PKEY_new.3 EVP_PKEY_free.3
MLINKS+= EVP_PKEY_fromdata.3 EVP_PKEY_fromdata_init.3
MLINKS+= EVP_PKEY_fromdata.3 EVP_PKEY_fromdata_settable.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_gen_cb.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_generate.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_DH.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_DSA.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_EC_KEY.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_RSA.3
-MLINKS+= EVP_PKEY_ASN1_METHOD.3 EVP_PKEY_get0_asn1.3
-MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_get0_description.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_engine.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_hmac.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_poly1305.3
-MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_get0_provider.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_siphash.3
-MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_get0_type_name.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get1_DH.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get1_DSA.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get1_EC_KEY.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get1_RSA.3
-MLINKS+= EVP_PKEY_set1_encoded_public_key.3 EVP_PKEY_get1_encoded_public_key.3
-MLINKS+= EVP_PKEY_set1_encoded_public_key.3 EVP_PKEY_get1_tls_encodedpoint.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get_base_id.3
-MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_get_bits.3
-MLINKS+= EVP_PKEY_gettable_params.3 EVP_PKEY_get_bn_param.3
+MLINKS+= EVP_PKEY_get_attr.3 EVP_PKEY_add1_attr.3
+MLINKS+= EVP_PKEY_get_attr.3 EVP_PKEY_add1_attr_by_NID.3
+MLINKS+= EVP_PKEY_get_attr.3 EVP_PKEY_add1_attr_by_OBJ.3
+MLINKS+= EVP_PKEY_get_attr.3 EVP_PKEY_add1_attr_by_txt.3
+MLINKS+= EVP_PKEY_get_attr.3 EVP_PKEY_delete_attr.3
+MLINKS+= EVP_PKEY_get_attr.3 EVP_PKEY_get_attr_by_NID.3
+MLINKS+= EVP_PKEY_get_attr.3 EVP_PKEY_get_attr_by_OBJ.3
+MLINKS+= EVP_PKEY_get_attr.3 EVP_PKEY_get_attr_count.3
MLINKS+= EVP_PKEY_get_default_digest_nid.3 EVP_PKEY_get_default_digest_name.3
MLINKS+= EVP_PKEY_get_field_type.3 EVP_PKEY_get_ec_point_conv_form.3
-MLINKS+= BIO_get_ex_new_index.3 EVP_PKEY_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 EVP_PKEY_get_ex_new_index.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get_id.3
+MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_bits.3
+MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_get_bits.3
+MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_get_security_bits.3
+MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_security_bits.3
+MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_size.3
+MLINKS+= EVP_PKEY_gettable_params.3 EVP_PKEY_get_bn_param.3
MLINKS+= EVP_PKEY_gettable_params.3 EVP_PKEY_get_int_param.3
MLINKS+= EVP_PKEY_gettable_params.3 EVP_PKEY_get_octet_string_param.3
MLINKS+= EVP_PKEY_gettable_params.3 EVP_PKEY_get_params.3
-MLINKS+= EVP_PKEY_new.3 EVP_PKEY_get_raw_private_key.3
-MLINKS+= EVP_PKEY_new.3 EVP_PKEY_get_raw_public_key.3
-MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_get_security_bits.3
MLINKS+= EVP_PKEY_gettable_params.3 EVP_PKEY_get_size_t_param.3
MLINKS+= EVP_PKEY_gettable_params.3 EVP_PKEY_get_utf8_string_param.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_id.3
+MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_can_sign.3
+MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_get0_description.3
+MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_get0_provider.3
+MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_get0_type_name.3
+MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_type_names_do_all.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_get_app_data.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_get_cb.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_get_keygen_info.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_set_app_data.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_CTX_set_cb.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_Q_keygen.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_gen_cb.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_generate.3
MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_keygen_init.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_paramgen.3
+MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_paramgen_init.3
+MLINKS+= EVP_PKEY_meth_get_count.3 EVP_PKEY_meth_get0.3
+MLINKS+= EVP_PKEY_meth_get_count.3 EVP_PKEY_meth_get0_info.3
+MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_METHOD.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_add0.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_copy.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_find.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_free.3
-MLINKS+= EVP_PKEY_meth_get_count.3 EVP_PKEY_meth_get0.3
-MLINKS+= EVP_PKEY_meth_get_count.3 EVP_PKEY_meth_get0_info.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_get_check.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_get_cleanup.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_get_copy.3
@@ -2291,54 +2410,79 @@ MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_set_signctx.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_set_verify.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_set_verify_recover.3
MLINKS+= EVP_PKEY_meth_new.3 EVP_PKEY_meth_set_verifyctx.3
-MLINKS+= EVP_PKEY_copy_parameters.3 EVP_PKEY_missing_parameters.3
+MLINKS+= EVP_PKEY_new.3 EVP_PKEY.3
+MLINKS+= EVP_PKEY_new.3 EVP_PKEY_dup.3
+MLINKS+= EVP_PKEY_new.3 EVP_PKEY_free.3
+MLINKS+= EVP_PKEY_new.3 EVP_PKEY_get_raw_private_key.3
+MLINKS+= EVP_PKEY_new.3 EVP_PKEY_get_raw_public_key.3
MLINKS+= EVP_PKEY_new.3 EVP_PKEY_new_CMAC_key.3
MLINKS+= EVP_PKEY_new.3 EVP_PKEY_new_mac_key.3
MLINKS+= EVP_PKEY_new.3 EVP_PKEY_new_raw_private_key.3
MLINKS+= EVP_PKEY_new.3 EVP_PKEY_new_raw_private_key_ex.3
MLINKS+= EVP_PKEY_new.3 EVP_PKEY_new_raw_public_key.3
MLINKS+= EVP_PKEY_new.3 EVP_PKEY_new_raw_public_key_ex.3
-MLINKS+= EVP_PKEY_check.3 EVP_PKEY_pairwise_check.3
-MLINKS+= EVP_PKEY_check.3 EVP_PKEY_param_check.3
-MLINKS+= EVP_PKEY_check.3 EVP_PKEY_param_check_quick.3
-MLINKS+= EVP_PKEY_copy_parameters.3 EVP_PKEY_parameters_eq.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_paramgen.3
-MLINKS+= EVP_PKEY_keygen.3 EVP_PKEY_paramgen_init.3
+MLINKS+= EVP_PKEY_new.3 EVP_PKEY_up_ref.3
MLINKS+= EVP_PKEY_print_private.3 EVP_PKEY_print_params.3
MLINKS+= EVP_PKEY_print_private.3 EVP_PKEY_print_params_fp.3
MLINKS+= EVP_PKEY_print_private.3 EVP_PKEY_print_private_fp.3
MLINKS+= EVP_PKEY_print_private.3 EVP_PKEY_print_public.3
MLINKS+= EVP_PKEY_print_private.3 EVP_PKEY_print_public_fp.3
-MLINKS+= EVP_PKEY_check.3 EVP_PKEY_private_check.3
-MLINKS+= EVP_PKEY_check.3 EVP_PKEY_public_check.3
-MLINKS+= EVP_PKEY_check.3 EVP_PKEY_public_check_quick.3
-MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_security_bits.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_DH.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_DSA.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_EC_KEY.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_POLY1305.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_RSA.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_assign_SIPHASH.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_base_id.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_DH.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_DSA.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_EC_KEY.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_RSA.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_engine.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_hmac.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_poly1305.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get0_siphash.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get1_DH.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get1_DSA.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get1_EC_KEY.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get1_RSA.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get_base_id.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_get_id.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_id.3
MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_set1_DH.3
MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_set1_DSA.3
MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_set1_EC_KEY.3
MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_set1_engine.3
+MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_type.3
+MLINKS+= EVP_PKEY_set1_encoded_public_key.3 EVP_PKEY_get1_encoded_public_key.3
+MLINKS+= EVP_PKEY_set1_encoded_public_key.3 EVP_PKEY_get1_tls_encodedpoint.3
MLINKS+= EVP_PKEY_set1_encoded_public_key.3 EVP_PKEY_set1_tls_encodedpoint.3
+MLINKS+= EVP_PKEY_set_type.3 EVP_PKEY_set_type_by_keymgmt.3
+MLINKS+= EVP_PKEY_set_type.3 EVP_PKEY_set_type_str.3
MLINKS+= EVP_PKEY_settable_params.3 EVP_PKEY_set_bn_param.3
-MLINKS+= BIO_get_ex_new_index.3 EVP_PKEY_set_ex_data.3
MLINKS+= EVP_PKEY_settable_params.3 EVP_PKEY_set_int_param.3
MLINKS+= EVP_PKEY_settable_params.3 EVP_PKEY_set_octet_string_param.3
MLINKS+= EVP_PKEY_settable_params.3 EVP_PKEY_set_params.3
MLINKS+= EVP_PKEY_settable_params.3 EVP_PKEY_set_size_t_param.3
-MLINKS+= EVP_PKEY_set_type.3 EVP_PKEY_set_type_by_keymgmt.3
-MLINKS+= EVP_PKEY_set_type.3 EVP_PKEY_set_type_str.3
MLINKS+= EVP_PKEY_settable_params.3 EVP_PKEY_set_utf8_string_param.3
MLINKS+= EVP_PKEY_sign.3 EVP_PKEY_sign_init.3
MLINKS+= EVP_PKEY_sign.3 EVP_PKEY_sign_init_ex.3
-MLINKS+= EVP_PKEY_get_size.3 EVP_PKEY_size.3
-MLINKS+= EVP_PKEY_set1_RSA.3 EVP_PKEY_type.3
-MLINKS+= EVP_PKEY_is_a.3 EVP_PKEY_type_names_do_all.3
-MLINKS+= EVP_PKEY_new.3 EVP_PKEY_up_ref.3
+MLINKS+= EVP_PKEY_sign.3 EVP_PKEY_sign_init_ex2.3
+MLINKS+= EVP_PKEY_sign.3 EVP_PKEY_sign_message_final.3
+MLINKS+= EVP_PKEY_sign.3 EVP_PKEY_sign_message_init.3
+MLINKS+= EVP_PKEY_sign.3 EVP_PKEY_sign_message_update.3
+MLINKS+= EVP_PKEY_todata.3 EVP_PKEY_export.3
+MLINKS+= EVP_PKEY_verify.3 EVP_PKEY_CTX_set_signature.3
MLINKS+= EVP_PKEY_verify.3 EVP_PKEY_verify_init.3
MLINKS+= EVP_PKEY_verify.3 EVP_PKEY_verify_init_ex.3
+MLINKS+= EVP_PKEY_verify.3 EVP_PKEY_verify_init_ex2.3
+MLINKS+= EVP_PKEY_verify.3 EVP_PKEY_verify_message_final.3
+MLINKS+= EVP_PKEY_verify.3 EVP_PKEY_verify_message_init.3
+MLINKS+= EVP_PKEY_verify.3 EVP_PKEY_verify_message_update.3
MLINKS+= EVP_PKEY_verify_recover.3 EVP_PKEY_verify_recover_init.3
MLINKS+= EVP_PKEY_verify_recover.3 EVP_PKEY_verify_recover_init_ex.3
-MLINKS+= EVP_DigestInit.3 EVP_Q_digest.3
-MLINKS+= EVP_MAC.3 EVP_Q_mac.3
+MLINKS+= EVP_PKEY_verify_recover.3 EVP_PKEY_verify_recover_init_ex2.3
MLINKS+= EVP_RAND.3 EVP_RAND_CTX.3
MLINKS+= EVP_RAND.3 EVP_RAND_CTX_free.3
MLINKS+= EVP_RAND.3 EVP_RAND_CTX_get0_rand.3
@@ -2347,6 +2491,7 @@ MLINKS+= EVP_RAND.3 EVP_RAND_CTX_gettable_params.3
MLINKS+= EVP_RAND.3 EVP_RAND_CTX_new.3
MLINKS+= EVP_RAND.3 EVP_RAND_CTX_set_params.3
MLINKS+= EVP_RAND.3 EVP_RAND_CTX_settable_params.3
+MLINKS+= EVP_RAND.3 EVP_RAND_CTX_up_ref.3
MLINKS+= EVP_RAND.3 EVP_RAND_STATE_ERROR.3
MLINKS+= EVP_RAND.3 EVP_RAND_STATE_READY.3
MLINKS+= EVP_RAND.3 EVP_RAND_STATE_UNINITIALISED.3
@@ -2372,7 +2517,6 @@ MLINKS+= EVP_RAND.3 EVP_RAND_settable_ctx_params.3
MLINKS+= EVP_RAND.3 EVP_RAND_uninstantiate.3
MLINKS+= EVP_RAND.3 EVP_RAND_up_ref.3
MLINKS+= EVP_RAND.3 EVP_RAND_verify_zeroization.3
-MLINKS+= RSA_generate_key.3 EVP_RSA_gen.3
MLINKS+= EVP_SIGNATURE.3 EVP_SIGNATURE_do_all_provided.3
MLINKS+= EVP_SIGNATURE.3 EVP_SIGNATURE_fetch.3
MLINKS+= EVP_SIGNATURE.3 EVP_SIGNATURE_free.3
@@ -2384,6 +2528,29 @@ MLINKS+= EVP_SIGNATURE.3 EVP_SIGNATURE_is_a.3
MLINKS+= EVP_SIGNATURE.3 EVP_SIGNATURE_names_do_all.3
MLINKS+= EVP_SIGNATURE.3 EVP_SIGNATURE_settable_ctx_params.3
MLINKS+= EVP_SIGNATURE.3 EVP_SIGNATURE_up_ref.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_export.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_free.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_generate.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_get0_key_id.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_get0_provider_name.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_get0_raw_key.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_get0_skeymgmt_name.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_import.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_import_raw_key.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_is_a.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_to_provider.3
+MLINKS+= EVP_SKEY.3 EVP_SKEY_up_ref.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_do_all_provided.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_fetch.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_free.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_get0_description.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_get0_gen_settable_params.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_get0_imp_settable_params.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_get0_name.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_get0_provider.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_is_a.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_names_do_all.3
+MLINKS+= EVP_SKEYMGMT.3 EVP_SKEYMGMT_up_ref.3
MLINKS+= EVP_SealInit.3 EVP_SealFinal.3
MLINKS+= EVP_SealInit.3 EVP_SealUpdate.3
MLINKS+= EVP_SignInit.3 EVP_SignFinal.3
@@ -2500,9 +2667,6 @@ MLINKS+= EVP_cast5_cbc.3 EVP_cast5_cfb64.3
MLINKS+= EVP_cast5_cbc.3 EVP_cast5_ecb.3
MLINKS+= EVP_cast5_cbc.3 EVP_cast5_ofb.3
MLINKS+= EVP_chacha20.3 EVP_chacha20_poly1305.3
-MLINKS+= OpenSSL_add_all_algorithms.3 EVP_cleanup.3
-MLINKS+= EVP_set_default_properties.3 EVP_default_properties_enable_fips.3
-MLINKS+= EVP_set_default_properties.3 EVP_default_properties_is_fips_enabled.3
MLINKS+= EVP_des_cbc.3 EVP_des_cfb.3
MLINKS+= EVP_des_cbc.3 EVP_des_cfb1.3
MLINKS+= EVP_des_cbc.3 EVP_des_cfb64.3
@@ -2524,19 +2688,11 @@ MLINKS+= EVP_des_cbc.3 EVP_des_ede_cfb64.3
MLINKS+= EVP_des_cbc.3 EVP_des_ede_ecb.3
MLINKS+= EVP_des_cbc.3 EVP_des_ede_ofb.3
MLINKS+= EVP_des_cbc.3 EVP_des_ofb.3
-MLINKS+= EVP_EncryptInit.3 EVP_enc_null.3
-MLINKS+= EVP_EncryptInit.3 EVP_get_cipherbyname.3
-MLINKS+= EVP_EncryptInit.3 EVP_get_cipherbynid.3
-MLINKS+= EVP_EncryptInit.3 EVP_get_cipherbyobj.3
-MLINKS+= EVP_DigestInit.3 EVP_get_digestbyname.3
-MLINKS+= EVP_DigestInit.3 EVP_get_digestbynid.3
-MLINKS+= EVP_DigestInit.3 EVP_get_digestbyobj.3
MLINKS+= EVP_idea_cbc.3 EVP_idea_cfb.3
MLINKS+= EVP_idea_cbc.3 EVP_idea_cfb64.3
MLINKS+= EVP_idea_cbc.3 EVP_idea_ecb.3
MLINKS+= EVP_idea_cbc.3 EVP_idea_ofb.3
MLINKS+= EVP_md5.3 EVP_md5_sha1.3
-MLINKS+= EVP_DigestInit.3 EVP_md_null.3
MLINKS+= EVP_rc2_cbc.3 EVP_rc2_40_cbc.3
MLINKS+= EVP_rc2_cbc.3 EVP_rc2_64_cbc.3
MLINKS+= EVP_rc2_cbc.3 EVP_rc2_cfb.3
@@ -2553,14 +2709,17 @@ MLINKS+= EVP_seed_cbc.3 EVP_seed_cfb.3
MLINKS+= EVP_seed_cbc.3 EVP_seed_cfb128.3
MLINKS+= EVP_seed_cbc.3 EVP_seed_ecb.3
MLINKS+= EVP_seed_cbc.3 EVP_seed_ofb.3
+MLINKS+= EVP_set_default_properties.3 EVP_default_properties_enable_fips.3
+MLINKS+= EVP_set_default_properties.3 EVP_default_properties_is_fips_enabled.3
+MLINKS+= EVP_set_default_properties.3 EVP_get1_default_properties.3
MLINKS+= EVP_sha224.3 EVP_sha256.3
MLINKS+= EVP_sha224.3 EVP_sha384.3
-MLINKS+= EVP_sha3_224.3 EVP_sha3_256.3
-MLINKS+= EVP_sha3_224.3 EVP_sha3_384.3
-MLINKS+= EVP_sha3_224.3 EVP_sha3_512.3
MLINKS+= EVP_sha224.3 EVP_sha512.3
MLINKS+= EVP_sha224.3 EVP_sha512_224.3
MLINKS+= EVP_sha224.3 EVP_sha512_256.3
+MLINKS+= EVP_sha3_224.3 EVP_sha3_256.3
+MLINKS+= EVP_sha3_224.3 EVP_sha3_384.3
+MLINKS+= EVP_sha3_224.3 EVP_sha3_512.3
MLINKS+= EVP_sha3_224.3 EVP_shake128.3
MLINKS+= EVP_sha3_224.3 EVP_shake256.3
MLINKS+= EVP_sm4_cbc.3 EVP_sm4_cfb.3
@@ -2568,17 +2727,7 @@ MLINKS+= EVP_sm4_cbc.3 EVP_sm4_cfb128.3
MLINKS+= EVP_sm4_cbc.3 EVP_sm4_ctr.3
MLINKS+= EVP_sm4_cbc.3 EVP_sm4_ecb.3
MLINKS+= EVP_sm4_cbc.3 EVP_sm4_ofb.3
-MLINKS+= X509_dup.3 EXTENDED_KEY_USAGE_free.3
-MLINKS+= X509_dup.3 EXTENDED_KEY_USAGE_new.3
-MLINKS+= OSSL_CORE_MAKE_FUNC.3 EXT_UTF8STRING.3
-MLINKS+= X509_dup.3 GENERAL_NAMES_free.3
-MLINKS+= X509_dup.3 GENERAL_NAMES_new.3
-MLINKS+= X509_dup.3 GENERAL_NAME_dup.3
-MLINKS+= X509_dup.3 GENERAL_NAME_free.3
-MLINKS+= X509_dup.3 GENERAL_NAME_new.3
-MLINKS+= X509_dup.3 GENERAL_SUBTREE_free.3
-MLINKS+= X509_dup.3 GENERAL_SUBTREE_new.3
-MLINKS+= SSL_CTX_set_generate_session_id.3 GEN_SESSION_CB.3
+MLINKS+= GENERAL_NAME.3 GENERAL_NAME_set1_X509_NAME.3
MLINKS+= HMAC.3 HMAC_CTX_copy.3
MLINKS+= HMAC.3 HMAC_CTX_free.3
MLINKS+= HMAC.3 HMAC_CTX_get_md.3
@@ -2590,26 +2739,6 @@ MLINKS+= HMAC.3 HMAC_Init.3
MLINKS+= HMAC.3 HMAC_Init_ex.3
MLINKS+= HMAC.3 HMAC_Update.3
MLINKS+= HMAC.3 HMAC_size.3
-MLINKS+= X509_dup.3 IMPLEMENT_ASN1_FUNCTIONS.3
-MLINKS+= ASN1_EXTERN_FUNCS.3 IMPLEMENT_EXTERN_ASN1.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 IMPLEMENT_LHASH_COMP_FN.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 IMPLEMENT_LHASH_HASH_FN.3
-MLINKS+= X509_dup.3 IPAddressChoice_free.3
-MLINKS+= X509_dup.3 IPAddressChoice_new.3
-MLINKS+= X509_dup.3 IPAddressFamily_free.3
-MLINKS+= X509_dup.3 IPAddressFamily_new.3
-MLINKS+= X509_dup.3 IPAddressOrRange_free.3
-MLINKS+= X509_dup.3 IPAddressOrRange_new.3
-MLINKS+= X509_dup.3 IPAddressRange_free.3
-MLINKS+= X509_dup.3 IPAddressRange_new.3
-MLINKS+= X509_dup.3 ISSUER_SIGN_TOOL_free.3
-MLINKS+= X509_dup.3 ISSUER_SIGN_TOOL_it.3
-MLINKS+= X509_dup.3 ISSUER_SIGN_TOOL_new.3
-MLINKS+= X509_dup.3 ISSUING_DIST_POINT_free.3
-MLINKS+= X509_dup.3 ISSUING_DIST_POINT_it.3
-MLINKS+= X509_dup.3 ISSUING_DIST_POINT_new.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 LHASH.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 LHASH_DOALL_ARG_FN_TYPE.3
MLINKS+= MD5.3 MD2.3
MLINKS+= MD5.3 MD2_Final.3
MLINKS+= MD5.3 MD2_Init.3
@@ -2624,17 +2753,6 @@ MLINKS+= MD5.3 MD5_Update.3
MLINKS+= MDC2_Init.3 MDC2.3
MLINKS+= MDC2_Init.3 MDC2_Final.3
MLINKS+= MDC2_Init.3 MDC2_Update.3
-MLINKS+= X509_dup.3 NAME_CONSTRAINTS_free.3
-MLINKS+= X509_dup.3 NAME_CONSTRAINTS_new.3
-MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY.3
-MLINKS+= X509_dup.3 NAMING_AUTHORITY_free.3
-MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_get0_authorityId.3
-MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_get0_authorityText.3
-MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_get0_authorityURL.3
-MLINKS+= X509_dup.3 NAMING_AUTHORITY_new.3
-MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_set0_authorityId.3
-MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_set0_authorityText.3
-MLINKS+= ADMISSIONS.3 NAMING_AUTHORITY_set0_authorityURL.3
MLINKS+= NCONF_new_ex.3 NCONF_default.3
MLINKS+= NCONF_new_ex.3 NCONF_free.3
MLINKS+= NCONF_new_ex.3 NCONF_get0_libctx.3
@@ -2642,14 +2760,6 @@ MLINKS+= NCONF_new_ex.3 NCONF_get_section.3
MLINKS+= NCONF_new_ex.3 NCONF_get_section_names.3
MLINKS+= NCONF_new_ex.3 NCONF_load.3
MLINKS+= NCONF_new_ex.3 NCONF_new.3
-MLINKS+= X509_dup.3 NETSCAPE_CERT_SEQUENCE_free.3
-MLINKS+= X509_dup.3 NETSCAPE_CERT_SEQUENCE_new.3
-MLINKS+= X509_dup.3 NETSCAPE_SPKAC_free.3
-MLINKS+= X509_dup.3 NETSCAPE_SPKAC_new.3
-MLINKS+= X509_dup.3 NETSCAPE_SPKI_free.3
-MLINKS+= X509_dup.3 NETSCAPE_SPKI_new.3
-MLINKS+= X509_dup.3 NOTICEREF_free.3
-MLINKS+= X509_dup.3 NOTICEREF_new.3
MLINKS+= OBJ_nid2obj.3 OBJ_add_sigid.3
MLINKS+= OBJ_nid2obj.3 OBJ_cleanup.3
MLINKS+= OBJ_nid2obj.3 OBJ_cmp.3
@@ -2665,63 +2775,23 @@ MLINKS+= OBJ_nid2obj.3 OBJ_obj2txt.3
MLINKS+= OBJ_nid2obj.3 OBJ_sn2nid.3
MLINKS+= OBJ_nid2obj.3 OBJ_txt2nid.3
MLINKS+= OBJ_nid2obj.3 OBJ_txt2obj.3
-MLINKS+= X509_dup.3 OCSP_BASICRESP_free.3
-MLINKS+= X509_dup.3 OCSP_BASICRESP_new.3
-MLINKS+= X509_dup.3 OCSP_CERTID_dup.3
-MLINKS+= OCSP_cert_to_id.3 OCSP_CERTID_free.3
-MLINKS+= X509_dup.3 OCSP_CERTID_new.3
-MLINKS+= X509_dup.3 OCSP_CERTSTATUS_free.3
-MLINKS+= X509_dup.3 OCSP_CERTSTATUS_new.3
-MLINKS+= X509_dup.3 OCSP_CRLID_free.3
-MLINKS+= X509_dup.3 OCSP_CRLID_new.3
-MLINKS+= X509_dup.3 OCSP_ONEREQ_free.3
-MLINKS+= X509_dup.3 OCSP_ONEREQ_new.3
-MLINKS+= X509_dup.3 OCSP_REQINFO_free.3
-MLINKS+= X509_dup.3 OCSP_REQINFO_new.3
+MLINKS+= OBJ_nid2obj.3 i2t_ASN1_OBJECT.3
MLINKS+= OCSP_REQUEST_new.3 OCSP_REQUEST_free.3
-MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX.3
-MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX_add1_header.3
-MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX_free.3
-MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX_i2d.3
-MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX_set1_req.3
-MLINKS+= X509_dup.3 OCSP_RESPBYTES_free.3
-MLINKS+= X509_dup.3 OCSP_RESPBYTES_new.3
-MLINKS+= X509_dup.3 OCSP_RESPDATA_free.3
-MLINKS+= X509_dup.3 OCSP_RESPDATA_new.3
-MLINKS+= X509_dup.3 OCSP_RESPID_free.3
-MLINKS+= OCSP_response_status.3 OCSP_RESPID_match.3
-MLINKS+= OCSP_response_status.3 OCSP_RESPID_match_ex.3
-MLINKS+= X509_dup.3 OCSP_RESPID_new.3
-MLINKS+= OCSP_response_status.3 OCSP_RESPID_set_by_key.3
-MLINKS+= OCSP_response_status.3 OCSP_RESPID_set_by_key_ex.3
-MLINKS+= OCSP_response_status.3 OCSP_RESPID_set_by_name.3
-MLINKS+= OCSP_response_status.3 OCSP_RESPONSE_free.3
-MLINKS+= X509_dup.3 OCSP_RESPONSE_new.3
-MLINKS+= X509_dup.3 OCSP_REVOKEDINFO_free.3
-MLINKS+= X509_dup.3 OCSP_REVOKEDINFO_new.3
-MLINKS+= X509_dup.3 OCSP_SERVICELOC_free.3
-MLINKS+= X509_dup.3 OCSP_SERVICELOC_new.3
-MLINKS+= X509_dup.3 OCSP_SIGNATURE_free.3
-MLINKS+= X509_dup.3 OCSP_SIGNATURE_new.3
-MLINKS+= X509_dup.3 OCSP_SINGLERESP_free.3
-MLINKS+= X509_dup.3 OCSP_SINGLERESP_new.3
-MLINKS+= OCSP_request_add1_nonce.3 OCSP_basic_add1_nonce.3
-MLINKS+= OCSP_response_status.3 OCSP_basic_sign.3
-MLINKS+= OCSP_response_status.3 OCSP_basic_sign_ctx.3
-MLINKS+= OCSP_resp_find_status.3 OCSP_basic_verify.3
-MLINKS+= OCSP_cert_to_id.3 OCSP_cert_id_new.3
-MLINKS+= OCSP_request_add1_nonce.3 OCSP_check_nonce.3
-MLINKS+= OCSP_resp_find_status.3 OCSP_check_validity.3
-MLINKS+= OCSP_request_add1_nonce.3 OCSP_copy_nonce.3
-MLINKS+= OCSP_cert_to_id.3 OCSP_id_cmp.3
-MLINKS+= OCSP_cert_to_id.3 OCSP_id_get0_info.3
-MLINKS+= OCSP_cert_to_id.3 OCSP_id_issuer_cmp.3
-MLINKS+= OSSL_HTTP_parse_url.3 OCSP_parse_url.3
MLINKS+= OCSP_REQUEST_new.3 OCSP_request_add0_id.3
MLINKS+= OCSP_REQUEST_new.3 OCSP_request_add1_cert.3
MLINKS+= OCSP_REQUEST_new.3 OCSP_request_onereq_count.3
MLINKS+= OCSP_REQUEST_new.3 OCSP_request_onereq_get0.3
MLINKS+= OCSP_REQUEST_new.3 OCSP_request_sign.3
+MLINKS+= OCSP_cert_to_id.3 OCSP_CERTID_free.3
+MLINKS+= OCSP_cert_to_id.3 OCSP_cert_id_new.3
+MLINKS+= OCSP_cert_to_id.3 OCSP_id_cmp.3
+MLINKS+= OCSP_cert_to_id.3 OCSP_id_get0_info.3
+MLINKS+= OCSP_cert_to_id.3 OCSP_id_issuer_cmp.3
+MLINKS+= OCSP_request_add1_nonce.3 OCSP_basic_add1_nonce.3
+MLINKS+= OCSP_request_add1_nonce.3 OCSP_check_nonce.3
+MLINKS+= OCSP_request_add1_nonce.3 OCSP_copy_nonce.3
+MLINKS+= OCSP_resp_find_status.3 OCSP_basic_verify.3
+MLINKS+= OCSP_resp_find_status.3 OCSP_check_validity.3
MLINKS+= OCSP_resp_find_status.3 OCSP_resp_count.3
MLINKS+= OCSP_resp_find_status.3 OCSP_resp_find.3
MLINKS+= OCSP_resp_find_status.3 OCSP_resp_get0.3
@@ -2733,120 +2803,179 @@ MLINKS+= OCSP_resp_find_status.3 OCSP_resp_get0_signature.3
MLINKS+= OCSP_resp_find_status.3 OCSP_resp_get0_signer.3
MLINKS+= OCSP_resp_find_status.3 OCSP_resp_get0_tbs_sigalg.3
MLINKS+= OCSP_resp_find_status.3 OCSP_resp_get1_id.3
+MLINKS+= OCSP_resp_find_status.3 OCSP_single_get0_status.3
+MLINKS+= OCSP_response_status.3 OCSP_RESPID_match.3
+MLINKS+= OCSP_response_status.3 OCSP_RESPID_match_ex.3
+MLINKS+= OCSP_response_status.3 OCSP_RESPID_set_by_key.3
+MLINKS+= OCSP_response_status.3 OCSP_RESPID_set_by_key_ex.3
+MLINKS+= OCSP_response_status.3 OCSP_RESPID_set_by_name.3
+MLINKS+= OCSP_response_status.3 OCSP_RESPONSE_free.3
+MLINKS+= OCSP_response_status.3 OCSP_basic_sign.3
+MLINKS+= OCSP_response_status.3 OCSP_basic_sign_ctx.3
MLINKS+= OCSP_response_status.3 OCSP_response_create.3
MLINKS+= OCSP_response_status.3 OCSP_response_get1_basic.3
+MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX.3
+MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX_add1_header.3
+MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX_free.3
+MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX_i2d.3
+MLINKS+= OCSP_sendreq_new.3 OCSP_REQ_CTX_set1_req.3
MLINKS+= OCSP_sendreq_new.3 OCSP_sendreq_bio.3
MLINKS+= OCSP_sendreq_new.3 OCSP_sendreq_nbio.3
MLINKS+= OCSP_sendreq_new.3 OCSP_set_max_response_length.3
-MLINKS+= OCSP_resp_find_status.3 OCSP_single_get0_status.3
MLINKS+= OPENSSL_FILE.3 OPENSSL_FUNC.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_free.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_new.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_set_config_appname.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_set_config_file_flags.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_set_config_filename.3
+MLINKS+= OPENSSL_FILE.3 OPENSSL_LINE.3
+MLINKS+= OPENSSL_FILE.3 OPENSSL_MSTR.3
+MLINKS+= OPENSSL_FILE.3 OPENSSL_MSTR_HELPER.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 DEFINE_LHASH_OF.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 DEFINE_LHASH_OF_EX.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 IMPLEMENT_LHASH_COMP_FN.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 IMPLEMENT_LHASH_HASH_FN.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 LHASH.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 LHASH_DOALL_ARG_FN_TYPE.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 LHASH_OF.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_DOALL_FUNC.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_HASHFUNC.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_delete.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_doall.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_doall_arg.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_doall_arg_thunk.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_error.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_flush.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_free.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_get_down_load.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_insert.3
MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_new.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_num_items.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_retrieve.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_set_down_load.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_set_thunks.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_delete.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_doall.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_doall_arg.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_error.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_flush.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_free.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_get_down_load.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_insert.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_new.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_num_items.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_retrieve.3
+MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_set_down_load.3
MLINKS+= OPENSSL_LH_stats.3 OPENSSL_LH_node_stats.3
MLINKS+= OPENSSL_LH_stats.3 OPENSSL_LH_node_stats_bio.3
MLINKS+= OPENSSL_LH_stats.3 OPENSSL_LH_node_usage_stats.3
MLINKS+= OPENSSL_LH_stats.3 OPENSSL_LH_node_usage_stats_bio.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 OPENSSL_LH_retrieve.3
MLINKS+= OPENSSL_LH_stats.3 OPENSSL_LH_stats_bio.3
-MLINKS+= OPENSSL_FILE.3 OPENSSL_LINE.3
-MLINKS+= OPENSSL_malloc.3 OPENSSL_MALLOC_FAILURES.3
-MLINKS+= OPENSSL_malloc.3 OPENSSL_MALLOC_FD.3
-MLINKS+= OPENSSL_FILE.3 OPENSSL_MSTR.3
-MLINKS+= OPENSSL_FILE.3 OPENSSL_MSTR_HELPER.3
-MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_BUILD_METADATA.3
-MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_MAJOR.3
-MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_MINOR.3
-MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_NUMBER.3
-MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_PATCH.3
-MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_PREREQ.3
-MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_PRE_RELEASE.3
-MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_TEXT.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_atexit.3
-MLINKS+= OPENSSL_hexchar2int.3 OPENSSL_buf2hexstr.3
-MLINKS+= OPENSSL_hexchar2int.3 OPENSSL_buf2hexstr_ex.3
-MLINKS+= SSL_CIPHER_get_name.3 OPENSSL_cipher_name.3
-MLINKS+= OPENSSL_malloc.3 OPENSSL_cleanse.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_cleanup.3
-MLINKS+= OPENSSL_malloc.3 OPENSSL_clear_free.3
-MLINKS+= OPENSSL_malloc.3 OPENSSL_clear_realloc.3
+MLINKS+= OPENSSL_config.3 OPENSSL_no_config.3
MLINKS+= OPENSSL_fork_prepare.3 OPENSSL_fork_child.3
MLINKS+= OPENSSL_fork_prepare.3 OPENSSL_fork_parent.3
-MLINKS+= OPENSSL_malloc.3 OPENSSL_free.3
MLINKS+= OPENSSL_gmtime.3 OPENSSL_gmtime_adj.3
MLINKS+= OPENSSL_gmtime.3 OPENSSL_gmtime_diff.3
+MLINKS+= OPENSSL_hexchar2int.3 OPENSSL_buf2hexstr.3
+MLINKS+= OPENSSL_hexchar2int.3 OPENSSL_buf2hexstr_ex.3
MLINKS+= OPENSSL_hexchar2int.3 OPENSSL_hexstr2buf.3
MLINKS+= OPENSSL_hexchar2int.3 OPENSSL_hexstr2buf_ex.3
-MLINKS+= OpenSSL_version.3 OPENSSL_info.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_free.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_new.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_set_config_appname.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_set_config_file_flags.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_INIT_set_config_filename.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_atexit.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_cleanup.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_thread_stop.3
+MLINKS+= OPENSSL_init_crypto.3 OPENSSL_thread_stop_ex.3
MLINKS+= OPENSSL_instrument_bus.3 OPENSSL_instrument_bus2.3
+MLINKS+= OPENSSL_load_builtin_modules.3 ASN1_add_oid_module.3
+MLINKS+= OPENSSL_load_builtin_modules.3 ENGINE_add_conf_module.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_load_u16_be.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_load_u32_be.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_load_u32_le.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_load_u64_be.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_load_u64_le.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_store_u16_be.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_store_u16_le.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_store_u32_be.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_store_u32_le.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_store_u64_be.3
+MLINKS+= OPENSSL_load_u16_le.3 OPENSSL_store_u64_le.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_aligned_alloc.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_clear_free.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_clear_realloc.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_free.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_free_fn.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_get_alloc_counts.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_get_mem_functions.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_malloc.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_malloc_fn.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_ctrl.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_debug_pop.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_debug_push.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_leaks.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_leaks_cb.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_mem_leaks_fp.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_realloc.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_realloc_fn.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_set_mem_debug.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_set_mem_functions.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_strdup.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_strndup.3
+MLINKS+= OPENSSL_malloc.3 CRYPTO_zalloc.3
+MLINKS+= OPENSSL_malloc.3 OPENSSL_MALLOC_FAILURES.3
+MLINKS+= OPENSSL_malloc.3 OPENSSL_MALLOC_FD.3
+MLINKS+= OPENSSL_malloc.3 OPENSSL_aligned_alloc.3
+MLINKS+= OPENSSL_malloc.3 OPENSSL_cleanse.3
+MLINKS+= OPENSSL_malloc.3 OPENSSL_clear_free.3
+MLINKS+= OPENSSL_malloc.3 OPENSSL_clear_realloc.3
+MLINKS+= OPENSSL_malloc.3 OPENSSL_free.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_malloc_init.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_mem_debug_pop.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_mem_debug_push.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_memdup.3
-MLINKS+= OPENSSL_config.3 OPENSSL_no_config.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_realloc.3
-MLINKS+= OPENSSL_secure_malloc.3 OPENSSL_secure_actual_size.3
-MLINKS+= OPENSSL_secure_malloc.3 OPENSSL_secure_clear_free.3
-MLINKS+= OPENSSL_secure_malloc.3 OPENSSL_secure_free.3
-MLINKS+= OPENSSL_secure_malloc.3 OPENSSL_secure_zalloc.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_deep_copy.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_delete.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_delete_ptr.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_dup.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_find.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_find_all.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_find_ex.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_free.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_insert.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_is_sorted.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_new.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_new_null.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_new_reserve.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_num.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_pop.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_pop_free.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_push.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_reserve.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_set.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_set_cmp_func.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_shift.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_sort.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_unshift.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_value.3
-MLINKS+= DEFINE_STACK_OF.3 OPENSSL_sk_zero.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_strdup.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_strlcat.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_strlcpy.3
-MLINKS+= OPENSSL_strcasecmp.3 OPENSSL_strncasecmp.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_strndup.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_thread_stop.3
-MLINKS+= OPENSSL_init_crypto.3 OPENSSL_thread_stop_ex.3
-MLINKS+= OpenSSL_version.3 OPENSSL_version_build_metadata.3
-MLINKS+= OpenSSL_version.3 OPENSSL_version_major.3
-MLINKS+= OpenSSL_version.3 OPENSSL_version_minor.3
-MLINKS+= OpenSSL_version.3 OPENSSL_version_patch.3
-MLINKS+= OpenSSL_version.3 OPENSSL_version_pre_release.3
+MLINKS+= OPENSSL_malloc.3 OPENSSL_strtoul.3
MLINKS+= OPENSSL_malloc.3 OPENSSL_zalloc.3
-MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_CR.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_allocated.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_clear_free.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_free.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_malloc.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_malloc_done.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_malloc_init.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_malloc_initialized.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_used.3
+MLINKS+= OPENSSL_secure_malloc.3 CRYPTO_secure_zalloc.3
+MLINKS+= OPENSSL_secure_malloc.3 OPENSSL_secure_actual_size.3
+MLINKS+= OPENSSL_secure_malloc.3 OPENSSL_secure_clear_free.3
+MLINKS+= OPENSSL_secure_malloc.3 OPENSSL_secure_free.3
+MLINKS+= OPENSSL_secure_malloc.3 OPENSSL_secure_zalloc.3
+MLINKS+= OPENSSL_strcasecmp.3 OPENSSL_strncasecmp.3
+MLINKS+= OSSL_CALLBACK.3 OSSL_PASSPHRASE_CALLBACK.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAVS.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_create.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_free.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_get0_algId.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_get0_type.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_get0_value.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_get_rsaKeyLen.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_new_algId.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_new_rsaKeyLen.3
+MLINKS+= OSSL_CMP_ATAV_set0.3 OSSL_CMP_ATAV_push1.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_build_cert_chain.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_free.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_geninfo_ITAVs.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_libctx.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_newCert.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_newPkey.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_propq.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_statusString.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_trusted.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_trustedStore.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_untrusted.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get0_validatedSrvCert.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get1_caPubs.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get1_extraCertsIn.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_get1_newChain.3
@@ -2864,9 +2993,9 @@ MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_push1_subjectAltName.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_reinit.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_reqExtensions_have_SAN.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_reset_geninfo_ITAVs.3
-MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_CTX_server_perform.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set0_newPkey.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set0_reqExtensions.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set0_trusted.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set0_trustedStore.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_cert.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_expected_sender.3
@@ -2881,6 +3010,7 @@ MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_recipient.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_referenceValue.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_secretValue.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_senderNonce.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_serialNumber.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_server.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_serverPath.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set1_srvCert.3
@@ -2897,132 +3027,142 @@ MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set_option.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set_serverPort.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set_transfer_cb.3
MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_CTX_set_transfer_cb_arg.3
-MLINKS+= OSSL_CMP_MSG_get0_header.3 OSSL_CMP_CTX_setup_CRM.3
-MLINKS+= OSSL_CMP_STATUSINFO_new.3 OSSL_CMP_CTX_snprint_PKIStatus.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_certConf_cb.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_certConf_cb_t.3
+MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_transfer_cb_t.3
+MLINKS+= OSSL_CMP_HDR_get0_transactionID.3 OSSL_CMP_HDR_get0_geninfo_ITAVs.3
MLINKS+= OSSL_CMP_HDR_get0_transactionID.3 OSSL_CMP_HDR_get0_recipNonce.3
-MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_IR.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_CRLSTATUS_create.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_CRLSTATUS_get0.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_CRLSTATUS_new1.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_get0_caCerts.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_get0_crlStatusList.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_get0_crls.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_get0_rootCaCert.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_get0_rootCaKeyUpdate.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_get1_certReqTemplate.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_new0_certReqTemplate.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_new0_crlStatusList.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_new_crls.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_new_rootCaCert.3
+MLINKS+= OSSL_CMP_ITAV_new_caCerts.3 OSSL_CMP_ITAV_new_rootCaKeyUpdate.3
MLINKS+= OSSL_CMP_ITAV_set0.3 OSSL_CMP_ITAV_create.3
-MLINKS+= X509_dup.3 OSSL_CMP_ITAV_dup.3
-MLINKS+= X509_dup.3 OSSL_CMP_ITAV_free.3
+MLINKS+= OSSL_CMP_ITAV_set0.3 OSSL_CMP_ITAV_get0_certProfile.3
MLINKS+= OSSL_CMP_ITAV_set0.3 OSSL_CMP_ITAV_get0_type.3
MLINKS+= OSSL_CMP_ITAV_set0.3 OSSL_CMP_ITAV_get0_value.3
+MLINKS+= OSSL_CMP_ITAV_set0.3 OSSL_CMP_ITAV_new0_certProfile.3
MLINKS+= OSSL_CMP_ITAV_set0.3 OSSL_CMP_ITAV_push0_stack_item.3
-MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_KUR.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_ALERT.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_CRIT.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_DEBUG.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_EMERG.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_ERR.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_INFO.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_NOTICE.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_TRACE.3
-MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_WARNING.3
-MLINKS+= X509_dup.3 OSSL_CMP_MSG_dup.3
-MLINKS+= X509_dup.3 OSSL_CMP_MSG_free.3
+MLINKS+= OSSL_CMP_MSG_get0_header.3 OSSL_CMP_CTX_setup_CRM.3
+MLINKS+= OSSL_CMP_MSG_get0_header.3 OSSL_CMP_MSG_get0_certreq_publickey.3
MLINKS+= OSSL_CMP_MSG_get0_header.3 OSSL_CMP_MSG_get_bodytype.3
-MLINKS+= X509_dup.3 OSSL_CMP_MSG_it.3
MLINKS+= OSSL_CMP_MSG_get0_header.3 OSSL_CMP_MSG_read.3
MLINKS+= OSSL_CMP_MSG_get0_header.3 OSSL_CMP_MSG_update_recipNonce.3
MLINKS+= OSSL_CMP_MSG_get0_header.3 OSSL_CMP_MSG_update_transactionID.3
MLINKS+= OSSL_CMP_MSG_get0_header.3 OSSL_CMP_MSG_write.3
-MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_P10CR.3
-MLINKS+= X509_dup.3 OSSL_CMP_PKIHEADER_free.3
-MLINKS+= X509_dup.3 OSSL_CMP_PKIHEADER_it.3
-MLINKS+= X509_dup.3 OSSL_CMP_PKIHEADER_new.3
-MLINKS+= X509_dup.3 OSSL_CMP_PKISI_dup.3
-MLINKS+= X509_dup.3 OSSL_CMP_PKISI_free.3
-MLINKS+= X509_dup.3 OSSL_CMP_PKISI_it.3
-MLINKS+= X509_dup.3 OSSL_CMP_PKISI_new.3
-MLINKS+= X509_dup.3 OSSL_CMP_PKISTATUS_it.3
+MLINKS+= OSSL_CMP_MSG_get0_header.3 d2i_OSSL_CMP_MSG_bio.3
+MLINKS+= OSSL_CMP_MSG_get0_header.3 i2d_OSSL_CMP_MSG_bio.3
+MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_CTX_server_perform.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_free.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_get0_cmp_ctx.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_get0_custom_ctx.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_init.3
+MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_init_trans.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_set_accept_raverified.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_set_accept_unprotected.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_set_grant_implicit_confirm.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_CTX_set_send_unprotected_errors.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_certConf_cb_t.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_cert_request_cb_t.3
+MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_clean_transaction_cb_t.3
+MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_delayed_delivery_cb_t.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_error_cb_t.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_genm_cb_t.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_pollReq_cb_t.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_process_request.3
MLINKS+= OSSL_CMP_SRV_CTX_new.3 OSSL_CMP_SRV_rr_cb_t.3
-MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_certConf_cb.3
-MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_certConf_cb_t.3
+MLINKS+= OSSL_CMP_STATUSINFO_new.3 OSSL_CMP_CTX_snprint_PKIStatus.3
+MLINKS+= OSSL_CMP_STATUSINFO_new.3 OSSL_CMP_snprint_PKIStatusInfo.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_CR.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_IR.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_KUR.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_P10CR.3
MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_exec_CR_ses.3
MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_exec_GENM_ses.3
MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_exec_IR_ses.3
MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_exec_KUR_ses.3
MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_exec_P10CR_ses.3
MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_exec_RR_ses.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_get1_caCerts.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_get1_certReqTemplate.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_get1_crlUpdate.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_get1_rootCaKeyUpdate.3
+MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_try_certreq.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_ALERT.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_CRIT.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_DEBUG.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_EMERG.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_ERR.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_INFO.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_NOTICE.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_TRACE.3
+MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_LOG_WARNING.3
MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_log_cb_t.3
MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_log_close.3
MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_print_errors_cb.3
MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_print_to_bio.3
MLINKS+= OSSL_CMP_log_open.3 OSSL_CMP_severity.3
-MLINKS+= OSSL_CMP_STATUSINFO_new.3 OSSL_CMP_snprint_PKIStatusInfo.3
-MLINKS+= OSSL_CMP_CTX_new.3 OSSL_CMP_transfer_cb_t.3
-MLINKS+= OSSL_CMP_exec_certreq.3 OSSL_CMP_try_certreq.3
MLINKS+= OSSL_CMP_validate_msg.3 OSSL_CMP_validate_cert_path.3
-MLINKS+= X509_dup.3 OSSL_CRMF_CERTID_dup.3
-MLINKS+= X509_dup.3 OSSL_CRMF_CERTID_free.3
-MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_CERTID_gen.3
+MLINKS+= OSSL_CORE_MAKE_FUNC.3 EXT_UTF8STRING.3
+MLINKS+= OSSL_CORE_MAKE_FUNC.3 SSL_OP_BIT.3
MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_CERTID_get0_issuer.3
MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_CERTID_get0_serialNumber.3
-MLINKS+= X509_dup.3 OSSL_CRMF_CERTID_it.3
-MLINKS+= X509_dup.3 OSSL_CRMF_CERTID_new.3
-MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_CERTTEMPLATE_fill.3
-MLINKS+= X509_dup.3 OSSL_CRMF_CERTTEMPLATE_free.3
MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_CERTTEMPLATE_get0_extensions.3
MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_CERTTEMPLATE_get0_issuer.3
+MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_CERTTEMPLATE_get0_publicKey.3
MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_CERTTEMPLATE_get0_serialNumber.3
MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_CERTTEMPLATE_get0_subject.3
-MLINKS+= X509_dup.3 OSSL_CRMF_CERTTEMPLATE_it.3
-MLINKS+= X509_dup.3 OSSL_CRMF_CERTTEMPLATE_new.3
-MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDVALUE_free.3
+MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_ENCRYPTEDKEY_get1_encCert.3
+MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_ENCRYPTEDKEY_get1_pkey.3
+MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_ENCRYPTEDKEY_init_envdata.3
+MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_ENCRYPTEDVALUE_decrypt.3
MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert.3
-MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDVALUE_it.3
-MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDVALUE_new.3
-MLINKS+= X509_dup.3 OSSL_CRMF_MSGS_free.3
-MLINKS+= X509_dup.3 OSSL_CRMF_MSGS_it.3
-MLINKS+= X509_dup.3 OSSL_CRMF_MSGS_new.3
+MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_MSG_centralkeygen_requested.3
+MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_MSG_get_certReqId.3
+MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_CERTTEMPLATE_fill.3
MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_MSGS_verify_popo.3
-MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_PKIPublicationInfo_push0_SinglePubInfo.3
MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_MSG_create_popo.3
-MLINKS+= X509_dup.3 OSSL_CRMF_MSG_dup.3
-MLINKS+= X509_dup.3 OSSL_CRMF_MSG_free.3
+MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_MSG_push0_extension.3
+MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_MSG_set0_extensions.3
+MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_MSG_set_certReqId.3
+MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_CERTID_gen.3
+MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_PKIPublicationInfo_push0_SinglePubInfo.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_get0_regCtrl_authenticator.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_get0_regCtrl_oldCertID.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_get0_regCtrl_pkiPublicationInfo.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_get0_regCtrl_protocolEncrKey.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_get0_regCtrl_regToken.3
-MLINKS+= OSSL_CRMF_MSG_set1_regInfo_certReq.3 OSSL_CRMF_MSG_get0_regInfo_certReq.3
-MLINKS+= OSSL_CRMF_MSG_set1_regInfo_certReq.3 OSSL_CRMF_MSG_get0_regInfo_utf8Pairs.3
-MLINKS+= OSSL_CRMF_MSG_get0_tmpl.3 OSSL_CRMF_MSG_get_certReqId.3
-MLINKS+= X509_dup.3 OSSL_CRMF_MSG_it.3
-MLINKS+= X509_dup.3 OSSL_CRMF_MSG_new.3
-MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_MSG_push0_extension.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_set0_SinglePubInfo.3
-MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_MSG_set0_extensions.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_set1_regCtrl_authenticator.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_set1_regCtrl_oldCertID.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_set1_regCtrl_pkiPublicationInfo.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_set1_regCtrl_protocolEncrKey.3
-MLINKS+= OSSL_CRMF_MSG_set1_regInfo_certReq.3 OSSL_CRMF_MSG_set1_regInfo_utf8Pairs.3
MLINKS+= OSSL_CRMF_MSG_set1_regCtrl_regToken.3 OSSL_CRMF_MSG_set_PKIPublicationInfo_action.3
-MLINKS+= OSSL_CRMF_MSG_set0_validity.3 OSSL_CRMF_MSG_set_certReqId.3
-MLINKS+= X509_dup.3 OSSL_CRMF_PBMPARAMETER_free.3
-MLINKS+= X509_dup.3 OSSL_CRMF_PBMPARAMETER_it.3
-MLINKS+= X509_dup.3 OSSL_CRMF_PBMPARAMETER_new.3
-MLINKS+= X509_dup.3 OSSL_CRMF_PKIPUBLICATIONINFO_free.3
-MLINKS+= X509_dup.3 OSSL_CRMF_PKIPUBLICATIONINFO_it.3
-MLINKS+= X509_dup.3 OSSL_CRMF_PKIPUBLICATIONINFO_new.3
-MLINKS+= X509_dup.3 OSSL_CRMF_SINGLEPUBINFO_free.3
-MLINKS+= X509_dup.3 OSSL_CRMF_SINGLEPUBINFO_it.3
-MLINKS+= X509_dup.3 OSSL_CRMF_SINGLEPUBINFO_new.3
+MLINKS+= OSSL_CRMF_MSG_set1_regInfo_certReq.3 OSSL_CRMF_MSG_get0_regInfo_certReq.3
+MLINKS+= OSSL_CRMF_MSG_set1_regInfo_certReq.3 OSSL_CRMF_MSG_get0_regInfo_utf8Pairs.3
+MLINKS+= OSSL_CRMF_MSG_set1_regInfo_certReq.3 OSSL_CRMF_MSG_set1_regInfo_utf8Pairs.3
MLINKS+= OSSL_CRMF_pbmp_new.3 OSSL_CRMF_pbm_new.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_do_all_provided.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_fetch.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_free.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get0_description.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get0_name.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get0_properties.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get0_provider.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get_params.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_gettable_params.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_is_a.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_names_do_all.3
+MLINKS+= OSSL_DECODER.3 OSSL_DECODER_up_ref.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_CLEANUP.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_CONSTRUCT.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_CTX_add_decoder.3
@@ -3039,33 +3179,33 @@ MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_CTX_set_construct_data.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_CTX_set_input_structure.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_CTX_set_input_type.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_CTX_set_params.3
-MLINKS+= OSSL_DECODER_CTX_new_for_pkey.3 OSSL_DECODER_CTX_set_passphrase.3
-MLINKS+= OSSL_DECODER_CTX_new_for_pkey.3 OSSL_DECODER_CTX_set_passphrase_cb.3
-MLINKS+= OSSL_DECODER_CTX_new_for_pkey.3 OSSL_DECODER_CTX_set_passphrase_ui.3
-MLINKS+= OSSL_DECODER_CTX_new_for_pkey.3 OSSL_DECODER_CTX_set_pem_password_cb.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_CTX_set_selection.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_INSTANCE.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_INSTANCE_get_decoder.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_INSTANCE_get_decoder_ctx.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_INSTANCE_get_input_structure.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_INSTANCE_get_input_type.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_do_all_provided.3
MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_export.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_fetch.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_free.3
+MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_settable_ctx_params.3
+MLINKS+= OSSL_DECODER_CTX_new_for_pkey.3 OSSL_DECODER_CTX_set_passphrase.3
+MLINKS+= OSSL_DECODER_CTX_new_for_pkey.3 OSSL_DECODER_CTX_set_passphrase_cb.3
+MLINKS+= OSSL_DECODER_CTX_new_for_pkey.3 OSSL_DECODER_CTX_set_passphrase_ui.3
+MLINKS+= OSSL_DECODER_CTX_new_for_pkey.3 OSSL_DECODER_CTX_set_pem_password_cb.3
MLINKS+= OSSL_DECODER_from_bio.3 OSSL_DECODER_from_data.3
MLINKS+= OSSL_DECODER_from_bio.3 OSSL_DECODER_from_fp.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get0_description.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get0_name.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get0_properties.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get0_provider.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_get_params.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_gettable_params.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_is_a.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_names_do_all.3
-MLINKS+= OSSL_DECODER_CTX.3 OSSL_DECODER_settable_ctx_params.3
-MLINKS+= OSSL_DECODER.3 OSSL_DECODER_up_ref.3
-MLINKS+= EC_GROUP_new.3 OSSL_EC_curve_nid2name.3
+MLINKS+= OSSL_DISPATCH.3 OSSL_DISPATCH_END.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_do_all_provided.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_fetch.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_free.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get0_description.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get0_name.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get0_properties.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get0_provider.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get_params.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_gettable_params.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_is_a.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_names_do_all.3
+MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_up_ref.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CLEANUP.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CONSTRUCT.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_add_encoder.3
@@ -3073,40 +3213,51 @@ MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_add_extra.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_free.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_get_num_encoders.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_new.3
-MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_cipher.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_set_cleanup.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_set_construct.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_set_construct_data.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_set_output_structure.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_set_output_type.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_set_params.3
-MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_passphrase.3
-MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_passphrase_cb.3
-MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_passphrase_ui.3
-MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_pem_password_cb.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_CTX_set_selection.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_INSTANCE.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_INSTANCE_get_encoder.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_INSTANCE_get_encoder_ctx.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_INSTANCE_get_output_structure.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_INSTANCE_get_output_type.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_do_all_provided.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_fetch.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_free.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get0_description.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get0_name.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get0_properties.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get0_provider.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_get_params.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_gettable_params.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_is_a.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_names_do_all.3
MLINKS+= OSSL_ENCODER_CTX.3 OSSL_ENCODER_settable_ctx_params.3
+MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_cipher.3
+MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_passphrase.3
+MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_passphrase_cb.3
+MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_passphrase_ui.3
+MLINKS+= OSSL_ENCODER_CTX_new_for_pkey.3 OSSL_ENCODER_CTX_set_pem_password_cb.3
MLINKS+= OSSL_ENCODER_to_bio.3 OSSL_ENCODER_to_data.3
MLINKS+= OSSL_ENCODER_to_bio.3 OSSL_ENCODER_to_fp.3
-MLINKS+= OSSL_ENCODER.3 OSSL_ENCODER_up_ref.3
+MLINKS+= OSSL_ERR_STATE_save.3 OSSL_ERR_STATE_free.3
+MLINKS+= OSSL_ERR_STATE_save.3 OSSL_ERR_STATE_new.3
+MLINKS+= OSSL_ERR_STATE_save.3 OSSL_ERR_STATE_restore.3
+MLINKS+= OSSL_ERR_STATE_save.3 OSSL_ERR_STATE_save_to_mark.3
MLINKS+= OSSL_ESS_check_signing_certs.3 OSSL_ESS_signing_cert_new_init.3
MLINKS+= OSSL_ESS_check_signing_certs.3 OSSL_ESS_signing_cert_v2_new_init.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_CTX_free.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_CTX_get_seq.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_CTX_set1_authpriv.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_CTX_set1_authpub.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_CTX_set1_ikme.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_CTX_set1_psk.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_CTX_set_seq.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_decap.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_encap.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_export.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_get_ciphertext_size.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_get_grease_value.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_get_public_encap_size.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_get_recommended_ikmelen.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_keygen.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_open.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_seal.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_str2suite.3
+MLINKS+= OSSL_HPKE_CTX_new.3 OSSL_HPKE_suite_check.3
MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_add1_header.3
MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_exchange.3
MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_free.3
@@ -3117,24 +3268,35 @@ MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_nbio_d2i.3
MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_new.3
MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_set1_req.3
MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_set_expected.3
+MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_set_max_response_hdr_lines.3
MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_set_max_response_length.3
MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_REQ_CTX_set_request_line.3
+MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_is_alive.3
+MLINKS+= OSSL_HTTP_parse_url.3 OCSP_parse_url.3
MLINKS+= OSSL_HTTP_parse_url.3 OSSL_HTTP_adapt_proxy.3
+MLINKS+= OSSL_HTTP_parse_url.3 OSSL_parse_url.3
MLINKS+= OSSL_HTTP_transfer.3 OSSL_HTTP_bio_cb_t.3
MLINKS+= OSSL_HTTP_transfer.3 OSSL_HTTP_close.3
MLINKS+= OSSL_HTTP_transfer.3 OSSL_HTTP_exchange.3
MLINKS+= OSSL_HTTP_transfer.3 OSSL_HTTP_get.3
-MLINKS+= OSSL_HTTP_REQ_CTX.3 OSSL_HTTP_is_alive.3
MLINKS+= OSSL_HTTP_transfer.3 OSSL_HTTP_open.3
MLINKS+= OSSL_HTTP_transfer.3 OSSL_HTTP_proxy_connect.3
MLINKS+= OSSL_HTTP_transfer.3 OSSL_HTTP_set1_request.3
+MLINKS+= OSSL_IETF_ATTR_SYNTAX.3 OSSL_IETF_ATTR_SYNTAX_add1_value.3
+MLINKS+= OSSL_IETF_ATTR_SYNTAX.3 OSSL_IETF_ATTR_SYNTAX_get0_policyAuthority.3
+MLINKS+= OSSL_IETF_ATTR_SYNTAX.3 OSSL_IETF_ATTR_SYNTAX_get0_value.3
+MLINKS+= OSSL_IETF_ATTR_SYNTAX.3 OSSL_IETF_ATTR_SYNTAX_get_value_num.3
+MLINKS+= OSSL_IETF_ATTR_SYNTAX.3 OSSL_IETF_ATTR_SYNTAX_set0_policyAuthority.3
+MLINKS+= OSSL_INDICATOR_set_callback.3 OSSL_INDICATOR_get_callback.3
MLINKS+= OSSL_LIB_CTX.3 OSSL_LIB_CTX_free.3
MLINKS+= OSSL_LIB_CTX.3 OSSL_LIB_CTX_get0_global_default.3
+MLINKS+= OSSL_LIB_CTX.3 OSSL_LIB_CTX_get_data.3
MLINKS+= OSSL_LIB_CTX.3 OSSL_LIB_CTX_load_config.3
MLINKS+= OSSL_LIB_CTX.3 OSSL_LIB_CTX_new.3
MLINKS+= OSSL_LIB_CTX.3 OSSL_LIB_CTX_new_child.3
MLINKS+= OSSL_LIB_CTX.3 OSSL_LIB_CTX_new_from_dispatch.3
MLINKS+= OSSL_LIB_CTX.3 OSSL_LIB_CTX_set0_default.3
+MLINKS+= OSSL_LIB_CTX_set_conf_diagnostics.3 OSSL_LIB_CTX_get_conf_diagnostics.3
MLINKS+= OSSL_PARAM_BLD.3 OSSL_PARAM_BLD_free.3
MLINKS+= OSSL_PARAM_BLD.3 OSSL_PARAM_BLD_new.3
MLINKS+= OSSL_PARAM_BLD.3 OSSL_PARAM_BLD_push_BN.3
@@ -3155,6 +3317,8 @@ MLINKS+= OSSL_PARAM_BLD.3 OSSL_PARAM_BLD_push_ulong.3
MLINKS+= OSSL_PARAM_BLD.3 OSSL_PARAM_BLD_push_utf8_ptr.3
MLINKS+= OSSL_PARAM_BLD.3 OSSL_PARAM_BLD_push_utf8_string.3
MLINKS+= OSSL_PARAM_BLD.3 OSSL_PARAM_BLD_to_param.3
+MLINKS+= OSSL_PARAM_dup.3 OSSL_PARAM_free.3
+MLINKS+= OSSL_PARAM_dup.3 OSSL_PARAM_merge.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_BN.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_DEFN.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_END.3
@@ -3177,7 +3341,6 @@ MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_construct_ulong.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_construct_utf8_ptr.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_construct_utf8_string.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_double.3
-MLINKS+= OSSL_PARAM_dup.3 OSSL_PARAM_free.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_get_BN.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_get_double.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_get_int.3
@@ -3201,7 +3364,6 @@ MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_int64.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_locate.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_locate_const.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_long.3
-MLINKS+= OSSL_PARAM_dup.3 OSSL_PARAM_merge.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_modified.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_octet_ptr.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_octet_string.3
@@ -3230,29 +3392,35 @@ MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_uint64.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_ulong.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_utf8_ptr.3
MLINKS+= OSSL_PARAM_int.3 OSSL_PARAM_utf8_string.3
-MLINKS+= OSSL_CALLBACK.3 OSSL_PASSPHRASE_CALLBACK.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_add_builtin.3
+MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_add_conf_parameter.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_available.3
+MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_conf_get_bool.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_do_all.3
+MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_get0_default_search_path.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_get0_dispatch.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_get0_name.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_get0_provider_ctx.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_get_capabilities.3
+MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_get_conf_parameters.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_get_params.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_gettable_params.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_load.3
+MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_load_ex.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_query_operation.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_self_test.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_set_default_search_path.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_try_load.3
+MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_try_load_ex.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_unload.3
MLINKS+= OSSL_PROVIDER.3 OSSL_PROVIDER_unquery_operation.3
+MLINKS+= OSSL_QUIC_client_method.3 OSSL_QUIC_client_thread_method.3
+MLINKS+= OSSL_QUIC_client_method.3 OSSL_QUIC_server_method.3
MLINKS+= OSSL_SELF_TEST_new.3 OSSL_SELF_TEST_free.3
-MLINKS+= OSSL_SELF_TEST_set_callback.3 OSSL_SELF_TEST_get_callback.3
MLINKS+= OSSL_SELF_TEST_new.3 OSSL_SELF_TEST_onbegin.3
MLINKS+= OSSL_SELF_TEST_new.3 OSSL_SELF_TEST_oncorrupt_byte.3
MLINKS+= OSSL_SELF_TEST_new.3 OSSL_SELF_TEST_onend.3
-MLINKS+= OSSL_STORE_open.3 OSSL_STORE_CTX.3
+MLINKS+= OSSL_SELF_TEST_set_callback.3 OSSL_SELF_TEST_get_callback.3
MLINKS+= OSSL_STORE_INFO.3 OSSL_STORE_INFO_free.3
MLINKS+= OSSL_STORE_INFO.3 OSSL_STORE_INFO_get0_CERT.3
MLINKS+= OSSL_STORE_INFO.3 OSSL_STORE_INFO_get0_CRL.3
@@ -3302,6 +3470,18 @@ MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_LOADER_set_load.3
MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_LOADER_set_open.3
MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_LOADER_set_open_ex.3
MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_LOADER_up_ref.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_attach_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_close_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_ctrl_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_eof_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_error_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_expect_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_find_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_load_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_open_ex_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_open_fn.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_register_loader.3
+MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_unregister_loader.3
MLINKS+= OSSL_STORE_SEARCH.3 OSSL_STORE_SEARCH_by_alias.3
MLINKS+= OSSL_STORE_SEARCH.3 OSSL_STORE_SEARCH_by_issuer_serial.3
MLINKS+= OSSL_STORE_SEARCH.3 OSSL_STORE_SEARCH_by_key_fingerprint.3
@@ -3313,27 +3493,17 @@ MLINKS+= OSSL_STORE_SEARCH.3 OSSL_STORE_SEARCH_get0_name.3
MLINKS+= OSSL_STORE_SEARCH.3 OSSL_STORE_SEARCH_get0_serial.3
MLINKS+= OSSL_STORE_SEARCH.3 OSSL_STORE_SEARCH_get0_string.3
MLINKS+= OSSL_STORE_SEARCH.3 OSSL_STORE_SEARCH_get_type.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_attach_fn.3
+MLINKS+= OSSL_STORE_expect.3 OSSL_STORE_find.3
+MLINKS+= OSSL_STORE_expect.3 OSSL_STORE_supports_search.3
+MLINKS+= OSSL_STORE_open.3 OSSL_STORE_CTX.3
MLINKS+= OSSL_STORE_open.3 OSSL_STORE_close.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_close_fn.3
MLINKS+= OSSL_STORE_open.3 OSSL_STORE_ctrl.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_ctrl_fn.3
+MLINKS+= OSSL_STORE_open.3 OSSL_STORE_delete.3
MLINKS+= OSSL_STORE_open.3 OSSL_STORE_eof.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_eof_fn.3
MLINKS+= OSSL_STORE_open.3 OSSL_STORE_error.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_error_fn.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_expect_fn.3
-MLINKS+= OSSL_STORE_expect.3 OSSL_STORE_find.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_find_fn.3
MLINKS+= OSSL_STORE_open.3 OSSL_STORE_load.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_load_fn.3
MLINKS+= OSSL_STORE_open.3 OSSL_STORE_open_ex.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_open_ex_fn.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_open_fn.3
MLINKS+= OSSL_STORE_open.3 OSSL_STORE_post_process_info_fn.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_register_loader.3
-MLINKS+= OSSL_STORE_expect.3 OSSL_STORE_supports_search.3
-MLINKS+= OSSL_STORE_LOADER.3 OSSL_STORE_unregister_loader.3
MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE.3
MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE1.3
MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE2.3
@@ -3349,48 +3519,88 @@ MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE_BEGIN.3
MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE_CANCEL.3
MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE_ENABLED.3
MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE_END.3
-MLINKS+= SSL_CTX_set_cipher_list.3 OSSL_default_cipher_list.3
-MLINKS+= SSL_CTX_set_cipher_list.3 OSSL_default_ciphersuites.3
-MLINKS+= OSSL_HTTP_parse_url.3 OSSL_parse_url.3
+MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE_STRING.3
+MLINKS+= OSSL_trace_enabled.3 OSSL_TRACE_STRING_MAX.3
MLINKS+= OSSL_trace_enabled.3 OSSL_trace_begin.3
-MLINKS+= OSSL_trace_set_channel.3 OSSL_trace_cb.3
MLINKS+= OSSL_trace_enabled.3 OSSL_trace_end.3
+MLINKS+= OSSL_trace_enabled.3 OSSL_trace_string.3
MLINKS+= OSSL_trace_get_category_num.3 OSSL_trace_get_category_name.3
+MLINKS+= OSSL_trace_set_channel.3 OSSL_trace_cb.3
MLINKS+= OSSL_trace_set_channel.3 OSSL_trace_set_callback.3
MLINKS+= OSSL_trace_set_channel.3 OSSL_trace_set_prefix.3
MLINKS+= OSSL_trace_set_channel.3 OSSL_trace_set_suffix.3
-MLINKS+= X509_dup.3 OTHERNAME_free.3
-MLINKS+= X509_dup.3 OTHERNAME_new.3
+MLINKS+= OpenSSL_add_all_algorithms.3 EVP_cleanup.3
MLINKS+= OpenSSL_add_all_algorithms.3 OpenSSL_add_all_ciphers.3
MLINKS+= OpenSSL_add_all_algorithms.3 OpenSSL_add_all_digests.3
-MLINKS+= SSL_library_init.3 OpenSSL_add_ssl_algorithms.3
+MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_BUILD_METADATA.3
+MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_MAJOR.3
+MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_MINOR.3
+MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_NUMBER.3
+MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_PATCH.3
+MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_PREREQ.3
+MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_PRE_RELEASE.3
+MLINKS+= OpenSSL_version.3 OPENSSL_VERSION_TEXT.3
+MLINKS+= OpenSSL_version.3 OPENSSL_info.3
+MLINKS+= OpenSSL_version.3 OPENSSL_version_build_metadata.3
+MLINKS+= OpenSSL_version.3 OPENSSL_version_major.3
+MLINKS+= OpenSSL_version.3 OPENSSL_version_minor.3
+MLINKS+= OpenSSL_version.3 OPENSSL_version_patch.3
+MLINKS+= OpenSSL_version.3 OPENSSL_version_pre_release.3
MLINKS+= OpenSSL_version.3 OpenSSL_version_num.3
-MLINKS+= X509_dup.3 PBE2PARAM_free.3
-MLINKS+= X509_dup.3 PBE2PARAM_new.3
-MLINKS+= X509_dup.3 PBEPARAM_free.3
-MLINKS+= X509_dup.3 PBEPARAM_new.3
-MLINKS+= X509_dup.3 PBKDF2PARAM_free.3
-MLINKS+= X509_dup.3 PBKDF2PARAM_new.3
-MLINKS+= PEM_read_bio_ex.3 PEM_FLAG_EAY_COMPATIBLE.3
-MLINKS+= PEM_read_bio_ex.3 PEM_FLAG_ONLY_B64.3
-MLINKS+= PEM_read_bio_ex.3 PEM_FLAG_SECURE.3
MLINKS+= PEM_X509_INFO_read_bio_ex.3 PEM_X509_INFO_read.3
MLINKS+= PEM_X509_INFO_read_bio_ex.3 PEM_X509_INFO_read_bio.3
MLINKS+= PEM_X509_INFO_read_bio_ex.3 PEM_X509_INFO_read_ex.3
MLINKS+= PEM_bytes_read_bio.3 PEM_bytes_read_bio_secmem.3
+MLINKS+= PEM_read.3 PEM_ASN1_write.3
+MLINKS+= PEM_read.3 PEM_ASN1_write_bio.3
+MLINKS+= PEM_read.3 PEM_ASN1_write_bio_ctx.3
MLINKS+= PEM_read.3 PEM_do_header.3
MLINKS+= PEM_read.3 PEM_get_EVP_CIPHER_INFO.3
-MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_DHparams.3
-MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_DSAPrivateKey.3
-MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_DSA_PUBKEY.3
-MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_DSAparams.3
+MLINKS+= PEM_read.3 PEM_read_bio.3
+MLINKS+= PEM_read.3 PEM_write.3
+MLINKS+= PEM_read.3 PEM_write_bio.3
+MLINKS+= PEM_read_CMS.3 DECLARE_PEM_rw.3
MLINKS+= PEM_read_CMS.3 PEM_read_ECPKParameters.3
MLINKS+= PEM_read_CMS.3 PEM_read_ECPrivateKey.3
MLINKS+= PEM_read_CMS.3 PEM_read_EC_PUBKEY.3
MLINKS+= PEM_read_CMS.3 PEM_read_NETSCAPE_CERT_SEQUENCE.3
-MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_PKCS7.3
MLINKS+= PEM_read_CMS.3 PEM_read_PKCS8.3
MLINKS+= PEM_read_CMS.3 PEM_read_PKCS8_PRIV_KEY_INFO.3
+MLINKS+= PEM_read_CMS.3 PEM_read_SSL_SESSION.3
+MLINKS+= PEM_read_CMS.3 PEM_read_X509_PUBKEY.3
+MLINKS+= PEM_read_CMS.3 PEM_read_bio_CMS.3
+MLINKS+= PEM_read_CMS.3 PEM_read_bio_ECPKParameters.3
+MLINKS+= PEM_read_CMS.3 PEM_read_bio_EC_PUBKEY.3
+MLINKS+= PEM_read_CMS.3 PEM_read_bio_NETSCAPE_CERT_SEQUENCE.3
+MLINKS+= PEM_read_CMS.3 PEM_read_bio_PKCS8.3
+MLINKS+= PEM_read_CMS.3 PEM_read_bio_PKCS8_PRIV_KEY_INFO.3
+MLINKS+= PEM_read_CMS.3 PEM_read_bio_SSL_SESSION.3
+MLINKS+= PEM_read_CMS.3 PEM_read_bio_X509_PUBKEY.3
+MLINKS+= PEM_read_CMS.3 PEM_write_CMS.3
+MLINKS+= PEM_read_CMS.3 PEM_write_DHxparams.3
+MLINKS+= PEM_read_CMS.3 PEM_write_ECPKParameters.3
+MLINKS+= PEM_read_CMS.3 PEM_write_ECPrivateKey.3
+MLINKS+= PEM_read_CMS.3 PEM_write_EC_PUBKEY.3
+MLINKS+= PEM_read_CMS.3 PEM_write_NETSCAPE_CERT_SEQUENCE.3
+MLINKS+= PEM_read_CMS.3 PEM_write_PKCS8.3
+MLINKS+= PEM_read_CMS.3 PEM_write_PKCS8_PRIV_KEY_INFO.3
+MLINKS+= PEM_read_CMS.3 PEM_write_SSL_SESSION.3
+MLINKS+= PEM_read_CMS.3 PEM_write_X509_PUBKEY.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_CMS.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_DHxparams.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_ECPKParameters.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_ECPrivateKey.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_EC_PUBKEY.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_NETSCAPE_CERT_SEQUENCE.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_PKCS8.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_PKCS8_PRIV_KEY_INFO.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_SSL_SESSION.3
+MLINKS+= PEM_read_CMS.3 PEM_write_bio_X509_PUBKEY.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_DHparams.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_DSAPrivateKey.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_DSA_PUBKEY.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_DSAparams.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_PKCS7.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_PUBKEY_ex.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_PrivateKey.3
@@ -3398,24 +3608,16 @@ MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_PrivateKey_ex.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_RSAPrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_RSAPublicKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_RSA_PUBKEY.3
-MLINKS+= PEM_read_CMS.3 PEM_read_SSL_SESSION.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_X509.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_X509_ACERT.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_X509_AUX.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_X509_CRL.3
-MLINKS+= PEM_read_CMS.3 PEM_read_X509_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_X509_REQ.3
-MLINKS+= PEM_read.3 PEM_read_bio.3
-MLINKS+= PEM_read_CMS.3 PEM_read_bio_CMS.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_DHparams.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_DSAPrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_DSA_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_DSAparams.3
-MLINKS+= PEM_read_CMS.3 PEM_read_bio_ECPKParameters.3
-MLINKS+= PEM_read_CMS.3 PEM_read_bio_EC_PUBKEY.3
-MLINKS+= PEM_read_CMS.3 PEM_read_bio_NETSCAPE_CERT_SEQUENCE.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_PKCS7.3
-MLINKS+= PEM_read_CMS.3 PEM_read_bio_PKCS8.3
-MLINKS+= PEM_read_CMS.3 PEM_read_bio_PKCS8_PRIV_KEY_INFO.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_PUBKEY_ex.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_Parameters.3
@@ -3424,28 +3626,18 @@ MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_PrivateKey_ex.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_RSAPrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_RSAPublicKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_RSA_PUBKEY.3
-MLINKS+= PEM_read_CMS.3 PEM_read_bio_SSL_SESSION.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_X509.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_X509_ACERT.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_X509_AUX.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_X509_CRL.3
-MLINKS+= PEM_read_CMS.3 PEM_read_bio_X509_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_read_bio_X509_REQ.3
-MLINKS+= PEM_read.3 PEM_write.3
-MLINKS+= PEM_read_CMS.3 PEM_write_CMS.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_DHparams.3
-MLINKS+= PEM_read_CMS.3 PEM_write_DHxparams.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_DSAPrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_DSA_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_DSAparams.3
-MLINKS+= PEM_read_CMS.3 PEM_write_ECPKParameters.3
-MLINKS+= PEM_read_CMS.3 PEM_write_ECPrivateKey.3
-MLINKS+= PEM_read_CMS.3 PEM_write_EC_PUBKEY.3
-MLINKS+= PEM_read_CMS.3 PEM_write_NETSCAPE_CERT_SEQUENCE.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_PKCS7.3
-MLINKS+= PEM_read_CMS.3 PEM_write_PKCS8.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_PKCS8PrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_PKCS8PrivateKey_nid.3
-MLINKS+= PEM_read_CMS.3 PEM_write_PKCS8_PRIV_KEY_INFO.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_PUBKEY_ex.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_PrivateKey.3
@@ -3453,29 +3645,19 @@ MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_PrivateKey_ex.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_RSAPrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_RSAPublicKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_RSA_PUBKEY.3
-MLINKS+= PEM_read_CMS.3 PEM_write_SSL_SESSION.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_X509.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_X509_ACERT.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_X509_AUX.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_X509_CRL.3
-MLINKS+= PEM_read_CMS.3 PEM_write_X509_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_X509_REQ.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_X509_REQ_NEW.3
-MLINKS+= PEM_read.3 PEM_write_bio.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_CMS.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_DHparams.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_DHxparams.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_DSAPrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_DSA_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_DSAparams.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_ECPKParameters.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_ECPrivateKey.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_EC_PUBKEY.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_NETSCAPE_CERT_SEQUENCE.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_PKCS7.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_PKCS8.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_PKCS8PrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_PKCS8PrivateKey_nid.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_PKCS8_PRIV_KEY_INFO.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_PUBKEY_ex.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_Parameters.3
@@ -3485,25 +3667,26 @@ MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_PrivateKey_traditional.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_RSAPrivateKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_RSAPublicKey.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_RSA_PUBKEY.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_SSL_SESSION.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_X509.3
+MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_X509_ACERT.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_X509_AUX.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_X509_CRL.3
-MLINKS+= PEM_read_CMS.3 PEM_write_bio_X509_PUBKEY.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_X509_REQ.3
MLINKS+= PEM_read_bio_PrivateKey.3 PEM_write_bio_X509_REQ_NEW.3
-MLINKS+= X509_dup.3 PKCS12_BAGS_free.3
-MLINKS+= X509_dup.3 PKCS12_BAGS_new.3
-MLINKS+= X509_dup.3 PKCS12_MAC_DATA_free.3
-MLINKS+= X509_dup.3 PKCS12_MAC_DATA_new.3
+MLINKS+= PEM_read_bio_PrivateKey.3 pem_password_cb.3
+MLINKS+= PEM_read_bio_ex.3 PEM_FLAG_EAY_COMPATIBLE.3
+MLINKS+= PEM_read_bio_ex.3 PEM_FLAG_ONLY_B64.3
+MLINKS+= PEM_read_bio_ex.3 PEM_FLAG_SECURE.3
MLINKS+= PKCS12_PBE_keyivgen.3 PKCS12_PBE_keyivgen_ex.3
+MLINKS+= PKCS12_PBE_keyivgen.3 PKCS12_pbe_crypt.3
+MLINKS+= PKCS12_PBE_keyivgen.3 PKCS12_pbe_crypt_ex.3
MLINKS+= PKCS12_SAFEBAG_create_cert.3 PKCS12_SAFEBAG_create0_p8inf.3
MLINKS+= PKCS12_SAFEBAG_create_cert.3 PKCS12_SAFEBAG_create0_pkcs8.3
MLINKS+= PKCS12_SAFEBAG_create_cert.3 PKCS12_SAFEBAG_create_crl.3
MLINKS+= PKCS12_SAFEBAG_create_cert.3 PKCS12_SAFEBAG_create_pkcs8_encrypt.3
MLINKS+= PKCS12_SAFEBAG_create_cert.3 PKCS12_SAFEBAG_create_pkcs8_encrypt_ex.3
MLINKS+= PKCS12_SAFEBAG_create_cert.3 PKCS12_SAFEBAG_create_secret.3
-MLINKS+= X509_dup.3 PKCS12_SAFEBAG_free.3
+MLINKS+= PKCS12_SAFEBAG_get0_attrs.3 PKCS12_get_attr_gen.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get0_attr.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get0_bag_obj.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get0_bag_type.3
@@ -3511,23 +3694,29 @@ MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get0_p8inf.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get0_pkcs8.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get0_safes.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get0_type.3
+MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get1_cert_ex.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get1_crl.3
+MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get1_crl_ex.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get_bag_nid.3
MLINKS+= PKCS12_SAFEBAG_get1_cert.3 PKCS12_SAFEBAG_get_nid.3
-MLINKS+= X509_dup.3 PKCS12_SAFEBAG_new.3
MLINKS+= PKCS12_add1_attr_by_NID.3 PKCS12_add1_attr_by_txt.3
-MLINKS+= PKCS12_add_friendlyname_asc.3 PKCS12_add_friendlyname_uni.3
-MLINKS+= PKCS12_add_friendlyname_asc.3 PKCS12_add_friendlyname_utf8.3
MLINKS+= PKCS12_add_cert.3 PKCS12_add_key.3
MLINKS+= PKCS12_add_cert.3 PKCS12_add_key_ex.3
+MLINKS+= PKCS12_add_cert.3 PKCS12_add_secret.3
+MLINKS+= PKCS12_add_friendlyname_asc.3 PKCS12_add_friendlyname_uni.3
+MLINKS+= PKCS12_add_friendlyname_asc.3 PKCS12_add_friendlyname_utf8.3
MLINKS+= PKCS12_add_safe.3 PKCS12_add_safe_ex.3
MLINKS+= PKCS12_add_safe.3 PKCS12_add_safes.3
MLINKS+= PKCS12_add_safe.3 PKCS12_add_safes_ex.3
-MLINKS+= PKCS12_add_cert.3 PKCS12_add_secret.3
+MLINKS+= PKCS12_create.3 PKCS12_create_cb.3
MLINKS+= PKCS12_create.3 PKCS12_create_ex.3
+MLINKS+= PKCS12_create.3 PKCS12_create_ex2.3
MLINKS+= PKCS12_decrypt_skey.3 PKCS12_decrypt_skey_ex.3
-MLINKS+= X509_dup.3 PKCS12_free.3
-MLINKS+= PKCS12_SAFEBAG_get0_attrs.3 PKCS12_get_attr_gen.3
+MLINKS+= PKCS12_gen_mac.3 PKCS12_get0_mac.3
+MLINKS+= PKCS12_gen_mac.3 PKCS12_set_mac.3
+MLINKS+= PKCS12_gen_mac.3 PKCS12_set_pbmac1_pbkdf2.3
+MLINKS+= PKCS12_gen_mac.3 PKCS12_setup_mac.3
+MLINKS+= PKCS12_gen_mac.3 PKCS12_verify_mac.3
MLINKS+= PKCS12_init.3 PKCS12_init_ex.3
MLINKS+= PKCS12_item_decrypt_d2i.3 PKCS12_item_decrypt_d2i_ex.3
MLINKS+= PKCS12_item_decrypt_d2i.3 PKCS12_item_i2d_encrypt.3
@@ -3537,15 +3726,10 @@ MLINKS+= PKCS12_key_gen_utf8_ex.3 PKCS12_key_gen_asc_ex.3
MLINKS+= PKCS12_key_gen_utf8_ex.3 PKCS12_key_gen_uni.3
MLINKS+= PKCS12_key_gen_utf8_ex.3 PKCS12_key_gen_uni_ex.3
MLINKS+= PKCS12_key_gen_utf8_ex.3 PKCS12_key_gen_utf8.3
-MLINKS+= X509_dup.3 PKCS12_new.3
MLINKS+= PKCS12_pack_p7encdata.3 PKCS12_pack_p7encdata_ex.3
-MLINKS+= PKCS12_PBE_keyivgen.3 PKCS12_pbe_crypt.3
-MLINKS+= PKCS12_PBE_keyivgen.3 PKCS12_pbe_crypt_ex.3
-MLINKS+= PKCS12_gen_mac.3 PKCS12_set_mac.3
-MLINKS+= PKCS12_gen_mac.3 PKCS12_setup_mac.3
-MLINKS+= PKCS12_gen_mac.3 PKCS12_verify_mac.3
+MLINKS+= PKCS5_PBE_keyivgen.3 EVP_PBE_scrypt.3
+MLINKS+= PKCS5_PBE_keyivgen.3 EVP_PBE_scrypt_ex.3
MLINKS+= PKCS5_PBE_keyivgen.3 PKCS5_PBE_keyivgen_ex.3
-MLINKS+= PKCS5_PBKDF2_HMAC.3 PKCS5_PBKDF2_HMAC_SHA1.3
MLINKS+= PKCS5_PBE_keyivgen.3 PKCS5_pbe2_set.3
MLINKS+= PKCS5_PBE_keyivgen.3 PKCS5_pbe2_set_iv.3
MLINKS+= PKCS5_PBE_keyivgen.3 PKCS5_pbe2_set_iv_ex.3
@@ -3560,114 +3744,52 @@ MLINKS+= PKCS5_PBE_keyivgen.3 PKCS5_v2_PBE_keyivgen.3
MLINKS+= PKCS5_PBE_keyivgen.3 PKCS5_v2_PBE_keyivgen_ex.3
MLINKS+= PKCS5_PBE_keyivgen.3 PKCS5_v2_scrypt_keyivgen.3
MLINKS+= PKCS5_PBE_keyivgen.3 PKCS5_v2_scrypt_keyivgen_ex.3
-MLINKS+= X509_dup.3 PKCS7_DIGEST_free.3
-MLINKS+= X509_dup.3 PKCS7_DIGEST_new.3
-MLINKS+= X509_dup.3 PKCS7_ENCRYPT_free.3
-MLINKS+= X509_dup.3 PKCS7_ENCRYPT_new.3
-MLINKS+= X509_dup.3 PKCS7_ENC_CONTENT_free.3
-MLINKS+= X509_dup.3 PKCS7_ENC_CONTENT_new.3
-MLINKS+= X509_dup.3 PKCS7_ENVELOPE_free.3
-MLINKS+= X509_dup.3 PKCS7_ENVELOPE_new.3
-MLINKS+= X509_digest.3 PKCS7_ISSUER_AND_SERIAL_digest.3
-MLINKS+= X509_dup.3 PKCS7_ISSUER_AND_SERIAL_free.3
-MLINKS+= X509_dup.3 PKCS7_ISSUER_AND_SERIAL_new.3
-MLINKS+= X509_dup.3 PKCS7_RECIP_INFO_free.3
-MLINKS+= X509_dup.3 PKCS7_RECIP_INFO_new.3
-MLINKS+= X509_dup.3 PKCS7_SIGNED_free.3
-MLINKS+= X509_dup.3 PKCS7_SIGNED_new.3
-MLINKS+= X509_dup.3 PKCS7_SIGNER_INFO_free.3
-MLINKS+= X509_dup.3 PKCS7_SIGNER_INFO_new.3
-MLINKS+= X509_dup.3 PKCS7_SIGN_ENVELOPE_free.3
-MLINKS+= X509_dup.3 PKCS7_SIGN_ENVELOPE_new.3
+MLINKS+= PKCS5_PBKDF2_HMAC.3 PKCS5_PBKDF2_HMAC_SHA1.3
+MLINKS+= PKCS7_encrypt.3 PKCS7_encrypt_ex.3
+MLINKS+= PKCS7_sign.3 PKCS7_sign_ex.3
MLINKS+= PKCS7_sign_add_signer.3 PKCS7_add_certificate.3
MLINKS+= PKCS7_sign_add_signer.3 PKCS7_add_crl.3
-MLINKS+= X509_dup.3 PKCS7_dup.3
-MLINKS+= PKCS7_encrypt.3 PKCS7_encrypt_ex.3
-MLINKS+= X509_dup.3 PKCS7_free.3
MLINKS+= PKCS7_verify.3 PKCS7_get0_signers.3
-MLINKS+= X509_dup.3 PKCS7_new.3
-MLINKS+= X509_dup.3 PKCS7_new_ex.3
-MLINKS+= X509_dup.3 PKCS7_print_ctx.3
-MLINKS+= PKCS7_sign.3 PKCS7_sign_ex.3
-MLINKS+= X509_dup.3 PKCS8_PRIV_KEY_INFO_free.3
-MLINKS+= X509_dup.3 PKCS8_PRIV_KEY_INFO_new.3
MLINKS+= PKCS8_encrypt.3 PKCS8_decrypt.3
MLINKS+= PKCS8_encrypt.3 PKCS8_decrypt_ex.3
MLINKS+= PKCS8_encrypt.3 PKCS8_encrypt_ex.3
+MLINKS+= PKCS8_encrypt.3 PKCS8_set0_pbe.3
+MLINKS+= PKCS8_encrypt.3 PKCS8_set0_pbe_ex.3
MLINKS+= PKCS8_pkey_add1_attr.3 PKCS8_pkey_add1_attr_by_NID.3
MLINKS+= PKCS8_pkey_add1_attr.3 PKCS8_pkey_add1_attr_by_OBJ.3
MLINKS+= PKCS8_pkey_add1_attr.3 PKCS8_pkey_get0_attrs.3
-MLINKS+= PKCS8_encrypt.3 PKCS8_set0_pbe.3
-MLINKS+= PKCS8_encrypt.3 PKCS8_set0_pbe_ex.3
-MLINKS+= X509_dup.3 PKEY_USAGE_PERIOD_free.3
-MLINKS+= X509_dup.3 PKEY_USAGE_PERIOD_new.3
-MLINKS+= X509_dup.3 POLICYINFO_free.3
-MLINKS+= X509_dup.3 POLICYINFO_new.3
-MLINKS+= X509_dup.3 POLICYQUALINFO_free.3
-MLINKS+= X509_dup.3 POLICYQUALINFO_new.3
-MLINKS+= X509_dup.3 POLICY_CONSTRAINTS_free.3
-MLINKS+= X509_dup.3 POLICY_CONSTRAINTS_new.3
-MLINKS+= X509_dup.3 POLICY_MAPPING_free.3
-MLINKS+= X509_dup.3 POLICY_MAPPING_new.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFOS.3
-MLINKS+= X509_dup.3 PROFESSION_INFOS_free.3
-MLINKS+= X509_dup.3 PROFESSION_INFOS_new.3
-MLINKS+= X509_dup.3 PROFESSION_INFO_free.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_addProfessionInfo.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_namingAuthority.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_professionItems.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_professionOIDs.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_get0_registrationNumber.3
-MLINKS+= X509_dup.3 PROFESSION_INFO_new.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_addProfessionInfo.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_namingAuthority.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_professionItems.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_professionOIDs.3
-MLINKS+= ADMISSIONS.3 PROFESSION_INFO_set0_registrationNumber.3
-MLINKS+= X509_dup.3 PROXY_CERT_INFO_EXTENSION_free.3
-MLINKS+= X509_dup.3 PROXY_CERT_INFO_EXTENSION_new.3
-MLINKS+= X509_dup.3 PROXY_POLICY_free.3
-MLINKS+= X509_dup.3 PROXY_POLICY_new.3
-MLINKS+= RAND_set_rand_method.3 RAND_OpenSSL.3
-MLINKS+= RAND_bytes.3 RAND_bytes_ex.3
-MLINKS+= RAND_egd.3 RAND_egd_bytes.3
MLINKS+= RAND_add.3 RAND_event.3
-MLINKS+= RAND_load_file.3 RAND_file_name.3
-MLINKS+= RAND_get0_primary.3 RAND_get0_private.3
-MLINKS+= RAND_get0_primary.3 RAND_get0_public.3
-MLINKS+= RAND_set_rand_method.3 RAND_get_rand_method.3
MLINKS+= RAND_add.3 RAND_keep_random_devices_open.3
MLINKS+= RAND_add.3 RAND_poll.3
+MLINKS+= RAND_add.3 RAND_screen.3
+MLINKS+= RAND_add.3 RAND_seed.3
+MLINKS+= RAND_add.3 RAND_status.3
+MLINKS+= RAND_bytes.3 RAND_bytes_ex.3
MLINKS+= RAND_bytes.3 RAND_priv_bytes.3
MLINKS+= RAND_bytes.3 RAND_priv_bytes_ex.3
MLINKS+= RAND_bytes.3 RAND_pseudo_bytes.3
+MLINKS+= RAND_bytes.3 RAND_set1_random_provider.3
+MLINKS+= RAND_egd.3 RAND_egd_bytes.3
MLINKS+= RAND_egd.3 RAND_query_egd_bytes.3
-MLINKS+= RAND_add.3 RAND_screen.3
-MLINKS+= RAND_add.3 RAND_seed.3
-MLINKS+= RAND_set_DRBG_type.3 RAND_set_seed_source_type.3
-MLINKS+= RAND_add.3 RAND_status.3
+MLINKS+= RAND_get0_primary.3 RAND_get0_private.3
+MLINKS+= RAND_get0_primary.3 RAND_get0_public.3
+MLINKS+= RAND_get0_primary.3 RAND_set0_private.3
+MLINKS+= RAND_get0_primary.3 RAND_set0_public.3
+MLINKS+= RAND_load_file.3 RAND_file_name.3
MLINKS+= RAND_load_file.3 RAND_write_file.3
+MLINKS+= RAND_set_DRBG_type.3 RAND_set_seed_source_type.3
+MLINKS+= RAND_set_rand_method.3 RAND_OpenSSL.3
+MLINKS+= RAND_set_rand_method.3 RAND_get_rand_method.3
MLINKS+= RC4_set_key.3 RC4.3
MLINKS+= RIPEMD160_Init.3 RIPEMD160.3
MLINKS+= RIPEMD160_Init.3 RIPEMD160_Final.3
MLINKS+= RIPEMD160_Init.3 RIPEMD160_Update.3
-MLINKS+= X509_dup.3 RSAPrivateKey_dup.3
-MLINKS+= X509_dup.3 RSAPublicKey_dup.3
-MLINKS+= X509_dup.3 RSA_OAEP_PARAMS_free.3
-MLINKS+= X509_dup.3 RSA_OAEP_PARAMS_new.3
-MLINKS+= RSA_set_method.3 RSA_PKCS1_OpenSSL.3
-MLINKS+= X509_dup.3 RSA_PSS_PARAMS_dup.3
-MLINKS+= X509_dup.3 RSA_PSS_PARAMS_free.3
-MLINKS+= X509_dup.3 RSA_PSS_PARAMS_new.3
-MLINKS+= RSA_size.3 RSA_bits.3
MLINKS+= RSA_blinding_on.3 RSA_blinding_off.3
MLINKS+= RSA_check_key.3 RSA_check_key_ex.3
-MLINKS+= RSA_get0_key.3 RSA_clear_flags.3
-MLINKS+= RSA_set_method.3 RSA_flags.3
-MLINKS+= RSA_new.3 RSA_free.3
+MLINKS+= RSA_generate_key.3 EVP_RSA_gen.3
MLINKS+= RSA_generate_key.3 RSA_generate_key_ex.3
MLINKS+= RSA_generate_key.3 RSA_generate_multi_prime_key.3
+MLINKS+= RSA_get0_key.3 RSA_clear_flags.3
MLINKS+= RSA_get0_key.3 RSA_get0_crt_params.3
MLINKS+= RSA_get0_key.3 RSA_get0_d.3
MLINKS+= RSA_get0_key.3 RSA_get0_dmp1.3
@@ -3682,13 +3804,14 @@ MLINKS+= RSA_get0_key.3 RSA_get0_n.3
MLINKS+= RSA_get0_key.3 RSA_get0_p.3
MLINKS+= RSA_get0_key.3 RSA_get0_pss_params.3
MLINKS+= RSA_get0_key.3 RSA_get0_q.3
-MLINKS+= BIO_get_ex_new_index.3 RSA_get_app_data.3
-MLINKS+= RSA_set_method.3 RSA_get_default_method.3
-MLINKS+= BIO_get_ex_new_index.3 RSA_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 RSA_get_ex_new_index.3
-MLINKS+= RSA_set_method.3 RSA_get_method.3
MLINKS+= RSA_get0_key.3 RSA_get_multi_prime_extra_count.3
MLINKS+= RSA_get0_key.3 RSA_get_version.3
+MLINKS+= RSA_get0_key.3 RSA_set0_crt_params.3
+MLINKS+= RSA_get0_key.3 RSA_set0_factors.3
+MLINKS+= RSA_get0_key.3 RSA_set0_key.3
+MLINKS+= RSA_get0_key.3 RSA_set0_multi_prime_params.3
+MLINKS+= RSA_get0_key.3 RSA_set_flags.3
+MLINKS+= RSA_get0_key.3 RSA_test_flags.3
MLINKS+= RSA_meth_new.3 RSA_meth_dup.3
MLINKS+= RSA_meth_new.3 RSA_meth_free.3
MLINKS+= RSA_meth_new.3 RSA_meth_get0_app_data.3
@@ -3721,7 +3844,7 @@ MLINKS+= RSA_meth_new.3 RSA_meth_set_pub_dec.3
MLINKS+= RSA_meth_new.3 RSA_meth_set_pub_enc.3
MLINKS+= RSA_meth_new.3 RSA_meth_set_sign.3
MLINKS+= RSA_meth_new.3 RSA_meth_set_verify.3
-MLINKS+= RSA_set_method.3 RSA_new_method.3
+MLINKS+= RSA_new.3 RSA_free.3
MLINKS+= RSA_padding_add_PKCS1_type_1.3 RSA_padding_add_PKCS1_OAEP.3
MLINKS+= RSA_padding_add_PKCS1_type_1.3 RSA_padding_add_PKCS1_OAEP_mgf1.3
MLINKS+= RSA_padding_add_PKCS1_type_1.3 RSA_padding_add_PKCS1_type_2.3
@@ -3731,26 +3854,26 @@ MLINKS+= RSA_padding_add_PKCS1_type_1.3 RSA_padding_check_PKCS1_OAEP_mgf1.3
MLINKS+= RSA_padding_add_PKCS1_type_1.3 RSA_padding_check_PKCS1_type_1.3
MLINKS+= RSA_padding_add_PKCS1_type_1.3 RSA_padding_check_PKCS1_type_2.3
MLINKS+= RSA_padding_add_PKCS1_type_1.3 RSA_padding_check_none.3
+MLINKS+= RSA_print.3 DHparams_print.3
+MLINKS+= RSA_print.3 DHparams_print_fp.3
+MLINKS+= RSA_print.3 DSA_print.3
+MLINKS+= RSA_print.3 DSA_print_fp.3
+MLINKS+= RSA_print.3 DSAparams_print.3
+MLINKS+= RSA_print.3 DSAparams_print_fp.3
MLINKS+= RSA_print.3 RSA_print_fp.3
-MLINKS+= RSA_public_encrypt.3 RSA_private_decrypt.3
MLINKS+= RSA_private_encrypt.3 RSA_public_decrypt.3
-MLINKS+= RSA_size.3 RSA_security_bits.3
-MLINKS+= RSA_get0_key.3 RSA_set0_crt_params.3
-MLINKS+= RSA_get0_key.3 RSA_set0_factors.3
-MLINKS+= RSA_get0_key.3 RSA_set0_key.3
-MLINKS+= RSA_get0_key.3 RSA_set0_multi_prime_params.3
-MLINKS+= BIO_get_ex_new_index.3 RSA_set_app_data.3
+MLINKS+= RSA_public_encrypt.3 RSA_private_decrypt.3
+MLINKS+= RSA_set_method.3 RSA_PKCS1_OpenSSL.3
+MLINKS+= RSA_set_method.3 RSA_flags.3
+MLINKS+= RSA_set_method.3 RSA_get_default_method.3
+MLINKS+= RSA_set_method.3 RSA_get_method.3
+MLINKS+= RSA_set_method.3 RSA_new_method.3
MLINKS+= RSA_set_method.3 RSA_set_default_method.3
-MLINKS+= BIO_get_ex_new_index.3 RSA_set_ex_data.3
-MLINKS+= RSA_get0_key.3 RSA_set_flags.3
-MLINKS+= RSA_get0_key.3 RSA_test_flags.3
MLINKS+= RSA_sign.3 RSA_verify.3
MLINKS+= RSA_sign_ASN1_OCTET_STRING.3 RSA_verify_ASN1_OCTET_STRING.3
-MLINKS+= X509_dup.3 SCRYPT_PARAMS_free.3
-MLINKS+= X509_dup.3 SCRYPT_PARAMS_new.3
+MLINKS+= RSA_size.3 RSA_bits.3
+MLINKS+= RSA_size.3 RSA_security_bits.3
MLINKS+= SCT_new.3 SCT_LIST_free.3
-MLINKS+= SCT_print.3 SCT_LIST_print.3
-MLINKS+= SCT_validate.3 SCT_LIST_validate.3
MLINKS+= SCT_new.3 SCT_free.3
MLINKS+= SCT_new.3 SCT_get0_extensions.3
MLINKS+= SCT_new.3 SCT_get0_log_id.3
@@ -3759,7 +3882,6 @@ MLINKS+= SCT_new.3 SCT_get_log_entry_type.3
MLINKS+= SCT_new.3 SCT_get_signature_nid.3
MLINKS+= SCT_new.3 SCT_get_source.3
MLINKS+= SCT_new.3 SCT_get_timestamp.3
-MLINKS+= SCT_validate.3 SCT_get_validation_status.3
MLINKS+= SCT_new.3 SCT_get_version.3
MLINKS+= SCT_new.3 SCT_new_from_base64.3
MLINKS+= SCT_new.3 SCT_set0_extensions.3
@@ -3773,7 +3895,10 @@ MLINKS+= SCT_new.3 SCT_set_signature_nid.3
MLINKS+= SCT_new.3 SCT_set_source.3
MLINKS+= SCT_new.3 SCT_set_timestamp.3
MLINKS+= SCT_new.3 SCT_set_version.3
+MLINKS+= SCT_print.3 SCT_LIST_print.3
MLINKS+= SCT_print.3 SCT_validation_status_string.3
+MLINKS+= SCT_validate.3 SCT_LIST_validate.3
+MLINKS+= SCT_validate.3 SCT_get_validation_status.3
MLINKS+= SHA256_Init.3 SHA1.3
MLINKS+= SHA256_Init.3 SHA1_Final.3
MLINKS+= SHA256_Init.3 SHA1_Init.3
@@ -3820,6 +3945,7 @@ MLINKS+= SRP_user_pwd_new.3 SRP_user_pwd_free.3
MLINKS+= SRP_user_pwd_new.3 SRP_user_pwd_set0_sv.3
MLINKS+= SRP_user_pwd_new.3 SRP_user_pwd_set1_ids.3
MLINKS+= SRP_user_pwd_new.3 SRP_user_pwd_set_gN.3
+MLINKS+= SSL_CIPHER_get_name.3 OPENSSL_cipher_name.3
MLINKS+= SSL_CIPHER_get_name.3 SSL_CIPHER_description.3
MLINKS+= SSL_CIPHER_get_name.3 SSL_CIPHER_find.3
MLINKS+= SSL_CIPHER_get_name.3 SSL_CIPHER_get_auth_nid.3
@@ -3837,78 +3963,94 @@ MLINKS+= SSL_COMP_add_compression_method.3 SSL_COMP_free_compression_methods.3
MLINKS+= SSL_COMP_add_compression_method.3 SSL_COMP_get0_name.3
MLINKS+= SSL_COMP_add_compression_method.3 SSL_COMP_get_compression_methods.3
MLINKS+= SSL_COMP_add_compression_method.3 SSL_COMP_get_id.3
-MLINKS+= SSL_CONF_CTX_set_flags.3 SSL_CONF_CTX_clear_flags.3
MLINKS+= SSL_CONF_CTX_new.3 SSL_CONF_CTX_free.3
+MLINKS+= SSL_CONF_CTX_set_flags.3 SSL_CONF_CTX_clear_flags.3
+MLINKS+= SSL_CONF_CTX_set_ssl_ctx.3 SSL_CONF_CTX_finish.3
MLINKS+= SSL_CONF_CTX_set_ssl_ctx.3 SSL_CONF_CTX_set_ssl.3
MLINKS+= SSL_CONF_cmd.3 SSL_CONF_cmd_value_type.3
MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_add0_chain_cert.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_add1_to_CA_list.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_add_client_CA.3
-MLINKS+= SSL_extension_supported.3 SSL_CTX_add_client_custom_ext.3
-MLINKS+= SSL_extension_supported.3 SSL_CTX_add_custom_ext.3
-MLINKS+= SSL_extension_supported.3 SSL_CTX_add_server_custom_ext.3
MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_build_cert_chain.3
-MLINKS+= SSL_CTX_ctrl.3 SSL_CTX_callback_ctrl.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_check_private_key.3
MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_clear_chain_certs.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_get0_chain_certs.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_select_current_cert.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_set0_chain.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_set1_chain.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_set_current_cert.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_add0_chain_cert.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_add1_chain_cert.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_build_cert_chain.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_clear_chain_certs.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_get0_chain_certs.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_select_current_cert.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_set0_chain.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_set1_chain.3
+MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_set_current_cert.3
MLINKS+= SSL_CTX_add_extra_chain_cert.3 SSL_CTX_clear_extra_chain_certs.3
-MLINKS+= SSL_CTX_set_mode.3 SSL_CTX_clear_mode.3
-MLINKS+= SSL_CTX_set_options.3 SSL_CTX_clear_options.3
-MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_CTX_ct_is_enabled.3
+MLINKS+= SSL_CTX_add_extra_chain_cert.3 SSL_CTX_get_extra_chain_certs.3
+MLINKS+= SSL_CTX_add_extra_chain_cert.3 SSL_CTX_get_extra_chain_certs_only.3
+MLINKS+= SSL_CTX_add_session.3 SSL_CTX_remove_session.3
+MLINKS+= SSL_CTX_config.3 SSL_config.3
+MLINKS+= SSL_CTX_ctrl.3 SSL_CTX_callback_ctrl.3
+MLINKS+= SSL_CTX_ctrl.3 SSL_callback_ctrl.3
+MLINKS+= SSL_CTX_ctrl.3 SSL_ctrl.3
MLINKS+= SSL_CTX_dane_enable.3 SSL_CTX_dane_clear_flags.3
MLINKS+= SSL_CTX_dane_enable.3 SSL_CTX_dane_mtype_set.3
MLINKS+= SSL_CTX_dane_enable.3 SSL_CTX_dane_set_flags.3
-MLINKS+= SSL_CTX_set_session_ticket_cb.3 SSL_CTX_decrypt_session_ticket_fn.3
-MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_CTX_disable_ct.3
-MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_CTX_enable_ct.3
-MLINKS+= SSL_CTX_set_session_ticket_cb.3 SSL_CTX_generate_session_ticket_fn.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_get0_CA_list.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_get0_chain_cert_store.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_get0_chain_certs.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_get0_security_ex_data.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_get0_verify_cert_store.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_get_app_data.3
-MLINKS+= SSL_CTX_set_cert_store.3 SSL_CTX_get_cert_store.3
-MLINKS+= SSL_get_ciphers.3 SSL_CTX_get_ciphers.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_get_client_CA_list.3
-MLINKS+= SSL_CTX_set_client_cert_cb.3 SSL_CTX_get_client_cert_cb.3
-MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_CTX_get_default_passwd_cb.3
-MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_CTX_get_default_passwd_cb_userdata.3
-MLINKS+= SSL_CTX_set_read_ahead.3 SSL_CTX_get_default_read_ahead.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_get_ex_new_index.3
-MLINKS+= SSL_CTX_add_extra_chain_cert.3 SSL_CTX_get_extra_chain_certs.3
-MLINKS+= SSL_CTX_add_extra_chain_cert.3 SSL_CTX_get_extra_chain_certs_only.3
-MLINKS+= SSL_CTX_set_info_callback.3 SSL_CTX_get_info_callback.3
-MLINKS+= SSL_CTX_set_keylog_callback.3 SSL_CTX_get_keylog_callback.3
-MLINKS+= SSL_CTX_set_max_cert_list.3 SSL_CTX_get_max_cert_list.3
-MLINKS+= SSL_read_early_data.3 SSL_CTX_get_max_early_data.3
-MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_CTX_get_max_proto_version.3
-MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_CTX_get_min_proto_version.3
-MLINKS+= SSL_CTX_set_mode.3 SSL_CTX_get_mode.3
-MLINKS+= SSL_CTX_set_num_tickets.3 SSL_CTX_get_num_tickets.3
-MLINKS+= SSL_CTX_set_options.3 SSL_CTX_get_options.3
-MLINKS+= SSL_CTX_set_quiet_shutdown.3 SSL_CTX_get_quiet_shutdown.3
-MLINKS+= SSL_CTX_set_read_ahead.3 SSL_CTX_get_read_ahead.3
-MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_CTX_get_record_padding_callback_arg.3
-MLINKS+= SSL_read_early_data.3 SSL_CTX_get_recv_max_early_data.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_get_security_callback.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_get_security_level.3
-MLINKS+= SSL_CTX_set_session_cache_mode.3 SSL_CTX_get_session_cache_mode.3
-MLINKS+= SSL_CTX_set_ssl_version.3 SSL_CTX_get_ssl_method.3
-MLINKS+= SSL_CTX_set_timeout.3 SSL_CTX_get_timeout.3
-MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_CTX_get_tlsext_status_arg.3
-MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_CTX_get_tlsext_status_cb.3
-MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_CTX_get_tlsext_status_type.3
+MLINKS+= SSL_CTX_dane_enable.3 SSL_dane_clear_flags.3
+MLINKS+= SSL_CTX_dane_enable.3 SSL_dane_enable.3
+MLINKS+= SSL_CTX_dane_enable.3 SSL_dane_set_flags.3
+MLINKS+= SSL_CTX_dane_enable.3 SSL_dane_tlsa_add.3
+MLINKS+= SSL_CTX_dane_enable.3 SSL_get0_dane_authority.3
+MLINKS+= SSL_CTX_dane_enable.3 SSL_get0_dane_tlsa.3
+MLINKS+= SSL_CTX_flush_sessions.3 SSL_CTX_flush_sessions_ex.3
+MLINKS+= SSL_CTX_get0_param.3 SSL_CTX_set1_param.3
+MLINKS+= SSL_CTX_get0_param.3 SSL_CTX_set_purpose.3
+MLINKS+= SSL_CTX_get0_param.3 SSL_CTX_set_trust.3
+MLINKS+= SSL_CTX_get0_param.3 SSL_get0_param.3
+MLINKS+= SSL_CTX_get0_param.3 SSL_set1_param.3
+MLINKS+= SSL_CTX_get0_param.3 SSL_set_purpose.3
+MLINKS+= SSL_CTX_get0_param.3 SSL_set_trust.3
MLINKS+= SSL_CTX_get_verify_mode.3 SSL_CTX_get_verify_callback.3
MLINKS+= SSL_CTX_get_verify_mode.3 SSL_CTX_get_verify_depth.3
-MLINKS+= SSL_CTX_set_keylog_callback.3 SSL_CTX_keylog_cb_func.3
+MLINKS+= SSL_CTX_get_verify_mode.3 SSL_get_verify_callback.3
+MLINKS+= SSL_CTX_get_verify_mode.3 SSL_get_verify_depth.3
+MLINKS+= SSL_CTX_get_verify_mode.3 SSL_get_verify_mode.3
MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_load_verify_dir.3
MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_load_verify_file.3
MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_load_verify_store.3
+MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_set_default_verify_dir.3
+MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_set_default_verify_file.3
+MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_set_default_verify_paths.3
+MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_set_default_verify_store.3
+MLINKS+= SSL_CTX_new.3 DTLS_client_method.3
+MLINKS+= SSL_CTX_new.3 DTLS_method.3
+MLINKS+= SSL_CTX_new.3 DTLS_server_method.3
+MLINKS+= SSL_CTX_new.3 DTLSv1_2_client_method.3
+MLINKS+= SSL_CTX_new.3 DTLSv1_2_method.3
+MLINKS+= SSL_CTX_new.3 DTLSv1_2_server_method.3
+MLINKS+= SSL_CTX_new.3 DTLSv1_client_method.3
+MLINKS+= SSL_CTX_new.3 DTLSv1_method.3
+MLINKS+= SSL_CTX_new.3 DTLSv1_server_method.3
MLINKS+= SSL_CTX_new.3 SSL_CTX_new_ex.3
-MLINKS+= SSL_CTX_add_session.3 SSL_CTX_remove_session.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_select_current_cert.3
+MLINKS+= SSL_CTX_new.3 SSL_CTX_up_ref.3
+MLINKS+= SSL_CTX_new.3 SSLv23_client_method.3
+MLINKS+= SSL_CTX_new.3 SSLv23_method.3
+MLINKS+= SSL_CTX_new.3 SSLv23_server_method.3
+MLINKS+= SSL_CTX_new.3 SSLv3_client_method.3
+MLINKS+= SSL_CTX_new.3 SSLv3_method.3
+MLINKS+= SSL_CTX_new.3 SSLv3_server_method.3
+MLINKS+= SSL_CTX_new.3 TLS_client_method.3
+MLINKS+= SSL_CTX_new.3 TLS_method.3
+MLINKS+= SSL_CTX_new.3 TLS_server_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_1_client_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_1_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_1_server_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_2_client_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_2_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_2_server_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_client_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_method.3
+MLINKS+= SSL_CTX_new.3 TLSv1_server_method.3
MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_accept.3
MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_accept_good.3
MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_accept_renegotiate.3
@@ -3917,82 +4059,256 @@ MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_cb_hits.3
MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_connect.3
MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_connect_good.3
MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_connect_renegotiate.3
+MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_hits.3
+MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_misses.3
+MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_timeouts.3
MLINKS+= SSL_CTX_sess_set_cache_size.3 SSL_CTX_sess_get_cache_size.3
MLINKS+= SSL_CTX_sess_set_get_cb.3 SSL_CTX_sess_get_get_cb.3
MLINKS+= SSL_CTX_sess_set_get_cb.3 SSL_CTX_sess_get_new_cb.3
MLINKS+= SSL_CTX_sess_set_get_cb.3 SSL_CTX_sess_get_remove_cb.3
-MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_hits.3
-MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_misses.3
MLINKS+= SSL_CTX_sess_set_get_cb.3 SSL_CTX_sess_set_new_cb.3
MLINKS+= SSL_CTX_sess_set_get_cb.3 SSL_CTX_sess_set_remove_cb.3
-MLINKS+= SSL_CTX_sess_number.3 SSL_CTX_sess_timeouts.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_set0_chain.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_set0_chain_cert_store.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_set0_security_ex_data.3
-MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_CTX_set0_tmp_dh_pkey.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_set0_verify_cert_store.3
-MLINKS+= SSL_CTX_set_cert_store.3 SSL_CTX_set1_cert_store.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_set1_chain.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_set1_chain_cert_store.3
-MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_CTX_set1_client_sigalgs.3
-MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_CTX_set1_client_sigalgs_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_add1_to_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_add_client_CA.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_get0_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_get_client_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_set_client_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_add1_to_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_add_client_CA.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_get0_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_get0_peer_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_get_client_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_set0_CA_list.3
+MLINKS+= SSL_CTX_set0_CA_list.3 SSL_set_client_CA_list.3
+MLINKS+= SSL_CTX_set1_cert_comp_preference.3 SSL_CTX_compress_certs.3
+MLINKS+= SSL_CTX_set1_cert_comp_preference.3 SSL_CTX_get1_compressed_cert.3
+MLINKS+= SSL_CTX_set1_cert_comp_preference.3 SSL_CTX_set1_compressed_cert.3
+MLINKS+= SSL_CTX_set1_cert_comp_preference.3 SSL_compress_certs.3
+MLINKS+= SSL_CTX_set1_cert_comp_preference.3 SSL_get1_compressed_cert.3
+MLINKS+= SSL_CTX_set1_cert_comp_preference.3 SSL_set1_cert_comp_preference.3
+MLINKS+= SSL_CTX_set1_cert_comp_preference.3 SSL_set1_compressed_cert.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_CTX_get0_implemented_groups.3
MLINKS+= SSL_CTX_set1_curves.3 SSL_CTX_set1_curves_list.3
MLINKS+= SSL_CTX_set1_curves.3 SSL_CTX_set1_groups.3
MLINKS+= SSL_CTX_set1_curves.3 SSL_CTX_set1_groups_list.3
-MLINKS+= SSL_CTX_get0_param.3 SSL_CTX_set1_param.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_get0_iana_groups.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_get1_curves.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_get1_groups.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_get_negotiated_group.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_get_shared_curve.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_get_shared_group.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_set1_curves.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_set1_curves_list.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_set1_groups.3
+MLINKS+= SSL_CTX_set1_curves.3 SSL_set1_groups_list.3
+MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_CTX_set1_client_sigalgs.3
+MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_CTX_set1_client_sigalgs_list.3
MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_CTX_set1_sigalgs_list.3
-MLINKS+= SSL_read_early_data.3 SSL_CTX_set_allow_early_data_cb.3
+MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_set1_client_sigalgs.3
+MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_set1_client_sigalgs_list.3
+MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_set1_sigalgs.3
+MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_set1_sigalgs_list.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_get0_chain_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_get0_verify_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_set0_chain_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_set0_verify_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_CTX_set1_chain_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_get0_chain_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_get0_verify_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_set0_chain_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_set0_verify_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_set1_chain_cert_store.3
+MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_set1_verify_cert_store.3
MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_CTX_set_alpn_protos.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_set_app_data.3
-MLINKS+= SSL_set_async_callback.3 SSL_CTX_set_async_callback.3
-MLINKS+= SSL_set_async_callback.3 SSL_CTX_set_async_callback_arg.3
-MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_CTX_set_block_padding.3
+MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_CTX_set_next_proto_select_cb.3
+MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_CTX_set_next_protos_advertised_cb.3
+MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_get0_alpn_selected.3
+MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_get0_next_proto_negotiated.3
+MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_select_next_proto.3
+MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_set_alpn_protos.3
+MLINKS+= SSL_CTX_set_cert_cb.3 SSL_set_cert_cb.3
+MLINKS+= SSL_CTX_set_cert_store.3 SSL_CTX_get_cert_store.3
+MLINKS+= SSL_CTX_set_cert_store.3 SSL_CTX_set1_cert_store.3
+MLINKS+= SSL_CTX_set_cipher_list.3 OSSL_default_cipher_list.3
+MLINKS+= SSL_CTX_set_cipher_list.3 OSSL_default_ciphersuites.3
MLINKS+= SSL_CTX_set_cipher_list.3 SSL_CTX_set_ciphersuites.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_CTX_set_client_CA_list.3
-MLINKS+= SSL_CTX_set_stateless_cookie_generate_cb.3 SSL_CTX_set_cookie_generate_cb.3
-MLINKS+= SSL_CTX_set_stateless_cookie_generate_cb.3 SSL_CTX_set_cookie_verify_cb.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_CTX_set_current_cert.3
+MLINKS+= SSL_CTX_set_cipher_list.3 SSL_set_cipher_list.3
+MLINKS+= SSL_CTX_set_cipher_list.3 SSL_set_ciphersuites.3
+MLINKS+= SSL_CTX_set_client_cert_cb.3 SSL_CTX_get_client_cert_cb.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_cb_fn.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_ciphers.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_compression_methods.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_ext.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_legacy_version.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_random.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_session_id.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get1_extensions_present.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get_extension_order.3
+MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_isv2.3
+MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_CTX_ct_is_enabled.3
+MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_CTX_disable_ct.3
+MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_CTX_enable_ct.3
+MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_ct_is_enabled.3
+MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_disable_ct.3
+MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_enable_ct.3
+MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_set_ct_validation_callback.3
+MLINKS+= SSL_CTX_set_ct_validation_callback.3 ssl_ct_validation_cb.3
MLINKS+= SSL_CTX_set_ctlog_list_file.3 SSL_CTX_set_default_ctlog_list_file.3
+MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_CTX_get_default_passwd_cb.3
+MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_CTX_get_default_passwd_cb_userdata.3
MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_CTX_set_default_passwd_cb_userdata.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_CTX_set_default_read_buffer_len.3
-MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_set_default_verify_dir.3
-MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_set_default_verify_file.3
-MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_set_default_verify_paths.3
-MLINKS+= SSL_CTX_load_verify_locations.3 SSL_CTX_set_default_verify_store.3
-MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_CTX_set_dh_auto.3
-MLINKS+= SSL_CTX_set_tmp_ecdh.3 SSL_CTX_set_ecdh_auto.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_CTX_set_ex_data.3
-MLINKS+= SSL_read_early_data.3 SSL_CTX_set_max_early_data.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_CTX_set_max_pipelines.3
+MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_get_default_passwd_cb.3
+MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_get_default_passwd_cb_userdata.3
+MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_set_default_passwd_cb.3
+MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_set_default_passwd_cb_userdata.3
+MLINKS+= SSL_CTX_set_domain_flags.3 SSL_CTX_get_domain_flags.3
+MLINKS+= SSL_CTX_set_domain_flags.3 SSL_DOMAIN_FLAG_BLOCKING.3
+MLINKS+= SSL_CTX_set_domain_flags.3 SSL_DOMAIN_FLAG_LEGACY_BLOCKING.3
+MLINKS+= SSL_CTX_set_domain_flags.3 SSL_DOMAIN_FLAG_MULTI_THREAD.3
+MLINKS+= SSL_CTX_set_domain_flags.3 SSL_DOMAIN_FLAG_SINGLE_THREAD.3
+MLINKS+= SSL_CTX_set_domain_flags.3 SSL_DOMAIN_FLAG_THREAD_ASSISTED.3
+MLINKS+= SSL_CTX_set_domain_flags.3 SSL_get_domain_flags.3
+MLINKS+= SSL_CTX_set_generate_session_id.3 GEN_SESSION_CB.3
+MLINKS+= SSL_CTX_set_generate_session_id.3 SSL_has_matching_session_id.3
+MLINKS+= SSL_CTX_set_generate_session_id.3 SSL_set_generate_session_id.3
+MLINKS+= SSL_CTX_set_info_callback.3 SSL_CTX_get_info_callback.3
+MLINKS+= SSL_CTX_set_info_callback.3 SSL_get_info_callback.3
+MLINKS+= SSL_CTX_set_info_callback.3 SSL_set_info_callback.3
+MLINKS+= SSL_CTX_set_keylog_callback.3 SSL_CTX_get_keylog_callback.3
+MLINKS+= SSL_CTX_set_keylog_callback.3 SSL_CTX_keylog_cb_func.3
+MLINKS+= SSL_CTX_set_max_cert_list.3 SSL_CTX_get_max_cert_list.3
+MLINKS+= SSL_CTX_set_max_cert_list.3 SSL_get_max_cert_list.3
+MLINKS+= SSL_CTX_set_max_cert_list.3 SSL_set_max_cert_list.3
+MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_CTX_get_max_proto_version.3
+MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_CTX_get_min_proto_version.3
MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_CTX_set_max_proto_version.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_CTX_set_max_send_fragment.3
+MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_get_max_proto_version.3
+MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_get_min_proto_version.3
+MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_set_max_proto_version.3
+MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_set_min_proto_version.3
+MLINKS+= SSL_CTX_set_mode.3 SSL_CTX_clear_mode.3
+MLINKS+= SSL_CTX_set_mode.3 SSL_CTX_get_mode.3
+MLINKS+= SSL_CTX_set_mode.3 SSL_clear_mode.3
+MLINKS+= SSL_CTX_set_mode.3 SSL_get_mode.3
+MLINKS+= SSL_CTX_set_mode.3 SSL_set_mode.3
MLINKS+= SSL_CTX_set_msg_callback.3 SSL_CTX_set_msg_callback_arg.3
-MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_CTX_set_next_proto_select_cb.3
-MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_CTX_set_next_protos_advertised_cb.3
-MLINKS+= SSL_CTX_set_verify.3 SSL_CTX_set_post_handshake_auth.3
-MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_CTX_set_psk_find_session_callback.3
-MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_CTX_set_psk_server_callback.3
+MLINKS+= SSL_CTX_set_msg_callback.3 SSL_set_msg_callback.3
+MLINKS+= SSL_CTX_set_msg_callback.3 SSL_set_msg_callback_arg.3
+MLINKS+= SSL_CTX_set_msg_callback.3 SSL_trace.3
+MLINKS+= SSL_CTX_set_new_pending_conn_cb.3 SSL_set_new_pending_conn_cb_fn.3
+MLINKS+= SSL_CTX_set_num_tickets.3 SSL_CTX_get_num_tickets.3
+MLINKS+= SSL_CTX_set_num_tickets.3 SSL_get_num_tickets.3
+MLINKS+= SSL_CTX_set_num_tickets.3 SSL_new_session_ticket.3
+MLINKS+= SSL_CTX_set_num_tickets.3 SSL_set_num_tickets.3
+MLINKS+= SSL_CTX_set_options.3 SSL_CTX_clear_options.3
+MLINKS+= SSL_CTX_set_options.3 SSL_CTX_get_options.3
+MLINKS+= SSL_CTX_set_options.3 SSL_clear_options.3
+MLINKS+= SSL_CTX_set_options.3 SSL_get_options.3
+MLINKS+= SSL_CTX_set_options.3 SSL_get_secure_renegotiation_support.3
+MLINKS+= SSL_CTX_set_options.3 SSL_set_options.3
MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_CTX_set_psk_use_session_callback.3
-MLINKS+= SSL_CTX_get0_param.3 SSL_CTX_set_purpose.3
+MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_psk_client_cb_func.3
+MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_psk_use_session_cb_func.3
+MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_set_psk_client_callback.3
+MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_set_psk_use_session_callback.3
+MLINKS+= SSL_CTX_set_quiet_shutdown.3 SSL_CTX_get_quiet_shutdown.3
+MLINKS+= SSL_CTX_set_quiet_shutdown.3 SSL_get_quiet_shutdown.3
+MLINKS+= SSL_CTX_set_quiet_shutdown.3 SSL_set_quiet_shutdown.3
+MLINKS+= SSL_CTX_set_read_ahead.3 SSL_CTX_get_default_read_ahead.3
+MLINKS+= SSL_CTX_set_read_ahead.3 SSL_CTX_get_read_ahead.3
+MLINKS+= SSL_CTX_set_read_ahead.3 SSL_get_read_ahead.3
+MLINKS+= SSL_CTX_set_read_ahead.3 SSL_set_read_ahead.3
+MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_CTX_get_record_padding_callback_arg.3
+MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_CTX_set_block_padding.3
+MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_CTX_set_block_padding_ex.3
MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_CTX_set_record_padding_callback_arg.3
-MLINKS+= SSL_read_early_data.3 SSL_CTX_set_recv_max_early_data.3
+MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_get_record_padding_callback_arg.3
+MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_set_block_padding.3
+MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_set_block_padding_ex.3
+MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_set_record_padding_callback.3
+MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_set_record_padding_callback_arg.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_get0_security_ex_data.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_get_security_callback.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_get_security_level.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_set0_security_ex_data.3
MLINKS+= SSL_CTX_set_security_level.3 SSL_CTX_set_security_callback.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_get0_security_ex_data.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_get_security_callback.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_get_security_level.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_set0_security_ex_data.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_set_security_callback.3
+MLINKS+= SSL_CTX_set_security_level.3 SSL_set_security_level.3
+MLINKS+= SSL_CTX_set_session_cache_mode.3 SSL_CTX_get_session_cache_mode.3
+MLINKS+= SSL_CTX_set_session_id_context.3 SSL_set_session_id_context.3
+MLINKS+= SSL_CTX_set_session_ticket_cb.3 SSL_CTX_decrypt_session_ticket_fn.3
+MLINKS+= SSL_CTX_set_session_ticket_cb.3 SSL_CTX_generate_session_ticket_fn.3
+MLINKS+= SSL_CTX_set_session_ticket_cb.3 SSL_SESSION_get0_ticket_appdata.3
+MLINKS+= SSL_CTX_set_session_ticket_cb.3 SSL_SESSION_set1_ticket_appdata.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_CTX_set_default_read_buffer_len.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_CTX_set_max_pipelines.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_CTX_set_max_send_fragment.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_CTX_set_tlsext_max_fragment_length.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_SESSION_get_max_fragment_length.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_default_read_buffer_len.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_max_pipelines.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_max_send_fragment.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_split_send_fragment.3
+MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_tlsext_max_fragment_length.3
MLINKS+= SSL_CTX_set_srp_password.3 SSL_CTX_set_srp_cb_arg.3
MLINKS+= SSL_CTX_set_srp_password.3 SSL_CTX_set_srp_client_pwd_callback.3
MLINKS+= SSL_CTX_set_srp_password.3 SSL_CTX_set_srp_strength.3
MLINKS+= SSL_CTX_set_srp_password.3 SSL_CTX_set_srp_username.3
MLINKS+= SSL_CTX_set_srp_password.3 SSL_CTX_set_srp_username_callback.3
MLINKS+= SSL_CTX_set_srp_password.3 SSL_CTX_set_srp_verify_param_callback.3
+MLINKS+= SSL_CTX_set_srp_password.3 SSL_get_srp_N.3
+MLINKS+= SSL_CTX_set_srp_password.3 SSL_get_srp_g.3
+MLINKS+= SSL_CTX_set_srp_password.3 SSL_get_srp_userinfo.3
+MLINKS+= SSL_CTX_set_srp_password.3 SSL_get_srp_username.3
+MLINKS+= SSL_CTX_set_srp_password.3 SSL_set_srp_server_param.3
+MLINKS+= SSL_CTX_set_srp_password.3 SSL_set_srp_server_param_pw.3
+MLINKS+= SSL_CTX_set_ssl_version.3 SSL_CTX_get_ssl_method.3
+MLINKS+= SSL_CTX_set_ssl_version.3 SSL_get_ssl_method.3
+MLINKS+= SSL_CTX_set_ssl_version.3 SSL_set_ssl_method.3
+MLINKS+= SSL_CTX_set_stateless_cookie_generate_cb.3 SSL_CTX_set_cookie_generate_cb.3
+MLINKS+= SSL_CTX_set_stateless_cookie_generate_cb.3 SSL_CTX_set_cookie_verify_cb.3
MLINKS+= SSL_CTX_set_stateless_cookie_generate_cb.3 SSL_CTX_set_stateless_cookie_verify_cb.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_CTX_set_tlsext_max_fragment_length.3
+MLINKS+= SSL_CTX_set_timeout.3 SSL_CTX_get_timeout.3
MLINKS+= SSL_CTX_set_tlsext_servername_callback.3 SSL_CTX_set_tlsext_servername_arg.3
+MLINKS+= SSL_CTX_set_tlsext_servername_callback.3 SSL_get_servername.3
+MLINKS+= SSL_CTX_set_tlsext_servername_callback.3 SSL_get_servername_type.3
+MLINKS+= SSL_CTX_set_tlsext_servername_callback.3 SSL_set_tlsext_host_name.3
+MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_CTX_get_tlsext_status_arg.3
+MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_CTX_get_tlsext_status_cb.3
+MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_CTX_get_tlsext_status_type.3
MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_CTX_set_tlsext_status_arg.3
MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_CTX_set_tlsext_status_type.3
+MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_get_tlsext_status_ocsp_resp.3
+MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_get_tlsext_status_type.3
+MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_set_tlsext_status_ocsp_resp.3
+MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_set_tlsext_status_type.3
MLINKS+= SSL_CTX_set_tlsext_ticket_key_cb.3 SSL_CTX_set_tlsext_ticket_key_evp_cb.3
+MLINKS+= SSL_CTX_set_tlsext_use_srtp.3 SSL_get_selected_srtp_profile.3
+MLINKS+= SSL_CTX_set_tlsext_use_srtp.3 SSL_get_srtp_profiles.3
+MLINKS+= SSL_CTX_set_tlsext_use_srtp.3 SSL_set_tlsext_use_srtp.3
+MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_CTX_set0_tmp_dh_pkey.3
+MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_CTX_set_dh_auto.3
MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_CTX_set_tmp_dh.3
-MLINKS+= SSL_CTX_get0_param.3 SSL_CTX_set_trust.3
+MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_set0_tmp_dh_pkey.3
+MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_set_dh_auto.3
+MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_set_tmp_dh.3
+MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_set_tmp_dh_callback.3
+MLINKS+= SSL_CTX_set_tmp_ecdh.3 SSL_CTX_set_ecdh_auto.3
+MLINKS+= SSL_CTX_set_tmp_ecdh.3 SSL_set_ecdh_auto.3
+MLINKS+= SSL_CTX_set_tmp_ecdh.3 SSL_set_tmp_ecdh.3
+MLINKS+= SSL_CTX_set_verify.3 SSL_CTX_set_post_handshake_auth.3
MLINKS+= SSL_CTX_set_verify.3 SSL_CTX_set_verify_depth.3
-MLINKS+= SSL_CTX_new.3 SSL_CTX_up_ref.3
+MLINKS+= SSL_CTX_set_verify.3 SSL_get_ex_data_X509_STORE_CTX_idx.3
+MLINKS+= SSL_CTX_set_verify.3 SSL_set_post_handshake_auth.3
+MLINKS+= SSL_CTX_set_verify.3 SSL_set_verify.3
+MLINKS+= SSL_CTX_set_verify.3 SSL_set_verify_depth.3
+MLINKS+= SSL_CTX_set_verify.3 SSL_verify_cb.3
+MLINKS+= SSL_CTX_set_verify.3 SSL_verify_client_post_handshake.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_check_private_key.3
MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_use_PrivateKey.3
MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_use_PrivateKey_ASN1.3
MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_use_PrivateKey_file.3
@@ -4003,299 +4319,296 @@ MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_use_cert_and_key.3
MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_use_certificate_ASN1.3
MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_use_certificate_chain_file.3
MLINKS+= SSL_CTX_use_certificate.3 SSL_CTX_use_certificate_file.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_check_private_key.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_PrivateKey.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_PrivateKey_ASN1.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_PrivateKey_file.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_RSAPrivateKey.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_RSAPrivateKey_ASN1.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_RSAPrivateKey_file.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_cert_and_key.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_certificate.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_certificate_ASN1.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_certificate_chain_file.3
+MLINKS+= SSL_CTX_use_certificate.3 SSL_use_certificate_file.3
+MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_CTX_set_psk_find_session_callback.3
+MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_CTX_set_psk_server_callback.3
+MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_psk_find_session_cb_func.3
+MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_psk_server_cb_func.3
+MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_set_psk_find_session_callback.3
+MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_set_psk_server_callback.3
+MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_use_psk_identity_hint.3
MLINKS+= SSL_CTX_use_serverinfo.3 SSL_CTX_use_serverinfo_ex.3
MLINKS+= SSL_CTX_use_serverinfo.3 SSL_CTX_use_serverinfo_file.3
-MLINKS+= OSSL_CORE_MAKE_FUNC.3 SSL_OP_BIT.3
MLINKS+= SSL_SESSION_free.3 SSL_SESSION_dup.3
-MLINKS+= SSL_SESSION_get0_hostname.3 SSL_SESSION_get0_alpn_selected.3
-MLINKS+= SSL_SESSION_has_ticket.3 SSL_SESSION_get0_ticket.3
-MLINKS+= SSL_CTX_set_session_ticket_cb.3 SSL_SESSION_get0_ticket_appdata.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_get_app_data.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_get_ex_new_index.3
-MLINKS+= SSL_SESSION_set1_id.3 SSL_SESSION_get_id.3
-MLINKS+= SSL_get_client_random.3 SSL_SESSION_get_master_key.3
-MLINKS+= SSL_read_early_data.3 SSL_SESSION_get_max_early_data.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_SESSION_get_max_fragment_length.3
-MLINKS+= SSL_SESSION_has_ticket.3 SSL_SESSION_get_ticket_lifetime_hint.3
-MLINKS+= SSL_SESSION_get_time.3 SSL_SESSION_get_timeout.3
MLINKS+= SSL_SESSION_free.3 SSL_SESSION_new.3
-MLINKS+= SSL_SESSION_print.3 SSL_SESSION_print_fp.3
-MLINKS+= SSL_SESSION_print.3 SSL_SESSION_print_keylog.3
+MLINKS+= SSL_SESSION_free.3 SSL_SESSION_up_ref.3
+MLINKS+= SSL_SESSION_get0_cipher.3 SSL_SESSION_set_cipher.3
+MLINKS+= SSL_SESSION_get0_hostname.3 SSL_SESSION_get0_alpn_selected.3
MLINKS+= SSL_SESSION_get0_hostname.3 SSL_SESSION_set1_alpn_selected.3
MLINKS+= SSL_SESSION_get0_hostname.3 SSL_SESSION_set1_hostname.3
MLINKS+= SSL_SESSION_get0_id_context.3 SSL_SESSION_set1_id_context.3
-MLINKS+= SSL_get_client_random.3 SSL_SESSION_set1_master_key.3
-MLINKS+= SSL_CTX_set_session_ticket_cb.3 SSL_SESSION_set1_ticket_appdata.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_set_app_data.3
-MLINKS+= SSL_SESSION_get0_cipher.3 SSL_SESSION_set_cipher.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_SESSION_set_ex_data.3
-MLINKS+= SSL_read_early_data.3 SSL_SESSION_set_max_early_data.3
MLINKS+= SSL_SESSION_get_protocol_version.3 SSL_SESSION_set_protocol_version.3
+MLINKS+= SSL_SESSION_get_time.3 SSL_SESSION_get_time_ex.3
+MLINKS+= SSL_SESSION_get_time.3 SSL_SESSION_get_timeout.3
MLINKS+= SSL_SESSION_get_time.3 SSL_SESSION_set_time.3
+MLINKS+= SSL_SESSION_get_time.3 SSL_SESSION_set_time_ex.3
MLINKS+= SSL_SESSION_get_time.3 SSL_SESSION_set_timeout.3
-MLINKS+= SSL_SESSION_free.3 SSL_SESSION_up_ref.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_add0_chain_cert.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_add1_chain_cert.3
-MLINKS+= SSL_set1_host.3 SSL_add1_host.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_add1_to_CA_list.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_add_client_CA.3
-MLINKS+= SSL_load_client_CA_file.3 SSL_add_dir_cert_subjects_to_stack.3
-MLINKS+= SSL_load_client_CA_file.3 SSL_add_file_cert_subjects_to_stack.3
-MLINKS+= SSL_load_client_CA_file.3 SSL_add_store_cert_subjects_to_stack.3
+MLINKS+= SSL_SESSION_get_time.3 SSL_get_time.3
+MLINKS+= SSL_SESSION_get_time.3 SSL_get_timeout.3
+MLINKS+= SSL_SESSION_get_time.3 SSL_set_time.3
+MLINKS+= SSL_SESSION_get_time.3 SSL_set_timeout.3
+MLINKS+= SSL_SESSION_has_ticket.3 SSL_SESSION_get0_ticket.3
+MLINKS+= SSL_SESSION_has_ticket.3 SSL_SESSION_get_ticket_lifetime_hint.3
+MLINKS+= SSL_SESSION_print.3 SSL_SESSION_print_fp.3
+MLINKS+= SSL_SESSION_print.3 SSL_SESSION_print_keylog.3
+MLINKS+= SSL_SESSION_set1_id.3 SSL_SESSION_get_id.3
+MLINKS+= SSL_accept_stream.3 SSL_ACCEPT_STREAM_NO_BLOCK.3
+MLINKS+= SSL_accept_stream.3 SSL_get_accept_stream_queue_len.3
MLINKS+= SSL_alert_type_string.3 SSL_alert_desc_string.3
MLINKS+= SSL_alert_type_string.3 SSL_alert_desc_string_long.3
MLINKS+= SSL_alert_type_string.3 SSL_alert_type_string_long.3
-MLINKS+= SSL_read_early_data.3 SSL_allow_early_data_cb_fn.3
-MLINKS+= SSL_set_async_callback.3 SSL_async_callback_fn.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_build_cert_chain.3
-MLINKS+= SSL_get_ciphers.3 SSL_bytes_to_cipher_list.3
-MLINKS+= SSL_CTX_ctrl.3 SSL_callback_ctrl.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_check_private_key.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_clear_chain_certs.3
-MLINKS+= SSL_CTX_set_mode.3 SSL_clear_mode.3
-MLINKS+= SSL_CTX_set_options.3 SSL_clear_options.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_cb_fn.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_ciphers.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_compression_methods.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_ext.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_legacy_version.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_random.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get0_session_id.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_get1_extensions_present.3
-MLINKS+= SSL_CTX_set_client_hello_cb.3 SSL_client_hello_isv2.3
-MLINKS+= SSL_get_version.3 SSL_client_version.3
-MLINKS+= SSL_CTX_config.3 SSL_config.3
-MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_ct_is_enabled.3
-MLINKS+= SSL_CTX_ctrl.3 SSL_ctrl.3
+MLINKS+= SSL_alloc_buffers.3 SSL_free_buffers.3
+MLINKS+= SSL_export_keying_material.3 SSL_export_keying_material_early.3
+MLINKS+= SSL_extension_supported.3 SSL_CTX_add_client_custom_ext.3
+MLINKS+= SSL_extension_supported.3 SSL_CTX_add_custom_ext.3
+MLINKS+= SSL_extension_supported.3 SSL_CTX_add_server_custom_ext.3
MLINKS+= SSL_extension_supported.3 SSL_custom_ext_add_cb_ex.3
MLINKS+= SSL_extension_supported.3 SSL_custom_ext_free_cb_ex.3
MLINKS+= SSL_extension_supported.3 SSL_custom_ext_parse_cb_ex.3
-MLINKS+= SSL_CTX_dane_enable.3 SSL_dane_clear_flags.3
-MLINKS+= SSL_CTX_dane_enable.3 SSL_dane_enable.3
-MLINKS+= SSL_CTX_dane_enable.3 SSL_dane_set_flags.3
-MLINKS+= SSL_CTX_dane_enable.3 SSL_dane_tlsa_add.3
-MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_disable_ct.3
-MLINKS+= SSL_new.3 SSL_dup.3
-MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_enable_ct.3
-MLINKS+= SSL_export_keying_material.3 SSL_export_keying_material_early.3
-MLINKS+= SSL_alloc_buffers.3 SSL_free_buffers.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_get0_CA_list.3
-MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_get0_alpn_selected.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_get0_chain_cert_store.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_get0_chain_certs.3
-MLINKS+= SSL_CTX_dane_enable.3 SSL_get0_dane_authority.3
-MLINKS+= SSL_CTX_dane_enable.3 SSL_get0_dane_tlsa.3
-MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_get0_next_proto_negotiated.3
-MLINKS+= SSL_CTX_get0_param.3 SSL_get0_param.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_get0_peer_CA_list.3
-MLINKS+= SSL_get_peer_certificate.3 SSL_get0_peer_certificate.3
-MLINKS+= SSL_set1_host.3 SSL_get0_peername.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_get0_security_ex_data.3
-MLINKS+= SSL_get_session.3 SSL_get0_session.3
-MLINKS+= SSL_get_peer_cert_chain.3 SSL_get0_verified_chain.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_get0_verify_cert_store.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_get1_curves.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_get1_groups.3
-MLINKS+= SSL_get_peer_certificate.3 SSL_get1_peer_certificate.3
-MLINKS+= SSL_get_session.3 SSL_get1_session.3
-MLINKS+= SSL_get_ciphers.3 SSL_get1_supported_ciphers.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_get_app_data.3
-MLINKS+= SSL_set_async_callback.3 SSL_get_async_status.3
+MLINKS+= SSL_extension_supported.3 custom_ext_add_cb.3
+MLINKS+= SSL_extension_supported.3 custom_ext_free_cb.3
+MLINKS+= SSL_extension_supported.3 custom_ext_parse_cb.3
+MLINKS+= SSL_get0_connection.3 SSL_is_connection.3
+MLINKS+= SSL_get0_peer_rpk.3 SSL_SESSION_get0_peer_rpk.3
+MLINKS+= SSL_get0_peer_rpk.3 SSL_add_expected_rpk.3
+MLINKS+= SSL_get0_peer_rpk.3 SSL_get_negotiated_client_cert_type.3
+MLINKS+= SSL_get0_peer_rpk.3 SSL_get_negotiated_server_cert_type.3
MLINKS+= SSL_get_all_async_fds.3 SSL_get_changed_async_fds.3
+MLINKS+= SSL_get_all_async_fds.3 SSL_waiting_for_async.3
+MLINKS+= SSL_get_certificate.3 SSL_get_privatekey.3
+MLINKS+= SSL_get_ciphers.3 SSL_CTX_get_ciphers.3
+MLINKS+= SSL_get_ciphers.3 SSL_bytes_to_cipher_list.3
+MLINKS+= SSL_get_ciphers.3 SSL_get1_supported_ciphers.3
+MLINKS+= SSL_get_ciphers.3 SSL_get_cipher_list.3
+MLINKS+= SSL_get_ciphers.3 SSL_get_client_ciphers.3
+MLINKS+= SSL_get_ciphers.3 SSL_get_shared_ciphers.3
+MLINKS+= SSL_get_client_random.3 SSL_SESSION_get_master_key.3
+MLINKS+= SSL_get_client_random.3 SSL_SESSION_set1_master_key.3
+MLINKS+= SSL_get_client_random.3 SSL_get_server_random.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_AEAD_LIMIT_REACHED.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_APPLICATION_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_CONNECTION_REFUSED.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_CRYPTO_ERR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_CRYPTO_ERR_BEGIN.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_CRYPTO_ERR_END.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_FINAL_SIZE_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_FLOW_CONTROL_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_FRAME_ENCODING_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_INTERNAL_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_INVALID_TOKEN.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_KEY_UPDATE_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_NO_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_NO_VIABLE_PATH.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_PROTOCOL_VIOLATION.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_STREAM_LIMIT_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_STREAM_STATE_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_ERR_TRANSPORT_PARAMETER_ERROR.3
+MLINKS+= SSL_get_conn_close_info.3 OSSL_QUIC_LOCAL_ERR_IDLE_TIMEOUT.3
+MLINKS+= SSL_get_conn_close_info.3 SSL_CONN_CLOSE_FLAG_LOCAL.3
+MLINKS+= SSL_get_conn_close_info.3 SSL_CONN_CLOSE_FLAG_TRANSPORT.3
MLINKS+= SSL_get_current_cipher.3 SSL_get_cipher.3
MLINKS+= SSL_get_current_cipher.3 SSL_get_cipher_bits.3
-MLINKS+= SSL_get_ciphers.3 SSL_get_cipher_list.3
MLINKS+= SSL_get_current_cipher.3 SSL_get_cipher_name.3
MLINKS+= SSL_get_current_cipher.3 SSL_get_cipher_version.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_get_client_CA_list.3
-MLINKS+= SSL_get_ciphers.3 SSL_get_client_ciphers.3
-MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_get_default_passwd_cb.3
-MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_get_default_passwd_cb_userdata.3
-MLINKS+= SSL_read_early_data.3 SSL_get_early_data_status.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_get_ex_data.3
-MLINKS+= SSL_CTX_set_verify.3 SSL_get_ex_data_X509_STORE_CTX_idx.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_get_ex_new_index.3
-MLINKS+= SSL_CTX_set_info_callback.3 SSL_get_info_callback.3
-MLINKS+= SSL_key_update.3 SSL_get_key_update_type.3
-MLINKS+= SSL_CTX_set_max_cert_list.3 SSL_get_max_cert_list.3
-MLINKS+= SSL_read_early_data.3 SSL_get_max_early_data.3
-MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_get_max_proto_version.3
-MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_get_min_proto_version.3
-MLINKS+= SSL_CTX_set_mode.3 SSL_get_mode.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_get_negotiated_group.3
-MLINKS+= SSL_CTX_set_num_tickets.3 SSL_get_num_tickets.3
-MLINKS+= SSL_CTX_set_options.3 SSL_get_options.3
-MLINKS+= SSL_get_peer_signature_nid.3 SSL_get_peer_signature_type_nid.3
MLINKS+= SSL_get_current_cipher.3 SSL_get_pending_cipher.3
-MLINKS+= SSL_get_certificate.3 SSL_get_privatekey.3
-MLINKS+= SSL_get_psk_identity.3 SSL_get_psk_identity_hint.3
-MLINKS+= SSL_CTX_set_quiet_shutdown.3 SSL_get_quiet_shutdown.3
-MLINKS+= SSL_CTX_set_read_ahead.3 SSL_get_read_ahead.3
-MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_get_record_padding_callback_arg.3
-MLINKS+= SSL_read_early_data.3 SSL_get_recv_max_early_data.3
MLINKS+= SSL_get_fd.3 SSL_get_rfd.3
-MLINKS+= SSL_CTX_set_options.3 SSL_get_secure_renegotiation_support.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_get_security_callback.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_get_security_level.3
-MLINKS+= SSL_CTX_set_tlsext_use_srtp.3 SSL_get_selected_srtp_profile.3
-MLINKS+= SSL_get_client_random.3 SSL_get_server_random.3
-MLINKS+= SSL_get_peer_tmp_key.3 SSL_get_server_tmp_key.3
-MLINKS+= SSL_CTX_set_tlsext_servername_callback.3 SSL_get_servername.3
-MLINKS+= SSL_CTX_set_tlsext_servername_callback.3 SSL_get_servername_type.3
-MLINKS+= SSL_get_ciphers.3 SSL_get_shared_ciphers.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_get_shared_curve.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_get_shared_group.3
-MLINKS+= SSL_set_shutdown.3 SSL_get_shutdown.3
-MLINKS+= SSL_get_shared_sigalgs.3 SSL_get_sigalgs.3
+MLINKS+= SSL_get_fd.3 SSL_get_wfd.3
+MLINKS+= SSL_get_peer_cert_chain.3 SSL_get0_verified_chain.3
+MLINKS+= SSL_get_peer_certificate.3 SSL_get0_peer_certificate.3
+MLINKS+= SSL_get_peer_certificate.3 SSL_get1_peer_certificate.3
+MLINKS+= SSL_get_peer_signature_nid.3 SSL_get0_peer_signature_name.3
+MLINKS+= SSL_get_peer_signature_nid.3 SSL_get0_signature_name.3
+MLINKS+= SSL_get_peer_signature_nid.3 SSL_get_peer_signature_type_nid.3
MLINKS+= SSL_get_peer_signature_nid.3 SSL_get_signature_nid.3
MLINKS+= SSL_get_peer_signature_nid.3 SSL_get_signature_type_nid.3
-MLINKS+= SSL_CTX_set_srp_password.3 SSL_get_srp_N.3
-MLINKS+= SSL_CTX_set_srp_password.3 SSL_get_srp_g.3
-MLINKS+= SSL_CTX_set_srp_password.3 SSL_get_srp_userinfo.3
-MLINKS+= SSL_CTX_set_srp_password.3 SSL_get_srp_username.3
-MLINKS+= SSL_CTX_set_tlsext_use_srtp.3 SSL_get_srtp_profiles.3
-MLINKS+= SSL_CTX_set_ssl_version.3 SSL_get_ssl_method.3
-MLINKS+= SSL_in_init.3 SSL_get_state.3
-MLINKS+= SSL_SESSION_get_time.3 SSL_get_time.3
-MLINKS+= SSL_SESSION_get_time.3 SSL_get_timeout.3
-MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_get_tlsext_status_ocsp_resp.3
-MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_get_tlsext_status_type.3
+MLINKS+= SSL_get_peer_tmp_key.3 SSL_get_server_tmp_key.3
MLINKS+= SSL_get_peer_tmp_key.3 SSL_get_tmp_key.3
-MLINKS+= SSL_CTX_get_verify_mode.3 SSL_get_verify_callback.3
-MLINKS+= SSL_CTX_get_verify_mode.3 SSL_get_verify_depth.3
-MLINKS+= SSL_CTX_get_verify_mode.3 SSL_get_verify_mode.3
+MLINKS+= SSL_get_psk_identity.3 SSL_get_psk_identity_hint.3
MLINKS+= SSL_get_rbio.3 SSL_get_wbio.3
-MLINKS+= SSL_get_fd.3 SSL_get_wfd.3
-MLINKS+= SSL_CTX_set_generate_session_id.3 SSL_has_matching_session_id.3
-MLINKS+= SSL_pending.3 SSL_has_pending.3
+MLINKS+= SSL_get_rpoll_descriptor.3 SSL_get_wpoll_descriptor.3
+MLINKS+= SSL_get_rpoll_descriptor.3 SSL_net_read_desired.3
+MLINKS+= SSL_get_rpoll_descriptor.3 SSL_net_write_desired.3
+MLINKS+= SSL_get_session.3 SSL_get0_session.3
+MLINKS+= SSL_get_session.3 SSL_get1_session.3
+MLINKS+= SSL_get_shared_sigalgs.3 SSL_get_sigalgs.3
+MLINKS+= SSL_get_stream_id.3 SSL_STREAM_TYPE_BIDI.3
+MLINKS+= SSL_get_stream_id.3 SSL_STREAM_TYPE_NONE.3
+MLINKS+= SSL_get_stream_id.3 SSL_STREAM_TYPE_READ.3
+MLINKS+= SSL_get_stream_id.3 SSL_STREAM_TYPE_WRITE.3
+MLINKS+= SSL_get_stream_id.3 SSL_get_stream_type.3
+MLINKS+= SSL_get_stream_id.3 SSL_is_stream_local.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_STREAM_STATE_CONN_CLOSED.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_STREAM_STATE_FINISHED.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_STREAM_STATE_NONE.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_STREAM_STATE_OK.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_STREAM_STATE_RESET_LOCAL.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_STREAM_STATE_RESET_REMOTE.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_STREAM_STATE_WRONG_DIR.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_get_stream_read_error_code.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_get_stream_write_error_code.3
+MLINKS+= SSL_get_stream_read_state.3 SSL_get_stream_write_state.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_CLASS_FEATURE_NEGOTIATED.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_CLASS_FEATURE_PEER_REQUEST.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_CLASS_FEATURE_REQUEST.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_CLASS_GENERIC.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_EVENT_HANDLING_MODE.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_EVENT_HANDLING_MODE_INHERIT.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_QUIC_IDLE_TIMEOUT.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_QUIC_STREAM_BIDI_LOCAL_AVAIL.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_QUIC_STREAM_BIDI_REMOTE_AVAIL.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_QUIC_STREAM_UNI_LOCAL_AVAIL.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_STREAM_WRITE_BUF_AVAIL.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_STREAM_WRITE_BUF_SIZE.3
+MLINKS+= SSL_get_value_uint.3 SSL_VALUE_STREAM_WRITE_BUF_USED.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_event_handling_mode.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_feature_negotiated_uint.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_feature_peer_request_uint.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_feature_request_uint.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_generic_value_uint.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_quic_stream_bidi_local_avail.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_quic_stream_bidi_remote_avail.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_quic_stream_uni_local_avail.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_quic_stream_uni_remote_avail.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_stream_write_buf_avail.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_stream_write_buf_size.3
+MLINKS+= SSL_get_value_uint.3 SSL_get_stream_write_buf_used.3
+MLINKS+= SSL_get_value_uint.3 SSL_set_event_handling_mode.3
+MLINKS+= SSL_get_value_uint.3 SSL_set_feature_request_uint.3
+MLINKS+= SSL_get_value_uint.3 SSL_set_generic_value_uint.3
+MLINKS+= SSL_get_value_uint.3 SSL_set_value_uint.3
+MLINKS+= SSL_get_version.3 SSL_client_version.3
+MLINKS+= SSL_get_version.3 SSL_is_dtls.3
+MLINKS+= SSL_get_version.3 SSL_is_quic.3
+MLINKS+= SSL_get_version.3 SSL_is_tls.3
+MLINKS+= SSL_get_version.3 SSL_version.3
+MLINKS+= SSL_in_init.3 SSL_get_state.3
MLINKS+= SSL_in_init.3 SSL_in_accept_init.3
MLINKS+= SSL_in_init.3 SSL_in_before.3
MLINKS+= SSL_in_init.3 SSL_in_connect_init.3
-MLINKS+= SSL_get_version.3 SSL_is_dtls.3
MLINKS+= SSL_in_init.3 SSL_is_init_finished.3
-MLINKS+= SSL_set_connect_state.3 SSL_is_server.3
+MLINKS+= SSL_key_update.3 SSL_get_key_update_type.3
+MLINKS+= SSL_key_update.3 SSL_renegotiate.3
+MLINKS+= SSL_key_update.3 SSL_renegotiate_abbreviated.3
+MLINKS+= SSL_key_update.3 SSL_renegotiate_pending.3
+MLINKS+= SSL_library_init.3 OpenSSL_add_ssl_algorithms.3
+MLINKS+= SSL_load_client_CA_file.3 SSL_add_dir_cert_subjects_to_stack.3
+MLINKS+= SSL_load_client_CA_file.3 SSL_add_file_cert_subjects_to_stack.3
+MLINKS+= SSL_load_client_CA_file.3 SSL_add_store_cert_subjects_to_stack.3
MLINKS+= SSL_load_client_CA_file.3 SSL_load_client_CA_file_ex.3
-MLINKS+= ERR_load_crypto_strings.3 SSL_load_error_strings.3
-MLINKS+= SSL_CTX_set_num_tickets.3 SSL_new_session_ticket.3
+MLINKS+= SSL_new.3 SSL_dup.3
+MLINKS+= SSL_new.3 SSL_up_ref.3
+MLINKS+= SSL_new_domain.3 SSL_get0_domain.3
+MLINKS+= SSL_new_domain.3 SSL_is_domain.3
+MLINKS+= SSL_new_listener.3 SSL_ACCEPT_CONNECTION_NO_BLOCK.3
+MLINKS+= SSL_new_listener.3 SSL_accept_connection.3
+MLINKS+= SSL_new_listener.3 SSL_get0_listener.3
+MLINKS+= SSL_new_listener.3 SSL_get_accept_connection_queue_len.3
+MLINKS+= SSL_new_listener.3 SSL_is_listener.3
+MLINKS+= SSL_new_listener.3 SSL_listen.3
+MLINKS+= SSL_new_listener.3 SSL_new_from_listener.3
+MLINKS+= SSL_new_listener.3 SSL_new_listener_from.3
+MLINKS+= SSL_new_stream.3 SSL_STREAM_FLAG_ADVANCE.3
+MLINKS+= SSL_new_stream.3 SSL_STREAM_FLAG_NO_BLOCK.3
+MLINKS+= SSL_new_stream.3 SSL_STREAM_FLAG_UNI.3
+MLINKS+= SSL_pending.3 SSL_has_pending.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_E.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_EC.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_ECD.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_ER.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_EW.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_F.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_I.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_IS.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_ISB.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_ISE.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_ISU.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_NONE.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_OS.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_OSB.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_OSE.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_OSU.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_R.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_RE.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_RW.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_RWE.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_W.3
+MLINKS+= SSL_poll.3 SSL_POLL_EVENT_WE.3
+MLINKS+= SSL_poll.3 SSL_POLL_FLAG_NO_HANDLE_EVENTS.3
MLINKS+= SSL_read.3 SSL_peek.3
MLINKS+= SSL_read.3 SSL_peek_ex.3
-MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_psk_client_cb_func.3
-MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_psk_find_session_cb_func.3
-MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_psk_server_cb_func.3
-MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_psk_use_session_cb_func.3
MLINKS+= SSL_read.3 SSL_read_ex.3
-MLINKS+= SSL_key_update.3 SSL_renegotiate.3
-MLINKS+= SSL_key_update.3 SSL_renegotiate_abbreviated.3
-MLINKS+= SSL_key_update.3 SSL_renegotiate_pending.3
+MLINKS+= SSL_read_early_data.3 SSL_CTX_get_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_CTX_get_recv_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_CTX_set_allow_early_data_cb.3
+MLINKS+= SSL_read_early_data.3 SSL_CTX_set_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_CTX_set_recv_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_SESSION_get_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_SESSION_set_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_allow_early_data_cb_fn.3
+MLINKS+= SSL_read_early_data.3 SSL_get_early_data_status.3
+MLINKS+= SSL_read_early_data.3 SSL_get_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_get_recv_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_set_allow_early_data_cb.3
+MLINKS+= SSL_read_early_data.3 SSL_set_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_set_recv_max_early_data.3
+MLINKS+= SSL_read_early_data.3 SSL_write_early_data.3
MLINKS+= SSL_rstate_string.3 SSL_rstate_string_long.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_select_current_cert.3
-MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_select_next_proto.3
-MLINKS+= SSL_write.3 SSL_sendfile.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_set0_CA_list.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_set0_chain.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_set0_chain_cert_store.3
+MLINKS+= SSL_set1_host.3 SSL_add1_host.3
+MLINKS+= SSL_set1_host.3 SSL_get0_peername.3
+MLINKS+= SSL_set1_host.3 SSL_set_hostflags.3
+MLINKS+= SSL_set1_server_cert_type.3 SSL_CTX_get0_client_cert_type.3
+MLINKS+= SSL_set1_server_cert_type.3 SSL_CTX_get0_server_cert_type.3
+MLINKS+= SSL_set1_server_cert_type.3 SSL_CTX_set1_client_cert_type.3
+MLINKS+= SSL_set1_server_cert_type.3 SSL_CTX_set1_server_cert_type.3
+MLINKS+= SSL_set1_server_cert_type.3 SSL_get0_client_cert_type.3
+MLINKS+= SSL_set1_server_cert_type.3 SSL_get0_server_cert_type.3
+MLINKS+= SSL_set1_server_cert_type.3 SSL_set1_client_cert_type.3
+MLINKS+= SSL_set_async_callback.3 SSL_CTX_set_async_callback.3
+MLINKS+= SSL_set_async_callback.3 SSL_CTX_set_async_callback_arg.3
+MLINKS+= SSL_set_async_callback.3 SSL_async_callback_fn.3
+MLINKS+= SSL_set_async_callback.3 SSL_get_async_status.3
+MLINKS+= SSL_set_async_callback.3 SSL_set_async_callback_arg.3
MLINKS+= SSL_set_bio.3 SSL_set0_rbio.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_set0_security_ex_data.3
-MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_set0_tmp_dh_pkey.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_set0_verify_cert_store.3
MLINKS+= SSL_set_bio.3 SSL_set0_wbio.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_set1_chain.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_set1_chain_cert_store.3
-MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_set1_client_sigalgs.3
-MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_set1_client_sigalgs_list.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_set1_curves.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_set1_curves_list.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_set1_groups.3
-MLINKS+= SSL_CTX_set1_curves.3 SSL_set1_groups_list.3
-MLINKS+= SSL_CTX_get0_param.3 SSL_set1_param.3
-MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_set1_sigalgs.3
-MLINKS+= SSL_CTX_set1_sigalgs.3 SSL_set1_sigalgs_list.3
-MLINKS+= SSL_CTX_set1_verify_cert_store.3 SSL_set1_verify_cert_store.3
+MLINKS+= SSL_set_blocking_mode.3 SSL_get_blocking_mode.3
+MLINKS+= SSL_set_connect_state.3 SSL_is_server.3
MLINKS+= SSL_set_connect_state.3 SSL_set_accept_state.3
-MLINKS+= SSL_read_early_data.3 SSL_set_allow_early_data_cb.3
-MLINKS+= SSL_CTX_set_alpn_select_cb.3 SSL_set_alpn_protos.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_set_app_data.3
-MLINKS+= SSL_set_async_callback.3 SSL_set_async_callback_arg.3
-MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_set_block_padding.3
-MLINKS+= SSL_CTX_set_cert_cb.3 SSL_set_cert_cb.3
-MLINKS+= SSL_CTX_set_cipher_list.3 SSL_set_cipher_list.3
-MLINKS+= SSL_CTX_set_cipher_list.3 SSL_set_ciphersuites.3
-MLINKS+= SSL_CTX_set0_CA_list.3 SSL_set_client_CA_list.3
-MLINKS+= SSL_CTX_set_ct_validation_callback.3 SSL_set_ct_validation_callback.3
-MLINKS+= SSL_CTX_add1_chain_cert.3 SSL_set_current_cert.3
-MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_set_default_passwd_cb.3
-MLINKS+= SSL_CTX_set_default_passwd_cb.3 SSL_set_default_passwd_cb_userdata.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_default_read_buffer_len.3
-MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_set_dh_auto.3
-MLINKS+= SSL_CTX_set_tmp_ecdh.3 SSL_set_ecdh_auto.3
-MLINKS+= BIO_get_ex_new_index.3 SSL_set_ex_data.3
-MLINKS+= SSL_CTX_set_generate_session_id.3 SSL_set_generate_session_id.3
-MLINKS+= SSL_set1_host.3 SSL_set_hostflags.3
-MLINKS+= SSL_CTX_set_info_callback.3 SSL_set_info_callback.3
-MLINKS+= SSL_CTX_set_max_cert_list.3 SSL_set_max_cert_list.3
-MLINKS+= SSL_read_early_data.3 SSL_set_max_early_data.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_max_pipelines.3
-MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_set_max_proto_version.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_max_send_fragment.3
-MLINKS+= SSL_CTX_set_min_proto_version.3 SSL_set_min_proto_version.3
-MLINKS+= SSL_CTX_set_mode.3 SSL_set_mode.3
-MLINKS+= SSL_CTX_set_msg_callback.3 SSL_set_msg_callback.3
-MLINKS+= SSL_CTX_set_msg_callback.3 SSL_set_msg_callback_arg.3
-MLINKS+= SSL_CTX_set_num_tickets.3 SSL_set_num_tickets.3
-MLINKS+= SSL_CTX_set_options.3 SSL_set_options.3
-MLINKS+= SSL_CTX_set_verify.3 SSL_set_post_handshake_auth.3
-MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_set_psk_client_callback.3
-MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_set_psk_find_session_callback.3
-MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_set_psk_server_callback.3
-MLINKS+= SSL_CTX_set_psk_client_callback.3 SSL_set_psk_use_session_callback.3
-MLINKS+= SSL_CTX_get0_param.3 SSL_set_purpose.3
-MLINKS+= SSL_CTX_set_quiet_shutdown.3 SSL_set_quiet_shutdown.3
-MLINKS+= SSL_CTX_set_read_ahead.3 SSL_set_read_ahead.3
-MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_set_record_padding_callback.3
-MLINKS+= SSL_CTX_set_record_padding_callback.3 SSL_set_record_padding_callback_arg.3
-MLINKS+= SSL_read_early_data.3 SSL_set_recv_max_early_data.3
+MLINKS+= SSL_set_default_stream_mode.3 SSL_DEFAULT_STREAM_MODE_AUTO_BIDI.3
+MLINKS+= SSL_set_default_stream_mode.3 SSL_DEFAULT_STREAM_MODE_AUTO_UNI.3
+MLINKS+= SSL_set_default_stream_mode.3 SSL_DEFAULT_STREAM_MODE_NONE.3
MLINKS+= SSL_set_fd.3 SSL_set_rfd.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_set_security_callback.3
-MLINKS+= SSL_CTX_set_security_level.3 SSL_set_security_level.3
-MLINKS+= SSL_CTX_set_session_id_context.3 SSL_set_session_id_context.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_split_send_fragment.3
-MLINKS+= SSL_CTX_set_srp_password.3 SSL_set_srp_server_param.3
-MLINKS+= SSL_CTX_set_srp_password.3 SSL_set_srp_server_param_pw.3
-MLINKS+= SSL_CTX_set_ssl_version.3 SSL_set_ssl_method.3
-MLINKS+= SSL_SESSION_get_time.3 SSL_set_time.3
-MLINKS+= SSL_SESSION_get_time.3 SSL_set_timeout.3
-MLINKS+= SSL_CTX_set_tlsext_servername_callback.3 SSL_set_tlsext_host_name.3
-MLINKS+= SSL_CTX_set_split_send_fragment.3 SSL_set_tlsext_max_fragment_length.3
-MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_set_tlsext_status_ocsp_resp.3
-MLINKS+= SSL_CTX_set_tlsext_status_cb.3 SSL_set_tlsext_status_type.3
-MLINKS+= SSL_CTX_set_tlsext_use_srtp.3 SSL_set_tlsext_use_srtp.3
-MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_set_tmp_dh.3
-MLINKS+= SSL_CTX_set_tmp_dh_callback.3 SSL_set_tmp_dh_callback.3
-MLINKS+= SSL_CTX_set_tmp_ecdh.3 SSL_set_tmp_ecdh.3
-MLINKS+= SSL_CTX_get0_param.3 SSL_set_trust.3
-MLINKS+= SSL_CTX_set_verify.3 SSL_set_verify.3
-MLINKS+= SSL_CTX_set_verify.3 SSL_set_verify_depth.3
MLINKS+= SSL_set_fd.3 SSL_set_wfd.3
+MLINKS+= SSL_set_incoming_stream_policy.3 SSL_INCOMING_STREAM_POLICY_ACCEPT.3
+MLINKS+= SSL_set_incoming_stream_policy.3 SSL_INCOMING_STREAM_POLICY_AUTO.3
+MLINKS+= SSL_set_incoming_stream_policy.3 SSL_INCOMING_STREAM_POLICY_REJECT.3
+MLINKS+= SSL_set_quic_tls_cbs.3 OSSL_FUNC_SSL_QUIC_TLS_alert_fn.3
+MLINKS+= SSL_set_quic_tls_cbs.3 OSSL_FUNC_SSL_QUIC_TLS_crypto_recv_rcd_fn.3
+MLINKS+= SSL_set_quic_tls_cbs.3 OSSL_FUNC_SSL_QUIC_TLS_crypto_release_rcd_fn.3
+MLINKS+= SSL_set_quic_tls_cbs.3 OSSL_FUNC_SSL_QUIC_TLS_crypto_send_fn.3
+MLINKS+= SSL_set_quic_tls_cbs.3 OSSL_FUNC_SSL_QUIC_TLS_got_transport_params_fn.3
+MLINKS+= SSL_set_quic_tls_cbs.3 OSSL_FUNC_SSL_QUIC_TLS_yield_secret_fn.3
+MLINKS+= SSL_set_quic_tls_cbs.3 SSL_set_quic_tls_early_data_enabled.3
+MLINKS+= SSL_set_quic_tls_cbs.3 SSL_set_quic_tls_transport_params.3
+MLINKS+= SSL_set_session_secret_cb.3 tls_session_secret_cb_fn.3
+MLINKS+= SSL_set_shutdown.3 SSL_get_shutdown.3
+MLINKS+= SSL_shutdown.3 SSL_shutdown_ex.3
MLINKS+= SSL_state_string.3 SSL_state_string_long.3
-MLINKS+= DTLSv1_listen.3 SSL_stateless.3
-MLINKS+= SSL_new.3 SSL_up_ref.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_PrivateKey.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_PrivateKey_ASN1.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_PrivateKey_file.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_RSAPrivateKey.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_RSAPrivateKey_ASN1.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_RSAPrivateKey_file.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_cert_and_key.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_certificate.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_certificate_ASN1.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_certificate_chain_file.3
-MLINKS+= SSL_CTX_use_certificate.3 SSL_use_certificate_file.3
-MLINKS+= SSL_CTX_use_psk_identity_hint.3 SSL_use_psk_identity_hint.3
-MLINKS+= SSL_CTX_set_verify.3 SSL_verify_cb.3
-MLINKS+= SSL_CTX_set_verify.3 SSL_verify_client_post_handshake.3
-MLINKS+= SSL_get_version.3 SSL_version.3
-MLINKS+= SSL_get_all_async_fds.3 SSL_waiting_for_async.3
MLINKS+= SSL_want.3 SSL_want_async.3
MLINKS+= SSL_want.3 SSL_want_async_job.3
MLINKS+= SSL_want.3 SSL_want_client_hello_cb.3
@@ -4304,90 +4617,43 @@ MLINKS+= SSL_want.3 SSL_want_read.3
MLINKS+= SSL_want.3 SSL_want_retry_verify.3
MLINKS+= SSL_want.3 SSL_want_write.3
MLINKS+= SSL_want.3 SSL_want_x509_lookup.3
-MLINKS+= SSL_read_early_data.3 SSL_write_early_data.3
+MLINKS+= SSL_write.3 SSL_WRITE_FLAG_CONCLUDE.3
+MLINKS+= SSL_write.3 SSL_sendfile.3
MLINKS+= SSL_write.3 SSL_write_ex.3
-MLINKS+= SSL_CTX_new.3 SSLv23_client_method.3
-MLINKS+= SSL_CTX_new.3 SSLv23_method.3
-MLINKS+= SSL_CTX_new.3 SSLv23_server_method.3
-MLINKS+= SSL_CTX_new.3 SSLv3_client_method.3
-MLINKS+= SSL_CTX_new.3 SSLv3_method.3
-MLINKS+= SSL_CTX_new.3 SSLv3_server_method.3
-MLINKS+= X509_dup.3 SXNETID_free.3
-MLINKS+= X509_dup.3 SXNETID_new.3
-MLINKS+= X509_dup.3 SXNET_free.3
-MLINKS+= X509_dup.3 SXNET_new.3
-MLINKS+= X509_dup.3 TLS_FEATURE_free.3
-MLINKS+= X509_dup.3 TLS_FEATURE_new.3
-MLINKS+= SSL_CTX_new.3 TLS_client_method.3
-MLINKS+= SSL_CTX_new.3 TLS_method.3
-MLINKS+= SSL_CTX_new.3 TLS_server_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_1_client_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_1_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_1_server_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_2_client_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_2_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_2_server_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_client_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_method.3
-MLINKS+= SSL_CTX_new.3 TLSv1_server_method.3
-MLINKS+= X509_dup.3 TS_ACCURACY_dup.3
-MLINKS+= X509_dup.3 TS_ACCURACY_free.3
-MLINKS+= X509_dup.3 TS_ACCURACY_new.3
-MLINKS+= X509_dup.3 TS_MSG_IMPRINT_dup.3
-MLINKS+= X509_dup.3 TS_MSG_IMPRINT_free.3
-MLINKS+= X509_dup.3 TS_MSG_IMPRINT_new.3
-MLINKS+= X509_dup.3 TS_REQ_dup.3
-MLINKS+= X509_dup.3 TS_REQ_free.3
-MLINKS+= X509_dup.3 TS_REQ_new.3
+MLINKS+= SSL_write.3 SSL_write_ex2.3
MLINKS+= TS_RESP_CTX_new.3 TS_RESP_CTX_free.3
MLINKS+= TS_RESP_CTX_new.3 TS_RESP_CTX_new_ex.3
-MLINKS+= X509_dup.3 TS_RESP_dup.3
-MLINKS+= X509_dup.3 TS_RESP_free.3
-MLINKS+= X509_dup.3 TS_RESP_new.3
-MLINKS+= X509_dup.3 TS_STATUS_INFO_dup.3
-MLINKS+= X509_dup.3 TS_STATUS_INFO_free.3
-MLINKS+= X509_dup.3 TS_STATUS_INFO_new.3
-MLINKS+= X509_dup.3 TS_TST_INFO_dup.3
-MLINKS+= X509_dup.3 TS_TST_INFO_free.3
-MLINKS+= X509_dup.3 TS_TST_INFO_new.3
-MLINKS+= UI_new.3 UI.3
-MLINKS+= UI_create_method.3 UI_METHOD.3
-MLINKS+= UI_new.3 UI_OpenSSL.3
-MLINKS+= UI_UTIL_read_pw.3 UI_UTIL_read_pw_string.3
-MLINKS+= UI_UTIL_read_pw.3 UI_UTIL_wrap_read_pem_callback.3
-MLINKS+= UI_new.3 UI_add_error_string.3
-MLINKS+= UI_new.3 UI_add_info_string.3
-MLINKS+= UI_new.3 UI_add_input_boolean.3
-MLINKS+= UI_new.3 UI_add_input_string.3
-MLINKS+= UI_new.3 UI_add_user_data.3
-MLINKS+= UI_new.3 UI_add_verify_string.3
-MLINKS+= UI_new.3 UI_construct_prompt.3
-MLINKS+= UI_new.3 UI_ctrl.3
-MLINKS+= UI_create_method.3 UI_destroy_method.3
-MLINKS+= UI_new.3 UI_dup_error_string.3
-MLINKS+= UI_new.3 UI_dup_info_string.3
-MLINKS+= UI_new.3 UI_dup_input_boolean.3
-MLINKS+= UI_new.3 UI_dup_input_string.3
-MLINKS+= UI_new.3 UI_dup_user_data.3
-MLINKS+= UI_new.3 UI_dup_verify_string.3
-MLINKS+= UI_new.3 UI_free.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTS_set_certs.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_add_flags.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_cleanup.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_free.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_init.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_new.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set0_certs.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set0_data.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set0_imprint.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set0_store.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set_certs.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set_data.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set_flags.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set_imprint.3
+MLINKS+= TS_VERIFY_CTX.3 TS_VERIFY_CTX_set_store.3
MLINKS+= UI_STRING.3 UI_get0_action_string.3
MLINKS+= UI_STRING.3 UI_get0_output_string.3
-MLINKS+= UI_new.3 UI_get0_result.3
MLINKS+= UI_STRING.3 UI_get0_result_string.3
MLINKS+= UI_STRING.3 UI_get0_test_string.3
-MLINKS+= UI_new.3 UI_get0_user_data.3
-MLINKS+= BIO_get_ex_new_index.3 UI_get_app_data.3
-MLINKS+= UI_new.3 UI_get_default_method.3
-MLINKS+= BIO_get_ex_new_index.3 UI_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 UI_get_ex_new_index.3
MLINKS+= UI_STRING.3 UI_get_input_flags.3
-MLINKS+= UI_new.3 UI_get_method.3
-MLINKS+= UI_new.3 UI_get_result_length.3
MLINKS+= UI_STRING.3 UI_get_result_maxsize.3
MLINKS+= UI_STRING.3 UI_get_result_minsize.3
MLINKS+= UI_STRING.3 UI_get_result_string_length.3
MLINKS+= UI_STRING.3 UI_get_string_type.3
+MLINKS+= UI_STRING.3 UI_set_result.3
+MLINKS+= UI_STRING.3 UI_set_result_ex.3
+MLINKS+= UI_STRING.3 UI_string_types.3
+MLINKS+= UI_UTIL_read_pw.3 UI_UTIL_read_pw_string.3
+MLINKS+= UI_UTIL_read_pw.3 UI_UTIL_wrap_read_pem_callback.3
+MLINKS+= UI_create_method.3 UI_METHOD.3
+MLINKS+= UI_create_method.3 UI_destroy_method.3
MLINKS+= UI_create_method.3 UI_method_get_closer.3
MLINKS+= UI_create_method.3 UI_method_get_data_destructor.3
MLINKS+= UI_create_method.3 UI_method_get_data_duplicator.3
@@ -4405,86 +4671,110 @@ MLINKS+= UI_create_method.3 UI_method_set_opener.3
MLINKS+= UI_create_method.3 UI_method_set_prompt_constructor.3
MLINKS+= UI_create_method.3 UI_method_set_reader.3
MLINKS+= UI_create_method.3 UI_method_set_writer.3
+MLINKS+= UI_new.3 UI.3
+MLINKS+= UI_new.3 UI_OpenSSL.3
+MLINKS+= UI_new.3 UI_add_error_string.3
+MLINKS+= UI_new.3 UI_add_info_string.3
+MLINKS+= UI_new.3 UI_add_input_boolean.3
+MLINKS+= UI_new.3 UI_add_input_string.3
+MLINKS+= UI_new.3 UI_add_user_data.3
+MLINKS+= UI_new.3 UI_add_verify_string.3
+MLINKS+= UI_new.3 UI_construct_prompt.3
+MLINKS+= UI_new.3 UI_ctrl.3
+MLINKS+= UI_new.3 UI_dup_error_string.3
+MLINKS+= UI_new.3 UI_dup_info_string.3
+MLINKS+= UI_new.3 UI_dup_input_boolean.3
+MLINKS+= UI_new.3 UI_dup_input_string.3
+MLINKS+= UI_new.3 UI_dup_user_data.3
+MLINKS+= UI_new.3 UI_dup_verify_string.3
+MLINKS+= UI_new.3 UI_free.3
+MLINKS+= UI_new.3 UI_get0_result.3
+MLINKS+= UI_new.3 UI_get0_user_data.3
+MLINKS+= UI_new.3 UI_get_default_method.3
+MLINKS+= UI_new.3 UI_get_method.3
+MLINKS+= UI_new.3 UI_get_result_length.3
MLINKS+= UI_new.3 UI_new_method.3
MLINKS+= UI_new.3 UI_null.3
MLINKS+= UI_new.3 UI_process.3
-MLINKS+= BIO_get_ex_new_index.3 UI_set_app_data.3
MLINKS+= UI_new.3 UI_set_default_method.3
-MLINKS+= BIO_get_ex_new_index.3 UI_set_ex_data.3
MLINKS+= UI_new.3 UI_set_method.3
-MLINKS+= UI_STRING.3 UI_set_result.3
-MLINKS+= UI_STRING.3 UI_set_result_ex.3
-MLINKS+= UI_STRING.3 UI_string_types.3
-MLINKS+= X509_dup.3 USERNOTICE_free.3
-MLINKS+= X509_dup.3 USERNOTICE_new.3
MLINKS+= X509V3_get_d2i.3 X509V3_EXT_d2i.3
MLINKS+= X509V3_get_d2i.3 X509V3_EXT_i2d.3
MLINKS+= X509V3_get_d2i.3 X509V3_add1_i2d.3
+MLINKS+= X509V3_get_d2i.3 X509_ACERT_add1_ext_i2d.3
+MLINKS+= X509V3_get_d2i.3 X509_ACERT_get0_extensions.3
+MLINKS+= X509V3_get_d2i.3 X509_ACERT_get_ext_d2i.3
+MLINKS+= X509V3_get_d2i.3 X509_CRL_add1_ext_i2d.3
+MLINKS+= X509V3_get_d2i.3 X509_CRL_get0_extensions.3
+MLINKS+= X509V3_get_d2i.3 X509_CRL_get_ext_d2i.3
+MLINKS+= X509V3_get_d2i.3 X509_REVOKED_add1_ext_i2d.3
+MLINKS+= X509V3_get_d2i.3 X509_REVOKED_get0_extensions.3
+MLINKS+= X509V3_get_d2i.3 X509_REVOKED_get_ext_d2i.3
+MLINKS+= X509V3_get_d2i.3 X509_add1_ext_i2d.3
+MLINKS+= X509V3_get_d2i.3 X509_get0_extensions.3
+MLINKS+= X509V3_get_d2i.3 X509_get_ext_d2i.3
MLINKS+= X509V3_set_ctx.3 X509V3_set_issuer_pkey.3
+MLINKS+= X509_ACERT_add1_attr.3 X509_ACERT_add1_attr_by_NID.3
+MLINKS+= X509_ACERT_add1_attr.3 X509_ACERT_add1_attr_by_OBJ.3
+MLINKS+= X509_ACERT_add1_attr.3 X509_ACERT_add1_attr_by_txt.3
+MLINKS+= X509_ACERT_add1_attr.3 X509_ACERT_delete_attr.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 OSSL_ISSUER_SERIAL_get0_issuer.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 OSSL_ISSUER_SERIAL_get0_issuerUID.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 OSSL_ISSUER_SERIAL_get0_serial.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 OSSL_ISSUER_SERIAL_set1_issuer.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 OSSL_ISSUER_SERIAL_set1_issuerUID.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 OSSL_ISSUER_SERIAL_set1_serial.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 OSSL_OBJECT_DIGEST_INFO_get0_digest.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 OSSL_OBJECT_DIGEST_INFO_set1_digest.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 X509_ACERT_get0_holder_digest.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 X509_ACERT_get0_holder_entityName.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 X509_ACERT_set0_holder_baseCertId.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 X509_ACERT_set0_holder_digest.3
+MLINKS+= X509_ACERT_get0_holder_baseCertId.3 X509_ACERT_set0_holder_entityName.3
+MLINKS+= X509_ACERT_get_attr.3 X509_ACERT_get_attr_by_NID.3
+MLINKS+= X509_ACERT_get_attr.3 X509_ACERT_get_attr_by_OBJ.3
+MLINKS+= X509_ACERT_get_attr.3 X509_ACERT_get_attr_count.3
+MLINKS+= X509_ACERT_print_ex.3 X509_ACERT_print.3
MLINKS+= X509_ALGOR_dup.3 X509_ALGOR_cmp.3
MLINKS+= X509_ALGOR_dup.3 X509_ALGOR_copy.3
-MLINKS+= X509_dup.3 X509_ALGOR_free.3
MLINKS+= X509_ALGOR_dup.3 X509_ALGOR_get0.3
-MLINKS+= X509_dup.3 X509_ALGOR_it.3
-MLINKS+= X509_dup.3 X509_ALGOR_new.3
MLINKS+= X509_ALGOR_dup.3 X509_ALGOR_set0.3
MLINKS+= X509_ALGOR_dup.3 X509_ALGOR_set_md.3
-MLINKS+= X509_dup.3 X509_ATTRIBUTE_dup.3
-MLINKS+= X509_dup.3 X509_ATTRIBUTE_free.3
-MLINKS+= X509_dup.3 X509_ATTRIBUTE_new.3
-MLINKS+= X509_dup.3 X509_CERT_AUX_free.3
-MLINKS+= X509_dup.3 X509_CERT_AUX_new.3
-MLINKS+= X509_dup.3 X509_CINF_free.3
-MLINKS+= X509_dup.3 X509_CINF_new.3
-MLINKS+= X509_dup.3 X509_CRL_INFO_free.3
-MLINKS+= X509_dup.3 X509_CRL_INFO_new.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_count.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_create.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_create_by_NID.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_create_by_OBJ.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_create_by_txt.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_get0_data.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_get0_object.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_get0_type.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_set1_data.3
+MLINKS+= X509_ATTRIBUTE.3 X509_ATTRIBUTE_set1_object.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_add1_attr.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_add1_attr_by_NID.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_add1_attr_by_OBJ.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_add1_attr_by_txt.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_delete_attr.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_get0_data_by_OBJ.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_get_attr.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_get_attr_by_NID.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_get_attr_by_OBJ.3
+MLINKS+= X509_ATTRIBUTE.3 X509at_get_attr_count.3
MLINKS+= X509_CRL_get0_by_serial.3 X509_CRL_add0_revoked.3
-MLINKS+= X509V3_get_d2i.3 X509_CRL_add1_ext_i2d.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_add_ext.3
-MLINKS+= X509_cmp.3 X509_CRL_cmp.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_delete_ext.3
-MLINKS+= X509_digest.3 X509_CRL_digest.3
-MLINKS+= X509_dup.3 X509_CRL_dup.3
-MLINKS+= X509_dup.3 X509_CRL_free.3
MLINKS+= X509_CRL_get0_by_serial.3 X509_CRL_get0_by_cert.3
-MLINKS+= X509V3_get_d2i.3 X509_CRL_get0_extensions.3
-MLINKS+= X509_get0_notBefore.3 X509_CRL_get0_lastUpdate.3
-MLINKS+= X509_get0_notBefore.3 X509_CRL_get0_nextUpdate.3
-MLINKS+= X509_get0_signature.3 X509_CRL_get0_signature.3
MLINKS+= X509_CRL_get0_by_serial.3 X509_CRL_get_REVOKED.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext_by_NID.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext_by_OBJ.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext_by_critical.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext_count.3
-MLINKS+= X509V3_get_d2i.3 X509_CRL_get_ext_d2i.3
-MLINKS+= X509_get_subject_name.3 X509_CRL_get_issuer.3
-MLINKS+= X509_get0_signature.3 X509_CRL_get_signature_nid.3
-MLINKS+= X509_get_version.3 X509_CRL_get_version.3
-MLINKS+= X509_load_http.3 X509_CRL_http_nbio.3
-MLINKS+= X509_load_http.3 X509_CRL_load_http.3
-MLINKS+= X509_cmp.3 X509_CRL_match.3
-MLINKS+= X509_dup.3 X509_CRL_new.3
-MLINKS+= X509_dup.3 X509_CRL_new_ex.3
-MLINKS+= X509_get0_notBefore.3 X509_CRL_set1_lastUpdate.3
-MLINKS+= X509_get0_notBefore.3 X509_CRL_set1_nextUpdate.3
-MLINKS+= X509_get_subject_name.3 X509_CRL_set_issuer_name.3
-MLINKS+= X509_get_version.3 X509_CRL_set_version.3
-MLINKS+= X509_sign.3 X509_CRL_sign.3
-MLINKS+= X509_sign.3 X509_CRL_sign_ctx.3
MLINKS+= X509_CRL_get0_by_serial.3 X509_CRL_sort.3
-MLINKS+= X509_verify.3 X509_CRL_verify.3
+MLINKS+= X509_CRL_get0_by_serial.3 X509_REVOKED_get0_revocationDate.3
+MLINKS+= X509_CRL_get0_by_serial.3 X509_REVOKED_get0_serialNumber.3
+MLINKS+= X509_CRL_get0_by_serial.3 X509_REVOKED_set_revocationDate.3
+MLINKS+= X509_CRL_get0_by_serial.3 X509_REVOKED_set_serialNumber.3
MLINKS+= X509_EXTENSION_set_object.3 X509_EXTENSION_create_by_NID.3
MLINKS+= X509_EXTENSION_set_object.3 X509_EXTENSION_create_by_OBJ.3
-MLINKS+= X509_dup.3 X509_EXTENSION_dup.3
-MLINKS+= X509_dup.3 X509_EXTENSION_free.3
MLINKS+= X509_EXTENSION_set_object.3 X509_EXTENSION_get_critical.3
MLINKS+= X509_EXTENSION_set_object.3 X509_EXTENSION_get_data.3
MLINKS+= X509_EXTENSION_set_object.3 X509_EXTENSION_get_object.3
-MLINKS+= X509_dup.3 X509_EXTENSION_new.3
MLINKS+= X509_EXTENSION_set_object.3 X509_EXTENSION_set_critical.3
MLINKS+= X509_EXTENSION_set_object.3 X509_EXTENSION_set_data.3
-MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_METHOD.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_TYPE.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_add_dir.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_add_store.3
@@ -4496,13 +4786,7 @@ MLINKS+= X509_LOOKUP.3 X509_LOOKUP_by_subject.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_by_subject_ex.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_ctrl.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_ctrl_ex.3
-MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_ctrl_fn.3
-MLINKS+= X509_LOOKUP_hash_dir.3 X509_LOOKUP_file.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_free.3
-MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_get_by_alias_fn.3
-MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_get_by_fingerprint_fn.3
-MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_get_by_issuer_serial_fn.3
-MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_get_by_subject_fn.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_get_method_data.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_get_store.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_init.3
@@ -4510,6 +4794,22 @@ MLINKS+= X509_LOOKUP.3 X509_LOOKUP_load_file.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_load_file_ex.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_load_store.3
MLINKS+= X509_LOOKUP.3 X509_LOOKUP_load_store_ex.3
+MLINKS+= X509_LOOKUP.3 X509_LOOKUP_new.3
+MLINKS+= X509_LOOKUP.3 X509_LOOKUP_set_method_data.3
+MLINKS+= X509_LOOKUP.3 X509_LOOKUP_shutdown.3
+MLINKS+= X509_LOOKUP_hash_dir.3 X509_LOOKUP_file.3
+MLINKS+= X509_LOOKUP_hash_dir.3 X509_LOOKUP_store.3
+MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_cert_crl_file.3
+MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_cert_crl_file_ex.3
+MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_cert_file.3
+MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_cert_file_ex.3
+MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_crl_file.3
+MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_METHOD.3
+MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_ctrl_fn.3
+MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_get_by_alias_fn.3
+MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_get_by_fingerprint_fn.3
+MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_get_by_issuer_serial_fn.3
+MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_get_by_subject_fn.3
MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_meth_free.3
MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_meth_get_ctrl.3
MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_meth_get_free.3
@@ -4529,40 +4829,26 @@ MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_meth_set_get_by_subject.3
MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_meth_set_init.3
MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_meth_set_new_item.3
MLINKS+= X509_LOOKUP_meth_new.3 X509_LOOKUP_meth_set_shutdown.3
-MLINKS+= X509_LOOKUP.3 X509_LOOKUP_new.3
-MLINKS+= X509_LOOKUP.3 X509_LOOKUP_set_method_data.3
-MLINKS+= X509_LOOKUP.3 X509_LOOKUP_shutdown.3
-MLINKS+= X509_LOOKUP_hash_dir.3 X509_LOOKUP_store.3
+MLINKS+= X509_LOOKUP_meth_new.3 X509_OBJECT_set1_X509.3
+MLINKS+= X509_LOOKUP_meth_new.3 X509_OBJECT_set1_X509_CRL.3
MLINKS+= X509_NAME_ENTRY_get_object.3 X509_NAME_ENTRY_create_by_NID.3
MLINKS+= X509_NAME_ENTRY_get_object.3 X509_NAME_ENTRY_create_by_OBJ.3
MLINKS+= X509_NAME_ENTRY_get_object.3 X509_NAME_ENTRY_create_by_txt.3
-MLINKS+= X509_dup.3 X509_NAME_ENTRY_dup.3
-MLINKS+= X509_dup.3 X509_NAME_ENTRY_free.3
MLINKS+= X509_NAME_ENTRY_get_object.3 X509_NAME_ENTRY_get_data.3
-MLINKS+= X509_dup.3 X509_NAME_ENTRY_new.3
MLINKS+= X509_NAME_ENTRY_get_object.3 X509_NAME_ENTRY_set_data.3
MLINKS+= X509_NAME_ENTRY_get_object.3 X509_NAME_ENTRY_set_object.3
MLINKS+= X509_NAME_add_entry_by_txt.3 X509_NAME_add_entry.3
MLINKS+= X509_NAME_add_entry_by_txt.3 X509_NAME_add_entry_by_NID.3
MLINKS+= X509_NAME_add_entry_by_txt.3 X509_NAME_add_entry_by_OBJ.3
-MLINKS+= X509_cmp.3 X509_NAME_cmp.3
MLINKS+= X509_NAME_add_entry_by_txt.3 X509_NAME_delete_entry.3
-MLINKS+= X509_digest.3 X509_NAME_digest.3
-MLINKS+= X509_dup.3 X509_NAME_dup.3
MLINKS+= X509_NAME_get_index_by_NID.3 X509_NAME_entry_count.3
-MLINKS+= X509_dup.3 X509_NAME_free.3
MLINKS+= X509_NAME_get_index_by_NID.3 X509_NAME_get_entry.3
MLINKS+= X509_NAME_get_index_by_NID.3 X509_NAME_get_index_by_OBJ.3
MLINKS+= X509_NAME_get_index_by_NID.3 X509_NAME_get_text_by_NID.3
MLINKS+= X509_NAME_get_index_by_NID.3 X509_NAME_get_text_by_OBJ.3
-MLINKS+= X509_get_subject_name.3 X509_NAME_hash.3
-MLINKS+= X509_get_subject_name.3 X509_NAME_hash_ex.3
-MLINKS+= X509_dup.3 X509_NAME_new.3
MLINKS+= X509_NAME_print_ex.3 X509_NAME_oneline.3
MLINKS+= X509_NAME_print_ex.3 X509_NAME_print.3
MLINKS+= X509_NAME_print_ex.3 X509_NAME_print_ex_fp.3
-MLINKS+= X509_LOOKUP_meth_new.3 X509_OBJECT_set1_X509.3
-MLINKS+= X509_LOOKUP_meth_new.3 X509_OBJECT_set1_X509_CRL.3
MLINKS+= X509_PUBKEY_new.3 X509_PUBKEY_dup.3
MLINKS+= X509_PUBKEY_new.3 X509_PUBKEY_eq.3
MLINKS+= X509_PUBKEY_new.3 X509_PUBKEY_free.3
@@ -4572,165 +4858,135 @@ MLINKS+= X509_PUBKEY_new.3 X509_PUBKEY_get0_param.3
MLINKS+= X509_PUBKEY_new.3 X509_PUBKEY_new_ex.3
MLINKS+= X509_PUBKEY_new.3 X509_PUBKEY_set.3
MLINKS+= X509_PUBKEY_new.3 X509_PUBKEY_set0_param.3
-MLINKS+= X509_dup.3 X509_REQ_INFO_free.3
-MLINKS+= X509_dup.3 X509_REQ_INFO_new.3
-MLINKS+= X509_check_private_key.3 X509_REQ_check_private_key.3
-MLINKS+= X509_digest.3 X509_REQ_digest.3
-MLINKS+= X509_dup.3 X509_REQ_dup.3
-MLINKS+= X509_dup.3 X509_REQ_free.3
-MLINKS+= X509_get0_distinguishing_id.3 X509_REQ_get0_distinguishing_id.3
-MLINKS+= X509_get_pubkey.3 X509_REQ_get0_pubkey.3
-MLINKS+= X509_get0_signature.3 X509_REQ_get0_signature.3
-MLINKS+= X509_get_pubkey.3 X509_REQ_get_X509_PUBKEY.3
-MLINKS+= X509_get_pubkey.3 X509_REQ_get_pubkey.3
-MLINKS+= X509_get0_signature.3 X509_REQ_get_signature_nid.3
-MLINKS+= X509_get_subject_name.3 X509_REQ_get_subject_name.3
-MLINKS+= X509_get_version.3 X509_REQ_get_version.3
-MLINKS+= X509_dup.3 X509_REQ_new.3
-MLINKS+= X509_dup.3 X509_REQ_new_ex.3
-MLINKS+= X509_get0_distinguishing_id.3 X509_REQ_set0_distinguishing_id.3
-MLINKS+= X509_get0_signature.3 X509_REQ_set0_signature.3
-MLINKS+= X509_get0_signature.3 X509_REQ_set1_signature_algo.3
-MLINKS+= X509_get_pubkey.3 X509_REQ_set_pubkey.3
-MLINKS+= X509_get_subject_name.3 X509_REQ_set_subject_name.3
-MLINKS+= X509_get_version.3 X509_REQ_set_version.3
-MLINKS+= X509_sign.3 X509_REQ_sign.3
-MLINKS+= X509_sign.3 X509_REQ_sign_ctx.3
-MLINKS+= X509_verify.3 X509_REQ_verify.3
-MLINKS+= X509_verify.3 X509_REQ_verify_ex.3
-MLINKS+= X509V3_get_d2i.3 X509_REVOKED_add1_ext_i2d.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_add_ext.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_delete_ext.3
-MLINKS+= X509_dup.3 X509_REVOKED_dup.3
-MLINKS+= X509_dup.3 X509_REVOKED_free.3
-MLINKS+= X509V3_get_d2i.3 X509_REVOKED_get0_extensions.3
-MLINKS+= X509_CRL_get0_by_serial.3 X509_REVOKED_get0_revocationDate.3
-MLINKS+= X509_CRL_get0_by_serial.3 X509_REVOKED_get0_serialNumber.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext_by_NID.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext_by_OBJ.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext_by_critical.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext_count.3
-MLINKS+= X509V3_get_d2i.3 X509_REVOKED_get_ext_d2i.3
-MLINKS+= X509_dup.3 X509_REVOKED_new.3
-MLINKS+= X509_CRL_get0_by_serial.3 X509_REVOKED_set_revocationDate.3
-MLINKS+= X509_CRL_get0_by_serial.3 X509_REVOKED_set_serialNumber.3
-MLINKS+= X509_get0_signature.3 X509_SIG_INFO_get.3
-MLINKS+= X509_get0_signature.3 X509_SIG_INFO_set.3
-MLINKS+= X509_dup.3 X509_SIG_free.3
+MLINKS+= X509_PUBKEY_new.3 X509_PUBKEY_set0_public_key.3
+MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY.3
+MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY_bio.3
+MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY_ex.3
+MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY_ex_bio.3
+MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY_ex_fp.3
+MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY_fp.3
+MLINKS+= X509_PUBKEY_new.3 i2d_PUBKEY.3
+MLINKS+= X509_PUBKEY_new.3 i2d_PUBKEY_bio.3
+MLINKS+= X509_PUBKEY_new.3 i2d_PUBKEY_fp.3
+MLINKS+= X509_REQ_get_attr.3 X509_REQ_add1_attr.3
+MLINKS+= X509_REQ_get_attr.3 X509_REQ_add1_attr_by_NID.3
+MLINKS+= X509_REQ_get_attr.3 X509_REQ_add1_attr_by_OBJ.3
+MLINKS+= X509_REQ_get_attr.3 X509_REQ_add1_attr_by_txt.3
+MLINKS+= X509_REQ_get_attr.3 X509_REQ_delete_attr.3
+MLINKS+= X509_REQ_get_attr.3 X509_REQ_get_attr_by_NID.3
+MLINKS+= X509_REQ_get_attr.3 X509_REQ_get_attr_by_OBJ.3
+MLINKS+= X509_REQ_get_attr.3 X509_REQ_get_attr_count.3
+MLINKS+= X509_REQ_get_extensions.3 X509_REQ_add_extensions.3
+MLINKS+= X509_REQ_get_extensions.3 X509_REQ_add_extensions_nid.3
MLINKS+= X509_SIG_get0.3 X509_SIG_getm.3
-MLINKS+= X509_dup.3 X509_SIG_new.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_cert_crl_fn.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_check_crl_fn.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_check_issued_fn.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_check_policy_fn.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_check_revocation_fn.3
+MLINKS+= X509_STORE_CTX_get_by_subject.3 X509_STORE_CTX_get_obj_by_subject.3
+MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_get0_cert.3
+MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_get1_chain.3
+MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_get_current_cert.3
+MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_get_error_depth.3
+MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_set_current_cert.3
+MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_set_error.3
+MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_set_error_depth.3
+MLINKS+= X509_STORE_CTX_get_error.3 X509_verify_cert_error_string.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_cleanup.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_cleanup_fn.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_free.3
-MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_get0_cert.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_get0_chain.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_get0_param.3
+MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_get0_rpk.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_get0_untrusted.3
-MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_get1_chain.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_get1_issuer.3
-MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_get_app_data.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_cert_crl.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_check_crl.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_check_issued.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_check_policy.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_check_revocation.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_cleanup.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_get_crl_fn.3
-MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_get_current_cert.3
-MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_get_error_depth.3
-MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_get_ex_new_index.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_get_crl.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_get_issuer.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_get_issuer_fn.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_lookup_certs.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_lookup_crls.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_get_num_untrusted.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_get_verify.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_verify_cb.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_init.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_lookup_certs_fn.3
-MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_lookup_crls_fn.3
+MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_init_rpk.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_new_ex.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_print_verify_cb.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_purpose_inherit.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set0_crls.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set0_param.3
+MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set0_rpk.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set0_trusted_stack.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set0_untrusted.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set0_verified_chain.3
-MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_set_app_data.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set_cert.3
-MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_set_current_cert.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set_default.3
-MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_set_error.3
-MLINKS+= X509_STORE_CTX_get_error.3 X509_STORE_CTX_set_error_depth.3
-MLINKS+= BIO_get_ex_new_index.3 X509_STORE_CTX_set_ex_data.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set_purpose.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set_trust.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_set_verify.3
-MLINKS+= X509_verify_cert.3 X509_STORE_CTX_verify.3
-MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_verify_cb.3
MLINKS+= X509_STORE_CTX_new.3 X509_STORE_CTX_verify_fn.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_cert_crl.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_check_crl.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_check_issued.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_check_policy.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_check_revocation.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_cleanup.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_get_crl.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_get_issuer.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_lookup_certs.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_lookup_crls.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_get_verify_cb.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_print_verify_cb.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_set_current_reasons.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_set_get_crl.3
+MLINKS+= X509_STORE_CTX_set_verify_cb.3 X509_STORE_CTX_verify_cb.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE.3
MLINKS+= X509_STORE_add_cert.3 X509_STORE_add_crl.3
MLINKS+= X509_STORE_add_cert.3 X509_STORE_add_lookup.3
-MLINKS+= X509_STORE_new.3 X509_STORE_free.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_file.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_file_ex.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_locations.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_locations_ex.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_path.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_store.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_store_ex.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_default_paths.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_default_paths_ex.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_depth.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_flags.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_purpose.3
+MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_trust.3
MLINKS+= X509_STORE_get0_param.3 X509_STORE_get0_objects.3
MLINKS+= X509_STORE_get0_param.3 X509_STORE_get1_all_certs.3
+MLINKS+= X509_STORE_get0_param.3 X509_STORE_get1_objects.3
+MLINKS+= X509_STORE_get0_param.3 X509_STORE_set1_param.3
+MLINKS+= X509_STORE_new.3 X509_STORE_free.3
+MLINKS+= X509_STORE_new.3 X509_STORE_lock.3
+MLINKS+= X509_STORE_new.3 X509_STORE_unlock.3
+MLINKS+= X509_STORE_new.3 X509_STORE_up_ref.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_cert_crl_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_check_crl_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_check_issued_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_check_policy_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_check_revocation_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_cleanup_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_get1_issuer.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_get_crl_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_get_issuer_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_get_verify.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_lookup_certs_fn.3
+MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_CTX_lookup_crls_fn.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_cert_crl.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_check_crl.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_check_issued.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_check_policy.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_check_revocation.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_cleanup.3
-MLINKS+= BIO_get_ex_new_index.3 X509_STORE_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 X509_STORE_get_ex_new_index.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_get_crl.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_get_issuer.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_lookup_certs.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_lookup_crls.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_get_verify_cb.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_file.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_file_ex.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_locations.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_locations_ex.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_path.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_store.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_load_store_ex.3
-MLINKS+= X509_STORE_new.3 X509_STORE_lock.3
-MLINKS+= X509_STORE_get0_param.3 X509_STORE_set1_param.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_cert_crl.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_check_crl.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_check_issued.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_check_policy.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_check_revocation.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_cleanup.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_default_paths.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_default_paths_ex.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_depth.3
-MLINKS+= BIO_get_ex_new_index.3 X509_STORE_set_ex_data.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_flags.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_get_crl.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_get_issuer.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_lookup_certs.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_lookup_crls.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_lookup_crls_cb.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_purpose.3
-MLINKS+= X509_STORE_add_cert.3 X509_STORE_set_trust.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_verify.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_verify_cb.3
MLINKS+= X509_STORE_set_verify_cb_func.3 X509_STORE_set_verify_func.3
-MLINKS+= X509_STORE_new.3 X509_STORE_unlock.3
-MLINKS+= X509_STORE_new.3 X509_STORE_up_ref.3
-MLINKS+= X509_dup.3 X509_VAL_free.3
-MLINKS+= X509_dup.3 X509_VAL_new.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_add0_policy.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_add1_host.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_clear_flags.3
@@ -4743,6 +4999,7 @@ MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_get_depth.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_get_flags.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_get_hostflags.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_get_inh_flags.3
+MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_get_purpose.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_get_time.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_set1_email.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_set1_host.3
@@ -4756,87 +5013,684 @@ MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_set_inh_flags.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_set_purpose.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_set_time.3
MLINKS+= X509_VERIFY_PARAM_set_flags.3 X509_VERIFY_PARAM_set_trust.3
-MLINKS+= X509V3_get_d2i.3 X509_add1_ext_i2d.3
MLINKS+= X509_add_cert.3 X509_add_certs.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_add_ext.3
-MLINKS+= X509_verify_cert.3 X509_build_chain.3
-MLINKS+= X509_new.3 X509_chain_up_ref.3
MLINKS+= X509_check_host.3 X509_check_email.3
MLINKS+= X509_check_host.3 X509_check_ip.3
MLINKS+= X509_check_host.3 X509_check_ip_asc.3
+MLINKS+= X509_check_private_key.3 X509_REQ_check_private_key.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_add.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_cleanup.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get0.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get0_name.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get0_sname.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get_by_id.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get_by_sname.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get_count.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get_id.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get_trust.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_get_unused_id.3
+MLINKS+= X509_check_purpose.3 X509_PURPOSE_set.3
+MLINKS+= X509_cmp.3 X509_CRL_cmp.3
+MLINKS+= X509_cmp.3 X509_CRL_match.3
+MLINKS+= X509_cmp.3 X509_NAME_cmp.3
+MLINKS+= X509_cmp.3 X509_issuer_and_serial_cmp.3
+MLINKS+= X509_cmp.3 X509_issuer_name_cmp.3
+MLINKS+= X509_cmp.3 X509_subject_name_cmp.3
MLINKS+= X509_cmp_time.3 X509_cmp_current_time.3
MLINKS+= X509_cmp_time.3 X509_cmp_timeframe.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_delete_ext.3
+MLINKS+= X509_cmp_time.3 X509_gmtime_adj.3
+MLINKS+= X509_cmp_time.3 X509_time_adj.3
+MLINKS+= X509_cmp_time.3 X509_time_adj_ex.3
+MLINKS+= X509_digest.3 PKCS7_ISSUER_AND_SERIAL_digest.3
+MLINKS+= X509_digest.3 X509_CRL_digest.3
+MLINKS+= X509_digest.3 X509_NAME_digest.3
+MLINKS+= X509_digest.3 X509_REQ_digest.3
MLINKS+= X509_digest.3 X509_digest_sig.3
-MLINKS+= X509_new.3 X509_free.3
+MLINKS+= X509_digest.3 X509_pubkey_digest.3
+MLINKS+= X509_dup.3 ACCESS_DESCRIPTION_free.3
+MLINKS+= X509_dup.3 ACCESS_DESCRIPTION_new.3
+MLINKS+= X509_dup.3 ADMISSIONS_free.3
+MLINKS+= X509_dup.3 ADMISSIONS_new.3
+MLINKS+= X509_dup.3 ADMISSION_SYNTAX_free.3
+MLINKS+= X509_dup.3 ADMISSION_SYNTAX_new.3
+MLINKS+= X509_dup.3 ASIdOrRange_free.3
+MLINKS+= X509_dup.3 ASIdOrRange_new.3
+MLINKS+= X509_dup.3 ASIdentifierChoice_free.3
+MLINKS+= X509_dup.3 ASIdentifierChoice_new.3
+MLINKS+= X509_dup.3 ASIdentifiers_free.3
+MLINKS+= X509_dup.3 ASIdentifiers_new.3
+MLINKS+= X509_dup.3 ASN1_ITEM.3
+MLINKS+= X509_dup.3 ASRange_free.3
+MLINKS+= X509_dup.3 ASRange_new.3
+MLINKS+= X509_dup.3 AUTHORITY_INFO_ACCESS_free.3
+MLINKS+= X509_dup.3 AUTHORITY_INFO_ACCESS_new.3
+MLINKS+= X509_dup.3 AUTHORITY_KEYID_free.3
+MLINKS+= X509_dup.3 AUTHORITY_KEYID_new.3
+MLINKS+= X509_dup.3 BASIC_CONSTRAINTS_free.3
+MLINKS+= X509_dup.3 BASIC_CONSTRAINTS_new.3
+MLINKS+= X509_dup.3 CERTIFICATEPOLICIES_free.3
+MLINKS+= X509_dup.3 CERTIFICATEPOLICIES_new.3
+MLINKS+= X509_dup.3 CMS_ContentInfo_free.3
+MLINKS+= X509_dup.3 CMS_ContentInfo_new.3
+MLINKS+= X509_dup.3 CMS_ContentInfo_new_ex.3
+MLINKS+= X509_dup.3 CMS_ContentInfo_print_ctx.3
+MLINKS+= X509_dup.3 CMS_EnvelopedData_dup.3
+MLINKS+= X509_dup.3 CMS_EnvelopedData_it.3
+MLINKS+= X509_dup.3 CMS_ReceiptRequest_free.3
+MLINKS+= X509_dup.3 CMS_ReceiptRequest_new.3
+MLINKS+= X509_dup.3 CMS_SignedData_free.3
+MLINKS+= X509_dup.3 CMS_SignedData_new.3
+MLINKS+= X509_dup.3 CRL_DIST_POINTS_free.3
+MLINKS+= X509_dup.3 CRL_DIST_POINTS_new.3
+MLINKS+= X509_dup.3 DECLARE_ASN1_FUNCTIONS.3
+MLINKS+= X509_dup.3 DIRECTORYSTRING_free.3
+MLINKS+= X509_dup.3 DIRECTORYSTRING_new.3
+MLINKS+= X509_dup.3 DISPLAYTEXT_free.3
+MLINKS+= X509_dup.3 DISPLAYTEXT_new.3
+MLINKS+= X509_dup.3 DIST_POINT_NAME_dup.3
+MLINKS+= X509_dup.3 DIST_POINT_NAME_free.3
+MLINKS+= X509_dup.3 DIST_POINT_NAME_new.3
+MLINKS+= X509_dup.3 DIST_POINT_free.3
+MLINKS+= X509_dup.3 DIST_POINT_new.3
+MLINKS+= X509_dup.3 DSAparams_dup.3
+MLINKS+= X509_dup.3 ECPARAMETERS_free.3
+MLINKS+= X509_dup.3 ECPARAMETERS_new.3
+MLINKS+= X509_dup.3 ECPKPARAMETERS_free.3
+MLINKS+= X509_dup.3 ECPKPARAMETERS_new.3
+MLINKS+= X509_dup.3 EDIPARTYNAME_free.3
+MLINKS+= X509_dup.3 EDIPARTYNAME_new.3
+MLINKS+= X509_dup.3 ESS_CERT_ID_V2_dup.3
+MLINKS+= X509_dup.3 ESS_CERT_ID_V2_free.3
+MLINKS+= X509_dup.3 ESS_CERT_ID_V2_new.3
+MLINKS+= X509_dup.3 ESS_CERT_ID_dup.3
+MLINKS+= X509_dup.3 ESS_CERT_ID_free.3
+MLINKS+= X509_dup.3 ESS_CERT_ID_new.3
+MLINKS+= X509_dup.3 ESS_ISSUER_SERIAL_dup.3
+MLINKS+= X509_dup.3 ESS_ISSUER_SERIAL_free.3
+MLINKS+= X509_dup.3 ESS_ISSUER_SERIAL_new.3
+MLINKS+= X509_dup.3 ESS_SIGNING_CERT_V2_dup.3
+MLINKS+= X509_dup.3 ESS_SIGNING_CERT_V2_free.3
+MLINKS+= X509_dup.3 ESS_SIGNING_CERT_V2_it.3
+MLINKS+= X509_dup.3 ESS_SIGNING_CERT_V2_new.3
+MLINKS+= X509_dup.3 ESS_SIGNING_CERT_dup.3
+MLINKS+= X509_dup.3 ESS_SIGNING_CERT_free.3
+MLINKS+= X509_dup.3 ESS_SIGNING_CERT_it.3
+MLINKS+= X509_dup.3 ESS_SIGNING_CERT_new.3
+MLINKS+= X509_dup.3 EXTENDED_KEY_USAGE_free.3
+MLINKS+= X509_dup.3 EXTENDED_KEY_USAGE_new.3
+MLINKS+= X509_dup.3 GENERAL_NAMES_free.3
+MLINKS+= X509_dup.3 GENERAL_NAMES_new.3
+MLINKS+= X509_dup.3 GENERAL_NAME_dup.3
+MLINKS+= X509_dup.3 GENERAL_NAME_free.3
+MLINKS+= X509_dup.3 GENERAL_NAME_new.3
+MLINKS+= X509_dup.3 GENERAL_SUBTREE_free.3
+MLINKS+= X509_dup.3 GENERAL_SUBTREE_new.3
+MLINKS+= X509_dup.3 IMPLEMENT_ASN1_FUNCTIONS.3
+MLINKS+= X509_dup.3 IPAddressChoice_free.3
+MLINKS+= X509_dup.3 IPAddressChoice_new.3
+MLINKS+= X509_dup.3 IPAddressFamily_free.3
+MLINKS+= X509_dup.3 IPAddressFamily_new.3
+MLINKS+= X509_dup.3 IPAddressOrRange_free.3
+MLINKS+= X509_dup.3 IPAddressOrRange_new.3
+MLINKS+= X509_dup.3 IPAddressRange_free.3
+MLINKS+= X509_dup.3 IPAddressRange_new.3
+MLINKS+= X509_dup.3 ISSUER_SIGN_TOOL_free.3
+MLINKS+= X509_dup.3 ISSUER_SIGN_TOOL_it.3
+MLINKS+= X509_dup.3 ISSUER_SIGN_TOOL_new.3
+MLINKS+= X509_dup.3 ISSUING_DIST_POINT_free.3
+MLINKS+= X509_dup.3 ISSUING_DIST_POINT_it.3
+MLINKS+= X509_dup.3 ISSUING_DIST_POINT_new.3
+MLINKS+= X509_dup.3 NAME_CONSTRAINTS_free.3
+MLINKS+= X509_dup.3 NAME_CONSTRAINTS_new.3
+MLINKS+= X509_dup.3 NAMING_AUTHORITY_free.3
+MLINKS+= X509_dup.3 NAMING_AUTHORITY_new.3
+MLINKS+= X509_dup.3 NETSCAPE_CERT_SEQUENCE_free.3
+MLINKS+= X509_dup.3 NETSCAPE_CERT_SEQUENCE_new.3
+MLINKS+= X509_dup.3 NETSCAPE_SPKAC_free.3
+MLINKS+= X509_dup.3 NETSCAPE_SPKAC_new.3
+MLINKS+= X509_dup.3 NETSCAPE_SPKI_free.3
+MLINKS+= X509_dup.3 NETSCAPE_SPKI_new.3
+MLINKS+= X509_dup.3 NOTICEREF_free.3
+MLINKS+= X509_dup.3 NOTICEREF_new.3
+MLINKS+= X509_dup.3 OCSP_BASICRESP_free.3
+MLINKS+= X509_dup.3 OCSP_BASICRESP_new.3
+MLINKS+= X509_dup.3 OCSP_CERTID_dup.3
+MLINKS+= X509_dup.3 OCSP_CERTID_new.3
+MLINKS+= X509_dup.3 OCSP_CERTSTATUS_free.3
+MLINKS+= X509_dup.3 OCSP_CERTSTATUS_new.3
+MLINKS+= X509_dup.3 OCSP_CRLID_free.3
+MLINKS+= X509_dup.3 OCSP_CRLID_new.3
+MLINKS+= X509_dup.3 OCSP_ONEREQ_free.3
+MLINKS+= X509_dup.3 OCSP_ONEREQ_new.3
+MLINKS+= X509_dup.3 OCSP_REQINFO_free.3
+MLINKS+= X509_dup.3 OCSP_REQINFO_new.3
+MLINKS+= X509_dup.3 OCSP_RESPBYTES_free.3
+MLINKS+= X509_dup.3 OCSP_RESPBYTES_new.3
+MLINKS+= X509_dup.3 OCSP_RESPDATA_free.3
+MLINKS+= X509_dup.3 OCSP_RESPDATA_new.3
+MLINKS+= X509_dup.3 OCSP_RESPID_free.3
+MLINKS+= X509_dup.3 OCSP_RESPID_new.3
+MLINKS+= X509_dup.3 OCSP_RESPONSE_new.3
+MLINKS+= X509_dup.3 OCSP_REVOKEDINFO_free.3
+MLINKS+= X509_dup.3 OCSP_REVOKEDINFO_new.3
+MLINKS+= X509_dup.3 OCSP_SERVICELOC_free.3
+MLINKS+= X509_dup.3 OCSP_SERVICELOC_new.3
+MLINKS+= X509_dup.3 OCSP_SIGNATURE_free.3
+MLINKS+= X509_dup.3 OCSP_SIGNATURE_new.3
+MLINKS+= X509_dup.3 OCSP_SINGLERESP_free.3
+MLINKS+= X509_dup.3 OCSP_SINGLERESP_new.3
+MLINKS+= X509_dup.3 OSSL_AA_DIST_POINT_free.3
+MLINKS+= X509_dup.3 OSSL_AA_DIST_POINT_it.3
+MLINKS+= X509_dup.3 OSSL_AA_DIST_POINT_new.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_CHOICE_free.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_CHOICE_it.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_CHOICE_new.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_ITEM_free.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_ITEM_it.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_ITEM_new.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_SYNTAX_free.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_SYNTAX_it.3
+MLINKS+= X509_dup.3 OSSL_ALLOWED_ATTRIBUTES_SYNTAX_new.3
+MLINKS+= X509_dup.3 OSSL_ATAV_free.3
+MLINKS+= X509_dup.3 OSSL_ATAV_it.3
+MLINKS+= X509_dup.3 OSSL_ATAV_new.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTES_SYNTAX_free.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTES_SYNTAX_it.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTES_SYNTAX_new.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_DESCRIPTOR_free.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_DESCRIPTOR_it.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_DESCRIPTOR_new.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_MAPPINGS_free.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_MAPPINGS_it.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_MAPPINGS_new.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_MAPPING_free.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_MAPPING_it.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_MAPPING_new.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_TYPE_MAPPING_free.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_TYPE_MAPPING_it.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_TYPE_MAPPING_new.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_VALUE_MAPPING_free.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_VALUE_MAPPING_it.3
+MLINKS+= X509_dup.3 OSSL_ATTRIBUTE_VALUE_MAPPING_new.3
+MLINKS+= X509_dup.3 OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX_free.3
+MLINKS+= X509_dup.3 OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX_it.3
+MLINKS+= X509_dup.3 OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX_new.3
+MLINKS+= X509_dup.3 OSSL_BASIC_ATTR_CONSTRAINTS_free.3
+MLINKS+= X509_dup.3 OSSL_BASIC_ATTR_CONSTRAINTS_it.3
+MLINKS+= X509_dup.3 OSSL_BASIC_ATTR_CONSTRAINTS_new.3
+MLINKS+= X509_dup.3 OSSL_CMP_ATAVS_free.3
+MLINKS+= X509_dup.3 OSSL_CMP_ATAVS_it.3
+MLINKS+= X509_dup.3 OSSL_CMP_ATAVS_new.3
+MLINKS+= X509_dup.3 OSSL_CMP_CRLSTATUS_free.3
+MLINKS+= X509_dup.3 OSSL_CMP_ITAV_dup.3
+MLINKS+= X509_dup.3 OSSL_CMP_ITAV_free.3
+MLINKS+= X509_dup.3 OSSL_CMP_MSG_dup.3
+MLINKS+= X509_dup.3 OSSL_CMP_MSG_free.3
+MLINKS+= X509_dup.3 OSSL_CMP_MSG_it.3
+MLINKS+= X509_dup.3 OSSL_CMP_PKIHEADER_free.3
+MLINKS+= X509_dup.3 OSSL_CMP_PKIHEADER_it.3
+MLINKS+= X509_dup.3 OSSL_CMP_PKIHEADER_new.3
+MLINKS+= X509_dup.3 OSSL_CMP_PKISI_dup.3
+MLINKS+= X509_dup.3 OSSL_CMP_PKISI_free.3
+MLINKS+= X509_dup.3 OSSL_CMP_PKISI_it.3
+MLINKS+= X509_dup.3 OSSL_CMP_PKISI_new.3
+MLINKS+= X509_dup.3 OSSL_CMP_PKISTATUS_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_ATTRIBUTETYPEANDVALUE_dup.3
+MLINKS+= X509_dup.3 OSSL_CRMF_ATTRIBUTETYPEANDVALUE_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_CERTID_dup.3
+MLINKS+= X509_dup.3 OSSL_CRMF_CERTID_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_CERTID_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_CERTID_new.3
+MLINKS+= X509_dup.3 OSSL_CRMF_CERTTEMPLATE_dup.3
+MLINKS+= X509_dup.3 OSSL_CRMF_CERTTEMPLATE_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_CERTTEMPLATE_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_CERTTEMPLATE_new.3
+MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDKEY_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDKEY_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDKEY_new.3
+MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDVALUE_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDVALUE_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_ENCRYPTEDVALUE_new.3
+MLINKS+= X509_dup.3 OSSL_CRMF_MSGS_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_MSGS_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_MSGS_new.3
+MLINKS+= X509_dup.3 OSSL_CRMF_MSG_dup.3
+MLINKS+= X509_dup.3 OSSL_CRMF_MSG_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_MSG_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_MSG_new.3
+MLINKS+= X509_dup.3 OSSL_CRMF_PBMPARAMETER_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_PBMPARAMETER_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_PBMPARAMETER_new.3
+MLINKS+= X509_dup.3 OSSL_CRMF_PKIPUBLICATIONINFO_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_PKIPUBLICATIONINFO_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_PKIPUBLICATIONINFO_new.3
+MLINKS+= X509_dup.3 OSSL_CRMF_SINGLEPUBINFO_free.3
+MLINKS+= X509_dup.3 OSSL_CRMF_SINGLEPUBINFO_it.3
+MLINKS+= X509_dup.3 OSSL_CRMF_SINGLEPUBINFO_new.3
+MLINKS+= X509_dup.3 OSSL_DAY_TIME_BAND_free.3
+MLINKS+= X509_dup.3 OSSL_DAY_TIME_BAND_it.3
+MLINKS+= X509_dup.3 OSSL_DAY_TIME_BAND_new.3
+MLINKS+= X509_dup.3 OSSL_DAY_TIME_free.3
+MLINKS+= X509_dup.3 OSSL_DAY_TIME_it.3
+MLINKS+= X509_dup.3 OSSL_DAY_TIME_new.3
+MLINKS+= X509_dup.3 OSSL_HASH_free.3
+MLINKS+= X509_dup.3 OSSL_HASH_it.3
+MLINKS+= X509_dup.3 OSSL_HASH_new.3
+MLINKS+= X509_dup.3 OSSL_IETF_ATTR_SYNTAX_VALUE_free.3
+MLINKS+= X509_dup.3 OSSL_IETF_ATTR_SYNTAX_VALUE_it.3
+MLINKS+= X509_dup.3 OSSL_IETF_ATTR_SYNTAX_VALUE_new.3
+MLINKS+= X509_dup.3 OSSL_IETF_ATTR_SYNTAX_free.3
+MLINKS+= X509_dup.3 OSSL_IETF_ATTR_SYNTAX_it.3
+MLINKS+= X509_dup.3 OSSL_IETF_ATTR_SYNTAX_new.3
+MLINKS+= X509_dup.3 OSSL_INFO_SYNTAX_POINTER_free.3
+MLINKS+= X509_dup.3 OSSL_INFO_SYNTAX_POINTER_it.3
+MLINKS+= X509_dup.3 OSSL_INFO_SYNTAX_POINTER_new.3
+MLINKS+= X509_dup.3 OSSL_INFO_SYNTAX_free.3
+MLINKS+= X509_dup.3 OSSL_INFO_SYNTAX_it.3
+MLINKS+= X509_dup.3 OSSL_INFO_SYNTAX_new.3
+MLINKS+= X509_dup.3 OSSL_ISSUER_SERIAL_free.3
+MLINKS+= X509_dup.3 OSSL_ISSUER_SERIAL_new.3
+MLINKS+= X509_dup.3 OSSL_NAMED_DAY_free.3
+MLINKS+= X509_dup.3 OSSL_NAMED_DAY_it.3
+MLINKS+= X509_dup.3 OSSL_NAMED_DAY_new.3
+MLINKS+= X509_dup.3 OSSL_OBJECT_DIGEST_INFO_free.3
+MLINKS+= X509_dup.3 OSSL_OBJECT_DIGEST_INFO_new.3
+MLINKS+= X509_dup.3 OSSL_PRIVILEGE_POLICY_ID_free.3
+MLINKS+= X509_dup.3 OSSL_PRIVILEGE_POLICY_ID_it.3
+MLINKS+= X509_dup.3 OSSL_PRIVILEGE_POLICY_ID_new.3
+MLINKS+= X509_dup.3 OSSL_ROLE_SPEC_CERT_ID_SYNTAX_free.3
+MLINKS+= X509_dup.3 OSSL_ROLE_SPEC_CERT_ID_SYNTAX_it.3
+MLINKS+= X509_dup.3 OSSL_ROLE_SPEC_CERT_ID_SYNTAX_new.3
+MLINKS+= X509_dup.3 OSSL_ROLE_SPEC_CERT_ID_free.3
+MLINKS+= X509_dup.3 OSSL_ROLE_SPEC_CERT_ID_it.3
+MLINKS+= X509_dup.3 OSSL_ROLE_SPEC_CERT_ID_new.3
+MLINKS+= X509_dup.3 OSSL_TARGETING_INFORMATION_free.3
+MLINKS+= X509_dup.3 OSSL_TARGETING_INFORMATION_it.3
+MLINKS+= X509_dup.3 OSSL_TARGETING_INFORMATION_new.3
+MLINKS+= X509_dup.3 OSSL_TARGETS_free.3
+MLINKS+= X509_dup.3 OSSL_TARGETS_it.3
+MLINKS+= X509_dup.3 OSSL_TARGETS_new.3
+MLINKS+= X509_dup.3 OSSL_TARGET_CERT_free.3
+MLINKS+= X509_dup.3 OSSL_TARGET_CERT_it.3
+MLINKS+= X509_dup.3 OSSL_TARGET_CERT_new.3
+MLINKS+= X509_dup.3 OSSL_TARGET_free.3
+MLINKS+= X509_dup.3 OSSL_TARGET_it.3
+MLINKS+= X509_dup.3 OSSL_TARGET_new.3
+MLINKS+= X509_dup.3 OSSL_TIME_PERIOD_free.3
+MLINKS+= X509_dup.3 OSSL_TIME_PERIOD_it.3
+MLINKS+= X509_dup.3 OSSL_TIME_PERIOD_new.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_ABSOLUTE_free.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_ABSOLUTE_it.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_ABSOLUTE_new.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_DAY_free.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_DAY_it.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_DAY_new.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_MONTH_free.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_MONTH_it.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_MONTH_new.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_TIME_free.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_TIME_it.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_TIME_new.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_WEEKS_free.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_WEEKS_it.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_WEEKS_new.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_X_DAY_OF_free.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_X_DAY_OF_it.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_X_DAY_OF_new.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_free.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_it.3
+MLINKS+= X509_dup.3 OSSL_TIME_SPEC_new.3
+MLINKS+= X509_dup.3 OSSL_USER_NOTICE_SYNTAX_free.3
+MLINKS+= X509_dup.3 OSSL_USER_NOTICE_SYNTAX_it.3
+MLINKS+= X509_dup.3 OSSL_USER_NOTICE_SYNTAX_new.3
+MLINKS+= X509_dup.3 OTHERNAME_free.3
+MLINKS+= X509_dup.3 OTHERNAME_new.3
+MLINKS+= X509_dup.3 PBE2PARAM_free.3
+MLINKS+= X509_dup.3 PBE2PARAM_new.3
+MLINKS+= X509_dup.3 PBEPARAM_free.3
+MLINKS+= X509_dup.3 PBEPARAM_new.3
+MLINKS+= X509_dup.3 PBKDF2PARAM_free.3
+MLINKS+= X509_dup.3 PBKDF2PARAM_new.3
+MLINKS+= X509_dup.3 PBMAC1PARAM_free.3
+MLINKS+= X509_dup.3 PBMAC1PARAM_it.3
+MLINKS+= X509_dup.3 PBMAC1PARAM_new.3
+MLINKS+= X509_dup.3 PKCS12_BAGS_free.3
+MLINKS+= X509_dup.3 PKCS12_BAGS_new.3
+MLINKS+= X509_dup.3 PKCS12_MAC_DATA_free.3
+MLINKS+= X509_dup.3 PKCS12_MAC_DATA_new.3
+MLINKS+= X509_dup.3 PKCS12_SAFEBAG_free.3
+MLINKS+= X509_dup.3 PKCS12_SAFEBAG_new.3
+MLINKS+= X509_dup.3 PKCS12_free.3
+MLINKS+= X509_dup.3 PKCS12_new.3
+MLINKS+= X509_dup.3 PKCS7_DIGEST_free.3
+MLINKS+= X509_dup.3 PKCS7_DIGEST_new.3
+MLINKS+= X509_dup.3 PKCS7_ENCRYPT_free.3
+MLINKS+= X509_dup.3 PKCS7_ENCRYPT_new.3
+MLINKS+= X509_dup.3 PKCS7_ENC_CONTENT_free.3
+MLINKS+= X509_dup.3 PKCS7_ENC_CONTENT_new.3
+MLINKS+= X509_dup.3 PKCS7_ENVELOPE_free.3
+MLINKS+= X509_dup.3 PKCS7_ENVELOPE_new.3
+MLINKS+= X509_dup.3 PKCS7_ISSUER_AND_SERIAL_free.3
+MLINKS+= X509_dup.3 PKCS7_ISSUER_AND_SERIAL_new.3
+MLINKS+= X509_dup.3 PKCS7_RECIP_INFO_free.3
+MLINKS+= X509_dup.3 PKCS7_RECIP_INFO_new.3
+MLINKS+= X509_dup.3 PKCS7_SIGNED_free.3
+MLINKS+= X509_dup.3 PKCS7_SIGNED_new.3
+MLINKS+= X509_dup.3 PKCS7_SIGNER_INFO_free.3
+MLINKS+= X509_dup.3 PKCS7_SIGNER_INFO_new.3
+MLINKS+= X509_dup.3 PKCS7_SIGN_ENVELOPE_free.3
+MLINKS+= X509_dup.3 PKCS7_SIGN_ENVELOPE_new.3
+MLINKS+= X509_dup.3 PKCS7_dup.3
+MLINKS+= X509_dup.3 PKCS7_free.3
+MLINKS+= X509_dup.3 PKCS7_new.3
+MLINKS+= X509_dup.3 PKCS7_new_ex.3
+MLINKS+= X509_dup.3 PKCS7_print_ctx.3
+MLINKS+= X509_dup.3 PKCS8_PRIV_KEY_INFO_free.3
+MLINKS+= X509_dup.3 PKCS8_PRIV_KEY_INFO_new.3
+MLINKS+= X509_dup.3 PKEY_USAGE_PERIOD_free.3
+MLINKS+= X509_dup.3 PKEY_USAGE_PERIOD_new.3
+MLINKS+= X509_dup.3 POLICYINFO_free.3
+MLINKS+= X509_dup.3 POLICYINFO_new.3
+MLINKS+= X509_dup.3 POLICYQUALINFO_free.3
+MLINKS+= X509_dup.3 POLICYQUALINFO_new.3
+MLINKS+= X509_dup.3 POLICY_CONSTRAINTS_free.3
+MLINKS+= X509_dup.3 POLICY_CONSTRAINTS_new.3
+MLINKS+= X509_dup.3 POLICY_MAPPING_free.3
+MLINKS+= X509_dup.3 POLICY_MAPPING_new.3
+MLINKS+= X509_dup.3 PROFESSION_INFOS_free.3
+MLINKS+= X509_dup.3 PROFESSION_INFOS_new.3
+MLINKS+= X509_dup.3 PROFESSION_INFO_free.3
+MLINKS+= X509_dup.3 PROFESSION_INFO_new.3
+MLINKS+= X509_dup.3 PROXY_CERT_INFO_EXTENSION_free.3
+MLINKS+= X509_dup.3 PROXY_CERT_INFO_EXTENSION_new.3
+MLINKS+= X509_dup.3 PROXY_POLICY_free.3
+MLINKS+= X509_dup.3 PROXY_POLICY_new.3
+MLINKS+= X509_dup.3 RSAPrivateKey_dup.3
+MLINKS+= X509_dup.3 RSAPublicKey_dup.3
+MLINKS+= X509_dup.3 RSA_OAEP_PARAMS_free.3
+MLINKS+= X509_dup.3 RSA_OAEP_PARAMS_new.3
+MLINKS+= X509_dup.3 RSA_PSS_PARAMS_dup.3
+MLINKS+= X509_dup.3 RSA_PSS_PARAMS_free.3
+MLINKS+= X509_dup.3 RSA_PSS_PARAMS_new.3
+MLINKS+= X509_dup.3 SCRYPT_PARAMS_free.3
+MLINKS+= X509_dup.3 SCRYPT_PARAMS_new.3
+MLINKS+= X509_dup.3 SXNETID_free.3
+MLINKS+= X509_dup.3 SXNETID_new.3
+MLINKS+= X509_dup.3 SXNET_free.3
+MLINKS+= X509_dup.3 SXNET_new.3
+MLINKS+= X509_dup.3 TLS_FEATURE_free.3
+MLINKS+= X509_dup.3 TLS_FEATURE_new.3
+MLINKS+= X509_dup.3 TS_ACCURACY_dup.3
+MLINKS+= X509_dup.3 TS_ACCURACY_free.3
+MLINKS+= X509_dup.3 TS_ACCURACY_new.3
+MLINKS+= X509_dup.3 TS_MSG_IMPRINT_dup.3
+MLINKS+= X509_dup.3 TS_MSG_IMPRINT_free.3
+MLINKS+= X509_dup.3 TS_MSG_IMPRINT_new.3
+MLINKS+= X509_dup.3 TS_REQ_dup.3
+MLINKS+= X509_dup.3 TS_REQ_free.3
+MLINKS+= X509_dup.3 TS_REQ_new.3
+MLINKS+= X509_dup.3 TS_RESP_dup.3
+MLINKS+= X509_dup.3 TS_RESP_free.3
+MLINKS+= X509_dup.3 TS_RESP_new.3
+MLINKS+= X509_dup.3 TS_STATUS_INFO_dup.3
+MLINKS+= X509_dup.3 TS_STATUS_INFO_free.3
+MLINKS+= X509_dup.3 TS_STATUS_INFO_new.3
+MLINKS+= X509_dup.3 TS_TST_INFO_dup.3
+MLINKS+= X509_dup.3 TS_TST_INFO_free.3
+MLINKS+= X509_dup.3 TS_TST_INFO_new.3
+MLINKS+= X509_dup.3 USERNOTICE_free.3
+MLINKS+= X509_dup.3 USERNOTICE_new.3
+MLINKS+= X509_dup.3 X509_ACERT_INFO_free.3
+MLINKS+= X509_dup.3 X509_ACERT_INFO_it.3
+MLINKS+= X509_dup.3 X509_ACERT_INFO_new.3
+MLINKS+= X509_dup.3 X509_ACERT_ISSUER_V2FORM_free.3
+MLINKS+= X509_dup.3 X509_ACERT_ISSUER_V2FORM_new.3
+MLINKS+= X509_dup.3 X509_ACERT_dup.3
+MLINKS+= X509_dup.3 X509_ACERT_free.3
+MLINKS+= X509_dup.3 X509_ACERT_it.3
+MLINKS+= X509_dup.3 X509_ACERT_new.3
+MLINKS+= X509_dup.3 X509_ALGOR_free.3
+MLINKS+= X509_dup.3 X509_ALGOR_it.3
+MLINKS+= X509_dup.3 X509_ALGOR_new.3
+MLINKS+= X509_dup.3 X509_ATTRIBUTE_dup.3
+MLINKS+= X509_dup.3 X509_ATTRIBUTE_free.3
+MLINKS+= X509_dup.3 X509_ATTRIBUTE_new.3
+MLINKS+= X509_dup.3 X509_CERT_AUX_free.3
+MLINKS+= X509_dup.3 X509_CERT_AUX_new.3
+MLINKS+= X509_dup.3 X509_CINF_free.3
+MLINKS+= X509_dup.3 X509_CINF_new.3
+MLINKS+= X509_dup.3 X509_CRL_INFO_free.3
+MLINKS+= X509_dup.3 X509_CRL_INFO_new.3
+MLINKS+= X509_dup.3 X509_CRL_dup.3
+MLINKS+= X509_dup.3 X509_CRL_free.3
+MLINKS+= X509_dup.3 X509_CRL_new.3
+MLINKS+= X509_dup.3 X509_CRL_new_ex.3
+MLINKS+= X509_dup.3 X509_EXTENSION_dup.3
+MLINKS+= X509_dup.3 X509_EXTENSION_free.3
+MLINKS+= X509_dup.3 X509_EXTENSION_new.3
+MLINKS+= X509_dup.3 X509_NAME_ENTRY_dup.3
+MLINKS+= X509_dup.3 X509_NAME_ENTRY_free.3
+MLINKS+= X509_dup.3 X509_NAME_ENTRY_new.3
+MLINKS+= X509_dup.3 X509_NAME_dup.3
+MLINKS+= X509_dup.3 X509_NAME_free.3
+MLINKS+= X509_dup.3 X509_NAME_new.3
+MLINKS+= X509_dup.3 X509_REQ_INFO_free.3
+MLINKS+= X509_dup.3 X509_REQ_INFO_new.3
+MLINKS+= X509_dup.3 X509_REQ_dup.3
+MLINKS+= X509_dup.3 X509_REQ_free.3
+MLINKS+= X509_dup.3 X509_REQ_new.3
+MLINKS+= X509_dup.3 X509_REQ_new_ex.3
+MLINKS+= X509_dup.3 X509_REVOKED_dup.3
+MLINKS+= X509_dup.3 X509_REVOKED_free.3
+MLINKS+= X509_dup.3 X509_REVOKED_new.3
+MLINKS+= X509_dup.3 X509_SIG_free.3
+MLINKS+= X509_dup.3 X509_SIG_new.3
+MLINKS+= X509_dup.3 X509_VAL_free.3
+MLINKS+= X509_dup.3 X509_VAL_new.3
+MLINKS+= X509_get0_distinguishing_id.3 X509_REQ_get0_distinguishing_id.3
+MLINKS+= X509_get0_distinguishing_id.3 X509_REQ_set0_distinguishing_id.3
+MLINKS+= X509_get0_distinguishing_id.3 X509_set0_distinguishing_id.3
+MLINKS+= X509_get0_notBefore.3 X509_ACERT_get0_notAfter.3
+MLINKS+= X509_get0_notBefore.3 X509_ACERT_get0_notBefore.3
+MLINKS+= X509_get0_notBefore.3 X509_ACERT_set1_notAfter.3
+MLINKS+= X509_get0_notBefore.3 X509_ACERT_set1_notBefore.3
+MLINKS+= X509_get0_notBefore.3 X509_CRL_get0_lastUpdate.3
+MLINKS+= X509_get0_notBefore.3 X509_CRL_get0_nextUpdate.3
+MLINKS+= X509_get0_notBefore.3 X509_CRL_set1_lastUpdate.3
+MLINKS+= X509_get0_notBefore.3 X509_CRL_set1_nextUpdate.3
+MLINKS+= X509_get0_notBefore.3 X509_get0_notAfter.3
+MLINKS+= X509_get0_notBefore.3 X509_getm_notAfter.3
+MLINKS+= X509_get0_notBefore.3 X509_getm_notBefore.3
+MLINKS+= X509_get0_notBefore.3 X509_set1_notAfter.3
+MLINKS+= X509_get0_notBefore.3 X509_set1_notBefore.3
+MLINKS+= X509_get0_signature.3 X509_ACERT_get0_info_sigalg.3
+MLINKS+= X509_get0_signature.3 X509_ACERT_get0_signature.3
+MLINKS+= X509_get0_signature.3 X509_ACERT_get_signature_nid.3
+MLINKS+= X509_get0_signature.3 X509_CRL_get0_signature.3
+MLINKS+= X509_get0_signature.3 X509_CRL_get_signature_nid.3
+MLINKS+= X509_get0_signature.3 X509_REQ_get0_signature.3
+MLINKS+= X509_get0_signature.3 X509_REQ_get_signature_nid.3
+MLINKS+= X509_get0_signature.3 X509_REQ_set0_signature.3
+MLINKS+= X509_get0_signature.3 X509_REQ_set1_signature_algo.3
+MLINKS+= X509_get0_signature.3 X509_SIG_INFO_get.3
+MLINKS+= X509_get0_signature.3 X509_SIG_INFO_set.3
+MLINKS+= X509_get0_signature.3 X509_get0_tbs_sigalg.3
+MLINKS+= X509_get0_signature.3 X509_get_signature_info.3
+MLINKS+= X509_get0_signature.3 X509_get_signature_nid.3
+MLINKS+= X509_get0_uids.3 X509_ACERT_get0_issuerUID.3
+MLINKS+= X509_get_default_cert_file.3 X509_get_default_cert_dir.3
+MLINKS+= X509_get_default_cert_file.3 X509_get_default_cert_dir_env.3
+MLINKS+= X509_get_default_cert_file.3 X509_get_default_cert_file_env.3
MLINKS+= X509_get_extension_flags.3 X509_get0_authority_issuer.3
MLINKS+= X509_get_extension_flags.3 X509_get0_authority_key_id.3
MLINKS+= X509_get_extension_flags.3 X509_get0_authority_serial.3
-MLINKS+= X509V3_get_d2i.3 X509_get0_extensions.3
-MLINKS+= X509_get0_notBefore.3 X509_get0_notAfter.3
-MLINKS+= X509_get_pubkey.3 X509_get0_pubkey.3
-MLINKS+= X509_get_serialNumber.3 X509_get0_serialNumber.3
MLINKS+= X509_get_extension_flags.3 X509_get0_subject_key_id.3
-MLINKS+= X509_get0_signature.3 X509_get0_tbs_sigalg.3
-MLINKS+= X509_get_pubkey.3 X509_get_X509_PUBKEY.3
-MLINKS+= BIO_get_ex_new_index.3 X509_get_ex_data.3
-MLINKS+= BIO_get_ex_new_index.3 X509_get_ex_new_index.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext_by_NID.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext_by_OBJ.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext_by_critical.3
-MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext_count.3
-MLINKS+= X509V3_get_d2i.3 X509_get_ext_d2i.3
MLINKS+= X509_get_extension_flags.3 X509_get_extended_key_usage.3
-MLINKS+= X509_get_subject_name.3 X509_get_issuer_name.3
MLINKS+= X509_get_extension_flags.3 X509_get_key_usage.3
MLINKS+= X509_get_extension_flags.3 X509_get_pathlen.3
MLINKS+= X509_get_extension_flags.3 X509_get_proxy_pathlen.3
-MLINKS+= X509_get0_signature.3 X509_get_signature_info.3
-MLINKS+= X509_get0_signature.3 X509_get_signature_nid.3
-MLINKS+= X509_get0_notBefore.3 X509_getm_notAfter.3
-MLINKS+= X509_get0_notBefore.3 X509_getm_notBefore.3
-MLINKS+= X509_cmp_time.3 X509_gmtime_adj.3
-MLINKS+= X509_load_http.3 X509_http_nbio.3
-MLINKS+= X509_cmp.3 X509_issuer_and_serial_cmp.3
-MLINKS+= X509_cmp.3 X509_issuer_name_cmp.3
-MLINKS+= X509_get_subject_name.3 X509_issuer_name_hash.3
-MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_cert_crl_file.3
-MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_cert_crl_file_ex.3
-MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_cert_file.3
-MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_cert_file_ex.3
-MLINKS+= X509_LOOKUP_hash_dir.3 X509_load_crl_file.3
-MLINKS+= X509_new.3 X509_new_ex.3
-MLINKS+= X509_digest.3 X509_pubkey_digest.3
-MLINKS+= X509_verify.3 X509_self_signed.3
-MLINKS+= X509_get0_distinguishing_id.3 X509_set0_distinguishing_id.3
-MLINKS+= X509_get0_notBefore.3 X509_set1_notAfter.3
-MLINKS+= X509_get0_notBefore.3 X509_set1_notBefore.3
-MLINKS+= BIO_get_ex_new_index.3 X509_set_ex_data.3
-MLINKS+= X509_get_subject_name.3 X509_set_issuer_name.3
MLINKS+= X509_get_extension_flags.3 X509_set_proxy_flag.3
MLINKS+= X509_get_extension_flags.3 X509_set_proxy_pathlen.3
+MLINKS+= X509_get_pubkey.3 X509_REQ_get0_pubkey.3
+MLINKS+= X509_get_pubkey.3 X509_REQ_get_X509_PUBKEY.3
+MLINKS+= X509_get_pubkey.3 X509_REQ_get_pubkey.3
+MLINKS+= X509_get_pubkey.3 X509_REQ_set_pubkey.3
+MLINKS+= X509_get_pubkey.3 X509_get0_pubkey.3
+MLINKS+= X509_get_pubkey.3 X509_get_X509_PUBKEY.3
MLINKS+= X509_get_pubkey.3 X509_set_pubkey.3
+MLINKS+= X509_get_serialNumber.3 X509_ACERT_get0_serialNumber.3
+MLINKS+= X509_get_serialNumber.3 X509_ACERT_set1_serialNumber.3
+MLINKS+= X509_get_serialNumber.3 X509_get0_serialNumber.3
MLINKS+= X509_get_serialNumber.3 X509_set_serialNumber.3
+MLINKS+= X509_get_subject_name.3 X509_ACERT_get0_issuerName.3
+MLINKS+= X509_get_subject_name.3 X509_ACERT_set1_issuerName.3
+MLINKS+= X509_get_subject_name.3 X509_CRL_get_issuer.3
+MLINKS+= X509_get_subject_name.3 X509_CRL_set_issuer_name.3
+MLINKS+= X509_get_subject_name.3 X509_NAME_hash.3
+MLINKS+= X509_get_subject_name.3 X509_NAME_hash_ex.3
+MLINKS+= X509_get_subject_name.3 X509_REQ_get_subject_name.3
+MLINKS+= X509_get_subject_name.3 X509_REQ_set_subject_name.3
+MLINKS+= X509_get_subject_name.3 X509_get_issuer_name.3
+MLINKS+= X509_get_subject_name.3 X509_issuer_name_hash.3
+MLINKS+= X509_get_subject_name.3 X509_set_issuer_name.3
MLINKS+= X509_get_subject_name.3 X509_set_subject_name.3
-MLINKS+= X509_get_version.3 X509_set_version.3
-MLINKS+= X509_sign.3 X509_sign_ctx.3
-MLINKS+= X509_cmp.3 X509_subject_name_cmp.3
MLINKS+= X509_get_subject_name.3 X509_subject_name_hash.3
-MLINKS+= X509_cmp_time.3 X509_time_adj.3
-MLINKS+= X509_cmp_time.3 X509_time_adj_ex.3
+MLINKS+= X509_get_version.3 X509_ACERT_get_version.3
+MLINKS+= X509_get_version.3 X509_ACERT_set_version.3
+MLINKS+= X509_get_version.3 X509_CRL_get_version.3
+MLINKS+= X509_get_version.3 X509_CRL_set_version.3
+MLINKS+= X509_get_version.3 X509_REQ_get_version.3
+MLINKS+= X509_get_version.3 X509_REQ_set_version.3
+MLINKS+= X509_get_version.3 X509_set_version.3
+MLINKS+= X509_load_http.3 X509_CRL_http_nbio.3
+MLINKS+= X509_load_http.3 X509_CRL_load_http.3
+MLINKS+= X509_load_http.3 X509_http_nbio.3
+MLINKS+= X509_new.3 OSSL_STACK_OF_X509_free.3
+MLINKS+= X509_new.3 X509_chain_up_ref.3
+MLINKS+= X509_new.3 X509_free.3
+MLINKS+= X509_new.3 X509_new_ex.3
MLINKS+= X509_new.3 X509_up_ref.3
-MLINKS+= X509_STORE_CTX_get_error.3 X509_verify_cert_error_string.3
+MLINKS+= X509_sign.3 X509_ACERT_sign.3
+MLINKS+= X509_sign.3 X509_ACERT_sign_ctx.3
+MLINKS+= X509_sign.3 X509_CRL_sign.3
+MLINKS+= X509_sign.3 X509_CRL_sign_ctx.3
+MLINKS+= X509_sign.3 X509_REQ_sign.3
+MLINKS+= X509_sign.3 X509_REQ_sign_ctx.3
+MLINKS+= X509_sign.3 X509_sign_ctx.3
+MLINKS+= X509_verify.3 X509_ACERT_verify.3
+MLINKS+= X509_verify.3 X509_CRL_verify.3
+MLINKS+= X509_verify.3 X509_REQ_verify.3
+MLINKS+= X509_verify.3 X509_REQ_verify_ex.3
+MLINKS+= X509_verify.3 X509_self_signed.3
+MLINKS+= X509_verify_cert.3 X509_STORE_CTX_verify.3
+MLINKS+= X509_verify_cert.3 X509_build_chain.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_add_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_delete_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext_by_NID.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext_by_OBJ.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext_by_critical.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_CRL_get_ext_count.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_add_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_delete_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext_by_NID.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext_by_OBJ.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext_by_critical.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_REVOKED_get_ext_count.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_add_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_delete_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext_by_NID.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext_by_OBJ.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext_by_critical.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509_get_ext_count.3
MLINKS+= X509v3_get_ext_by_NID.3 X509v3_add_ext.3
+MLINKS+= X509v3_get_ext_by_NID.3 X509v3_add_extensions.3
MLINKS+= X509v3_get_ext_by_NID.3 X509v3_delete_ext.3
MLINKS+= X509v3_get_ext_by_NID.3 X509v3_get_ext.3
MLINKS+= X509v3_get_ext_by_NID.3 X509v3_get_ext_by_OBJ.3
MLINKS+= X509v3_get_ext_by_NID.3 X509v3_get_ext_by_critical.3
MLINKS+= X509v3_get_ext_by_NID.3 X509v3_get_ext_count.3
MLINKS+= b2i_PVK_bio_ex.3 b2i_PVK_bio.3
-MLINKS+= SSL_extension_supported.3 custom_ext_add_cb.3
-MLINKS+= SSL_extension_supported.3 custom_ext_free_cb.3
-MLINKS+= SSL_extension_supported.3 custom_ext_parse_cb.3
+MLINKS+= b2i_PVK_bio_ex.3 i2b_PVK_bio.3
+MLINKS+= b2i_PVK_bio_ex.3 i2b_PVK_bio_ex.3
+MLINKS+= d2i_PKCS8PrivateKey_bio.3 d2i_PKCS8PrivateKey_fp.3
+MLINKS+= d2i_PKCS8PrivateKey_bio.3 i2d_PKCS8PrivateKey_bio.3
+MLINKS+= d2i_PKCS8PrivateKey_bio.3 i2d_PKCS8PrivateKey_fp.3
+MLINKS+= d2i_PKCS8PrivateKey_bio.3 i2d_PKCS8PrivateKey_nid_bio.3
+MLINKS+= d2i_PKCS8PrivateKey_bio.3 i2d_PKCS8PrivateKey_nid_fp.3
+MLINKS+= d2i_PrivateKey.3 d2i_AutoPrivateKey.3
+MLINKS+= d2i_PrivateKey.3 d2i_AutoPrivateKey_ex.3
+MLINKS+= d2i_PrivateKey.3 d2i_KeyParams.3
+MLINKS+= d2i_PrivateKey.3 d2i_KeyParams_bio.3
+MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_bio.3
+MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_ex.3
+MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_ex_bio.3
+MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_ex_fp.3
+MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_fp.3
+MLINKS+= d2i_PrivateKey.3 d2i_PublicKey.3
+MLINKS+= d2i_PrivateKey.3 i2d_KeyParams.3
+MLINKS+= d2i_PrivateKey.3 i2d_KeyParams_bio.3
+MLINKS+= d2i_PrivateKey.3 i2d_PrivateKey.3
+MLINKS+= d2i_PrivateKey.3 i2d_PrivateKey_bio.3
+MLINKS+= d2i_PrivateKey.3 i2d_PrivateKey_fp.3
+MLINKS+= d2i_PrivateKey.3 i2d_PublicKey.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DHparams.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DHparams_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DHparams_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAPrivateKey.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAPrivateKey_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAPrivateKey_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAPublicKey.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DSA_PUBKEY.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DSA_PUBKEY_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DSA_PUBKEY_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAparams.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_ECParameters.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_ECPrivateKey.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_ECPrivateKey_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_ECPrivateKey_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_EC_PUBKEY.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_EC_PUBKEY_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_EC_PUBKEY_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPrivateKey_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPrivateKey_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPublicKey.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPublicKey_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPublicKey_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_RSA_PUBKEY.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_RSA_PUBKEY_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 d2i_RSA_PUBKEY_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DHparams.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DHparams_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DHparams_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAPrivateKey.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAPrivateKey_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAPrivateKey_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAPublicKey.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DSA_PUBKEY.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DSA_PUBKEY_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DSA_PUBKEY_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAparams.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_ECParameters.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_ECPrivateKey.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_ECPrivateKey_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_ECPrivateKey_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_EC_PUBKEY.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_EC_PUBKEY_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_EC_PUBKEY_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPrivateKey.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPrivateKey_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPrivateKey_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPublicKey.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPublicKey_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPublicKey_fp.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSA_PUBKEY.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSA_PUBKEY_bio.3
+MLINKS+= d2i_RSAPrivateKey.3 i2d_RSA_PUBKEY_fp.3
+MLINKS+= d2i_SSL_SESSION.3 d2i_SSL_SESSION_ex.3
+MLINKS+= d2i_SSL_SESSION.3 i2d_SSL_SESSION.3
MLINKS+= d2i_X509.3 d2i_ACCESS_DESCRIPTION.3
MLINKS+= d2i_X509.3 d2i_ADMISSIONS.3
MLINKS+= d2i_X509.3 d2i_ADMISSION_SYNTAX.3
@@ -4868,40 +5722,20 @@ MLINKS+= d2i_X509.3 d2i_ASN1_VISIBLESTRING.3
MLINKS+= d2i_X509.3 d2i_ASRange.3
MLINKS+= d2i_X509.3 d2i_AUTHORITY_INFO_ACCESS.3
MLINKS+= d2i_X509.3 d2i_AUTHORITY_KEYID.3
-MLINKS+= d2i_PrivateKey.3 d2i_AutoPrivateKey.3
-MLINKS+= d2i_PrivateKey.3 d2i_AutoPrivateKey_ex.3
MLINKS+= d2i_X509.3 d2i_BASIC_CONSTRAINTS.3
MLINKS+= d2i_X509.3 d2i_CERTIFICATEPOLICIES.3
MLINKS+= d2i_X509.3 d2i_CMS_ContentInfo.3
MLINKS+= d2i_X509.3 d2i_CMS_ReceiptRequest.3
MLINKS+= d2i_X509.3 d2i_CMS_bio.3
MLINKS+= d2i_X509.3 d2i_CRL_DIST_POINTS.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DHparams.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DHparams_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DHparams_fp.3
MLINKS+= d2i_X509.3 d2i_DHxparams.3
MLINKS+= d2i_X509.3 d2i_DIRECTORYSTRING.3
MLINKS+= d2i_X509.3 d2i_DISPLAYTEXT.3
MLINKS+= d2i_X509.3 d2i_DIST_POINT.3
MLINKS+= d2i_X509.3 d2i_DIST_POINT_NAME.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAPrivateKey.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAPrivateKey_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAPrivateKey_fp.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAPublicKey.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DSA_PUBKEY.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DSA_PUBKEY_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DSA_PUBKEY_fp.3
MLINKS+= d2i_X509.3 d2i_DSA_SIG.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_DSAparams.3
MLINKS+= d2i_X509.3 d2i_ECDSA_SIG.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_ECPKParameters.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_ECParameters.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_ECPrivateKey.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_ECPrivateKey_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_ECPrivateKey_fp.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_EC_PUBKEY.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_EC_PUBKEY_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_EC_PUBKEY_fp.3
+MLINKS+= d2i_X509.3 d2i_ECPKParameters.3
MLINKS+= d2i_X509.3 d2i_EDIPARTYNAME.3
MLINKS+= d2i_X509.3 d2i_ESS_CERT_ID.3
MLINKS+= d2i_X509.3 d2i_ESS_CERT_ID_V2.3
@@ -4917,8 +5751,6 @@ MLINKS+= d2i_X509.3 d2i_IPAddressOrRange.3
MLINKS+= d2i_X509.3 d2i_IPAddressRange.3
MLINKS+= d2i_X509.3 d2i_ISSUER_SIGN_TOOL.3
MLINKS+= d2i_X509.3 d2i_ISSUING_DIST_POINT.3
-MLINKS+= d2i_PrivateKey.3 d2i_KeyParams.3
-MLINKS+= d2i_PrivateKey.3 d2i_KeyParams_bio.3
MLINKS+= d2i_X509.3 d2i_NAMING_AUTHORITY.3
MLINKS+= d2i_X509.3 d2i_NETSCAPE_CERT_SEQUENCE.3
MLINKS+= d2i_X509.3 d2i_NETSCAPE_SPKAC.3
@@ -4939,22 +5771,62 @@ MLINKS+= d2i_X509.3 d2i_OCSP_REVOKEDINFO.3
MLINKS+= d2i_X509.3 d2i_OCSP_SERVICELOC.3
MLINKS+= d2i_X509.3 d2i_OCSP_SIGNATURE.3
MLINKS+= d2i_X509.3 d2i_OCSP_SINGLERESP.3
+MLINKS+= d2i_X509.3 d2i_OSSL_AA_DIST_POINT.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ALLOWED_ATTRIBUTES_CHOICE.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ALLOWED_ATTRIBUTES_ITEM.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ALLOWED_ATTRIBUTES_SYNTAX.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ATAV.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ATTRIBUTES_SYNTAX.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ATTRIBUTE_DESCRIPTOR.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ATTRIBUTE_MAPPING.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ATTRIBUTE_MAPPINGS.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ATTRIBUTE_TYPE_MAPPING.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ATTRIBUTE_VALUE_MAPPING.3
+MLINKS+= d2i_X509.3 d2i_OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX.3
+MLINKS+= d2i_X509.3 d2i_OSSL_BASIC_ATTR_CONSTRAINTS.3
+MLINKS+= d2i_X509.3 d2i_OSSL_CMP_ATAVS.3
MLINKS+= d2i_X509.3 d2i_OSSL_CMP_MSG.3
-MLINKS+= OSSL_CMP_MSG_get0_header.3 d2i_OSSL_CMP_MSG_bio.3
MLINKS+= d2i_X509.3 d2i_OSSL_CMP_PKIHEADER.3
MLINKS+= d2i_X509.3 d2i_OSSL_CMP_PKISI.3
MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_CERTID.3
MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_CERTTEMPLATE.3
+MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_ENCRYPTEDKEY.3
MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_ENCRYPTEDVALUE.3
MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_MSG.3
MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_MSGS.3
MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_PBMPARAMETER.3
MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_PKIPUBLICATIONINFO.3
MLINKS+= d2i_X509.3 d2i_OSSL_CRMF_SINGLEPUBINFO.3
+MLINKS+= d2i_X509.3 d2i_OSSL_DAY_TIME.3
+MLINKS+= d2i_X509.3 d2i_OSSL_DAY_TIME_BAND.3
+MLINKS+= d2i_X509.3 d2i_OSSL_HASH.3
+MLINKS+= d2i_X509.3 d2i_OSSL_IETF_ATTR_SYNTAX.3
+MLINKS+= d2i_X509.3 d2i_OSSL_INFO_SYNTAX.3
+MLINKS+= d2i_X509.3 d2i_OSSL_INFO_SYNTAX_POINTER.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ISSUER_SERIAL.3
+MLINKS+= d2i_X509.3 d2i_OSSL_NAMED_DAY.3
+MLINKS+= d2i_X509.3 d2i_OSSL_OBJECT_DIGEST_INFO.3
+MLINKS+= d2i_X509.3 d2i_OSSL_PRIVILEGE_POLICY_ID.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ROLE_SPEC_CERT_ID.3
+MLINKS+= d2i_X509.3 d2i_OSSL_ROLE_SPEC_CERT_ID_SYNTAX.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TARGET.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TARGETING_INFORMATION.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TARGETS.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TARGET_CERT.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TIME_PERIOD.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TIME_SPEC.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TIME_SPEC_ABSOLUTE.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TIME_SPEC_DAY.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TIME_SPEC_MONTH.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TIME_SPEC_TIME.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TIME_SPEC_WEEKS.3
+MLINKS+= d2i_X509.3 d2i_OSSL_TIME_SPEC_X_DAY_OF.3
+MLINKS+= d2i_X509.3 d2i_OSSL_USER_NOTICE_SYNTAX.3
MLINKS+= d2i_X509.3 d2i_OTHERNAME.3
MLINKS+= d2i_X509.3 d2i_PBE2PARAM.3
MLINKS+= d2i_X509.3 d2i_PBEPARAM.3
MLINKS+= d2i_X509.3 d2i_PBKDF2PARAM.3
+MLINKS+= d2i_X509.3 d2i_PBMAC1PARAM.3
MLINKS+= d2i_X509.3 d2i_PKCS12.3
MLINKS+= d2i_X509.3 d2i_PKCS12_BAGS.3
MLINKS+= d2i_X509.3 d2i_PKCS12_MAC_DATA.3
@@ -4973,7 +5845,6 @@ MLINKS+= d2i_X509.3 d2i_PKCS7_SIGNER_INFO.3
MLINKS+= d2i_X509.3 d2i_PKCS7_SIGN_ENVELOPE.3
MLINKS+= d2i_X509.3 d2i_PKCS7_bio.3
MLINKS+= d2i_X509.3 d2i_PKCS7_fp.3
-MLINKS+= d2i_PKCS8PrivateKey_bio.3 d2i_PKCS8PrivateKey_fp.3
MLINKS+= d2i_X509.3 d2i_PKCS8_PRIV_KEY_INFO.3
MLINKS+= d2i_X509.3 d2i_PKCS8_PRIV_KEY_INFO_bio.3
MLINKS+= d2i_X509.3 d2i_PKCS8_PRIV_KEY_INFO_fp.3
@@ -4985,26 +5856,8 @@ MLINKS+= d2i_X509.3 d2i_POLICYQUALINFO.3
MLINKS+= d2i_X509.3 d2i_PROFESSION_INFO.3
MLINKS+= d2i_X509.3 d2i_PROXY_CERT_INFO_EXTENSION.3
MLINKS+= d2i_X509.3 d2i_PROXY_POLICY.3
-MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY.3
-MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY_bio.3
-MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY_ex.3
-MLINKS+= X509_PUBKEY_new.3 d2i_PUBKEY_fp.3
-MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_bio.3
-MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_ex.3
-MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_ex_bio.3
-MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_ex_fp.3
-MLINKS+= d2i_PrivateKey.3 d2i_PrivateKey_fp.3
-MLINKS+= d2i_PrivateKey.3 d2i_PublicKey.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPrivateKey_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPrivateKey_fp.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPublicKey.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPublicKey_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_RSAPublicKey_fp.3
MLINKS+= d2i_X509.3 d2i_RSA_OAEP_PARAMS.3
MLINKS+= d2i_X509.3 d2i_RSA_PSS_PARAMS.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_RSA_PUBKEY.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_RSA_PUBKEY_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 d2i_RSA_PUBKEY_fp.3
MLINKS+= d2i_X509.3 d2i_SCRYPT_PARAMS.3
MLINKS+= d2i_X509.3 d2i_SCT_LIST.3
MLINKS+= d2i_X509.3 d2i_SXNET.3
@@ -5024,10 +5877,12 @@ MLINKS+= d2i_X509.3 d2i_TS_TST_INFO.3
MLINKS+= d2i_X509.3 d2i_TS_TST_INFO_bio.3
MLINKS+= d2i_X509.3 d2i_TS_TST_INFO_fp.3
MLINKS+= d2i_X509.3 d2i_USERNOTICE.3
+MLINKS+= d2i_X509.3 d2i_X509_ACERT.3
+MLINKS+= d2i_X509.3 d2i_X509_ACERT_bio.3
+MLINKS+= d2i_X509.3 d2i_X509_ACERT_fp.3
MLINKS+= d2i_X509.3 d2i_X509_ALGOR.3
MLINKS+= d2i_X509.3 d2i_X509_ALGORS.3
MLINKS+= d2i_X509.3 d2i_X509_ATTRIBUTE.3
-MLINKS+= i2d_re_X509_tbs.3 d2i_X509_AUX.3
MLINKS+= d2i_X509.3 d2i_X509_CERT_AUX.3
MLINKS+= d2i_X509.3 d2i_X509_CINF.3
MLINKS+= d2i_X509.3 d2i_X509_CRL.3
@@ -5050,8 +5905,6 @@ MLINKS+= d2i_X509.3 d2i_X509_SIG.3
MLINKS+= d2i_X509.3 d2i_X509_VAL.3
MLINKS+= d2i_X509.3 d2i_X509_bio.3
MLINKS+= d2i_X509.3 d2i_X509_fp.3
-MLINKS+= b2i_PVK_bio_ex.3 i2b_PVK_bio.3
-MLINKS+= b2i_PVK_bio_ex.3 i2b_PVK_bio_ex.3
MLINKS+= d2i_X509.3 i2d_ACCESS_DESCRIPTION.3
MLINKS+= d2i_X509.3 i2d_ADMISSIONS.3
MLINKS+= d2i_X509.3 i2d_ADMISSION_SYNTAX.3
@@ -5089,32 +5942,14 @@ MLINKS+= d2i_X509.3 i2d_CMS_ContentInfo.3
MLINKS+= d2i_X509.3 i2d_CMS_ReceiptRequest.3
MLINKS+= d2i_X509.3 i2d_CMS_bio.3
MLINKS+= d2i_X509.3 i2d_CRL_DIST_POINTS.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DHparams.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DHparams_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DHparams_fp.3
MLINKS+= d2i_X509.3 i2d_DHxparams.3
MLINKS+= d2i_X509.3 i2d_DIRECTORYSTRING.3
MLINKS+= d2i_X509.3 i2d_DISPLAYTEXT.3
MLINKS+= d2i_X509.3 i2d_DIST_POINT.3
MLINKS+= d2i_X509.3 i2d_DIST_POINT_NAME.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAPrivateKey.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAPrivateKey_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAPrivateKey_fp.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAPublicKey.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DSA_PUBKEY.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DSA_PUBKEY_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DSA_PUBKEY_fp.3
MLINKS+= d2i_X509.3 i2d_DSA_SIG.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_DSAparams.3
MLINKS+= d2i_X509.3 i2d_ECDSA_SIG.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_ECPKParameters.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_ECParameters.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_ECPrivateKey.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_ECPrivateKey_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_ECPrivateKey_fp.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_EC_PUBKEY.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_EC_PUBKEY_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_EC_PUBKEY_fp.3
+MLINKS+= d2i_X509.3 i2d_ECPKParameters.3
MLINKS+= d2i_X509.3 i2d_EDIPARTYNAME.3
MLINKS+= d2i_X509.3 i2d_ESS_CERT_ID.3
MLINKS+= d2i_X509.3 i2d_ESS_CERT_ID_V2.3
@@ -5130,8 +5965,6 @@ MLINKS+= d2i_X509.3 i2d_IPAddressOrRange.3
MLINKS+= d2i_X509.3 i2d_IPAddressRange.3
MLINKS+= d2i_X509.3 i2d_ISSUER_SIGN_TOOL.3
MLINKS+= d2i_X509.3 i2d_ISSUING_DIST_POINT.3
-MLINKS+= d2i_PrivateKey.3 i2d_KeyParams.3
-MLINKS+= d2i_PrivateKey.3 i2d_KeyParams_bio.3
MLINKS+= d2i_X509.3 i2d_NAMING_AUTHORITY.3
MLINKS+= d2i_X509.3 i2d_NETSCAPE_CERT_SEQUENCE.3
MLINKS+= d2i_X509.3 i2d_NETSCAPE_SPKAC.3
@@ -5152,22 +5985,62 @@ MLINKS+= d2i_X509.3 i2d_OCSP_REVOKEDINFO.3
MLINKS+= d2i_X509.3 i2d_OCSP_SERVICELOC.3
MLINKS+= d2i_X509.3 i2d_OCSP_SIGNATURE.3
MLINKS+= d2i_X509.3 i2d_OCSP_SINGLERESP.3
+MLINKS+= d2i_X509.3 i2d_OSSL_AA_DIST_POINT.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ALLOWED_ATTRIBUTES_CHOICE.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ALLOWED_ATTRIBUTES_ITEM.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ALLOWED_ATTRIBUTES_SYNTAX.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ATAV.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ATTRIBUTES_SYNTAX.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ATTRIBUTE_DESCRIPTOR.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ATTRIBUTE_MAPPING.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ATTRIBUTE_MAPPINGS.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ATTRIBUTE_TYPE_MAPPING.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ATTRIBUTE_VALUE_MAPPING.3
+MLINKS+= d2i_X509.3 i2d_OSSL_AUTHORITY_ATTRIBUTE_ID_SYNTAX.3
+MLINKS+= d2i_X509.3 i2d_OSSL_BASIC_ATTR_CONSTRAINTS.3
+MLINKS+= d2i_X509.3 i2d_OSSL_CMP_ATAVS.3
MLINKS+= d2i_X509.3 i2d_OSSL_CMP_MSG.3
-MLINKS+= OSSL_CMP_MSG_get0_header.3 i2d_OSSL_CMP_MSG_bio.3
MLINKS+= d2i_X509.3 i2d_OSSL_CMP_PKIHEADER.3
MLINKS+= d2i_X509.3 i2d_OSSL_CMP_PKISI.3
MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_CERTID.3
MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_CERTTEMPLATE.3
+MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_ENCRYPTEDKEY.3
MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_ENCRYPTEDVALUE.3
MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_MSG.3
MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_MSGS.3
MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_PBMPARAMETER.3
MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_PKIPUBLICATIONINFO.3
MLINKS+= d2i_X509.3 i2d_OSSL_CRMF_SINGLEPUBINFO.3
+MLINKS+= d2i_X509.3 i2d_OSSL_DAY_TIME.3
+MLINKS+= d2i_X509.3 i2d_OSSL_DAY_TIME_BAND.3
+MLINKS+= d2i_X509.3 i2d_OSSL_HASH.3
+MLINKS+= d2i_X509.3 i2d_OSSL_IETF_ATTR_SYNTAX.3
+MLINKS+= d2i_X509.3 i2d_OSSL_INFO_SYNTAX.3
+MLINKS+= d2i_X509.3 i2d_OSSL_INFO_SYNTAX_POINTER.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ISSUER_SERIAL.3
+MLINKS+= d2i_X509.3 i2d_OSSL_NAMED_DAY.3
+MLINKS+= d2i_X509.3 i2d_OSSL_OBJECT_DIGEST_INFO.3
+MLINKS+= d2i_X509.3 i2d_OSSL_PRIVILEGE_POLICY_ID.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ROLE_SPEC_CERT_ID.3
+MLINKS+= d2i_X509.3 i2d_OSSL_ROLE_SPEC_CERT_ID_SYNTAX.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TARGET.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TARGETING_INFORMATION.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TARGETS.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TARGET_CERT.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TIME_PERIOD.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TIME_SPEC.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TIME_SPEC_ABSOLUTE.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TIME_SPEC_DAY.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TIME_SPEC_MONTH.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TIME_SPEC_TIME.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TIME_SPEC_WEEKS.3
+MLINKS+= d2i_X509.3 i2d_OSSL_TIME_SPEC_X_DAY_OF.3
+MLINKS+= d2i_X509.3 i2d_OSSL_USER_NOTICE_SYNTAX.3
MLINKS+= d2i_X509.3 i2d_OTHERNAME.3
MLINKS+= d2i_X509.3 i2d_PBE2PARAM.3
MLINKS+= d2i_X509.3 i2d_PBEPARAM.3
MLINKS+= d2i_X509.3 i2d_PBKDF2PARAM.3
+MLINKS+= d2i_X509.3 i2d_PBMAC1PARAM.3
MLINKS+= d2i_X509.3 i2d_PKCS12.3
MLINKS+= d2i_X509.3 i2d_PKCS12_BAGS.3
MLINKS+= d2i_X509.3 i2d_PKCS12_MAC_DATA.3
@@ -5189,10 +6062,6 @@ MLINKS+= d2i_X509.3 i2d_PKCS7_bio.3
MLINKS+= d2i_X509.3 i2d_PKCS7_fp.3
MLINKS+= d2i_X509.3 i2d_PKCS8PrivateKeyInfo_bio.3
MLINKS+= d2i_X509.3 i2d_PKCS8PrivateKeyInfo_fp.3
-MLINKS+= d2i_PKCS8PrivateKey_bio.3 i2d_PKCS8PrivateKey_bio.3
-MLINKS+= d2i_PKCS8PrivateKey_bio.3 i2d_PKCS8PrivateKey_fp.3
-MLINKS+= d2i_PKCS8PrivateKey_bio.3 i2d_PKCS8PrivateKey_nid_bio.3
-MLINKS+= d2i_PKCS8PrivateKey_bio.3 i2d_PKCS8PrivateKey_nid_fp.3
MLINKS+= d2i_X509.3 i2d_PKCS8_PRIV_KEY_INFO.3
MLINKS+= d2i_X509.3 i2d_PKCS8_PRIV_KEY_INFO_bio.3
MLINKS+= d2i_X509.3 i2d_PKCS8_PRIV_KEY_INFO_fp.3
@@ -5204,27 +6073,10 @@ MLINKS+= d2i_X509.3 i2d_POLICYQUALINFO.3
MLINKS+= d2i_X509.3 i2d_PROFESSION_INFO.3
MLINKS+= d2i_X509.3 i2d_PROXY_CERT_INFO_EXTENSION.3
MLINKS+= d2i_X509.3 i2d_PROXY_POLICY.3
-MLINKS+= X509_PUBKEY_new.3 i2d_PUBKEY.3
-MLINKS+= X509_PUBKEY_new.3 i2d_PUBKEY_bio.3
-MLINKS+= X509_PUBKEY_new.3 i2d_PUBKEY_fp.3
-MLINKS+= d2i_PrivateKey.3 i2d_PrivateKey.3
-MLINKS+= d2i_PrivateKey.3 i2d_PrivateKey_bio.3
-MLINKS+= d2i_PrivateKey.3 i2d_PrivateKey_fp.3
-MLINKS+= d2i_PrivateKey.3 i2d_PublicKey.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPrivateKey.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPrivateKey_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPrivateKey_fp.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPublicKey.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPublicKey_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSAPublicKey_fp.3
MLINKS+= d2i_X509.3 i2d_RSA_OAEP_PARAMS.3
MLINKS+= d2i_X509.3 i2d_RSA_PSS_PARAMS.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSA_PUBKEY.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSA_PUBKEY_bio.3
-MLINKS+= d2i_RSAPrivateKey.3 i2d_RSA_PUBKEY_fp.3
MLINKS+= d2i_X509.3 i2d_SCRYPT_PARAMS.3
MLINKS+= d2i_X509.3 i2d_SCT_LIST.3
-MLINKS+= d2i_SSL_SESSION.3 i2d_SSL_SESSION.3
MLINKS+= d2i_X509.3 i2d_SXNET.3
MLINKS+= d2i_X509.3 i2d_SXNETID.3
MLINKS+= d2i_X509.3 i2d_TS_ACCURACY.3
@@ -5243,10 +6095,12 @@ MLINKS+= d2i_X509.3 i2d_TS_TST_INFO_bio.3
MLINKS+= d2i_X509.3 i2d_TS_TST_INFO_fp.3
MLINKS+= d2i_X509.3 i2d_USERNOTICE.3
MLINKS+= d2i_X509.3 i2d_X509.3
+MLINKS+= d2i_X509.3 i2d_X509_ACERT.3
+MLINKS+= d2i_X509.3 i2d_X509_ACERT_bio.3
+MLINKS+= d2i_X509.3 i2d_X509_ACERT_fp.3
MLINKS+= d2i_X509.3 i2d_X509_ALGOR.3
MLINKS+= d2i_X509.3 i2d_X509_ALGORS.3
MLINKS+= d2i_X509.3 i2d_X509_ATTRIBUTE.3
-MLINKS+= i2d_re_X509_tbs.3 i2d_X509_AUX.3
MLINKS+= d2i_X509.3 i2d_X509_CERT_AUX.3
MLINKS+= d2i_X509.3 i2d_X509_CINF.3
MLINKS+= d2i_X509.3 i2d_X509_CRL.3
@@ -5269,54 +6123,19 @@ MLINKS+= d2i_X509.3 i2d_X509_SIG.3
MLINKS+= d2i_X509.3 i2d_X509_VAL.3
MLINKS+= d2i_X509.3 i2d_X509_bio.3
MLINKS+= d2i_X509.3 i2d_X509_fp.3
+MLINKS+= i2d_re_X509_tbs.3 d2i_X509_AUX.3
+MLINKS+= i2d_re_X509_tbs.3 i2d_X509_AUX.3
MLINKS+= i2d_re_X509_tbs.3 i2d_re_X509_CRL_tbs.3
MLINKS+= i2d_re_X509_tbs.3 i2d_re_X509_REQ_tbs.3
MLINKS+= o2i_SCT_LIST.3 i2o_SCT.3
MLINKS+= o2i_SCT_LIST.3 i2o_SCT_LIST.3
+MLINKS+= o2i_SCT_LIST.3 o2i_SCT.3
MLINKS+= s2i_ASN1_IA5STRING.3 i2s_ASN1_ENUMERATED.3
MLINKS+= s2i_ASN1_IA5STRING.3 i2s_ASN1_ENUMERATED_TABLE.3
MLINKS+= s2i_ASN1_IA5STRING.3 i2s_ASN1_IA5STRING.3
MLINKS+= s2i_ASN1_IA5STRING.3 i2s_ASN1_INTEGER.3
MLINKS+= s2i_ASN1_IA5STRING.3 i2s_ASN1_OCTET_STRING.3
MLINKS+= s2i_ASN1_IA5STRING.3 i2s_ASN1_UTF8STRING.3
-MLINKS+= OBJ_nid2obj.3 i2t_ASN1_OBJECT.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_delete.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_doall.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_doall_arg.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_error.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_flush.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_free.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_insert.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_new.3
-MLINKS+= OPENSSL_LH_COMPFUNC.3 lh_TYPE_retrieve.3
-MLINKS+= o2i_SCT_LIST.3 o2i_SCT.3
-MLINKS+= PEM_read_bio_PrivateKey.3 pem_password_cb.3
MLINKS+= s2i_ASN1_IA5STRING.3 s2i_ASN1_INTEGER.3
MLINKS+= s2i_ASN1_IA5STRING.3 s2i_ASN1_OCTET_STRING.3
MLINKS+= s2i_ASN1_IA5STRING.3 s2i_ASN1_UTF8STRING.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_deep_copy.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_delete.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_delete_ptr.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_dup.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_find.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_find_all.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_find_ex.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_free.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_insert.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_is_sorted.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_new.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_new_null.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_new_reserve.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_num.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_pop.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_pop_free.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_push.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_reserve.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_set.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_set_cmp_func.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_shift.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_sort.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_unshift.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_value.3
-MLINKS+= DEFINE_STACK_OF.3 sk_TYPE_zero.3
-MLINKS+= SSL_CTX_set_ct_validation_callback.3 ssl_ct_validation_cb.3
diff --git a/secure/lib/libcrypto/man/man7/Makefile b/secure/lib/libcrypto/man/man7/Makefile
index 1518c54bb49f..da3abdb08667 100644
--- a/secure/lib/libcrypto/man/man7/Makefile
+++ b/secure/lib/libcrypto/man/man7/Makefile
@@ -121,6 +121,7 @@ MAN+= ossl-guide-introduction.7
MAN+= ossl-guide-libcrypto-introduction.7
MAN+= ossl-guide-libraries-introduction.7
MAN+= ossl-guide-libssl-introduction.7
+MAN+= ossl-guide-migration.7
MAN+= ossl-guide-quic-client-block.7
MAN+= ossl-guide-quic-client-non-block.7
MAN+= ossl-guide-quic-introduction.7
@@ -154,41 +155,6 @@ MAN+= provider-storemgmt.7
MAN+= provider.7
MAN+= proxy-certificates.7
MAN+= x509.7
-MLINKS+= EVP_KEYEXCH-X25519.7 EVP_KEYEXCH-X448.7
-MLINKS+= EVP_PKEY-HMAC.7 EVP_KEYMGMT-CMAC.7
-MLINKS+= EVP_PKEY-DH.7 EVP_KEYMGMT-DH.7
-MLINKS+= EVP_PKEY-DH.7 EVP_KEYMGMT-DHX.7
-MLINKS+= EVP_PKEY-DSA.7 EVP_KEYMGMT-DSA.7
-MLINKS+= EVP_PKEY-EC.7 EVP_KEYMGMT-EC.7
-MLINKS+= EVP_PKEY-X25519.7 EVP_KEYMGMT-ED25519.7
-MLINKS+= EVP_PKEY-X25519.7 EVP_KEYMGMT-ED448.7
-MLINKS+= EVP_PKEY-HMAC.7 EVP_KEYMGMT-HMAC.7
-MLINKS+= EVP_PKEY-HMAC.7 EVP_KEYMGMT-Poly1305.7
-MLINKS+= EVP_PKEY-RSA.7 EVP_KEYMGMT-RSA.7
-MLINKS+= EVP_PKEY-SM2.7 EVP_KEYMGMT-SM2.7
-MLINKS+= EVP_PKEY-HMAC.7 EVP_KEYMGMT-Siphash.7
-MLINKS+= EVP_PKEY-X25519.7 EVP_KEYMGMT-X25519.7
-MLINKS+= EVP_PKEY-X25519.7 EVP_KEYMGMT-X448.7
-MLINKS+= EVP_MAC-BLAKE2.7 EVP_MAC-BLAKE2BMAC.7
-MLINKS+= EVP_MAC-BLAKE2.7 EVP_MAC-BLAKE2SMAC.7
-MLINKS+= EVP_MAC-KMAC.7 EVP_MAC-KMAC128.7
-MLINKS+= EVP_MAC-KMAC.7 EVP_MAC-KMAC256.7
-MLINKS+= EVP_MD-SHAKE.7 EVP_MD-KECCAK-KMAC.7
-MLINKS+= EVP_PKEY-HMAC.7 EVP_PKEY-CMAC.7
-MLINKS+= EVP_PKEY-DH.7 EVP_PKEY-DHX.7
-MLINKS+= EVP_PKEY-X25519.7 EVP_PKEY-ED25519.7
-MLINKS+= EVP_PKEY-X25519.7 EVP_PKEY-ED448.7
-MLINKS+= EVP_PKEY-HMAC.7 EVP_PKEY-Poly1305.7
-MLINKS+= EVP_PKEY-HMAC.7 EVP_PKEY-Siphash.7
-MLINKS+= EVP_PKEY-X25519.7 EVP_PKEY-X448.7
-MLINKS+= EVP_SIGNATURE-HMAC.7 EVP_SIGNATURE-CMAC.7
-MLINKS+= EVP_SIGNATURE-ED25519.7 EVP_SIGNATURE-ED448.7
-MLINKS+= EVP_SIGNATURE-HMAC.7 EVP_SIGNATURE-Poly1305.7
-MLINKS+= EVP_SIGNATURE-HMAC.7 EVP_SIGNATURE-Siphash.7
-MLINKS+= EVP_SIGNATURE-ED25519.7 Ed25519.7
-MLINKS+= EVP_SIGNATURE-ED25519.7 Ed448.7
+MLINKS+= X25519.7 X448.7
MLINKS+= openssl_user_macros.7 OPENSSL_API_COMPAT.7
MLINKS+= openssl_user_macros.7 OPENSSL_NO_DEPRECATED.7
-MLINKS+= EVP_PKEY-RSA.7 RSA.7
-MLINKS+= EVP_PKEY-SM2.7 SM2.7
-MLINKS+= X25519.7 X448.7
diff --git a/share/man/man4/gpioled.4 b/share/man/man4/gpioled.4
index 646e2ff2a8f0..45457d20d298 100644
--- a/share/man/man4/gpioled.4
+++ b/share/man/man4/gpioled.4
@@ -70,7 +70,20 @@ Which pin on the GPIO interface to map to this instance.
Please note that this mask should only ever have one bit set
(any other bits - i.e., pins - will be ignored).
.It Va hint.gpioled.%d.invert
-If set to 1, the pin will be set to 0 to light the LED, and 1 to clear it.
+Use pin inversion. If set to 1, the pin will be set to 0 to light the LED, and 1
+to clear it.
+.It Va hint.gpioled.%d.invmode
+Whether or not to use hardware support when pin inversion is requested. Must be
+one of:
+.Bl -tag
+.It Va auto
+Use hardware pin inversion if available, else fallback to software pin
+inversion. This is the default.
+.It Va hw
+Use hardware pin inversion.
+.It Va sw
+Use software pin inversion.
+.El
.It Va hint.gpioled.%d.state
The initial state of the LED when the driver takes control over it.
If set to 1 or 0, the LED will be on or off correspondingly.
diff --git a/share/man/man4/random.4 b/share/man/man4/random.4
index 840bc0c3234b..04d46e4d32aa 100644
--- a/share/man/man4/random.4
+++ b/share/man/man4/random.4
@@ -21,7 +21,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd April 19, 2019
+.Dd August 28, 2025
.Dt RANDOM 4
.Os
.Sh NAME
@@ -132,6 +132,17 @@ are listed in square brackets.
See
.Xr random_harvest 9
for more on the harvesting of entropy.
+.Pp
+The
+.Va kern.random.nist_healthtest_enabled
+tunable can be used to enable the entropy source health tests outlined
+in section 4 of NIST Special Publication 800-90B.
+When enabled, all entropy sources will be subject to the repetition
+count and adaptive proportion tests described in that document.
+If one of the tests fails, the source will be disabled, i.e., all
+subsequent entropy samples from that source will be discarded.
+The implementation performs startup testing, during which entropy
+sources are discarded.
.Sh FILES
.Bl -tag -width ".Pa /dev/urandom"
.It Pa /dev/random
diff --git a/share/man/man4/tcp.4 b/share/man/man4/tcp.4
index fcfda42908d8..3c9f4ff83f3d 100644
--- a/share/man/man4/tcp.4
+++ b/share/man/man4/tcp.4
@@ -31,7 +31,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd June 27, 2025
+.Dd September 5, 2025
.Dt TCP 4
.Os
.Sh NAME
@@ -940,9 +940,6 @@ maximum segment size.
This helps throughput in general, but
particularly affects short transfers and high-bandwidth large
propagation-delay connections.
-.It Va rfc6675_pipe
-Deprecated and superseded by
-.Va sack.revised
.It Va sack.enable
Enable support for RFC 2018, TCP Selective Acknowledgment option,
which allows the receiver to inform the sender about all successfully
@@ -974,6 +971,11 @@ recovery, the trailing segment is immediately resent, rather than waiting
for a Retransmission timeout.
Finally, SACK loss recovery is also engaged, once two segments plus one byte are
SACKed - even if no traditional duplicate ACKs were observed.
+.Va sack.revised
+is deprecated and will be removed in
+.Fx 16 .
+.Va sack.enable
+will always follow RFC6675.
.It Va sendbuf_auto
Enable automatic send buffer sizing.
.It Va sendbuf_auto_lowat
diff --git a/share/man/man4/vtnet.4 b/share/man/man4/vtnet.4
index 67a835050422..1df79da5f42e 100644
--- a/share/man/man4/vtnet.4
+++ b/share/man/man4/vtnet.4
@@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd September 4, 2025
+.Dd September 8, 2025
.Dt VTNET 4
.Os
.Sh NAME
diff --git a/share/man/man5/src.conf.5 b/share/man/man5/src.conf.5
index 2895c0cf4746..ded16c9cf436 100644
--- a/share/man/man5/src.conf.5
+++ b/share/man/man5/src.conf.5
@@ -1,5 +1,5 @@
.\" DO NOT EDIT-- this file is @generated by tools/build/options/makeman.
-.Dd August 20, 2025
+.Dd September 10, 2025
.Dt SRC.CONF 5
.Os
.Sh NAME
@@ -29,8 +29,11 @@ variables that control the aspects of how the system builds.
.Pp
The default location of
.Nm
-is
-.Pa /etc/src.conf ,
+is the top level of the source tree, or
+.Pa /etc/src.conf
+if no
+.Nm
+is found in the source tree itself,
though an alternative location can be specified in the
.Xr make 1
variable
@@ -1212,8 +1215,8 @@ is set explicitly)
.It Va WITHOUT_MANCOMPRESS
Do not install compressed man pages.
Only the uncompressed versions will be installed.
-.It Va WITHOUT_MANSPLITPKG
-Do not split man pages into their own packages during make package.
+.It Va WITH_MANSPLITPKG
+Split man pages into their own packages during make package.
.It Va WITHOUT_MAN_UTILS
Do not build utilities for manual pages,
.Xr apropos 1 ,
diff --git a/share/man/man7/ports.7 b/share/man/man7/ports.7
index b681a326f407..75070ce852fe 100644
--- a/share/man/man7/ports.7
+++ b/share/man/man7/ports.7
@@ -25,7 +25,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd March 21, 2025
+.Dd September 10, 2025
.Dt PORTS 7
.Os
.Sh NAME
@@ -683,7 +683,7 @@ WITH_DEBUG_PORTS= mail/dovecot security/krb5
.Pp
It is also possible to use the debug variables on the command line:
.Bd -literal -offset 2n
-.Li # Ic make -DWITH_DEBUG DEBUG_FLAGS="-g -O0" build
+.Li # Ic make WITH_DEBUG DEBUG_FLAGS="-g -O0" build
.Ed
.Pp
See the
diff --git a/share/man/man8/nanobsd.8 b/share/man/man8/nanobsd.8
index 838f9ddc9afa..8a1f44af6900 100644
--- a/share/man/man8/nanobsd.8
+++ b/share/man/man8/nanobsd.8
@@ -25,7 +25,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd July 14, 2025
+.Dd September 9, 2025
.Dt NANOBSD 8
.Os
.Sh NAME
@@ -33,7 +33,7 @@
.Nd create an embedded FreeBSD system image
.Sh SYNOPSIS
.Nm
-.Op Fl BbfhIiKknqvWwX
+.Op Fl BbfhIiKknpqvWwX
.Op Fl c Ar config-file
.Sh DESCRIPTION
The
@@ -42,7 +42,7 @@ utility is a script which produces a minimal implementation of
.Fx
(called
.Nm NanoBSD ) ,
-which typically fits on a small media such as a Compact Flash card,
+which typically fits on a small media such as an SD card,
or other mass storage medium.
It can be used to build specialized install images, designed for easy
installation and maintenance.
@@ -77,6 +77,10 @@ This suppresses the normal cleanup work done before the
.Cm buildworld
stage and adds -DNO_CLEAN to the make command line
used for each build stage (world and kernel).
+.It Fl r
+Don't prepare the image.
+Skip running of the customization and early customization scripts for
+incremental image refinement from world, kernel, or packages.
.It Fl q
Make output more quiet.
.It Fl v
diff --git a/share/man/man9/g_geom.9 b/share/man/man9/g_geom.9
index 74c6979fceda..c5b0c0aded2d 100644
--- a/share/man/man9/g_geom.9
+++ b/share/man/man9/g_geom.9
@@ -27,12 +27,15 @@
.Os
.Sh NAME
.Nm g_new_geomf ,
+.Nm g_new_geom ,
.Nm g_destroy_geom
.Nd "geom management"
.Sh SYNOPSIS
.In geom/geom.h
.Ft "struct g_geom *"
.Fn g_new_geomf "struct g_class *mp" "const char *fmt" ...
+.Ft "struct g_geom *"
+.Fn g_new_geom "struct g_class *mp" "const char *name"
.Ft void
.Fn g_destroy_geom "struct g_geom *gp"
.Sh DESCRIPTION
@@ -58,6 +61,14 @@ The geom's name is created in a
-like way from the rest of the arguments.
.Pp
The
+.Fn g_new_geom
+function is very similar to
+.Fn g_new_geomf
+except that it accepts a regular string instead of a
+.Xr printf 3 Ns
+-like format strng as the geom's name.
+.Pp
+The
.Fn g_destroy_geom
function destroys the given geom immediately and cancels all related pending
events.
@@ -94,7 +105,9 @@ and
.Va access
for it.
.Pp
-.Fn g_new_geomf :
+.Fn g_new_geomf
+and
+.Fn g_new_geom :
.Bl -item -offset indent
.It
Class
diff --git a/share/mk/bsd.cpu.mk b/share/mk/bsd.cpu.mk
index f6599a0ad802..1225d690e908 100644
--- a/share/mk/bsd.cpu.mk
+++ b/share/mk/bsd.cpu.mk
@@ -391,8 +391,11 @@ MACHINE_ABI+= soft-float
.else
MACHINE_ABI+= hard-float
.endif
-# Currently all 64-bit architectures include 64 in their name (see arch(7)).
-.if ${MACHINE_ARCH:M*64*}
+# Currently all 64-bit FreeBSD architectures include 64 in their name
+# (see arch(7)). We need a special case for cross-building from macOS
+# (which uses arm64/arm).
+.if ${MACHINE_ARCH:M*64*} || \
+ (defined(BOOTSTRAPPING) && ${.MAKE.OS} == "Darwin" && ${MACHINE} == "arm64")
MACHINE_ABI+= long64
.else
MACHINE_ABI+= long32
diff --git a/share/mk/bsd.opts.mk b/share/mk/bsd.opts.mk
index 439924d0d596..66eb427c3505 100644
--- a/share/mk/bsd.opts.mk
+++ b/share/mk/bsd.opts.mk
@@ -60,7 +60,6 @@ __DEFAULT_YES_OPTIONS = \
MAKE_CHECK_USE_SANDBOX \
MAN \
MANCOMPRESS \
- MANSPLITPKG \
NIS \
NLS \
OPENSSH \
@@ -78,6 +77,7 @@ __DEFAULT_NO_OPTIONS = \
CCACHE_BUILD \
CTF \
INSTALL_AS_USER \
+ MANSPLITPKG \
REPRODUCIBLE_BUILD \
RETPOLINE \
RUN_TESTS \
diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk
index 85a003eb4eaf..9bd4e6a1842f 100644
--- a/share/mk/src.opts.mk
+++ b/share/mk/src.opts.mk
@@ -214,7 +214,6 @@ __DEFAULT_NO_OPTIONS = \
MALLOC_PRODUCTION \
OFED_EXTRA \
OPENLDAP \
- REPRODUCIBLE_BUILD \
RPCBIND_WARMSTART_SUPPORT \
SORT_THREADS \
ZONEINFO_LEAPSECONDS_SUPPORT \
diff --git a/share/mk/src.sys.mk b/share/mk/src.sys.mk
index 2b9fc255a26d..ec035fb71e54 100644
--- a/share/mk/src.sys.mk
+++ b/share/mk/src.sys.mk
@@ -6,7 +6,11 @@
.if !defined(_WITHOUT_SRCCONF)
# Allow user to configure things that only effect src tree builds.
+.if exists(${SRCTOP}/src.conf)
+SRCCONF?= ${SRCTOP}/src.conf
+.else
SRCCONF?= /etc/src.conf
+.endif
.if !empty(SRCCONF) && \
(exists(${SRCCONF}) || ${SRCCONF} != "/etc/src.conf") && \
!target(_srcconf_included_)
diff --git a/stand/common/gfx_fb.c b/stand/common/gfx_fb.c
index 659bf8540422..3de0a8b631ee 100644
--- a/stand/common/gfx_fb.c
+++ b/stand/common/gfx_fb.c
@@ -276,7 +276,6 @@ void
gfx_fb_setcolors(teken_attr_t *attr, ev_sethook_t sethook,
ev_unsethook_t unsethook)
{
- const char *ptr;
bool need_setattr = false;
/*
diff --git a/stand/efi/boot1/boot1.c b/stand/efi/boot1/boot1.c
index b93c6b425160..c906b430c0d6 100644
--- a/stand/efi/boot1/boot1.c
+++ b/stand/efi/boot1/boot1.c
@@ -299,9 +299,9 @@ efi_exit(EFI_STATUS s)
}
void
-exit(int error __unused)
+exit(int error)
{
- efi_exit(EFI_LOAD_ERROR);
+ efi_exit(errno_to_efi_status(error));
}
/*
diff --git a/stand/efi/loader/Makefile b/stand/efi/loader/Makefile
index ae2ffc475730..b30c563d4331 100644
--- a/stand/efi/loader/Makefile
+++ b/stand/efi/loader/Makefile
@@ -61,6 +61,7 @@ CWARNFLAGS.main.c+= -Wno-format
.PATH: ${.CURDIR}/../loader/arch/${__arch}
.include "${.CURDIR}/../loader/arch/${__arch}/Makefile.inc"
+CFLAGS+= -Wall
CFLAGS+= -I${.CURDIR}
CFLAGS+= -I${.CURDIR}/arch/${__arch}
CFLAGS+= -I${EFISRC}/include
diff --git a/stand/efi/loader/arch/amd64/multiboot2.c b/stand/efi/loader/arch/amd64/multiboot2.c
index eb7362293406..6216fac42e4a 100644
--- a/stand/efi/loader/arch/amd64/multiboot2.c
+++ b/stand/efi/loader/arch/amd64/multiboot2.c
@@ -79,7 +79,6 @@ loadfile(char *filename, uint64_t dest, struct preloaded_file **result)
void *multiboot = NULL;
ssize_t search_size;
struct multiboot_header *header;
- char *cmdline;
struct mb2hdr hdr;
bool keep_bs = false;
@@ -495,7 +494,6 @@ static int
obj_loadfile(char *filename, uint64_t dest, struct preloaded_file **result)
{
struct preloaded_file *mfp, *kfp, *rfp;
- struct kernel_module *kmp;
int error;
/* See if there's a multiboot kernel loaded */
diff --git a/stand/efi/loader/arch/amd64/trap.c b/stand/efi/loader/arch/amd64/trap.c
index 61feb76e2dca..37e7e9d263a7 100644
--- a/stand/efi/loader/arch/amd64/trap.c
+++ b/stand/efi/loader/arch/amd64/trap.c
@@ -87,7 +87,6 @@ report_exc(struct trapframe *tf)
struct frame *fp;
uintptr_t pc, base;
char buf[80];
- int ret;
base = (uintptr_t)boot_img->ImageBase;
/*
diff --git a/stand/efi/loader/bootinfo.c b/stand/efi/loader/bootinfo.c
index b8f1a2ffd56c..7931622c2df6 100644
--- a/stand/efi/loader/bootinfo.c
+++ b/stand/efi/loader/bootinfo.c
@@ -67,9 +67,8 @@
static int
bi_getboothowto(char *kargs)
{
-#ifdef EFI
- const char *sw, *tmp;
- char *opts;
+#if defined(EFI) && (defined(__i386__) || defined(__amd64__))
+ const char *tmp;
int speed, port;
char buf[50];
#endif
diff --git a/stand/efi/loader/copy.c b/stand/efi/loader/copy.c
index e4ad865a4acd..7452726565ad 100644
--- a/stand/efi/loader/copy.c
+++ b/stand/efi/loader/copy.c
@@ -248,7 +248,7 @@ static int
command_staging_slop(int argc, char *argv[])
{
char *endp;
- u_long new, prev;
+ u_long new;
if (argc > 2) {
goto err;
@@ -405,7 +405,9 @@ efi_check_space(vm_offset_t end)
return (true);
}
+#if defined(__amd64__) || defined(__i386__)
before_staging:
+#endif
/* Try allocating space before the previous allocation */
if (staging < nr_pages * EFI_PAGE_SIZE)
goto expand;
diff --git a/stand/efi/loader/efi_main.c b/stand/efi/loader/efi_main.c
index 2a5120dc89d7..6eea6f25c152 100644
--- a/stand/efi/loader/efi_main.c
+++ b/stand/efi/loader/efi_main.c
@@ -49,7 +49,7 @@ void
exit(int status)
{
- efi_exit(EFI_LOAD_ERROR);
+ efi_exit(errno_to_efi_status(status));
}
static CHAR16 *
diff --git a/stand/efi/loader/framebuffer.c b/stand/efi/loader/framebuffer.c
index 141a29305f7c..fc61ed15ba3c 100644
--- a/stand/efi/loader/framebuffer.c
+++ b/stand/efi/loader/framebuffer.c
@@ -630,7 +630,7 @@ efi_find_framebuffer(teken_gfx_t *gfx_state)
gfx_state->tg_fb_type = FB_UGA;
gfx_state->tg_private = uga;
} else {
- return (1);
+ return (efi_status_to_errno(status));
}
}
@@ -644,9 +644,12 @@ efi_find_framebuffer(teken_gfx_t *gfx_state)
break;
default:
- return (1);
+ return (EINVAL);
}
+ if (rv != 0)
+ return (rv);
+
gfx_state->tg_fb.fb_addr = efifb.fb_addr;
gfx_state->tg_fb.fb_size = efifb.fb_size;
gfx_state->tg_fb.fb_height = efifb.fb_height;
diff --git a/stand/efi/loader/main.c b/stand/efi/loader/main.c
index 436676368447..208b8b424e60 100644
--- a/stand/efi/loader/main.c
+++ b/stand/efi/loader/main.c
@@ -505,8 +505,7 @@ match_boot_info(char *boot_info, size_t bisz)
* a drop to the OK boot loader prompt is possible.
*/
static int
-find_currdev(bool do_bootmgr, bool is_last,
- char *boot_info, size_t boot_info_sz)
+find_currdev(bool do_bootmgr, char *boot_info, size_t boot_info_sz)
{
pdinfo_t *dp, *pp;
EFI_DEVICE_PATH *devpath, *copy;
@@ -864,7 +863,7 @@ static int
check_acpi_spcr(void)
{
ACPI_TABLE_SPCR *spcr;
- int br, db, io, rs, rw, sb, xo, pv, pd;
+ int br, db, io, rs, rw, xo, pv, pd;
uintmax_t mm;
const char *dt, *pa;
char *val = NULL;
@@ -896,7 +895,6 @@ check_acpi_spcr(void)
/* Uart settings */
pa = acpi_uart_parity(spcr->Parity);
- sb = spcr->StopBits;
db = 8;
/*
@@ -1121,6 +1119,8 @@ read_loader_env(const char *name, char *def_fn, bool once)
printf(" Reading loader env vars from %s\n", fn);
parse_loader_efi_config(boot_img->DeviceHandle, fn);
}
+
+ free(freeme);
}
caddr_t
@@ -1201,12 +1201,12 @@ EFI_STATUS
main(int argc, CHAR16 *argv[])
{
int howto, i, uhowto;
- bool has_kbd, is_last;
+ bool has_kbd;
char *s;
EFI_DEVICE_PATH *imgpath;
CHAR16 *text;
EFI_STATUS rv;
- size_t sz, bosz = 0, bisz = 0;
+ size_t sz, bisz = 0;
UINT16 boot_order[100];
char boot_info[4096];
char buf[32];
@@ -1404,17 +1404,13 @@ main(int argc, CHAR16 *argv[])
printf(" %04x%s", boot_order[i],
boot_order[i] == boot_current ? "[*]" : "");
printf("\n");
- is_last = boot_order[(sz / sizeof(boot_order[0])) - 1] == boot_current;
- bosz = sz;
} else if (uefi_boot_mgr) {
/*
* u-boot doesn't set BootOrder, but otherwise participates in the
* boot manager protocol. So we fake it here and don't consider it
* a failure.
*/
- bosz = sizeof(boot_order[0]);
boot_order[0] = boot_current;
- is_last = true;
}
}
@@ -1463,7 +1459,7 @@ main(int argc, CHAR16 *argv[])
* the boot protocol and also allow an escape hatch for users wishing
* to try something different.
*/
- if (find_currdev(uefi_boot_mgr, is_last, boot_info, bisz) != 0)
+ if (find_currdev(uefi_boot_mgr, boot_info, bisz) != 0)
if (uefi_boot_mgr &&
!interactive_interrupt("Failed to find bootable partition"))
return (EFI_NOT_FOUND);
diff --git a/stand/fonts/INDEX.fonts b/stand/fonts/INDEX.fonts
index 66a6d8a9a3f5..fc035c6b2e4e 100644
--- a/stand/fonts/INDEX.fonts
+++ b/stand/fonts/INDEX.fonts
@@ -60,9 +60,6 @@ FONT:en:8x16v.fnt
16x32.fnt:en:Terminus BSD Console, size 32
16x32.fnt:da:Terminus BSD-konsol, størrelse 32
16x32.fnt:de:Terminus BSD Console, Größe 32
-32x64.fnt:en:Spleen BSD Console, size 64
-32x64.fnt:da:Spleen BSD-konsol, størrelse 64
-32x64.fnt:de:Spleen BSD Console, Größe 64
# (fset 'langnew
# "\M-}\C-p\C-k\C-y\C-m\C-y\M-}")
diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC
index 786edc4125c9..d5a1adb2dc65 100644
--- a/sys/amd64/conf/GENERIC
+++ b/sys/amd64/conf/GENERIC
@@ -287,9 +287,9 @@ device wlan # 802.11 support
options IEEE80211_DEBUG # enable debug msgs
options IEEE80211_SUPPORT_MESH # enable 802.11s draft support
device wlan_wep # 802.11 WEP support
+device wlan_tkip # 802.11 TKIP support
device wlan_ccmp # 802.11 CCMP support
device wlan_gcmp # 802.11 GCMP support
-device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device ath # Atheros CardBus/PCI NICs
device ath_hal # Atheros CardBus/PCI chip support
diff --git a/sys/amd64/include/vmm.h b/sys/amd64/include/vmm.h
index 0b3daed4f69e..e35119af8572 100644
--- a/sys/amd64/include/vmm.h
+++ b/sys/amd64/include/vmm.h
@@ -46,6 +46,7 @@ enum vm_suspend_how {
VM_SUSPEND_POWEROFF,
VM_SUSPEND_HALT,
VM_SUSPEND_TRIPLEFAULT,
+ VM_SUSPEND_DESTROY,
VM_SUSPEND_LAST
};
diff --git a/sys/arm/conf/TEGRA124 b/sys/arm/conf/TEGRA124
index ad5532427eda..ff23e63f77bd 100644
--- a/sys/arm/conf/TEGRA124
+++ b/sys/arm/conf/TEGRA124
@@ -107,9 +107,9 @@ device ums # USB mouse
# Wireless NIC cards
#device wlan # 802.11 support
#device wlan_wep # 802.11 WEP support
+#device wlan_tkip # 802.11 TKIP support
#device wlan_ccmp # 802.11 CCMP support
#device wlan_gcmp # 802.11 GCMP support
-#device wlan_tkip # 802.11 TKIP support
#device wlan_amrr # AMRR transmit rate control algorithm
# PCI
diff --git a/sys/arm64/include/vmm.h b/sys/arm64/include/vmm.h
index 73b5b4a09591..e839b5dd92c9 100644
--- a/sys/arm64/include/vmm.h
+++ b/sys/arm64/include/vmm.h
@@ -42,6 +42,7 @@ enum vm_suspend_how {
VM_SUSPEND_RESET,
VM_SUSPEND_POWEROFF,
VM_SUSPEND_HALT,
+ VM_SUSPEND_DESTROY,
VM_SUSPEND_LAST
};
diff --git a/sys/arm64/vmm/vmm.c b/sys/arm64/vmm/vmm.c
index 3082d2941221..1dcefa1489e9 100644
--- a/sys/arm64/vmm/vmm.c
+++ b/sys/arm64/vmm/vmm.c
@@ -1342,8 +1342,14 @@ vm_handle_smccc_call(struct vcpu *vcpu, struct vm_exit *vme, bool *retu)
static int
vm_handle_wfi(struct vcpu *vcpu, struct vm_exit *vme, bool *retu)
{
+ struct vm *vm;
+
+ vm = vcpu->vm;
vcpu_lock(vcpu);
while (1) {
+ if (vm->suspend)
+ break;
+
if (vgic_has_pending_irq(vcpu->cookie))
break;
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index 7192df200ae2..8078f3f6d4b1 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -7761,7 +7761,8 @@ dtrace_probe(dtrace_id_t id, uintptr_t arg0, uintptr_t arg1,
uintptr_t *memref = (uintptr_t *)(uintptr_t) val;
if (!DTRACE_INSCRATCHPTR(&mstate,
- (uintptr_t)memref, 2 * sizeof(uintptr_t))) {
+ (uintptr_t) memref,
+ sizeof (uintptr_t) + sizeof (size_t))) {
*flags |= CPU_DTRACE_BADADDR;
continue;
}
@@ -7773,21 +7774,21 @@ dtrace_probe(dtrace_id_t id, uintptr_t arg0, uintptr_t arg1,
* Check if the size exceeds the allocated
* buffer size.
*/
- if (size + sizeof(uintptr_t) > dp->dtdo_rtype.dtdt_size) {
+ if (size + sizeof (size_t) >
+ dp->dtdo_rtype.dtdt_size) {
/* Flag a drop! */
*flags |= CPU_DTRACE_DROP;
continue;
}
/* Store the size in the buffer first. */
- DTRACE_STORE(uintptr_t, tomax,
- valoffs, size);
+ DTRACE_STORE(size_t, tomax, valoffs, size);
/*
* Offset the buffer address to the start
* of the data.
*/
- valoffs += sizeof(uintptr_t);
+ valoffs += sizeof(size_t);
/*
* Reset to the memory address rather than
diff --git a/sys/compat/freebsd32/freebsd32_syscall.h b/sys/compat/freebsd32/freebsd32_syscall.h
index 90cd21a80923..54063150eef9 100644
--- a/sys/compat/freebsd32/freebsd32_syscall.h
+++ b/sys/compat/freebsd32/freebsd32_syscall.h
@@ -515,4 +515,6 @@
#define FREEBSD32_SYS_inotify_rm_watch 594
#define FREEBSD32_SYS_getgroups 595
#define FREEBSD32_SYS_setgroups 596
-#define FREEBSD32_SYS_MAXSYSCALL 597
+#define FREEBSD32_SYS_jail_attach_jd 597
+#define FREEBSD32_SYS_jail_remove_jd 598
+#define FREEBSD32_SYS_MAXSYSCALL 599
diff --git a/sys/compat/freebsd32/freebsd32_syscalls.c b/sys/compat/freebsd32/freebsd32_syscalls.c
index f0f8d26554b5..f7cc4c284e4d 100644
--- a/sys/compat/freebsd32/freebsd32_syscalls.c
+++ b/sys/compat/freebsd32/freebsd32_syscalls.c
@@ -602,4 +602,6 @@ const char *freebsd32_syscallnames[] = {
"inotify_rm_watch", /* 594 = inotify_rm_watch */
"getgroups", /* 595 = getgroups */
"setgroups", /* 596 = setgroups */
+ "jail_attach_jd", /* 597 = jail_attach_jd */
+ "jail_remove_jd", /* 598 = jail_remove_jd */
};
diff --git a/sys/compat/freebsd32/freebsd32_sysent.c b/sys/compat/freebsd32/freebsd32_sysent.c
index 12f1a346c3e9..18f809ef04e3 100644
--- a/sys/compat/freebsd32/freebsd32_sysent.c
+++ b/sys/compat/freebsd32/freebsd32_sysent.c
@@ -664,4 +664,6 @@ struct sysent freebsd32_sysent[] = {
{ .sy_narg = AS(inotify_rm_watch_args), .sy_call = (sy_call_t *)sys_inotify_rm_watch, .sy_auevent = AUE_INOTIFY, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 594 = inotify_rm_watch */
{ .sy_narg = AS(getgroups_args), .sy_call = (sy_call_t *)sys_getgroups, .sy_auevent = AUE_GETGROUPS, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 595 = getgroups */
{ .sy_narg = AS(setgroups_args), .sy_call = (sy_call_t *)sys_setgroups, .sy_auevent = AUE_SETGROUPS, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 596 = setgroups */
+ { .sy_narg = AS(jail_attach_jd_args), .sy_call = (sy_call_t *)sys_jail_attach_jd, .sy_auevent = AUE_JAIL_ATTACH, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 597 = jail_attach_jd */
+ { .sy_narg = AS(jail_remove_jd_args), .sy_call = (sy_call_t *)sys_jail_remove_jd, .sy_auevent = AUE_JAIL_REMOVE, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 598 = jail_remove_jd */
};
diff --git a/sys/compat/freebsd32/freebsd32_systrace_args.c b/sys/compat/freebsd32/freebsd32_systrace_args.c
index e471c5148021..29a5497e9efa 100644
--- a/sys/compat/freebsd32/freebsd32_systrace_args.c
+++ b/sys/compat/freebsd32/freebsd32_systrace_args.c
@@ -3413,6 +3413,20 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
*n_args = 2;
break;
}
+ /* jail_attach_jd */
+ case 597: {
+ struct jail_attach_jd_args *p = params;
+ iarg[a++] = p->fd; /* int */
+ *n_args = 1;
+ break;
+ }
+ /* jail_remove_jd */
+ case 598: {
+ struct jail_remove_jd_args *p = params;
+ iarg[a++] = p->fd; /* int */
+ *n_args = 1;
+ break;
+ }
default:
*n_args = 0;
break;
@@ -9222,6 +9236,26 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
break;
};
break;
+ /* jail_attach_jd */
+ case 597:
+ switch (ndx) {
+ case 0:
+ p = "int";
+ break;
+ default:
+ break;
+ };
+ break;
+ /* jail_remove_jd */
+ case 598:
+ switch (ndx) {
+ case 0:
+ p = "int";
+ break;
+ default:
+ break;
+ };
+ break;
default:
break;
};
@@ -11130,6 +11164,16 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
if (ndx == 0 || ndx == 1)
p = "int";
break;
+ /* jail_attach_jd */
+ case 597:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
+ /* jail_remove_jd */
+ case 598:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
diff --git a/sys/compat/linuxkpi/common/include/acpi/acpi.h b/sys/compat/linuxkpi/common/include/acpi/acpi.h
index 016c7ede0f6e..9bb435591daa 100644
--- a/sys/compat/linuxkpi/common/include/acpi/acpi.h
+++ b/sys/compat/linuxkpi/common/include/acpi/acpi.h
@@ -131,7 +131,7 @@ acpi_format_exception(ACPI_STATUS Exception)
}
static inline ACPI_STATUS
-acpi_get_handle(ACPI_HANDLE Parent, ACPI_STRING Pathname,
+acpi_get_handle(ACPI_HANDLE Parent, const char *Pathname,
ACPI_HANDLE *RetHandle)
{
return (AcpiGetHandle(Parent, Pathname, RetHandle));
diff --git a/sys/compat/linuxkpi/common/include/kunit/static_stub.h b/sys/compat/linuxkpi/common/include/kunit/static_stub.h
new file mode 100644
index 000000000000..9d425d46dbb0
--- /dev/null
+++ b/sys/compat/linuxkpi/common/include/kunit/static_stub.h
@@ -0,0 +1,15 @@
+/*
+ * Copyright (c) 2025 The FreeBSD Foundation
+ *
+ * This software was developed by Björn Zeeb under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#ifndef _LINUXKPI_KUNIT_STATIC_STUB_H
+#define _LINUXKPI_KUNIT_STATIC_STUB_H
+
+#define KUNIT_STATIC_STUB_REDIRECT(_fn, ...) do { } while(0)
+
+#endif /* _LINUXKPI_KUNIT_STATIC_STUB_H */
diff --git a/sys/compat/linuxkpi/common/include/linux/cleanup.h b/sys/compat/linuxkpi/common/include/linux/cleanup.h
index 01f234f0cbe7..5bb146f082ed 100644
--- a/sys/compat/linuxkpi/common/include/linux/cleanup.h
+++ b/sys/compat/linuxkpi/common/include/linux/cleanup.h
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2024 The FreeBSD Foundation
+ * Copyright (c) 2024-2025 The FreeBSD Foundation
*
* This software was developed by Björn Zeeb under sponsorship from
* the FreeBSD Foundation.
@@ -43,4 +43,51 @@
guard_ ## _n ## _t guard_ ## _n ## _ ## __COUNTER__ \
__cleanup(guard_ ## _n ## _destroy) = guard_ ## _n ## _create
+#define DEFINE_FREE(_n, _t, _f) \
+ static inline void \
+ __free_ ## _n(void *p) \
+ { \
+ _t _T; \
+ \
+ _T = *(_t *)p; \
+ _f; \
+ }
+
+#define __free(_n) __cleanup(__free_##_n)
+
+/*
+ * Given this is a _0 version it should likely be broken up into parts.
+ * But we have no idead what a _1, _2, ... version would do different
+ * until we see a call.
+ * This is used for a not-real-type (rcu). We use a bool to "simulate"
+ * the lock held. Also _T still special, may not always be used, so tag
+ * with __unused (or better the LinuxKPI __maybe_unused).
+ */
+#define DEFINE_LOCK_GUARD_0(_n, _lock, _unlock, ...) \
+ \
+ typedef struct { \
+ bool lock; \
+ __VA_ARGS__; \
+ } guard_ ## _n ## _t; \
+ \
+ static inline void \
+ guard_ ## _n ## _destroy(guard_ ## _n ## _t *_T) \
+ { \
+ if (_T->lock) { \
+ _unlock; \
+ } \
+ } \
+ \
+ static inline guard_ ## _n ## _t \
+ guard_ ## _n ## _create(void) \
+ { \
+ guard_ ## _n ## _t _tmp; \
+ guard_ ## _n ## _t *_T __maybe_unused; \
+ \
+ _tmp.lock = true; \
+ _T = &_tmp; \
+ _lock; \
+ return (_tmp); \
+ }
+
#endif /* _LINUXKPI_LINUX_CLEANUP_H */
diff --git a/sys/compat/linuxkpi/common/include/linux/compiler.h b/sys/compat/linuxkpi/common/include/linux/compiler.h
index fb5ad3bf4fe4..948396144ad6 100644
--- a/sys/compat/linuxkpi/common/include/linux/compiler.h
+++ b/sys/compat/linuxkpi/common/include/linux/compiler.h
@@ -130,4 +130,10 @@
#define is_signed_type(t) ((t)-1 < (t)1)
#define is_unsigned_type(t) ((t)-1 > (t)1)
+#if __has_builtin(__builtin_dynamic_object_size)
+#define __struct_size(_s) __builtin_dynamic_object_size(_s, 0)
+#else
+#define __struct_size(_s) __builtin_object_size(_s, 0)
+#endif
+
#endif /* _LINUXKPI_LINUX_COMPILER_H_ */
diff --git a/sys/compat/linuxkpi/common/include/linux/device.h b/sys/compat/linuxkpi/common/include/linux/device.h
index 2556b0c45e49..7dd6340746d2 100644
--- a/sys/compat/linuxkpi/common/include/linux/device.h
+++ b/sys/compat/linuxkpi/common/include/linux/device.h
@@ -4,7 +4,7 @@
* Copyright (c) 2010 Panasas, Inc.
* Copyright (c) 2013-2016 Mellanox Technologies, Ltd.
* All rights reserved.
- * Copyright (c) 2021-2022 The FreeBSD Foundation
+ * Copyright (c) 2021-2025 The FreeBSD Foundation
*
* Portions of this software were developed by Björn Zeeb
* under sponsorship from the FreeBSD Foundation.
@@ -284,7 +284,8 @@ int lkpi_devres_destroy(struct device *, void(*release)(struct device *, void *)
void lkpi_devres_release_free_list(struct device *);
void lkpi_devres_unlink(struct device *, void *);
void lkpi_devm_kmalloc_release(struct device *, void *);
-#define devm_kfree(_d, _p) lkpi_devm_kmalloc_release(_d, _p)
+void lkpi_devm_kfree(struct device *, const void *);
+#define devm_kfree(_d, _p) lkpi_devm_kfree(_d, _p)
static inline const char *
dev_driver_string(const struct device *dev)
diff --git a/sys/compat/linuxkpi/common/include/linux/math.h b/sys/compat/linuxkpi/common/include/linux/math.h
index 5a348a57747b..1d50e011f66d 100644
--- a/sys/compat/linuxkpi/common/include/linux/math.h
+++ b/sys/compat/linuxkpi/common/include/linux/math.h
@@ -56,7 +56,7 @@
__ret; \
})
-#if defined(LINUXKPI_VERSION) && LINUXKPI_VERSION >= 60600
+#if !defined(LINUXKPI_VERSION) || (LINUXKPI_VERSION >= 60600)
#define abs_diff(x, y) ({ \
__typeof(x) _x = (x); \
__typeof(y) _y = (y); \
diff --git a/sys/compat/linuxkpi/common/include/linux/math64.h b/sys/compat/linuxkpi/common/include/linux/math64.h
index a216d350570f..25ca9da1b622 100644
--- a/sys/compat/linuxkpi/common/include/linux/math64.h
+++ b/sys/compat/linuxkpi/common/include/linux/math64.h
@@ -98,6 +98,12 @@ div64_u64_round_up(uint64_t dividend, uint64_t divisor)
return ((dividend + divisor - 1) / divisor);
}
+static inline uint64_t
+roundup_u64(uint64_t x1, uint32_t x2)
+{
+ return (div_u64(x1 + x2 - 1, x2) * x2);
+}
+
#define DIV64_U64_ROUND_UP(...) \
div64_u64_round_up(__VA_ARGS__)
diff --git a/sys/compat/linuxkpi/common/include/linux/overflow.h b/sys/compat/linuxkpi/common/include/linux/overflow.h
index 9ba9b9500f11..e811037b8ecc 100644
--- a/sys/compat/linuxkpi/common/include/linux/overflow.h
+++ b/sys/compat/linuxkpi/common/include/linux/overflow.h
@@ -33,8 +33,10 @@
* credit to Christian Biere.
*/
#define __type_half_max(type) ((type)1 << (8*sizeof(type) - 1 - is_signed_type(type)))
-#define type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T)))
-#define type_min(T) ((T)((T)-type_max(T)-(T)1))
+#define __type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T)))
+#define type_max(t) __type_max(typeof(t))
+#define __type_min(T) ((T)((T)-type_max(T)-(T)1))
+#define type_min(t) __type_min(typeof(t))
/*
* Avoids triggering -Wtype-limits compilation warning,
@@ -59,46 +61,123 @@ static inline bool __must_check __must_check_overflow(bool overflow)
* @b: second addend
* @d: pointer to store sum
*
- * Returns 0 on success.
+ * Returns true on wrap-around, false otherwise.
*
- * *@d holds the results of the attempted addition, but is not considered
- * "safe for use" on a non-zero return value, which indicates that the
- * sum has overflowed or been truncated.
+ * *@d holds the results of the attempted addition, regardless of whether
+ * wrap-around occurred.
*/
#define check_add_overflow(a, b, d) \
__must_check_overflow(__builtin_add_overflow(a, b, d))
/**
+ * wrapping_add() - Intentionally perform a wrapping addition
+ * @type: type for result of calculation
+ * @a: first addend
+ * @b: second addend
+ *
+ * Return the potentially wrapped-around addition without
+ * tripping any wrap-around sanitizers that may be enabled.
+ */
+#define wrapping_add(type, a, b) \
+ ({ \
+ type __val; \
+ __builtin_add_overflow(a, b, &__val); \
+ __val; \
+ })
+
+/**
+ * wrapping_assign_add() - Intentionally perform a wrapping increment assignment
+ * @var: variable to be incremented
+ * @offset: amount to add
+ *
+ * Increments @var by @offset with wrap-around. Returns the resulting
+ * value of @var. Will not trip any wrap-around sanitizers.
+ *
+ * Returns the new value of @var.
+ */
+#define wrapping_assign_add(var, offset) \
+ ({ \
+ typeof(var) *__ptr = &(var); \
+ *__ptr = wrapping_add(typeof(var), *__ptr, offset); \
+ })
+
+/**
* check_sub_overflow() - Calculate subtraction with overflow checking
* @a: minuend; value to subtract from
* @b: subtrahend; value to subtract from @a
* @d: pointer to store difference
*
- * Returns 0 on success.
+ * Returns true on wrap-around, false otherwise.
*
- * *@d holds the results of the attempted subtraction, but is not considered
- * "safe for use" on a non-zero return value, which indicates that the
- * difference has underflowed or been truncated.
+ * *@d holds the results of the attempted subtraction, regardless of whether
+ * wrap-around occurred.
*/
#define check_sub_overflow(a, b, d) \
__must_check_overflow(__builtin_sub_overflow(a, b, d))
/**
+ * wrapping_sub() - Intentionally perform a wrapping subtraction
+ * @type: type for result of calculation
+ * @a: minuend; value to subtract from
+ * @b: subtrahend; value to subtract from @a
+ *
+ * Return the potentially wrapped-around subtraction without
+ * tripping any wrap-around sanitizers that may be enabled.
+ */
+#define wrapping_sub(type, a, b) \
+ ({ \
+ type __val; \
+ __builtin_sub_overflow(a, b, &__val); \
+ __val; \
+ })
+
+/**
+ * wrapping_assign_sub() - Intentionally perform a wrapping decrement assign
+ * @var: variable to be decremented
+ * @offset: amount to subtract
+ *
+ * Decrements @var by @offset with wrap-around. Returns the resulting
+ * value of @var. Will not trip any wrap-around sanitizers.
+ *
+ * Returns the new value of @var.
+ */
+#define wrapping_assign_sub(var, offset) \
+ ({ \
+ typeof(var) *__ptr = &(var); \
+ *__ptr = wrapping_sub(typeof(var), *__ptr, offset); \
+ })
+
+/**
* check_mul_overflow() - Calculate multiplication with overflow checking
* @a: first factor
* @b: second factor
* @d: pointer to store product
*
- * Returns 0 on success.
+ * Returns true on wrap-around, false otherwise.
*
- * *@d holds the results of the attempted multiplication, but is not
- * considered "safe for use" on a non-zero return value, which indicates
- * that the product has overflowed or been truncated.
+ * *@d holds the results of the attempted multiplication, regardless of whether
+ * wrap-around occurred.
*/
#define check_mul_overflow(a, b, d) \
__must_check_overflow(__builtin_mul_overflow(a, b, d))
/**
+ * wrapping_mul() - Intentionally perform a wrapping multiplication
+ * @type: type for result of calculation
+ * @a: first factor
+ * @b: second factor
+ *
+ * Return the potentially wrapped-around multiplication without
+ * tripping any wrap-around sanitizers that may be enabled.
+ */
+#define wrapping_mul(type, a, b) \
+ ({ \
+ type __val; \
+ __builtin_mul_overflow(a, b, &__val); \
+ __val; \
+ })
+
+/**
* check_shl_overflow() - Calculate a left-shifted value and check overflow
* @a: Value to be shifted
* @s: How many bits left to shift
@@ -122,7 +201,7 @@ static inline bool __must_check __must_check_overflow(bool overflow)
typeof(a) _a = a; \
typeof(s) _s = s; \
typeof(d) _d = d; \
- u64 _a_full = _a; \
+ unsigned long long _a_full = _a; \
unsigned int _to_shift = \
is_non_negative(_s) && _s < 8 * sizeof(*d) ? _s : 0; \
*_d = (_a_full << _to_shift); \
@@ -132,10 +211,10 @@ static inline bool __must_check __must_check_overflow(bool overflow)
#define __overflows_type_constexpr(x, T) ( \
is_unsigned_type(typeof(x)) ? \
- (x) > type_max(typeof(T)) : \
+ (x) > type_max(T) : \
is_unsigned_type(typeof(T)) ? \
- (x) < 0 || (x) > type_max(typeof(T)) : \
- (x) < type_min(typeof(T)) || (x) > type_max(typeof(T)))
+ (x) < 0 || (x) > type_max(T) : \
+ (x) < type_min(T) || (x) > type_max(T))
#define __overflows_type(x, T) ({ \
typeof(T) v = 0; \
@@ -312,27 +391,40 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend)
struct_size((type *)NULL, member, count)
/**
- * _DEFINE_FLEX() - helper macro for DEFINE_FLEX() family.
- * Enables caller macro to pass (different) initializer.
+ * __DEFINE_FLEX() - helper macro for DEFINE_FLEX() family.
+ * Enables caller macro to pass arbitrary trailing expressions
*
* @type: structure type name, including "struct" keyword.
* @name: Name for a variable to define.
* @member: Name of the array member.
* @count: Number of elements in the array; must be compile-time const.
- * @initializer: initializer expression (could be empty for no init).
+ * @trailer: Trailing expressions for attributes and/or initializers.
*/
-#define _DEFINE_FLEX(type, name, member, count, initializer) \
+#define __DEFINE_FLEX(type, name, member, count, trailer...) \
_Static_assert(__builtin_constant_p(count), \
"onstack flex array members require compile-time const count"); \
union { \
u8 bytes[struct_size_t(type, member, count)]; \
type obj; \
- } name##_u initializer; \
+ } name##_u trailer; \
type *name = (type *)&name##_u
/**
- * DEFINE_FLEX() - Define an on-stack instance of structure with a trailing
- * flexible array member.
+ * _DEFINE_FLEX() - helper macro for DEFINE_FLEX() family.
+ * Enables caller macro to pass (different) initializer.
+ *
+ * @type: structure type name, including "struct" keyword.
+ * @name: Name for a variable to define.
+ * @member: Name of the array member.
+ * @count: Number of elements in the array; must be compile-time const.
+ * @initializer: Initializer expression (e.g., pass `= { }` at minimum).
+ */
+#define _DEFINE_FLEX(type, name, member, count, initializer...) \
+ __DEFINE_FLEX(type, name, member, count, = { .obj initializer })
+
+/**
+ * DEFINE_RAW_FLEX() - Define an on-stack instance of structure with a trailing
+ * flexible array member, when it does not have a __counted_by annotation.
*
* @type: structure type name, including "struct" keyword.
* @name: Name for a variable to define.
@@ -342,8 +434,42 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend)
* Define a zeroed, on-stack, instance of @type structure with a trailing
* flexible array member.
* Use __struct_size(@name) to get compile-time size of it afterwards.
+ * Use __member_size(@name->member) to get compile-time size of @name members.
+ * Use STACK_FLEX_ARRAY_SIZE(@name, @member) to get compile-time number of
+ * elements in array @member.
+ */
+#define DEFINE_RAW_FLEX(type, name, member, count) \
+ __DEFINE_FLEX(type, name, member, count, = { })
+
+/**
+ * DEFINE_FLEX() - Define an on-stack instance of structure with a trailing
+ * flexible array member.
+ *
+ * @TYPE: structure type name, including "struct" keyword.
+ * @NAME: Name for a variable to define.
+ * @MEMBER: Name of the array member.
+ * @COUNTER: Name of the __counted_by member.
+ * @COUNT: Number of elements in the array; must be compile-time const.
+ *
+ * Define a zeroed, on-stack, instance of @TYPE structure with a trailing
+ * flexible array member.
+ * Use __struct_size(@NAME) to get compile-time size of it afterwards.
+ * Use __member_size(@NAME->member) to get compile-time size of @NAME members.
+ * Use STACK_FLEX_ARRAY_SIZE(@name, @member) to get compile-time number of
+ * elements in array @member.
+ */
+#define DEFINE_FLEX(TYPE, NAME, MEMBER, COUNTER, COUNT) \
+ _DEFINE_FLEX(TYPE, NAME, MEMBER, COUNT, = { .COUNTER = COUNT, })
+
+/**
+ * STACK_FLEX_ARRAY_SIZE() - helper macro for DEFINE_FLEX() family.
+ * Returns the number of elements in @array.
+ *
+ * @name: Name for a variable defined in DEFINE_RAW_FLEX()/DEFINE_FLEX().
+ * @array: Name of the array member.
*/
-#define DEFINE_FLEX(type, name, member, count) \
- _DEFINE_FLEX(type, name, member, count, = {})
+#define STACK_FLEX_ARRAY_SIZE(name, array) \
+ (__member_size((name)->array) / sizeof(*(name)->array) + \
+ __must_be_array((name)->array))
#endif /* _LINUXKPI_LINUX_OVERFLOW_H */
diff --git a/sys/compat/linuxkpi/common/include/linux/pci.h b/sys/compat/linuxkpi/common/include/linux/pci.h
index 3fd4191b9917..d891d0df3546 100644
--- a/sys/compat/linuxkpi/common/include/linux/pci.h
+++ b/sys/compat/linuxkpi/common/include/linux/pci.h
@@ -355,7 +355,6 @@ struct pci_dev {
TAILQ_HEAD(, pci_mmio_region) mmio;
};
-int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name);
int pci_alloc_irq_vectors(struct pci_dev *pdev, int minv, int maxv,
unsigned int flags);
bool pci_device_is_present(struct pci_dev *pdev);
@@ -365,10 +364,13 @@ void __iomem **linuxkpi_pcim_iomap_table(struct pci_dev *pdev);
void *linuxkpi_pci_iomap_range(struct pci_dev *, int,
unsigned long, unsigned long);
void *linuxkpi_pci_iomap(struct pci_dev *, int, unsigned long);
+void *linuxkpi_pcim_iomap(struct pci_dev *, int, unsigned long);
void linuxkpi_pci_iounmap(struct pci_dev *pdev, void *res);
int linuxkpi_pcim_iomap_regions(struct pci_dev *pdev, uint32_t mask,
const char *name);
+int linuxkpi_pci_request_region(struct pci_dev *, int, const char *);
int linuxkpi_pci_request_regions(struct pci_dev *pdev, const char *res_name);
+int linuxkpi_pcim_request_all_regions(struct pci_dev *, const char *);
void linuxkpi_pci_release_region(struct pci_dev *pdev, int bar);
void linuxkpi_pci_release_regions(struct pci_dev *pdev);
int linuxkpi_pci_enable_msix(struct pci_dev *pdev, struct msix_entry *entries,
@@ -561,12 +563,16 @@ done:
return (pdev->bus->self);
}
+#define pci_request_region(pdev, bar, res_name) \
+ linuxkpi_pci_request_region(pdev, bar, res_name)
#define pci_release_region(pdev, bar) \
linuxkpi_pci_release_region(pdev, bar)
-#define pci_release_regions(pdev) \
- linuxkpi_pci_release_regions(pdev)
#define pci_request_regions(pdev, res_name) \
linuxkpi_pci_request_regions(pdev, res_name)
+#define pci_release_regions(pdev) \
+ linuxkpi_pci_release_regions(pdev)
+#define pcim_request_all_regions(pdev, name) \
+ linuxkpi_pcim_request_all_regions(pdev, name)
static inline void
lkpi_pci_disable_msix(struct pci_dev *pdev)
@@ -803,6 +809,8 @@ static inline void pci_disable_sriov(struct pci_dev *dev)
linuxkpi_pci_iomap_range(pdev, mmio_bar, mmio_off, mmio_size)
#define pci_iomap(pdev, mmio_bar, mmio_size) \
linuxkpi_pci_iomap(pdev, mmio_bar, mmio_size)
+#define pcim_iomap(pdev, bar, maxlen) \
+ linuxkpi_pcim_iomap(pdev, bar, maxlen)
#define pci_iounmap(pdev, res) \
linuxkpi_pci_iounmap(pdev, res)
@@ -1445,6 +1453,9 @@ linuxkpi_pci_get_device(uint32_t vendor, uint32_t device, struct pci_dev *odev)
return (lkpi_pci_get_device(vendor, device, odev));
}
+#define for_each_pci_dev(_pdev) \
+ while ((_pdev = linuxkpi_pci_get_device(PCI_ANY_ID, PCI_ANY_ID, _pdev)) != NULL)
+
/* This is a FreeBSD extension so we can use bus_*(). */
static inline void
linuxkpi_pcim_want_to_use_bus_functions(struct pci_dev *pdev)
diff --git a/sys/compat/linuxkpi/common/include/linux/rcupdate.h b/sys/compat/linuxkpi/common/include/linux/rcupdate.h
index 85d766c8dbc9..4aceb7296cd6 100644
--- a/sys/compat/linuxkpi/common/include/linux/rcupdate.h
+++ b/sys/compat/linuxkpi/common/include/linux/rcupdate.h
@@ -1,7 +1,7 @@
/*-
* Copyright (c) 2016-2017 Mellanox Technologies, Ltd.
* All rights reserved.
- * Copyright (c) 2024 The FreeBSD Foundation
+ * Copyright (c) 2024-2025 The FreeBSD Foundation
*
* Portions of this software were developed by Björn Zeeb
* under sponsorship from the FreeBSD Foundation.
@@ -35,6 +35,7 @@
#include <linux/compiler.h>
#include <linux/types.h>
#include <linux/kernel.h>
+#include <linux/cleanup.h>
#include <machine/atomic.h>
@@ -162,4 +163,6 @@ void linux_synchronize_rcu(unsigned type);
#define init_rcu_head_on_stack(...)
#define destroy_rcu_head_on_stack(...)
+DEFINE_LOCK_GUARD_0(rcu, rcu_read_lock(), rcu_read_unlock())
+
#endif /* _LINUXKPI_LINUX_RCUPDATE_H_ */
diff --git a/sys/compat/linuxkpi/common/include/linux/slab.h b/sys/compat/linuxkpi/common/include/linux/slab.h
index 47e3d133eb6c..0e649e1e3c4a 100644
--- a/sys/compat/linuxkpi/common/include/linux/slab.h
+++ b/sys/compat/linuxkpi/common/include/linux/slab.h
@@ -40,8 +40,10 @@
#include <linux/compat.h>
#include <linux/types.h>
#include <linux/gfp.h>
+#include <linux/err.h>
#include <linux/llist.h>
#include <linux/overflow.h>
+#include <linux/cleanup.h>
MALLOC_DECLARE(M_KMALLOC);
@@ -153,6 +155,8 @@ kfree(const void *ptr)
lkpi_kfree(ptr);
}
+DEFINE_FREE(kfree, void *, if (!IS_ERR_OR_NULL(_T)) kfree(_T))
+
/*
* Other k*alloc() funtions using the above as underlying allocator.
*/
diff --git a/sys/compat/linuxkpi/common/include/linux/timer.h b/sys/compat/linuxkpi/common/include/linux/timer.h
index a635f0faea59..d48939e28a02 100644
--- a/sys/compat/linuxkpi/common/include/linux/timer.h
+++ b/sys/compat/linuxkpi/common/include/linux/timer.h
@@ -49,8 +49,13 @@ extern unsigned long linux_timer_hz_mask;
#define TIMER_IRQSAFE 0x0001
+#if defined(LINUXKPI_VERSION) && (LINUXKPI_VERSION < 61600)
#define from_timer(var, arg, field) \
container_of(arg, typeof(*(var)), field)
+#else
+#define timer_container_of(var, arg, field) \
+ container_of(arg, typeof(*(var)), field)
+#endif
#define timer_setup(timer, func, flags) do { \
CTASSERT(((flags) & ~TIMER_IRQSAFE) == 0); \
@@ -79,11 +84,23 @@ extern unsigned long linux_timer_hz_mask;
extern int mod_timer(struct timer_list *, unsigned long);
extern void add_timer(struct timer_list *);
extern void add_timer_on(struct timer_list *, int cpu);
-extern int del_timer(struct timer_list *);
-extern int del_timer_sync(struct timer_list *);
+
+extern int timer_delete(struct timer_list *);
extern int timer_delete_sync(struct timer_list *);
extern int timer_shutdown_sync(struct timer_list *);
+static inline int
+del_timer(struct timer_list *tl)
+{
+ return (timer_delete(tl));
+}
+
+static inline int
+del_timer_sync(struct timer_list *tl)
+{
+ return (timer_delete_sync(tl));
+}
+
#define timer_pending(timer) callout_pending(&(timer)->callout)
#define round_jiffies(j) \
((unsigned long)(((j) + linux_timer_hz_mask) & ~linux_timer_hz_mask))
diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c
index f0881773726f..d00734001a59 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -7814,7 +7814,7 @@ lkpi_wiphy_delayed_work_timer(struct timer_list *tl)
{
struct wiphy_delayed_work *wdwk;
- wdwk = from_timer(wdwk, tl, timer);
+ wdwk = timer_container_of(wdwk, tl, timer);
wiphy_work_queue(wdwk->wiphy, &wdwk->work);
}
diff --git a/sys/compat/linuxkpi/common/src/linux_compat.c b/sys/compat/linuxkpi/common/src/linux_compat.c
index dcdec0dfcc78..458744a9fec6 100644
--- a/sys/compat/linuxkpi/common/src/linux_compat.c
+++ b/sys/compat/linuxkpi/common/src/linux_compat.c
@@ -2120,7 +2120,7 @@ add_timer_on(struct timer_list *timer, int cpu)
}
int
-del_timer(struct timer_list *timer)
+timer_delete(struct timer_list *timer)
{
if (callout_stop(&(timer)->callout) == -1)
@@ -2129,7 +2129,7 @@ del_timer(struct timer_list *timer)
}
int
-del_timer_sync(struct timer_list *timer)
+timer_delete_sync(struct timer_list *timer)
{
if (callout_drain(&(timer)->callout) == -1)
@@ -2138,13 +2138,6 @@ del_timer_sync(struct timer_list *timer)
}
int
-timer_delete_sync(struct timer_list *timer)
-{
-
- return (del_timer_sync(timer));
-}
-
-int
timer_shutdown_sync(struct timer_list *timer)
{
diff --git a/sys/compat/linuxkpi/common/src/linux_devres.c b/sys/compat/linuxkpi/common/src/linux_devres.c
index 84f03ba0dd7d..23c91cb5ab2f 100644
--- a/sys/compat/linuxkpi/common/src/linux_devres.c
+++ b/sys/compat/linuxkpi/common/src/linux_devres.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2020-2025 The FreeBSD Foundation
*
* This software was developed by Bj\xc3\xb6rn Zeeb under sponsorship from
* the FreeBSD Foundation.
@@ -223,6 +223,30 @@ lkpi_devm_kmalloc_release(struct device *dev __unused, void *p __unused)
/* Nothing to do. Freed with the devres. */
}
+static int
+lkpi_devm_kmalloc_match(struct device *dev __unused, void *p, void *mp)
+{
+ return (p == mp);
+}
+
+void
+lkpi_devm_kfree(struct device *dev, const void *p)
+{
+ void *mp;
+ int error;
+
+ if (p == NULL)
+ return;
+
+ /* I assume Linux simply casts the const away... */
+ mp = __DECONST(void *, p);
+ error = lkpi_devres_destroy(dev, lkpi_devm_kmalloc_release,
+ lkpi_devm_kmalloc_match, mp);
+ if (error != 0)
+ dev_warn(dev, "%s: lkpi_devres_destroy failed with %d\n",
+ __func__, error);
+}
+
struct devres_action {
void *data;
void (*action)(void *);
diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c
index d5bbbea1eb2c..43fd6ad28ac4 100644
--- a/sys/compat/linuxkpi/common/src/linux_pci.c
+++ b/sys/compat/linuxkpi/common/src/linux_pci.c
@@ -111,6 +111,9 @@ static device_method_t pci_methods[] = {
DEVMETHOD(pci_iov_uninit, linux_pci_iov_uninit),
DEVMETHOD(pci_iov_add_vf, linux_pci_iov_add_vf),
+ /* Bus interface. */
+ DEVMETHOD(bus_add_child, bus_generic_add_child),
+
/* backlight interface */
DEVMETHOD(backlight_update_status, linux_backlight_update_status),
DEVMETHOD(backlight_get_status, linux_backlight_get_status),
@@ -145,6 +148,23 @@ struct linux_dma_priv {
#define DMA_PRIV_LOCK(priv) mtx_lock(&(priv)->lock)
#define DMA_PRIV_UNLOCK(priv) mtx_unlock(&(priv)->lock)
+static void
+lkpi_set_pcim_iomap_devres(struct pcim_iomap_devres *dr, int bar,
+ void *res)
+{
+ dr->mmio_table[bar] = (void *)rman_get_bushandle(res);
+ dr->res_table[bar] = res;
+}
+
+static bool
+lkpi_pci_bar_id_valid(int bar)
+{
+ if (bar < 0 || bar > PCIR_MAX_BAR_0)
+ return (false);
+
+ return (true);
+}
+
static int
linux_pdev_dma_uninit(struct pci_dev *pdev)
{
@@ -289,12 +309,18 @@ lkpi_pci_get_device(uint32_t vendor, uint32_t device, struct pci_dev *odev)
{
struct pci_dev *pdev, *found;
- KASSERT(odev == NULL, ("%s: odev argument not yet supported\n", __func__));
-
found = NULL;
spin_lock(&pci_lock);
list_for_each_entry(pdev, &pci_devices, links) {
- if (pdev->vendor == vendor && pdev->device == device) {
+ /* Walk until we find odev. */
+ if (odev != NULL) {
+ if (pdev == odev)
+ odev = NULL;
+ continue;
+ }
+
+ if ((pdev->vendor == vendor || vendor == PCI_ANY_ID) &&
+ (pdev->device == device || device == PCI_ANY_ID)) {
found = pdev;
break;
}
@@ -757,6 +783,9 @@ _lkpi_pci_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen __unused)
struct pci_mmio_region *mmio, *p;
int type;
+ if (!lkpi_pci_bar_id_valid(bar))
+ return (NULL);
+
type = pci_resource_type(pdev, bar);
if (type < 0) {
device_printf(pdev->dev.bsddev, "%s: bar %d type %d\n",
@@ -797,6 +826,9 @@ linuxkpi_pci_iomap_range(struct pci_dev *pdev, int bar,
{
struct resource *res;
+ if (!lkpi_pci_bar_id_valid(bar))
+ return (NULL);
+
res = _lkpi_pci_iomap(pdev, bar, maxlen);
if (res == NULL)
return (NULL);
@@ -810,9 +842,41 @@ linuxkpi_pci_iomap_range(struct pci_dev *pdev, int bar,
void *
linuxkpi_pci_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen)
{
+ if (!lkpi_pci_bar_id_valid(bar))
+ return (NULL);
+
return (linuxkpi_pci_iomap_range(pdev, bar, 0, maxlen));
}
+void *
+linuxkpi_pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen)
+{
+ struct pcim_iomap_devres *dr;
+ void *res;
+
+ if (!lkpi_pci_bar_id_valid(bar))
+ return (NULL);
+
+ dr = lkpi_pcim_iomap_devres_find(pdev);
+ if (dr == NULL)
+ return (NULL);
+
+ if (dr->res_table[bar] != NULL)
+ return (dr->res_table[bar]);
+
+ res = linuxkpi_pci_iomap(pdev, bar, maxlen);
+ if (res == NULL) {
+ /*
+ * Do not free the devres in case there were
+ * other valid mappings before already.
+ */
+ return (NULL);
+ }
+ lkpi_set_pcim_iomap_devres(dr, bar, res);
+
+ return (res);
+}
+
void
linuxkpi_pci_iounmap(struct pci_dev *pdev, void *res)
{
@@ -864,8 +928,7 @@ linuxkpi_pcim_iomap_regions(struct pci_dev *pdev, uint32_t mask, const char *nam
res = _lkpi_pci_iomap(pdev, bar, 0);
if (res == NULL)
goto err;
- dr->mmio_table[bar] = (void *)rman_get_bushandle(res);
- dr->res_table[bar] = res;
+ lkpi_set_pcim_iomap_devres(dr, bar, res);
mappings |= (1 << bar);
}
@@ -1099,8 +1162,9 @@ pci_resource_len(struct pci_dev *pdev, int bar)
return (rle->count);
}
-int
-pci_request_region(struct pci_dev *pdev, int bar, const char *res_name)
+static int
+lkpi_pci_request_region(struct pci_dev *pdev, int bar, const char *res_name,
+ bool managed)
{
struct resource *res;
struct pci_devres *dr;
@@ -1108,9 +1172,20 @@ pci_request_region(struct pci_dev *pdev, int bar, const char *res_name)
int rid;
int type;
+ if (!lkpi_pci_bar_id_valid(bar))
+ return (-EINVAL);
+
+ /*
+ * If the bar is not valid, return success without adding the BAR;
+ * otherwise linuxkpi_pcim_request_all_regions() will error.
+ */
+ if (pci_resource_len(pdev, bar) == 0)
+ return (0);
+ /* Likewise if it is neither IO nor MEM, nothing to do for us. */
type = pci_resource_type(pdev, bar);
if (type < 0)
- return (-ENODEV);
+ return (0);
+
rid = PCIR_BAR(bar);
res = bus_alloc_resource_any(pdev->dev.bsddev, type, &rid,
RF_ACTIVE|RF_SHAREABLE);
@@ -1123,11 +1198,16 @@ pci_request_region(struct pci_dev *pdev, int bar, const char *res_name)
/*
* It seems there is an implicit devres tracking on these if the device
- * is managed; otherwise the resources are not automatiaclly freed on
- * FreeBSD/LinuxKPI tough they should be/are expected to be by Linux
- * drivers.
+ * is managed (lkpi_pci_devres_find() case); otherwise the resources are
+ * not automatically freed on FreeBSD/LinuxKPI though they should be/are
+ * expected to be by Linux drivers.
+ * Otherwise if we are called from a pcim-function with the managed
+ * argument set, we need to track devres independent of pdev->managed.
*/
- dr = lkpi_pci_devres_find(pdev);
+ if (managed)
+ dr = lkpi_pci_devres_get_alloc(pdev);
+ else
+ dr = lkpi_pci_devres_find(pdev);
if (dr != NULL) {
dr->region_mask |= (1 << bar);
dr->region_table[bar] = res;
@@ -1144,6 +1224,12 @@ pci_request_region(struct pci_dev *pdev, int bar, const char *res_name)
}
int
+linuxkpi_pci_request_region(struct pci_dev *pdev, int bar, const char *res_name)
+{
+ return (lkpi_pci_request_region(pdev, bar, res_name, false));
+}
+
+int
linuxkpi_pci_request_regions(struct pci_dev *pdev, const char *res_name)
{
int error;
@@ -1159,6 +1245,24 @@ linuxkpi_pci_request_regions(struct pci_dev *pdev, const char *res_name)
return (0);
}
+int
+linuxkpi_pcim_request_all_regions(struct pci_dev *pdev, const char *res_name)
+{
+ int bar, error;
+
+ for (bar = 0; bar <= PCIR_MAX_BAR_0; bar++) {
+ error = lkpi_pci_request_region(pdev, bar, res_name, true);
+ if (error != 0) {
+ device_printf(pdev->dev.bsddev, "%s: bar %d res_name '%s': "
+ "lkpi_pci_request_region returned %d\n", __func__,
+ bar, res_name, error);
+ pci_release_regions(pdev);
+ return (error);
+ }
+ }
+ return (0);
+}
+
void
linuxkpi_pci_release_region(struct pci_dev *pdev, int bar)
{
diff --git a/sys/compat/linuxkpi/dummy/include/kunit/skbuff.h b/sys/compat/linuxkpi/dummy/include/kunit/skbuff.h
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/sys/compat/linuxkpi/dummy/include/kunit/skbuff.h
diff --git a/sys/compat/linuxkpi/dummy/include/kunit/test-bug.h b/sys/compat/linuxkpi/dummy/include/kunit/test-bug.h
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/sys/compat/linuxkpi/dummy/include/kunit/test-bug.h
diff --git a/sys/compat/linuxkpi/dummy/include/kunit/test.h b/sys/compat/linuxkpi/dummy/include/kunit/test.h
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/sys/compat/linuxkpi/dummy/include/kunit/test.h
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index 92e98aa57ebf..c7a8862fb906 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -888,13 +888,13 @@ options IEEE80211_DEBUG_REFCNT
options IEEE80211_SUPPORT_MESH #enable 802.11s D3.0 support
options IEEE80211_SUPPORT_TDMA #enable TDMA support
-# The `wlan_wep', `wlan_tkip', and `wlan_ccmp' devices provide
-# support for WEP, TKIP, AES-CCMP and AES-GCMP crypto protocols optionally
-# used with 802.11 devices that depend on the `wlan' module.
+# The `wlan_wep', `wlan_tkip', `wlan_ccmp', and `wlan_gcmp' devices provide
+# support for WEP, TKIP, AES-CCMP and AES-GCMP crypto protocols optionally used
+# with 802.11 devices that depend on the `wlan' module.
device wlan_wep
+device wlan_tkip
device wlan_ccmp
device wlan_gcmp
-device wlan_tkip
# The `wlan_xauth' device provides support for external (i.e. user-mode)
# authenticators for use with 802.11 drivers that use the `wlan'
@@ -1249,7 +1249,7 @@ options MAC
options MAC_BIBA
options MAC_BSDEXTENDED
options MAC_DDB
-options MAC_DO
+options MAC_DO
options MAC_IFOFF
options MAC_IPACL
options MAC_LOMAC
diff --git a/sys/conf/files b/sys/conf/files
index d89813c70355..9661bafea8f9 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -3808,6 +3808,7 @@ kern/kern_hhook.c standard
kern/kern_idle.c standard
kern/kern_intr.c standard
kern/kern_jail.c standard
+kern/kern_jaildesc.c standard
kern/kern_jailmeta.c standard
kern/kern_kcov.c optional kcov \
compile-with "${NOSAN_C} ${MSAN_CFLAGS}"
diff --git a/sys/conf/kern.pre.mk b/sys/conf/kern.pre.mk
index 1fcfd6467e7f..0251486247da 100644
--- a/sys/conf/kern.pre.mk
+++ b/sys/conf/kern.pre.mk
@@ -8,7 +8,11 @@
# the rest of /usr/src, but they still always process SRCCONF even though
# the normal mechanisms to prevent that (compiling out of tree) won't
# work. To ensure they do work, we have to duplicate thee few lines here.
+.if exists(${SRCTOP}/src.conf)
+SRCCONF?= ${SRCTOP}/src.conf
+.else
SRCCONF?= /etc/src.conf
+.endif
.if (exists(${SRCCONF}) || ${SRCCONF} != "/etc/src.conf") && !target(_srcconf_included_)
.include "${SRCCONF}"
_srcconf_included_:
diff --git a/sys/conf/newvers.sh b/sys/conf/newvers.sh
index 8b60da95741e..145377c1e75e 100644
--- a/sys/conf/newvers.sh
+++ b/sys/conf/newvers.sh
@@ -50,8 +50,8 @@
#
TYPE="FreeBSD"
-REVISION="15.0"
-BRANCH="PRERELEASE"
+REVISION="16.0"
+BRANCH="CURRENT"
if [ -n "${BRANCH_OVERRIDE}" ]; then
BRANCH=${BRANCH_OVERRIDE}
fi
diff --git a/sys/contrib/libnv/nvlist.c b/sys/contrib/libnv/nvlist.c
index 41edc72322c3..73226ee51a78 100644
--- a/sys/contrib/libnv/nvlist.c
+++ b/sys/contrib/libnv/nvlist.c
@@ -478,7 +478,7 @@ nvlist_dump_error_check(const nvlist_t *nvl, int fd, int level)
void
nvlist_dump(const nvlist_t *nvl, int fd)
{
- const nvlist_t *tmpnvl;
+ const nvlist_t *tmpnvl, *top;
nvpair_t *nvp, *tmpnvp;
void *cookie;
int level;
@@ -487,6 +487,7 @@ nvlist_dump(const nvlist_t *nvl, int fd)
if (nvlist_dump_error_check(nvl, fd, level))
return;
+ top = nvl;
nvp = nvlist_first_nvpair(nvl);
while (nvp != NULL) {
dprintf(fd, "%*s%s (%s):", level * 4, "", nvpair_name(nvp),
@@ -645,6 +646,8 @@ nvlist_dump(const nvlist_t *nvl, int fd)
while ((nvp = nvlist_next_nvpair(nvl, nvp)) == NULL) {
do {
+ if (nvl == top)
+ return;
cookie = NULL;
if (nvlist_in_array(nvl))
dprintf(fd, "%*s,\n", level * 4, "");
@@ -847,7 +850,7 @@ nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
{
unsigned char *buf, *ptr;
size_t left, size;
- const nvlist_t *tmpnvl;
+ const nvlist_t *tmpnvl, *top;
nvpair_t *nvp, *tmpnvp;
void *cookie;
@@ -868,6 +871,7 @@ nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
ptr = nvlist_pack_header(nvl, ptr, &left);
+ top = nvl;
nvp = nvlist_first_nvpair(nvl);
while (nvp != NULL) {
NVPAIR_ASSERT(nvp);
@@ -958,6 +962,8 @@ nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
goto fail;
while ((nvp = nvlist_next_nvpair(nvl, nvp)) == NULL) {
do {
+ if (nvl == top)
+ goto out;
cookie = NULL;
if (nvlist_in_array(nvl)) {
ptr = nvpair_pack_nvlist_array_next(ptr,
diff --git a/sys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py b/sys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py
index b49255e8381d..08021aabcb61 100755
--- a/sys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py
+++ b/sys/contrib/openzfs/.github/workflows/scripts/generate-ci-type.py
@@ -65,7 +65,7 @@ if __name__ == '__main__':
# check last (HEAD) commit message
last_commit_message_raw = subprocess.run([
- 'git', 'show', '-s', '--format=%B', 'HEAD'
+ 'git', 'show', '-s', '--format=%B', head
], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in last_commit_message_raw.stdout.decode().splitlines():
diff --git a/sys/contrib/openzfs/.github/workflows/zfs-qemu.yml b/sys/contrib/openzfs/.github/workflows/zfs-qemu.yml
index 4ebb80af1f03..a5dbfc099c90 100644
--- a/sys/contrib/openzfs/.github/workflows/zfs-qemu.yml
+++ b/sys/contrib/openzfs/.github/workflows/zfs-qemu.yml
@@ -44,7 +44,7 @@ jobs:
os_selection="$FULL_OS"
fi
- if [ ${{ github.event.inputs.fedora_kernel_ver }} != "" ] ; then
+ if ${{ github.event.inputs.fedora_kernel_ver != '' }}; then
# They specified a custom kernel version for Fedora. Use only
# Fedora runners.
os_json=$(echo ${os_selection} | jq -c '[.[] | select(startswith("fedora"))]')
@@ -53,9 +53,8 @@ jobs:
os_json=$(echo ${os_selection} | jq -c)
fi
- echo $os_json
- echo "os=$os_json" >> $GITHUB_OUTPUT
- echo "ci_type=$ci_type" >> $GITHUB_OUTPUT
+ echo "os=$os_json" | tee -a $GITHUB_OUTPUT
+ echo "ci_type=$ci_type" | tee -a $GITHUB_OUTPUT
qemu-vm:
name: qemu-x86
@@ -78,7 +77,7 @@ jobs:
ref: ${{ github.event.pull_request.head.sha }}
- name: Setup QEMU
- timeout-minutes: 10
+ timeout-minutes: 15
run: .github/workflows/scripts/qemu-1-setup.sh
- name: Start build machine
diff --git a/sys/contrib/openzfs/META b/sys/contrib/openzfs/META
index 42f65290e4e3..5704b5c6de8a 100644
--- a/sys/contrib/openzfs/META
+++ b/sys/contrib/openzfs/META
@@ -1,8 +1,8 @@
Meta: 1
Name: zfs
Branch: 1.0
-Version: 2.4.0
-Release: rc1
+Version: 2.4.99
+Release: 1
Release-Tags: relext
License: CDDL
Author: OpenZFS
diff --git a/sys/contrib/openzfs/Makefile.am b/sys/contrib/openzfs/Makefile.am
index 5f09d170e730..30f78e490b78 100644
--- a/sys/contrib/openzfs/Makefile.am
+++ b/sys/contrib/openzfs/Makefile.am
@@ -1,6 +1,7 @@
CLEANFILES =
dist_noinst_DATA =
INSTALL_DATA_HOOKS =
+INSTALL_EXEC_HOOKS =
ALL_LOCAL =
CLEAN_LOCAL =
CHECKS = shellcheck checkbashisms
@@ -71,6 +72,9 @@ all: gitrev
PHONY += install-data-hook $(INSTALL_DATA_HOOKS)
install-data-hook: $(INSTALL_DATA_HOOKS)
+PHONY += install-exec-hook $(INSTALL_EXEC_HOOKS)
+install-exec-hook: $(INSTALL_EXEC_HOOKS)
+
PHONY += maintainer-clean-local
maintainer-clean-local:
-$(RM) $(GITREV)
diff --git a/sys/contrib/openzfs/cmd/Makefile.am b/sys/contrib/openzfs/cmd/Makefile.am
index 96040976e53e..e79bfae2b10f 100644
--- a/sys/contrib/openzfs/cmd/Makefile.am
+++ b/sys/contrib/openzfs/cmd/Makefile.am
@@ -107,8 +107,12 @@ $(call SUBST,dbufstat,%D%/)
$(call SUBST,zilstat,%D%/)
arc_summary: %D%/arc_summary
$(AM_V_at)cp $< $@
-endif
+cmd-rename-install-exec-hook:
+ $(LN_S) -f arcstat $(DESTDIR)$(bindir)/zarcstat
+ $(LN_S) -f arc_summary $(DESTDIR)$(bindir)/zarcsummary
+INSTALL_EXEC_HOOKS += cmd-rename-install-exec-hook
+endif
PHONY += cmd
cmd: $(bin_SCRIPTS) $(bin_PROGRAMS) $(sbin_SCRIPTS) $(sbin_PROGRAMS) $(dist_bin_SCRIPTS) $(zfsexec_PROGRAMS) $(mounthelper_PROGRAMS)
diff --git a/sys/contrib/openzfs/cmd/arc_summary b/sys/contrib/openzfs/cmd/arc_summary
index e60c6b64e8a1..9538dd599cb7 100755
--- a/sys/contrib/openzfs/cmd/arc_summary
+++ b/sys/contrib/openzfs/cmd/arc_summary
@@ -1021,6 +1021,13 @@ def main():
treated separately because they come with their own call.
"""
+ # notify user for upcoming renaming in 2.4.0
+ abs_path = os.path.abspath(sys.argv[0].strip())
+ script_name = os.path.basename(abs_path)
+ if script_name != "zarcsummary":
+ sys.stderr.write("Note: this script will be renamed to zarcsummary in ")
+ sys.stderr.write("zfs 2.4.0. Please migrate ASAP.\n")
+
kstats = get_kstats()
if ARGS.graph:
diff --git a/sys/contrib/openzfs/cmd/arcstat.in b/sys/contrib/openzfs/cmd/arcstat.in
index 6f9abb39c3fb..e153eddb36cf 100755
--- a/sys/contrib/openzfs/cmd/arcstat.in
+++ b/sys/contrib/openzfs/cmd/arcstat.in
@@ -56,6 +56,7 @@ import time
import getopt
import re
import copy
+import os
from signal import signal, SIGINT, SIGWINCH, SIG_DFL
@@ -766,6 +767,14 @@ def calculate():
def main():
+
+ # notify user for upcoming renaming in 2.4.0
+ abs_path = os.path.abspath(sys.argv[0].strip())
+ script_name = os.path.basename(abs_path)
+ if script_name != "zarcstat":
+ sys.stderr.write("Note: this script will be renamed to zarcstat in ")
+ sys.stderr.write("zfs 2.4.0. Please migrate ASAP.\n")
+
global sint
global count
global hdr_intr
diff --git a/sys/contrib/openzfs/cmd/zdb/zdb.c b/sys/contrib/openzfs/cmd/zdb/zdb.c
index adaa5cd10961..134c258a1e32 100644
--- a/sys/contrib/openzfs/cmd/zdb/zdb.c
+++ b/sys/contrib/openzfs/cmd/zdb/zdb.c
@@ -2635,7 +2635,7 @@ print_indirect(spa_t *spa, blkptr_t *bp, const zbookmark_phys_t *zb,
if (BP_GET_LEVEL(bp) != zb->zb_level) {
(void) printf(" (ERROR: Block pointer level "
"(%llu) does not match bookmark level (%lld))",
- BP_GET_LEVEL(bp), (u_longlong_t)zb->zb_level);
+ BP_GET_LEVEL(bp), (longlong_t)zb->zb_level);
corruption_found = B_TRUE;
}
}
diff --git a/sys/contrib/openzfs/cmd/zhack.c b/sys/contrib/openzfs/cmd/zhack.c
index 2bd3051dce7b..536532a6762d 100644
--- a/sys/contrib/openzfs/cmd/zhack.c
+++ b/sys/contrib/openzfs/cmd/zhack.c
@@ -363,10 +363,12 @@ feature_incr_sync(void *arg, dmu_tx_t *tx)
zfeature_info_t *feature = arg;
uint64_t refcount;
+ mutex_enter(&spa->spa_feat_stats_lock);
VERIFY0(feature_get_refcount_from_disk(spa, feature, &refcount));
feature_sync(spa, feature, refcount + 1, tx);
spa_history_log_internal(spa, "zhack feature incr", tx,
"name=%s", feature->fi_guid);
+ mutex_exit(&spa->spa_feat_stats_lock);
}
static void
@@ -376,10 +378,12 @@ feature_decr_sync(void *arg, dmu_tx_t *tx)
zfeature_info_t *feature = arg;
uint64_t refcount;
+ mutex_enter(&spa->spa_feat_stats_lock);
VERIFY0(feature_get_refcount_from_disk(spa, feature, &refcount));
feature_sync(spa, feature, refcount - 1, tx);
spa_history_log_internal(spa, "zhack feature decr", tx,
"name=%s", feature->fi_guid);
+ mutex_exit(&spa->spa_feat_stats_lock);
}
static void
diff --git a/sys/contrib/openzfs/cmd/zpool/Makefile.am b/sys/contrib/openzfs/cmd/zpool/Makefile.am
index 2f962408e5a3..5bb6d8160b18 100644
--- a/sys/contrib/openzfs/cmd/zpool/Makefile.am
+++ b/sys/contrib/openzfs/cmd/zpool/Makefile.am
@@ -148,6 +148,7 @@ dist_zpoolcompat_DATA = \
%D%/compatibility.d/openzfs-2.1-linux \
%D%/compatibility.d/openzfs-2.2 \
%D%/compatibility.d/openzfs-2.3 \
+ %D%/compatibility.d/openzfs-2.4 \
%D%/compatibility.d/openzfsonosx-1.7.0 \
%D%/compatibility.d/openzfsonosx-1.8.1 \
%D%/compatibility.d/openzfsonosx-1.9.3 \
@@ -187,7 +188,9 @@ zpoolcompatlinks = \
"openzfs-2.2 openzfs-2.2-linux" \
"openzfs-2.2 openzfs-2.2-freebsd" \
"openzfs-2.3 openzfs-2.3-linux" \
- "openzfs-2.3 openzfs-2.3-freebsd"
+ "openzfs-2.3 openzfs-2.3-freebsd" \
+ "openzfs-2.4 openzfs-2.4-linux" \
+ "openzfs-2.4 openzfs-2.4-freebsd"
zpoolconfdir = $(sysconfdir)/zfs/zpool.d
INSTALL_DATA_HOOKS += zpool-install-data-hook
diff --git a/sys/contrib/openzfs/cmd/zpool/compatibility.d/openzfs-2.4 b/sys/contrib/openzfs/cmd/zpool/compatibility.d/openzfs-2.4
new file mode 100644
index 000000000000..3fbd91014c95
--- /dev/null
+++ b/sys/contrib/openzfs/cmd/zpool/compatibility.d/openzfs-2.4
@@ -0,0 +1,48 @@
+# Features supported by OpenZFS 2.4 on Linux and FreeBSD
+allocation_classes
+async_destroy
+blake3
+block_cloning
+block_cloning_endian
+bookmark_v2
+bookmark_written
+bookmarks
+device_rebuild
+device_removal
+draid
+dynamic_gang_header
+edonr
+embedded_data
+empty_bpobj
+enabled_txg
+encryption
+extensible_dataset
+fast_dedup
+filesystem_limits
+head_errlog
+hole_birth
+large_blocks
+large_dnode
+large_microzap
+livelist
+log_spacemap
+longname
+lz4_compress
+multi_vdev_crash_dump
+obsolete_counts
+physical_rewrite
+project_quota
+raidz_expansion
+redacted_datasets
+redaction_bookmarks
+redaction_list_spill
+resilver_defer
+sha512
+skein
+spacemap_histogram
+spacemap_v2
+userobj_accounting
+vdev_zaps_v2
+zilsaxattr
+zpool_checkpoint
+zstd_compress
diff --git a/sys/contrib/openzfs/cmd/zstream/Makefile.am b/sys/contrib/openzfs/cmd/zstream/Makefile.am
index be3539fe905d..80ef1ea7ca11 100644
--- a/sys/contrib/openzfs/cmd/zstream/Makefile.am
+++ b/sys/contrib/openzfs/cmd/zstream/Makefile.am
@@ -18,6 +18,7 @@ zstream_LDADD = \
libzpool.la \
libnvpair.la
-PHONY += install-exec-hook
-install-exec-hook:
+cmd-zstream-install-exec-hook:
cd $(DESTDIR)$(sbindir) && $(LN_S) -f zstream zstreamdump
+
+INSTALL_EXEC_HOOKS += cmd-zstream-install-exec-hook
diff --git a/sys/contrib/openzfs/config/always-arch.m4 b/sys/contrib/openzfs/config/always-arch.m4
index 9f413eeddf95..1ee6099ca8b2 100644
--- a/sys/contrib/openzfs/config/always-arch.m4
+++ b/sys/contrib/openzfs/config/always-arch.m4
@@ -39,3 +39,20 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_ARCH], [
AM_CONDITIONAL([TARGET_CPU_SPARC64], test $TARGET_CPU = sparc64)
AM_CONDITIONAL([TARGET_CPU_ARM], test $TARGET_CPU = arm)
])
+dnl #
+dnl # Check for conflicting environment variables
+dnl #
+dnl # If ARCH env variable is set up, then kernel Makefile in the /usr/src/kernel
+dnl # can misbehave during the zfs ./configure test of the module compilation.
+AC_DEFUN([ZFS_AC_CONFIG_CHECK_ARCH_VAR], [
+ AC_MSG_CHECKING([for conflicting environment variables])
+ if test -n "$ARCH"; then
+ AC_MSG_RESULT([warning])
+ AC_MSG_WARN(m4_normalize([ARCH environment variable is set to "$ARCH".
+ This can cause build kernel modules support check failure.
+ Please unset it.]))
+ else
+ AC_MSG_RESULT([done])
+ fi
+])
+
diff --git a/sys/contrib/openzfs/config/always-compiler-options.m4 b/sys/contrib/openzfs/config/always-compiler-options.m4
index 6383b12506ee..37fa079e0f4c 100644
--- a/sys/contrib/openzfs/config/always-compiler-options.m4
+++ b/sys/contrib/openzfs/config/always-compiler-options.m4
@@ -156,6 +156,34 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH], [
])
dnl #
+dnl # Check if kernel cc supports -Wno-format-zero-length option.
+dnl #
+AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_FORMAT_ZERO_LENGTH], [
+ saved_cc="$CC"
+ AS_IF(
+ [ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
+ [ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
+ [ CC="gcc" ]
+ )
+ AC_MSG_CHECKING([whether $CC supports -Wno-format-zero-length])
+
+ saved_flags="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror -Wno-format-zero-length"
+
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
+ KERNEL_NO_FORMAT_ZERO_LENGTH=-Wno-format-zero-length
+ AC_MSG_RESULT([yes])
+ ], [
+ KERNEL_NO_FORMAT_ZERO_LENGTH=
+ AC_MSG_RESULT([no])
+ ])
+
+ CC="$saved_cc"
+ CFLAGS="$saved_flags"
+ AC_SUBST([KERNEL_NO_FORMAT_ZERO_LENGTH])
+])
+
+dnl #
dnl # Check if cc supports -Wno-clobbered option.
dnl #
dnl # We actually invoke it with the -Wclobbered option
@@ -231,20 +259,17 @@ dnl #
dnl # Check if kernel cc supports -Winfinite-recursion option.
dnl #
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_INFINITE_RECURSION], [
- AC_MSG_CHECKING([whether $KERNEL_CC supports -Winfinite-recursion])
-
saved_cc="$CC"
+ AS_IF(
+ [ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
+ [ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
+ [ CC="gcc" ]
+ )
+ AC_MSG_CHECKING([whether $CC supports -Winfinite-recursion])
+
saved_flags="$CFLAGS"
- CC="gcc"
CFLAGS="$CFLAGS -Werror -Winfinite-recursion"
- AS_IF([ test -n "$KERNEL_CC" ], [
- CC="$KERNEL_CC"
- ])
- AS_IF([ test -n "$KERNEL_LLVM" ], [
- CC="clang"
- ])
-
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
KERNEL_INFINITE_RECURSION=-Winfinite-recursion
AC_DEFINE([HAVE_KERNEL_INFINITE_RECURSION], 1,
@@ -329,20 +354,17 @@ dnl #
dnl # Check if kernel cc supports -fno-ipa-sra option.
dnl #
AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_IPA_SRA], [
- AC_MSG_CHECKING([whether $KERNEL_CC supports -fno-ipa-sra])
-
saved_cc="$CC"
+ AS_IF(
+ [ test -n "$KERNEL_CC" ], [ CC="$KERNEL_CC" ],
+ [ test -n "$KERNEL_LLVM" ], [ CC="clang" ],
+ [ CC="gcc" ]
+ )
+ AC_MSG_CHECKING([whether $CC supports -fno-ipa-sra])
+
saved_flags="$CFLAGS"
- CC="gcc"
CFLAGS="$CFLAGS -Werror -fno-ipa-sra"
- AS_IF([ test -n "$KERNEL_CC" ], [
- CC="$KERNEL_CC"
- ])
- AS_IF([ test -n "$KERNEL_LLVM" ], [
- CC="clang"
- ])
-
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
KERNEL_NO_IPA_SRA=-fno-ipa-sra
AC_MSG_RESULT([yes])
diff --git a/sys/contrib/openzfs/config/kernel-blkdev.m4 b/sys/contrib/openzfs/config/kernel-blkdev.m4
index 83190c6fbe3f..02011bf39fb2 100644
--- a/sys/contrib/openzfs/config/kernel-blkdev.m4
+++ b/sys/contrib/openzfs/config/kernel-blkdev.m4
@@ -29,9 +29,8 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH_4ARG], [
const char *path = "path";
fmode_t mode = 0;
void *holder = NULL;
- struct blk_holder_ops h;
- bdev = blkdev_get_by_path(path, mode, holder, &h);
+ bdev = blkdev_get_by_path(path, mode, holder, NULL);
])
])
@@ -48,9 +47,8 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_OPEN_BY_PATH], [
const char *path = "path";
fmode_t mode = 0;
void *holder = NULL;
- struct blk_holder_ops h;
- bdh = bdev_open_by_path(path, mode, holder, &h);
+ bdh = bdev_open_by_path(path, mode, holder, NULL);
])
])
@@ -68,9 +66,8 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BDEV_FILE_OPEN_BY_PATH], [
const char *path = "path";
fmode_t mode = 0;
void *holder = NULL;
- struct blk_holder_ops h;
- file = bdev_file_open_by_path(path, mode, holder, &h);
+ file = bdev_file_open_by_path(path, mode, holder, NULL);
])
])
diff --git a/sys/contrib/openzfs/config/kernel-dentry-operations.m4 b/sys/contrib/openzfs/config/kernel-dentry-operations.m4
index aa5a9f2aff39..6d87ad0e0710 100644
--- a/sys/contrib/openzfs/config/kernel-dentry-operations.m4
+++ b/sys/contrib/openzfs/config/kernel-dentry-operations.m4
@@ -24,6 +24,9 @@ dnl #
dnl # 2.6.38 API change
dnl # Added d_set_d_op() helper function.
dnl #
+dnl # 6.17 API change
+dnl # d_set_d_op() removed. No direct replacement.
+dnl #
AC_DEFUN([ZFS_AC_KERNEL_SRC_D_SET_D_OP], [
ZFS_LINUX_TEST_SRC([d_set_d_op], [
#include <linux/dcache.h>
@@ -34,22 +37,21 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_D_SET_D_OP], [
AC_DEFUN([ZFS_AC_KERNEL_D_SET_D_OP], [
AC_MSG_CHECKING([whether d_set_d_op() is available])
- ZFS_LINUX_TEST_RESULT_SYMBOL([d_set_d_op],
- [d_set_d_op], [fs/dcache.c], [
+ ZFS_LINUX_TEST_RESULT([d_set_d_op], [
AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_D_SET_D_OP, 1,
+ [Define if d_set_d_op() is available])
], [
- ZFS_LINUX_TEST_ERROR([d_set_d_op])
+ AC_MSG_RESULT(no)
])
])
AC_DEFUN([ZFS_AC_KERNEL_SRC_DENTRY], [
ZFS_AC_KERNEL_SRC_D_OBTAIN_ALIAS
ZFS_AC_KERNEL_SRC_D_SET_D_OP
- ZFS_AC_KERNEL_SRC_S_D_OP
])
AC_DEFUN([ZFS_AC_KERNEL_DENTRY], [
ZFS_AC_KERNEL_D_OBTAIN_ALIAS
ZFS_AC_KERNEL_D_SET_D_OP
- ZFS_AC_KERNEL_S_D_OP
])
diff --git a/sys/contrib/openzfs/config/kernel.m4 b/sys/contrib/openzfs/config/kernel.m4
index e3e7625db7d8..35819e4d68c5 100644
--- a/sys/contrib/openzfs/config/kernel.m4
+++ b/sys/contrib/openzfs/config/kernel.m4
@@ -70,6 +70,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
ZFS_AC_KERNEL_SRC_COMMIT_METADATA
ZFS_AC_KERNEL_SRC_SETATTR_PREPARE
ZFS_AC_KERNEL_SRC_INSERT_INODE_LOCKED
+ ZFS_AC_KERNEL_SRC_DENTRY
ZFS_AC_KERNEL_SRC_TRUNCATE_SETSIZE
ZFS_AC_KERNEL_SRC_SECURITY_INODE
ZFS_AC_KERNEL_SRC_FST_MOUNT
@@ -188,6 +189,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
ZFS_AC_KERNEL_COMMIT_METADATA
ZFS_AC_KERNEL_SETATTR_PREPARE
ZFS_AC_KERNEL_INSERT_INODE_LOCKED
+ ZFS_AC_KERNEL_DENTRY
ZFS_AC_KERNEL_TRUNCATE_SETSIZE
ZFS_AC_KERNEL_SECURITY_INODE
ZFS_AC_KERNEL_FST_MOUNT
diff --git a/sys/contrib/openzfs/config/user-statx.m4 b/sys/contrib/openzfs/config/user-statx.m4
index 0315f93e0c20..1ba74a40e9b8 100644
--- a/sys/contrib/openzfs/config/user-statx.m4
+++ b/sys/contrib/openzfs/config/user-statx.m4
@@ -2,7 +2,7 @@ dnl #
dnl # Check for statx() function and STATX_MNT_ID availability
dnl #
AC_DEFUN([ZFS_AC_CONFIG_USER_STATX], [
- AC_CHECK_HEADERS([linux/stat.h],
+ AC_CHECK_HEADERS([sys/stat.h],
[have_stat_headers=yes],
[have_stat_headers=no])
@@ -14,7 +14,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_STATX], [
AC_MSG_CHECKING([for STATX_MNT_ID])
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([[
- #include <linux/stat.h>
+ #include <sys/stat.h>
]], [[
struct statx stx;
int mask = STATX_MNT_ID;
@@ -29,6 +29,6 @@ AC_DEFUN([ZFS_AC_CONFIG_USER_STATX], [
])
])
], [
- AC_MSG_WARN([linux/stat.h not found; skipping statx support])
+ AC_MSG_WARN([sys/stat.h not found; skipping statx support])
])
]) dnl end AC_DEFUN
diff --git a/sys/contrib/openzfs/config/zfs-build.m4 b/sys/contrib/openzfs/config/zfs-build.m4
index 7cf1b02d8757..adf6576f3193 100644
--- a/sys/contrib/openzfs/config/zfs-build.m4
+++ b/sys/contrib/openzfs/config/zfs-build.m4
@@ -256,6 +256,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
ZFS_AC_CONFIG_ALWAYS_CC_FRAME_LARGER_THAN
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_TRUNCATION
ZFS_AC_CONFIG_ALWAYS_CC_NO_FORMAT_ZERO_LENGTH
+ ZFS_AC_CONFIG_ALWAYS_KERNEL_CC_NO_FORMAT_ZERO_LENGTH
ZFS_AC_CONFIG_ALWAYS_CC_FORMAT_OVERFLOW
ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER
ZFS_AC_CONFIG_ALWAYS_CC_NO_IPA_SRA
@@ -265,6 +266,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [
ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD
ZFS_AC_CONFIG_ALWAYS_SYSTEM
ZFS_AC_CONFIG_ALWAYS_ARCH
+ ZFS_AC_CONFIG_CHECK_ARCH_VAR
ZFS_AC_CONFIG_ALWAYS_PYTHON
ZFS_AC_CONFIG_ALWAYS_PYZFS
ZFS_AC_CONFIG_ALWAYS_SED
diff --git a/sys/contrib/openzfs/contrib/debian/openzfs-zfsutils.install b/sys/contrib/openzfs/contrib/debian/openzfs-zfsutils.install
index 37284a78ad18..2362c83dfa3f 100644
--- a/sys/contrib/openzfs/contrib/debian/openzfs-zfsutils.install
+++ b/sys/contrib/openzfs/contrib/debian/openzfs-zfsutils.install
@@ -37,7 +37,9 @@ usr/lib/zfs-linux/zpool.d/
usr/lib/zfs-linux/zpool_influxdb
usr/lib/zfs-linux/zfs_prepare_disk
usr/sbin/arc_summary
+usr/sbin/zarcsummary
usr/sbin/arcstat
+usr/sbin/zarcstat
usr/sbin/dbufstat
usr/sbin/zilstat
usr/share/zfs/compatibility.d/
diff --git a/sys/contrib/openzfs/contrib/debian/rules.in b/sys/contrib/openzfs/contrib/debian/rules.in
index 2b0568938b25..966e34bf9dc6 100755
--- a/sys/contrib/openzfs/contrib/debian/rules.in
+++ b/sys/contrib/openzfs/contrib/debian/rules.in
@@ -82,7 +82,9 @@ override_dh_auto_install:
# https://www.debian.org/doc/debian-policy/ch-files.html#s-scripts
mkdir -p '$(CURDIR)/debian/tmp/usr/sbin/'
mv '$(CURDIR)/debian/tmp/usr/bin/arc_summary' '$(CURDIR)/debian/tmp/usr/sbin/arc_summary'
+ mv '$(CURDIR)/debian/tmp/usr/bin/zarcsummary' '$(CURDIR)/debian/tmp/usr/sbin/zarcsummary'
mv '$(CURDIR)/debian/tmp/usr/bin/arcstat' '$(CURDIR)/debian/tmp/usr/sbin/arcstat'
+ mv '$(CURDIR)/debian/tmp/usr/bin/zarcstat' '$(CURDIR)/debian/tmp/usr/sbin/zarcstat'
mv '$(CURDIR)/debian/tmp/usr/bin/dbufstat' '$(CURDIR)/debian/tmp/usr/sbin/dbufstat'
mv '$(CURDIR)/debian/tmp/usr/bin/zilstat' '$(CURDIR)/debian/tmp/usr/sbin/zilstat'
diff --git a/sys/contrib/openzfs/contrib/initramfs/hooks/zfsunlock.in b/sys/contrib/openzfs/contrib/initramfs/hooks/zfsunlock.in
index 4776087d9a76..db9bf0e20274 100644
--- a/sys/contrib/openzfs/contrib/initramfs/hooks/zfsunlock.in
+++ b/sys/contrib/openzfs/contrib/initramfs/hooks/zfsunlock.in
@@ -8,3 +8,12 @@ fi
. /usr/share/initramfs-tools/hook-functions
copy_exec /usr/share/initramfs-tools/zfsunlock /usr/bin/zfsunlock
+
+if [ -f /etc/initramfs-tools/etc/motd ]; then
+ copy_file text /etc/initramfs-tools/etc/motd /etc/motd
+else
+ tmpf=$(mktemp)
+ echo "If you use zfs encrypted root filesystems, you can use \`zfsunlock\` to manually unlock it" > "$tmpf"
+ copy_file text "$tmpf" /etc/motd
+ rm -f "$tmpf"
+fi
diff --git a/sys/contrib/openzfs/contrib/pam_zfs_key/pam_zfs_key.c b/sys/contrib/openzfs/contrib/pam_zfs_key/pam_zfs_key.c
index a0bc172c6f44..88698dedabbc 100644
--- a/sys/contrib/openzfs/contrib/pam_zfs_key/pam_zfs_key.c
+++ b/sys/contrib/openzfs/contrib/pam_zfs_key/pam_zfs_key.c
@@ -391,7 +391,11 @@ static int
zfs_key_config_load(pam_handle_t *pamh, zfs_key_config_t *config,
int argc, const char **argv)
{
+#if defined(__FreeBSD__)
+ config->homes_prefix = strdup("zroot/home");
+#else
config->homes_prefix = strdup("rpool/home");
+#endif
if (config->homes_prefix == NULL) {
pam_syslog(pamh, LOG_ERR, "strdup failure");
return (PAM_SERVICE_ERR);
diff --git a/sys/contrib/openzfs/include/os/linux/kernel/linux/dcache_compat.h b/sys/contrib/openzfs/include/os/linux/kernel/linux/dcache_compat.h
index 16e8a319a5f8..152e5a606f0e 100644
--- a/sys/contrib/openzfs/include/os/linux/kernel/linux/dcache_compat.h
+++ b/sys/contrib/openzfs/include/os/linux/kernel/linux/dcache_compat.h
@@ -61,32 +61,6 @@
#endif
/*
- * 2.6.30 API change,
- * The const keyword was added to the 'struct dentry_operations' in
- * the dentry structure. To handle this we define an appropriate
- * dentry_operations_t typedef which can be used.
- */
-typedef const struct dentry_operations dentry_operations_t;
-
-/*
- * 2.6.38 API addition,
- * Added d_clear_d_op() helper function which clears some flags and the
- * registered dentry->d_op table. This is required because d_set_d_op()
- * issues a warning when the dentry operations table is already set.
- * For the .zfs control directory to work properly we must be able to
- * override the default operations table and register custom .d_automount
- * and .d_revalidate callbacks.
- */
-static inline void
-d_clear_d_op(struct dentry *dentry)
-{
- dentry->d_op = NULL;
- dentry->d_flags &= ~(
- DCACHE_OP_HASH | DCACHE_OP_COMPARE |
- DCACHE_OP_REVALIDATE | DCACHE_OP_DELETE);
-}
-
-/*
* Walk and invalidate all dentry aliases of an inode
* unless it's a mountpoint
*/
diff --git a/sys/contrib/openzfs/include/os/linux/spl/sys/stat.h b/sys/contrib/openzfs/include/os/linux/spl/sys/stat.h
index 087389b57b34..ad2815e46394 100644
--- a/sys/contrib/openzfs/include/os/linux/spl/sys/stat.h
+++ b/sys/contrib/openzfs/include/os/linux/spl/sys/stat.h
@@ -25,6 +25,6 @@
#ifndef _SPL_STAT_H
#define _SPL_STAT_H
-#include <linux/stat.h>
+#include <sys/stat.h>
#endif /* SPL_STAT_H */
diff --git a/sys/contrib/openzfs/include/sys/zio.h b/sys/contrib/openzfs/include/sys/zio.h
index 353805fcb969..a8acb83b4c2f 100644
--- a/sys/contrib/openzfs/include/sys/zio.h
+++ b/sys/contrib/openzfs/include/sys/zio.h
@@ -82,7 +82,8 @@ gbh_nblkptrs(uint64_t size) {
static inline zio_eck_t *
gbh_eck(zio_gbh_phys_t *gbh, uint64_t size) {
ASSERT(IS_P2ALIGNED(size, sizeof (blkptr_t)));
- return ((zio_eck_t *)((uintptr_t)gbh + (size_t)size - sizeof (zio_eck_t)));
+ return ((zio_eck_t *)((uintptr_t)gbh + (size_t)size -
+ sizeof (zio_eck_t)));
}
static inline blkptr_t *
diff --git a/sys/contrib/openzfs/include/sys/zvol.h b/sys/contrib/openzfs/include/sys/zvol.h
index cdc9dba2a28d..5791246e99e4 100644
--- a/sys/contrib/openzfs/include/sys/zvol.h
+++ b/sys/contrib/openzfs/include/sys/zvol.h
@@ -53,7 +53,7 @@ extern int zvol_set_volsize(const char *, uint64_t);
extern int zvol_set_volthreading(const char *, boolean_t);
extern int zvol_set_common(const char *, zfs_prop_t, zprop_source_t, uint64_t);
extern int zvol_set_ro(const char *, boolean_t);
-extern zvol_state_handle_t *zvol_suspend(const char *);
+extern int zvol_suspend(const char *, zvol_state_handle_t **);
extern int zvol_resume(zvol_state_handle_t *);
extern void *zvol_tag(zvol_state_handle_t *);
diff --git a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h
index a605af962a6d..13cc0b46ac93 100644
--- a/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h
+++ b/sys/contrib/openzfs/lib/libspl/include/os/linux/sys/stat.h
@@ -33,7 +33,7 @@
#ifdef HAVE_STATX
#include <fcntl.h>
-#include <linux/stat.h>
+#include <sys/stat.h>
#endif
/*
diff --git a/sys/contrib/openzfs/man/man1/arcstat.1 b/sys/contrib/openzfs/man/man1/arcstat.1
index f2474fbb701f..288b98d57a11 100644
--- a/sys/contrib/openzfs/man/man1/arcstat.1
+++ b/sys/contrib/openzfs/man/man1/arcstat.1
@@ -13,13 +13,15 @@
.\" Copyright (c) 2015 by Delphix. All rights reserved.
.\" Copyright (c) 2020 by AJ Jordan. All rights reserved.
.\"
-.Dd December 23, 2022
+.Dd September 19, 2024
.Dt ARCSTAT 1
.Os
.
.Sh NAME
.Nm arcstat
.Nd report ZFS ARC and L2ARC statistics
+.Sh NOTICE
+It will be renamed to zarcstat in zfs 2.4.0. Please migrate ASAP.
.Sh SYNOPSIS
.Nm
.Op Fl havxp
diff --git a/sys/contrib/openzfs/man/man1/cstyle.1 b/sys/contrib/openzfs/man/man1/cstyle.1
index 241c82edd5a8..8f29129ce175 100644
--- a/sys/contrib/openzfs/man/man1/cstyle.1
+++ b/sys/contrib/openzfs/man/man1/cstyle.1
@@ -21,7 +21,7 @@
.\"
.\" CDDL HEADER END
.\"
-.Dd May 26, 2021
+.Dd April 4, 2022
.Dt CSTYLE 1
.Os
.
diff --git a/sys/contrib/openzfs/man/man1/zhack.1 b/sys/contrib/openzfs/man/man1/zhack.1
index f58c0527649b..743bd53b731c 100644
--- a/sys/contrib/openzfs/man/man1/zhack.1
+++ b/sys/contrib/openzfs/man/man1/zhack.1
@@ -23,7 +23,7 @@
.\"
.\" lint-ok: WARNING: sections out of conventional order: Sh SYNOPSIS
.\"
-.Dd May 26, 2021
+.Dd May 3, 2023
.Dt ZHACK 1
.Os
.
diff --git a/sys/contrib/openzfs/man/man1/ztest.1 b/sys/contrib/openzfs/man/man1/ztest.1
index febbb62b1664..ae857bfea29c 100644
--- a/sys/contrib/openzfs/man/man1/ztest.1
+++ b/sys/contrib/openzfs/man/man1/ztest.1
@@ -24,7 +24,7 @@
.\" reserved.
.\" Copyright (c) 2017, Intel Corporation.
.\"
-.Dd May 26, 2021
+.Dd July 12, 2025
.Dt ZTEST 1
.Os
.
diff --git a/sys/contrib/openzfs/man/man4/spl.4 b/sys/contrib/openzfs/man/man4/spl.4
index 683f8e2b631f..61dfe42e463d 100644
--- a/sys/contrib/openzfs/man/man4/spl.4
+++ b/sys/contrib/openzfs/man/man4/spl.4
@@ -15,7 +15,7 @@
.\"
.\" Copyright 2013 Turbo Fredriksson <turbo@bayour.com>. All rights reserved.
.\"
-.Dd August 24, 2020
+.Dd May 7, 2025
.Dt SPL 4
.Os
.
diff --git a/sys/contrib/openzfs/man/man4/zfs.4 b/sys/contrib/openzfs/man/man4/zfs.4
index 5c7958667f92..e865d6a79c5a 100644
--- a/sys/contrib/openzfs/man/man4/zfs.4
+++ b/sys/contrib/openzfs/man/man4/zfs.4
@@ -17,7 +17,7 @@
.\" own identifying information:
.\" Portions Copyright [yyyy] [name of copyright owner]
.\"
-.Dd May 29, 2025
+.Dd August 14, 2025
.Dt ZFS 4
.Os
.
diff --git a/sys/contrib/openzfs/man/man5/vdev_id.conf.5 b/sys/contrib/openzfs/man/man5/vdev_id.conf.5
index d2f817631c15..299a23720201 100644
--- a/sys/contrib/openzfs/man/man5/vdev_id.conf.5
+++ b/sys/contrib/openzfs/man/man5/vdev_id.conf.5
@@ -9,7 +9,7 @@
.\" source. A copy of the CDDL is also available via the Internet at
.\" http://www.illumos.org/license/CDDL.
.\"
-.Dd May 26, 2021
+.Dd October 8, 2024
.Dt VDEV_ID.CONF 5
.Os
.
diff --git a/sys/contrib/openzfs/man/man7/dracut.zfs.7 b/sys/contrib/openzfs/man/man7/dracut.zfs.7
index fb5da553af6e..3d051d4d3343 100644
--- a/sys/contrib/openzfs/man/man7/dracut.zfs.7
+++ b/sys/contrib/openzfs/man/man7/dracut.zfs.7
@@ -1,7 +1,7 @@
.\" SPDX-License-Identifier: CDDL-1.0
.\" SPDX-License-Identifier: 0BSD
.\"
-.Dd March 28, 2023
+.Dd July 13, 2024
.Dt DRACUT.ZFS 7
.Os
.
diff --git a/sys/contrib/openzfs/man/man7/vdevprops.7 b/sys/contrib/openzfs/man/man7/vdevprops.7
index acabe6b6613a..61e60d950416 100644
--- a/sys/contrib/openzfs/man/man7/vdevprops.7
+++ b/sys/contrib/openzfs/man/man7/vdevprops.7
@@ -21,7 +21,7 @@
.\"
.\" Copyright (c) 2021 Klara, Inc.
.\"
-.Dd October 30, 2022
+.Dd July 23, 2024
.Dt VDEVPROPS 7
.Os
.
diff --git a/sys/contrib/openzfs/man/man7/zfsconcepts.7 b/sys/contrib/openzfs/man/man7/zfsconcepts.7
index 5c736e53670d..bb2178d85bcd 100644
--- a/sys/contrib/openzfs/man/man7/zfsconcepts.7
+++ b/sys/contrib/openzfs/man/man7/zfsconcepts.7
@@ -31,7 +31,7 @@
.\" Copyright 2019 Joyent, Inc.
.\" Copyright 2023 Klara, Inc.
.\"
-.Dd October 6, 2023
+.Dd October 2, 2024
.Dt ZFSCONCEPTS 7
.Os
.
diff --git a/sys/contrib/openzfs/man/man7/zfsprops.7 b/sys/contrib/openzfs/man/man7/zfsprops.7
index ac3152cb5d51..0930771c9fce 100644
--- a/sys/contrib/openzfs/man/man7/zfsprops.7
+++ b/sys/contrib/openzfs/man/man7/zfsprops.7
@@ -39,7 +39,7 @@
.\" Copyright (c) 2019, Kjeld Schouten-Lebbing
.\" Copyright (c) 2022 Hewlett Packard Enterprise Development LP.
.\"
-.Dd June 29, 2024
+.Dd August 6, 2025
.Dt ZFSPROPS 7
.Os
.
diff --git a/sys/contrib/openzfs/man/man7/zpool-features.7 b/sys/contrib/openzfs/man/man7/zpool-features.7
index 10dfd1f92936..b4404a6eb58d 100644
--- a/sys/contrib/openzfs/man/man7/zpool-features.7
+++ b/sys/contrib/openzfs/man/man7/zpool-features.7
@@ -19,7 +19,7 @@
.\" Copyright (c) 2019, Allan Jude
.\" Copyright (c) 2021, Colm Buckley <colm@tuatha.org>
.\"
-.Dd October 2, 2024
+.Dd July 23, 2025
.Dt ZPOOL-FEATURES 7
.Os
.
diff --git a/sys/contrib/openzfs/man/man7/zpoolconcepts.7 b/sys/contrib/openzfs/man/man7/zpoolconcepts.7
index dafe3bffc453..b9c8926d835d 100644
--- a/sys/contrib/openzfs/man/man7/zpoolconcepts.7
+++ b/sys/contrib/openzfs/man/man7/zpoolconcepts.7
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd April 7, 2023
+.Dd August 6, 2025
.Dt ZPOOLCONCEPTS 7
.Os
.
diff --git a/sys/contrib/openzfs/man/man7/zpoolprops.7 b/sys/contrib/openzfs/man/man7/zpoolprops.7
index 5d84753193ee..d3b4c2376943 100644
--- a/sys/contrib/openzfs/man/man7/zpoolprops.7
+++ b/sys/contrib/openzfs/man/man7/zpoolprops.7
@@ -29,7 +29,7 @@
.\" Copyright (c) 2021, Colm Buckley <colm@tuatha.org>
.\" Copyright (c) 2023, Klara Inc.
.\"
-.Dd November 18, 2024
+.Dd December 4, 2024
.Dt ZPOOLPROPS 7
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zdb.8 b/sys/contrib/openzfs/man/man8/zdb.8
index 0a5b6af73fdb..e00544e4a5a4 100644
--- a/sys/contrib/openzfs/man/man8/zdb.8
+++ b/sys/contrib/openzfs/man/man8/zdb.8
@@ -15,7 +15,7 @@
.\" Copyright (c) 2017 Lawrence Livermore National Security, LLC.
.\" Copyright (c) 2017 Intel Corporation.
.\"
-.Dd April 23, 2025
+.Dd August 12, 2025
.Dt ZDB 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zed.8.in b/sys/contrib/openzfs/man/man8/zed.8.in
index c90a1834403b..eda377aafc1e 100644
--- a/sys/contrib/openzfs/man/man8/zed.8.in
+++ b/sys/contrib/openzfs/man/man8/zed.8.in
@@ -13,7 +13,7 @@
.\"
.\" Developed at Lawrence Livermore National Laboratory (LLNL-CODE-403049)
.\"
-.Dd May 26, 2021
+.Dd August 22, 2022
.Dt ZED 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-allow.8 b/sys/contrib/openzfs/man/man8/zfs-allow.8
index 5a8e80bf6a43..b154aebd92aa 100644
--- a/sys/contrib/openzfs/man/man8/zfs-allow.8
+++ b/sys/contrib/openzfs/man/man8/zfs-allow.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd March 16, 2022
+.Dd March 13, 2025
.Dt ZFS-ALLOW 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-bookmark.8 b/sys/contrib/openzfs/man/man8/zfs-bookmark.8
index 083ff46d241b..5a0933820020 100644
--- a/sys/contrib/openzfs/man/man8/zfs-bookmark.8
+++ b/sys/contrib/openzfs/man/man8/zfs-bookmark.8
@@ -31,7 +31,7 @@
.\" Copyright 2019 Joyent, Inc.
.\" Copyright (c) 2019, 2020 by Christian Schwarz. All Rights Reserved.
.\"
-.Dd May 12, 2022
+.Dd July 11, 2022
.Dt ZFS-BOOKMARK 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-clone.8 b/sys/contrib/openzfs/man/man8/zfs-clone.8
index cd412815f5fe..9609cf2ce36a 100644
--- a/sys/contrib/openzfs/man/man8/zfs-clone.8
+++ b/sys/contrib/openzfs/man/man8/zfs-clone.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZFS-CLONE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-create.8 b/sys/contrib/openzfs/man/man8/zfs-create.8
index 91878056cc7d..58bde5799240 100644
--- a/sys/contrib/openzfs/man/man8/zfs-create.8
+++ b/sys/contrib/openzfs/man/man8/zfs-create.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd March 16, 2022
+.Dd June 2, 2023
.Dt ZFS-CREATE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-destroy.8 b/sys/contrib/openzfs/man/man8/zfs-destroy.8
index 38359be02430..6a6791f7a44e 100644
--- a/sys/contrib/openzfs/man/man8/zfs-destroy.8
+++ b/sys/contrib/openzfs/man/man8/zfs-destroy.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd March 16, 2022
+.Dd February 5, 2025
.Dt ZFS-DESTROY 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-diff.8 b/sys/contrib/openzfs/man/man8/zfs-diff.8
index d4c48f4109be..5b94ea524666 100644
--- a/sys/contrib/openzfs/man/man8/zfs-diff.8
+++ b/sys/contrib/openzfs/man/man8/zfs-diff.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZFS-DIFF 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-hold.8 b/sys/contrib/openzfs/man/man8/zfs-hold.8
index 0c88937f0dc8..a877e428f88b 100644
--- a/sys/contrib/openzfs/man/man8/zfs-hold.8
+++ b/sys/contrib/openzfs/man/man8/zfs-hold.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd June 30, 2019
+.Dd November 8, 2022
.Dt ZFS-HOLD 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-jail.8 b/sys/contrib/openzfs/man/man8/zfs-jail.8
index 53499a279d05..569f5f57eab4 100644
--- a/sys/contrib/openzfs/man/man8/zfs-jail.8
+++ b/sys/contrib/openzfs/man/man8/zfs-jail.8
@@ -37,7 +37,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd May 27, 2021
+.Dd July 11, 2022
.Dt ZFS-JAIL 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-list.8 b/sys/contrib/openzfs/man/man8/zfs-list.8
index 677d8292e207..42eff94f9762 100644
--- a/sys/contrib/openzfs/man/man8/zfs-list.8
+++ b/sys/contrib/openzfs/man/man8/zfs-list.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd February 8, 2024
+.Dd August 25, 2025
.Dt ZFS-LIST 8
.Os
.
@@ -50,27 +50,25 @@
.Oo Ar filesystem Ns | Ns Ar volume Ns | Ns Ar snapshot Oc Ns …
.
.Sh DESCRIPTION
-If specified, you can list property information by the absolute pathname or the
-relative pathname.
-By default, all file systems and volumes are displayed.
+By default, all file systems and volumes are displayed, with the following
+fields:
+.Sy name , Sy used , Sy available , Sy referenced , Sy mountpoint .
Snapshots are displayed if the
.Sy listsnapshots
pool property is
.Sy on
.Po the default is
.Sy off
-.Pc ,
+.Pc
or if the
.Fl t Sy snapshot
or
.Fl t Sy all
options are specified.
-The following fields are displayed:
-.Sy name , Sy used , Sy available , Sy referenced , Sy mountpoint .
.Bl -tag -width "-H"
.It Fl H
Used for scripting mode.
-Do not print headers and separate fields by a single tab instead of arbitrary
+Do not print headers, and separate fields by a single tab instead of arbitrary
white space.
.It Fl j , -json Op Ar --json-int
Print the output in JSON format.
@@ -87,7 +85,7 @@ of
will display only the dataset and its direct children.
.It Fl o Ar property
A comma-separated list of properties to display.
-The property must be:
+Each property must be:
.Bl -bullet -compact
.It
One of the properties described in the
@@ -125,30 +123,41 @@ section of
or the value
.Sy name
to sort by the dataset name.
-Multiple properties can be specified at one time using multiple
+Multiple properties can be specified to operate together using multiple
.Fl s
-property options.
+or
+.Fl S
+options.
Multiple
.Fl s
-options are evaluated from left to right in decreasing order of importance.
-The following is a list of sorting criteria:
+and
+.Fl S
+options are evaluated from left to right to supply sort keys in
+decreasing order of priority.
+Property types operate as follows:
.Bl -bullet -compact
.It
Numeric types sort in numeric order.
.It
String types sort in alphabetical order.
.It
-Types inappropriate for a row sort that row to the literal bottom, regardless of
-the specified ordering.
+Types inappropriate for a row sort that row to the literal bottom,
+regardless of the specified ordering.
.El
.Pp
-If no sorting options are specified the existing behavior of
-.Nm zfs Cm list
-is preserved.
+If no sort columns are specified, or if two lines of output would sort
+equally across all specified columns, then datasets and bookmarks are
+sorted by name, whereas snapshots are sorted first by the name of their
+dataset and then by the time of their creation.
+When no sort columns are specified but snapshots are listed, this
+default behavior causes snapshots to be grouped under their datasets in
+chronological order by creation time.
.It Fl S Ar property
Same as
.Fl s ,
-but sorts by property in descending order.
+but sorts by
+.Ar property
+in descending order.
.It Fl t Ar type
A comma-separated list of types to display, where
.Ar type
diff --git a/sys/contrib/openzfs/man/man8/zfs-load-key.8 b/sys/contrib/openzfs/man/man8/zfs-load-key.8
index 7838c46d9e77..3a11cea99fd6 100644
--- a/sys/contrib/openzfs/man/man8/zfs-load-key.8
+++ b/sys/contrib/openzfs/man/man8/zfs-load-key.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd January 13, 2020
+.Dd July 11, 2022
.Dt ZFS-LOAD-KEY 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-mount-generator.8.in b/sys/contrib/openzfs/man/man8/zfs-mount-generator.8.in
index ea470247daac..9e44ea30c636 100644
--- a/sys/contrib/openzfs/man/man8/zfs-mount-generator.8.in
+++ b/sys/contrib/openzfs/man/man8/zfs-mount-generator.8.in
@@ -23,7 +23,7 @@
.\" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
.\" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.\"
-.Dd May 31, 2021
+.Dd November 30, 2021
.Dt ZFS-MOUNT-GENERATOR 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-mount.8 b/sys/contrib/openzfs/man/man8/zfs-mount.8
index 9fca6fffd5bb..2689b6dc345b 100644
--- a/sys/contrib/openzfs/man/man8/zfs-mount.8
+++ b/sys/contrib/openzfs/man/man8/zfs-mount.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd February 16, 2019
+.Dd October 12, 2024
.Dt ZFS-MOUNT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-project.8 b/sys/contrib/openzfs/man/man8/zfs-project.8
index 36547680f53e..4ebfdf6ffe4f 100644
--- a/sys/contrib/openzfs/man/man8/zfs-project.8
+++ b/sys/contrib/openzfs/man/man8/zfs-project.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd May 27, 2021
+.Dd July 11, 2022
.Dt ZFS-PROJECT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-promote.8 b/sys/contrib/openzfs/man/man8/zfs-promote.8
index 767045812607..435a7a5d0144 100644
--- a/sys/contrib/openzfs/man/man8/zfs-promote.8
+++ b/sys/contrib/openzfs/man/man8/zfs-promote.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZFS-PROMOTE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-rename.8 b/sys/contrib/openzfs/man/man8/zfs-rename.8
index 4cf192c0682b..8fedc67469e6 100644
--- a/sys/contrib/openzfs/man/man8/zfs-rename.8
+++ b/sys/contrib/openzfs/man/man8/zfs-rename.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZFS-RENAME 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-rewrite.8 b/sys/contrib/openzfs/man/man8/zfs-rewrite.8
index a3a037f3794a..ca5340c7e5eb 100644
--- a/sys/contrib/openzfs/man/man8/zfs-rewrite.8
+++ b/sys/contrib/openzfs/man/man8/zfs-rewrite.8
@@ -21,7 +21,7 @@
.\"
.\" Copyright (c) 2025 iXsystems, Inc.
.\"
-.Dd May 6, 2025
+.Dd July 23, 2025
.Dt ZFS-REWRITE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-send.8 b/sys/contrib/openzfs/man/man8/zfs-send.8
index f7c6b840303c..6c5f6b94afd5 100644
--- a/sys/contrib/openzfs/man/man8/zfs-send.8
+++ b/sys/contrib/openzfs/man/man8/zfs-send.8
@@ -31,7 +31,7 @@
.\" Copyright 2019 Joyent, Inc.
.\" Copyright (c) 2024, Klara, Inc.
.\"
-.Dd October 2, 2024
+.Dd August 29, 2025
.Dt ZFS-SEND 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-set.8 b/sys/contrib/openzfs/man/man8/zfs-set.8
index 67f4d6eba171..08daf09d05f8 100644
--- a/sys/contrib/openzfs/man/man8/zfs-set.8
+++ b/sys/contrib/openzfs/man/man8/zfs-set.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd April 20, 2024
+.Dd October 12, 2024
.Dt ZFS-SET 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-share.8 b/sys/contrib/openzfs/man/man8/zfs-share.8
index f7a09a189182..e9c32a44b0c7 100644
--- a/sys/contrib/openzfs/man/man8/zfs-share.8
+++ b/sys/contrib/openzfs/man/man8/zfs-share.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd May 17, 2021
+.Dd July 11, 2022
.Dt ZFS-SHARE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-snapshot.8 b/sys/contrib/openzfs/man/man8/zfs-snapshot.8
index 3ddd1273c8e8..8f4b2c335f09 100644
--- a/sys/contrib/openzfs/man/man8/zfs-snapshot.8
+++ b/sys/contrib/openzfs/man/man8/zfs-snapshot.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZFS-SNAPSHOT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-upgrade.8 b/sys/contrib/openzfs/man/man8/zfs-upgrade.8
index bac74e37aef9..a5ce2b760da4 100644
--- a/sys/contrib/openzfs/man/man8/zfs-upgrade.8
+++ b/sys/contrib/openzfs/man/man8/zfs-upgrade.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd June 30, 2019
+.Dd July 11, 2022
.Dt ZFS-UPGRADE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-userspace.8 b/sys/contrib/openzfs/man/man8/zfs-userspace.8
index d7a4d18e83b1..c255d911740d 100644
--- a/sys/contrib/openzfs/man/man8/zfs-userspace.8
+++ b/sys/contrib/openzfs/man/man8/zfs-userspace.8
@@ -30,7 +30,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd June 30, 2019
+.Dd July 11, 2022
.Dt ZFS-USERSPACE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-wait.8 b/sys/contrib/openzfs/man/man8/zfs-wait.8
index 554a67455c60..e5c60010d2f9 100644
--- a/sys/contrib/openzfs/man/man8/zfs-wait.8
+++ b/sys/contrib/openzfs/man/man8/zfs-wait.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd May 31, 2021
+.Dd July 11, 2022
.Dt ZFS-WAIT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs-zone.8 b/sys/contrib/openzfs/man/man8/zfs-zone.8
index 7ad0ac89463c..a56a304e82b2 100644
--- a/sys/contrib/openzfs/man/man8/zfs-zone.8
+++ b/sys/contrib/openzfs/man/man8/zfs-zone.8
@@ -38,7 +38,7 @@
.\" Copyright 2019 Joyent, Inc.
.\" Copyright 2021 Klara, Inc.
.\"
-.Dd June 3, 2022
+.Dd July 11, 2022
.Dt ZFS-ZONE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs.8 b/sys/contrib/openzfs/man/man8/zfs.8
index e16a3a82b672..b7566a727469 100644
--- a/sys/contrib/openzfs/man/man8/zfs.8
+++ b/sys/contrib/openzfs/man/man8/zfs.8
@@ -37,7 +37,7 @@
.\" Copyright 2018 Nexenta Systems, Inc.
.\" Copyright 2019 Joyent, Inc.
.\"
-.Dd April 18, 2025
+.Dd May 12, 2025
.Dt ZFS 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zfs_ids_to_path.8 b/sys/contrib/openzfs/man/man8/zfs_ids_to_path.8
index eef0ce68f17b..465e336d170c 100644
--- a/sys/contrib/openzfs/man/man8/zfs_ids_to_path.8
+++ b/sys/contrib/openzfs/man/man8/zfs_ids_to_path.8
@@ -21,7 +21,7 @@
.\"
.\" Copyright (c) 2020 by Delphix. All rights reserved.
.\"
-.Dd April 17, 2020
+.Dd July 11, 2022
.Dt ZFS_IDS_TO_PATH 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zgenhostid.8 b/sys/contrib/openzfs/man/man8/zgenhostid.8
index 2b5b4fc18216..ff564880f97d 100644
--- a/sys/contrib/openzfs/man/man8/zgenhostid.8
+++ b/sys/contrib/openzfs/man/man8/zgenhostid.8
@@ -21,7 +21,7 @@
.\"
.\" Copyright (c) 2017 by Lawrence Livermore National Security, LLC.
.\"
-.Dd May 26, 2021
+.Dd July 11, 2022
.Dt ZGENHOSTID 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-attach.8 b/sys/contrib/openzfs/man/man8/zpool-attach.8
index 51d876767666..f120350a5190 100644
--- a/sys/contrib/openzfs/man/man8/zpool-attach.8
+++ b/sys/contrib/openzfs/man/man8/zpool-attach.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd June 28, 2023
+.Dd November 8, 2023
.Dt ZPOOL-ATTACH 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-checkpoint.8 b/sys/contrib/openzfs/man/man8/zpool-checkpoint.8
index d97d10d5df6e..b654f669cfa2 100644
--- a/sys/contrib/openzfs/man/man8/zpool-checkpoint.8
+++ b/sys/contrib/openzfs/man/man8/zpool-checkpoint.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd May 27, 2021
+.Dd July 11, 2022
.Dt ZPOOL-CHECKPOINT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-clear.8 b/sys/contrib/openzfs/man/man8/zpool-clear.8
index 19cd4be36408..70cd8325bd0e 100644
--- a/sys/contrib/openzfs/man/man8/zpool-clear.8
+++ b/sys/contrib/openzfs/man/man8/zpool-clear.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd May 27, 2021
+.Dd April 29, 2024
.Dt ZPOOL-CLEAR 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-create.8 b/sys/contrib/openzfs/man/man8/zpool-create.8
index 490c67629a20..a36ae260a158 100644
--- a/sys/contrib/openzfs/man/man8/zpool-create.8
+++ b/sys/contrib/openzfs/man/man8/zpool-create.8
@@ -28,7 +28,7 @@
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\" Copyright (c) 2021, Colm Buckley <colm@tuatha.org>
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZPOOL-CREATE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-destroy.8 b/sys/contrib/openzfs/man/man8/zpool-destroy.8
index f49f29804ad7..82f3f3e203d6 100644
--- a/sys/contrib/openzfs/man/man8/zpool-destroy.8
+++ b/sys/contrib/openzfs/man/man8/zpool-destroy.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZPOOL-DESTROY 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-detach.8 b/sys/contrib/openzfs/man/man8/zpool-detach.8
index ae02dbc2d5b8..79a44310110d 100644
--- a/sys/contrib/openzfs/man/man8/zpool-detach.8
+++ b/sys/contrib/openzfs/man/man8/zpool-detach.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd August 9, 2019
+.Dd July 11, 2022
.Dt ZPOOL-DETACH 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-export.8 b/sys/contrib/openzfs/man/man8/zpool-export.8
index 171a7541c6d2..02495c088f94 100644
--- a/sys/contrib/openzfs/man/man8/zpool-export.8
+++ b/sys/contrib/openzfs/man/man8/zpool-export.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZPOOL-EXPORT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-get.8 b/sys/contrib/openzfs/man/man8/zpool-get.8
index 1d6d1f08afa6..bfe1bae7619f 100644
--- a/sys/contrib/openzfs/man/man8/zpool-get.8
+++ b/sys/contrib/openzfs/man/man8/zpool-get.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd August 9, 2019
+.Dd October 12, 2024
.Dt ZPOOL-GET 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-history.8 b/sys/contrib/openzfs/man/man8/zpool-history.8
index f15086eabc47..f02168951ff2 100644
--- a/sys/contrib/openzfs/man/man8/zpool-history.8
+++ b/sys/contrib/openzfs/man/man8/zpool-history.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd August 9, 2019
+.Dd July 11, 2022
.Dt ZPOOL-HISTORY 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-import.8 b/sys/contrib/openzfs/man/man8/zpool-import.8
index 9076f5c34929..c6d5f222b6b2 100644
--- a/sys/contrib/openzfs/man/man8/zpool-import.8
+++ b/sys/contrib/openzfs/man/man8/zpool-import.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZPOOL-IMPORT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-initialize.8 b/sys/contrib/openzfs/man/man8/zpool-initialize.8
index 39579a58010e..5299a897cb97 100644
--- a/sys/contrib/openzfs/man/man8/zpool-initialize.8
+++ b/sys/contrib/openzfs/man/man8/zpool-initialize.8
@@ -28,7 +28,7 @@
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\" Copyright (c) 2025 Hewlett Packard Enterprise Development LP.
.\"
-.Dd May 27, 2021
+.Dd July 30, 2025
.Dt ZPOOL-INITIALIZE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-iostat.8 b/sys/contrib/openzfs/man/man8/zpool-iostat.8
index d8c21d0cfc6c..5dd9c9d55e20 100644
--- a/sys/contrib/openzfs/man/man8/zpool-iostat.8
+++ b/sys/contrib/openzfs/man/man8/zpool-iostat.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd March 16, 2022
+.Dd January 29, 2024
.Dt ZPOOL-IOSTAT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-labelclear.8 b/sys/contrib/openzfs/man/man8/zpool-labelclear.8
index ba3d1509aa75..b807acaaede3 100644
--- a/sys/contrib/openzfs/man/man8/zpool-labelclear.8
+++ b/sys/contrib/openzfs/man/man8/zpool-labelclear.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd May 31, 2021
+.Dd July 11, 2022
.Dt ZPOOL-LABELCLEAR 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-list.8 b/sys/contrib/openzfs/man/man8/zpool-list.8
index b720e203c1c9..106399941f98 100644
--- a/sys/contrib/openzfs/man/man8/zpool-list.8
+++ b/sys/contrib/openzfs/man/man8/zpool-list.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd March 16, 2022
+.Dd October 12, 2024
.Dt ZPOOL-LIST 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-offline.8 b/sys/contrib/openzfs/man/man8/zpool-offline.8
index 49b1f34ad5d5..388c7634acce 100644
--- a/sys/contrib/openzfs/man/man8/zpool-offline.8
+++ b/sys/contrib/openzfs/man/man8/zpool-offline.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd August 9, 2019
+.Dd December 21, 2023
.Dt ZPOOL-OFFLINE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-reguid.8 b/sys/contrib/openzfs/man/man8/zpool-reguid.8
index 77101fc07326..b98c88e320de 100644
--- a/sys/contrib/openzfs/man/man8/zpool-reguid.8
+++ b/sys/contrib/openzfs/man/man8/zpool-reguid.8
@@ -29,7 +29,7 @@
.\" Copyright (c) 2024, Klara Inc.
.\" Copyright (c) 2024, Mateusz Piotrowski
.\"
-.Dd June 21, 2023
+.Dd August 26, 2024
.Dt ZPOOL-REGUID 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-remove.8 b/sys/contrib/openzfs/man/man8/zpool-remove.8
index d10a92e49bbe..4d5fc431d332 100644
--- a/sys/contrib/openzfs/man/man8/zpool-remove.8
+++ b/sys/contrib/openzfs/man/man8/zpool-remove.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd March 16, 2022
+.Dd November 19, 2024
.Dt ZPOOL-REMOVE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-reopen.8 b/sys/contrib/openzfs/man/man8/zpool-reopen.8
index 594cff3d16d8..c4e10f0a546e 100644
--- a/sys/contrib/openzfs/man/man8/zpool-reopen.8
+++ b/sys/contrib/openzfs/man/man8/zpool-reopen.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd June 2, 2021
+.Dd July 11, 2022
.Dt ZPOOL-REOPEN 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-replace.8 b/sys/contrib/openzfs/man/man8/zpool-replace.8
index 9f3156eeb3ef..651af13b19b8 100644
--- a/sys/contrib/openzfs/man/man8/zpool-replace.8
+++ b/sys/contrib/openzfs/man/man8/zpool-replace.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd May 29, 2021
+.Dd July 11, 2022
.Dt ZPOOL-REPLACE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-resilver.8 b/sys/contrib/openzfs/man/man8/zpool-resilver.8
index 2161d77f62ed..59c4be5db209 100644
--- a/sys/contrib/openzfs/man/man8/zpool-resilver.8
+++ b/sys/contrib/openzfs/man/man8/zpool-resilver.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd May 27, 2021
+.Dd July 11, 2022
.Dt ZPOOL-RESILVER 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-scrub.8 b/sys/contrib/openzfs/man/man8/zpool-scrub.8
index 0ecf8bd3851f..cf7ead5788bf 100644
--- a/sys/contrib/openzfs/man/man8/zpool-scrub.8
+++ b/sys/contrib/openzfs/man/man8/zpool-scrub.8
@@ -28,7 +28,7 @@
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\" Copyright (c) 2025 Hewlett Packard Enterprise Development LP.
.\"
-.Dd December 11, 2024
+.Dd August 6, 2025
.Dt ZPOOL-SCRUB 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-split.8 b/sys/contrib/openzfs/man/man8/zpool-split.8
index a67c865cf30c..ee4c6384cf23 100644
--- a/sys/contrib/openzfs/man/man8/zpool-split.8
+++ b/sys/contrib/openzfs/man/man8/zpool-split.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd June 2, 2021
+.Dd July 11, 2022
.Dt ZPOOL-SPLIT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-status.8 b/sys/contrib/openzfs/man/man8/zpool-status.8
index a7f3e088043b..108a1067b384 100644
--- a/sys/contrib/openzfs/man/man8/zpool-status.8
+++ b/sys/contrib/openzfs/man/man8/zpool-status.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd February 14, 2024
+.Dd May 20, 2025
.Dt ZPOOL-STATUS 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-sync.8 b/sys/contrib/openzfs/man/man8/zpool-sync.8
index 8f438f363e83..d1dc05d0c202 100644
--- a/sys/contrib/openzfs/man/man8/zpool-sync.8
+++ b/sys/contrib/openzfs/man/man8/zpool-sync.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd August 9, 2019
+.Dd July 11, 2022
.Dt ZPOOL-SYNC 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-trim.8 b/sys/contrib/openzfs/man/man8/zpool-trim.8
index 18723e1be0d2..c4e849019789 100644
--- a/sys/contrib/openzfs/man/man8/zpool-trim.8
+++ b/sys/contrib/openzfs/man/man8/zpool-trim.8
@@ -28,7 +28,7 @@
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\" Copyright (c) 2025 Hewlett Packard Enterprise Development LP.
.\"
-.Dd May 27, 2021
+.Dd July 30, 2025
.Dt ZPOOL-TRIM 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-upgrade.8 b/sys/contrib/openzfs/man/man8/zpool-upgrade.8
index 20632ae4bba0..cf69060da5ce 100644
--- a/sys/contrib/openzfs/man/man8/zpool-upgrade.8
+++ b/sys/contrib/openzfs/man/man8/zpool-upgrade.8
@@ -28,7 +28,7 @@
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\" Copyright (c) 2021, Colm Buckley <colm@tuatha.org>
.\"
-.Dd March 16, 2022
+.Dd July 11, 2022
.Dt ZPOOL-UPGRADE 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool-wait.8 b/sys/contrib/openzfs/man/man8/zpool-wait.8
index 0ffb4badfb7b..28a51d29a913 100644
--- a/sys/contrib/openzfs/man/man8/zpool-wait.8
+++ b/sys/contrib/openzfs/man/man8/zpool-wait.8
@@ -28,7 +28,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd May 27, 2021
+.Dd January 29, 2024
.Dt ZPOOL-WAIT 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zpool.8 b/sys/contrib/openzfs/man/man8/zpool.8
index b96944050594..3bfef780b298 100644
--- a/sys/contrib/openzfs/man/man8/zpool.8
+++ b/sys/contrib/openzfs/man/man8/zpool.8
@@ -27,7 +27,7 @@
.\" Copyright 2017 Nexenta Systems, Inc.
.\" Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
.\"
-.Dd February 14, 2024
+.Dd November 19, 2024
.Dt ZPOOL 8
.Os
.
diff --git a/sys/contrib/openzfs/man/man8/zstream.8 b/sys/contrib/openzfs/man/man8/zstream.8
index 03a8479c9e6a..5b3d063bc4a5 100644
--- a/sys/contrib/openzfs/man/man8/zstream.8
+++ b/sys/contrib/openzfs/man/man8/zstream.8
@@ -21,7 +21,7 @@
.\"
.\" Copyright (c) 2020 by Delphix. All rights reserved.
.\"
-.Dd October 4, 2022
+.Dd November 10, 2022
.Dt ZSTREAM 8
.Os
.
diff --git a/sys/contrib/openzfs/module/Kbuild.in b/sys/contrib/openzfs/module/Kbuild.in
index 362d2295e091..58a80dc4402c 100644
--- a/sys/contrib/openzfs/module/Kbuild.in
+++ b/sys/contrib/openzfs/module/Kbuild.in
@@ -4,7 +4,7 @@
ZFS_MODULE_CFLAGS += -std=gnu99 -Wno-declaration-after-statement
ZFS_MODULE_CFLAGS += -Wmissing-prototypes
-ZFS_MODULE_CFLAGS += @KERNEL_DEBUG_CFLAGS@ @NO_FORMAT_ZERO_LENGTH@
+ZFS_MODULE_CFLAGS += @KERNEL_DEBUG_CFLAGS@ @KERNEL_NO_FORMAT_ZERO_LENGTH@
ifneq ($(KBUILD_EXTMOD),)
zfs_include = @abs_top_srcdir@/include
diff --git a/sys/contrib/openzfs/module/icp/algs/sha2/sha256_impl.c b/sys/contrib/openzfs/module/icp/algs/sha2/sha256_impl.c
index 6d3bcca9f995..dcb0a391dda4 100644
--- a/sys/contrib/openzfs/module/icp/algs/sha2/sha256_impl.c
+++ b/sys/contrib/openzfs/module/icp/algs/sha2/sha256_impl.c
@@ -38,11 +38,14 @@
kfpu_begin(); E(s, d, b); kfpu_end(); \
}
+#if defined(__x86_64) || defined(__aarch64__) || defined(__arm__) || \
+ defined(__PPC64__)
/* some implementation is always okay */
static inline boolean_t sha2_is_supported(void)
{
return (B_TRUE);
}
+#endif
#if defined(__x86_64)
diff --git a/sys/contrib/openzfs/module/icp/algs/sha2/sha512_impl.c b/sys/contrib/openzfs/module/icp/algs/sha2/sha512_impl.c
index 2efd9fcf4c99..a85a71a83df4 100644
--- a/sys/contrib/openzfs/module/icp/algs/sha2/sha512_impl.c
+++ b/sys/contrib/openzfs/module/icp/algs/sha2/sha512_impl.c
@@ -38,11 +38,14 @@
kfpu_begin(); E(s, d, b); kfpu_end(); \
}
+#if defined(__x86_64) || defined(__aarch64__) || defined(__arm__) || \
+ defined(__aarch64__) || defined(__arm__) || defined(__PPC64__)
/* some implementation is always okay */
static inline boolean_t sha2_is_supported(void)
{
return (B_TRUE);
}
+#endif
#if defined(__x86_64)
diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/sysctl_os.c b/sys/contrib/openzfs/module/os/freebsd/zfs/sysctl_os.c
index ace2360c032d..393bfaa65ff5 100644
--- a/sys/contrib/openzfs/module/os/freebsd/zfs/sysctl_os.c
+++ b/sys/contrib/openzfs/module/os/freebsd/zfs/sysctl_os.c
@@ -188,11 +188,6 @@ param_set_arc_max(SYSCTL_HANDLER_ARGS)
return (0);
}
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_max,
- CTLTYPE_ULONG | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
- NULL, 0, param_set_arc_max, "LU",
- "Maximum ARC size in bytes (LEGACY)");
-
int
param_set_arc_min(SYSCTL_HANDLER_ARGS)
{
@@ -217,11 +212,6 @@ param_set_arc_min(SYSCTL_HANDLER_ARGS)
return (0);
}
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_min,
- CTLTYPE_ULONG | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
- NULL, 0, param_set_arc_min, "LU",
- "Minimum ARC size in bytes (LEGACY)");
-
extern uint_t zfs_arc_free_target;
int
@@ -245,16 +235,6 @@ param_set_arc_free_target(SYSCTL_HANDLER_ARGS)
return (0);
}
-/*
- * NOTE: This sysctl is CTLFLAG_RW not CTLFLAG_RWTUN due to its dependency on
- * pagedaemon initialization.
- */
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_free_target,
- CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE,
- NULL, 0, param_set_arc_free_target, "IU",
- "Desired number of free pages below which ARC triggers reclaim"
- " (LEGACY)");
-
int
param_set_arc_no_grow_shift(SYSCTL_HANDLER_ARGS)
{
@@ -273,187 +253,6 @@ param_set_arc_no_grow_shift(SYSCTL_HANDLER_ARGS)
return (0);
}
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_no_grow_shift,
- CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
- NULL, 0, param_set_arc_no_grow_shift, "I",
- "log2(fraction of ARC which must be free to allow growing) (LEGACY)");
-
-extern uint64_t l2arc_write_max;
-
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_write_max,
- CTLFLAG_RWTUN, &l2arc_write_max, 0,
- "Max write bytes per interval (LEGACY)");
-
-extern uint64_t l2arc_write_boost;
-
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_write_boost,
- CTLFLAG_RWTUN, &l2arc_write_boost, 0,
- "Extra write bytes during device warmup (LEGACY)");
-
-extern uint64_t l2arc_headroom;
-
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_headroom,
- CTLFLAG_RWTUN, &l2arc_headroom, 0,
- "Number of max device writes to precache (LEGACY)");
-
-extern uint64_t l2arc_headroom_boost;
-
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_headroom_boost,
- CTLFLAG_RWTUN, &l2arc_headroom_boost, 0,
- "Compressed l2arc_headroom multiplier (LEGACY)");
-
-extern uint64_t l2arc_feed_secs;
-
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_feed_secs,
- CTLFLAG_RWTUN, &l2arc_feed_secs, 0,
- "Seconds between L2ARC writing (LEGACY)");
-
-extern uint64_t l2arc_feed_min_ms;
-
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, l2arc_feed_min_ms,
- CTLFLAG_RWTUN, &l2arc_feed_min_ms, 0,
- "Min feed interval in milliseconds (LEGACY)");
-
-extern int l2arc_noprefetch;
-
-SYSCTL_INT(_vfs_zfs, OID_AUTO, l2arc_noprefetch,
- CTLFLAG_RWTUN, &l2arc_noprefetch, 0,
- "Skip caching prefetched buffers (LEGACY)");
-
-extern int l2arc_feed_again;
-
-SYSCTL_INT(_vfs_zfs, OID_AUTO, l2arc_feed_again,
- CTLFLAG_RWTUN, &l2arc_feed_again, 0,
- "Turbo L2ARC warmup (LEGACY)");
-
-extern int l2arc_norw;
-
-SYSCTL_INT(_vfs_zfs, OID_AUTO, l2arc_norw,
- CTLFLAG_RWTUN, &l2arc_norw, 0,
- "No reads during writes (LEGACY)");
-
-static int
-param_get_arc_state_size(SYSCTL_HANDLER_ARGS)
-{
- arc_state_t *state = (arc_state_t *)arg1;
- int64_t val;
-
- val = zfs_refcount_count(&state->arcs_size[ARC_BUFC_DATA]) +
- zfs_refcount_count(&state->arcs_size[ARC_BUFC_METADATA]);
- return (sysctl_handle_64(oidp, &val, 0, req));
-}
-
-extern arc_state_t ARC_anon;
-
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, anon_size,
- CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
- &ARC_anon, 0, param_get_arc_state_size, "Q",
- "size of anonymous state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, anon_metadata_esize, CTLFLAG_RD,
- &ARC_anon.arcs_esize[ARC_BUFC_METADATA].rc_count, 0,
- "size of evictable metadata in anonymous state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, anon_data_esize, CTLFLAG_RD,
- &ARC_anon.arcs_esize[ARC_BUFC_DATA].rc_count, 0,
- "size of evictable data in anonymous state");
-
-extern arc_state_t ARC_mru;
-
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, mru_size,
- CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
- &ARC_mru, 0, param_get_arc_state_size, "Q",
- "size of mru state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mru_metadata_esize, CTLFLAG_RD,
- &ARC_mru.arcs_esize[ARC_BUFC_METADATA].rc_count, 0,
- "size of evictable metadata in mru state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mru_data_esize, CTLFLAG_RD,
- &ARC_mru.arcs_esize[ARC_BUFC_DATA].rc_count, 0,
- "size of evictable data in mru state");
-
-extern arc_state_t ARC_mru_ghost;
-
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, mru_ghost_size,
- CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
- &ARC_mru_ghost, 0, param_get_arc_state_size, "Q",
- "size of mru ghost state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mru_ghost_metadata_esize, CTLFLAG_RD,
- &ARC_mru_ghost.arcs_esize[ARC_BUFC_METADATA].rc_count, 0,
- "size of evictable metadata in mru ghost state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mru_ghost_data_esize, CTLFLAG_RD,
- &ARC_mru_ghost.arcs_esize[ARC_BUFC_DATA].rc_count, 0,
- "size of evictable data in mru ghost state");
-
-extern arc_state_t ARC_mfu;
-
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, mfu_size,
- CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
- &ARC_mfu, 0, param_get_arc_state_size, "Q",
- "size of mfu state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mfu_metadata_esize, CTLFLAG_RD,
- &ARC_mfu.arcs_esize[ARC_BUFC_METADATA].rc_count, 0,
- "size of evictable metadata in mfu state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mfu_data_esize, CTLFLAG_RD,
- &ARC_mfu.arcs_esize[ARC_BUFC_DATA].rc_count, 0,
- "size of evictable data in mfu state");
-
-extern arc_state_t ARC_mfu_ghost;
-
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, mfu_ghost_size,
- CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
- &ARC_mfu_ghost, 0, param_get_arc_state_size, "Q",
- "size of mfu ghost state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mfu_ghost_metadata_esize, CTLFLAG_RD,
- &ARC_mfu_ghost.arcs_esize[ARC_BUFC_METADATA].rc_count, 0,
- "size of evictable metadata in mfu ghost state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, mfu_ghost_data_esize, CTLFLAG_RD,
- &ARC_mfu_ghost.arcs_esize[ARC_BUFC_DATA].rc_count, 0,
- "size of evictable data in mfu ghost state");
-
-extern arc_state_t ARC_uncached;
-
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, uncached_size,
- CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
- &ARC_uncached, 0, param_get_arc_state_size, "Q",
- "size of uncached state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, uncached_metadata_esize, CTLFLAG_RD,
- &ARC_uncached.arcs_esize[ARC_BUFC_METADATA].rc_count, 0,
- "size of evictable metadata in uncached state");
-SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, uncached_data_esize, CTLFLAG_RD,
- &ARC_uncached.arcs_esize[ARC_BUFC_DATA].rc_count, 0,
- "size of evictable data in uncached state");
-
-extern arc_state_t ARC_l2c_only;
-
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, l2c_only_size,
- CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
- &ARC_l2c_only, 0, param_get_arc_state_size, "Q",
- "size of l2c_only state");
-
-/* dbuf.c */
-
-/* dmu.c */
-
-/* dmu_zfetch.c */
-
-SYSCTL_NODE(_vfs_zfs, OID_AUTO, zfetch, CTLFLAG_RW, 0, "ZFS ZFETCH (LEGACY)");
-
-extern uint32_t zfetch_max_distance;
-
-SYSCTL_UINT(_vfs_zfs_zfetch, OID_AUTO, max_distance,
- CTLFLAG_RWTUN, &zfetch_max_distance, 0,
- "Max bytes to prefetch per stream (LEGACY)");
-
-extern uint32_t zfetch_max_idistance;
-
-SYSCTL_UINT(_vfs_zfs_zfetch, OID_AUTO, max_idistance,
- CTLFLAG_RWTUN, &zfetch_max_idistance, 0,
- "Max bytes to prefetch indirects for per stream (LEGACY)");
-
-/* dsl_pool.c */
-
-/* dnode.c */
-
-/* dsl_scan.c */
-
/* metaslab.c */
int
@@ -514,19 +313,6 @@ SYSCTL_UINT(_vfs_zfs, OID_AUTO, condense_pct,
"Condense on-disk spacemap when it is more than this many percents"
" of in-memory counterpart");
-extern uint_t zfs_remove_max_segment;
-
-SYSCTL_UINT(_vfs_zfs, OID_AUTO, remove_max_segment,
- CTLFLAG_RWTUN, &zfs_remove_max_segment, 0,
- "Largest contiguous segment ZFS will attempt to allocate when removing"
- " a device");
-
-extern int zfs_removal_suspend_progress;
-
-SYSCTL_INT(_vfs_zfs, OID_AUTO, removal_suspend_progress,
- CTLFLAG_RWTUN, &zfs_removal_suspend_progress, 0,
- "Ensures certain actions can happen while in the middle of a removal");
-
/*
* Minimum size which forces the dynamic allocator to change
* it's allocation strategy. Once the space map cannot satisfy
@@ -749,12 +535,6 @@ param_set_min_auto_ashift(SYSCTL_HANDLER_ARGS)
return (0);
}
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, min_auto_ashift,
- CTLTYPE_UINT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
- &zfs_vdev_min_auto_ashift, sizeof (zfs_vdev_min_auto_ashift),
- param_set_min_auto_ashift, "IU",
- "Min ashift used when creating new top-level vdev. (LEGACY)");
-
int
param_set_max_auto_ashift(SYSCTL_HANDLER_ARGS)
{
@@ -774,13 +554,6 @@ param_set_max_auto_ashift(SYSCTL_HANDLER_ARGS)
return (0);
}
-SYSCTL_PROC(_vfs_zfs, OID_AUTO, max_auto_ashift,
- CTLTYPE_UINT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
- &zfs_vdev_max_auto_ashift, sizeof (zfs_vdev_max_auto_ashift),
- param_set_max_auto_ashift, "IU",
- "Max ashift used when optimizing for logical -> physical sector size on"
- " new top-level vdevs. (LEGACY)");
-
/*
* Since the DTL space map of a vdev is not expected to have a lot of
* entries, we default its block size to 4K.
@@ -802,23 +575,6 @@ SYSCTL_INT(_vfs_zfs, OID_AUTO, standard_sm_blksz,
CTLFLAG_RDTUN, &zfs_vdev_standard_sm_blksz, 0,
"Block size for standard space map. Power of 2 greater than 4096.");
-extern int vdev_validate_skip;
-
-SYSCTL_INT(_vfs_zfs, OID_AUTO, validate_skip,
- CTLFLAG_RDTUN, &vdev_validate_skip, 0,
- "Enable to bypass vdev_validate().");
-
-/* vdev_mirror.c */
-
-/* vdev_queue.c */
-
-extern uint_t zfs_vdev_max_active;
-
-SYSCTL_UINT(_vfs_zfs, OID_AUTO, top_maxinflight,
- CTLFLAG_RWTUN, &zfs_vdev_max_active, 0,
- "The maximum number of I/Os of all types active for each device."
- " (LEGACY)");
-
/* zio.c */
SYSCTL_INT(_vfs_zfs_zio, OID_AUTO, exclude_metadata,
diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
index 174141a5deab..120d97510c9e 100644
--- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
+++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
@@ -61,6 +61,7 @@
#include <sys/fs/zfs.h>
#include <sys/dmu.h>
#include <sys/dmu_objset.h>
+#include <sys/dsl_dataset.h>
#include <sys/spa.h>
#include <sys/txg.h>
#include <sys/dbuf.h>
@@ -5729,6 +5730,9 @@ zfs_freebsd_pathconf(struct vop_pathconf_args *ap)
{
ulong_t val;
int error;
+#ifdef _PC_CLONE_BLKSIZE
+ zfsvfs_t *zfsvfs;
+#endif
error = zfs_pathconf(ap->a_vp, ap->a_name, &val,
curthread->td_ucred, NULL);
@@ -5775,6 +5779,21 @@ zfs_freebsd_pathconf(struct vop_pathconf_args *ap)
*ap->a_retval = 1;
return (0);
#endif
+#ifdef _PC_CLONE_BLKSIZE
+ case _PC_CLONE_BLKSIZE:
+ zfsvfs = (zfsvfs_t *)ap->a_vp->v_mount->mnt_data;
+ if (zfs_bclone_enabled &&
+ spa_feature_is_enabled(dmu_objset_spa(zfsvfs->z_os),
+ SPA_FEATURE_BLOCK_CLONING))
+ *ap->a_retval = dsl_dataset_feature_is_active(
+ zfsvfs->z_os->os_dsl_dataset,
+ SPA_FEATURE_LARGE_BLOCKS) ?
+ SPA_MAXBLOCKSIZE :
+ SPA_OLD_MAXBLOCKSIZE;
+ else
+ *ap->a_retval = 0;
+ return (0);
+#endif
default:
return (vop_stdpathconf(ap));
}
diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zpl_ctldir.c b/sys/contrib/openzfs/module/os/linux/zfs/zpl_ctldir.c
index 48dae79a2373..81ac26cb0c93 100644
--- a/sys/contrib/openzfs/module/os/linux/zfs/zpl_ctldir.c
+++ b/sys/contrib/openzfs/module/os/linux/zfs/zpl_ctldir.c
@@ -202,7 +202,7 @@ zpl_snapdir_revalidate(struct dentry *dentry, unsigned int flags)
return (!!dentry->d_inode);
}
-static dentry_operations_t zpl_dops_snapdirs = {
+static const struct dentry_operations zpl_dops_snapdirs = {
/*
* Auto mounting of snapshots is only supported for 2.6.37 and
* newer kernels. Prior to this kernel the ops->follow_link()
@@ -215,6 +215,51 @@ static dentry_operations_t zpl_dops_snapdirs = {
.d_revalidate = zpl_snapdir_revalidate,
};
+/*
+ * For the .zfs control directory to work properly we must be able to override
+ * the default operations table and register custom .d_automount and
+ * .d_revalidate callbacks.
+ */
+static void
+set_snapdir_dentry_ops(struct dentry *dentry, unsigned int extraflags) {
+ static const unsigned int op_flags =
+ DCACHE_OP_HASH | DCACHE_OP_COMPARE |
+ DCACHE_OP_REVALIDATE | DCACHE_OP_DELETE |
+ DCACHE_OP_PRUNE | DCACHE_OP_WEAK_REVALIDATE | DCACHE_OP_REAL;
+
+#ifdef HAVE_D_SET_D_OP
+ /*
+ * d_set_d_op() will set the DCACHE_OP_ flags according to what it
+ * finds in the passed dentry_operations, so we don't have to.
+ *
+ * We clear the flags and the old op table before calling d_set_d_op()
+ * because issues a warning when the dentry operations table is already
+ * set.
+ */
+ dentry->d_op = NULL;
+ dentry->d_flags &= ~op_flags;
+ d_set_d_op(dentry, &zpl_dops_snapdirs);
+ dentry->d_flags |= extraflags;
+#else
+ /*
+ * Since 6.17 there's no exported way to modify dentry ops, so we have
+ * to reach in and do it ourselves. This should be safe for our very
+ * narrow use case, which is to create or splice in an entry to give
+ * access to a snapshot.
+ *
+ * We need to set the op flags directly. We hardcode
+ * DCACHE_OP_REVALIDATE because that's the only operation we have; if
+ * we ever extend zpl_dops_snapdirs we will need to update the op flags
+ * to match.
+ */
+ spin_lock(&dentry->d_lock);
+ dentry->d_op = &zpl_dops_snapdirs;
+ dentry->d_flags &= ~op_flags;
+ dentry->d_flags |= DCACHE_OP_REVALIDATE | extraflags;
+ spin_unlock(&dentry->d_lock);
+#endif
+}
+
static struct dentry *
zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry,
unsigned int flags)
@@ -236,10 +281,7 @@ zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry,
return (ERR_PTR(error));
ASSERT(error == 0 || ip == NULL);
- d_clear_d_op(dentry);
- d_set_d_op(dentry, &zpl_dops_snapdirs);
- dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
-
+ set_snapdir_dentry_ops(dentry, DCACHE_NEED_AUTOMOUNT);
return (d_splice_alias(ip, dentry));
}
@@ -373,8 +415,7 @@ zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, umode_t mode)
error = -zfsctl_snapdir_mkdir(dip, dname(dentry), vap, &ip, cr, 0);
if (error == 0) {
- d_clear_d_op(dentry);
- d_set_d_op(dentry, &zpl_dops_snapdirs);
+ set_snapdir_dentry_ops(dentry, 0);
d_instantiate(dentry, ip);
}
diff --git a/sys/contrib/openzfs/module/zfs/arc.c b/sys/contrib/openzfs/module/zfs/arc.c
index df41e3b49204..bd6dc8edd8ca 100644
--- a/sys/contrib/openzfs/module/zfs/arc.c
+++ b/sys/contrib/openzfs/module/zfs/arc.c
@@ -486,13 +486,13 @@ static taskq_t *arc_flush_taskq;
static uint_t zfs_arc_evict_threads = 0;
/* The 7 states: */
-arc_state_t ARC_anon;
-arc_state_t ARC_mru;
-arc_state_t ARC_mru_ghost;
-arc_state_t ARC_mfu;
-arc_state_t ARC_mfu_ghost;
-arc_state_t ARC_l2c_only;
-arc_state_t ARC_uncached;
+static arc_state_t ARC_anon;
+/* */ arc_state_t ARC_mru;
+static arc_state_t ARC_mru_ghost;
+/* */ arc_state_t ARC_mfu;
+static arc_state_t ARC_mfu_ghost;
+static arc_state_t ARC_l2c_only;
+static arc_state_t ARC_uncached;
arc_stats_t arc_stats = {
{ "hits", KSTAT_DATA_UINT64 },
@@ -832,15 +832,15 @@ typedef struct arc_async_flush {
#define L2ARC_FEED_TYPES 4
/* L2ARC Performance Tunables */
-uint64_t l2arc_write_max = L2ARC_WRITE_SIZE; /* def max write size */
-uint64_t l2arc_write_boost = L2ARC_WRITE_SIZE; /* extra warmup write */
-uint64_t l2arc_headroom = L2ARC_HEADROOM; /* # of dev writes */
-uint64_t l2arc_headroom_boost = L2ARC_HEADROOM_BOOST;
-uint64_t l2arc_feed_secs = L2ARC_FEED_SECS; /* interval seconds */
-uint64_t l2arc_feed_min_ms = L2ARC_FEED_MIN_MS; /* min interval msecs */
-int l2arc_noprefetch = B_TRUE; /* don't cache prefetch bufs */
-int l2arc_feed_again = B_TRUE; /* turbo warmup */
-int l2arc_norw = B_FALSE; /* no reads during writes */
+static uint64_t l2arc_write_max = L2ARC_WRITE_SIZE; /* def max write size */
+static uint64_t l2arc_write_boost = L2ARC_WRITE_SIZE; /* extra warmup write */
+static uint64_t l2arc_headroom = L2ARC_HEADROOM; /* # of dev writes */
+static uint64_t l2arc_headroom_boost = L2ARC_HEADROOM_BOOST;
+static uint64_t l2arc_feed_secs = L2ARC_FEED_SECS; /* interval seconds */
+static uint64_t l2arc_feed_min_ms = L2ARC_FEED_MIN_MS; /* min interval msecs */
+static int l2arc_noprefetch = B_TRUE; /* don't cache prefetch bufs */
+static int l2arc_feed_again = B_TRUE; /* turbo warmup */
+static int l2arc_norw = B_FALSE; /* no reads during writes */
static uint_t l2arc_meta_percent = 33; /* limit on headers size */
/*
diff --git a/sys/contrib/openzfs/module/zfs/ddt.c b/sys/contrib/openzfs/module/zfs/ddt.c
index d6658375f810..0dc9adc7fd4f 100644
--- a/sys/contrib/openzfs/module/zfs/ddt.c
+++ b/sys/contrib/openzfs/module/zfs/ddt.c
@@ -1701,9 +1701,11 @@ ddt_load(spa_t *spa)
}
}
- error = ddt_log_load(ddt);
- if (error != 0 && error != ENOENT)
- return (error);
+ if (ddt->ddt_flags & DDT_FLAG_LOG) {
+ error = ddt_log_load(ddt);
+ if (error != 0 && error != ENOENT)
+ return (error);
+ }
DDT_KSTAT_SET(ddt, dds_log_active_entries,
avl_numnodes(&ddt->ddt_log_active->ddl_tree));
diff --git a/sys/contrib/openzfs/module/zfs/ddt_log.c b/sys/contrib/openzfs/module/zfs/ddt_log.c
index 3d30e244c1f7..c9217cef4f7d 100644
--- a/sys/contrib/openzfs/module/zfs/ddt_log.c
+++ b/sys/contrib/openzfs/module/zfs/ddt_log.c
@@ -176,11 +176,13 @@ ddt_log_update_stats(ddt_t *ddt)
* that's reasonable to expect anyway.
*/
dmu_object_info_t doi;
- uint64_t nblocks;
- dmu_object_info(ddt->ddt_os, ddt->ddt_log_active->ddl_object, &doi);
- nblocks = doi.doi_physical_blocks_512;
- dmu_object_info(ddt->ddt_os, ddt->ddt_log_flushing->ddl_object, &doi);
- nblocks += doi.doi_physical_blocks_512;
+ uint64_t nblocks = 0;
+ if (dmu_object_info(ddt->ddt_os, ddt->ddt_log_active->ddl_object,
+ &doi) == 0)
+ nblocks += doi.doi_physical_blocks_512;
+ if (dmu_object_info(ddt->ddt_os, ddt->ddt_log_flushing->ddl_object,
+ &doi) == 0)
+ nblocks += doi.doi_physical_blocks_512;
ddt_object_t *ddo = &ddt->ddt_log_stats;
ddo->ddo_count =
diff --git a/sys/contrib/openzfs/module/zfs/dmu_zfetch.c b/sys/contrib/openzfs/module/zfs/dmu_zfetch.c
index 51165d0bf723..3d3a9c713568 100644
--- a/sys/contrib/openzfs/module/zfs/dmu_zfetch.c
+++ b/sys/contrib/openzfs/module/zfs/dmu_zfetch.c
@@ -57,19 +57,19 @@ static unsigned int zfetch_max_sec_reap = 2;
/* min bytes to prefetch per stream (default 2MB) */
static unsigned int zfetch_min_distance = 2 * 1024 * 1024;
/* max bytes to prefetch per stream (default 8MB) */
-unsigned int zfetch_max_distance = 8 * 1024 * 1024;
+static unsigned int zfetch_max_distance = 8 * 1024 * 1024;
#else
/* min bytes to prefetch per stream (default 4MB) */
static unsigned int zfetch_min_distance = 4 * 1024 * 1024;
/* max bytes to prefetch per stream (default 64MB) */
-unsigned int zfetch_max_distance = 64 * 1024 * 1024;
+static unsigned int zfetch_max_distance = 64 * 1024 * 1024;
#endif
/* max bytes to prefetch indirects for per stream (default 128MB) */
-unsigned int zfetch_max_idistance = 128 * 1024 * 1024;
+static unsigned int zfetch_max_idistance = 128 * 1024 * 1024;
/* max request reorder distance within a stream (default 16MB) */
-unsigned int zfetch_max_reorder = 16 * 1024 * 1024;
+static unsigned int zfetch_max_reorder = 16 * 1024 * 1024;
/* Max log2 fraction of holes in a stream */
-unsigned int zfetch_hole_shift = 2;
+static unsigned int zfetch_hole_shift = 2;
typedef struct zfetch_stats {
kstat_named_t zfetchstat_hits;
diff --git a/sys/contrib/openzfs/module/zfs/vdev.c b/sys/contrib/openzfs/module/zfs/vdev.c
index 9cf35e379000..ed04ce0c86eb 100644
--- a/sys/contrib/openzfs/module/zfs/vdev.c
+++ b/sys/contrib/openzfs/module/zfs/vdev.c
@@ -100,7 +100,7 @@ static uint_t zfs_vdev_default_ms_shift = 29;
/* upper limit for metaslab size (16G) */
static uint_t zfs_vdev_max_ms_shift = 34;
-int vdev_validate_skip = B_FALSE;
+static int vdev_validate_skip = B_FALSE;
/*
* Since the DTL space map of a vdev is not expected to have a lot of
diff --git a/sys/contrib/openzfs/module/zfs/vdev_queue.c b/sys/contrib/openzfs/module/zfs/vdev_queue.c
index c12713b107bf..e69e5598939e 100644
--- a/sys/contrib/openzfs/module/zfs/vdev_queue.c
+++ b/sys/contrib/openzfs/module/zfs/vdev_queue.c
@@ -122,7 +122,7 @@
* The maximum number of i/os active to each device. Ideally, this will be >=
* the sum of each queue's max_active.
*/
-uint_t zfs_vdev_max_active = 1000;
+static uint_t zfs_vdev_max_active = 1000;
/*
* Per-queue limits on the number of i/os active to each device. If the
diff --git a/sys/contrib/openzfs/module/zfs/vdev_removal.c b/sys/contrib/openzfs/module/zfs/vdev_removal.c
index 2f7a739da241..2ce0121324ad 100644
--- a/sys/contrib/openzfs/module/zfs/vdev_removal.c
+++ b/sys/contrib/openzfs/module/zfs/vdev_removal.c
@@ -105,7 +105,7 @@ static const uint_t zfs_remove_max_copy_bytes = 64 * 1024 * 1024;
*
* See also the accessor function spa_remove_max_segment().
*/
-uint_t zfs_remove_max_segment = SPA_MAXBLOCKSIZE;
+static uint_t zfs_remove_max_segment = SPA_MAXBLOCKSIZE;
/*
* Ignore hard IO errors during device removal. When set if a device
@@ -137,7 +137,7 @@ uint_t vdev_removal_max_span = 32 * 1024;
* This is used by the test suite so that it can ensure that certain
* actions happen while in the middle of a removal.
*/
-int zfs_removal_suspend_progress = 0;
+static int zfs_removal_suspend_progress = 0;
#define VDEV_REMOVAL_ZAP_OBJS "lzap"
diff --git a/sys/contrib/openzfs/module/zfs/zfeature.c b/sys/contrib/openzfs/module/zfs/zfeature.c
index 0816ea134bf3..4cf9e0dbb405 100644
--- a/sys/contrib/openzfs/module/zfs/zfeature.c
+++ b/sys/contrib/openzfs/module/zfs/zfeature.c
@@ -308,6 +308,7 @@ feature_sync(spa_t *spa, zfeature_info_t *feature, uint64_t refcount,
ASSERT(VALID_FEATURE_OR_NONE(feature->fi_feature));
uint64_t zapobj = (feature->fi_flags & ZFEATURE_FLAG_READONLY_COMPAT) ?
spa->spa_feat_for_write_obj : spa->spa_feat_for_read_obj;
+ ASSERT(MUTEX_HELD(&spa->spa_feat_stats_lock));
VERIFY0(zap_update(spa->spa_meta_objset, zapobj, feature->fi_guid,
sizeof (uint64_t), 1, &refcount, tx));
@@ -360,7 +361,9 @@ feature_enable_sync(spa_t *spa, zfeature_info_t *feature, dmu_tx_t *tx)
feature->fi_guid, 1, strlen(feature->fi_desc) + 1,
feature->fi_desc, tx));
+ mutex_enter(&spa->spa_feat_stats_lock);
feature_sync(spa, feature, initial_refcount, tx);
+ mutex_exit(&spa->spa_feat_stats_lock);
if (spa_feature_is_enabled(spa, SPA_FEATURE_ENABLED_TXG)) {
uint64_t enabling_txg = dmu_tx_get_txg(tx);
@@ -416,6 +419,7 @@ feature_do_action(spa_t *spa, spa_feature_t fid, feature_action_t action,
ASSERT(dmu_tx_is_syncing(tx));
ASSERT3U(spa_version(spa), >=, SPA_VERSION_FEATURES);
+ mutex_enter(&spa->spa_feat_stats_lock);
VERIFY3U(feature_get_refcount(spa, feature, &refcount), !=, ENOTSUP);
switch (action) {
@@ -433,6 +437,7 @@ feature_do_action(spa_t *spa, spa_feature_t fid, feature_action_t action,
}
feature_sync(spa, feature, refcount, tx);
+ mutex_exit(&spa->spa_feat_stats_lock);
}
void
diff --git a/sys/contrib/openzfs/module/zfs/zfs_ioctl.c b/sys/contrib/openzfs/module/zfs/zfs_ioctl.c
index 121b966b9864..76c9d4ccd51f 100644
--- a/sys/contrib/openzfs/module/zfs/zfs_ioctl.c
+++ b/sys/contrib/openzfs/module/zfs/zfs_ioctl.c
@@ -4726,7 +4726,7 @@ zfs_ioc_rollback(const char *fsname, nvlist_t *innvl, nvlist_t *outnvl)
error = error ? error : resume_err;
}
zfs_vfs_rele(zfsvfs);
- } else if ((zv = zvol_suspend(fsname)) != NULL) {
+ } else if (zvol_suspend(fsname, &zv) == 0) {
error = dsl_dataset_rollback(fsname, target, zvol_tag(zv),
outnvl);
zvol_resume(zv);
@@ -5448,7 +5448,7 @@ zfs_ioc_recv_impl(char *tofs, char *tosnap, const char *origin,
}
error = error ? error : end_err;
zfs_vfs_rele(zfsvfs);
- } else if ((zv = zvol_suspend(tofs)) != NULL) {
+ } else if (zvol_suspend(tofs, &zv) == 0) {
error = dmu_recv_end(&drc, zvol_tag(zv));
zvol_resume(zv);
} else {
diff --git a/sys/contrib/openzfs/module/zfs/zvol.c b/sys/contrib/openzfs/module/zfs/zvol.c
index 2fd3e1c37045..faced0db7e9e 100644
--- a/sys/contrib/openzfs/module/zfs/zvol.c
+++ b/sys/contrib/openzfs/module/zfs/zvol.c
@@ -1145,20 +1145,34 @@ zvol_tag(zvol_state_t *zv)
/*
* Suspend the zvol for recv and rollback.
*/
-zvol_state_t *
-zvol_suspend(const char *name)
+int
+zvol_suspend(const char *name, zvol_state_t **zvp)
{
zvol_state_t *zv;
zv = zvol_find_by_name(name, RW_WRITER);
if (zv == NULL)
- return (NULL);
+ return (SET_ERROR(ENOENT));
/* block all I/O, release in zvol_resume. */
ASSERT(MUTEX_HELD(&zv->zv_state_lock));
ASSERT(RW_WRITE_HELD(&zv->zv_suspend_lock));
+ /*
+ * If it's being removed, unlock and return error. It doesn't make any
+ * sense to try to suspend a zvol being removed, but being here also
+ * means that zvol_remove_minors_impl() is about to call zvol_remove()
+ * and then destroy the zvol_state_t, so returning a pointer to it for
+ * the caller to mess with would be a disaster anyway.
+ */
+ if (zv->zv_flags & ZVOL_REMOVING) {
+ mutex_exit(&zv->zv_state_lock);
+ rw_exit(&zv->zv_suspend_lock);
+ /* NB: Returning EIO here to match zfsvfs_teardown() */
+ return (SET_ERROR(EIO));
+ }
+
atomic_inc(&zv->zv_suspend_ref);
if (zv->zv_open_count > 0)
@@ -1171,7 +1185,8 @@ zvol_suspend(const char *name)
mutex_exit(&zv->zv_state_lock);
/* zv_suspend_lock is released in zvol_resume() */
- return (zv);
+ *zvp = zv;
+ return (0);
}
int
diff --git a/sys/contrib/openzfs/rpm/generic/zfs.spec.in b/sys/contrib/openzfs/rpm/generic/zfs.spec.in
index 1ce668e7b86d..edcfdd2d7136 100644
--- a/sys/contrib/openzfs/rpm/generic/zfs.spec.in
+++ b/sys/contrib/openzfs/rpm/generic/zfs.spec.in
@@ -509,7 +509,9 @@ systemctl --system daemon-reload >/dev/null || true
%{_bindir}/zvol_wait
# Optional Python 3 scripts
%{_bindir}/arc_summary
+%{_bindir}/zarcsummary
%{_bindir}/arcstat
+%{_bindir}/zarcstat
%{_bindir}/dbufstat
%{_bindir}/zilstat
# Man pages
diff --git a/sys/contrib/openzfs/tests/runfiles/linux.run b/sys/contrib/openzfs/tests/runfiles/linux.run
index f3d56acffde0..ba367fad402b 100644
--- a/sys/contrib/openzfs/tests/runfiles/linux.run
+++ b/sys/contrib/openzfs/tests/runfiles/linux.run
@@ -161,7 +161,7 @@ tests = ['mmp_on_thread', 'mmp_on_uberblocks', 'mmp_on_off', 'mmp_interval',
tags = ['functional', 'mmp']
[tests/functional/mount:Linux]
-tests = ['umount_unlinked_drain']
+tests = ['umount_unlinked_drain', 'mount_loopback']
tags = ['functional', 'mount']
[tests/functional/pam:Linux]
diff --git a/sys/contrib/openzfs/tests/zfs-tests/include/commands.cfg b/sys/contrib/openzfs/tests/zfs-tests/include/commands.cfg
index 884a99d785bc..580281b30d7e 100644
--- a/sys/contrib/openzfs/tests/zfs-tests/include/commands.cfg
+++ b/sys/contrib/openzfs/tests/zfs-tests/include/commands.cfg
@@ -100,6 +100,7 @@ export SYSTEM_FILES_COMMON='awk
uniq
vmstat
wc
+ which
xargs
xxh128sum'
@@ -146,6 +147,7 @@ export SYSTEM_FILES_LINUX='attr
lscpu
lsmod
lsscsi
+ mkfs.xfs
mkswap
modprobe
mountpoint
diff --git a/sys/contrib/openzfs/tests/zfs-tests/include/tunables.cfg b/sys/contrib/openzfs/tests/zfs-tests/include/tunables.cfg
index e273c9f85c28..f2d7ceac0cbb 100644
--- a/sys/contrib/openzfs/tests/zfs-tests/include/tunables.cfg
+++ b/sys/contrib/openzfs/tests/zfs-tests/include/tunables.cfg
@@ -73,8 +73,8 @@ OVERRIDE_ESTIMATE_RECORDSIZE send.override_estimate_recordsize zfs_override_esti
PREFETCH_DISABLE prefetch.disable zfs_prefetch_disable
RAIDZ_EXPAND_MAX_REFLOW_BYTES vdev.expand_max_reflow_bytes raidz_expand_max_reflow_bytes
REBUILD_SCRUB_ENABLED rebuild_scrub_enabled zfs_rebuild_scrub_enabled
-REMOVAL_SUSPEND_PROGRESS removal_suspend_progress zfs_removal_suspend_progress
-REMOVE_MAX_SEGMENT remove_max_segment zfs_remove_max_segment
+REMOVAL_SUSPEND_PROGRESS vdev.removal_suspend_progress zfs_removal_suspend_progress
+REMOVE_MAX_SEGMENT vdev.remove_max_segment zfs_remove_max_segment
RESILVER_MIN_TIME_MS resilver_min_time_ms zfs_resilver_min_time_ms
RESILVER_DEFER_PERCENT resilver_defer_percent zfs_resilver_defer_percent
SCAN_LEGACY scan_legacy zfs_scan_legacy
diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/Makefile.am b/sys/contrib/openzfs/tests/zfs-tests/tests/Makefile.am
index 41e7b45ef4ec..94db292c9518 100644
--- a/sys/contrib/openzfs/tests/zfs-tests/tests/Makefile.am
+++ b/sys/contrib/openzfs/tests/zfs-tests/tests/Makefile.am
@@ -1706,6 +1706,7 @@ nobase_dist_datadir_zfs_tests_tests_SCRIPTS += \
functional/mmp/setup.ksh \
functional/mount/cleanup.ksh \
functional/mount/setup.ksh \
+ functional/mount/mount_loopback.ksh \
functional/mount/umount_001.ksh \
functional/mount/umountall_001.ksh \
functional/mount/umount_unlinked_drain.ksh \
diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/fault/fault_limits.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/fault/fault_limits.ksh
index 1b3310edb98b..45b041503e22 100755
--- a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/fault/fault_limits.ksh
+++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/fault/fault_limits.ksh
@@ -67,7 +67,7 @@ log_must zpool create -f ${TESTPOOL} raidz${PARITY} ${disks[1..$((VDEV_CNT - 1))
# Add some data to the pool
log_must zfs create $TESTPOOL/fs
MNTPOINT="$(get_prop mountpoint $TESTPOOL/fs)"
-log_must fill_fs $MNTPOINT $PARITY 200 32768 1000 Z
+log_must fill_fs $MNTPOINT $PARITY 200 32768 100 R
sync_pool $TESTPOOL
# Replace the last child vdev to form a replacing vdev
diff --git a/sys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/mount_loopback.ksh b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/mount_loopback.ksh
new file mode 100755
index 000000000000..86adef7ea032
--- /dev/null
+++ b/sys/contrib/openzfs/tests/zfs-tests/tests/functional/mount/mount_loopback.ksh
@@ -0,0 +1,111 @@
+#!/bin/ksh -p
+# SPDX-License-Identifier: CDDL-1.0
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or https://opensource.org/licenses/CDDL-1.0.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+# Copyright (c) 2025 by Lawrence Livermore National Security, LLC.
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+# Verify that we can make an xfs filesystem on a ZFS-backed loopback device.
+#
+# See:
+# https://github.com/openzfs/zfs/pull/17298
+# https://github.com/openzfs/zfs/issues/17277
+#
+# STRATEGY:
+# 1. Make a pool
+# 2. Make a file on the pool or create zvol
+# 3. Mount the file/zvol behind a loopback device
+# 4. Create & mount an xfs filesystem on the loopback device
+
+function cleanup
+{
+ if [ -d $TEST_BASE_DIR/mnt ] ; then
+ umount $TEST_BASE_DIR/mnt
+ log_must rmdir $TEST_BASE_DIR/mnt
+ fi
+ if [ -n "$DEV" ] ; then
+ log_must losetup -d $DEV
+ fi
+ destroy_pool $TESTPOOL2
+ log_must rm -f $TEST_BASE_DIR/file1
+}
+
+if [ ! -x "$(which mkfs.xfs)" ] ; then
+ log_unsupported "No mkfs.xfs binary"
+fi
+
+if [ ! -d /lib/modules/$(uname -r)/kernel/fs/xfs ] && \
+ ! grep -qE '\sxfs$' /proc/filesystems ; then
+ log_unsupported "No XFS kernel support"
+fi
+
+log_assert "Make an xfs filesystem on a ZFS-backed loopback device"
+log_onexit cleanup
+
+# fio options
+export NUMJOBS=2
+export RUNTIME=3
+export PERF_RANDSEED=1234
+export PERF_COMPPERCENT=66
+export PERF_COMPCHUNK=0
+export BLOCKSIZE=128K
+export SYNC_TYPE=0
+export FILE_SIZE=$(( 1024 * 1024 ))
+
+function do_test
+{
+ imgfile=$1
+ log_note "Running test on $imgfile"
+ log_must losetup -f $imgfile
+ DEV=$(losetup --associated $imgfile | grep -Eo '^/dev/loop[0-9]+')
+ log_must mkfs.xfs $DEV
+ mkdir $TEST_BASE_DIR/mnt
+ log_must mount $DEV $TEST_BASE_DIR/mnt
+ export DIRECTORY=$TEST_BASE_DIR/mnt
+
+ for d in 0 1 ; do
+ # fio options
+ export DIRECT=$d
+ log_must fio $FIO_SCRIPTS/mkfiles.fio
+ log_must fio $FIO_SCRIPTS/random_reads.fio
+ done
+ log_must umount $TEST_BASE_DIR/mnt
+ log_must rmdir $TEST_BASE_DIR/mnt
+ log_must losetup -d $DEV
+ DEV=""
+}
+
+log_must truncate -s 1G $TEST_BASE_DIR/file1
+log_must zpool create $TESTPOOL2 $TEST_BASE_DIR/file1
+log_must truncate -s 512M /$TESTPOOL2/img
+do_test /$TESTPOOL2/img
+log_must rm /$TESTPOOL2/img
+log_must zfs create -V 512M $TESTPOOL2/vol
+
+blkdev="$ZVOL_DEVDIR/$TESTPOOL2/vol"
+block_device_wait $blkdev
+do_test $blkdev
+
+log_pass "Verified xfs filesystem on a ZFS-backed loopback device"
diff --git a/sys/ddb/db_ps.c b/sys/ddb/db_ps.c
index 733c440f5ee3..a26cf8161294 100644
--- a/sys/ddb/db_ps.c
+++ b/sys/ddb/db_ps.c
@@ -459,12 +459,11 @@ DB_SHOW_COMMAND(proc, db_show_proc)
db_printf("??? (%#x)\n", p->p_state);
}
if (p->p_ucred != NULL) {
- db_printf(" uid: %d gids: ", p->p_ucred->cr_uid);
- for (i = 0; i < p->p_ucred->cr_ngroups; i++) {
- db_printf("%d", p->p_ucred->cr_groups[i]);
- if (i < (p->p_ucred->cr_ngroups - 1))
- db_printf(", ");
- }
+ db_printf(" uid: %d gid: %d supp gids: ",
+ p->p_ucred->cr_uid, p->p_ucred->cr_gid);
+ for (i = 0; i < p->p_ucred->cr_ngroups; i++)
+ db_printf(i == 0 ? "%d" : ", %d",
+ p->p_ucred->cr_groups[i]);
db_printf("\n");
}
if (p->p_pptr != NULL)
diff --git a/sys/dev/ahci/ahci_pci.c b/sys/dev/ahci/ahci_pci.c
index f29d803e99a8..82f56fc0d19e 100644
--- a/sys/dev/ahci/ahci_pci.c
+++ b/sys/dev/ahci/ahci_pci.c
@@ -195,6 +195,7 @@ static const struct {
{0x1f3f8086, 0x00, "Intel Avoton (RAID)", 0},
{0x23a38086, 0x00, "Intel Coleto Creek", 0},
{0x31e38086, 0x00, "Intel Gemini Lake", 0},
+ {0x4b638086, 0x00, "Intel Elkhart Lake", 0},
{0x5ae38086, 0x00, "Intel Apollo Lake", 0},
{0x7ae28086, 0x00, "Intel Alder Lake", 0},
{0x8c028086, 0x00, "Intel Lynx Point", 0},
diff --git a/sys/dev/axgbe/if_axgbe_pci.c b/sys/dev/axgbe/if_axgbe_pci.c
index 290156ff11ca..6bc4bd33e162 100644
--- a/sys/dev/axgbe/if_axgbe_pci.c
+++ b/sys/dev/axgbe/if_axgbe_pci.c
@@ -2415,7 +2415,8 @@ axgbe_if_get_counter(if_ctx_t ctx, ift_counter cnt)
case IFCOUNTER_OPACKETS:
return (pstats->txframecount_gb);
case IFCOUNTER_OERRORS:
- return (pstats->txframecount_gb - pstats->txframecount_g);
+ return (if_get_counter_default(ifp, cnt) +
+ pstats->txframecount_gb - pstats->txframecount_g);
case IFCOUNTER_IBYTES:
return (pstats->rxoctetcount_gb);
case IFCOUNTER_OBYTES:
diff --git a/sys/dev/cyapa/cyapa.c b/sys/dev/cyapa/cyapa.c
index 50fa4faa560a..ed755f992949 100644
--- a/sys/dev/cyapa/cyapa.c
+++ b/sys/dev/cyapa/cyapa.c
@@ -761,42 +761,60 @@ again:
/*
* Generate report
*/
- c0 = 0;
- if (delta_x < 0)
- c0 |= 0x10;
- if (delta_y < 0)
- c0 |= 0x20;
- c0 |= 0x08;
- if (but & CYAPA_FNGR_LEFT)
- c0 |= 0x01;
- if (but & CYAPA_FNGR_MIDDLE)
- c0 |= 0x04;
- if (but & CYAPA_FNGR_RIGHT)
- c0 |= 0x02;
-
- fifo_write_char(sc, &sc->rfifo, c0);
- fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_x);
- fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_y);
- switch(sc->zenabled) {
- case 1:
- /* Z axis all 8 bits */
- fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_z);
- break;
- case 2:
- /*
- * Z axis low 4 bits + 4th button and 5th button
- * (high 2 bits must be left 0). Auto-scale
- * delta_z to fit to avoid a wrong-direction
- * overflow (don't try to retain the remainder).
- */
- while (delta_z > 7 || delta_z < -8)
- delta_z >>= 1;
- c0 = (uint8_t)delta_z & 0x0F;
+ if (sc->mode.level == 1) {
+ c0 = MOUSE_SYS_SYNC;
+ if (but & CYAPA_FNGR_LEFT)
+ c0 |= MOUSE_SYS_BUTTON1UP;
+ if (but & CYAPA_FNGR_MIDDLE)
+ c0 |= MOUSE_SYS_BUTTON2UP;
+ if (but & CYAPA_FNGR_RIGHT)
+ c0 |= MOUSE_SYS_BUTTON3UP;
fifo_write_char(sc, &sc->rfifo, c0);
- break;
- default:
- /* basic PS/2 */
- break;
+ fifo_write_char(sc, &sc->rfifo, delta_x >> 1);
+ fifo_write_char(sc, &sc->rfifo, delta_y >> 1);
+ fifo_write_char(sc, &sc->rfifo, delta_x - (delta_x >> 1));
+ fifo_write_char(sc, &sc->rfifo, delta_y - (delta_y >> 1));
+ fifo_write_char(sc, &sc->rfifo, delta_z >> 1);
+ fifo_write_char(sc, &sc->rfifo, delta_z - (delta_z >> 1));
+ fifo_write_char(sc, &sc->rfifo, MOUSE_SYS_EXTBUTTONS);
+ } else {
+ c0 = 0;
+ if (delta_x < 0)
+ c0 |= 0x10;
+ if (delta_y < 0)
+ c0 |= 0x20;
+ c0 |= 0x08;
+ if (but & CYAPA_FNGR_LEFT)
+ c0 |= 0x01;
+ if (but & CYAPA_FNGR_MIDDLE)
+ c0 |= 0x04;
+ if (but & CYAPA_FNGR_RIGHT)
+ c0 |= 0x02;
+
+ fifo_write_char(sc, &sc->rfifo, c0);
+ fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_x);
+ fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_y);
+ switch(sc->zenabled) {
+ case 1:
+ /* Z axis all 8 bits */
+ fifo_write_char(sc, &sc->rfifo, (uint8_t)delta_z);
+ break;
+ case 2:
+ /*
+ * Z axis low 4 bits + 4th button and 5th button
+ * (high 2 bits must be left 0). Auto-scale
+ * delta_z to fit to avoid a wrong-direction
+ * overflow (don't try to retain the remainder).
+ */
+ while (delta_z > 7 || delta_z < -8)
+ delta_z >>= 1;
+ c0 = (uint8_t)delta_z & 0x0F;
+ fifo_write_char(sc, &sc->rfifo, c0);
+ break;
+ default:
+ /* basic PS/2 */
+ break;
+ }
}
cyapa_notify(sc);
}
@@ -1205,6 +1223,11 @@ cyapaioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread
((mousemode_t *)data)->packetsize =
MOUSE_PS2_PACKETSIZE;
break;
+ case 1:
+ ((mousemode_t *)data)->protocol = MOUSE_PROTO_SYSMOUSE;
+ ((mousemode_t *)data)->packetsize =
+ MOUSE_SYS_PACKETSIZE;
+ break;
case 2:
((mousemode_t *)data)->protocol = MOUSE_PROTO_PS2;
((mousemode_t *)data)->packetsize =
@@ -1223,7 +1246,7 @@ cyapaioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread
error = EINVAL;
break;
}
- sc->mode.level = *(int *)data ? 2 : 0;
+ sc->mode.level = *(int *)data;
sc->zenabled = sc->mode.level ? 1 : 0;
break;
diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index 9c5ae2806f75..60959fe679b8 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -4782,8 +4782,8 @@ em_if_get_counter(if_ctx_t ctx, ift_counter cnt)
sc->stats.ruc + sc->stats.roc +
sc->stats.mpc + sc->stats.cexterr);
case IFCOUNTER_OERRORS:
- return (sc->stats.ecol + sc->stats.latecol +
- sc->watchdog_events);
+ return (if_get_counter_default(ifp, cnt) +
+ sc->stats.ecol + sc->stats.latecol + sc->watchdog_events);
default:
return (if_get_counter_default(ifp, cnt));
}
diff --git a/sys/dev/enetc/if_enetc.c b/sys/dev/enetc/if_enetc.c
index 3a5d6ec23282..808397b229a7 100644
--- a/sys/dev/enetc/if_enetc.c
+++ b/sys/dev/enetc/if_enetc.c
@@ -1343,7 +1343,8 @@ enetc_get_counter(if_ctx_t ctx, ift_counter cnt)
case IFCOUNTER_IERRORS:
return (ENETC_PORT_RD8(sc, ENETC_PM0_RERR));
case IFCOUNTER_OERRORS:
- return (ENETC_PORT_RD8(sc, ENETC_PM0_TERR));
+ return (if_get_counter_default(ifp, cnt) +
+ ENETC_PORT_RD8(sc, ENETC_PM0_TERR));
default:
return (if_get_counter_default(ifp, cnt));
}
diff --git a/sys/dev/gpio/gpioled.c b/sys/dev/gpio/gpioled.c
index ba53cb733971..71af5741b2fe 100644
--- a/sys/dev/gpio/gpioled.c
+++ b/sys/dev/gpio/gpioled.c
@@ -55,13 +55,13 @@
device_get_nameunit((_sc)->sc_dev), "gpioled", MTX_DEF)
#define GPIOLED_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx)
-struct gpioled_softc
+struct gpioled_softc
{
device_t sc_dev;
device_t sc_busdev;
struct mtx sc_mtx;
struct cdev *sc_leddev;
- int sc_invert;
+ int sc_softinvert;
};
static void gpioled_control(void *, int);
@@ -69,20 +69,19 @@ static int gpioled_probe(device_t);
static int gpioled_attach(device_t);
static int gpioled_detach(device_t);
-static void
+static void
gpioled_control(void *priv, int onoff)
{
struct gpioled_softc *sc;
sc = (struct gpioled_softc *)priv;
+ if (onoff == -1) /* Keep the current state. */
+ return;
+ if (sc->sc_softinvert)
+ onoff = !onoff;
GPIOLED_LOCK(sc);
- if (GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, GPIOLED_PIN,
- GPIO_PIN_OUTPUT) == 0) {
- if (sc->sc_invert)
- onoff = !onoff;
- GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev, GPIOLED_PIN,
- onoff ? GPIO_PIN_HIGH : GPIO_PIN_LOW);
- }
+ GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev, GPIOLED_PIN,
+ onoff ? GPIO_PIN_HIGH : GPIO_PIN_LOW);
GPIOLED_UNLOCK(sc);
}
@@ -95,26 +94,101 @@ gpioled_probe(device_t dev)
}
static int
+gpioled_inv(device_t dev, uint32_t *pin_flags)
+{
+ struct gpioled_softc *sc;
+ int invert;
+ uint32_t pin_caps;
+
+ sc = device_get_softc(dev);
+
+ if (resource_int_value(device_get_name(dev),
+ device_get_unit(dev), "invert", &invert))
+ invert = 0;
+
+ if (GPIOBUS_PIN_GETCAPS(sc->sc_busdev, sc->sc_dev, GPIOLED_PIN,
+ &pin_caps) != 0) {
+ if (bootverbose)
+ device_printf(sc->sc_dev, "unable to get pin caps\n");
+ return (-1);
+ }
+ if (pin_caps & GPIO_PIN_INVOUT)
+ *pin_flags &= ~GPIO_PIN_INVOUT;
+ sc->sc_softinvert = 0;
+ if (invert) {
+ const char *invmode;
+
+ if (resource_string_value(device_get_name(dev),
+ device_get_unit(dev), "invmode", &invmode))
+ invmode = NULL;
+
+ if (invmode) {
+ if (!strcmp(invmode, "sw"))
+ sc->sc_softinvert = 1;
+ else if (!strcmp(invmode, "hw")) {
+ if (pin_caps & GPIO_PIN_INVOUT)
+ *pin_flags |= GPIO_PIN_INVOUT;
+ else {
+ device_printf(sc->sc_dev, "hardware pin inversion not supported\n");
+ return (-1);
+ }
+ } else {
+ if (strcmp(invmode, "auto") != 0)
+ device_printf(sc->sc_dev, "invalid pin inversion mode\n");
+ invmode = NULL;
+ }
+ }
+ /*
+ * auto inversion mode: use hardware support if available, else fallback to
+ * software emulation.
+ */
+ if (invmode == NULL) {
+ if (pin_caps & GPIO_PIN_INVOUT)
+ *pin_flags |= GPIO_PIN_INVOUT;
+ else
+ sc->sc_softinvert = 1;
+ }
+ }
+ MPASS(!invert ||
+ (((*pin_flags & GPIO_PIN_INVOUT) != 0) && !sc->sc_softinvert) ||
+ (((*pin_flags & GPIO_PIN_INVOUT) == 0) && sc->sc_softinvert));
+ return (invert);
+}
+
+static int
gpioled_attach(device_t dev)
{
struct gpioled_softc *sc;
int state;
const char *name;
+ uint32_t pin_flags;
+ int invert;
sc = device_get_softc(dev);
sc->sc_dev = dev;
sc->sc_busdev = device_get_parent(dev);
GPIOLED_LOCK_INIT(sc);
- state = 0;
-
- if (resource_string_value(device_get_name(dev),
+ if (resource_string_value(device_get_name(dev),
device_get_unit(dev), "name", &name))
name = NULL;
- resource_int_value(device_get_name(dev),
- device_get_unit(dev), "invert", &sc->sc_invert);
- resource_int_value(device_get_name(dev),
- device_get_unit(dev), "state", &state);
+
+ if (resource_int_value(device_get_name(dev),
+ device_get_unit(dev), "state", &state))
+ state = 0;
+
+ pin_flags = GPIO_PIN_OUTPUT;
+ invert = gpioled_inv(dev, &pin_flags);
+ if (invert < 0)
+ return (ENXIO);
+ device_printf(sc->sc_dev, "state %d invert %s\n",
+ state, (invert ? (sc->sc_softinvert ? "sw" : "hw") : "no"));
+ if (GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, GPIOLED_PIN,
+ pin_flags) != 0) {
+ if (bootverbose)
+ device_printf(sc->sc_dev, "unable to set pin flags, %#x\n", pin_flags);
+ return (ENXIO);
+ }
sc->sc_leddev = led_create_state(gpioled_control, sc, name ? name :
device_get_nameunit(dev), state);
diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c
index 9b85c989dc96..a6a6ae68996c 100644
--- a/sys/dev/hwpmc/hwpmc_mod.c
+++ b/sys/dev/hwpmc/hwpmc_mod.c
@@ -210,7 +210,7 @@ static int pmc_attach_one_process(struct proc *p, struct pmc *pm);
static bool pmc_can_allocate_row(int ri, enum pmc_mode mode);
static bool pmc_can_allocate_rowindex(struct proc *p, unsigned int ri,
int cpu);
-static int pmc_can_attach(struct pmc *pm, struct proc *p);
+static bool pmc_can_attach(struct pmc *pm, struct proc *p);
static void pmc_capture_user_callchain(int cpu, int soft,
struct trapframe *tf);
static void pmc_cleanup(void);
@@ -1029,19 +1029,19 @@ pmc_unlink_target_process(struct pmc *pm, struct pmc_process *pp)
* Check if PMC 'pm' may be attached to target process 't'.
*/
-static int
+static bool
pmc_can_attach(struct pmc *pm, struct proc *t)
{
struct proc *o; /* pmc owner */
struct ucred *oc, *tc; /* owner, target credentials */
- int decline_attach, i;
+ bool decline_attach;
/*
* A PMC's owner can always attach that PMC to itself.
*/
if ((o = pm->pm_owner->po_owner) == t)
- return 0;
+ return (true);
PROC_LOCK(o);
oc = o->p_ucred;
@@ -1066,18 +1066,17 @@ pmc_can_attach(struct pmc *pm, struct proc *t)
* Every one of the target's group ids, must be in the owner's
* group list.
*/
- for (i = 0; !decline_attach && i < tc->cr_ngroups; i++)
+ for (int i = 0; !decline_attach && i < tc->cr_ngroups; i++)
decline_attach = !groupmember(tc->cr_groups[i], oc);
-
- /* check the read and saved gids too */
- if (decline_attach == 0)
- decline_attach = !groupmember(tc->cr_rgid, oc) ||
+ if (!decline_attach)
+ decline_attach = !groupmember(tc->cr_gid, oc) ||
+ !groupmember(tc->cr_rgid, oc) ||
!groupmember(tc->cr_svgid, oc);
crfree(tc);
crfree(oc);
- return !decline_attach;
+ return (!decline_attach);
}
/*
@@ -1412,7 +1411,7 @@ pmc_process_exec(struct thread *td, struct pmckern_procexec *pk)
*/
for (ri = 0; ri < md->pmd_npmc; ri++) {
if ((pm = pp->pp_pmcs[ri].pp_pmc) != NULL) {
- if (pmc_can_attach(pm, td->td_proc) != 0) {
+ if (pmc_can_attach(pm, td->td_proc)) {
pmc_detach_one_process(td->td_proc, pm,
PMC_FLAG_NONE);
}
diff --git a/sys/dev/hwt/hwt_ioctl.c b/sys/dev/hwt/hwt_ioctl.c
index 592db4931bb4..184c7e72f986 100644
--- a/sys/dev/hwt/hwt_ioctl.c
+++ b/sys/dev/hwt/hwt_ioctl.c
@@ -112,12 +112,11 @@ hwt_priv_check(struct proc *o, struct proc *t)
error = EPERM;
goto done;
}
-
- /* Check the read and saved GIDs too. */
- if (!groupmember(tc->cr_rgid, oc) ||
+ if (!groupmember(tc->cr_gid, oc) ||
+ !groupmember(tc->cr_rgid, oc) ||
!groupmember(tc->cr_svgid, oc)) {
- error = EPERM;
- goto done;
+ error = EPERM;
+ goto done;
}
done:
diff --git a/sys/dev/ice/ice_lib.c b/sys/dev/ice/ice_lib.c
index 442111e5ffaf..8b6349f686eb 100644
--- a/sys/dev/ice/ice_lib.c
+++ b/sys/dev/ice/ice_lib.c
@@ -7818,7 +7818,8 @@ ice_get_ifnet_counter(struct ice_vsi *vsi, ift_counter counter)
case IFCOUNTER_OPACKETS:
return (es->tx_unicast + es->tx_multicast + es->tx_broadcast);
case IFCOUNTER_OERRORS:
- return (es->tx_errors);
+ return (if_get_counter_default(vsi->sc->ifp, counter) +
+ es->tx_errors);
case IFCOUNTER_COLLISIONS:
return (0);
case IFCOUNTER_IBYTES:
@@ -7832,7 +7833,8 @@ ice_get_ifnet_counter(struct ice_vsi *vsi, ift_counter counter)
case IFCOUNTER_IQDROPS:
return (es->rx_discards);
case IFCOUNTER_OQDROPS:
- return (hs->tx_dropped_link_down);
+ return (if_get_counter_default(vsi->sc->ifp, counter) +
+ hs->tx_dropped_link_down);
case IFCOUNTER_NOPROTO:
return (es->rx_unknown_protocol);
default:
diff --git a/sys/dev/ichsmb/ichsmb_pci.c b/sys/dev/ichsmb/ichsmb_pci.c
index 728bb942d503..e4d87fe1fed2 100644
--- a/sys/dev/ichsmb/ichsmb_pci.c
+++ b/sys/dev/ichsmb/ichsmb_pci.c
@@ -107,6 +107,7 @@
#define ID_COMETLAKE2 0x06a3
#define ID_TIGERLAKE 0xa0a3
#define ID_TIGERLAKE2 0x43a3
+#define ID_ELKHARTLAKE 0x4b23
#define ID_GEMINILAKE 0x31d4
#define ID_CEDARFORK 0x18df
#define ID_ICELAKE 0x34a3
@@ -206,6 +207,8 @@ static const struct pci_device_table ichsmb_devices[] = {
PCI_DESCR("Intel Tiger Lake SMBus controller") },
{ PCI_DEV(PCI_VENDOR_INTEL, ID_TIGERLAKE2),
PCI_DESCR("Intel Tiger Lake SMBus controller") },
+ { PCI_DEV(PCI_VENDOR_INTEL, ID_ELKHARTLAKE),
+ PCI_DESCR("Intel Elkhart Lake SMBus controller") },
{ PCI_DEV(PCI_VENDOR_INTEL, ID_GEMINILAKE),
PCI_DESCR("Intel Gemini Lake SMBus controller") },
{ PCI_DEV(PCI_VENDOR_INTEL, ID_CEDARFORK),
diff --git a/sys/dev/igc/if_igc.c b/sys/dev/igc/if_igc.c
index a1ae35c7aa43..f199a128c783 100644
--- a/sys/dev/igc/if_igc.c
+++ b/sys/dev/igc/if_igc.c
@@ -2599,8 +2599,8 @@ igc_if_get_counter(if_ctx_t ctx, ift_counter cnt)
sc->stats.ruc + sc->stats.roc +
sc->stats.mpc + sc->stats.htdpmc);
case IFCOUNTER_OERRORS:
- return (sc->stats.ecol + sc->stats.latecol +
- sc->watchdog_events);
+ return (if_get_counter_default(ifp, cnt) +
+ sc->stats.ecol + sc->stats.latecol + sc->watchdog_events);
default:
return (if_get_counter_default(ifp, cnt));
}
diff --git a/sys/dev/iommu/busdma_iommu.c b/sys/dev/iommu/busdma_iommu.c
index 6856b0551dde..668ccf056463 100644
--- a/sys/dev/iommu/busdma_iommu.c
+++ b/sys/dev/iommu/busdma_iommu.c
@@ -114,8 +114,8 @@ iommu_bus_dma_is_dev_disabled(int domain, int bus, int slot, int func)
* domain, and must collectively be assigned to use either IOMMU or
* bounce mapping.
*/
-device_t
-iommu_get_requester(device_t dev, uint16_t *rid)
+int
+iommu_get_requester(device_t dev, device_t *requesterp, uint16_t *rid)
{
devclass_t pci_class;
device_t l, pci, pcib, pcip, pcibp, requester;
@@ -129,7 +129,8 @@ iommu_get_requester(device_t dev, uint16_t *rid)
pci = device_get_parent(dev);
if (pci == NULL || device_get_devclass(pci) != pci_class) {
*rid = 0; /* XXXKIB: Could be ACPI HID */
- return (requester);
+ *requesterp = NULL;
+ return (ENOTTY);
}
*rid = pci_get_rid(dev);
@@ -141,16 +142,39 @@ iommu_get_requester(device_t dev, uint16_t *rid)
*/
for (;;) {
pci = device_get_parent(l);
- KASSERT(pci != NULL, ("iommu_get_requester(%s): NULL parent "
- "for %s", device_get_name(dev), device_get_name(l)));
- KASSERT(device_get_devclass(pci) == pci_class,
- ("iommu_get_requester(%s): non-pci parent %s for %s",
- device_get_name(dev), device_get_name(pci),
- device_get_name(l)));
+ if (pci == NULL) {
+ if (bootverbose) {
+ printf(
+ "iommu_get_requester(%s): NULL parent for %s\n",
+ device_get_name(dev), device_get_name(l));
+ }
+ *rid = 0;
+ *requesterp = NULL;
+ return (ENXIO);
+ }
+ if (device_get_devclass(pci) != pci_class) {
+ if (bootverbose) {
+ printf(
+ "iommu_get_requester(%s): non-pci parent %s for %s\n",
+ device_get_name(dev), device_get_name(pci),
+ device_get_name(l));
+ }
+ *rid = 0;
+ *requesterp = NULL;
+ return (ENXIO);
+ }
pcib = device_get_parent(pci);
- KASSERT(pcib != NULL, ("iommu_get_requester(%s): NULL bridge "
- "for %s", device_get_name(dev), device_get_name(pci)));
+ if (pcib == NULL) {
+ if (bootverbose) {
+ printf(
+ "iommu_get_requester(%s): NULL bridge for %s\n",
+ device_get_name(dev), device_get_name(pci));
+ }
+ *rid = 0;
+ *requesterp = NULL;
+ return (ENXIO);
+ }
/*
* The parent of our "bridge" isn't another PCI bus,
@@ -229,7 +253,8 @@ iommu_get_requester(device_t dev, uint16_t *rid)
}
}
}
- return (requester);
+ *requesterp = requester;
+ return (0);
}
struct iommu_ctx *
@@ -237,10 +262,13 @@ iommu_instantiate_ctx(struct iommu_unit *unit, device_t dev, bool rmrr)
{
device_t requester;
struct iommu_ctx *ctx;
+ int error;
bool disabled;
uint16_t rid;
- requester = iommu_get_requester(dev, &rid);
+ error = iommu_get_requester(dev, &requester, &rid);
+ if (error != 0)
+ return (NULL);
/*
* If the user requested the IOMMU disabled for the device, we
diff --git a/sys/dev/iommu/iommu.h b/sys/dev/iommu/iommu.h
index b1858f0df9f7..55044042c5d2 100644
--- a/sys/dev/iommu/iommu.h
+++ b/sys/dev/iommu/iommu.h
@@ -170,7 +170,7 @@ void iommu_domain_unload(struct iommu_domain *domain,
void iommu_unit_pre_instantiate_ctx(struct iommu_unit *iommu);
struct iommu_ctx *iommu_instantiate_ctx(struct iommu_unit *iommu,
device_t dev, bool rmrr);
-device_t iommu_get_requester(device_t dev, uint16_t *rid);
+int iommu_get_requester(device_t dev, device_t *requester, uint16_t *rid);
int iommu_init_busdma(struct iommu_unit *unit);
void iommu_fini_busdma(struct iommu_unit *unit);
diff --git a/sys/dev/irdma/irdma_cm.c b/sys/dev/irdma/irdma_cm.c
index 450fae662dd8..d4d4f328fb43 100644
--- a/sys/dev/irdma/irdma_cm.c
+++ b/sys/dev/irdma/irdma_cm.c
@@ -1316,7 +1316,7 @@ irdma_cm_timer_tick(struct timer_list *t)
struct irdma_timer_entry *send_entry, *close_entry;
struct list_head *list_core_temp;
struct list_head *list_node;
- struct irdma_cm_core *cm_core = from_timer(cm_core, t, tcp_timer);
+ struct irdma_cm_core *cm_core = timer_container_of(cm_core, t, tcp_timer);
struct irdma_sc_vsi *vsi;
u32 settimer = 0;
unsigned long timetosend;
diff --git a/sys/dev/irdma/irdma_utils.c b/sys/dev/irdma/irdma_utils.c
index 5fc37022981f..038f1980082b 100644
--- a/sys/dev/irdma/irdma_utils.c
+++ b/sys/dev/irdma/irdma_utils.c
@@ -876,7 +876,7 @@ irdma_terminate_done(struct irdma_sc_qp *qp, int timeout_occurred)
static void
irdma_terminate_timeout(struct timer_list *t)
{
- struct irdma_qp *iwqp = from_timer(iwqp, t, terminate_timer);
+ struct irdma_qp *iwqp = timer_container_of(iwqp, t, terminate_timer);
struct irdma_sc_qp *qp = &iwqp->sc_qp;
irdma_terminate_done(qp, 1);
@@ -1528,7 +1528,7 @@ static void
irdma_hw_stats_timeout(struct timer_list *t)
{
struct irdma_vsi_pestat *pf_devstat =
- from_timer(pf_devstat, t, stats_timer);
+ timer_container_of(pf_devstat, t, stats_timer);
struct irdma_sc_vsi *sc_vsi = pf_devstat->vsi;
if (sc_vsi->dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2)
diff --git a/sys/dev/ixgbe/if_ix.c b/sys/dev/ixgbe/if_ix.c
index 73c0fd1ab16f..6d08bd49bc04 100644
--- a/sys/dev/ixgbe/if_ix.c
+++ b/sys/dev/ixgbe/if_ix.c
@@ -184,6 +184,7 @@ static int ixgbe_if_rx_queues_alloc(if_ctx_t, caddr_t *, uint64_t *, int,
int);
static void ixgbe_if_queues_free(if_ctx_t);
static void ixgbe_if_timer(if_ctx_t, uint16_t);
+static const char *ixgbe_link_speed_to_str(u32 link_speed);
static void ixgbe_if_update_admin_status(if_ctx_t);
static void ixgbe_if_vlan_register(if_ctx_t, u16);
static void ixgbe_if_vlan_unregister(if_ctx_t, u16);
@@ -1349,8 +1350,6 @@ ixgbe_if_get_counter(if_ctx_t ctx, ift_counter cnt)
return (0);
case IFCOUNTER_IQDROPS:
return (sc->iqdrops);
- case IFCOUNTER_OQDROPS:
- return (0);
case IFCOUNTER_IERRORS:
return (sc->ierrors);
default:
@@ -4027,6 +4026,33 @@ ixgbe_if_stop(if_ctx_t ctx)
} /* ixgbe_if_stop */
/************************************************************************
+ * ixgbe_link_speed_to_str - Convert link speed to string
+ *
+ * Helper function to convert link speed constants to human-readable
+ * string representations in conventional Gbps or Mbps.
+ ************************************************************************/
+static const char *
+ixgbe_link_speed_to_str(u32 link_speed)
+{
+ switch (link_speed) {
+ case IXGBE_LINK_SPEED_10GB_FULL:
+ return "10 Gbps";
+ case IXGBE_LINK_SPEED_5GB_FULL:
+ return "5 Gbps";
+ case IXGBE_LINK_SPEED_2_5GB_FULL:
+ return "2.5 Gbps";
+ case IXGBE_LINK_SPEED_1GB_FULL:
+ return "1 Gbps";
+ case IXGBE_LINK_SPEED_100_FULL:
+ return "100 Mbps";
+ case IXGBE_LINK_SPEED_10_FULL:
+ return "10 Mbps";
+ default:
+ return "Unknown";
+ }
+} /* ixgbe_link_speed_to_str */
+
+/************************************************************************
* ixgbe_update_link_status - Update OS on link state
*
* Note: Only updates the OS on the cached link state.
@@ -4042,9 +4068,9 @@ ixgbe_if_update_admin_status(if_ctx_t ctx)
if (sc->link_up) {
if (sc->link_active == false) {
if (bootverbose)
- device_printf(dev, "Link is up %d Gbps %s \n",
- ((sc->link_speed == 128) ? 10 : 1),
- "Full Duplex");
+ device_printf(dev,
+ "Link is up %s Full Duplex\n",
+ ixgbe_link_speed_to_str(sc->link_speed));
sc->link_active = true;
/* Update any Flow Control changes */
ixgbe_fc_enable(&sc->hw);
diff --git a/sys/dev/ixgbe/ixgbe_e610.c b/sys/dev/ixgbe/ixgbe_e610.c
index 95c6dca416c6..18c4612446e0 100644
--- a/sys/dev/ixgbe/ixgbe_e610.c
+++ b/sys/dev/ixgbe/ixgbe_e610.c
@@ -1400,40 +1400,6 @@ s32 ixgbe_aci_set_link_restart_an(struct ixgbe_hw *hw, bool ena_link)
}
/**
- * ixgbe_is_media_cage_present - check if media cage is present
- * @hw: pointer to the HW struct
- *
- * Identify presence of media cage using the ACI command (0x06E0).
- *
- * Return: true if media cage is present, else false. If no cage, then
- * media type is backplane or BASE-T.
- */
-static bool ixgbe_is_media_cage_present(struct ixgbe_hw *hw)
-{
- struct ixgbe_aci_cmd_get_link_topo *cmd;
- struct ixgbe_aci_desc desc;
-
- cmd = &desc.params.get_link_topo;
-
- ixgbe_fill_dflt_direct_cmd_desc(&desc, ixgbe_aci_opc_get_link_topo);
-
- cmd->addr.topo_params.node_type_ctx =
- (IXGBE_ACI_LINK_TOPO_NODE_CTX_PORT <<
- IXGBE_ACI_LINK_TOPO_NODE_CTX_S);
-
- /* set node type */
- cmd->addr.topo_params.node_type_ctx |=
- (IXGBE_ACI_LINK_TOPO_NODE_TYPE_M &
- IXGBE_ACI_LINK_TOPO_NODE_TYPE_CAGE);
-
- /* Node type cage can be used to determine if cage is present. If AQC
- * returns error (ENOENT), then no cage present. If no cage present then
- * connection type is backplane or BASE-T.
- */
- return ixgbe_aci_get_netlist_node(hw, cmd, NULL, NULL);
-}
-
-/**
* ixgbe_get_media_type_from_phy_type - Gets media type based on phy type
* @hw: pointer to the HW struct
*
diff --git a/sys/dev/ixl/if_ixl.c b/sys/dev/ixl/if_ixl.c
index 43c3af056b67..261f76055901 100644
--- a/sys/dev/ixl/if_ixl.c
+++ b/sys/dev/ixl/if_ixl.c
@@ -1785,7 +1785,7 @@ ixl_if_get_counter(if_ctx_t ctx, ift_counter cnt)
case IFCOUNTER_OPACKETS:
return (vsi->opackets);
case IFCOUNTER_OERRORS:
- return (vsi->oerrors);
+ return (if_get_counter_default(ifp, cnt) + vsi->oerrors);
case IFCOUNTER_COLLISIONS:
/* Collisions are by standard impossible in 40G/10G Ethernet */
return (0);
@@ -1800,7 +1800,7 @@ ixl_if_get_counter(if_ctx_t ctx, ift_counter cnt)
case IFCOUNTER_IQDROPS:
return (vsi->iqdrops);
case IFCOUNTER_OQDROPS:
- return (vsi->oqdrops);
+ return (if_get_counter_default(ifp, cnt) + vsi->oqdrops);
case IFCOUNTER_NOPROTO:
return (vsi->noproto);
default:
diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c
index fc912c1342f4..3a1894bf754d 100644
--- a/sys/dev/nvme/nvme_ctrlr.c
+++ b/sys/dev/nvme/nvme_ctrlr.c
@@ -1417,14 +1417,6 @@ nvme_ctrlr_linux_passthru_cmd(struct nvme_controller *ctrlr,
npc->data_len, ctrlr->max_xfer_size);
return (EIO);
}
- /*
- * We only support data out or data in commands, but not both at
- * once. However, there's some comands with lower bit cleared
- * that are really read commands, so we should filter & 3 == 0,
- * but don't.
- */
- if ((npc->opcode & 0x3) == 3)
- return (EINVAL);
if (is_user) {
ret = nvme_user_ioctl_req(npc->addr, npc->data_len,
npc->opcode & 0x1, upages, nitems(upages), &npages,
diff --git a/sys/dev/qat/qat_common/adf_gen4_timer.c b/sys/dev/qat/qat_common/adf_gen4_timer.c
index 96b65cdff181..2c74d09418e5 100644
--- a/sys/dev/qat/qat_common/adf_gen4_timer.c
+++ b/sys/dev/qat/qat_common/adf_gen4_timer.c
@@ -57,7 +57,7 @@ end:
static void
timer_handler(struct timer_list *tl)
{
- struct adf_int_timer *int_timer = from_timer(int_timer, tl, timer);
+ struct adf_int_timer *int_timer = timer_container_of(int_timer, tl, timer);
struct adf_accel_dev *accel_dev = int_timer->accel_dev;
struct adf_hb_timer_data *hb_timer_data = NULL;
u64 timeout_val = adf_get_next_timeout(int_timer->timeout_val);
diff --git a/sys/dev/qlnx/qlnxe/ecore_dev.c b/sys/dev/qlnx/qlnxe/ecore_dev.c
index 6187ecdbc446..389a95a4164c 100644
--- a/sys/dev/qlnx/qlnxe/ecore_dev.c
+++ b/sys/dev/qlnx/qlnxe/ecore_dev.c
@@ -5268,7 +5268,7 @@ ecore_hw_get_nvm_info(struct ecore_hwfn *p_hwfn,
}
DP_VERBOSE(p_hwfn, ECORE_MSG_LINK,
- "Read default link: Speed 0x%08x, Adv. Speed 0x%08x, AN: 0x%02x, PAUSE AN: 0x%02x EEE: %02x [%08x usec]\n",
+ "Read default link: Speed %u Mb/sec, Adv. Speeds 0x%08x, AN: 0x%02x, PAUSE AN: 0x%02x EEE: %02x [%u usec]\n",
link->speed.forced_speed, link->speed.advertised_speeds,
link->speed.autoneg, link->pause.autoneg,
p_caps->default_eee, p_caps->eee_lpi_timer);
@@ -6860,7 +6860,7 @@ int __ecore_configure_pf_max_bandwidth(struct ecore_hwfn *p_hwfn,
p_hwfn->qm_info.pf_rl);
DP_VERBOSE(p_hwfn, ECORE_MSG_LINK,
- "Configured MAX bandwidth to be %08x Mb/sec\n",
+ "Configured MAX bandwidth to be %u Mb/sec\n",
p_link->speed);
return rc;
@@ -6918,7 +6918,7 @@ int __ecore_configure_pf_min_bandwidth(struct ecore_hwfn *p_hwfn,
rc = ecore_init_pf_wfq(p_hwfn, p_ptt, p_hwfn->rel_pf_id, min_bw);
DP_VERBOSE(p_hwfn, ECORE_MSG_LINK,
- "Configured MIN bandwidth to be %d Mb/sec\n",
+ "Configured MIN bandwidth to be %u Mb/sec\n",
p_link->min_pf_rate);
return rc;
diff --git a/sys/dev/qlnx/qlnxe/ecore_mcp.c b/sys/dev/qlnx/qlnxe/ecore_mcp.c
index ab14b1eb5186..6d1e5fe24d06 100644
--- a/sys/dev/qlnx/qlnxe/ecore_mcp.c
+++ b/sys/dev/qlnx/qlnxe/ecore_mcp.c
@@ -1638,7 +1638,7 @@ enum _ecore_status_t ecore_mcp_set_link(struct ecore_hwfn *p_hwfn,
if (b_up)
DP_VERBOSE(p_hwfn, ECORE_MSG_LINK,
- "Configuring Link: Speed 0x%08x, Pause 0x%08x, adv_speed 0x%08x, loopback 0x%08x\n",
+ "Configuring Link: Speed %u Mb/sec, Pause 0x%08x, adv_speed 0x%08x, loopback 0x%08x\n",
phy_cfg.speed, phy_cfg.pause, phy_cfg.adv_speed,
phy_cfg.loopback_mode);
else
diff --git a/sys/dev/qlnx/qlnxe/qlnx_def.h b/sys/dev/qlnx/qlnxe/qlnx_def.h
index 4342bba89587..796845f3f8c6 100644
--- a/sys/dev/qlnx/qlnxe/qlnx_def.h
+++ b/sys/dev/qlnx/qlnxe/qlnx_def.h
@@ -696,22 +696,6 @@ extern int qlnx_alloc_mem_sb(qlnx_host_t *ha, struct ecore_sb_info *sb_info,
* Some OS specific stuff
*/
-#if (defined IFM_100G_SR4)
-#define QLNX_IFM_100G_SR4 IFM_100G_SR4
-#define QLNX_IFM_100G_LR4 IFM_100G_LR4
-#define QLNX_IFM_100G_CR4 IFM_100G_CR4
-#else
-#define QLNX_IFM_100G_SR4 IFM_UNKNOWN
-#define QLNX_IFM_100G_LR4 IFM_UNKNOWN
-#endif /* #if (defined IFM_100G_SR4) */
-
-#if (defined IFM_25G_SR)
-#define QLNX_IFM_25G_SR IFM_25G_SR
-#define QLNX_IFM_25G_CR IFM_25G_CR
-#else
-#define QLNX_IFM_25G_SR IFM_UNKNOWN
-#define QLNX_IFM_25G_CR IFM_UNKNOWN
-#endif /* #if (defined IFM_25G_SR) */
#define QLNX_INC_IERRORS(ifp) if_inc_counter(ifp, IFCOUNTER_IERRORS, 1)
#define QLNX_INC_IQDROPS(ifp) if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1)
diff --git a/sys/dev/qlnx/qlnxe/qlnx_os.c b/sys/dev/qlnx/qlnxe/qlnx_os.c
index 4ad190374f87..9963f472c615 100644
--- a/sys/dev/qlnx/qlnxe/qlnx_os.c
+++ b/sys/dev/qlnx/qlnxe/qlnx_os.c
@@ -2375,18 +2375,15 @@ qlnx_init_ifnet(device_t dev, qlnx_host_t *ha)
ifmedia_add(&ha->media, (IFM_ETHER | IFM_40G_CR4), 0, NULL);
} else if ((device_id == QLOGIC_PCI_DEVICE_ID_1656) ||
(device_id == QLOGIC_PCI_DEVICE_ID_8070)) {
- ifmedia_add(&ha->media, (IFM_ETHER | QLNX_IFM_25G_SR), 0, NULL);
- ifmedia_add(&ha->media, (IFM_ETHER | QLNX_IFM_25G_CR), 0, NULL);
+ ifmedia_add(&ha->media, (IFM_ETHER | IFM_25G_SR), 0, NULL);
+ ifmedia_add(&ha->media, (IFM_ETHER | IFM_25G_CR), 0, NULL);
} else if (device_id == QLOGIC_PCI_DEVICE_ID_1654) {
ifmedia_add(&ha->media, (IFM_ETHER | IFM_50G_KR2), 0, NULL);
ifmedia_add(&ha->media, (IFM_ETHER | IFM_50G_CR2), 0, NULL);
} else if (device_id == QLOGIC_PCI_DEVICE_ID_1644) {
- ifmedia_add(&ha->media,
- (IFM_ETHER | QLNX_IFM_100G_LR4), 0, NULL);
- ifmedia_add(&ha->media,
- (IFM_ETHER | QLNX_IFM_100G_SR4), 0, NULL);
- ifmedia_add(&ha->media,
- (IFM_ETHER | QLNX_IFM_100G_CR4), 0, NULL);
+ ifmedia_add(&ha->media, (IFM_ETHER | IFM_100G_LR4), 0, NULL);
+ ifmedia_add(&ha->media, (IFM_ETHER | IFM_100G_SR4), 0, NULL);
+ ifmedia_add(&ha->media, (IFM_ETHER | IFM_100G_CR4), 0, NULL);
}
ifmedia_add(&ha->media, (IFM_ETHER | IFM_FDX), 0, NULL);
@@ -2724,7 +2721,9 @@ qlnx_ioctl(if_t ifp, u_long cmd, caddr_t data)
case SIOCSIFMEDIA:
case SIOCGIFMEDIA:
- QL_DPRINT4(ha, "SIOCSIFMEDIA/SIOCGIFMEDIA (0x%lx)\n", cmd);
+ case SIOCGIFXMEDIA:
+ QL_DPRINT4(ha,
+ "SIOCSIFMEDIA/SIOCGIFMEDIA/SIOCGIFXMEDIA (0x%lx)\n", cmd);
ret = ifmedia_ioctl(ifp, ifr, &ha->media, cmd);
break;
@@ -3808,11 +3807,11 @@ qlnx_get_optics(qlnx_host_t *ha, struct qlnx_link_output *if_link)
case MEDIA_MODULE_FIBER:
case MEDIA_UNSPECIFIED:
if (if_link->speed == (100 * 1000))
- ifm_type = QLNX_IFM_100G_SR4;
+ ifm_type = IFM_100G_SR4;
else if (if_link->speed == (40 * 1000))
ifm_type = IFM_40G_SR4;
else if (if_link->speed == (25 * 1000))
- ifm_type = QLNX_IFM_25G_SR;
+ ifm_type = IFM_25G_SR;
else if (if_link->speed == (10 * 1000))
ifm_type = (IFM_10G_LR | IFM_10G_SR);
else if (if_link->speed == (1 * 1000))
@@ -3822,11 +3821,11 @@ qlnx_get_optics(qlnx_host_t *ha, struct qlnx_link_output *if_link)
case MEDIA_DA_TWINAX:
if (if_link->speed == (100 * 1000))
- ifm_type = QLNX_IFM_100G_CR4;
+ ifm_type = IFM_100G_CR4;
else if (if_link->speed == (40 * 1000))
ifm_type = IFM_40G_CR4;
else if (if_link->speed == (25 * 1000))
- ifm_type = QLNX_IFM_25G_CR;
+ ifm_type = IFM_25G_CR;
else if (if_link->speed == (10 * 1000))
ifm_type = IFM_10G_TWINAX;
diff --git a/sys/dev/random/random_harvestq.c b/sys/dev/random/random_harvestq.c
index 84ec174bd08e..2d7af254c52c 100644
--- a/sys/dev/random/random_harvestq.c
+++ b/sys/dev/random/random_harvestq.c
@@ -103,8 +103,10 @@ static const char *random_source_descr[ENTROPYSOURCE];
volatile int random_kthread_control;
-/* Allow the sysadmin to select the broad category of
- * entropy types to harvest.
+/*
+ * Allow the sysadmin to select the broad category of entropy types to harvest.
+ *
+ * Updates are synchronized by the harvest mutex.
*/
__read_frequently u_int hc_source_mask;
@@ -278,8 +280,15 @@ random_sources_feed(void)
epoch_enter_preempt(rs_epoch, &et);
CK_LIST_FOREACH(rrs, &source_list, rrs_entries) {
for (i = 0; i < npools; i++) {
+ if (rrs->rrs_source->rs_read == NULL) {
+ /* Source pushes entropy asynchronously. */
+ continue;
+ }
n = rrs->rrs_source->rs_read(entropy, sizeof(entropy));
- KASSERT((n <= sizeof(entropy)), ("%s: rs_read returned too much data (%u > %zu)", __func__, n, sizeof(entropy)));
+ KASSERT((n <= sizeof(entropy)),
+ ("%s: rs_read returned too much data (%u > %zu)",
+ __func__, n, sizeof(entropy)));
+
/*
* Sometimes the HW entropy source doesn't have anything
* ready for us. This isn't necessarily untrustworthy.
@@ -334,7 +343,17 @@ copy_event(uint32_t dst[static HARVESTSIZE + 1],
{
memset(dst, 0, sizeof(uint32_t) * (HARVESTSIZE + 1));
memcpy(dst, event->he_entropy, event->he_size);
- dst[HARVESTSIZE] = event->he_somecounter;
+ if (event->he_source <= RANDOM_ENVIRONMENTAL_END) {
+ /*
+ * For pure entropy sources the timestamp counter is generally
+ * quite determinstic since samples are taken at regular
+ * intervals, so does not contribute much to the entropy. To
+ * make health tests more effective, exclude it from the sample,
+ * since it might otherwise defeat the health tests in a
+ * scenario where the source is stuck.
+ */
+ dst[HARVESTSIZE] = event->he_somecounter;
+ }
}
static void
@@ -464,11 +483,12 @@ SYSCTL_BOOL(_kern_random, OID_AUTO, nist_healthtest_enabled,
"Enable NIST SP 800-90B health tests for noise sources");
static void
-random_healthtest_init(enum random_entropy_source source)
+random_healthtest_init(enum random_entropy_source source, int min_entropy)
{
struct health_test_softc *ht;
ht = &healthtest[source];
+ memset(ht, 0, sizeof(*ht));
KASSERT(ht->ht_state == INIT,
("%s: health test state is %d for source %d",
__func__, ht->ht_state, source));
@@ -485,20 +505,62 @@ random_healthtest_init(enum random_entropy_source source)
}
/*
- * Set cutoff values for the two tests, assuming that each sample has
- * min-entropy of 1 bit and allowing for an error rate of 1 in 2^{34}.
- * With a sample rate of RANDOM_KTHREAD_HZ, we expect to see an false
- * positive once in ~54.5 years.
+ * Set cutoff values for the two tests, given a min-entropy estimate for
+ * the source and allowing for an error rate of 1 in 2^{34}. With a
+ * min-entropy estimate of 1 bit and a sample rate of RANDOM_KTHREAD_HZ,
+ * we expect to see an false positive once in ~54.5 years.
*
* The RCT limit comes from the formula in section 4.4.1.
*
- * The APT cutoff is calculated using the formula in section 4.4.2
+ * The APT cutoffs are calculated using the formula in section 4.4.2
* footnote 10 with the number of Bernoulli trials changed from W to
* W-1, since the test as written counts the number of samples equal to
- * the first sample in the window, and thus tests W-1 samples.
+ * the first sample in the window, and thus tests W-1 samples. We
+ * provide cutoffs for estimates up to sizeof(uint32_t)*HARVESTSIZE*8
+ * bits.
*/
- ht->ht_rct_limit = 35;
- ht->ht_apt_cutoff = 330;
+ const int apt_cutoffs[] = {
+ [1] = 329,
+ [2] = 195,
+ [3] = 118,
+ [4] = 73,
+ [5] = 48,
+ [6] = 33,
+ [7] = 23,
+ [8] = 17,
+ [9] = 13,
+ [10] = 11,
+ [11] = 9,
+ [12] = 8,
+ [13] = 7,
+ [14] = 6,
+ [15] = 5,
+ [16] = 5,
+ [17 ... 19] = 4,
+ [20 ... 25] = 3,
+ [26 ... 42] = 2,
+ [43 ... 64] = 1,
+ };
+ const int error_rate = 34;
+
+ if (min_entropy == 0) {
+ /*
+ * For environmental sources, the main source of entropy is the
+ * associated timecounter value. Since these sources can be
+ * influenced by unprivileged users, we conservatively use a
+ * min-entropy estimate of 1 bit per sample. For "pure"
+ * sources, we assume 8 bits per sample, as such sources provide
+ * a variable amount of data per read and in particular might
+ * only provide a single byte at a time.
+ */
+ min_entropy = source >= RANDOM_PURE_START ? 8 : 1;
+ } else if (min_entropy < 0 || min_entropy >= nitems(apt_cutoffs)) {
+ panic("invalid min_entropy %d for %s", min_entropy,
+ random_source_descr[source]);
+ }
+
+ ht->ht_rct_limit = 1 + howmany(error_rate, min_entropy);
+ ht->ht_apt_cutoff = apt_cutoffs[min_entropy];
}
static int
@@ -533,9 +595,9 @@ random_check_uint_harvestmask(SYSCTL_HANDLER_ARGS)
_RANDOM_HARVEST_ETHER_OFF | _RANDOM_HARVEST_UMA_OFF;
int error;
- u_int value, orig_value;
+ u_int value;
- orig_value = value = hc_source_mask;
+ value = atomic_load_int(&hc_source_mask);
error = sysctl_handle_int(oidp, &value, 0, req);
if (error != 0 || req->newptr == NULL)
return (error);
@@ -546,12 +608,14 @@ random_check_uint_harvestmask(SYSCTL_HANDLER_ARGS)
/*
* Disallow userspace modification of pure entropy sources.
*/
+ RANDOM_HARVEST_LOCK();
hc_source_mask = (value & ~user_immutable_mask) |
- (orig_value & user_immutable_mask);
+ (hc_source_mask & user_immutable_mask);
+ RANDOM_HARVEST_UNLOCK();
return (0);
}
SYSCTL_PROC(_kern_random_harvest, OID_AUTO, mask,
- CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, NULL, 0,
+ CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, NULL, 0,
random_check_uint_harvestmask, "IU",
"Entropy harvesting mask");
@@ -563,9 +627,16 @@ random_print_harvestmask(SYSCTL_HANDLER_ARGS)
error = sysctl_wire_old_buffer(req, 0);
if (error == 0) {
+ u_int mask;
+
sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
- for (i = ENTROPYSOURCE - 1; i >= 0; i--)
- sbuf_cat(&sbuf, (hc_source_mask & (1 << i)) ? "1" : "0");
+ mask = atomic_load_int(&hc_source_mask);
+ for (i = ENTROPYSOURCE - 1; i >= 0; i--) {
+ bool present;
+
+ present = (mask & (1u << i)) != 0;
+ sbuf_cat(&sbuf, present ? "1" : "0");
+ }
error = sbuf_finish(&sbuf);
sbuf_delete(&sbuf);
}
@@ -619,16 +690,21 @@ random_print_harvestmask_symbolic(SYSCTL_HANDLER_ARGS)
first = true;
error = sysctl_wire_old_buffer(req, 0);
if (error == 0) {
+ u_int mask;
+
sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
+ mask = atomic_load_int(&hc_source_mask);
for (i = ENTROPYSOURCE - 1; i >= 0; i--) {
- if (i >= RANDOM_PURE_START &&
- (hc_source_mask & (1 << i)) == 0)
+ bool present;
+
+ present = (mask & (1u << i)) != 0;
+ if (i >= RANDOM_PURE_START && !present)
continue;
if (!first)
sbuf_cat(&sbuf, ",");
- sbuf_cat(&sbuf, !(hc_source_mask & (1 << i)) ? "[" : "");
+ sbuf_cat(&sbuf, !present ? "[" : "");
sbuf_cat(&sbuf, random_source_descr[i]);
- sbuf_cat(&sbuf, !(hc_source_mask & (1 << i)) ? "]" : "");
+ sbuf_cat(&sbuf, !present ? "]" : "");
first = false;
}
error = sbuf_finish(&sbuf);
@@ -652,8 +728,8 @@ random_harvestq_init(void *unused __unused)
RANDOM_HARVEST_INIT_LOCK();
harvest_context.hc_active_buf = 0;
- for (int i = 0; i < ENTROPYSOURCE; i++)
- random_healthtest_init(i);
+ for (int i = RANDOM_START; i <= RANDOM_ENVIRONMENTAL_END; i++)
+ random_healthtest_init(i, 0);
}
SYSINIT(random_device_h_init, SI_SUB_RANDOM, SI_ORDER_THIRD, random_harvestq_init, NULL);
@@ -835,20 +911,6 @@ random_harvest_direct_(const void *entropy, u_int size, enum random_entropy_sour
}
void
-random_harvest_register_source(enum random_entropy_source source)
-{
-
- hc_source_mask |= (1 << source);
-}
-
-void
-random_harvest_deregister_source(enum random_entropy_source source)
-{
-
- hc_source_mask &= ~(1 << source);
-}
-
-void
random_source_register(const struct random_source *rsource)
{
struct random_sources *rrs;
@@ -858,11 +920,12 @@ random_source_register(const struct random_source *rsource)
rrs = malloc(sizeof(*rrs), M_ENTROPY, M_WAITOK);
rrs->rrs_source = rsource;
- random_harvest_register_source(rsource->rs_source);
-
printf("random: registering fast source %s\n", rsource->rs_ident);
+ random_healthtest_init(rsource->rs_source, rsource->rs_min_entropy);
+
RANDOM_HARVEST_LOCK();
+ hc_source_mask |= (1 << rsource->rs_source);
CK_LIST_INSERT_HEAD(&source_list, rrs, rrs_entries);
RANDOM_HARVEST_UNLOCK();
}
@@ -874,9 +937,8 @@ random_source_deregister(const struct random_source *rsource)
KASSERT(rsource != NULL, ("invalid input to %s", __func__));
- random_harvest_deregister_source(rsource->rs_source);
-
RANDOM_HARVEST_LOCK();
+ hc_source_mask &= ~(1 << rsource->rs_source);
CK_LIST_FOREACH(rrs, &source_list, rrs_entries)
if (rrs->rrs_source == rsource) {
CK_LIST_REMOVE(rrs, rrs_entries);
diff --git a/sys/dev/random/randomdev.h b/sys/dev/random/randomdev.h
index 6d742447ea8b..a6ca66c7d92e 100644
--- a/sys/dev/random/randomdev.h
+++ b/sys/dev/random/randomdev.h
@@ -52,7 +52,9 @@ random_check_uint_##name(SYSCTL_HANDLER_ARGS) \
}
#endif /* SYSCTL_DECL */
+#ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_ENTROPY);
+#endif
extern bool random_bypass_before_seeding;
extern bool read_random_bypassed_before_seeding;
@@ -101,6 +103,7 @@ struct random_source {
const char *rs_ident;
enum random_entropy_source rs_source;
random_source_read_t *rs_read;
+ int rs_min_entropy;
};
void random_source_register(const struct random_source *);
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index 091ab2db72ec..67864c2de388 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -3558,6 +3558,7 @@ re_ioctl(if_t ifp, u_long command, caddr_t data)
static void
re_watchdog(struct rl_softc *sc)
{
+ struct epoch_tracker et;
if_t ifp;
RL_LOCK_ASSERT(sc);
@@ -3578,7 +3579,9 @@ re_watchdog(struct rl_softc *sc)
if_printf(ifp, "watchdog timeout\n");
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
+ NET_EPOCH_ENTER(et);
re_rxeof(sc, NULL);
+ NET_EPOCH_EXIT(et);
if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
re_init_locked(sc);
if (!if_sendq_empty(ifp))
diff --git a/sys/dev/rtwn/if_rtwn.c b/sys/dev/rtwn/if_rtwn.c
index 7a547e13cafa..25287f222270 100644
--- a/sys/dev/rtwn/if_rtwn.c
+++ b/sys/dev/rtwn/if_rtwn.c
@@ -268,6 +268,9 @@ rtwn_attach(struct rtwn_softc *sc)
ic->ic_flags_ext |= IEEE80211_FEXT_WATCHDOG;
#endif
+ /* Enable seqno offload */
+ ic->ic_flags_ext |= IEEE80211_FEXT_SEQNO_OFFLOAD;
+
/* Adjust capabilities. */
rtwn_adj_devcaps(sc);
diff --git a/sys/dev/rtwn/if_rtwn_tx.c b/sys/dev/rtwn/if_rtwn_tx.c
index 2c9c246dfbb4..fa7f35f2de83 100644
--- a/sys/dev/rtwn/if_rtwn_tx.c
+++ b/sys/dev/rtwn/if_rtwn_tx.c
@@ -183,6 +183,10 @@ rtwn_tx_data(struct rtwn_softc *sc, struct ieee80211_node *ni,
}
}
+ /* seqno allocate, only if AMPDU isn't running */
+ if ((m->m_flags & M_AMPDU_MPDU) == 0)
+ ieee80211_output_seqno_assign(ni, -1, m);
+
cipher = IEEE80211_CIPHER_NONE;
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
k = ieee80211_crypto_encap(ni, m);
@@ -229,6 +233,10 @@ rtwn_tx_raw(struct rtwn_softc *sc, struct ieee80211_node *ni,
uint8_t type;
u_int cipher;
+ /* seqno allocate, only if AMPDU isn't running */
+ if ((m->m_flags & M_AMPDU_MPDU) == 0)
+ ieee80211_output_seqno_assign(ni, -1, m);
+
/* Encrypt the frame if need be. */
cipher = IEEE80211_CIPHER_NONE;
if (params->ibp_flags & IEEE80211_BPF_CRYPTO) {
diff --git a/sys/dev/rtwn/rtl8192c/r92c_tx.c b/sys/dev/rtwn/rtl8192c/r92c_tx.c
index 6b013de0c536..ba2f60bd9295 100644
--- a/sys/dev/rtwn/rtl8192c/r92c_tx.c
+++ b/sys/dev/rtwn/rtl8192c/r92c_tx.c
@@ -452,11 +452,10 @@ r92c_fill_tx_desc(struct rtwn_softc *sc, struct ieee80211_node *ni,
} else {
uint16_t seqno;
- if (m->m_flags & M_AMPDU_MPDU) {
- seqno = ni->ni_txseqs[tid] % IEEE80211_SEQ_RANGE;
- ni->ni_txseqs[tid]++;
- } else
- seqno = M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE;
+ if (m->m_flags & M_AMPDU_MPDU)
+ ieee80211_output_seqno_assign(ni, -1, m);
+
+ seqno = M_SEQNO_GET(m);
/* Set sequence number. */
txd->txdseq = htole16(seqno);
@@ -511,7 +510,7 @@ r92c_fill_tx_desc_raw(struct rtwn_softc *sc, struct ieee80211_node *ni,
rtwn_r92c_tx_setup_hwseq(sc, txd);
} else {
/* Set sequence number. */
- txd->txdseq |= htole16(M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE);
+ txd->txdseq |= htole16(M_SEQNO_GET(m));
}
}
diff --git a/sys/dev/rtwn/rtl8812a/r12a_tx.c b/sys/dev/rtwn/rtl8812a/r12a_tx.c
index 0ca1ebd37757..6a7af0a9b674 100644
--- a/sys/dev/rtwn/rtl8812a/r12a_tx.c
+++ b/sys/dev/rtwn/rtl8812a/r12a_tx.c
@@ -433,12 +433,9 @@ r12a_fill_tx_desc(struct rtwn_softc *sc, struct ieee80211_node *ni,
} else {
uint16_t seqno;
- if (m->m_flags & M_AMPDU_MPDU) {
- seqno = ni->ni_txseqs[tid];
- ni->ni_txseqs[tid]++;
- } else
- seqno = M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE;
-
+ if (m->m_flags & M_AMPDU_MPDU)
+ ieee80211_output_seqno_assign(ni, -1, m);
+ seqno = M_SEQNO_GET(m);
/* Set sequence number. */
txd->txdw9 |= htole32(SM(R12A_TXDW9_SEQ, seqno));
}
@@ -493,8 +490,7 @@ r12a_fill_tx_desc_raw(struct rtwn_softc *sc, struct ieee80211_node *ni,
txd->txdw3 |= htole32(SM(R12A_TXDW3_SEQ_SEL, uvp->id));
} else {
/* Set sequence number. */
- txd->txdw9 |= htole32(SM(R12A_TXDW9_SEQ,
- M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE));
+ txd->txdw9 |= htole32(SM(R12A_TXDW9_SEQ, M_SEQNO_GET(m)));
}
}
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index 900578b73de4..80028063bb0d 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -133,6 +133,7 @@ static const struct {
{ HDA_INTEL_PCH, "Intel Ibex Peak", 0, 0 },
{ HDA_INTEL_PCH2, "Intel Ibex Peak", 0, 0 },
{ HDA_INTEL_ELLK, "Intel Elkhart Lake", 0, 0 },
+ { HDA_INTEL_ELLK2, "Intel Elkhart Lake", 0, 0 },
{ HDA_INTEL_JLK2, "Intel Jasper Lake", 0, 0 },
{ HDA_INTEL_BXTNP, "Intel Broxton-P", 0, 0 },
{ HDA_INTEL_SCH, "Intel SCH", 0, 0 },
@@ -1773,17 +1774,17 @@ hdac_detach(device_t dev)
struct hdac_softc *sc = device_get_softc(dev);
int i, error;
+ callout_drain(&sc->poll_callout);
+ hdac_irq_free(sc);
+ taskqueue_drain(taskqueue_thread, &sc->unsolq_task);
+
error = bus_generic_detach(dev);
if (error != 0)
return (error);
hdac_lock(sc);
- callout_stop(&sc->poll_callout);
hdac_reset(sc, false);
hdac_unlock(sc);
- callout_drain(&sc->poll_callout);
- taskqueue_drain(taskqueue_thread, &sc->unsolq_task);
- hdac_irq_free(sc);
for (i = 0; i < sc->num_ss; i++)
hdac_dma_free(sc, &sc->streams[i].bdl);
@@ -2206,4 +2207,4 @@ static driver_t hdac_driver = {
sizeof(struct hdac_softc),
};
-DRIVER_MODULE(snd_hda, pci, hdac_driver, NULL, NULL);
+DRIVER_MODULE_ORDERED(snd_hda, pci, hdac_driver, NULL, NULL, SI_ORDER_ANY);
diff --git a/sys/dev/sound/pci/hda/hdac.h b/sys/dev/sound/pci/hda/hdac.h
index 223434a214b1..09a17f702019 100644
--- a/sys/dev/sound/pci/hda/hdac.h
+++ b/sys/dev/sound/pci/hda/hdac.h
@@ -66,6 +66,7 @@
#define HDA_INTEL_PCH HDA_MODEL_CONSTRUCT(INTEL, 0x3b56)
#define HDA_INTEL_PCH2 HDA_MODEL_CONSTRUCT(INTEL, 0x3b57)
#define HDA_INTEL_ELLK HDA_MODEL_CONSTRUCT(INTEL, 0x4b55)
+#define HDA_INTEL_ELLK2 HDA_MODEL_CONSTRUCT(INTEL, 0x4b58)
#define HDA_INTEL_JLK2 HDA_MODEL_CONSTRUCT(INTEL, 0x4dc8)
#define HDA_INTEL_BXTNP HDA_MODEL_CONSTRUCT(INTEL, 0x5a98)
#define HDA_INTEL_MACBOOKPRO92 HDA_MODEL_CONSTRUCT(INTEL, 0x7270)
diff --git a/sys/dev/tpm/tpm20.c b/sys/dev/tpm/tpm20.c
index 876dd0bcc40d..067e7ccae8f9 100644
--- a/sys/dev/tpm/tpm20.c
+++ b/sys/dev/tpm/tpm20.c
@@ -25,8 +25,8 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
#include <sys/random.h>
+#include <dev/random/randomdev.h>
#include "tpm20.h"
@@ -184,6 +184,13 @@ tpm20_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
return (ENOTTY);
}
+#ifdef TPM_HARVEST
+static const struct random_source random_tpm = {
+ .rs_ident = "TPM",
+ .rs_source = RANDOM_PURE_TPM,
+};
+#endif
+
int
tpm20_init(struct tpm_sc *sc)
{
@@ -206,7 +213,7 @@ tpm20_init(struct tpm_sc *sc)
tpm20_release(sc);
#ifdef TPM_HARVEST
- random_harvest_register_source(RANDOM_PURE_TPM);
+ random_source_register(&random_tpm);
TIMEOUT_TASK_INIT(taskqueue_thread, &sc->harvest_task, 0,
tpm20_harvest, sc);
taskqueue_enqueue_timeout(taskqueue_thread, &sc->harvest_task, 0);
@@ -223,7 +230,7 @@ tpm20_release(struct tpm_sc *sc)
#ifdef TPM_HARVEST
if (device_is_attached(sc->dev))
taskqueue_drain_timeout(taskqueue_thread, &sc->harvest_task);
- random_harvest_deregister_source(RANDOM_PURE_TPM);
+ random_source_deregister(&random_tpm);
#endif
if (sc->buf != NULL)
diff --git a/sys/dev/usb/controller/xhci_pci.c b/sys/dev/usb/controller/xhci_pci.c
index d5cfd228a429..820fb2f738a1 100644
--- a/sys/dev/usb/controller/xhci_pci.c
+++ b/sys/dev/usb/controller/xhci_pci.c
@@ -178,6 +178,8 @@ xhci_pci_match(device_t self)
return ("Intel Tiger Lake-H USB 3.2 controller");
case 0x461e8086:
return ("Intel Alder Lake-P Thunderbolt 4 USB controller");
+ case 0x4b7d8086:
+ return ("Intel Elkhart Lake USB 3.1 controller");
case 0x51ed8086:
return ("Intel Alder Lake USB 3.2 controller");
case 0x5aa88086:
diff --git a/sys/dev/usb/wlan/if_rsu.c b/sys/dev/usb/wlan/if_rsu.c
index 07f7b6f3a708..e976948f6849 100644
--- a/sys/dev/usb/wlan/if_rsu.c
+++ b/sys/dev/usb/wlan/if_rsu.c
@@ -371,18 +371,16 @@ rsu_update_chw(struct ieee80211com *ic)
/*
* notification from net80211 that it'd like to do A-MPDU on the given TID.
- *
- * Note: this actually hangs traffic at the present moment, so don't use it.
- * The firmware debug does indiciate it's sending and establishing a TX AMPDU
- * session, but then no traffic flows.
*/
static int
rsu_ampdu_enable(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
{
-#if 0
struct rsu_softc *sc = ni->ni_ic->ic_softc;
struct r92s_add_ba_req req;
+ RSU_DPRINTF(sc, RSU_DEBUG_AMPDU, "%s: called, tid=%d\n",
+ __func__, tap->txa_tid);
+
/* Don't enable if it's requested or running */
if (IEEE80211_AMPDU_REQUESTED(tap))
return (0);
@@ -397,23 +395,30 @@ rsu_ampdu_enable(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
return (0);
/* Send the firmware command */
- RSU_DPRINTF(sc, RSU_DEBUG_AMPDU, "%s: establishing AMPDU TX for TID %d\n",
+ RSU_DPRINTF(sc, RSU_DEBUG_AMPDU,
+ "%s: establishing AMPDU TX for TID %d\n",
__func__,
tap->txa_tid);
RSU_LOCK(sc);
- if (rsu_fw_cmd(sc, R92S_CMD_ADDBA_REQ, &req, sizeof(req)) != 1) {
+ if (rsu_fw_cmd(sc, R92S_CMD_ADDBA_REQ, &req, sizeof(req)) != 0) {
RSU_UNLOCK(sc);
+ RSU_DPRINTF(sc, RSU_DEBUG_AMPDU, "%s: AMPDU TX cmd failure\n",
+ __func__);
/* Mark failure */
- (void) ieee80211_ampdu_tx_request_active_ext(ni, tap->txa_tid, 0);
+ ieee80211_ampdu_tx_request_active_ext(ni, tap->txa_tid, 0);
+ /* Return 0, we've been driving this ourselves */
return (0);
}
RSU_UNLOCK(sc);
+ RSU_DPRINTF(sc, RSU_DEBUG_AMPDU, "%s: AMPDU TX cmd success\n",
+ __func__);
+
/* Mark success; we don't get any further notifications */
- (void) ieee80211_ampdu_tx_request_active_ext(ni, tap->txa_tid, 1);
-#endif
- /* Return 0, we're driving this ourselves */
+ ieee80211_ampdu_tx_request_active_ext(ni, tap->txa_tid, 1);
+
+ /* Return 0, we've been driving this ourselves */
return (0);
}
@@ -563,9 +568,7 @@ rsu_attach(device_t self)
/* Enable basic HT */
ic->ic_htcaps = IEEE80211_HTC_HT |
-#if 0
IEEE80211_HTC_AMPDU |
-#endif
IEEE80211_HTC_AMSDU |
IEEE80211_HTCAP_MAXAMSDU_3839 |
IEEE80211_HTCAP_SMPS_OFF;
@@ -576,6 +579,7 @@ rsu_attach(device_t self)
ic->ic_rxstream = sc->sc_nrxstream;
}
ic->ic_flags_ext |= IEEE80211_FEXT_SCAN_OFFLOAD;
+ ic->ic_flags_ext |= IEEE80211_FEXT_SEQNO_OFFLOAD;
rsu_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans,
ic->ic_channels);
@@ -1537,6 +1541,10 @@ rsu_key_alloc(struct ieee80211vap *vap, struct ieee80211_key *k,
is_checked = 1;
k->wk_flags |= IEEE80211_KEY_SWCRYPT;
} else
+ /*
+ * TODO: should allocate these from the CAM space;
+ * skipping over the fixed slots and _BC / _BSS.
+ */
*keyix = R92S_MACID_BSS;
}
@@ -2166,7 +2174,7 @@ rsu_event_addba_req_report(struct rsu_softc *sc, uint8_t *buf, int len)
__func__,
ether_sprintf(ba->mac_addr),
(int) ba->tid,
- (int) le16toh(ba->ssn));
+ (int) le16toh(ba->ssn) >> 4);
/* XXX do node lookup; this is STA specific */
@@ -2212,6 +2220,11 @@ rsu_rx_event(struct rsu_softc *sc, uint8_t code, uint8_t *buf, int len)
if (vap->iv_state == IEEE80211_S_AUTH)
rsu_event_join_bss(sc, buf, len);
break;
+
+ /* TODO: what about R92S_EVT_ADD_STA? and decoding macid? */
+ /* It likely is required for IBSS/AP mode */
+
+ /* TODO: should I be doing this transition in AP mode? */
case R92S_EVT_DEL_STA:
RSU_DPRINTF(sc, RSU_DEBUG_FWCMD | RSU_DEBUG_STATE,
"%s: disassociated from %s\n", __func__,
@@ -2229,6 +2242,7 @@ rsu_rx_event(struct rsu_softc *sc, uint8_t code, uint8_t *buf, int len)
break;
case R92S_EVT_FWDBG:
buf[60] = '\0';
+ /* TODO: some are \n terminated, some aren't, sigh */
RSU_DPRINTF(sc, RSU_DEBUG_FWDBG, "FWDBG: %s\n", (char *)buf);
break;
case R92S_EVT_ADDBA_REQ_REPORT:
@@ -2782,6 +2796,9 @@ rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni,
if (rate != 0)
ridx = rate2ridx(rate);
+ /* Assign sequence number, A-MPDU or otherwise */
+ ieee80211_output_seqno_assign(ni, -1, m0);
+
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
k = ieee80211_crypto_encap(ni, m0);
if (k == NULL) {
@@ -2838,8 +2855,10 @@ rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni,
SM(R92S_TXDW0_OFFSET, sizeof(*txd)) |
R92S_TXDW0_OWN | R92S_TXDW0_FSG | R92S_TXDW0_LSG);
+ /* TODO: correct macid here? It should be in the node */
txd->txdw1 |= htole32(
SM(R92S_TXDW1_MACID, R92S_MACID_BSS) | SM(R92S_TXDW1_QSEL, qid));
+
if (!hasqos)
txd->txdw1 |= htole32(R92S_TXDW1_NONQOS);
if (k != NULL && !(k->wk_flags & IEEE80211_KEY_SWENCRYPT)) {
@@ -2860,8 +2879,13 @@ rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni,
SM(R92S_TXDW1_CIPHER, cipher) |
SM(R92S_TXDW1_KEYIDX, k->wk_keyix));
}
- /* XXX todo: set AGGEN bit if appropriate? */
- txd->txdw2 |= htole32(R92S_TXDW2_BK);
+
+ /*
+ * Note: no need to set TXDW2_AGGEN/TXDW2_BK to mark
+ * A-MPDU and non-AMPDU candidates; the firmware will
+ * handle this for us.
+ */
+
if (ismcast)
txd->txdw2 |= htole32(R92S_TXDW2_BMCAST);
@@ -2880,8 +2904,11 @@ rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni,
}
/*
- * Firmware will use and increment the sequence number for the
- * specified priority.
+ * Pass in prio here, NOT the sequence number.
+ *
+ * The hardware is in theory incrementing sequence numbers
+ * for us, but I haven't yet figured out exactly when/how
+ * it's supposed to work.
*/
txd->txdw3 |= htole32(SM(R92S_TXDW3_SEQ, prio));
@@ -3481,7 +3508,8 @@ rsu_load_firmware(struct rsu_softc *sc)
dmem.vcs_mode = R92S_VCS_MODE_RTS_CTS;
dmem.turbo_mode = 0;
dmem.bw40_en = !! (ic->ic_htcaps & IEEE80211_HTCAP_CHWIDTH40);
- dmem.amsdu2ampdu_en = !! (sc->sc_ht);
+ /* net80211 handles AMSDUs just fine */
+ dmem.amsdu2ampdu_en = 0;
dmem.ampdu_en = !! (sc->sc_ht);
dmem.agg_offload = !! (sc->sc_ht);
dmem.qos_en = 1;
diff --git a/sys/dev/usb/wlan/if_rsureg.h b/sys/dev/usb/wlan/if_rsureg.h
index fb706a4d9b1a..e2074e1dd2ad 100644
--- a/sys/dev/usb/wlan/if_rsureg.h
+++ b/sys/dev/usb/wlan/if_rsureg.h
@@ -593,7 +593,14 @@ struct r92s_event_join_bss {
struct ndis_wlan_bssid_ex bss;
} __packed;
-#define R92S_MACID_BSS 5 /* XXX hardcoded somewhere */
+/*
+ * This is hard-coded in the firmware for a STA mode
+ * BSS join. If you turn on FWDEBUG, you'll see this
+ * in the logs:
+ *
+ * rsu0: FWDBG: mac id #5: 0000005b, 000fffff, 00000000
+ */
+#define R92S_MACID_BSS 5
/* Rx MAC descriptor. */
struct r92s_rx_stat {
diff --git a/sys/dev/usb/wlan/if_run.c b/sys/dev/usb/wlan/if_run.c
index 97c790dd5b81..147aa4044057 100644
--- a/sys/dev/usb/wlan/if_run.c
+++ b/sys/dev/usb/wlan/if_run.c
@@ -882,6 +882,7 @@ run_attach(device_t self)
ic->ic_flags |= IEEE80211_F_DATAPAD;
ic->ic_flags_ext |= IEEE80211_FEXT_SWBMISS;
+ ic->ic_flags_ext |= IEEE80211_FEXT_SEQNO_OFFLOAD;
run_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans,
ic->ic_channels);
@@ -3522,6 +3523,9 @@ run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
data->ni = ni;
data->ridx = ridx;
+ /* Assign sequence number now, regardless of A-MPDU TX or otherwise (for now) */
+ ieee80211_output_seqno_assign(ni, -1, m);
+
run_set_tx_desc(sc, data);
/*
@@ -3627,6 +3631,9 @@ run_tx_mgt(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
data->ni = ni;
data->ridx = ridx;
+ /* Assign sequence number now, regardless of A-MPDU TX or otherwise (for now) */
+ ieee80211_output_seqno_assign(ni, -1, m);
+
run_set_tx_desc(sc, data);
RUN_DPRINTF(sc, RUN_DEBUG_XMIT, "sending mgt frame len=%d rate=%d\n",
@@ -3771,6 +3778,9 @@ run_tx_param(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni,
break;
data->ridx = ridx;
+ /* Assign sequence number now, regardless of A-MPDU TX or otherwise (for now) */
+ ieee80211_output_seqno_assign(ni, -1, m);
+
run_set_tx_desc(sc, data);
RUN_DPRINTF(sc, RUN_DEBUG_XMIT, "sending raw frame len=%u rate=%u\n",
@@ -6416,6 +6426,10 @@ run_ampdu_enable(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
{
/* For now, no A-MPDU TX support in the driver */
+ /*
+ * TODO: maybe we needed to enable seqno generation too?
+ * What other TX desc bits are missing/needed?
+ */
return (0);
}
diff --git a/sys/dev/virtio/network/if_vtnet.c b/sys/dev/virtio/network/if_vtnet.c
index ec4282e0741a..528ff3372097 100644
--- a/sys/dev/virtio/network/if_vtnet.c
+++ b/sys/dev/virtio/network/if_vtnet.c
@@ -133,12 +133,14 @@ static int vtnet_rxq_replace_lro_nomrg_buf(struct vtnet_rxq *,
static int vtnet_rxq_replace_buf(struct vtnet_rxq *, struct mbuf *, int);
static int vtnet_rxq_enqueue_buf(struct vtnet_rxq *, struct mbuf *);
static int vtnet_rxq_new_buf(struct vtnet_rxq *);
+#if defined(INET) || defined(INET6)
static int vtnet_rxq_csum_needs_csum(struct vtnet_rxq *, struct mbuf *,
bool, int, struct virtio_net_hdr *);
static void vtnet_rxq_csum_data_valid(struct vtnet_rxq *, struct mbuf *,
int);
static int vtnet_rxq_csum(struct vtnet_rxq *, struct mbuf *,
struct virtio_net_hdr *);
+#endif
static void vtnet_rxq_discard_merged_bufs(struct vtnet_rxq *, int);
static void vtnet_rxq_discard_buf(struct vtnet_rxq *, struct mbuf *);
static int vtnet_rxq_merged_eof(struct vtnet_rxq *, struct mbuf *, int);
@@ -1761,6 +1763,7 @@ vtnet_rxq_new_buf(struct vtnet_rxq *rxq)
return (error);
}
+#if defined(INET) || defined(INET6)
static int
vtnet_rxq_csum_needs_csum(struct vtnet_rxq *rxq, struct mbuf *m, bool isipv6,
int protocol, struct virtio_net_hdr *hdr)
@@ -1918,6 +1921,7 @@ vtnet_rxq_csum(struct vtnet_rxq *rxq, struct mbuf *m,
return (0);
}
+#endif
static void
vtnet_rxq_discard_merged_bufs(struct vtnet_rxq *rxq, int nbufs)
@@ -2040,10 +2044,15 @@ vtnet_rxq_input(struct vtnet_rxq *rxq, struct mbuf *m,
if (hdr->flags &
(VIRTIO_NET_HDR_F_NEEDS_CSUM | VIRTIO_NET_HDR_F_DATA_VALID)) {
+#if defined(INET) || defined(INET6)
if (vtnet_rxq_csum(rxq, m, hdr) == 0)
rxq->vtnrx_stats.vrxs_csum++;
else
rxq->vtnrx_stats.vrxs_csum_failed++;
+#else
+ sc->vtnet_stats.rx_csum_bad_ethtype++;
+ rxq->vtnrx_stats.vrxs_csum_failed++;
+#endif
}
if (hdr->gso_size != 0) {
@@ -3042,13 +3051,9 @@ vtnet_get_counter(if_t ifp, ift_counter cnt)
case IFCOUNTER_OPACKETS:
return (txaccum.vtxs_opackets);
case IFCOUNTER_OBYTES:
- if (!VTNET_ALTQ_ENABLED)
- return (txaccum.vtxs_obytes);
- /* FALLTHROUGH */
+ return (txaccum.vtxs_obytes);
case IFCOUNTER_OMCASTS:
- if (!VTNET_ALTQ_ENABLED)
- return (txaccum.vtxs_omcasts);
- /* FALLTHROUGH */
+ return (txaccum.vtxs_omcasts);
default:
return (if_get_counter_default(ifp, cnt));
}
diff --git a/sys/dev/vmgenc/vmgenc_acpi.c b/sys/dev/vmgenc/vmgenc_acpi.c
index 2ad8929dfd34..18519a8e4f22 100644
--- a/sys/dev/vmgenc/vmgenc_acpi.c
+++ b/sys/dev/vmgenc/vmgenc_acpi.c
@@ -56,6 +56,7 @@
#include <contrib/dev/acpica/include/acpi.h>
#include <dev/acpica/acpivar.h>
+#include <dev/random/randomdev.h>
#include <dev/random/random_harvestq.h>
#include <dev/vmgenc/vmgenc_acpi.h>
@@ -210,6 +211,11 @@ acpi_GetPackedUINT64(device_t dev, ACPI_HANDLE handle, char *path,
}
+static const struct random_source random_vmgenid = {
+ .rs_ident = "VM Generation ID",
+ .rs_source = RANDOM_PURE_VMGENID,
+};
+
static int
vmgenc_attach(device_t dev)
{
@@ -234,7 +240,7 @@ vmgenc_attach(device_t dev)
memcpy(sc->vmg_cache_guid, __DEVOLATILE(void *, sc->vmg_pguid),
sizeof(sc->vmg_cache_guid));
- random_harvest_register_source(RANDOM_PURE_VMGENID);
+ random_source_register(&random_vmgenid);
vmgenc_harvest_all(sc->vmg_cache_guid, sizeof(sc->vmg_cache_guid));
AcpiInstallNotifyHandler(h, ACPI_DEVICE_NOTIFY, vmgenc_notify, dev);
diff --git a/sys/dev/vmm/vmm_dev.c b/sys/dev/vmm/vmm_dev.c
index 9f2b009d02ec..460a508a60dc 100644
--- a/sys/dev/vmm/vmm_dev.c
+++ b/sys/dev/vmm/vmm_dev.c
@@ -901,6 +901,7 @@ vmmdev_lookup_and_destroy(const char *name, struct ucred *cred)
sc->cdev = NULL;
sx_xunlock(&vmmdev_mtx);
+ vm_suspend(sc->vm, VM_SUSPEND_DESTROY);
destroy_dev(cdev);
vmmdev_destroy(sc);
diff --git a/sys/fs/nfs/nfs_commonport.c b/sys/fs/nfs/nfs_commonport.c
index e5fdb395c9f7..862780741ee7 100644
--- a/sys/fs/nfs/nfs_commonport.c
+++ b/sys/fs/nfs/nfs_commonport.c
@@ -371,8 +371,6 @@ nfsrv_atroot(struct vnode *vp, uint64_t *retp)
/*
* Set the credentials to refer to root.
- * If only the various BSDen could agree on whether cr_gid is a separate
- * field or cr_groups[0]...
*/
void
newnfs_setroot(struct ucred *cred)
diff --git a/sys/fs/nfsclient/nfs_clport.c b/sys/fs/nfsclient/nfs_clport.c
index e9f1dc23ddbe..77e71d4153c9 100644
--- a/sys/fs/nfsclient/nfs_clport.c
+++ b/sys/fs/nfsclient/nfs_clport.c
@@ -1098,9 +1098,10 @@ newnfs_copyincred(struct ucred *cr, struct nfscred *nfscr)
KASSERT(cr->cr_ngroups >= 0,
("newnfs_copyincred: negative cr_ngroups"));
nfscr->nfsc_uid = cr->cr_uid;
- nfscr->nfsc_ngroups = MIN(cr->cr_ngroups, NFS_MAXGRPS + 1);
- for (i = 0; i < nfscr->nfsc_ngroups; i++)
- nfscr->nfsc_groups[i] = cr->cr_groups[i];
+ nfscr->nfsc_ngroups = MIN(cr->cr_ngroups + 1, NFS_MAXGRPS + 1);
+ nfscr->nfsc_groups[0] = cr->cr_gid;
+ for (i = 1; i < nfscr->nfsc_ngroups; i++)
+ nfscr->nfsc_groups[i] = cr->cr_groups[i - 1];
}
/*
diff --git a/sys/fs/procfs/procfs_status.c b/sys/fs/procfs/procfs_status.c
index 38070e0946bb..49c084d02ff8 100644
--- a/sys/fs/procfs/procfs_status.c
+++ b/sys/fs/procfs/procfs_status.c
@@ -141,13 +141,9 @@ procfs_doprocstatus(PFS_FILL_ARGS)
(u_long)cr->cr_uid,
(u_long)cr->cr_ruid,
(u_long)cr->cr_rgid);
-
- /* egid (cr->cr_svgid) is equal to cr_ngroups[0]
- see also getegid(2) in /sys/kern/kern_prot.c */
-
- for (i = 0; i < cr->cr_ngroups; i++) {
+ sbuf_printf(sb, ",%lu", (u_long)cr->cr_gid);
+ for (i = 0; i < cr->cr_ngroups; i++)
sbuf_printf(sb, ",%lu", (u_long)cr->cr_groups[i]);
- }
if (jailed(cr)) {
mtx_lock(&cr->cr_prison->pr_mtx);
diff --git a/sys/geom/cache/g_cache.c b/sys/geom/cache/g_cache.c
index 9d0b10f4192e..c6b80786ade5 100644
--- a/sys/geom/cache/g_cache.c
+++ b/sys/geom/cache/g_cache.c
@@ -504,7 +504,7 @@ g_cache_create(struct g_class *mp, struct g_provider *pp,
return (NULL);
}
- gp = g_new_geomf(mp, "%s", md->md_name);
+ gp = g_new_geom(mp, md->md_name);
sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
sc->sc_type = type;
sc->sc_bshift = bshift;
@@ -665,7 +665,7 @@ g_cache_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
G_CACHE_DEBUG(3, "Tasting %s.", pp->name);
- gp = g_new_geomf(mp, "cache:taste");
+ gp = g_new_geom(mp, "cache:taste");
gp->start = g_cache_start;
gp->orphan = g_cache_orphan;
gp->access = g_cache_access;
diff --git a/sys/geom/concat/g_concat.c b/sys/geom/concat/g_concat.c
index 2173a84c7acf..fe83b54953cc 100644
--- a/sys/geom/concat/g_concat.c
+++ b/sys/geom/concat/g_concat.c
@@ -646,7 +646,7 @@ g_concat_create(struct g_class *mp, const struct g_concat_metadata *md,
return (NULL);
}
}
- gp = g_new_geomf(mp, "%s", md->md_name);
+ gp = g_new_geom(mp, md->md_name);
sc = malloc(sizeof(*sc), M_CONCAT, M_WAITOK | M_ZERO);
gp->start = g_concat_start;
gp->spoiled = g_concat_orphan;
@@ -753,7 +753,7 @@ g_concat_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
G_CONCAT_DEBUG(3, "Tasting %s.", pp->name);
- gp = g_new_geomf(mp, "concat:taste");
+ gp = g_new_geom(mp, "concat:taste");
gp->start = g_concat_start;
gp->access = g_concat_access;
gp->orphan = g_concat_orphan;
diff --git a/sys/geom/eli/g_eli.c b/sys/geom/eli/g_eli.c
index 5bd2d465183e..7fca50e7635c 100644
--- a/sys/geom/eli/g_eli.c
+++ b/sys/geom/eli/g_eli.c
@@ -769,7 +769,7 @@ g_eli_read_metadata_offset(struct g_class *mp, struct g_provider *pp,
g_topology_assert();
- gp = g_new_geomf(mp, "eli:taste");
+ gp = g_new_geom(mp, "eli:taste");
gp->start = g_eli_start;
gp->access = g_std_access;
/*
diff --git a/sys/geom/gate/g_gate.c b/sys/geom/gate/g_gate.c
index ecdcacff6707..76a4328227dd 100644
--- a/sys/geom/gate/g_gate.c
+++ b/sys/geom/gate/g_gate.c
@@ -571,7 +571,7 @@ g_gate_create(struct g_gate_ctl_create *ggio)
}
}
- gp = g_new_geomf(&g_gate_class, "%s", name);
+ gp = g_new_geom(&g_gate_class, name);
gp->start = g_gate_start;
gp->access = g_gate_access;
gp->orphan = g_gate_orphan;
diff --git a/sys/geom/geom.h b/sys/geom/geom.h
index 908ce86f03a6..50e6627b0157 100644
--- a/sys/geom/geom.h
+++ b/sys/geom/geom.h
@@ -289,8 +289,9 @@ int g_handleattr_int(struct bio *bp, const char *attribute, int val);
int g_handleattr_off_t(struct bio *bp, const char *attribute, off_t val);
int g_handleattr_uint16_t(struct bio *bp, const char *attribute, uint16_t val);
int g_handleattr_str(struct bio *bp, const char *attribute, const char *str);
-struct g_consumer * g_new_consumer(struct g_geom *gp);
-struct g_geom * g_new_geomf(struct g_class *mp, const char *fmt, ...)
+struct g_consumer *g_new_consumer(struct g_geom *gp);
+struct g_geom *g_new_geom(struct g_class *mp, const char *name);
+struct g_geom *g_new_geomf(struct g_class *mp, const char *fmt, ...)
__printflike(2, 3);
struct g_provider * g_new_providerf(struct g_geom *gp, const char *fmt, ...)
__printflike(2, 3);
diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c
index 4a2a850c2eab..27c65f15d5e3 100644
--- a/sys/geom/geom_dev.c
+++ b/sys/geom/geom_dev.c
@@ -355,7 +355,7 @@ g_dev_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
g_trace(G_T_TOPOLOGY, "dev_taste(%s,%s)", mp->name, pp->name);
g_topology_assert();
- gp = g_new_geomf(mp, "%s", pp->name);
+ gp = g_new_geom(mp, pp->name);
sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
mtx_init(&sc->sc_mtx, "g_dev", NULL, MTX_DEF);
cp = g_new_consumer(gp);
diff --git a/sys/geom/geom_event.c b/sys/geom/geom_event.c
index 341233a6ef47..ffd46db55416 100644
--- a/sys/geom/geom_event.c
+++ b/sys/geom/geom_event.c
@@ -347,6 +347,7 @@ static void
g_post_event_ep_va(g_event_t *func, void *arg, int wuflag,
struct g_event *ep, va_list ap)
{
+ struct thread *td;
void *p;
u_int n;
@@ -366,8 +367,12 @@ g_post_event_ep_va(g_event_t *func, void *arg, int wuflag,
TAILQ_INSERT_TAIL(&g_events, ep, events);
mtx_unlock(&g_eventlock);
wakeup(&g_wait_event);
- curthread->td_pflags |= TDP_GEOM;
- ast_sched(curthread, TDA_GEOM);
+
+ td = curthread;
+ if ((td->td_pflags & TDP_KTHREAD) == 0) {
+ td->td_pflags |= TDP_GEOM;
+ ast_sched(td, TDA_GEOM);
+ }
}
void
diff --git a/sys/geom/geom_slice.c b/sys/geom/geom_slice.c
index 0491b0069be4..935293950c37 100644
--- a/sys/geom/geom_slice.c
+++ b/sys/geom/geom_slice.c
@@ -529,7 +529,7 @@ g_slice_new(struct g_class *mp, u_int slices, struct g_provider *pp, struct g_co
g_topology_assert();
vp = (void **)extrap;
- gp = g_new_geomf(mp, "%s", pp->name);
+ gp = g_new_geom(mp, pp->name);
gsp = g_slice_alloc(slices, extra);
gsp->start = start;
gp->softc = gsp;
diff --git a/sys/geom/geom_subr.c b/sys/geom/geom_subr.c
index 1429c84942ed..2a6ce1ab6486 100644
--- a/sys/geom/geom_subr.c
+++ b/sys/geom/geom_subr.c
@@ -368,20 +368,15 @@ g_retaste(struct g_class *mp)
}
struct g_geom *
-g_new_geomf(struct g_class *mp, const char *fmt, ...)
+g_new_geom(struct g_class *mp, const char *name)
{
+ int len;
struct g_geom *gp;
- va_list ap;
- struct sbuf *sb;
g_topology_assert();
G_VALID_CLASS(mp);
- sb = sbuf_new_auto();
- va_start(ap, fmt);
- sbuf_vprintf(sb, fmt, ap);
- va_end(ap);
- sbuf_finish(sb);
- gp = g_malloc(sizeof(*gp) + sbuf_len(sb) + 1, M_WAITOK | M_ZERO);
+ len = strlen(name);
+ gp = g_malloc(sizeof(*gp) + len + 1, M_WAITOK | M_ZERO);
gp->name = (char *)(gp + 1);
gp->class = mp;
gp->rank = 1;
@@ -389,8 +384,7 @@ g_new_geomf(struct g_class *mp, const char *fmt, ...)
LIST_INIT(&gp->provider);
LIST_INSERT_HEAD(&mp->geom, gp, geom);
TAILQ_INSERT_HEAD(&geoms, gp, geoms);
- strcpy(gp->name, sbuf_data(sb));
- sbuf_delete(sb);
+ memcpy(gp->name, name, len);
/* Fill in defaults from class */
gp->start = mp->start;
gp->spoiled = mp->spoiled;
@@ -404,6 +398,23 @@ g_new_geomf(struct g_class *mp, const char *fmt, ...)
return (gp);
}
+struct g_geom *
+g_new_geomf(struct g_class *mp, const char *fmt, ...)
+{
+ struct g_geom *gp;
+ va_list ap;
+ struct sbuf *sb;
+
+ sb = sbuf_new_auto();
+ va_start(ap, fmt);
+ sbuf_vprintf(sb, fmt, ap);
+ va_end(ap);
+ sbuf_finish(sb);
+ gp = g_new_geom(mp, sbuf_data(sb));
+ sbuf_delete(sb);
+ return (gp);
+}
+
void
g_destroy_geom(struct g_geom *gp)
{
diff --git a/sys/geom/journal/g_journal.c b/sys/geom/journal/g_journal.c
index 6d9f6239e632..b520194b7d7c 100644
--- a/sys/geom/journal/g_journal.c
+++ b/sys/geom/journal/g_journal.c
@@ -2477,7 +2477,7 @@ g_journal_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
if (pp->geom->class == mp)
return (NULL);
- gp = g_new_geomf(mp, "journal:taste");
+ gp = g_new_geom(mp, "journal:taste");
/* This orphan function should be never called. */
gp->orphan = g_journal_taste_orphan;
cp = g_new_consumer(gp);
diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c
index acb17d40914e..faefbd7c2ef6 100644
--- a/sys/geom/label/g_label.c
+++ b/sys/geom/label/g_label.c
@@ -399,7 +399,7 @@ g_label_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
if (strcmp(pp->geom->class->name, mp->name) == 0)
return (NULL);
- gp = g_new_geomf(mp, "label:taste");
+ gp = g_new_geom(mp, "label:taste");
gp->start = g_label_start_taste;
gp->access = g_label_access_taste;
gp->orphan = g_label_orphan_taste;
diff --git a/sys/geom/linux_lvm/g_linux_lvm.c b/sys/geom/linux_lvm/g_linux_lvm.c
index c63318fed729..f333c08f45d9 100644
--- a/sys/geom/linux_lvm/g_linux_lvm.c
+++ b/sys/geom/linux_lvm/g_linux_lvm.c
@@ -537,7 +537,7 @@ g_llvm_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
g_topology_assert();
g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name);
- gp = g_new_geomf(mp, "linux_lvm:taste");
+ gp = g_new_geom(mp, "linux_lvm:taste");
/* This orphan function should be never called. */
gp->orphan = g_llvm_taste_orphan;
cp = g_new_consumer(gp);
@@ -557,7 +557,7 @@ g_llvm_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
vg = md.md_vg;
if (vg->vg_geom == NULL) {
/* new volume group */
- gp = g_new_geomf(mp, "%s", vg->vg_name);
+ gp = g_new_geom(mp, vg->vg_name);
gp->start = g_llvm_start;
gp->spoiled = g_llvm_orphan;
gp->orphan = g_llvm_orphan;
diff --git a/sys/geom/mirror/g_mirror.c b/sys/geom/mirror/g_mirror.c
index 25c0490938ef..03902a2f2491 100644
--- a/sys/geom/mirror/g_mirror.c
+++ b/sys/geom/mirror/g_mirror.c
@@ -3149,7 +3149,7 @@ g_mirror_create(struct g_class *mp, const struct g_mirror_metadata *md,
/*
* Action geom.
*/
- gp = g_new_geomf(mp, "%s", md->md_name);
+ gp = g_new_geom(mp, md->md_name);
sc = malloc(sizeof(*sc), M_MIRROR, M_WAITOK | M_ZERO);
gp->start = g_mirror_start;
gp->orphan = g_mirror_orphan;
@@ -3290,7 +3290,7 @@ g_mirror_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name);
G_MIRROR_DEBUG(2, "Tasting %s.", pp->name);
- gp = g_new_geomf(mp, "mirror:taste");
+ gp = g_new_geom(mp, "mirror:taste");
/*
* This orphan function should be never called.
*/
diff --git a/sys/geom/mirror/g_mirror_ctl.c b/sys/geom/mirror/g_mirror_ctl.c
index 82bc05a142c0..b31bf098ac4b 100644
--- a/sys/geom/mirror/g_mirror_ctl.c
+++ b/sys/geom/mirror/g_mirror_ctl.c
@@ -433,7 +433,7 @@ g_mirror_ctl_create(struct gctl_req *req, struct g_class *mp)
g_topology_lock();
mediasize = OFF_MAX;
sectorsize = 0;
- gp = g_new_geomf(mp, "%s", md.md_name);
+ gp = g_new_geom(mp, md.md_name);
gp->orphan = g_mirror_create_orphan;
cp = g_new_consumer(gp);
for (no = 1; no < *nargs; no++) {
diff --git a/sys/geom/mountver/g_mountver.c b/sys/geom/mountver/g_mountver.c
index de3a298735d4..c7d55c4734a2 100644
--- a/sys/geom/mountver/g_mountver.c
+++ b/sys/geom/mountver/g_mountver.c
@@ -291,7 +291,7 @@ g_mountver_create(struct gctl_req *req, struct g_class *mp, struct g_provider *p
return (EEXIST);
}
}
- gp = g_new_geomf(mp, "%s", name);
+ gp = g_new_geom(mp, name);
sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
mtx_init(&sc->sc_mtx, "gmountver", NULL, MTX_DEF | MTX_RECURSE);
TAILQ_INIT(&sc->sc_queue);
diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c
index a4935df7eaa1..250a2c60ffee 100644
--- a/sys/geom/multipath/g_multipath.c
+++ b/sys/geom/multipath/g_multipath.c
@@ -549,7 +549,7 @@ g_multipath_create(struct g_class *mp, struct g_multipath_metadata *md)
}
}
- gp = g_new_geomf(mp, "%s", md->md_name);
+ gp = g_new_geom(mp, md->md_name);
sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
mtx_init(&sc->sc_mtx, "multipath", NULL, MTX_DEF);
memcpy(sc->sc_uuid, md->md_uuid, sizeof(sc->sc_uuid));
@@ -821,7 +821,7 @@ g_multipath_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
g_topology_assert();
- gp = g_new_geomf(mp, "multipath:taste");
+ gp = g_new_geom(mp, "multipath:taste");
gp->start = g_multipath_start;
gp->access = g_multipath_access;
gp->orphan = g_multipath_orphan;
diff --git a/sys/geom/nop/g_nop.c b/sys/geom/nop/g_nop.c
index a32111e3a29a..1fb99f4a0a5b 100644
--- a/sys/geom/nop/g_nop.c
+++ b/sys/geom/nop/g_nop.c
@@ -416,7 +416,7 @@ g_nop_create(struct gctl_req *req, struct g_class *mp, struct g_provider *pp,
return (EEXIST);
}
}
- gp = g_new_geomf(mp, "%s", name);
+ gp = g_new_geom(mp, name);
sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
sc->sc_offset = offset;
sc->sc_explicitsize = explicitsize;
diff --git a/sys/geom/part/g_part.c b/sys/geom/part/g_part.c
index 88e44b335b29..8a7f67d8a313 100644
--- a/sys/geom/part/g_part.c
+++ b/sys/geom/part/g_part.c
@@ -998,7 +998,7 @@ g_part_ctl_create(struct gctl_req *req, struct g_part_parms *gpp)
}
if (null == NULL)
- gp = g_new_geomf(&g_part_class, "%s", pp->name);
+ gp = g_new_geom(&g_part_class, pp->name);
gp->softc = kobj_create((kobj_class_t)gpp->gpp_scheme, M_GEOM,
M_WAITOK);
table = gp->softc;
@@ -1979,7 +1979,7 @@ g_part_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
* With that we become part of the topology. Obtain read access
* to the provider.
*/
- gp = g_new_geomf(mp, "%s", pp->name);
+ gp = g_new_geom(mp, pp->name);
cp = g_new_consumer(gp);
cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE;
error = g_attach(cp, pp);
diff --git a/sys/geom/raid/g_raid.c b/sys/geom/raid/g_raid.c
index a483622d14a5..590f28aaa46c 100644
--- a/sys/geom/raid/g_raid.c
+++ b/sys/geom/raid/g_raid.c
@@ -1876,7 +1876,7 @@ g_raid_create_node(struct g_class *mp,
g_topology_assert();
G_RAID_DEBUG(1, "Creating array %s.", name);
- gp = g_new_geomf(mp, "%s", name);
+ gp = g_new_geom(mp, name);
sc = malloc(sizeof(*sc), M_RAID, M_WAITOK | M_ZERO);
gp->start = g_raid_start;
gp->orphan = g_raid_orphan;
@@ -2217,7 +2217,7 @@ g_raid_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
geom = NULL;
status = G_RAID_MD_TASTE_FAIL;
- gp = g_new_geomf(mp, "raid:taste");
+ gp = g_new_geom(mp, "raid:taste");
/*
* This orphan function should be never called.
*/
diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c
index c2d05b48d80d..64951bd01deb 100644
--- a/sys/geom/raid3/g_raid3.c
+++ b/sys/geom/raid3/g_raid3.c
@@ -3164,7 +3164,7 @@ g_raid3_create(struct g_class *mp, const struct g_raid3_metadata *md)
/*
* Action geom.
*/
- gp = g_new_geomf(mp, "%s", md->md_name);
+ gp = g_new_geom(mp, md->md_name);
sc = malloc(sizeof(*sc), M_RAID3, M_WAITOK | M_ZERO);
sc->sc_disks = malloc(sizeof(struct g_raid3_disk) * md->md_all, M_RAID3,
M_WAITOK | M_ZERO);
@@ -3338,7 +3338,7 @@ g_raid3_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name);
G_RAID3_DEBUG(2, "Tasting %s.", pp->name);
- gp = g_new_geomf(mp, "raid3:taste");
+ gp = g_new_geom(mp, "raid3:taste");
/* This orphan function should be never called. */
gp->orphan = g_raid3_taste_orphan;
cp = g_new_consumer(gp);
diff --git a/sys/geom/raid3/g_raid3_ctl.c b/sys/geom/raid3/g_raid3_ctl.c
index 824de07e4836..5eafcce917cf 100644
--- a/sys/geom/raid3/g_raid3_ctl.c
+++ b/sys/geom/raid3/g_raid3_ctl.c
@@ -425,7 +425,7 @@ g_raid3_ctl_insert(struct gctl_req *req, struct g_class *mp)
no = gctl_get_paraml(req, "number", sizeof(*no));
else
no = NULL;
- gp = g_new_geomf(mp, "raid3:insert");
+ gp = g_new_geom(mp, "raid3:insert");
gp->orphan = g_raid3_ctl_insert_orphan;
cp = g_new_consumer(gp);
error = g_attach(cp, pp);
diff --git a/sys/geom/shsec/g_shsec.c b/sys/geom/shsec/g_shsec.c
index 3ccc23e7eb8b..9da814e5eb34 100644
--- a/sys/geom/shsec/g_shsec.c
+++ b/sys/geom/shsec/g_shsec.c
@@ -545,7 +545,7 @@ g_shsec_create(struct g_class *mp, const struct g_shsec_metadata *md)
return (NULL);
}
}
- gp = g_new_geomf(mp, "%s", md->md_name);
+ gp = g_new_geom(mp, md->md_name);
sc = malloc(sizeof(*sc), M_SHSEC, M_WAITOK | M_ZERO);
gp->start = g_shsec_start;
gp->spoiled = g_shsec_orphan;
@@ -643,7 +643,7 @@ g_shsec_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
G_SHSEC_DEBUG(3, "Tasting %s.", pp->name);
- gp = g_new_geomf(mp, "shsec:taste");
+ gp = g_new_geom(mp, "shsec:taste");
gp->start = g_shsec_start;
gp->access = g_shsec_access;
gp->orphan = g_shsec_orphan;
diff --git a/sys/geom/stripe/g_stripe.c b/sys/geom/stripe/g_stripe.c
index 6f336c18c8e6..ba1953f036d3 100644
--- a/sys/geom/stripe/g_stripe.c
+++ b/sys/geom/stripe/g_stripe.c
@@ -454,11 +454,9 @@ g_stripe_start_economic(struct bio *bp, u_int no, off_t offset, off_t length)
cbp->bio_done = g_stripe_done;
cbp->bio_offset = offset;
cbp->bio_length = length;
- if ((bp->bio_flags & BIO_UNMAPPED) != 0) {
- bp->bio_ma_n = round_page(bp->bio_ma_offset +
- bp->bio_length) / PAGE_SIZE;
+ if ((bp->bio_flags & BIO_UNMAPPED) != 0)
addr = NULL;
- } else
+ else
addr = bp->bio_data;
cbp->bio_caller2 = sc->sc_disks[no];
@@ -864,7 +862,7 @@ g_stripe_create(struct g_class *mp, const struct g_stripe_metadata *md,
return (NULL);
}
}
- gp = g_new_geomf(mp, "%s", md->md_name);
+ gp = g_new_geom(mp, md->md_name);
sc = malloc(sizeof(*sc), M_STRIPE, M_WAITOK | M_ZERO);
gp->start = g_stripe_start;
gp->spoiled = g_stripe_orphan;
@@ -965,7 +963,7 @@ g_stripe_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
G_STRIPE_DEBUG(3, "Tasting %s.", pp->name);
- gp = g_new_geomf(mp, "stripe:taste");
+ gp = g_new_geom(mp, "stripe:taste");
gp->start = g_stripe_start;
gp->access = g_stripe_access;
gp->orphan = g_stripe_orphan;
diff --git a/sys/geom/union/g_union.c b/sys/geom/union/g_union.c
index 9734fc1bcfe3..302761597f6f 100644
--- a/sys/geom/union/g_union.c
+++ b/sys/geom/union/g_union.c
@@ -246,7 +246,7 @@ g_union_ctl_create(struct gctl_req *req, struct g_class *mp, bool verbose)
return;
}
}
- gp = g_new_geomf(mp, "%s", name);
+ gp = g_new_geom(mp, name);
sc = g_malloc(sizeof(*sc), M_WAITOK | M_ZERO);
rw_init(&sc->sc_rwlock, "gunion");
TAILQ_INIT(&sc->sc_wiplist);
@@ -358,6 +358,7 @@ fail2:
fail1:
g_destroy_consumer(lowercp);
g_destroy_provider(newpp);
+ g_free(sc);
g_destroy_geom(gp);
}
diff --git a/sys/geom/virstor/g_virstor.c b/sys/geom/virstor/g_virstor.c
index c7d737493f11..1490ed103329 100644
--- a/sys/geom/virstor/g_virstor.c
+++ b/sys/geom/virstor/g_virstor.c
@@ -771,7 +771,7 @@ g_virstor_taste(struct g_class *mp, struct g_provider *pp, int flags)
LOG_MSG(LVL_DEBUG, "Tasting %s", pp->name);
/* We need a dummy geom to attach a consumer to the given provider */
- gp = g_new_geomf(mp, "virstor:taste.helper");
+ gp = g_new_geom(mp, "virstor:taste.helper");
gp->start = (void *)invalid_call; /* XXX: hacked up so the */
gp->access = (void *)invalid_call; /* compiler doesn't complain. */
gp->orphan = (void *)invalid_call; /* I really want these to fail. */
@@ -1085,7 +1085,7 @@ create_virstor_geom(struct g_class *mp, struct g_virstor_metadata *md)
return (NULL);
}
}
- gp = g_new_geomf(mp, "%s", md->md_name);
+ gp = g_new_geom(mp, md->md_name);
gp->softc = NULL; /* to circumevent races that test softc */
gp->start = g_virstor_start;
diff --git a/sys/geom/zero/g_zero.c b/sys/geom/zero/g_zero.c
index 91ef0fb1ef95..e9934ba6c784 100644
--- a/sys/geom/zero/g_zero.c
+++ b/sys/geom/zero/g_zero.c
@@ -102,7 +102,7 @@ g_zero_init(struct g_class *mp)
struct g_provider *pp;
g_topology_assert();
- gp = g_new_geomf(mp, "gzero");
+ gp = g_new_geom(mp, "gzero");
gp->start = g_zero_start;
gp->access = g_std_access;
gpp = pp = g_new_providerf(gp, "%s", gp->name);
diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC
index 88b8967cd693..ac0cc4ba74e7 100644
--- a/sys/i386/conf/GENERIC
+++ b/sys/i386/conf/GENERIC
@@ -249,9 +249,9 @@ device wlan # 802.11 support
options IEEE80211_DEBUG # enable debug msgs
options IEEE80211_SUPPORT_MESH # enable 802.11s draft support
device wlan_wep # 802.11 WEP support
+device wlan_tkip # 802.11 TKIP support
device wlan_ccmp # 802.11 CCMP support
device wlan_gcmp # 802.11 GCMP support
-device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device ath # Atheros CardBus/PCI NICs
device ath_hal # Atheros CardBus/PCI chip support
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index 5a53fac50f2c..1bc2491a1a12 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -2610,11 +2610,13 @@ note_procstat_groups(void *arg, struct sbuf *sb, size_t *sizep)
int structsize;
p = arg;
- size = sizeof(structsize) + p->p_ucred->cr_ngroups * sizeof(gid_t);
+ size = sizeof(structsize) +
+ (1 + p->p_ucred->cr_ngroups) * sizeof(gid_t);
if (sb != NULL) {
KASSERT(*sizep == size, ("invalid size"));
structsize = sizeof(gid_t);
sbuf_bcat(sb, &structsize, sizeof(structsize));
+ sbuf_bcat(sb, &p->p_ucred->cr_gid, sizeof(gid_t));
sbuf_bcat(sb, p->p_ucred->cr_groups, p->p_ucred->cr_ngroups *
sizeof(gid_t));
}
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index fcd232cde21e..e42e7dcf8b44 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -663,4 +663,6 @@ struct sysent sysent[] = {
{ .sy_narg = AS(inotify_rm_watch_args), .sy_call = (sy_call_t *)sys_inotify_rm_watch, .sy_auevent = AUE_INOTIFY, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 594 = inotify_rm_watch */
{ .sy_narg = AS(getgroups_args), .sy_call = (sy_call_t *)sys_getgroups, .sy_auevent = AUE_GETGROUPS, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 595 = getgroups */
{ .sy_narg = AS(setgroups_args), .sy_call = (sy_call_t *)sys_setgroups, .sy_auevent = AUE_SETGROUPS, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 596 = setgroups */
+ { .sy_narg = AS(jail_attach_jd_args), .sy_call = (sy_call_t *)sys_jail_attach_jd, .sy_auevent = AUE_JAIL_ATTACH, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 597 = jail_attach_jd */
+ { .sy_narg = AS(jail_remove_jd_args), .sy_call = (sy_call_t *)sys_jail_remove_jd, .sy_auevent = AUE_JAIL_REMOVE, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 598 = jail_remove_jd */
};
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index a27ab33b34da..2a833d2eafbe 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -665,20 +665,26 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg)
} while (atomic_cmpset_int(&fp->f_flag, flg, tmp) == 0);
got_set = tmp & ~flg;
got_cleared = flg & ~tmp;
- tmp = fp->f_flag & FNONBLOCK;
- error = fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td);
- if (error != 0)
- goto revert_f_setfl;
- tmp = fp->f_flag & FASYNC;
- error = fo_ioctl(fp, FIOASYNC, &tmp, td->td_ucred, td);
- if (error == 0) {
- fdrop(fp, td);
- break;
+ if (((got_set | got_cleared) & FNONBLOCK) != 0) {
+ tmp = fp->f_flag & FNONBLOCK;
+ error = fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td);
+ if (error != 0)
+ goto revert_flags;
+ }
+ if (((got_set | got_cleared) & FASYNC) != 0) {
+ tmp = fp->f_flag & FASYNC;
+ error = fo_ioctl(fp, FIOASYNC, &tmp, td->td_ucred, td);
+ if (error != 0)
+ goto revert_nonblock;
+ }
+ fdrop(fp, td);
+ break;
+revert_nonblock:
+ if (((got_set | got_cleared) & FNONBLOCK) != 0) {
+ tmp = ~fp->f_flag & FNONBLOCK;
+ (void)fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td);
}
- atomic_clear_int(&fp->f_flag, FNONBLOCK);
- tmp = 0;
- (void)fo_ioctl(fp, FIONBIO, &tmp, td->td_ucred, td);
-revert_f_setfl:
+revert_flags:
do {
tmp = flg = fp->f_flag;
tmp &= ~FCNTLFLAGS;
@@ -5250,6 +5256,8 @@ file_type_to_name(short type)
return ("eventfd");
case DTYPE_TIMERFD:
return ("timerfd");
+ case DTYPE_JAILDESC:
+ return ("jail");
default:
return ("unkn");
}
diff --git a/sys/kern/kern_environment.c b/sys/kern/kern_environment.c
index 0cb0f566a839..7c0654769581 100644
--- a/sys/kern/kern_environment.c
+++ b/sys/kern/kern_environment.c
@@ -1098,65 +1098,65 @@ kernenv_next(char *cp)
}
void
-tunable_int_init(void *data)
+tunable_int_init(const void *data)
{
- struct tunable_int *d = (struct tunable_int *)data;
+ const struct tunable_int *d = data;
TUNABLE_INT_FETCH(d->path, d->var);
}
void
-tunable_long_init(void *data)
+tunable_long_init(const void *data)
{
- struct tunable_long *d = (struct tunable_long *)data;
+ const struct tunable_long *d = data;
TUNABLE_LONG_FETCH(d->path, d->var);
}
void
-tunable_ulong_init(void *data)
+tunable_ulong_init(const void *data)
{
- struct tunable_ulong *d = (struct tunable_ulong *)data;
+ const struct tunable_ulong *d = data;
TUNABLE_ULONG_FETCH(d->path, d->var);
}
void
-tunable_int64_init(void *data)
+tunable_int64_init(const void *data)
{
- struct tunable_int64 *d = (struct tunable_int64 *)data;
+ const struct tunable_int64 *d = data;
TUNABLE_INT64_FETCH(d->path, d->var);
}
void
-tunable_uint64_init(void *data)
+tunable_uint64_init(const void *data)
{
- struct tunable_uint64 *d = (struct tunable_uint64 *)data;
+ const struct tunable_uint64 *d = data;
TUNABLE_UINT64_FETCH(d->path, d->var);
}
void
-tunable_quad_init(void *data)
+tunable_quad_init(const void *data)
{
- struct tunable_quad *d = (struct tunable_quad *)data;
+ const struct tunable_quad *d = data;
TUNABLE_QUAD_FETCH(d->path, d->var);
}
void
-tunable_bool_init(void *data)
+tunable_bool_init(const void *data)
{
- struct tunable_bool *d = (struct tunable_bool *)data;
+ const struct tunable_bool *d = data;
TUNABLE_BOOL_FETCH(d->path, d->var);
}
void
-tunable_str_init(void *data)
+tunable_str_init(const void *data)
{
- struct tunable_str *d = (struct tunable_str *)data;
+ const struct tunable_str *d = data;
TUNABLE_STR_FETCH(d->path, d->var, d->size);
}
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 501adc151d44..b5360f3a1055 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -1903,7 +1903,7 @@ kqueue_acquire(struct file *fp, struct kqueue **kqp)
kq = fp->f_data;
if (fp->f_type != DTYPE_KQUEUE || kq == NULL)
- return (EBADF);
+ return (EINVAL);
*kqp = kq;
KQ_LOCK(kq);
if ((kq->kq_state & KQ_CLOSING) == KQ_CLOSING) {
diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c
index 52210553016b..51a8b5cc0465 100644
--- a/sys/kern/kern_jail.c
+++ b/sys/kern/kern_jail.c
@@ -39,6 +39,7 @@
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/errno.h>
+#include <sys/file.h>
#include <sys/sysproto.h>
#include <sys/malloc.h>
#include <sys/osd.h>
@@ -49,6 +50,7 @@
#include <sys/taskqueue.h>
#include <sys/fcntl.h>
#include <sys/jail.h>
+#include <sys/jaildesc.h>
#include <sys/linker.h>
#include <sys/lock.h>
#include <sys/mman.h>
@@ -988,6 +990,8 @@ prison_ip_cnt(const struct prison *pr, const pr_family_t af)
int
kern_jail_set(struct thread *td, struct uio *optuio, int flags)
{
+ struct file *jfp_out;
+ struct jaildesc *desc_in;
struct nameidata nd;
#ifdef INET
struct prison_ip *ip4;
@@ -998,6 +1002,7 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
struct vfsopt *opt;
struct vfsoptlist *opts;
struct prison *pr, *deadpr, *dinspr, *inspr, *mypr, *ppr, *tpr;
+ struct ucred *jdcred;
struct vnode *root;
char *domain, *errmsg, *host, *name, *namelc, *p, *path, *uuid;
char *g_path, *osrelstr;
@@ -1011,7 +1016,7 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
int created, cuflags, descend, drflags, enforce;
int error, errmsg_len, errmsg_pos;
int gotchildmax, gotenforce, gothid, gotrsnum, gotslevel;
- int deadid, jid, jsys, len, level;
+ int deadid, jfd_in, jfd_out, jfd_pos, jid, jsys, len, level;
int childmax, osreldt, rsnum, slevel;
#ifdef INET
int ip4s;
@@ -1027,17 +1032,26 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
unsigned tallow;
char numbuf[12];
- error = priv_check(td, PRIV_JAIL_SET);
- if (!error && (flags & JAIL_ATTACH))
- error = priv_check(td, PRIV_JAIL_ATTACH);
- if (error)
- return (error);
mypr = td->td_ucred->cr_prison;
- if ((flags & JAIL_CREATE) && mypr->pr_childmax == 0)
+ if (((flags & (JAIL_CREATE | JAIL_AT_DESC)) == JAIL_CREATE) &&
+ mypr->pr_childmax == 0)
return (EPERM);
if (flags & ~JAIL_SET_MASK)
return (EINVAL);
+ if ((flags & (JAIL_USE_DESC | JAIL_AT_DESC)) ==
+ (JAIL_USE_DESC | JAIL_AT_DESC))
+ return (EINVAL);
+ prison_hold(mypr);
+#ifdef INET
+ ip4 = NULL;
+#endif
+#ifdef INET6
+ ip6 = NULL;
+#endif
+ g_path = NULL;
+ jfp_out = NULL;
+ jfd_out = -1;
/*
* Check all the parameters before committing to anything. Not all
* errors can be caught early, but we may as well try. Also, this
@@ -1050,14 +1064,7 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
*/
error = vfs_buildopts(optuio, &opts);
if (error)
- return (error);
-#ifdef INET
- ip4 = NULL;
-#endif
-#ifdef INET6
- ip6 = NULL;
-#endif
- g_path = NULL;
+ goto done_free;
cuflags = flags & (JAIL_CREATE | JAIL_UPDATE);
if (!cuflags) {
@@ -1066,6 +1073,72 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
goto done_errmsg;
}
+ error = vfs_copyopt(opts, "desc", &jfd_in, sizeof(jfd_in));
+ if (error == ENOENT) {
+ if (flags & (JAIL_USE_DESC | JAIL_AT_DESC | JAIL_GET_DESC |
+ JAIL_OWN_DESC)) {
+ vfs_opterror(opts, "missing desc");
+ goto done_errmsg;
+ }
+ jfd_in = -1;
+ } else if (error != 0)
+ goto done_free;
+ else {
+ if (!(flags & (JAIL_USE_DESC | JAIL_AT_DESC | JAIL_GET_DESC |
+ JAIL_OWN_DESC))) {
+ vfs_opterror(opts, "unexpected desc");
+ goto done_errmsg;
+ }
+ if (flags & JAIL_AT_DESC) {
+ /*
+ * Look up and create jails based on the
+ * descriptor's prison.
+ */
+ prison_free(mypr);
+ error = jaildesc_find(td, jfd_in, &desc_in, &mypr,
+ NULL);
+ if (error != 0) {
+ vfs_opterror(opts, error == ENOENT ?
+ "descriptor to dead jail" :
+ "not a jail descriptor");
+ goto done_errmsg;
+ }
+ /*
+ * Check file permissions using the current
+ * credentials, and operation permissions
+ * using the descriptor's credentials.
+ */
+ error = vaccess(VREG, desc_in->jd_mode, desc_in->jd_uid,
+ desc_in->jd_gid, VEXEC, td->td_ucred);
+ JAILDESC_UNLOCK(desc_in);
+ if (error != 0)
+ goto done_free;
+ if ((flags & JAIL_CREATE) && mypr->pr_childmax == 0) {
+ error = EPERM;
+ goto done_free;
+ }
+ }
+ if (flags & (JAIL_GET_DESC | JAIL_OWN_DESC)) {
+ /* Allocate a jail descriptor to return later. */
+ error = jaildesc_alloc(td, &jfp_out, &jfd_out,
+ flags & JAIL_OWN_DESC);
+ if (error)
+ goto done_free;
+ }
+ }
+
+ /*
+ * Delay the permission check if using a jail descriptor,
+ * until we get the descriptor's credentials.
+ */
+ if (!(flags & JAIL_USE_DESC)) {
+ error = priv_check(td, PRIV_JAIL_SET);
+ if (error == 0 && (flags & JAIL_ATTACH))
+ error = priv_check(td, PRIV_JAIL_ATTACH);
+ if (error)
+ goto done_free;
+ }
+
error = vfs_copyopt(opts, "jid", &jid, sizeof(jid));
if (error == ENOENT)
jid = 0;
@@ -1441,7 +1514,57 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
error = EAGAIN;
goto done_deref;
}
- if (jid != 0) {
+ if (flags & JAIL_USE_DESC) {
+ /* Get the jail from its descriptor. */
+ error = jaildesc_find(td, jfd_in, &desc_in, &pr, &jdcred);
+ if (error) {
+ vfs_opterror(opts, error == ENOENT ?
+ "descriptor to dead jail" :
+ "not a jail descriptor");
+ goto done_deref;
+ }
+ drflags |= PD_DEREF;
+ /*
+ * Check file permissions using the current credentials,
+ * and operation permissions using the descriptor's
+ * credentials.
+ */
+ error = vaccess(VREG, desc_in->jd_mode, desc_in->jd_uid,
+ desc_in->jd_gid, VWRITE, td->td_ucred);
+ if (error == 0 && (flags & JAIL_ATTACH))
+ error = vaccess(VREG, desc_in->jd_mode, desc_in->jd_uid,
+ desc_in->jd_gid, VEXEC, td->td_ucred);
+ JAILDESC_UNLOCK(desc_in);
+ if (error == 0)
+ error = priv_check_cred(jdcred, PRIV_JAIL_SET);
+ if (error == 0 && (flags & JAIL_ATTACH))
+ error = priv_check_cred(jdcred, PRIV_JAIL_ATTACH);
+ crfree(jdcred);
+ if (error)
+ goto done_deref;
+ mtx_lock(&pr->pr_mtx);
+ drflags |= PD_LOCKED;
+ if (cuflags == JAIL_CREATE) {
+ error = EEXIST;
+ vfs_opterror(opts, "jail %d already exists",
+ pr->pr_id);
+ goto done_deref;
+ }
+ if (!prison_isalive(pr)) {
+ /* While a jid can be resurrected, the prison
+ * itself cannot.
+ */
+ error = ENOENT;
+ vfs_opterror(opts, "jail %d is dying", pr->pr_id);
+ goto done_deref;
+ }
+ if (jid != 0 && jid != pr->pr_id) {
+ error = EINVAL;
+ vfs_opterror(opts, "cannot change jid");
+ goto done_deref;
+ }
+ jid = pr->pr_id;
+ } else if (jid != 0) {
if (jid < 0) {
error = EINVAL;
vfs_opterror(opts, "negative jid");
@@ -1575,7 +1698,7 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
}
}
}
- /* Update: must provide a jid or name. */
+ /* Update: must provide a desc, jid, or name. */
else if (cuflags == JAIL_UPDATE && pr == NULL) {
error = ENOENT;
vfs_opterror(opts, "update specified no jail");
@@ -1728,8 +1851,10 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
* Grab a reference for existing prisons, to ensure they
* continue to exist for the duration of the call.
*/
- prison_hold(pr);
- drflags |= PD_DEREF;
+ if (!(drflags & PD_DEREF)) {
+ prison_hold(pr);
+ drflags |= PD_DEREF;
+ }
#if defined(VIMAGE) && (defined(INET) || defined(INET6))
if ((pr->pr_flags & PR_VNET) &&
(ch_flags & (PR_IP4_USER | PR_IP6_USER))) {
@@ -2158,6 +2283,26 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
printf("Warning jail jid=%d: mountd/nfsd requires a separate"
" file system\n", pr->pr_id);
+ /*
+ * Now that the prison is fully created without error, set the
+ * jail descriptor if one was requested. This is the only
+ * parameter that is returned to the caller (except the error
+ * message).
+ */
+ if (jfd_out >= 0) {
+ if (!(drflags & PD_LOCKED)) {
+ mtx_lock(&pr->pr_mtx);
+ drflags |= PD_LOCKED;
+ }
+ jfd_pos = 2 * vfs_getopt_pos(opts, "desc") + 1;
+ if (optuio->uio_segflg == UIO_SYSSPACE)
+ *(int*)optuio->uio_iov[jfd_pos].iov_base = jfd_out;
+ else
+ (void)copyout(&jfd_out,
+ optuio->uio_iov[jfd_pos].iov_base, sizeof(jfd_out));
+ jaildesc_set_prison(jfp_out, pr);
+ }
+
drflags &= ~PD_KILL;
td->td_retval[0] = pr->pr_id;
@@ -2195,15 +2340,21 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
}
}
done_free:
+ /* Clean up other resources. */
#ifdef INET
prison_ip_free(ip4);
#endif
#ifdef INET6
prison_ip_free(ip6);
#endif
+ if (jfp_out != NULL)
+ fdrop(jfp_out, td);
+ if (error && jfd_out >= 0)
+ (void)kern_close(td, jfd_out);
if (g_path != NULL)
free(g_path, M_TEMP);
vfs_freeopts(opts);
+ prison_free(mypr);
return (error);
}
@@ -2348,16 +2499,22 @@ int
kern_jail_get(struct thread *td, struct uio *optuio, int flags)
{
struct bool_flags *bf;
+ struct file *jfp_out;
+ struct jaildesc *desc_in;
struct jailsys_flags *jsf;
struct prison *pr, *mypr;
struct vfsopt *opt;
struct vfsoptlist *opts;
char *errmsg, *name;
int drflags, error, errmsg_len, errmsg_pos, i, jid, len, pos;
+ int jfd_in, jfd_out;
unsigned f;
if (flags & ~JAIL_GET_MASK)
return (EINVAL);
+ if ((flags & (JAIL_USE_DESC | JAIL_AT_DESC)) ==
+ (JAIL_USE_DESC | JAIL_AT_DESC))
+ return (EINVAL);
/* Get the parameter list. */
error = vfs_buildopts(optuio, &opts);
@@ -2365,13 +2522,81 @@ kern_jail_get(struct thread *td, struct uio *optuio, int flags)
return (error);
errmsg_pos = vfs_getopt_pos(opts, "errmsg");
mypr = td->td_ucred->cr_prison;
+ prison_hold(mypr);
pr = NULL;
+ jfp_out = NULL;
+ jfd_out = -1;
/*
- * Find the prison specified by one of: lastjid, jid, name.
+ * Find the prison specified by one of: desc, lastjid, jid, name.
*/
sx_slock(&allprison_lock);
drflags = PD_LIST_SLOCKED;
+
+ error = vfs_copyopt(opts, "desc", &jfd_in, sizeof(jfd_in));
+ if (error == ENOENT) {
+ if (flags & (JAIL_AT_DESC | JAIL_GET_DESC | JAIL_OWN_DESC)) {
+ vfs_opterror(opts, "missing desc");
+ goto done;
+ }
+ } else if (error == 0) {
+ if (!(flags & (JAIL_USE_DESC | JAIL_AT_DESC | JAIL_GET_DESC |
+ JAIL_OWN_DESC))) {
+ vfs_opterror(opts, "unexpected desc");
+ goto done;
+ }
+ if (flags & JAIL_USE_DESC) {
+ /* Get the jail from its descriptor. */
+ error = jaildesc_find(td, jfd_in, &desc_in, &pr, NULL);
+ if (error) {
+ vfs_opterror(opts, error == ENOENT ?
+ "descriptor to dead jail" :
+ "not a jail descriptor");
+ goto done;
+ }
+ drflags |= PD_DEREF;
+ error = vaccess(VREG, desc_in->jd_mode, desc_in->jd_uid,
+ desc_in->jd_gid, VREAD, td->td_ucred);
+ JAILDESC_UNLOCK(desc_in);
+ if (error != 0)
+ goto done;
+ mtx_lock(&pr->pr_mtx);
+ drflags |= PD_LOCKED;
+ if (!(prison_isalive(pr) || (flags & JAIL_DYING))) {
+ error = ENOENT;
+ vfs_opterror(opts, "jail %d is dying",
+ pr->pr_id);
+ goto done;
+ }
+ goto found_prison;
+ }
+ if (flags & JAIL_AT_DESC) {
+ /* Look up jails based on the descriptor's prison. */
+ prison_free(mypr);
+ error = jaildesc_find(td, jfd_in, &desc_in, &mypr,
+ NULL);
+ if (error != 0) {
+ vfs_opterror(opts, error == ENOENT ?
+ "descriptor to dead jail" :
+ "not a jail descriptor");
+ goto done;
+ }
+ error = vaccess(VREG, desc_in->jd_mode, desc_in->jd_uid,
+ desc_in->jd_gid, VEXEC, td->td_ucred);
+ JAILDESC_UNLOCK(desc_in);
+ if (error != 0)
+ goto done;
+ }
+ if (flags & (JAIL_GET_DESC | JAIL_OWN_DESC)) {
+ /* Allocate a jail descriptor to return later. */
+ error = jaildesc_alloc(td, &jfp_out, &jfd_out,
+ flags & JAIL_OWN_DESC);
+ if (error)
+ goto done;
+ }
+ } else
+ goto done;
+
error = vfs_copyopt(opts, "lastjid", &jid, sizeof(jid));
if (error == 0) {
TAILQ_FOREACH(pr, &allprison, pr_list) {
@@ -2440,9 +2665,17 @@ kern_jail_get(struct thread *td, struct uio *optuio, int flags)
found_prison:
/* Get the parameters of the prison. */
- prison_hold(pr);
- drflags |= PD_DEREF;
+ if (!(drflags & PD_DEREF)) {
+ prison_hold(pr);
+ drflags |= PD_DEREF;
+ }
td->td_retval[0] = pr->pr_id;
+ if (jfd_out >= 0) {
+ error = vfs_setopt(opts, "desc", &jfd_out, sizeof(jfd_out));
+ if (error != 0 && error != ENOENT)
+ goto done;
+ jaildesc_set_prison(jfp_out, pr);
+ }
error = vfs_setopt(opts, "jid", &pr->pr_id, sizeof(pr->pr_id));
if (error != 0 && error != ENOENT)
goto done;
@@ -2622,6 +2855,13 @@ kern_jail_get(struct thread *td, struct uio *optuio, int flags)
prison_deref(pr, drflags);
else if (drflags & PD_LIST_SLOCKED)
sx_sunlock(&allprison_lock);
+ else if (drflags & PD_LIST_XLOCKED)
+ sx_xunlock(&allprison_lock);
+ /* Clean up other resources. */
+ if (jfp_out != NULL)
+ (void)fdrop(jfp_out, td);
+ if (error && jfd_out >= 0)
+ (void)kern_close(td, jfd_out);
if (error && errmsg_pos >= 0) {
/* Write the error message back to userspace. */
vfs_getopt(opts, "errmsg", (void **)&errmsg, &errmsg_len);
@@ -2638,6 +2878,7 @@ kern_jail_get(struct thread *td, struct uio *optuio, int flags)
}
}
vfs_freeopts(opts);
+ prison_free(mypr);
return (error);
}
@@ -2662,14 +2903,63 @@ sys_jail_remove(struct thread *td, struct jail_remove_args *uap)
sx_xunlock(&allprison_lock);
return (EINVAL);
}
+ prison_hold(pr);
+ prison_remove(pr);
+ return (0);
+}
+
+/*
+ * struct jail_remove_jd_args {
+ * int fd;
+ * };
+ */
+int
+sys_jail_remove_jd(struct thread *td, struct jail_remove_jd_args *uap)
+{
+ struct jaildesc *jd;
+ struct prison *pr;
+ struct ucred *jdcred;
+ int error;
+
+ error = jaildesc_find(td, uap->fd, &jd, &pr, &jdcred);
+ if (error)
+ return (error);
+ /*
+ * Check file permissions using the current credentials, and
+ * operation permissions using the descriptor's credentials.
+ */
+ error = vaccess(VREG, jd->jd_mode, jd->jd_uid, jd->jd_gid, VWRITE,
+ td->td_ucred);
+ JAILDESC_UNLOCK(jd);
+ if (error == 0)
+ error = priv_check_cred(jdcred, PRIV_JAIL_REMOVE);
+ crfree(jdcred);
+ if (error) {
+ prison_free(pr);
+ return (error);
+ }
+ sx_xlock(&allprison_lock);
+ mtx_lock(&pr->pr_mtx);
+ prison_remove(pr);
+ return (0);
+}
+
+/*
+ * Begin the removal process for a prison. The allprison lock should
+ * be held exclusively, and the prison should be both locked and held.
+ */
+void
+prison_remove(struct prison *pr)
+{
+ sx_assert(&allprison_lock, SA_XLOCKED);
+ mtx_assert(&pr->pr_mtx, MA_OWNED);
if (!prison_isalive(pr)) {
/* Silently ignore already-dying prisons. */
mtx_unlock(&pr->pr_mtx);
sx_xunlock(&allprison_lock);
- return (0);
+ return;
}
- prison_deref(pr, PD_KILL | PD_LOCKED | PD_LIST_XLOCKED);
- return (0);
+ prison_deref(pr, PD_KILL | PD_DEREF | PD_LOCKED | PD_LIST_XLOCKED);
}
/*
@@ -2704,6 +2994,53 @@ sys_jail_attach(struct thread *td, struct jail_attach_args *uap)
return (do_jail_attach(td, pr, PD_LOCKED | PD_LIST_SLOCKED));
}
+/*
+ * struct jail_attach_jd_args {
+ * int fd;
+ * };
+ */
+int
+sys_jail_attach_jd(struct thread *td, struct jail_attach_jd_args *uap)
+{
+ struct jaildesc *jd;
+ struct prison *pr;
+ struct ucred *jdcred;
+ int drflags, error;
+
+ sx_slock(&allprison_lock);
+ drflags = PD_LIST_SLOCKED;
+ error = jaildesc_find(td, uap->fd, &jd, &pr, &jdcred);
+ if (error)
+ goto fail;
+ drflags |= PD_DEREF;
+ /*
+ * Check file permissions using the current credentials, and
+ * operation permissions using the descriptor's credentials.
+ */
+ error = vaccess(VREG, jd->jd_mode, jd->jd_uid, jd->jd_gid, VEXEC,
+ td->td_ucred);
+ JAILDESC_UNLOCK(jd);
+ if (error == 0)
+ error = priv_check_cred(jdcred, PRIV_JAIL_ATTACH);
+ crfree(jdcred);
+ if (error)
+ goto fail;
+ mtx_lock(&pr->pr_mtx);
+ drflags |= PD_LOCKED;
+
+ /* Do not allow a process to attach to a prison that is not alive. */
+ if (!prison_isalive(pr)) {
+ error = EINVAL;
+ goto fail;
+ }
+
+ return (do_jail_attach(td, pr, drflags));
+
+ fail:
+ prison_deref(pr, drflags);
+ return (error);
+}
+
static int
do_jail_attach(struct thread *td, struct prison *pr, int drflags)
{
@@ -2722,9 +3059,12 @@ do_jail_attach(struct thread *td, struct prison *pr, int drflags)
* a process root from one prison, but attached to the jail
* of another.
*/
- prison_hold(pr);
+ if (!(drflags & PD_DEREF)) {
+ prison_hold(pr);
+ drflags |= PD_DEREF;
+ }
refcount_acquire(&pr->pr_uref);
- drflags |= PD_DEREF | PD_DEUREF;
+ drflags |= PD_DEUREF;
mtx_unlock(&pr->pr_mtx);
drflags &= ~PD_LOCKED;
@@ -3444,6 +3784,7 @@ prison_cleanup_locked(struct prison *pr)
mtx_assert(&pr->pr_mtx, MA_OWNED);
prison_knote(pr, NOTE_JAIL_REMOVE);
knlist_detach(pr->pr_klist);
+ jaildesc_prison_cleanup(pr);
pr->pr_klist = NULL;
}
@@ -4650,6 +4991,7 @@ sysctl_jail_param(SYSCTL_HANDLER_ARGS)
* jail creation time but cannot be changed in an existing jail.
*/
SYSCTL_JAIL_PARAM(, jid, CTLTYPE_INT | CTLFLAG_RDTUN, "I", "Jail ID");
+SYSCTL_JAIL_PARAM(, desc, CTLTYPE_INT | CTLFLAG_RW, "I", "Jail descriptor");
SYSCTL_JAIL_PARAM(, parent, CTLTYPE_INT | CTLFLAG_RD, "I", "Jail parent ID");
SYSCTL_JAIL_PARAM_STRING(, name, CTLFLAG_RW, MAXHOSTNAMELEN, "Jail name");
SYSCTL_JAIL_PARAM_STRING(, path, CTLFLAG_RDTUN, MAXPATHLEN, "Jail root path");
diff --git a/sys/kern/kern_jaildesc.c b/sys/kern/kern_jaildesc.c
new file mode 100644
index 000000000000..72e2845aaf42
--- /dev/null
+++ b/sys/kern/kern_jaildesc.c
@@ -0,0 +1,336 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2025 James Gritton.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/fcntl.h>
+#include <sys/file.h>
+#include <sys/filedesc.h>
+#include <sys/kernel.h>
+#include <sys/jail.h>
+#include <sys/jaildesc.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/mutex.h>
+#include <sys/priv.h>
+#include <sys/stat.h>
+#include <sys/sysproto.h>
+#include <sys/systm.h>
+#include <sys/ucred.h>
+#include <sys/vnode.h>
+
+MALLOC_DEFINE(M_JAILDESC, "jaildesc", "jail descriptors");
+
+static fo_stat_t jaildesc_stat;
+static fo_close_t jaildesc_close;
+static fo_chmod_t jaildesc_chmod;
+static fo_chown_t jaildesc_chown;
+static fo_fill_kinfo_t jaildesc_fill_kinfo;
+static fo_cmp_t jaildesc_cmp;
+
+static struct fileops jaildesc_ops = {
+ .fo_read = invfo_rdwr,
+ .fo_write = invfo_rdwr,
+ .fo_truncate = invfo_truncate,
+ .fo_ioctl = invfo_ioctl,
+ .fo_poll = invfo_poll,
+ .fo_kqfilter = invfo_kqfilter,
+ .fo_stat = jaildesc_stat,
+ .fo_close = jaildesc_close,
+ .fo_chmod = jaildesc_chmod,
+ .fo_chown = jaildesc_chown,
+ .fo_sendfile = invfo_sendfile,
+ .fo_fill_kinfo = jaildesc_fill_kinfo,
+ .fo_cmp = jaildesc_cmp,
+ .fo_flags = DFLAG_PASSABLE,
+};
+
+/*
+ * Given a jail descriptor number, return the jaildesc, its prison,
+ * and its credential. The jaildesc will be returned locked, and
+ * prison and the credential will be returned held.
+ */
+int
+jaildesc_find(struct thread *td, int fd, struct jaildesc **jdp,
+ struct prison **prp, struct ucred **ucredp)
+{
+ struct file *fp;
+ struct jaildesc *jd;
+ struct prison *pr;
+ int error;
+
+ error = fget(td, fd, &cap_no_rights, &fp);
+ if (error != 0)
+ return (error);
+ if (fp->f_type != DTYPE_JAILDESC) {
+ error = EINVAL;
+ goto out;
+ }
+ jd = fp->f_data;
+ JAILDESC_LOCK(jd);
+ pr = jd->jd_prison;
+ if (pr == NULL || !prison_isvalid(pr)) {
+ error = ENOENT;
+ JAILDESC_UNLOCK(jd);
+ goto out;
+ }
+ prison_hold(pr);
+ *prp = pr;
+ if (jdp != NULL)
+ *jdp = jd;
+ else
+ JAILDESC_UNLOCK(jd);
+ if (ucredp != NULL)
+ *ucredp = crhold(fp->f_cred);
+ out:
+ fdrop(fp, td);
+ return (error);
+}
+
+/*
+ * Allocate a new jail decriptor, not yet associated with a prison.
+ * Return the file pointer (with a reference held) and the descriptor
+ * number.
+ */
+int
+jaildesc_alloc(struct thread *td, struct file **fpp, int *fdp, int owning)
+{
+ struct file *fp;
+ struct jaildesc *jd;
+ int error;
+ mode_t mode;
+
+ if (owning) {
+ error = priv_check(td, PRIV_JAIL_REMOVE);
+ if (error != 0)
+ return (error);
+ mode = S_ISTXT;
+ } else
+ mode = 0;
+ jd = malloc(sizeof(*jd), M_JAILDESC, M_WAITOK | M_ZERO);
+ error = falloc_caps(td, &fp, fdp, 0, NULL);
+ if (error != 0) {
+ free(jd, M_JAILDESC);
+ return (error);
+ }
+ finit(fp, priv_check_cred(fp->f_cred, PRIV_JAIL_SET) == 0 ?
+ FREAD | FWRITE : FREAD, DTYPE_JAILDESC, jd, &jaildesc_ops);
+ JAILDESC_LOCK_INIT(jd);
+ jd->jd_uid = fp->f_cred->cr_uid;
+ jd->jd_gid = fp->f_cred->cr_gid;
+ jd->jd_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH | mode |
+ (priv_check(td, PRIV_JAIL_SET) == 0 ? S_IWUSR | S_IXUSR : 0) |
+ (priv_check(td, PRIV_JAIL_ATTACH) == 0 ? S_IXUSR : 0);
+ *fpp = fp;
+ return (0);
+}
+
+/*
+ * Assocate a jail descriptor with its prison.
+ */
+void
+jaildesc_set_prison(struct file *fp, struct prison *pr)
+{
+ struct jaildesc *jd;
+
+ mtx_assert(&pr->pr_mtx, MA_OWNED);
+ jd = fp->f_data;
+ JAILDESC_LOCK(jd);
+ jd->jd_prison = pr;
+ LIST_INSERT_HEAD(&pr->pr_descs, jd, jd_list);
+ prison_hold(pr);
+ JAILDESC_UNLOCK(jd);
+}
+
+/*
+ * Detach all the jail descriptors from a prison.
+ */
+void
+jaildesc_prison_cleanup(struct prison *pr)
+{
+ struct jaildesc *jd;
+
+ mtx_assert(&pr->pr_mtx, MA_OWNED);
+ while ((jd = LIST_FIRST(&pr->pr_descs))) {
+ JAILDESC_LOCK(jd);
+ LIST_REMOVE(jd, jd_list);
+ jd->jd_prison = NULL;
+ JAILDESC_UNLOCK(jd);
+ prison_free(pr);
+ }
+}
+
+static int
+jaildesc_close(struct file *fp, struct thread *td)
+{
+ struct jaildesc *jd;
+ struct prison *pr;
+
+ jd = fp->f_data;
+ fp->f_data = NULL;
+ if (jd != NULL) {
+ JAILDESC_LOCK(jd);
+ pr = jd->jd_prison;
+ if (pr != NULL) {
+ /*
+ * Free or remove the associated prison.
+ * This requires a second check after re-
+ * ordering locks. This jaildesc can remain
+ * unlocked once we have a prison reference,
+ * because that prison is the only place that
+ * still points back to it.
+ */
+ prison_hold(pr);
+ JAILDESC_UNLOCK(jd);
+ if (jd->jd_mode & S_ISTXT) {
+ sx_xlock(&allprison_lock);
+ prison_lock(pr);
+ if (jd->jd_prison != NULL) {
+ /*
+ * Unlink the prison, but don't free
+ * it; that will be done as part of
+ * of prison_remove.
+ */
+ LIST_REMOVE(jd, jd_list);
+ prison_remove(pr);
+ } else {
+ prison_unlock(pr);
+ sx_xunlock(&allprison_lock);
+ }
+ } else {
+ prison_lock(pr);
+ if (jd->jd_prison != NULL) {
+ LIST_REMOVE(jd, jd_list);
+ prison_free(pr);
+ }
+ prison_unlock(pr);
+ }
+ prison_free(pr);
+ }
+ JAILDESC_LOCK_DESTROY(jd);
+ free(jd, M_JAILDESC);
+ }
+ return (0);
+}
+
+static int
+jaildesc_stat(struct file *fp, struct stat *sb, struct ucred *active_cred)
+{
+ struct jaildesc *jd;
+
+ bzero(sb, sizeof(struct stat));
+ jd = fp->f_data;
+ JAILDESC_LOCK(jd);
+ if (jd->jd_prison != NULL) {
+ sb->st_ino = jd->jd_prison ? jd->jd_prison->pr_id : 0;
+ sb->st_uid = jd->jd_uid;
+ sb->st_gid = jd->jd_gid;
+ sb->st_mode = jd->jd_mode;
+ } else
+ sb->st_mode = S_IFREG;
+ JAILDESC_UNLOCK(jd);
+ return (0);
+}
+
+static int
+jaildesc_chmod(struct file *fp, mode_t mode, struct ucred *active_cred,
+ struct thread *td)
+{
+ struct jaildesc *jd;
+ int error;
+
+ /* Reject permissions that the creator doesn't have. */
+ if (((mode & (S_IWUSR | S_IWGRP | S_IWOTH)) &&
+ priv_check_cred(fp->f_cred, PRIV_JAIL_SET) != 0) ||
+ ((mode & (S_IXUSR | S_IXGRP | S_IXOTH)) &&
+ priv_check_cred(fp->f_cred, PRIV_JAIL_ATTACH) != 0 &&
+ priv_check_cred(fp->f_cred, PRIV_JAIL_SET) != 0) ||
+ ((mode & S_ISTXT) &&
+ priv_check_cred(fp->f_cred, PRIV_JAIL_REMOVE) != 0))
+ return (EPERM);
+ if (mode & (S_ISUID | S_ISGID))
+ return (EINVAL);
+ jd = fp->f_data;
+ JAILDESC_LOCK(jd);
+ error = vaccess(VREG, jd->jd_mode, jd->jd_uid, jd->jd_gid, VADMIN,
+ active_cred);
+ if (error == 0)
+ jd->jd_mode = S_IFREG | (mode & ALLPERMS);
+ JAILDESC_UNLOCK(jd);
+ return (error);
+}
+
+static int
+jaildesc_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred,
+ struct thread *td)
+{
+ struct jaildesc *jd;
+ int error;
+
+ error = 0;
+ jd = fp->f_data;
+ JAILDESC_LOCK(jd);
+ if (uid == (uid_t)-1)
+ uid = jd->jd_uid;
+ if (gid == (gid_t)-1)
+ gid = jd->jd_gid;
+ if ((uid != jd->jd_uid && uid != active_cred->cr_uid) ||
+ (gid != jd->jd_gid && !groupmember(gid, active_cred)))
+ error = priv_check_cred(active_cred, PRIV_VFS_CHOWN);
+ if (error == 0) {
+ jd->jd_uid = uid;
+ jd->jd_gid = gid;
+ }
+ JAILDESC_UNLOCK(jd);
+ return (error);
+}
+
+static int
+jaildesc_fill_kinfo(struct file *fp, struct kinfo_file *kif,
+ struct filedesc *fdp)
+{
+ return (EINVAL);
+}
+
+static int
+jaildesc_cmp(struct file *fp1, struct file *fp2, struct thread *td)
+{
+ struct jaildesc *jd1, *jd2;
+ int jid1, jid2;
+
+ if (fp2->f_type != DTYPE_JAILDESC)
+ return (3);
+ jd1 = fp1->f_data;
+ JAILDESC_LOCK(jd1);
+ jid1 = jd1->jd_prison ? (uintptr_t)jd1->jd_prison->pr_id : 0;
+ JAILDESC_UNLOCK(jd1);
+ jd2 = fp2->f_data;
+ JAILDESC_LOCK(jd2);
+ jid2 = jd2->jd_prison ? (uintptr_t)jd2->jd_prison->pr_id : 0;
+ JAILDESC_UNLOCK(jd2);
+ return (kcmp_cmp(jid1, jid2));
+}
diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
index 879220be050b..653ce1ee556b 100644
--- a/sys/kern/kern_malloc.c
+++ b/sys/kern/kern_malloc.c
@@ -751,11 +751,14 @@ malloc_domainset(size_t size, struct malloc_type *mtp, struct domainset *ds,
return (malloc_large(size, mtp, DOMAINSET_RR(), flags
DEBUG_REDZONE_ARG));
- vm_domainset_iter_policy_init(&di, ds, &domain, &flags);
- do {
- va = malloc_domain(&size, &indx, mtp, domain, flags);
- } while (va == NULL && vm_domainset_iter_policy(&di, &domain) == 0);
+ indx = -1;
+ va = NULL;
+ if (vm_domainset_iter_policy_init(&di, ds, &domain, &flags) == 0)
+ do {
+ va = malloc_domain(&size, &indx, mtp, domain, flags);
+ } while (va == NULL && vm_domainset_iter_policy(&di, &domain) == 0);
malloc_type_zone_allocated(mtp, va == NULL ? 0 : size, indx);
+
if (__predict_false(va == NULL)) {
KASSERT((flags & M_WAITOK) == 0,
("malloc(M_WAITOK) returned NULL"));
diff --git a/sys/kern/kern_mutex.c b/sys/kern/kern_mutex.c
index f952b3fc8805..8b5908f5219a 100644
--- a/sys/kern/kern_mutex.c
+++ b/sys/kern/kern_mutex.c
@@ -1136,9 +1136,9 @@ __mtx_assert(const volatile uintptr_t *c, int what, const char *file, int line)
* General init routine used by the MTX_SYSINIT() macro.
*/
void
-mtx_sysinit(void *arg)
+mtx_sysinit(const void *arg)
{
- struct mtx_args *margs = arg;
+ const struct mtx_args *margs = arg;
mtx_init((struct mtx *)margs->ma_mtx, margs->ma_desc, NULL,
margs->ma_opts);
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 379fbda619c0..6e56664d12ce 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -1112,13 +1112,14 @@ fill_kinfo_proc_only(struct proc *p, struct kinfo_proc *kp)
if (cred->cr_flags & CRED_FLAG_CAPMODE)
kp->ki_cr_flags |= KI_CRF_CAPABILITY_MODE;
/* XXX bde doesn't like KI_NGROUPS */
- if (cred->cr_ngroups > KI_NGROUPS) {
+ if (1 + cred->cr_ngroups > KI_NGROUPS) {
kp->ki_ngroups = KI_NGROUPS;
kp->ki_cr_flags |= KI_CRF_GRP_OVERFLOW;
} else
- kp->ki_ngroups = cred->cr_ngroups;
- bcopy(cred->cr_groups, kp->ki_groups,
- kp->ki_ngroups * sizeof(gid_t));
+ kp->ki_ngroups = 1 + cred->cr_ngroups;
+ kp->ki_groups[0] = cred->cr_gid;
+ bcopy(cred->cr_groups, kp->ki_groups + 1,
+ (kp->ki_ngroups - 1) * sizeof(gid_t));
kp->ki_rgid = cred->cr_rgid;
kp->ki_svgid = cred->cr_svgid;
/* If jailed(cred), emulate the old P_JAILED flag. */
@@ -2943,8 +2944,11 @@ sysctl_kern_proc_groups(SYSCTL_HANDLER_ARGS)
cred = crhold(p->p_ucred);
PROC_UNLOCK(p);
- error = SYSCTL_OUT(req, cred->cr_groups,
- cred->cr_ngroups * sizeof(gid_t));
+ error = SYSCTL_OUT(req, &cred->cr_gid, sizeof(gid_t));
+ if (error == 0)
+ error = SYSCTL_OUT(req, cred->cr_groups,
+ cred->cr_ngroups * sizeof(gid_t));
+
crfree(cred);
return (error);
}
diff --git a/sys/kern/kern_rmlock.c b/sys/kern/kern_rmlock.c
index c1633dd19de2..7206572ffc02 100644
--- a/sys/kern/kern_rmlock.c
+++ b/sys/kern/kern_rmlock.c
@@ -337,9 +337,9 @@ rm_wowned(const struct rmlock *rm)
}
void
-rm_sysinit(void *arg)
+rm_sysinit(const void *arg)
{
- struct rm_args *args;
+ const struct rm_args *args;
args = arg;
rm_init_flags(args->ra_rm, args->ra_desc, args->ra_flags);
diff --git a/sys/kern/kern_rwlock.c b/sys/kern/kern_rwlock.c
index e182d1fe9baf..84a3a890be63 100644
--- a/sys/kern/kern_rwlock.c
+++ b/sys/kern/kern_rwlock.c
@@ -266,9 +266,9 @@ _rw_destroy(volatile uintptr_t *c)
}
void
-rw_sysinit(void *arg)
+rw_sysinit(const void *arg)
{
- struct rw_args *args;
+ const struct rw_args *args;
args = arg;
rw_init_flags((struct rwlock *)args->ra_rw, args->ra_desc,
diff --git a/sys/kern/kern_sx.c b/sys/kern/kern_sx.c
index accea5d288eb..c005e112d3b9 100644
--- a/sys/kern/kern_sx.c
+++ b/sys/kern/kern_sx.c
@@ -222,9 +222,9 @@ owner_sx(const struct lock_object *lock, struct thread **owner)
#endif
void
-sx_sysinit(void *arg)
+sx_sysinit(const void *arg)
{
- struct sx_args *sargs = arg;
+ const struct sx_args *sargs = arg;
sx_init_flags(sargs->sa_sx, sargs->sa_desc, sargs->sa_flags);
}
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index 0e8c2b9f362e..4329959a2ef4 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -347,6 +347,17 @@ kern_thr_exit(struct thread *td)
p = td->td_proc;
/*
+ * Clear kernel ASTs in advance of selecting the last exiting
+ * thread and acquiring schedulers locks. It is fine to
+ * clear the ASTs here even if we are not going to exit after
+ * all. On the other hand, leaving them pending could trigger
+ * execution in subsystems in a context where they are not
+ * prepared to handle top kernel actions, even in execution of
+ * an unrelated thread.
+ */
+ ast_kclear(td);
+
+ /*
* If all of the threads in a process call this routine to
* exit (e.g. all threads call pthread_exit()), exactly one
* thread should return to the caller to terminate the process
diff --git a/sys/kern/kern_tslog.c b/sys/kern/kern_tslog.c
index fbf81d423b95..09070eea284f 100644
--- a/sys/kern/kern_tslog.c
+++ b/sys/kern/kern_tslog.c
@@ -220,3 +220,13 @@ SYSCTL_PROC(_debug, OID_AUTO, tslog_user,
CTLTYPE_STRING|CTLFLAG_RD|CTLFLAG_MPSAFE|CTLFLAG_SKIP,
0, 0, sysctl_debug_tslog_user,
"", "Dump recorded userland event timestamps");
+
+void
+sysinit_tslog_shim(const void *data)
+{
+ const struct sysinit_tslog *x = data;
+
+ tslog(curthread, TS_ENTER, "SYSINIT", x->name);
+ (x->func)(x->data);
+ tslog(curthread, TS_EXIT, "SYSINIT", x->name);
+}
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index 62a3da964c37..bf5bda7e058d 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -280,6 +280,9 @@ device_sysctl_handler(SYSCTL_HANDLER_ARGS)
struct sbuf sb;
device_t dev = (device_t)arg1;
device_t iommu;
+#ifdef IOMMU
+ device_t requester;
+#endif
int error;
uint16_t rid;
const char *c;
@@ -314,9 +317,15 @@ device_sysctl_handler(SYSCTL_HANDLER_ARGS)
}
rid = 0;
#ifdef IOMMU
- iommu_get_requester(dev, &rid);
+ error = iommu_get_requester(dev, &requester, &rid);
+ /*
+ * Do not return requester error from sysctl, iommu
+ * unit might be assigned by other means.
+ */
+#else
+ error = ENXIO;
#endif
- if (rid != 0)
+ if (error == 0)
sbuf_printf(&sb, "%srid=%#x", c, rid);
break;
default:
diff --git a/sys/kern/sys_procdesc.c b/sys/kern/sys_procdesc.c
index 11bd1b6f30e1..54b03fc82c90 100644
--- a/sys/kern/sys_procdesc.c
+++ b/sys/kern/sys_procdesc.c
@@ -129,7 +129,7 @@ procdesc_find(struct thread *td, int fd, const cap_rights_t *rightsp,
if (error)
return (error);
if (fp->f_type != DTYPE_PROCDESC) {
- error = EBADF;
+ error = EINVAL;
goto out;
}
pd = fp->f_data;
@@ -175,7 +175,7 @@ kern_pdgetpid(struct thread *td, int fd, const cap_rights_t *rightsp,
if (error)
return (error);
if (fp->f_type != DTYPE_PROCDESC) {
- error = EBADF;
+ error = EINVAL;
goto out;
}
*pidp = procdesc_pid(fp);
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index 4122f9261871..4cef89cd5219 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -602,4 +602,6 @@ const char *syscallnames[] = {
"inotify_rm_watch", /* 594 = inotify_rm_watch */
"getgroups", /* 595 = getgroups */
"setgroups", /* 596 = setgroups */
+ "jail_attach_jd", /* 597 = jail_attach_jd */
+ "jail_remove_jd", /* 598 = jail_remove_jd */
};
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index fa64597d14a5..911f9093824b 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -3383,5 +3383,15 @@
_In_reads_(gidsetsize) const gid_t *gidset
);
}
+597 AUE_JAIL_ATTACH STD {
+ int jail_attach_jd(
+ int fd
+ );
+ }
+598 AUE_JAIL_REMOVE STD {
+ int jail_remove_jd(
+ int fd
+ );
+ }
; vim: syntax=off
diff --git a/sys/kern/systrace_args.c b/sys/kern/systrace_args.c
index 2b1ea9eed8d4..e28fef931ea8 100644
--- a/sys/kern/systrace_args.c
+++ b/sys/kern/systrace_args.c
@@ -3500,6 +3500,20 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
*n_args = 2;
break;
}
+ /* jail_attach_jd */
+ case 597: {
+ struct jail_attach_jd_args *p = params;
+ iarg[a++] = p->fd; /* int */
+ *n_args = 1;
+ break;
+ }
+ /* jail_remove_jd */
+ case 598: {
+ struct jail_remove_jd_args *p = params;
+ iarg[a++] = p->fd; /* int */
+ *n_args = 1;
+ break;
+ }
default:
*n_args = 0;
break;
@@ -9367,6 +9381,26 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
break;
};
break;
+ /* jail_attach_jd */
+ case 597:
+ switch (ndx) {
+ case 0:
+ p = "int";
+ break;
+ default:
+ break;
+ };
+ break;
+ /* jail_remove_jd */
+ case 598:
+ switch (ndx) {
+ case 0:
+ p = "int";
+ break;
+ default:
+ break;
+ };
+ break;
default:
break;
};
@@ -11365,6 +11399,16 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
if (ndx == 0 || ndx == 1)
p = "int";
break;
+ /* jail_attach_jd */
+ case 597:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
+ /* jail_remove_jd */
+ case 598:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
diff --git a/sys/libkern/arm64/crc32c_armv8.S b/sys/libkern/arm64/crc32c_armv8.S
index 649afff4b711..430b24f7615a 100644
--- a/sys/libkern/arm64/crc32c_armv8.S
+++ b/sys/libkern/arm64/crc32c_armv8.S
@@ -39,14 +39,14 @@ ENTRY(armv8_crc32c)
cbz w2, end
tbz x1, #0x0, half_word_aligned
sub w2, w2, 0x1
- ldr w10, [x1], #0x1
+ ldrb w10, [x1], #0x1
crc32cb w0, w0, w10
half_word_aligned:
cmp w2, #0x2
b.lo last_byte
tbz x1, #0x1, word_aligned
sub w2, w2, 0x2
- ldr w10, [x1], #0x2
+ ldrh w10, [x1], #0x2
crc32ch w0, w0, w10
word_aligned:
cmp w2, #0x4
@@ -69,11 +69,11 @@ last_word:
crc32cw w0, w0, w10
last_half_word:
tbz w2, #0x1, last_byte
- ldr w10, [x1], #0x2
+ ldrh w10, [x1], #0x2
crc32ch w0, w0, w10
last_byte:
tbz w2, #0x0, end
- ldr w10, [x1], #0x1
+ ldrb w10, [x1], #0x1
crc32cb w0, w0, w10
end:
ret
diff --git a/sys/modules/dtb/rockchip/Makefile b/sys/modules/dtb/rockchip/Makefile
index 33c2048cbb15..9c8ca1acc837 100644
--- a/sys/modules/dtb/rockchip/Makefile
+++ b/sys/modules/dtb/rockchip/Makefile
@@ -21,7 +21,8 @@ DTS= \
rockchip/rk3566-quartz64-a.dts \
rockchip/rk3568-nanopi-r5s.dts \
rockchip/rk3566-radxa-zero-3e.dts \
- rockchip/rk3566-radxa-zero-3w.dts
+ rockchip/rk3566-radxa-zero-3w.dts \
+ rockchip/rk3568-bpi-r2-pro.dts
DTSO= rk3328-analog-sound.dtso \
rk3328-i2c0.dtso \
diff --git a/sys/modules/sound/driver/hda/Makefile b/sys/modules/sound/driver/hda/Makefile
index 0eec98fc53e1..1e137dc5671c 100644
--- a/sys/modules/sound/driver/hda/Makefile
+++ b/sys/modules/sound/driver/hda/Makefile
@@ -2,7 +2,7 @@
KMOD= snd_hda
SRCS= device_if.h bus_if.h pci_if.h channel_if.h mixer_if.h hdac_if.h
-SRCS+= hdaa.c hdaa.h hdaa_patches.c hdac.c hdac_if.h hdac_if.c
-SRCS+= hdacc.c hdac_private.h hdac_reg.h hda_reg.h hdac.h
+SRCS+= hdaa.c hdaa.h hdaa_patches.c hdacc.c hdac.c hdac_if.c
+SRCS+= hdac_private.h hdac_reg.h hda_reg.h hdac.h
.include <bsd.kmod.mk>
diff --git a/sys/modules/zfs/zfs_config.h b/sys/modules/zfs/zfs_config.h
index 72167b752e53..8b3e64eba2f3 100644
--- a/sys/modules/zfs/zfs_config.h
+++ b/sys/modules/zfs/zfs_config.h
@@ -258,6 +258,9 @@
/* dops->d_revalidate() takes 4 args */
/* #undef HAVE_D_REVALIDATE_4ARGS */
+/* Define if d_set_d_op() is available */
+/* #undef HAVE_D_SET_D_OP */
+
/* Define to 1 if you have the 'execvpe' function. */
#define HAVE_EXECVPE 1
@@ -483,9 +486,6 @@
/* building against unsupported kernel version */
/* #undef HAVE_LINUX_EXPERIMENTAL */
-/* Define to 1 if you have the <linux/stat.h> header file. */
-/* #undef HAVE_LINUX_STAT_H */
-
/* makedev() is declared in sys/mkdev.h */
/* #undef HAVE_MAKEDEV_IN_MKDEV */
@@ -840,7 +840,7 @@
/* #undef ZFS_DEVICE_MINOR */
/* Define the project alias string. */
-#define ZFS_META_ALIAS "zfs-2.4.0-rc1-FreeBSD_g00dfa094a"
+#define ZFS_META_ALIAS "zfs-2.4.99-29-FreeBSD_g7939bad5e"
/* Define the project author. */
#define ZFS_META_AUTHOR "OpenZFS"
@@ -870,10 +870,10 @@
#define ZFS_META_NAME "zfs"
/* Define the project release. */
-#define ZFS_META_RELEASE "zfs-2.4.0-rc1-FreeBSD_g00dfa094a"
+#define ZFS_META_RELEASE "29-FreeBSD_g7939bad5e"
/* Define the project version. */
-#define ZFS_META_VERSION "2.4.0"
+#define ZFS_META_VERSION "2.4.99"
/* count is located in percpu_ref.data */
/* #undef ZFS_PERCPU_REF_COUNT_IN_DATA */
diff --git a/sys/modules/zfs/zfs_gitrev.h b/sys/modules/zfs/zfs_gitrev.h
index 2b5d717da216..fff89435a0ff 100644
--- a/sys/modules/zfs/zfs_gitrev.h
+++ b/sys/modules/zfs/zfs_gitrev.h
@@ -1 +1 @@
-#define ZFS_META_GITREV "zfs-2.4.0-rc1-0-g00dfa094a"
+#define ZFS_META_GITREV "zfs-2.4.99-29-g7939bad5e"
diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index 308ecad0a846..1e6d98291c04 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -3646,6 +3646,12 @@ defrag:
bus_dmamap_unload(buf_tag, map);
DBG_COUNTER_INC(encap_txq_avail_fail);
DBG_COUNTER_INC(encap_txd_encap_fail);
+ if (ctx->ifc_sysctl_simple_tx) {
+ *m_headp = m_head = iflib_remove_mbuf(txq);
+ m_freem(*m_headp);
+ DBG_COUNTER_INC(tx_frees);
+ *m_headp = NULL;
+ }
if ((txq->ift_task.gt_task.ta_flags & TASK_ENQUEUED) == 0)
GROUPTASK_ENQUEUE(&txq->ift_task);
return (ENOBUFS);
@@ -4298,6 +4304,10 @@ iflib_if_transmit(if_t ifp, struct mbuf *m)
ifmp_ring_check_drainage(txq->ift_br, TX_BATCH_SIZE);
m_freem(m);
DBG_COUNTER_INC(tx_frees);
+ if (err == ENOBUFS)
+ if_inc_counter(ifp, IFCOUNTER_OQDROPS, 1);
+ else
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
}
return (err);
@@ -7141,6 +7151,11 @@ iflib_simple_transmit(if_t ifp, struct mbuf *m)
bytes_sent += m->m_pkthdr.len;
mcast_sent += !!(m->m_flags & M_MCAST);
(void)iflib_txd_db_check(txq, true);
+ } else {
+ if (error == ENOBUFS)
+ if_inc_counter(ifp, IFCOUNTER_OQDROPS, 1);
+ else
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
}
(void)iflib_completed_tx_reclaim(txq, RECLAIM_THRESH(ctx));
mtx_unlock(&txq->ift_mtx);
diff --git a/sys/net/pfvar.h b/sys/net/pfvar.h
index f73420494000..e6fb1c2c3e1b 100644
--- a/sys/net/pfvar.h
+++ b/sys/net/pfvar.h
@@ -2423,7 +2423,7 @@ int pf_multihome_scan_init(int, int, struct pf_pdesc *);
int pf_multihome_scan_asconf(int, int, struct pf_pdesc *);
u_int32_t pf_new_isn(struct pf_kstate *);
-void *pf_pull_hdr(const struct mbuf *, int, void *, int, u_short *, u_short *,
+void *pf_pull_hdr(const struct mbuf *, int, void *, int, u_short *,
sa_family_t);
void pf_change_a(void *, u_int16_t *, u_int32_t, u_int8_t);
void pf_change_proto_a(struct mbuf *, void *, u_int16_t *, u_int32_t,
diff --git a/sys/net80211/ieee80211_ht.c b/sys/net80211/ieee80211_ht.c
index 018927a6dad4..3af56a228295 100644
--- a/sys/net80211/ieee80211_ht.c
+++ b/sys/net80211/ieee80211_ht.c
@@ -1933,7 +1933,7 @@ ieee80211_vht_get_vhtflags(struct ieee80211_node *ni, uint32_t htflags)
{
#define _RETURN_CHAN_BITS(_cb) \
do { \
- IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni, \
+ if (0) IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni, \
"%s:%d: selected %b", __func__, __LINE__, \
(_cb), IEEE80211_CHAN_BITS); \
return (_cb); \
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c
index 57fe687adffe..116fc76a9ce1 100644
--- a/sys/net80211/ieee80211_output.c
+++ b/sys/net80211/ieee80211_output.c
@@ -1082,6 +1082,12 @@ ieee80211_send_nulldata(struct ieee80211_node *ni)
uint8_t *frm;
int ret;
+ /* Don't send NULL frames if we've been configured not to do so. */
+ if ((ic->ic_flags_ext & IEEE80211_FEXT_NO_NULLDATA) != 0) {
+ ieee80211_node_decref(ni);
+ return (0);
+ }
+
if (vap->iv_state == IEEE80211_S_CAC) {
IEEE80211_NOTE(vap, IEEE80211_MSG_OUTPUT | IEEE80211_MSG_DOTH,
ni, "block %s frame in CAC state", "null data");
diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h
index a0293f814899..b9bc2357428d 100644
--- a/sys/net80211/ieee80211_var.h
+++ b/sys/net80211/ieee80211_var.h
@@ -700,13 +700,14 @@ MALLOC_DECLARE(M_80211_VAP);
#define IEEE80211_FEXT_QUIET_IE 0x00800000 /* STATUS: quiet IE in a beacon has been added */
#define IEEE80211_FEXT_UAPSD 0x01000000 /* CONF: enable U-APSD */
#define IEEE80211_FEXT_AMPDU_OFFLOAD 0x02000000 /* CONF: driver/fw handles AMPDU[-TX] itself */
+#define IEEE80211_FEXT_NO_NULLDATA 0x04000000 /* CONF: don't originate NULL data frames from net80211 */
#define IEEE80211_FEXT_BITS \
"\20\2INACT\3SCANWAIT\4BGSCAN\5WPS\6TSN\7SCANREQ\10RESUME" \
"\0114ADDR\12NONEPR_PR\13SWBMISS\14DFS\15DOTD\16STATEWAIT\17REINIT" \
"\20BPF\21WDSLEGACY\22PROBECHAN\23UNIQMAC\24SCAN_OFFLOAD\25SEQNO_OFFLOAD" \
"\26FRAG_OFFLOAD\27VHT" \
- "\30QUIET_IE\31UAPSD\32AMPDU_OFFLOAD"
+ "\30QUIET_IE\31UAPSD\32AMPDU_OFFLOAD\33NO_NULLDATA"
/* ic_flags_ht/iv_flags_ht */
#define IEEE80211_FHT_NONHT_PR 0x00000001 /* STATUS: non-HT sta present */
diff --git a/sys/netinet/tcp_log_buf.c b/sys/netinet/tcp_log_buf.c
index e24790ece43d..473c534ef83d 100644
--- a/sys/netinet/tcp_log_buf.c
+++ b/sys/netinet/tcp_log_buf.c
@@ -61,6 +61,9 @@
#include <net/vnet.h>
#include <netinet/in.h>
+#ifdef DDB
+#include <netinet/in_kdtrace.h>
+#endif
#include <netinet/in_pcb.h>
#include <netinet/in_var.h>
#include <netinet/tcp_var.h>
diff --git a/sys/netinet/tcp_sack.c b/sys/netinet/tcp_sack.c
index b6c55fac50b3..6e08ad2796a8 100644
--- a/sys/netinet/tcp_sack.c
+++ b/sys/netinet/tcp_sack.c
@@ -128,8 +128,25 @@ SYSCTL_INT(_net_inet_tcp_sack, OID_AUTO, enable, CTLFLAG_VNET | CTLFLAG_RW,
"Enable/Disable TCP SACK support");
VNET_DEFINE(int, tcp_do_newsack) = 1;
-SYSCTL_INT(_net_inet_tcp_sack, OID_AUTO, revised, CTLFLAG_VNET | CTLFLAG_RW,
- &VNET_NAME(tcp_do_newsack), 0,
+
+static int
+sysctl_net_inet_tcp_sack_revised(SYSCTL_HANDLER_ARGS)
+{
+ int error;
+ int new;
+
+ new = V_tcp_do_newsack;
+ error = sysctl_handle_int(oidp, &new, 0, req);
+ if (error == 0 && req->newptr) {
+ V_tcp_do_newsack = new;
+ gone_in(16, "net.inet.tcp.sack.revised will be deprecated."
+ " net.inet.tcp.sack.enable will always follow RFC6675 SACK.\n");
+ }
+ return (error);
+}
+
+SYSCTL_PROC(_net_inet_tcp_sack, OID_AUTO, revised, CTLFLAG_VNET | CTLFLAG_RW | CTLTYPE_INT,
+ &VNET_NAME(tcp_do_newsack), 0, sysctl_net_inet_tcp_sack_revised, "CU",
"Use revised SACK loss recovery per RFC 6675");
VNET_DEFINE(int, tcp_do_lrd) = 1;
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 2e039ebbfdd2..cc83a21773a8 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -645,14 +645,14 @@ out:
static int
sysctl_net_inet_default_tcp_functions(SYSCTL_HANDLER_ARGS)
{
- int error = ENOENT;
struct tcp_function_set fs;
struct tcp_function_block *blk;
+ int error;
- memset(&fs, 0, sizeof(fs));
+ memset(&fs, 0, sizeof(struct tcp_function_set));
rw_rlock(&tcp_function_lock);
blk = find_tcp_fb_locked(V_tcp_func_set_ptr, NULL);
- if (blk) {
+ if (blk != NULL) {
/* Found him */
strcpy(fs.function_set_name, blk->tfb_tcp_block_name);
fs.pcbcnt = blk->tfb_refcnt;
diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c
index f284f7fa5ffc..cc149616006e 100644
--- a/sys/netinet6/in6_ifattach.c
+++ b/sys/netinet6/in6_ifattach.c
@@ -83,7 +83,6 @@ VNET_DECLARE(struct inpcbinfo, ripcbinfo);
#define V_ripcbinfo VNET(ripcbinfo)
static int get_rand_ifid(struct ifnet *, struct in6_addr *);
-static int get_ifid(struct ifnet *, struct ifnet *, struct in6_addr *);
static int in6_ifattach_linklocal(struct ifnet *, struct ifnet *);
static int in6_ifattach_loopback(struct ifnet *);
static void in6_purgemaddrs(struct ifnet *);
@@ -271,8 +270,8 @@ found:
*
* altifp - secondary EUI64 source
*/
-static int
-get_ifid(struct ifnet *ifp0, struct ifnet *altifp,
+int
+in6_get_ifid(struct ifnet *ifp0, struct ifnet *altifp,
struct in6_addr *in6)
{
struct ifnet *ifp;
@@ -356,7 +355,7 @@ in6_ifattach_linklocal(struct ifnet *ifp, struct ifnet *altifp)
ifra.ifra_addr.sin6_addr.s6_addr32[3] = htonl(1);
} else {
NET_EPOCH_ENTER(et);
- error = get_ifid(ifp, altifp, &ifra.ifra_addr.sin6_addr);
+ error = in6_get_ifid(ifp, altifp, &ifra.ifra_addr.sin6_addr);
NET_EPOCH_EXIT(et);
if (error != 0) {
nd6log((LOG_ERR,
diff --git a/sys/netinet6/in6_ifattach.h b/sys/netinet6/in6_ifattach.h
index 897926e90078..fd52422b10be 100644
--- a/sys/netinet6/in6_ifattach.h
+++ b/sys/netinet6/in6_ifattach.h
@@ -41,6 +41,7 @@ void in6_ifdetach(struct ifnet *);
void in6_ifdetach_destroy(struct ifnet *);
void in6_tmpaddrtimer(void *);
int in6_get_hw_ifid(struct ifnet *, struct in6_addr *);
+int in6_get_ifid(struct ifnet *, struct ifnet *, struct in6_addr *);
int in6_nigroup(struct ifnet *, const char *, int, struct in6_addr *);
int in6_nigroup_oldmcprefix(struct ifnet *, const char *, int, struct in6_addr *);
#endif /* _KERNEL */
diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c
index b9af0a78a584..6fe78083df23 100644
--- a/sys/netinet6/nd6_rtr.c
+++ b/sys/netinet6/nd6_rtr.c
@@ -1182,9 +1182,9 @@ in6_ifadd(struct nd_prefixctl *pr, int mcast)
struct ifnet *ifp = pr->ndpr_ifp;
struct ifaddr *ifa;
struct in6_aliasreq ifra;
- struct in6_ifaddr *ia, *ib;
+ struct in6_ifaddr *ia = NULL, *ib = NULL;
int error, plen0;
- struct in6_addr mask;
+ struct in6_addr *ifid_addr = NULL, mask;
int prefixlen = pr->ndpr_plen;
int updateflags;
char ip6buf[INET6_ADDRSTRLEN];
@@ -1212,18 +1212,42 @@ in6_ifadd(struct nd_prefixctl *pr, int mcast)
* with different interface identifiers.
*/
ifa = (struct ifaddr *)in6ifa_ifpforlinklocal(ifp, 0); /* 0 is OK? */
- if (ifa)
+ if (ifa) {
ib = (struct in6_ifaddr *)ifa;
- else
- return NULL;
+ ifid_addr = &ib->ia_addr.sin6_addr;
+
+ /* prefixlen + ifidlen must be equal to 128 */
+ plen0 = in6_mask2len(&ib->ia_prefixmask.sin6_addr, NULL);
+ if (prefixlen != plen0) {
+ ifa_free(ifa);
+ ifid_addr = NULL;
+ nd6log((LOG_DEBUG,
+ "%s: wrong prefixlen for %s (prefix=%d ifid=%d)\n",
+ __func__, if_name(ifp), prefixlen, 128 - plen0));
+ }
+ }
- /* prefixlen + ifidlen must be equal to 128 */
- plen0 = in6_mask2len(&ib->ia_prefixmask.sin6_addr, NULL);
- if (prefixlen != plen0) {
- ifa_free(ifa);
+ /* No suitable LL address, get the ifid directly */
+ if (ifid_addr == NULL) {
+ struct in6_addr taddr;
+ ifa = ifa_alloc(sizeof(taddr), M_WAITOK);
+ if (ifa) {
+ ib = (struct in6_ifaddr *)ifa;
+ ifid_addr = &ib->ia_addr.sin6_addr;
+ if(in6_get_ifid(ifp, NULL, ifid_addr) != 0) {
+ nd6log((LOG_DEBUG,
+ "%s: failed to get ifid for %s\n",
+ __func__, if_name(ifp)));
+ ifa_free(ifa);
+ ifid_addr = NULL;
+ }
+ }
+ }
+
+ if (ifid_addr == NULL) {
nd6log((LOG_INFO,
- "%s: wrong prefixlen for %s (prefix=%d ifid=%d)\n",
- __func__, if_name(ifp), prefixlen, 128 - plen0));
+ "%s: could not determine ifid for %s\n",
+ __func__, if_name(ifp)));
return NULL;
}
@@ -1233,13 +1257,13 @@ in6_ifadd(struct nd_prefixctl *pr, int mcast)
IN6_MASK_ADDR(&ifra.ifra_addr.sin6_addr, &mask);
/* interface ID */
ifra.ifra_addr.sin6_addr.s6_addr32[0] |=
- (ib->ia_addr.sin6_addr.s6_addr32[0] & ~mask.s6_addr32[0]);
+ (ifid_addr->s6_addr32[0] & ~mask.s6_addr32[0]);
ifra.ifra_addr.sin6_addr.s6_addr32[1] |=
- (ib->ia_addr.sin6_addr.s6_addr32[1] & ~mask.s6_addr32[1]);
+ (ifid_addr->s6_addr32[1] & ~mask.s6_addr32[1]);
ifra.ifra_addr.sin6_addr.s6_addr32[2] |=
- (ib->ia_addr.sin6_addr.s6_addr32[2] & ~mask.s6_addr32[2]);
+ (ifid_addr->s6_addr32[2] & ~mask.s6_addr32[2]);
ifra.ifra_addr.sin6_addr.s6_addr32[3] |=
- (ib->ia_addr.sin6_addr.s6_addr32[3] & ~mask.s6_addr32[3]);
+ (ifid_addr->s6_addr32[3] & ~mask.s6_addr32[3]);
ifa_free(ifa);
/* lifetimes. */
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index 242152f17db0..5889bb9d68e6 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -1676,7 +1676,7 @@ pf_state_key_addr_setup(struct pf_pdesc *pd,
if (multi)
return (-1);
if (!pf_pull_hdr(pd->m, pd->off, &nd, sizeof(nd), NULL,
- NULL, pd->af))
+ pd->af))
return (-1);
target = (struct pf_addr *)&nd.nd_ns_target;
daddr = target;
@@ -1685,7 +1685,7 @@ pf_state_key_addr_setup(struct pf_pdesc *pd,
if (multi)
return (-1);
if (!pf_pull_hdr(pd->m, pd->off, &nd, sizeof(nd), NULL,
- NULL, pd->af))
+ pd->af))
return (-1);
target = (struct pf_addr *)&nd.nd_ns_target;
saddr = target;
@@ -4044,7 +4044,7 @@ pf_modulate_sack(struct pf_pdesc *pd, struct tcphdr *th,
optsoff = pd->off + sizeof(struct tcphdr);
#define TCPOLEN_MINSACK (TCPOLEN_SACK + 2)
if (olen < TCPOLEN_MINSACK ||
- !pf_pull_hdr(pd->m, optsoff, opts, olen, NULL, NULL, pd->af))
+ !pf_pull_hdr(pd->m, optsoff, opts, olen, NULL, pd->af))
return (0);
eoh = opts + olen;
@@ -5107,7 +5107,7 @@ pf_get_wscale(struct pf_pdesc *pd)
olen = (pd->hdr.tcp.th_off << 2) - sizeof(struct tcphdr);
if (olen < TCPOLEN_WINDOW || !pf_pull_hdr(pd->m,
- pd->off + sizeof(struct tcphdr), opts, olen, NULL, NULL, pd->af))
+ pd->off + sizeof(struct tcphdr), opts, olen, NULL, pd->af))
return (0);
opt = opts;
@@ -5132,7 +5132,7 @@ pf_get_mss(struct pf_pdesc *pd)
olen = (pd->hdr.tcp.th_off << 2) - sizeof(struct tcphdr);
if (olen < TCPOLEN_MAXSEG || !pf_pull_hdr(pd->m,
- pd->off + sizeof(struct tcphdr), opts, olen, NULL, NULL, pd->af))
+ pd->off + sizeof(struct tcphdr), opts, olen, NULL, pd->af))
return (0);
opt = opts;
@@ -7660,7 +7660,7 @@ pf_multihome_scan(int start, int len, struct pf_pdesc *pd, int op)
while (off < len) {
struct sctp_paramhdr h;
- if (!pf_pull_hdr(pd->m, start + off, &h, sizeof(h), NULL, NULL,
+ if (!pf_pull_hdr(pd->m, start + off, &h, sizeof(h), NULL,
pd->af))
return (PF_DROP);
@@ -7680,7 +7680,7 @@ pf_multihome_scan(int start, int len, struct pf_pdesc *pd, int op)
return (PF_DROP);
if (!pf_pull_hdr(pd->m, start + off + sizeof(h), &t, sizeof(t),
- NULL, NULL, pd->af))
+ NULL, pd->af))
return (PF_DROP);
if (in_nullhost(t))
@@ -7724,7 +7724,7 @@ pf_multihome_scan(int start, int len, struct pf_pdesc *pd, int op)
return (PF_DROP);
if (!pf_pull_hdr(pd->m, start + off + sizeof(h), &t, sizeof(t),
- NULL, NULL, pd->af))
+ NULL, pd->af))
return (PF_DROP);
if (memcmp(&t, &pd->src->v6, sizeof(t)) == 0)
break;
@@ -7754,7 +7754,7 @@ pf_multihome_scan(int start, int len, struct pf_pdesc *pd, int op)
struct sctp_asconf_paramhdr ah;
if (!pf_pull_hdr(pd->m, start + off, &ah, sizeof(ah),
- NULL, NULL, pd->af))
+ NULL, pd->af))
return (PF_DROP);
ret = pf_multihome_scan(start + off + sizeof(ah),
@@ -7769,7 +7769,7 @@ pf_multihome_scan(int start, int len, struct pf_pdesc *pd, int op)
struct sctp_asconf_paramhdr ah;
if (!pf_pull_hdr(pd->m, start + off, &ah, sizeof(ah),
- NULL, NULL, pd->af))
+ NULL, pd->af))
return (PF_DROP);
ret = pf_multihome_scan(start + off + sizeof(ah),
ntohs(ah.ph.param_length) - sizeof(ah), pd,
@@ -8051,7 +8051,7 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
ipoff2 = pd->off + ICMP_MINLEN;
if (!pf_pull_hdr(pd->m, ipoff2, &h2, sizeof(h2),
- NULL, reason, pd2.af)) {
+ reason, pd2.af)) {
DPFPRINTF(PF_DEBUG_MISC,
"pf: ICMP error message too short "
"(ip)");
@@ -8083,7 +8083,7 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
ipoff2 = pd->off + sizeof(struct icmp6_hdr);
if (!pf_pull_hdr(pd->m, ipoff2, &h2_6, sizeof(h2_6),
- NULL, reason, pd2.af)) {
+ reason, pd2.af)) {
DPFPRINTF(PF_DEBUG_MISC,
"pf: ICMP error message too short "
"(ip6)");
@@ -8136,7 +8136,7 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
* expected. Don't access any TCP header fields after
* th_seq, an ackskew test is not possible.
*/
- if (!pf_pull_hdr(pd->m, pd2.off, th, 8, NULL, reason,
+ if (!pf_pull_hdr(pd->m, pd2.off, th, 8, reason,
pd2.af)) {
DPFPRINTF(PF_DEBUG_MISC,
"pf: ICMP error message too short "
@@ -8332,7 +8332,7 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
int action;
if (!pf_pull_hdr(pd->m, pd2.off, uh, sizeof(*uh),
- NULL, reason, pd2.af)) {
+ reason, pd2.af)) {
DPFPRINTF(PF_DEBUG_MISC,
"pf: ICMP error message too short "
"(udp)");
@@ -8463,7 +8463,7 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
int copyback = 0;
int action;
- if (! pf_pull_hdr(pd->m, pd2.off, sh, sizeof(*sh), NULL, reason,
+ if (! pf_pull_hdr(pd->m, pd2.off, sh, sizeof(*sh), reason,
pd2.af)) {
DPFPRINTF(PF_DEBUG_MISC,
"pf: ICMP error message too short "
@@ -8619,7 +8619,7 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
}
if (!pf_pull_hdr(pd->m, pd2.off, iih, ICMP_MINLEN,
- NULL, reason, pd2.af)) {
+ reason, pd2.af)) {
DPFPRINTF(PF_DEBUG_MISC,
"pf: ICMP error message too short i"
"(icmp)");
@@ -8739,7 +8739,7 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
}
if (!pf_pull_hdr(pd->m, pd2.off, iih,
- sizeof(struct icmp6_hdr), NULL, reason, pd2.af)) {
+ sizeof(struct icmp6_hdr), reason, pd2.af)) {
DPFPRINTF(PF_DEBUG_MISC,
"pf: ICMP error message too short "
"(icmp6)");
@@ -8854,6 +8854,11 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
default: {
int action;
+ /*
+ * Placeholder value, so future calls to pf_change_ap()
+ * don't try to update a NULL checksum pointer.
+ */
+ pd->pcksum = &pd->sctp_dummy_sum;
key.af = pd2.af;
key.proto = pd2.proto;
pf_addrcpy(&key.addr[pd2.sidx], pd2.src, key.af);
@@ -8916,7 +8921,7 @@ pf_test_state_icmp(struct pf_kstate **state, struct pf_pdesc *pd,
*/
void *
pf_pull_hdr(const struct mbuf *m, int off, void *p, int len,
- u_short *actionp, u_short *reasonp, sa_family_t af)
+ u_short *reasonp, sa_family_t af)
{
int iplen = 0;
switch (af) {
@@ -8926,12 +8931,7 @@ pf_pull_hdr(const struct mbuf *m, int off, void *p, int len,
u_int16_t fragoff = (ntohs(h->ip_off) & IP_OFFMASK) << 3;
if (fragoff) {
- if (fragoff >= len)
- ACTION_SET(actionp, PF_PASS);
- else {
- ACTION_SET(actionp, PF_DROP);
- REASON_SET(reasonp, PFRES_FRAG);
- }
+ REASON_SET(reasonp, PFRES_FRAG);
return (NULL);
}
iplen = ntohs(h->ip_len);
@@ -8948,7 +8948,6 @@ pf_pull_hdr(const struct mbuf *m, int off, void *p, int len,
#endif /* INET6 */
}
if (m->m_pkthdr.len < off + len || iplen < off + len) {
- ACTION_SET(actionp, PF_DROP);
REASON_SET(reasonp, PFRES_SHORT);
return (NULL);
}
@@ -10047,7 +10046,7 @@ pf_walk_header(struct pf_pdesc *pd, struct ip *h, u_short *reason)
end < pd->off + sizeof(ext))
return (PF_PASS);
if (!pf_pull_hdr(pd->m, pd->off, &ext, sizeof(ext),
- NULL, reason, AF_INET)) {
+ reason, AF_INET)) {
DPFPRINTF(PF_DEBUG_MISC, "IP short exthdr");
return (PF_DROP);
}
@@ -10073,7 +10072,7 @@ pf_walk_option6(struct pf_pdesc *pd, struct ip6_hdr *h, int off, int end,
while (off < end) {
if (!pf_pull_hdr(pd->m, off, &opt.ip6o_type,
- sizeof(opt.ip6o_type), NULL, reason, AF_INET6)) {
+ sizeof(opt.ip6o_type), reason, AF_INET6)) {
DPFPRINTF(PF_DEBUG_MISC, "IPv6 short opt type");
return (PF_DROP);
}
@@ -10081,7 +10080,7 @@ pf_walk_option6(struct pf_pdesc *pd, struct ip6_hdr *h, int off, int end,
off++;
continue;
}
- if (!pf_pull_hdr(pd->m, off, &opt, sizeof(opt), NULL,
+ if (!pf_pull_hdr(pd->m, off, &opt, sizeof(opt),
reason, AF_INET6)) {
DPFPRINTF(PF_DEBUG_MISC, "IPv6 short opt");
return (PF_DROP);
@@ -10106,7 +10105,7 @@ pf_walk_option6(struct pf_pdesc *pd, struct ip6_hdr *h, int off, int end,
REASON_SET(reason, PFRES_IPOPTIONS);
return (PF_DROP);
}
- if (!pf_pull_hdr(pd->m, off, &jumbo, sizeof(jumbo), NULL,
+ if (!pf_pull_hdr(pd->m, off, &jumbo, sizeof(jumbo),
reason, AF_INET6)) {
DPFPRINTF(PF_DEBUG_MISC, "IPv6 short jumbo");
return (PF_DROP);
@@ -10155,7 +10154,7 @@ pf_walk_header6(struct pf_pdesc *pd, struct ip6_hdr *h, u_short *reason)
break;
case IPPROTO_HOPOPTS:
if (!pf_pull_hdr(pd->m, pd->off, &ext, sizeof(ext),
- NULL, reason, AF_INET6)) {
+ reason, AF_INET6)) {
DPFPRINTF(PF_DEBUG_MISC, "IPv6 short exthdr");
return (PF_DROP);
}
@@ -10182,7 +10181,7 @@ pf_walk_header6(struct pf_pdesc *pd, struct ip6_hdr *h, u_short *reason)
return (PF_DROP);
}
if (!pf_pull_hdr(pd->m, pd->off, &frag, sizeof(frag),
- NULL, reason, AF_INET6)) {
+ reason, AF_INET6)) {
DPFPRINTF(PF_DEBUG_MISC, "IPv6 short fragment");
return (PF_DROP);
}
@@ -10210,7 +10209,7 @@ pf_walk_header6(struct pf_pdesc *pd, struct ip6_hdr *h, u_short *reason)
return (PF_PASS);
}
if (!pf_pull_hdr(pd->m, pd->off, &rthdr, sizeof(rthdr),
- NULL, reason, AF_INET6)) {
+ reason, AF_INET6)) {
DPFPRINTF(PF_DEBUG_MISC, "IPv6 short rthdr");
return (PF_DROP);
}
@@ -10231,7 +10230,7 @@ pf_walk_header6(struct pf_pdesc *pd, struct ip6_hdr *h, u_short *reason)
case IPPROTO_AH:
case IPPROTO_DSTOPTS:
if (!pf_pull_hdr(pd->m, pd->off, &ext, sizeof(ext),
- NULL, reason, AF_INET6)) {
+ reason, AF_INET6)) {
DPFPRINTF(PF_DEBUG_MISC, "IPv6 short exthdr");
return (PF_DROP);
}
@@ -10264,7 +10263,7 @@ pf_walk_header6(struct pf_pdesc *pd, struct ip6_hdr *h, u_short *reason)
return (PF_PASS);
}
if (!pf_pull_hdr(pd->m, pd->off, &icmp6, sizeof(icmp6),
- NULL, reason, AF_INET6)) {
+ reason, AF_INET6)) {
DPFPRINTF(PF_DEBUG_MISC,
"IPv6 short icmp6hdr");
return (PF_DROP);
@@ -10497,7 +10496,7 @@ pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
case IPPROTO_TCP: {
struct tcphdr *th = &pd->hdr.tcp;
- if (!pf_pull_hdr(pd->m, pd->off, th, sizeof(*th), action,
+ if (!pf_pull_hdr(pd->m, pd->off, th, sizeof(*th),
reason, af)) {
*action = PF_DROP;
REASON_SET(reason, PFRES_SHORT);
@@ -10513,7 +10512,7 @@ pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
case IPPROTO_UDP: {
struct udphdr *uh = &pd->hdr.udp;
- if (!pf_pull_hdr(pd->m, pd->off, uh, sizeof(*uh), action,
+ if (!pf_pull_hdr(pd->m, pd->off, uh, sizeof(*uh),
reason, af)) {
*action = PF_DROP;
REASON_SET(reason, PFRES_SHORT);
@@ -10534,7 +10533,7 @@ pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
}
case IPPROTO_SCTP: {
if (!pf_pull_hdr(pd->m, pd->off, &pd->hdr.sctp, sizeof(pd->hdr.sctp),
- action, reason, af)) {
+ reason, af)) {
*action = PF_DROP;
REASON_SET(reason, PFRES_SHORT);
return (-1);
@@ -10564,7 +10563,7 @@ pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
}
case IPPROTO_ICMP: {
if (!pf_pull_hdr(pd->m, pd->off, &pd->hdr.icmp, ICMP_MINLEN,
- action, reason, af)) {
+ reason, af)) {
*action = PF_DROP;
REASON_SET(reason, PFRES_SHORT);
return (-1);
@@ -10578,7 +10577,7 @@ pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
size_t icmp_hlen = sizeof(struct icmp6_hdr);
if (!pf_pull_hdr(pd->m, pd->off, &pd->hdr.icmp6, icmp_hlen,
- action, reason, af)) {
+ reason, af)) {
*action = PF_DROP;
REASON_SET(reason, PFRES_SHORT);
return (-1);
@@ -10604,7 +10603,7 @@ pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
}
if (icmp_hlen > sizeof(struct icmp6_hdr) &&
!pf_pull_hdr(pd->m, pd->off, &pd->hdr.icmp6, icmp_hlen,
- action, reason, af)) {
+ reason, af)) {
*action = PF_DROP;
REASON_SET(reason, PFRES_SHORT);
return (-1);
@@ -10614,6 +10613,13 @@ pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
break;
}
#endif /* INET6 */
+ default:
+ /*
+ * Placeholder value, so future calls to pf_change_ap() don't
+ * try to update a NULL checksum pointer.
+ */
+ pd->pcksum = &pd->sctp_dummy_sum;
+ break;
}
if (pd->sport)
@@ -10621,6 +10627,8 @@ pf_setup_pdesc(sa_family_t af, int dir, struct pf_pdesc *pd, struct mbuf **m0,
if (pd->dport)
pd->odport = pd->ndport = *pd->dport;
+ MPASS(pd->pcksum != NULL);
+
return (0);
}
diff --git a/sys/netpfil/pf/pf_norm.c b/sys/netpfil/pf/pf_norm.c
index a684d778ab42..56074bedbc40 100644
--- a/sys/netpfil/pf/pf_norm.c
+++ b/sys/netpfil/pf/pf_norm.c
@@ -1354,7 +1354,7 @@ pf_normalize_ip6(int off, u_short *reason,
pf_rule_to_actions(r, &pd->act);
}
- if (!pf_pull_hdr(pd->m, off, &frag, sizeof(frag), NULL, reason, AF_INET6))
+ if (!pf_pull_hdr(pd->m, off, &frag, sizeof(frag), reason, AF_INET6))
return (PF_DROP);
/* Offset now points to data portion. */
@@ -1542,7 +1542,7 @@ pf_normalize_tcp_init(struct pf_pdesc *pd, struct tcphdr *th,
olen = (th->th_off << 2) - sizeof(*th);
if (olen < TCPOLEN_TIMESTAMP || !pf_pull_hdr(pd->m,
- pd->off + sizeof(*th), opts, olen, NULL, NULL, pd->af))
+ pd->off + sizeof(*th), opts, olen, NULL, pd->af))
return (0);
opt = opts;
@@ -1645,7 +1645,7 @@ pf_normalize_tcp_stateful(struct pf_pdesc *pd,
if (olen >= TCPOLEN_TIMESTAMP &&
((src->scrub && (src->scrub->pfss_flags & PFSS_TIMESTAMP)) ||
(dst->scrub && (dst->scrub->pfss_flags & PFSS_TIMESTAMP))) &&
- pf_pull_hdr(pd->m, pd->off + sizeof(*th), opts, olen, NULL, NULL, pd->af)) {
+ pf_pull_hdr(pd->m, pd->off + sizeof(*th), opts, olen, NULL, pd->af)) {
/* Modulate the timestamps. Can be used for NAT detection, OS
* uptime determination or reboot detection.
*/
@@ -1975,7 +1975,7 @@ pf_normalize_mss(struct pf_pdesc *pd)
olen = (pd->hdr.tcp.th_off << 2) - sizeof(struct tcphdr);
optsoff = pd->off + sizeof(struct tcphdr);
if (olen < TCPOLEN_MAXSEG ||
- !pf_pull_hdr(pd->m, optsoff, opts, olen, NULL, NULL, pd->af))
+ !pf_pull_hdr(pd->m, optsoff, opts, olen, NULL, pd->af))
return (0);
opt = opts;
@@ -2009,7 +2009,7 @@ pf_scan_sctp(struct pf_pdesc *pd)
int ret;
while (pd->off + chunk_off < pd->tot_len) {
- if (!pf_pull_hdr(pd->m, pd->off + chunk_off, &ch, sizeof(ch), NULL,
+ if (!pf_pull_hdr(pd->m, pd->off + chunk_off, &ch, sizeof(ch),
NULL, pd->af))
return (PF_DROP);
@@ -2026,7 +2026,7 @@ pf_scan_sctp(struct pf_pdesc *pd)
struct sctp_init_chunk init;
if (!pf_pull_hdr(pd->m, pd->off + chunk_start, &init,
- sizeof(init), NULL, NULL, pd->af))
+ sizeof(init), NULL, pd->af))
return (PF_DROP);
/*
diff --git a/sys/netpfil/pf/pf_osfp.c b/sys/netpfil/pf/pf_osfp.c
index 150626c5f3fb..8c041d45eae8 100644
--- a/sys/netpfil/pf/pf_osfp.c
+++ b/sys/netpfil/pf/pf_osfp.c
@@ -82,7 +82,7 @@ pf_osfp_fingerprint(struct pf_pdesc *pd, const struct tcphdr *tcp)
ip6 = mtod(pd->m, struct ip6_hdr *);
break;
}
- if (!pf_pull_hdr(pd->m, pd->off, hdr, tcp->th_off << 2, NULL, NULL,
+ if (!pf_pull_hdr(pd->m, pd->off, hdr, tcp->th_off << 2, NULL,
pd->af)) return (NULL);
return (pf_osfp_fingerprint_hdr(ip, ip6, (struct tcphdr *)hdr));
diff --git a/sys/powerpc/conf/GENERIC64 b/sys/powerpc/conf/GENERIC64
index 630c88b97dd7..48f9df5b7e38 100644
--- a/sys/powerpc/conf/GENERIC64
+++ b/sys/powerpc/conf/GENERIC64
@@ -234,9 +234,9 @@ device wlan # 802.11 support
options IEEE80211_SUPPORT_MESH # enable 802.11s draft support
options IEEE80211_DEBUG # enable debug msgs
device wlan_wep # 802.11 WEP support
+device wlan_tkip # 802.11 TKIP support
device wlan_ccmp # 802.11 CCMP support
device wlan_gcmp # 802.11 GCMP support
-device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device ath # Atheros CardBus/PCI NICs
device ath_hal # Atheros CardBus/PCI chip support
diff --git a/sys/powerpc/conf/GENERIC64LE b/sys/powerpc/conf/GENERIC64LE
index eb9a9441425d..9af71f30626d 100644
--- a/sys/powerpc/conf/GENERIC64LE
+++ b/sys/powerpc/conf/GENERIC64LE
@@ -230,9 +230,9 @@ device wlan # 802.11 support
options IEEE80211_SUPPORT_MESH # enable 802.11s draft support
options IEEE80211_DEBUG # enable debug msgs
device wlan_wep # 802.11 WEP support
+device wlan_tkip # 802.11 TKIP support
device wlan_ccmp # 802.11 CCMP support
device wlan_gcmp # 802.11 GCMP support
-device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
device ath # Atheros CardBus/PCI NICs
device ath_hal # Atheros CardBus/PCI chip support
diff --git a/sys/riscv/include/vmm.h b/sys/riscv/include/vmm.h
index 1221521be368..de7119dd534a 100644
--- a/sys/riscv/include/vmm.h
+++ b/sys/riscv/include/vmm.h
@@ -49,6 +49,7 @@ enum vm_suspend_how {
VM_SUSPEND_RESET,
VM_SUSPEND_POWEROFF,
VM_SUSPEND_HALT,
+ VM_SUSPEND_DESTROY,
VM_SUSPEND_LAST
};
diff --git a/sys/riscv/vmm/vmm.c b/sys/riscv/vmm/vmm.c
index 7528ef6e4698..ec4514f70fa6 100644
--- a/sys/riscv/vmm/vmm.c
+++ b/sys/riscv/vmm/vmm.c
@@ -1036,10 +1036,14 @@ vm_raise_msi(struct vm *vm, uint64_t msg, uint64_t addr, int bus, int slot,
static int
vm_handle_wfi(struct vcpu *vcpu, struct vm_exit *vme, bool *retu)
{
+ struct vm *vm;
+ vm = vcpu->vm;
vcpu_lock(vcpu);
-
while (1) {
+ if (vm->suspend)
+ break;
+
if (aplic_check_pending(vcpu->cookie))
break;
diff --git a/sys/sys/cpu.h b/sys/sys/cpu.h
index b6a0094f0c51..5bb55679a05b 100644
--- a/sys/sys/cpu.h
+++ b/sys/sys/cpu.h
@@ -40,25 +40,31 @@
#define CPU_IVAR_CPUID_SIZE 3
#define CPU_IVAR_CPUID 4
-static __inline struct pcpu *cpu_get_pcpu(device_t dev)
+static __inline struct pcpu *
+cpu_get_pcpu(device_t dev)
{
uintptr_t v = 0;
+
BUS_READ_IVAR(device_get_parent(dev), dev, CPU_IVAR_PCPU, &v);
return ((struct pcpu *)v);
}
-static __inline int32_t cpu_get_nominal_mhz(device_t dev)
+static __inline int32_t
+cpu_get_nominal_mhz(device_t dev)
{
uintptr_t v = 0;
+
if (BUS_READ_IVAR(device_get_parent(dev), dev,
CPU_IVAR_NOMINAL_MHZ, &v) != 0)
return (-1);
return ((int32_t)v);
}
-static __inline const uint32_t *cpu_get_cpuid(device_t dev, size_t *count)
+static __inline const uint32_t *
+cpu_get_cpuid(device_t dev, size_t *count)
{
uintptr_t v = 0;
+
if (BUS_READ_IVAR(device_get_parent(dev), dev,
CPU_IVAR_CPUID_SIZE, &v) != 0)
return (NULL);
@@ -124,10 +130,10 @@ TAILQ_HEAD(cf_level_lst, cf_level);
* state. It is probably a bug to not combine this with "info only"
*/
#define CPUFREQ_TYPE_MASK 0xffff
-#define CPUFREQ_TYPE_RELATIVE (1<<0)
-#define CPUFREQ_TYPE_ABSOLUTE (1<<1)
-#define CPUFREQ_FLAG_INFO_ONLY (1<<16)
-#define CPUFREQ_FLAG_UNCACHED (1<<17)
+#define CPUFREQ_TYPE_RELATIVE (1 << 0)
+#define CPUFREQ_TYPE_ABSOLUTE (1 << 1)
+#define CPUFREQ_FLAG_INFO_ONLY (1 << 16)
+#define CPUFREQ_FLAG_UNCACHED (1 << 17)
/*
* When setting a level, the caller indicates the priority of this request.
@@ -162,7 +168,7 @@ int cpufreq_settings_changed(device_t dev);
* The new level and the result of the change (0 is success) is passed in.
* If the driver wishes to revoke the change from cpufreq_pre_change, it
* stores a non-zero error code in the result parameter and the change will
- * not be made. If the post-change eventhandler gets a non-zero result,
+ * not be made. If the post-change eventhandler gets a non-zero result,
* no change was made and the previous level remains in effect. If a change
* is revoked, the post-change eventhandler is still called with the error
* value supplied by the revoking driver. This gives listeners who cached
diff --git a/sys/sys/file.h b/sys/sys/file.h
index 63313926c4f0..cc3c733580fd 100644
--- a/sys/sys/file.h
+++ b/sys/sys/file.h
@@ -72,6 +72,7 @@ struct nameidata;
#define DTYPE_EVENTFD 13 /* eventfd */
#define DTYPE_TIMERFD 14 /* timerfd */
#define DTYPE_INOTIFY 15 /* inotify descriptor */
+#define DTYPE_JAILDESC 16 /* jail descriptor */
#ifdef _KERNEL
diff --git a/sys/sys/jail.h b/sys/sys/jail.h
index 4512e43a2866..e12e8c3178c9 100644
--- a/sys/sys/jail.h
+++ b/sys/sys/jail.h
@@ -99,8 +99,12 @@ enum prison_state {
#define JAIL_UPDATE 0x02 /* Update parameters of existing jail */
#define JAIL_ATTACH 0x04 /* Attach to jail upon creation */
#define JAIL_DYING 0x08 /* Allow getting a dying jail */
-#define JAIL_SET_MASK 0x0f /* JAIL_DYING is deprecated/ignored here */
-#define JAIL_GET_MASK 0x08
+#define JAIL_USE_DESC 0x10 /* Get/set jail in descriptor */
+#define JAIL_AT_DESC 0x20 /* Find/add jail under descriptor */
+#define JAIL_GET_DESC 0x40 /* Return a new jail descriptor */
+#define JAIL_OWN_DESC 0x80 /* Return a new owning jail descriptor */
+#define JAIL_SET_MASK 0xff /* JAIL_DYING is deprecated/ignored here */
+#define JAIL_GET_MASK 0xf8
#define JAIL_SYS_DISABLE 0
#define JAIL_SYS_NEW 1
@@ -115,7 +119,9 @@ int jail(struct jail *);
int jail_set(struct iovec *, unsigned int, int);
int jail_get(struct iovec *, unsigned int, int);
int jail_attach(int);
+int jail_attach_jd(int);
int jail_remove(int);
+int jail_remove_jd(int);
__END_DECLS
#else /* _KERNEL */
@@ -144,6 +150,7 @@ MALLOC_DECLARE(M_PRISON);
#define JAIL_META_PRIVATE "meta"
#define JAIL_META_SHARED "env"
+struct jaildesc;
struct knlist;
struct racct;
struct prison_racct;
@@ -191,7 +198,8 @@ struct prison {
struct prison_ip *pr_addrs[PR_FAMILY_MAX]; /* (p,n) IPs of jail */
struct prison_racct *pr_prison_racct; /* (c) racct jail proxy */
struct knlist *pr_klist; /* (m) attached knotes */
- void *pr_sparep[2];
+ LIST_HEAD(, jaildesc) pr_descs; /* (a) attached descriptors */
+ void *pr_sparep;
int pr_childcount; /* (a) number of child jails */
int pr_childmax; /* (p) maximum child jails */
unsigned pr_allow; /* (p) PR_ALLOW_* flags */
@@ -466,6 +474,7 @@ void prison_proc_free(struct prison *);
void prison_proc_link(struct prison *, struct proc *);
void prison_proc_unlink(struct prison *, struct proc *);
void prison_proc_iterate(struct prison *, void (*)(struct proc *, void *), void *);
+void prison_remove(struct prison *);
void prison_set_allow(struct ucred *cred, unsigned flag, int enable);
bool prison_ischild(struct prison *, struct prison *);
bool prison_isalive(const struct prison *);
diff --git a/sys/sys/jaildesc.h b/sys/sys/jaildesc.h
new file mode 100644
index 000000000000..4bed1ab3b88a
--- /dev/null
+++ b/sys/sys/jaildesc.h
@@ -0,0 +1,85 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2025 James Gritton.
+ * All rights reserved.
+ *
+ * This software was developed at the University of Cambridge Computer
+ * Laboratory with support from a grant from Google, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _SYS_JAILDESC_H_
+#define _SYS_JAILDESC_H_
+
+#ifdef _KERNEL
+
+#include <sys/queue.h>
+#include <sys/_lock.h>
+#include <sys/_mutex.h>
+#include <sys/_types.h>
+
+struct prison;
+
+/*-
+ * struct jaildesc describes a jail descriptor, which points to a struct
+ * prison. struct prison in turn has a linked list of struct jaildesc.
+ *
+ * Locking key:
+ * (c) set on creation, remains unchanged
+ * (d) jd_lock
+ * (p) jd_prison->pr_mtx
+ */
+struct jaildesc {
+ LIST_ENTRY(jaildesc) jd_list; /* (d,p) this prison's descs */
+ struct prison *jd_prison; /* (d) the prison */
+ struct mtx jd_lock;
+ uid_t jd_uid; /* (d) nominal file owner */
+ gid_t jd_gid; /* (d) nominal file group */
+ mode_t jd_mode; /* (d) descriptor permissions */
+ unsigned jd_flags; /* (d) JDF_* flags */
+};
+
+/*
+ * Locking macros for the jaildesc.
+ */
+#define JAILDESC_LOCK_DESTROY(jd) mtx_destroy(&(jd)->jd_lock)
+#define JAILDESC_LOCK_INIT(jd) mtx_init(&(jd)->jd_lock, "jaildesc", \
+ NULL, MTX_DEF)
+#define JAILDESC_LOCK(jd) mtx_lock(&(jd)->jd_lock)
+#define JAILDESC_UNLOCK(jd) mtx_unlock(&(jd)->jd_lock)
+
+/*
+ * Flags for the jd_flags field
+ */
+#define JDF_REMOVED 0x00000002 /* jail was removed */
+
+int jaildesc_find(struct thread *td, int fd, struct jaildesc **jdp,
+ struct prison **prp, struct ucred **ucredp);
+int jaildesc_alloc(struct thread *td, struct file **fpp, int *fdp, int owning);
+void jaildesc_set_prison(struct file *jd, struct prison *pr);
+void jaildesc_prison_cleanup(struct prison *pr);
+
+#endif /* _KERNEL */
+
+#endif /* !_SYS_JAILDESC_H_ */
diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h
index 380099092107..417afd4dbbe4 100644
--- a/sys/sys/kernel.h
+++ b/sys/sys/kernel.h
@@ -249,15 +249,8 @@ struct sysinit_tslog {
const void *data;
const char *name;
};
-static inline void
-sysinit_tslog_shim(const void *data)
-{
- const struct sysinit_tslog *x = data;
-
- TSRAW(curthread, TS_ENTER, "SYSINIT", x->name);
- (x->func)(x->data);
- TSRAW(curthread, TS_EXIT, "SYSINIT", x->name);
-}
+void sysinit_tslog_shim(const void *);
+
#define C_SYSINIT(uniquifier, subsystem, order, func, ident) \
static struct sysinit_tslog uniquifier ## _sys_init_tslog = { \
func, \
@@ -322,7 +315,7 @@ void sysinit_add(struct sysinit **set, struct sysinit **set_end);
* int
* please avoid using for new tunables!
*/
-extern void tunable_int_init(void *);
+extern void tunable_int_init(const void *);
struct tunable_int {
const char *path;
int *var;
@@ -341,7 +334,7 @@ struct tunable_int {
/*
* long
*/
-extern void tunable_long_init(void *);
+extern void tunable_long_init(const void *);
struct tunable_long {
const char *path;
long *var;
@@ -360,7 +353,7 @@ struct tunable_long {
/*
* unsigned long
*/
-extern void tunable_ulong_init(void *);
+extern void tunable_ulong_init(const void *);
struct tunable_ulong {
const char *path;
unsigned long *var;
@@ -379,7 +372,7 @@ struct tunable_ulong {
/*
* int64_t
*/
-extern void tunable_int64_init(void *);
+extern void tunable_int64_init(const void *);
struct tunable_int64 {
const char *path;
int64_t *var;
@@ -398,7 +391,7 @@ struct tunable_int64 {
/*
* uint64_t
*/
-extern void tunable_uint64_init(void *);
+extern void tunable_uint64_init(const void *);
struct tunable_uint64 {
const char *path;
uint64_t *var;
@@ -417,7 +410,7 @@ struct tunable_uint64 {
/*
* quad
*/
-extern void tunable_quad_init(void *);
+extern void tunable_quad_init(const void *);
struct tunable_quad {
const char *path;
quad_t *var;
@@ -436,7 +429,7 @@ struct tunable_quad {
/*
* bool
*/
-extern void tunable_bool_init(void *);
+extern void tunable_bool_init(const void *);
struct tunable_bool {
const char *path;
bool *var;
@@ -452,7 +445,7 @@ struct tunable_bool {
#define TUNABLE_BOOL_FETCH(path, var) getenv_bool((path), (var))
-extern void tunable_str_init(void *);
+extern void tunable_str_init(const void *);
struct tunable_str {
const char *path;
char *var;
diff --git a/sys/sys/mutex.h b/sys/sys/mutex.h
index 56c03a1b0be9..08d4e2d28b33 100644
--- a/sys/sys/mutex.h
+++ b/sys/sys/mutex.h
@@ -91,7 +91,7 @@
void _mtx_init(volatile uintptr_t *c, const char *name, const char *type,
int opts);
void _mtx_destroy(volatile uintptr_t *c);
-void mtx_sysinit(void *arg);
+void mtx_sysinit(const void *arg);
int _mtx_trylock_flags_int(struct mtx *m, int opts LOCK_FILE_LINE_ARG_DEF);
int _mtx_trylock_flags_(volatile uintptr_t *c, int opts, const char *file,
int line);
diff --git a/sys/sys/param.h b/sys/sys/param.h
index fc2a78883f1e..ce91430909ce 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -74,7 +74,7 @@
* cannot include sys/param.h and should only be updated here.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1500063
+#define __FreeBSD_version 1600000
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
diff --git a/sys/sys/power.h b/sys/sys/power.h
index 9afa55dd403a..3ee021b0e587 100644
--- a/sys/sys/power.h
+++ b/sys/sys/power.h
@@ -28,6 +28,7 @@
#ifndef _SYS_POWER_H_
#define _SYS_POWER_H_
+#ifdef _KERNEL
#include <sys/_eventhandler.h>
@@ -60,4 +61,5 @@ extern void power_profile_set_state(int);
typedef void (*power_profile_change_hook)(void *, int);
EVENTHANDLER_DECLARE(power_profile_change, power_profile_change_hook);
+#endif /* _KERNEL */
#endif /* !_SYS_POWER_H_ */
diff --git a/sys/sys/random.h b/sys/sys/random.h
index 5abf762cd200..2a68f0c99b6d 100644
--- a/sys/sys/random.h
+++ b/sys/sys/random.h
@@ -142,9 +142,6 @@ random_harvest_direct(const void *entropy, u_int size, enum random_entropy_sourc
random_harvest_direct_(entropy, size, origin);
}
-void random_harvest_register_source(enum random_entropy_source);
-void random_harvest_deregister_source(enum random_entropy_source);
-
#if defined(RANDOM_ENABLE_UMA)
#define random_harvest_fast_uma(a, b, c) random_harvest_fast(a, b, c)
#else /* !defined(RANDOM_ENABLE_UMA) */
diff --git a/sys/sys/rmlock.h b/sys/sys/rmlock.h
index 664356998438..eae7342527e3 100644
--- a/sys/sys/rmlock.h
+++ b/sys/sys/rmlock.h
@@ -52,7 +52,7 @@ void rm_init(struct rmlock *rm, const char *name);
void rm_init_flags(struct rmlock *rm, const char *name, int opts);
void rm_destroy(struct rmlock *rm);
int rm_wowned(const struct rmlock *rm);
-void rm_sysinit(void *arg);
+void rm_sysinit(const void *arg);
void _rm_wlock_debug(struct rmlock *rm, const char *file, int line);
void _rm_wunlock_debug(struct rmlock *rm, const char *file, int line);
diff --git a/sys/sys/rwlock.h b/sys/sys/rwlock.h
index 0ebe90e09bed..929f78c1d204 100644
--- a/sys/sys/rwlock.h
+++ b/sys/sys/rwlock.h
@@ -128,7 +128,7 @@
*/
void _rw_init_flags(volatile uintptr_t *c, const char *name, int opts);
void _rw_destroy(volatile uintptr_t *c);
-void rw_sysinit(void *arg);
+void rw_sysinit(const void *arg);
int _rw_wowned(const volatile uintptr_t *c);
void _rw_wlock_cookie(volatile uintptr_t *c, const char *file, int line);
int __rw_try_wlock_int(struct rwlock *rw LOCK_FILE_LINE_ARG_DEF);
diff --git a/sys/sys/sx.h b/sys/sys/sx.h
index deb277decc75..d28cae9d01e5 100644
--- a/sys/sys/sx.h
+++ b/sys/sys/sx.h
@@ -99,7 +99,7 @@
* Function prototipes. Routines that start with an underscore are not part
* of the public interface and are wrappered with a macro.
*/
-void sx_sysinit(void *arg);
+void sx_sysinit(const void *arg);
#define sx_init(sx, desc) sx_init_flags((sx), (desc), 0)
void sx_init_flags(struct sx *sx, const char *description, int opts);
void sx_destroy(struct sx *sx);
diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h
index 2d6903967e15..cff27b8be316 100644
--- a/sys/sys/syscall.h
+++ b/sys/sys/syscall.h
@@ -535,4 +535,6 @@
#define SYS_inotify_rm_watch 594
#define SYS_getgroups 595
#define SYS_setgroups 596
-#define SYS_MAXSYSCALL 597
+#define SYS_jail_attach_jd 597
+#define SYS_jail_remove_jd 598
+#define SYS_MAXSYSCALL 599
diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk
index d1172c2dc7bf..443dbadcfbff 100644
--- a/sys/sys/syscall.mk
+++ b/sys/sys/syscall.mk
@@ -438,4 +438,6 @@ MIASM = \
inotify_add_watch_at.o \
inotify_rm_watch.o \
getgroups.o \
- setgroups.o
+ setgroups.o \
+ jail_attach_jd.o \
+ jail_remove_jd.o
diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h
index 98311a6dbf94..8dda4b4533ea 100644
--- a/sys/sys/sysproto.h
+++ b/sys/sys/sysproto.h
@@ -1901,6 +1901,12 @@ struct setgroups_args {
char gidsetsize_l_[PADL_(int)]; int gidsetsize; char gidsetsize_r_[PADR_(int)];
char gidset_l_[PADL_(const gid_t *)]; const gid_t * gidset; char gidset_r_[PADR_(const gid_t *)];
};
+struct jail_attach_jd_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+};
+struct jail_remove_jd_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+};
int sys__exit(struct thread *, struct _exit_args *);
int sys_fork(struct thread *, struct fork_args *);
int sys_read(struct thread *, struct read_args *);
@@ -2305,6 +2311,8 @@ int sys_inotify_add_watch_at(struct thread *, struct inotify_add_watch_at_args *
int sys_inotify_rm_watch(struct thread *, struct inotify_rm_watch_args *);
int sys_getgroups(struct thread *, struct getgroups_args *);
int sys_setgroups(struct thread *, struct setgroups_args *);
+int sys_jail_attach_jd(struct thread *, struct jail_attach_jd_args *);
+int sys_jail_remove_jd(struct thread *, struct jail_remove_jd_args *);
#ifdef COMPAT_43
@@ -3301,6 +3309,8 @@ int freebsd14_setgroups(struct thread *, struct freebsd14_setgroups_args *);
#define SYS_AUE_inotify_rm_watch AUE_INOTIFY
#define SYS_AUE_getgroups AUE_GETGROUPS
#define SYS_AUE_setgroups AUE_SETGROUPS
+#define SYS_AUE_jail_attach_jd AUE_JAIL_ATTACH
+#define SYS_AUE_jail_remove_jd AUE_JAIL_REMOVE
#undef PAD_
#undef PADL_
diff --git a/sys/sys/user.h b/sys/sys/user.h
index 103236b6ed1b..3183f0792256 100644
--- a/sys/sys/user.h
+++ b/sys/sys/user.h
@@ -266,6 +266,7 @@ struct user {
#define KF_TYPE_EVENTFD 13
#define KF_TYPE_TIMERFD 14
#define KF_TYPE_INOTIFY 15
+#define KF_TYPE_JAILDESC 16
#define KF_TYPE_UNKNOWN 255
#define KF_VTYPE_VNON 0
@@ -453,6 +454,9 @@ struct kinfo_file {
uint64_t kf_timerfd_addr;
} kf_timerfd;
struct {
+ int32_t kf_jid;
+ } kf_jail;
+ struct {
uint64_t kf_kqueue_addr;
int32_t kf_kqueue_count;
int32_t kf_kqueue_state;
diff --git a/sys/tools/makeobjops.awk b/sys/tools/makeobjops.awk
index 5ea658c5a3b3..522fb04ec4d1 100644
--- a/sys/tools/makeobjops.awk
+++ b/sys/tools/makeobjops.awk
@@ -315,7 +315,7 @@ function handle_method (static, doc)
printh("\t" join(";\n\t", arguments, num_arguments) ";");
}
else {
- prototype = "static __inline " ret " " umname "(";
+ prototype = "static __inline " ret "\n" umname "(";
printh(format_line(prototype argument_list ")",
line_width, length(prototype)));
}
@@ -327,7 +327,7 @@ function handle_method (static, doc)
firstvar = "((kobj_t)" firstvar ")";
if (prolog != "")
printh(prolog);
- printh("\tKOBJOPLOOKUP(" firstvar "->ops," mname ");");
+ printh("\tKOBJOPLOOKUP(" firstvar "->ops, " mname ");");
rceq = (ret != "void") ? "rc = " : "";
printh("\t" rceq "((" mname "_t *) _m)(" varname_list ");");
if (epilog != "")
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 5189f7405400..679b2e20e88b 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -4017,8 +4017,9 @@ restart:
rr = rdomain == UMA_ANYDOMAIN;
if (rr) {
aflags = (flags & ~M_WAITOK) | M_NOWAIT;
- vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain,
- &aflags);
+ if (vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain,
+ &aflags) != 0)
+ return (NULL);
} else {
aflags = flags;
domain = rdomain;
@@ -5245,8 +5246,9 @@ uma_prealloc(uma_zone_t zone, int items)
slabs = howmany(items, keg->uk_ipers);
while (slabs-- > 0) {
aflags = M_NOWAIT;
- vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain,
- &aflags);
+ if (vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain,
+ &aflags) != 0)
+ panic("%s: Domainset is empty", __func__);
for (;;) {
slab = keg_alloc_slab(keg, zone, domain, M_WAITOK,
aflags);
diff --git a/sys/vm/vm_domainset.c b/sys/vm/vm_domainset.c
index b44bdb96b0d4..9fa17da954f7 100644
--- a/sys/vm/vm_domainset.c
+++ b/sys/vm/vm_domainset.c
@@ -58,6 +58,9 @@
static int vm_domainset_default_stride = 64;
+static bool vm_domainset_iter_next(struct vm_domainset_iter *di, int *domain);
+
+
/*
* Determine which policy is to be used for this allocation.
*/
@@ -93,28 +96,15 @@ vm_domainset_iter_init(struct vm_domainset_iter *di, struct domainset *ds,
pindex += (((uintptr_t)obj) / sizeof(*obj));
di->di_offset = pindex;
}
- /* Skip domains below min on the first pass. */
- di->di_minskip = true;
}
static void
vm_domainset_iter_rr(struct vm_domainset_iter *di, int *domain)
{
+ /* Grab the next domain in 'ds_order'. */
*domain = di->di_domain->ds_order[
- ++(*di->di_iter) % di->di_domain->ds_cnt];
-}
-
-static void
-vm_domainset_iter_prefer(struct vm_domainset_iter *di, int *domain)
-{
- int d;
-
- do {
- d = di->di_domain->ds_order[
- ++(*di->di_iter) % di->di_domain->ds_cnt];
- } while (d == di->di_domain->ds_prefer);
- *domain = d;
+ (*di->di_iter)++ % di->di_domain->ds_cnt];
}
static void
@@ -127,79 +117,144 @@ vm_domainset_iter_interleave(struct vm_domainset_iter *di, int *domain)
*domain = di->di_domain->ds_order[d];
}
-static void
-vm_domainset_iter_next(struct vm_domainset_iter *di, int *domain)
+/*
+ * Internal function determining the current phase's first candidate domain.
+ *
+ * Returns whether these is an eligible domain, which is returned through
+ * '*domain'. '*domain' can be modified even if there is no eligible domain.
+ *
+ * See herald comment of vm_domainset_iter_first() below about phases.
+ */
+static bool
+vm_domainset_iter_phase_first(struct vm_domainset_iter *di, int *domain)
{
-
- KASSERT(di->di_n > 0, ("%s: Invalid n %d", __func__, di->di_n));
switch (di->di_policy) {
case DOMAINSET_POLICY_FIRSTTOUCH:
- /*
- * To prevent impossible allocations we convert an invalid
- * first-touch to round-robin.
- */
- /* FALLTHROUGH */
- case DOMAINSET_POLICY_INTERLEAVE:
- /* FALLTHROUGH */
+ *domain = PCPU_GET(domain);
+ break;
case DOMAINSET_POLICY_ROUNDROBIN:
vm_domainset_iter_rr(di, domain);
break;
case DOMAINSET_POLICY_PREFER:
- vm_domainset_iter_prefer(di, domain);
+ *domain = di->di_domain->ds_prefer;
+ break;
+ case DOMAINSET_POLICY_INTERLEAVE:
+ vm_domainset_iter_interleave(di, domain);
break;
default:
panic("%s: Unknown policy %d", __func__, di->di_policy);
}
KASSERT(*domain < vm_ndomains,
("%s: Invalid domain %d", __func__, *domain));
+
+ /*
+ * Has the policy's start domain already been visited?
+ */
+ if (!DOMAINSET_ISSET(*domain, &di->di_remain_mask))
+ return (vm_domainset_iter_next(di, domain));
+
+ DOMAINSET_CLR(*domain, &di->di_remain_mask);
+
+ /* Does it have enough free pages (phase 1)? */
+ if (di->di_minskip && vm_page_count_min_domain(*domain)) {
+ /* Mark the domain as eligible for phase 2. */
+ DOMAINSET_SET(*domain, &di->di_min_mask);
+ return (vm_domainset_iter_next(di, domain));
+ }
+
+ return (true);
}
-static void
+/*
+ * Resets an iterator to point to the first candidate domain.
+ *
+ * Returns whether there is an eligible domain to start with. '*domain' may be
+ * modified even if there is none.
+ *
+ * There must have been one call to vm_domainset_iter_init() before.
+ *
+ * This function must be called at least once before calling
+ * vm_domainset_iter_next(). Note that functions wrapping
+ * vm_domainset_iter_init() usually do that themselves.
+ *
+ * This function may be called again to reset the iterator to the policy's first
+ * candidate domain. After each reset, the iterator will visit the same domains
+ * as in the previous iteration minus those on which vm_domainset_iter_ignore()
+ * has been called. Note that the first candidate domain may change at each
+ * reset (at time of this writing, only on the DOMAINSET_POLICY_ROUNDROBIN
+ * policy).
+ *
+ * Domains which have a number of free pages over 'v_free_min' are always
+ * visited first (this is called the "phase 1" in comments, "phase 2" being the
+ * examination of the remaining domains; no domains are ever visited twice).
+ */
+static bool
vm_domainset_iter_first(struct vm_domainset_iter *di, int *domain)
{
+ /* Initialize the mask of domains to visit. */
+ DOMAINSET_COPY(&di->di_valid_mask, &di->di_remain_mask);
+ /*
+ * No candidate domains for phase 2 at start. This will be filled by
+ * phase 1.
+ */
+ DOMAINSET_ZERO(&di->di_min_mask);
+ /* Skip domains below 'v_free_min' on phase 1. */
+ di->di_minskip = true;
- switch (di->di_policy) {
- case DOMAINSET_POLICY_FIRSTTOUCH:
- *domain = PCPU_GET(domain);
- if (DOMAINSET_ISSET(*domain, &di->di_valid_mask)) {
- /*
- * Add an extra iteration because we will visit the
- * current domain a second time in the rr iterator.
- */
- di->di_n = di->di_domain->ds_cnt + 1;
- break;
- }
- /*
- * To prevent impossible allocations we convert an invalid
- * first-touch to round-robin.
- */
- /* FALLTHROUGH */
- case DOMAINSET_POLICY_ROUNDROBIN:
- di->di_n = di->di_domain->ds_cnt;
+ return (vm_domainset_iter_phase_first(di, domain));
+}
+
+/*
+ * Advances the iterator to the next candidate domain.
+ *
+ * Returns whether there was another domain to visit. '*domain' may be modified
+ * even if there is none.
+ *
+ * vm_domainset_iter_first() must have been called at least once before using
+ * this function (see its herald comment for more details on iterators).
+ */
+static bool
+vm_domainset_iter_next(struct vm_domainset_iter *di, int *domain)
+{
+ /* Loop while there remains domains to visit in the current phase. */
+ while (!DOMAINSET_EMPTY(&di->di_remain_mask)) {
+ /* Grab the next domain in 'ds_order'. */
vm_domainset_iter_rr(di, domain);
- break;
- case DOMAINSET_POLICY_PREFER:
- *domain = di->di_domain->ds_prefer;
- di->di_n = di->di_domain->ds_cnt;
- break;
- case DOMAINSET_POLICY_INTERLEAVE:
- vm_domainset_iter_interleave(di, domain);
- di->di_n = di->di_domain->ds_cnt;
- break;
- default:
- panic("%s: Unknown policy %d", __func__, di->di_policy);
+ KASSERT(*domain < vm_ndomains,
+ ("%s: Invalid domain %d", __func__, *domain));
+
+ if (DOMAINSET_ISSET(*domain, &di->di_remain_mask)) {
+ DOMAINSET_CLR(*domain, &di->di_remain_mask);
+ if (!di->di_minskip || !vm_page_count_min_domain(*domain))
+ return (true);
+ DOMAINSET_SET(*domain, &di->di_min_mask);
+ }
}
- KASSERT(di->di_n > 0, ("%s: Invalid n %d", __func__, di->di_n));
- KASSERT(*domain < vm_ndomains,
- ("%s: Invalid domain %d", __func__, *domain));
+
+ /*
+ * If phase 1 (skip low memory domains) is over, start phase 2 (consider
+ * low memory domains).
+ */
+ if (di->di_minskip) {
+ di->di_minskip = false;
+ /* Browse domains that were under 'v_free_min'. */
+ DOMAINSET_COPY(&di->di_min_mask, &di->di_remain_mask);
+ return (vm_domainset_iter_phase_first(di, domain));
+ }
+
+ return (false);
}
-void
+int
vm_domainset_iter_page_init(struct vm_domainset_iter *di, struct vm_object *obj,
- vm_pindex_t pindex, int *domain, int *req, struct pctrie_iter *pages)
+ vm_pindex_t pindex, int *domain, int *req)
{
struct domainset_ref *dr;
+ di->di_flags = *req;
+ *req = (di->di_flags & ~(VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL)) |
+ VM_ALLOC_NOWAIT;
+
/*
* Object policy takes precedence over thread policy. The policies
* are immutable and unsynchronized. Updates can race but pointer
@@ -209,36 +264,21 @@ vm_domainset_iter_page_init(struct vm_domainset_iter *di, struct vm_object *obj,
dr = &obj->domain;
else
dr = &curthread->td_domain;
+
vm_domainset_iter_init(di, dr->dr_policy, &dr->dr_iter, obj, pindex);
- di->di_flags = *req;
- *req = (di->di_flags & ~(VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL)) |
- VM_ALLOC_NOWAIT;
- vm_domainset_iter_first(di, domain);
- if (vm_page_count_min_domain(*domain))
- vm_domainset_iter_page(di, obj, domain, pages);
+ /*
+ * XXXOC: Shouldn't we just panic on 'false' if VM_ALLOC_WAITOK was
+ * passed?
+ */
+ return (vm_domainset_iter_first(di, domain) ? 0 : ENOMEM);
}
int
vm_domainset_iter_page(struct vm_domainset_iter *di, struct vm_object *obj,
int *domain, struct pctrie_iter *pages)
{
- if (__predict_false(DOMAINSET_EMPTY(&di->di_valid_mask)))
- return (ENOMEM);
-
- /* If there are more domains to visit we run the iterator. */
- while (--di->di_n != 0) {
- vm_domainset_iter_next(di, domain);
- if (DOMAINSET_ISSET(*domain, &di->di_valid_mask) &&
- (!di->di_minskip || !vm_page_count_min_domain(*domain)))
- return (0);
- }
-
- /* If we skipped domains below min restart the search. */
- if (di->di_minskip) {
- di->di_minskip = false;
- vm_domainset_iter_first(di, domain);
+ if (vm_domainset_iter_next(di, domain))
return (0);
- }
/* If we visited all domains and this was a NOWAIT we return error. */
if ((di->di_flags & (VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL)) == 0)
@@ -257,61 +297,43 @@ vm_domainset_iter_page(struct vm_domainset_iter *di, struct vm_object *obj,
return (ENOMEM);
/* Restart the search. */
- vm_domainset_iter_first(di, domain);
-
- return (0);
+ /* XXXOC: Shouldn't we just panic on 'false'? */
+ return (vm_domainset_iter_first(di, domain) ? 0 : ENOMEM);
}
-static void
+static int
_vm_domainset_iter_policy_init(struct vm_domainset_iter *di, int *domain,
int *flags)
{
-
di->di_flags = *flags;
*flags = (di->di_flags & ~M_WAITOK) | M_NOWAIT;
- vm_domainset_iter_first(di, domain);
- if (vm_page_count_min_domain(*domain))
- vm_domainset_iter_policy(di, domain);
+ /* XXXOC: Shouldn't we just panic on 'false' if M_WAITOK was passed? */
+ return (vm_domainset_iter_first(di, domain) ? 0 : ENOMEM);
}
-void
+int
vm_domainset_iter_policy_init(struct vm_domainset_iter *di,
struct domainset *ds, int *domain, int *flags)
{
vm_domainset_iter_init(di, ds, &curthread->td_domain.dr_iter, NULL, 0);
- _vm_domainset_iter_policy_init(di, domain, flags);
+ return (_vm_domainset_iter_policy_init(di, domain, flags));
}
-void
+int
vm_domainset_iter_policy_ref_init(struct vm_domainset_iter *di,
struct domainset_ref *dr, int *domain, int *flags)
{
vm_domainset_iter_init(di, dr->dr_policy, &dr->dr_iter, NULL, 0);
- _vm_domainset_iter_policy_init(di, domain, flags);
+ return (_vm_domainset_iter_policy_init(di, domain, flags));
}
int
vm_domainset_iter_policy(struct vm_domainset_iter *di, int *domain)
{
- if (DOMAINSET_EMPTY(&di->di_valid_mask))
- return (ENOMEM);
-
- /* If there are more domains to visit we run the iterator. */
- while (--di->di_n != 0) {
- vm_domainset_iter_next(di, domain);
- if (DOMAINSET_ISSET(*domain, &di->di_valid_mask) &&
- (!di->di_minskip || !vm_page_count_min_domain(*domain)))
- return (0);
- }
-
- /* If we skipped domains below min restart the search. */
- if (di->di_minskip) {
- di->di_minskip = false;
- vm_domainset_iter_first(di, domain);
+ if (vm_domainset_iter_next(di, domain))
return (0);
- }
/* If we visited all domains and this was a NOWAIT we return error. */
if ((di->di_flags & M_WAITOK) == 0)
@@ -321,9 +343,8 @@ vm_domainset_iter_policy(struct vm_domainset_iter *di, int *domain)
vm_wait_doms(&di->di_valid_mask, 0);
/* Restart the search. */
- vm_domainset_iter_first(di, domain);
-
- return (0);
+ /* XXXOC: Shouldn't we just panic on 'false'? */
+ return (vm_domainset_iter_first(di, domain) ? 0 : ENOMEM);
}
void
@@ -345,12 +366,12 @@ vm_domainset_iter_page(struct vm_domainset_iter *di, struct vm_object *obj,
return (EJUSTRETURN);
}
-void
+int
vm_domainset_iter_page_init(struct vm_domainset_iter *di, struct vm_object *obj,
- vm_pindex_t pindex, int *domain, int *flags, struct pctrie_iter *pages)
+ vm_pindex_t pindex, int *domain, int *flags)
{
-
*domain = 0;
+ return (0);
}
int
@@ -360,20 +381,20 @@ vm_domainset_iter_policy(struct vm_domainset_iter *di, int *domain)
return (EJUSTRETURN);
}
-void
+int
vm_domainset_iter_policy_init(struct vm_domainset_iter *di,
struct domainset *ds, int *domain, int *flags)
{
-
*domain = 0;
+ return (0);
}
-void
+int
vm_domainset_iter_policy_ref_init(struct vm_domainset_iter *di,
struct domainset_ref *dr, int *domain, int *flags)
{
-
*domain = 0;
+ return (0);
}
void
diff --git a/sys/vm/vm_domainset.h b/sys/vm/vm_domainset.h
index 0d325a642f40..ef86c8ccb5e4 100644
--- a/sys/vm/vm_domainset.h
+++ b/sys/vm/vm_domainset.h
@@ -33,23 +33,26 @@ struct pctrie_iter;
struct vm_domainset_iter {
struct domainset *di_domain;
unsigned int *di_iter;
+ /* Initialized from 'di_domain', initial value after reset. */
domainset_t di_valid_mask;
+ /* Domains to browse in the current phase. */
+ domainset_t di_remain_mask;
+ /* Domains skipped in phase 1 because under 'v_free_min'. */
+ domainset_t di_min_mask;
vm_pindex_t di_offset;
int di_flags;
uint16_t di_policy;
- domainid_t di_n;
bool di_minskip;
};
int vm_domainset_iter_page(struct vm_domainset_iter *, struct vm_object *,
int *, struct pctrie_iter *);
-void vm_domainset_iter_page_init(struct vm_domainset_iter *,
- struct vm_object *, vm_pindex_t, int *, int *,
- struct pctrie_iter *);
+int vm_domainset_iter_page_init(struct vm_domainset_iter *,
+ struct vm_object *, vm_pindex_t, int *, int *);
int vm_domainset_iter_policy(struct vm_domainset_iter *, int *);
-void vm_domainset_iter_policy_init(struct vm_domainset_iter *,
+int vm_domainset_iter_policy_init(struct vm_domainset_iter *,
struct domainset *, int *, int *);
-void vm_domainset_iter_policy_ref_init(struct vm_domainset_iter *,
+int vm_domainset_iter_policy_ref_init(struct vm_domainset_iter *,
struct domainset_ref *, int *, int *);
void vm_domainset_iter_ignore(struct vm_domainset_iter *, int);
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c
index 94df2c2f9a9e..e0f1807a1b32 100644
--- a/sys/vm/vm_glue.c
+++ b/sys/vm/vm_glue.c
@@ -453,7 +453,7 @@ vm_thread_stack_create(struct domainset *ds, int pages)
obj = vm_thread_kstack_size_to_obj(pages);
if (vm_ndomains > 1)
obj->domain.dr_policy = ds;
- vm_domainset_iter_page_init(&di, obj, 0, &domain, &req, NULL);
+ vm_domainset_iter_page_init(&di, obj, 0, &domain, &req);
do {
/*
* Get a kernel virtual address for this thread's kstack.
diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c
index e7d7b6726d2c..ac327aa37b72 100644
--- a/sys/vm/vm_kern.c
+++ b/sys/vm/vm_kern.c
@@ -323,7 +323,9 @@ kmem_alloc_attr_domainset(struct domainset *ds, vm_size_t size, int flags,
start_segind = -1;
- vm_domainset_iter_policy_init(&di, ds, &domain, &flags);
+ if (vm_domainset_iter_policy_init(&di, ds, &domain, &flags) != 0)
+ return (NULL);
+
do {
addr = kmem_alloc_attr_domain(domain, size, flags, low, high,
memattr);
@@ -417,7 +419,9 @@ kmem_alloc_contig_domainset(struct domainset *ds, vm_size_t size, int flags,
start_segind = -1;
- vm_domainset_iter_policy_init(&di, ds, &domain, &flags);
+ if (vm_domainset_iter_policy_init(&di, ds, &domain, &flags))
+ return (NULL);
+
do {
addr = kmem_alloc_contig_domain(domain, size, flags, low, high,
alignment, boundary, memattr);
@@ -517,7 +521,9 @@ kmem_malloc_domainset(struct domainset *ds, vm_size_t size, int flags)
void *addr;
int domain;
- vm_domainset_iter_policy_init(&di, ds, &domain, &flags);
+ if (vm_domainset_iter_policy_init(&di, ds, &domain, &flags) != 0)
+ return (NULL);
+
do {
addr = kmem_malloc_domain(domain, size, flags);
if (addr != NULL)
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index abad5efb8a79..16878604fa11 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -2015,8 +2015,9 @@ vm_page_alloc_iter(vm_object_t object, vm_pindex_t pindex, int req,
vm_page_t m;
int domain;
- vm_domainset_iter_page_init(&di, object, pindex, &domain, &req,
- pages);
+ if (vm_domainset_iter_page_init(&di, object, pindex, &domain, &req) != 0)
+ return (NULL);
+
do {
m = vm_page_alloc_domain_iter(object, pindex, domain, req,
pages);
@@ -2268,7 +2269,9 @@ vm_page_alloc_contig(vm_object_t object, vm_pindex_t pindex, int req,
start_segind = -1;
- vm_domainset_iter_page_init(&di, object, pindex, &domain, &req, NULL);
+ if (vm_domainset_iter_page_init(&di, object, pindex, &domain, &req) != 0)
+ return (NULL);
+
do {
m = vm_page_alloc_contig_domain(object, pindex, domain, req,
npages, low, high, alignment, boundary, memattr);
@@ -2596,7 +2599,9 @@ vm_page_alloc_noobj(int req)
vm_page_t m;
int domain;
- vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req, NULL);
+ if (vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req) != 0)
+ return (NULL);
+
do {
m = vm_page_alloc_noobj_domain(domain, req);
if (m != NULL)
@@ -2615,7 +2620,9 @@ vm_page_alloc_noobj_contig(int req, u_long npages, vm_paddr_t low,
vm_page_t m;
int domain;
- vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req, NULL);
+ if (vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req) != 0)
+ return (NULL);
+
do {
m = vm_page_alloc_noobj_contig_domain(domain, req, npages, low,
high, alignment, boundary, memattr);
@@ -3334,7 +3341,9 @@ vm_page_reclaim_contig(int req, u_long npages, vm_paddr_t low, vm_paddr_t high,
ret = ERANGE;
- vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req, NULL);
+ if (vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req) != 0)
+ return (ret);
+
do {
status = vm_page_reclaim_contig_domain(domain, req, npages, low,
high, alignment, boundary);
diff --git a/sys/x86/iommu/amd_intrmap.c b/sys/x86/iommu/amd_intrmap.c
index a4c1a7836268..f8900fe0561f 100644
--- a/sys/x86/iommu/amd_intrmap.c
+++ b/sys/x86/iommu/amd_intrmap.c
@@ -112,6 +112,8 @@ amdiommu_map_msi_intr(device_t src, u_int cpu, u_int vector,
{
struct amdiommu_ctx *ctx;
struct amdiommu_unit *unit;
+ device_t requester;
+ int error __diagused;
uint16_t rid;
bool is_iommu;
@@ -180,7 +182,8 @@ amdiommu_map_msi_intr(device_t src, u_int cpu, u_int vector,
*addr |= ((uint64_t)cpu & 0xffffff00) << 32;
}
- iommu_get_requester(src, &rid);
+ error = iommu_get_requester(src, &requester, &rid);
+ MPASS(error == 0);
AMDIOMMU_LOCK(unit);
amdiommu_qi_invalidate_ir_locked(unit, rid);
AMDIOMMU_UNLOCK(unit);
@@ -220,6 +223,7 @@ static struct amdiommu_ctx *
amdiommu_ir_find(device_t src, uint16_t *ridp, bool *is_iommu)
{
devclass_t src_class;
+ device_t requester;
struct amdiommu_unit *unit;
struct amdiommu_ctx *ctx;
uint32_t edte;
@@ -251,7 +255,8 @@ amdiommu_ir_find(device_t src, uint16_t *ridp, bool *is_iommu)
error = amdiommu_find_unit(src, &unit, &rid, &dte, &edte,
bootverbose);
if (error == 0) {
- iommu_get_requester(src, &rid);
+ error = iommu_get_requester(src, &requester, &rid);
+ MPASS(error == 0);
ctx = amdiommu_get_ctx_for_dev(unit, src,
rid, 0, false /* XXXKIB */, false, dte, edte);
}
@@ -266,6 +271,8 @@ amdiommu_ir_free_irte(struct amdiommu_ctx *ctx, device_t src,
u_int cookie)
{
struct amdiommu_unit *unit;
+ device_t requester;
+ int error __diagused;
uint16_t rid;
MPASS(ctx != NULL);
@@ -291,7 +298,8 @@ amdiommu_ir_free_irte(struct amdiommu_ctx *ctx, device_t src,
atomic_thread_fence_rel();
bzero(irte, sizeof(*irte));
}
- iommu_get_requester(src, &rid);
+ error = iommu_get_requester(src, &requester, &rid);
+ MPASS(error == 0);
AMDIOMMU_LOCK(unit);
amdiommu_qi_invalidate_ir_locked(unit, rid);
AMDIOMMU_UNLOCK(unit);
diff --git a/sys/x86/iommu/intel_intrmap.c b/sys/x86/iommu/intel_intrmap.c
index 06e41523624b..f12a0c9bae9b 100644
--- a/sys/x86/iommu/intel_intrmap.c
+++ b/sys/x86/iommu/intel_intrmap.c
@@ -234,6 +234,8 @@ dmar_ir_find(device_t src, uint16_t *rid, int *is_dmar)
{
devclass_t src_class;
struct dmar_unit *unit;
+ device_t requester;
+ int error __diagused;
/*
* We need to determine if the interrupt source generates FSB
@@ -253,8 +255,10 @@ dmar_ir_find(device_t src, uint16_t *rid, int *is_dmar)
unit = dmar_find_hpet(src, rid);
} else {
unit = dmar_find(src, bootverbose);
- if (unit != NULL && rid != NULL)
- iommu_get_requester(src, rid);
+ if (unit != NULL && rid != NULL) {
+ error = iommu_get_requester(src, &requester, rid);
+ MPASS(error == 0);
+ }
}
return (unit);
}
diff --git a/sys/x86/x86/identcpu.c b/sys/x86/x86/identcpu.c
index 4d64eaf78b29..7661c82f4394 100644
--- a/sys/x86/x86/identcpu.c
+++ b/sys/x86/x86/identcpu.c
@@ -2613,7 +2613,7 @@ print_vmx_info(void)
"\020EPT#VE" /* EPT-violation #VE */
"\021XSAVES" /* Enable XSAVES/XRSTORS */
);
- printf("\n Exit Controls=0x%b", mask,
+ printf("\n Exit Controls=0x%b", exit,
"\020"
"\003DR" /* Save debug controls */
/* Ignore Host address-space size */
@@ -2625,7 +2625,7 @@ print_vmx_info(void)
"\026EFER-LD" /* Load MSR_EFER */
"\027PTMR-SV" /* Save VMX-preemption timer value */
);
- printf("\n Entry Controls=0x%b", mask,
+ printf("\n Entry Controls=0x%b", entry,
"\020"
"\003DR" /* Save debug controls */
/* Ignore IA-32e mode guest */
diff --git a/tests/sys/aio/Makefile b/tests/sys/aio/Makefile
index 5cddb28c27a6..578d16b7bf32 100644
--- a/tests/sys/aio/Makefile
+++ b/tests/sys/aio/Makefile
@@ -2,6 +2,7 @@ TESTSDIR= ${TESTSBASE}/sys/aio
ATF_TESTS_C+= aio_test
ATF_TESTS_C+= lio_test
+TEST_METADATA+= required_kmods="aio"
TEST_METADATA.aio_test+= timeout="30"
TEST_METADATA.lio_test+= timeout="10"
# Some lio_test testcases involve system resource limitations, so cannot run concurrently
diff --git a/tests/sys/aio/aio_kqueue_test.c b/tests/sys/aio/aio_kqueue_test.c
index 5e5cb40d0752..43a7ebf91f96 100644
--- a/tests/sys/aio/aio_kqueue_test.c
+++ b/tests/sys/aio/aio_kqueue_test.c
@@ -45,7 +45,6 @@
#include <string.h>
#include <unistd.h>
-#include "freebsd_test_suite/macros.h"
#include "local.h"
#define PATH_TEMPLATE "aio.XXXXXXXXXX"
@@ -70,7 +69,6 @@ main (int argc, char *argv[])
int tmp_file = 0;
int i, j;
- PLAIN_REQUIRE_KERNEL_MODULE("aio", 0);
PLAIN_REQUIRE_UNSAFE_AIO(0);
max_queue_per_proc_size = sizeof(max_queue_per_proc);
diff --git a/tests/sys/aio/aio_test.c b/tests/sys/aio/aio_test.c
index 64939825ec66..b9f8e7062203 100644
--- a/tests/sys/aio/aio_test.c
+++ b/tests/sys/aio/aio_test.c
@@ -63,7 +63,6 @@
#include <atf-c.h>
-#include "freebsd_test_suite/macros.h"
#include "local.h"
/*
@@ -452,7 +451,6 @@ aio_file_test(completion comp, struct sigevent *sev, bool vectored)
struct aio_context ac;
int fd;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
fd = open(FILE_PATHNAME, O_RDWR | O_CREAT, 0600);
@@ -514,7 +512,6 @@ aio_fifo_test(completion comp, struct sigevent *sev)
int error, read_fd = -1, write_fd = -1;
struct aio_context ac;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
ATF_REQUIRE_MSG(mkfifo(FIFO_PATHNAME, 0600) != -1,
@@ -588,8 +585,6 @@ aio_unix_socketpair_test(completion comp, struct sigevent *sev, bool vectored)
struct rusage ru_before, ru_after;
int sockets[2];
- ATF_REQUIRE_KERNEL_MODULE("aio");
-
ATF_REQUIRE_MSG(socketpair(PF_UNIX, SOCK_STREAM, 0, sockets) != -1,
"socketpair failed: %s", strerror(errno));
@@ -662,7 +657,6 @@ aio_pty_test(completion comp, struct sigevent *sev)
struct termios ts;
int error;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
ATF_REQUIRE_MSG(openpty(&read_fd, &write_fd, NULL, NULL, NULL) == 0,
@@ -732,7 +726,6 @@ aio_pipe_test(completion comp, struct sigevent *sev)
struct aio_context ac;
int pipes[2];
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
ATF_REQUIRE_MSG(pipe(pipes) != -1,
@@ -793,8 +786,6 @@ aio_md_setup(void)
struct md_ioctl mdio;
char buf[80];
- ATF_REQUIRE_KERNEL_MODULE("aio");
-
mdctl_fd = open("/dev/" MDCTL_NAME, O_RDWR, 0);
ATF_REQUIRE_MSG(mdctl_fd != -1,
"opening /dev/%s failed: %s", MDCTL_NAME, strerror(errno));
@@ -985,9 +976,6 @@ aio_zvol_setup(const char *unique)
char zvol_name[160];
char devname[160];
- ATF_REQUIRE_KERNEL_MODULE("aio");
- ATF_REQUIRE_KERNEL_MODULE("zfs");
-
pid = getpid();
snprintf(vdev_name, sizeof(vdev_name), "%s", ZVOL_VDEV_PATHNAME);
snprintf(pool_name, sizeof(pool_name), "%s_%s.%d", POOL_NAME, unique,
@@ -1057,7 +1045,6 @@ ATF_TC_BODY(aio_large_read_test, tc)
int clamped;
#endif
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
#ifdef __LP64__
@@ -1133,7 +1120,6 @@ ATF_TC_BODY(aio_socket_two_reads, tc)
int s[2];
char c;
- ATF_REQUIRE_KERNEL_MODULE("aio");
#if __FreeBSD_version < 1100101
aft_tc_skip("kernel version %d is too old (%d required)",
__FreeBSD_version, 1100101);
@@ -1187,8 +1173,6 @@ aio_socket_blocking_short_write_test(bool vectored)
socklen_t len;
int s[2];
- ATF_REQUIRE_KERNEL_MODULE("aio");
-
ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, s) != -1);
len = sizeof(sb_size);
@@ -1356,8 +1340,6 @@ ATF_TC_BODY(aio_socket_short_write_cancel, tc)
socklen_t len;
int s[2];
- ATF_REQUIRE_KERNEL_MODULE("aio");
-
ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, s) != -1);
len = sizeof(sb_size);
@@ -1423,8 +1405,6 @@ ATF_TC_BODY(aio_socket_shutdown, tc)
size_t bsz;
int error, s[2];
- ATF_REQUIRE_KERNEL_MODULE("aio");
-
ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, s) != -1);
bsz = 1024;
@@ -1485,7 +1465,6 @@ ATF_TC_BODY(aio_fsync_errors, tc)
int fd;
struct aiocb iocb;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
fd = open(FILE_PATHNAME, O_RDWR | O_CREAT, 0600);
@@ -1529,7 +1508,6 @@ aio_fsync_test(int op)
unsigned i;
int fd;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
fd = open(FILE_PATHNAME, O_RDWR | O_CREAT, 0600);
@@ -1618,7 +1596,6 @@ ATF_TC_BODY(aio_writev_dos_iov_len, tc)
ssize_t r;
int fd;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
fd = open("testfile", O_RDWR | O_CREAT, 0600);
@@ -1656,7 +1633,6 @@ ATF_TC_BODY(aio_writev_dos_iovcnt, tc)
ssize_t len;
int fd;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
fd = open("testfile", O_RDWR | O_CREAT, 0600);
@@ -1693,7 +1669,6 @@ ATF_TC_BODY(aio_writev_efault, tc)
long seed;
int fd;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
fd = aio_md_setup();
@@ -1728,7 +1703,6 @@ ATF_TC_BODY(aio_writev_empty_file_poll, tc)
struct aiocb aio;
int fd;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
fd = open("testfile", O_RDWR | O_CREAT, 0600);
@@ -1751,7 +1725,6 @@ ATF_TC_BODY(aio_writev_empty_file_signal, tc)
struct aiocb aio;
int fd;
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
fd = open("testfile", O_RDWR | O_CREAT, 0600);
@@ -1781,8 +1754,6 @@ ATF_TC_BODY(ev_oneshot, tc)
struct kevent events[1];
struct timespec timeout;
- ATF_REQUIRE_KERNEL_MODULE("aio");
-
kq = kqueue();
ATF_REQUIRE(kq >= 0);
@@ -1844,7 +1815,6 @@ ATF_TC_BODY(vectored_big_iovcnt, tc)
int fd, i;
ssize_t sysctl_len = sizeof(max_buf_aio);
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
if (sysctlbyname(oid, &max_buf_aio, &sysctl_len, NULL, 0) == -1)
@@ -1946,6 +1916,7 @@ ATF_TC_HEAD(vectored_unaligned, tc)
"Vectored AIO should still work even if the iov contains elements "
"that aren't a multiple of the sector size.");
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "zfs");
}
ATF_TC_BODY(vectored_unaligned, tc)
{
@@ -1958,7 +1929,6 @@ ATF_TC_BODY(vectored_unaligned, tc)
if (atf_tc_get_config_var_as_bool_wd(tc, "ci", false))
atf_tc_skip("https://bugs.freebsd.org/258766");
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
/*
@@ -2045,6 +2015,7 @@ ATF_TC_WITH_CLEANUP(vectored_zvol_poll);
ATF_TC_HEAD(vectored_zvol_poll, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "zfs");
}
ATF_TC_BODY(vectored_zvol_poll, tc)
{
diff --git a/tests/sys/aio/lio_kqueue_test.c b/tests/sys/aio/lio_kqueue_test.c
index f891ab95f3ca..6ac99af9254c 100644
--- a/tests/sys/aio/lio_kqueue_test.c
+++ b/tests/sys/aio/lio_kqueue_test.c
@@ -40,7 +40,6 @@
#include <string.h>
#include <unistd.h>
-#include "freebsd_test_suite/macros.h"
#include "local.h"
#define PATH_TEMPLATE "aio.XXXXXXXXXX"
@@ -68,7 +67,6 @@ main(int argc, char *argv[])
char *file, pathname[sizeof(PATH_TEMPLATE)];
int tmp_file = 0, failed = 0;
- PLAIN_REQUIRE_KERNEL_MODULE("aio", 0);
PLAIN_REQUIRE_UNSAFE_AIO(0);
max_queue_per_proc_size = sizeof(max_queue_per_proc);
diff --git a/tests/sys/aio/lio_test.c b/tests/sys/aio/lio_test.c
index a59f9bd518bc..546cd6c5b790 100644
--- a/tests/sys/aio/lio_test.c
+++ b/tests/sys/aio/lio_test.c
@@ -38,7 +38,6 @@
#include <atf-c.h>
#include "local.h"
-#include "freebsd_test_suite/macros.h"
static sem_t completions;
@@ -71,7 +70,6 @@ ATF_TC_BODY(lio_listio_eagain_kevent, tc)
const char *path="tempfile";
void *udata[2];
- ATF_REQUIRE_KERNEL_MODULE("aio");
ATF_REQUIRE_UNSAFE_AIO();
max_queue_per_proc_size = sizeof(max_queue_per_proc);
diff --git a/tests/sys/kern/socket_accf.c b/tests/sys/kern/socket_accf.c
index ae6522397cf7..939ca9495689 100644
--- a/tests/sys/kern/socket_accf.c
+++ b/tests/sys/kern/socket_accf.c
@@ -69,14 +69,8 @@ clientsock(struct sockaddr_in *sin)
static void
accfon(int l, struct accept_filter_arg *af)
{
-
if (setsockopt(l, SOL_SOCKET, SO_ACCEPTFILTER, af, sizeof(*af)) != 0) {
- if (errno == ENOENT)
- atf_tc_skip("Accept filter %s not loaded in kernel",
- af->af_name);
- else
- atf_tc_fail("setsockopt(SO_ACCEPTFILTER): %s",
- strerror(errno));
+ atf_tc_fail("setsockopt(SO_ACCEPTFILTER): %s", strerror(errno));
}
}
@@ -95,7 +89,11 @@ usend(int s, const void *msg, size_t len)
return (rv);
}
-ATF_TC_WITHOUT_HEAD(data);
+ATF_TC(data);
+ATF_TC_HEAD(data, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "accf_data");
+}
ATF_TC_BODY(data, tc)
{
struct accept_filter_arg afa = {
@@ -113,7 +111,11 @@ ATF_TC_BODY(data, tc)
ATF_REQUIRE((a = accept(l, NULL, 0)) > 0);
}
-ATF_TC_WITHOUT_HEAD(http);
+ATF_TC(http);
+ATF_TC_HEAD(http, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "accf_http");
+}
ATF_TC_BODY(http, tc)
{
struct accept_filter_arg afa = {
@@ -152,7 +154,11 @@ ATF_TC_BODY(http, tc)
ATF_REQUIRE((a = accept(l, NULL, 0)) > 0);
}
-ATF_TC_WITHOUT_HEAD(tls);
+ATF_TC(tls);
+ATF_TC_HEAD(tls, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "accf_tls");
+}
ATF_TC_BODY(tls, tc)
{
struct accept_filter_arg afa = {
@@ -210,7 +216,11 @@ ATF_TC_BODY(tls, tc)
}
/* Check changing to a different filter. */
-ATF_TC_WITHOUT_HEAD(change);
+ATF_TC(change);
+ATF_TC_HEAD(change, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "accf_data accf_http");
+}
ATF_TC_BODY(change, tc)
{
struct accept_filter_arg dfa = {
diff --git a/tests/sys/mqueue/mqtest1.c b/tests/sys/mqueue/mqtest1.c
index 78acde1122ce..7f4ee74f9e8d 100644
--- a/tests/sys/mqueue/mqtest1.c
+++ b/tests/sys/mqueue/mqtest1.c
@@ -6,8 +6,6 @@
#include <signal.h>
#include <stdio.h>
-#include "freebsd_test_suite/macros.h"
-
#define MQNAME "/mytstqueue1"
int
@@ -18,8 +16,6 @@ main(void)
mqd_t mq;
int status;
- PLAIN_REQUIRE_KERNEL_MODULE("mqueuefs", 0);
-
attr.mq_maxmsg = 2;
attr.mq_msgsize = 100;
mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
diff --git a/tests/sys/mqueue/mqtest2.c b/tests/sys/mqueue/mqtest2.c
index 08d4d9a8003a..efdca42eb37e 100644
--- a/tests/sys/mqueue/mqtest2.c
+++ b/tests/sys/mqueue/mqtest2.c
@@ -9,8 +9,6 @@
#include <stdlib.h>
#include <unistd.h>
-#include "freebsd_test_suite/macros.h"
-
#define MQNAME "/mytstqueue2"
#define LOOPS 1000
#define PRIO 10
@@ -29,9 +27,7 @@ main(void)
mqd_t mq;
int status;
pid_t pid;
-
- PLAIN_REQUIRE_KERNEL_MODULE("mqueuefs", 0);
-
+
mq_unlink(MQNAME);
attr.mq_maxmsg = 5;
diff --git a/tests/sys/mqueue/mqtest3.c b/tests/sys/mqueue/mqtest3.c
index 65b8f4fcc2b9..b2c9155c37ba 100644
--- a/tests/sys/mqueue/mqtest3.c
+++ b/tests/sys/mqueue/mqtest3.c
@@ -10,8 +10,6 @@
#include <stdlib.h>
#include <unistd.h>
-#include "freebsd_test_suite/macros.h"
-
#define MQNAME "/mytstqueue3"
#define LOOPS 1000
#define PRIO 10
@@ -32,8 +30,6 @@ main(void)
mqd_t mq;
pid_t pid;
- PLAIN_REQUIRE_KERNEL_MODULE("mqueuefs", 0);
-
mq_unlink(MQNAME);
attr.mq_maxmsg = 5;
diff --git a/tests/sys/mqueue/mqtest4.c b/tests/sys/mqueue/mqtest4.c
index 99841c670b5c..68648b01a9e4 100644
--- a/tests/sys/mqueue/mqtest4.c
+++ b/tests/sys/mqueue/mqtest4.c
@@ -11,8 +11,6 @@
#include <stdlib.h>
#include <unistd.h>
-#include "freebsd_test_suite/macros.h"
-
#define MQNAME "/mytstqueue4"
#define LOOPS 1000
#define PRIO 10
@@ -33,8 +31,6 @@ main(void)
int kq, status;
pid_t pid;
- PLAIN_REQUIRE_KERNEL_MODULE("mqueuefs", 0);
-
mq_unlink(MQNAME);
attr.mq_maxmsg = 5;
diff --git a/tests/sys/mqueue/mqtest5.c b/tests/sys/mqueue/mqtest5.c
index f48ef1121289..6671839829bf 100644
--- a/tests/sys/mqueue/mqtest5.c
+++ b/tests/sys/mqueue/mqtest5.c
@@ -11,8 +11,6 @@
#include <stdlib.h>
#include <unistd.h>
-#include "freebsd_test_suite/macros.h"
-
#define MQNAME "/mytstqueue5"
#define LOOPS 1000
#define PRIO 10
@@ -35,8 +33,6 @@ main(void)
mqd_t mq;
pid_t pid;
- PLAIN_REQUIRE_KERNEL_MODULE("mqueuefs", 0);
-
mq_unlink(MQNAME);
sigemptyset(&set);
diff --git a/tests/sys/mqueue/mqueue_test.sh b/tests/sys/mqueue/mqueue_test.sh
index 8b3f45159ad9..4f947dc260ed 100644
--- a/tests/sys/mqueue/mqueue_test.sh
+++ b/tests/sys/mqueue/mqueue_test.sh
@@ -27,7 +27,7 @@
mqtest1_head()
{
- :
+ atf_set require.kmods mqueuefs
}
mqtest1_body()
{
@@ -36,7 +36,7 @@ mqtest1_body()
mqtest2_head()
{
- :
+ atf_set require.kmods mqueuefs
}
mqtest2_body()
{
@@ -45,7 +45,7 @@ mqtest2_body()
mqtest3_head()
{
- :
+ atf_set require.kmods mqueuefs
}
mqtest3_body()
{
@@ -54,7 +54,7 @@ mqtest3_body()
mqtest4_head()
{
- :
+ atf_set require.kmods mqueuefs
}
mqtest4_body()
{
@@ -63,7 +63,7 @@ mqtest4_body()
mqtest5_head()
{
- :
+ atf_set require.kmods mqueuefs
}
mqtest5_body()
{
@@ -74,7 +74,7 @@ atf_init_test_cases()
{
atf_add_test_case mqtest1
atf_add_test_case mqtest2
- #atf_add_test_case mqtest3
- #atf_add_test_case mqtest4
+ atf_add_test_case mqtest3
+ atf_add_test_case mqtest4
atf_add_test_case mqtest5
}
diff --git a/tests/sys/net/if_epair.c b/tests/sys/net/if_epair.c
index 0817b298d427..5ee4a48aea86 100644
--- a/tests/sys/net/if_epair.c
+++ b/tests/sys/net/if_epair.c
@@ -44,6 +44,7 @@ ATF_TC(params);
ATF_TC_HEAD(params, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "if_epair");
}
ATF_TC_BODY(params, tc)
@@ -51,9 +52,6 @@ ATF_TC_BODY(params, tc)
struct ifreq ifr;
int s;
- kldload("if_epair");
- ATF_REQUIRE_KERNEL_MODULE("if_epair");
-
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s < 0)
atf_tc_fail("Failed to create socket");
diff --git a/tests/sys/net/if_ovpn/if_ovpn_c.c b/tests/sys/net/if_ovpn/if_ovpn_c.c
index fa8a9a07fa35..7b558f1975dd 100644
--- a/tests/sys/net/if_ovpn/if_ovpn_c.c
+++ b/tests/sys/net/if_ovpn/if_ovpn_c.c
@@ -78,6 +78,7 @@ ATF_TC_WITH_CLEANUP(tcp);
ATF_TC_HEAD(tcp, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "if_ovpn");
}
ATF_TC_BODY(tcp, tc)
@@ -87,10 +88,6 @@ ATF_TC_BODY(tcp, tc)
int ret;
nvlist_t *nvl;
- /* Ensure the module is loaded. */
- if (kldfind("if_ovpn") == -1 && errno == ENOENT)
- atf_tc_skip("if_ovpn not loaded");
-
ovpn_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
/* Kick off a connect so there's a local address set, which we need for
diff --git a/tests/sys/netinet/divert.sh b/tests/sys/netinet/divert.sh
index d50620d94a09..f521038ba687 100755
--- a/tests/sys/netinet/divert.sh
+++ b/tests/sys/netinet/divert.sh
@@ -29,19 +29,13 @@
. $(atf_get_srcdir)/../common/vnet.subr
-load_divert_module() {
- kldstat -q -m ipdivert
- if [ $? -ne 0 ]; then
- atf_skip "ipdivert module is not loaded"
- fi
-}
-
atf_test_case "ipdivert_ip_output_remote_success" "cleanup"
ipdivert_ip_output_remote_success_head() {
atf_set descr 'Test diverting IPv4 packet to remote destination'
atf_set require.user root
atf_set require.progs python3 scapy
+ atf_set require.kmods ipdivert
}
ipdivert_ip_output_remote_success_body() {
@@ -62,7 +56,6 @@ ipdivert_ip_output_remote_success_body() {
fi
vnet_init
- load_divert_module
ip4a="192.0.2.5"
ip4b="192.0.2.6"
@@ -97,6 +90,7 @@ ipdivert_ip_input_local_success_head() {
atf_set descr 'Test diverting IPv4 packet to remote destination'
atf_set require.user root
atf_set require.progs python3 scapy
+ atf_set require.kmods ipdivert
}
ipdivert_ip_input_local_success_body() {
@@ -117,7 +111,6 @@ ipdivert_ip_input_local_success_body() {
fi
vnet_init
- load_divert_module
ip4a="192.0.2.5"
ip4b="192.0.2.6"
diff --git a/tests/sys/netinet/tcp_md5_getsockopt.c b/tests/sys/netinet/tcp_md5_getsockopt.c
index deaa4170caea..e23cfa67185a 100644
--- a/tests/sys/netinet/tcp_md5_getsockopt.c
+++ b/tests/sys/netinet/tcp_md5_getsockopt.c
@@ -45,9 +45,6 @@ void test_tcp_md5_getsockopt(int);
void
test_tcp_md5_getsockopt(int v6)
{
- if (kldfind("tcpmd5.ko") == -1)
- atf_tc_skip("Test requires the tcpmd5 kernel module to be loaded");
-
struct sockaddr_in *s;
struct sockaddr_in6 s6 = { 0 };
struct sockaddr_in s4 = { 0 };
@@ -108,6 +105,7 @@ ATF_TC(tcp_md5_getsockopt_v4);
ATF_TC_HEAD(tcp_md5_getsockopt_v4, tc)
{
atf_tc_set_md_var(tc, "descr", "Test getsockopt for TCP MD5 SIG (IPv4)");
+ atf_tc_set_md_var(tc, "require.kmods", "tcpmd5");
}
ATF_TC_BODY(tcp_md5_getsockopt_v4, tc)
@@ -119,6 +117,7 @@ ATF_TC(tcp_md5_getsockopt_v6);
ATF_TC_HEAD(tcp_md5_getsockopt_v6, tc)
{
atf_tc_set_md_var(tc, "descr", "Test getsockopt for TCP MD5 SIG (IPv6)");
+ atf_tc_set_md_var(tc, "require.kmods", "tcpmd5");
}
ATF_TC_BODY(tcp_md5_getsockopt_v6, tc)
diff --git a/tests/sys/netlink/netlink_socket.c b/tests/sys/netlink/netlink_socket.c
index 6dcc894b6695..3c2c5f857591 100644
--- a/tests/sys/netlink/netlink_socket.c
+++ b/tests/sys/netlink/netlink_socket.c
@@ -116,7 +116,11 @@ fullsocket(void)
return (fd);
}
-ATF_TC_WITHOUT_HEAD(overflow);
+ATF_TC(overflow);
+ATF_TC_HEAD(overflow, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
+}
ATF_TC_BODY(overflow, tc)
{
char buf[BUFLEN];
@@ -143,7 +147,11 @@ ATF_TC_BODY(overflow, tc)
ATF_REQUIRE(timer_done == 0);
}
-ATF_TC_WITHOUT_HEAD(peek);
+ATF_TC(peek);
+ATF_TC_HEAD(peek, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
+}
ATF_TC_BODY(peek, tc)
{
char *buf;
@@ -185,7 +193,11 @@ cmsg_check(struct msghdr *msg)
ATF_REQUIRE((msg->msg_flags & MSG_CTRUNC) == 0);
}
-ATF_TC_WITHOUT_HEAD(sizes);
+ATF_TC(sizes);
+ATF_TC_HEAD(sizes, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
+}
ATF_TC_BODY(sizes, tc)
{
#define NLMSG_LARGE 2048 /* XXX: match kernel nl_buf */
@@ -273,7 +285,11 @@ nla_RTA_DST(struct nlattr *start, ssize_t len)
* Check that NETLINK_ADD_MEMBERSHIP subscribes us. Add & delete a temporary
* route and check if announcements came in.
*/
-ATF_TC_WITHOUT_HEAD(membership);
+ATF_TC(membership);
+ATF_TC_HEAD(membership, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
+}
ATF_TC_BODY(membership, tc)
{
struct {
@@ -329,9 +345,6 @@ ATF_TC_BODY(membership, tc)
ATF_TP_ADD_TCS(tp)
{
- if (modfind("netlink") == -1)
- atf_tc_skip("netlink module not loaded");
-
ATF_TP_ADD_TC(tp, overflow);
ATF_TP_ADD_TC(tp, peek);
ATF_TP_ADD_TC(tp, sizes);
diff --git a/tests/sys/netlink/test_snl.c b/tests/sys/netlink/test_snl.c
index 040414a96e2c..3990aa0b075d 100644
--- a/tests/sys/netlink/test_snl.c
+++ b/tests/sys/netlink/test_snl.c
@@ -25,13 +25,6 @@ static const struct snl_hdr_parser *snl_all_route_parsers[] = {
&_addr_fbsd_parser, &snl_rtm_addr_parser, &_nh_fbsd_parser, &snl_nhmsg_parser,
};
-static void
-require_netlink(void)
-{
- if (modfind("netlink") == -1)
- atf_tc_skip("netlink module not loaded");
-}
-
ATF_TC(snl_verify_core_parsers);
ATF_TC_HEAD(snl_verify_core_parsers, tc)
{
@@ -60,6 +53,7 @@ ATF_TC(snl_parse_errmsg_capped);
ATF_TC_HEAD(snl_parse_errmsg_capped, tc)
{
atf_tc_set_md_var(tc, "descr", "Tests snl(3) correctly parsing capped errors");
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
}
ATF_TC_BODY(snl_parse_errmsg_capped, tc)
@@ -67,8 +61,6 @@ ATF_TC_BODY(snl_parse_errmsg_capped, tc)
struct snl_state ss;
struct snl_writer nw;
- require_netlink();
-
if (!snl_init(&ss, NETLINK_ROUTE))
atf_tc_fail("snl_init() failed");
@@ -102,6 +94,7 @@ ATF_TC(snl_parse_errmsg_capped_extack);
ATF_TC_HEAD(snl_parse_errmsg_capped_extack, tc)
{
atf_tc_set_md_var(tc, "descr", "Tests snl(3) correctly parsing capped errors with extack");
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
}
ATF_TC_BODY(snl_parse_errmsg_capped_extack, tc)
@@ -109,8 +102,6 @@ ATF_TC_BODY(snl_parse_errmsg_capped_extack, tc)
struct snl_state ss;
struct snl_writer nw;
- require_netlink();
-
if (!snl_init(&ss, NETLINK_ROUTE))
atf_tc_fail("snl_init() failed");
@@ -145,6 +136,7 @@ ATF_TC(snl_parse_errmsg_uncapped_extack);
ATF_TC_HEAD(snl_parse_errmsg_uncapped_extack, tc)
{
atf_tc_set_md_var(tc, "descr", "Tests snl(3) correctly parsing errors with extack");
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
}
ATF_TC_BODY(snl_parse_errmsg_uncapped_extack, tc)
@@ -152,8 +144,6 @@ ATF_TC_BODY(snl_parse_errmsg_uncapped_extack, tc)
struct snl_state ss;
struct snl_writer nw;
- require_netlink();
-
ATF_CHECK(snl_init(&ss, NETLINK_ROUTE));
int optval = 1;
@@ -185,6 +175,7 @@ ATF_TC(snl_list_ifaces);
ATF_TC_HEAD(snl_list_ifaces, tc)
{
atf_tc_set_md_var(tc, "descr", "Tests snl(3) listing interfaces");
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
}
struct nl_parsed_link {
@@ -212,8 +203,6 @@ ATF_TC_BODY(snl_list_ifaces, tc)
struct snl_state ss;
struct snl_writer nw;
- require_netlink();
-
if (!snl_init(&ss, NETLINK_ROUTE))
atf_tc_fail("snl_init() failed");
diff --git a/tests/sys/netlink/test_snl_generic.c b/tests/sys/netlink/test_snl_generic.c
index c63b1380f2ad..8613bf04a45c 100644
--- a/tests/sys/netlink/test_snl_generic.c
+++ b/tests/sys/netlink/test_snl_generic.c
@@ -15,13 +15,6 @@ static const struct snl_hdr_parser *snl_all_genl_parsers[] = {
&_genl_ctrl_getfam_parser, &_genl_ctrl_mc_parser,
};
-static void
-require_netlink(void)
-{
- if (modfind("netlink") == -1)
- atf_tc_skip("netlink module not loaded");
-}
-
ATF_TC(snl_verify_genl_parsers);
ATF_TC_HEAD(snl_verify_genl_parsers, tc)
{
@@ -38,14 +31,13 @@ ATF_TC(test_snl_get_genl_family_success);
ATF_TC_HEAD(test_snl_get_genl_family_success, tc)
{
atf_tc_set_md_var(tc, "descr", "Tests successfull resolution of the 'nlctrl' family");
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
}
ATF_TC_BODY(test_snl_get_genl_family_success, tc)
{
struct snl_state ss;
- require_netlink();
-
if (!snl_init(&ss, NETLINK_GENERIC))
atf_tc_fail("snl_init() failed");
@@ -56,14 +48,13 @@ ATF_TC(test_snl_get_genl_family_failure);
ATF_TC_HEAD(test_snl_get_genl_family_failure, tc)
{
atf_tc_set_md_var(tc, "descr", "Tests unsuccessfull resolution of 'no-such-family' family");
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
}
ATF_TC_BODY(test_snl_get_genl_family_failure, tc)
{
struct snl_state ss;
- require_netlink();
-
if (!snl_init(&ss, NETLINK_GENERIC))
atf_tc_fail("snl_init() failed");
@@ -74,6 +65,7 @@ ATF_TC(test_snl_get_genl_family_groups);
ATF_TC_HEAD(test_snl_get_genl_family_groups, tc)
{
atf_tc_set_md_var(tc, "descr", "Tests getting 'nlctrl' groups");
+ atf_tc_set_md_var(tc, "require.kmods", "netlink");
}
ATF_TC_BODY(test_snl_get_genl_family_groups, tc)
@@ -82,8 +74,6 @@ ATF_TC_BODY(test_snl_get_genl_family_groups, tc)
struct snl_writer nw;
struct nlmsghdr *hdr;
- require_netlink();
-
if (!snl_init(&ss, NETLINK_GENERIC))
atf_tc_fail("snl_init() failed");
diff --git a/tests/sys/netmap/Makefile b/tests/sys/netmap/Makefile
index ee00d0421620..bd713ff795bc 100644
--- a/tests/sys/netmap/Makefile
+++ b/tests/sys/netmap/Makefile
@@ -3,6 +3,7 @@ PACKAGE= tests
TESTSDIR= ${TESTSBASE}/sys/netmap
TEST_METADATA+= required_user="root"
TEST_METADATA+= is_exclusive=true
+TEST_METADATA+= required_kmods="if_tap netmap"
PLAIN_TESTS_C+= ctrl-api-test
diff --git a/tests/sys/netmap/ctrl-api-test.c b/tests/sys/netmap/ctrl-api-test.c
index 6b45dbb1cfea..36c131980360 100644
--- a/tests/sys/netmap/ctrl-api-test.c
+++ b/tests/sys/netmap/ctrl-api-test.c
@@ -59,8 +59,6 @@
#include <stddef.h>
#ifdef __FreeBSD__
-#include "freebsd_test_suite/macros.h"
-
static int
eventfd(int x __unused, int y __unused)
{
@@ -2199,11 +2197,6 @@ main(int argc, char **argv)
int opt;
int i;
-#ifdef __FreeBSD__
- PLAIN_REQUIRE_KERNEL_MODULE("if_tap", 0);
- PLAIN_REQUIRE_KERNEL_MODULE("netmap", 0);
-#endif
-
memset(&ctx_, 0, sizeof(ctx_));
{
diff --git a/tests/sys/netpfil/pf/Makefile b/tests/sys/netpfil/pf/Makefile
index 616ffe560b3a..9f993eec61d0 100644
--- a/tests/sys/netpfil/pf/Makefile
+++ b/tests/sys/netpfil/pf/Makefile
@@ -61,6 +61,7 @@ ATF_TESTS_PYTEST+= header.py
ATF_TESTS_PYTEST+= icmp.py
ATF_TESTS_PYTEST+= igmp.py
ATF_TESTS_PYTEST+= mld.py
+ATF_TESTS_PYTEST+= nat44.py
ATF_TESTS_PYTEST+= nat64.py
ATF_TESTS_PYTEST+= nat66.py
ATF_TESTS_PYTEST+= return.py
diff --git a/tests/sys/netpfil/pf/ioctl/validation.c b/tests/sys/netpfil/pf/ioctl/validation.c
index 18fafe11c6ab..3e03163cc752 100644
--- a/tests/sys/netpfil/pf/ioctl/validation.c
+++ b/tests/sys/netpfil/pf/ioctl/validation.c
@@ -41,8 +41,6 @@
static int dev;
#define COMMON_HEAD() \
- if (modfind("pf") == -1) \
- atf_tc_skip("pf not loaded"); \
dev = open("/dev/pf", O_RDWR); \
if (dev == -1) \
atf_tc_skip("Failed to open /dev/pf");
@@ -64,6 +62,7 @@ ATF_TC_WITH_CLEANUP(addtables);
ATF_TC_HEAD(addtables, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(addtables, tc)
@@ -116,6 +115,7 @@ ATF_TC_WITH_CLEANUP(deltables);
ATF_TC_HEAD(deltables, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(deltables, tc)
@@ -159,6 +159,7 @@ ATF_TC_WITH_CLEANUP(gettables);
ATF_TC_HEAD(gettables, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(gettables, tc)
@@ -197,6 +198,7 @@ ATF_TC_WITH_CLEANUP(gettstats);
ATF_TC_HEAD(gettstats, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(gettstats, tc)
@@ -235,6 +237,7 @@ ATF_TC_WITH_CLEANUP(clrtstats);
ATF_TC_HEAD(clrtstats, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(clrtstats, tc)
@@ -280,6 +283,7 @@ ATF_TC_WITH_CLEANUP(settflags);
ATF_TC_HEAD(settflags, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(settflags, tc)
@@ -325,6 +329,7 @@ ATF_TC_WITH_CLEANUP(addaddrs);
ATF_TC_HEAD(addaddrs, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(addaddrs, tc)
@@ -360,6 +365,7 @@ ATF_TC_WITH_CLEANUP(deladdrs);
ATF_TC_HEAD(deladdrs, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(deladdrs, tc)
@@ -395,6 +401,7 @@ ATF_TC_WITH_CLEANUP(setaddrs);
ATF_TC_HEAD(setaddrs, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(setaddrs, tc)
@@ -430,6 +437,7 @@ ATF_TC_WITH_CLEANUP(getaddrs);
ATF_TC_HEAD(getaddrs, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(getaddrs, tc)
@@ -467,6 +475,7 @@ ATF_TC_WITH_CLEANUP(getastats);
ATF_TC_HEAD(getastats, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(getastats, tc)
@@ -504,6 +513,7 @@ ATF_TC_WITH_CLEANUP(clrastats);
ATF_TC_HEAD(clrastats, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(clrastats, tc)
@@ -541,6 +551,7 @@ ATF_TC_WITH_CLEANUP(tstaddrs);
ATF_TC_HEAD(tstaddrs, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(tstaddrs, tc)
@@ -578,6 +589,7 @@ ATF_TC_WITH_CLEANUP(inadefine);
ATF_TC_HEAD(inadefine, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(inadefine, tc)
@@ -615,6 +627,7 @@ ATF_TC_WITH_CLEANUP(igetifaces);
ATF_TC_HEAD(igetifaces, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(igetifaces, tc)
@@ -649,6 +662,7 @@ ATF_TC_WITH_CLEANUP(cxbegin);
ATF_TC_HEAD(cxbegin, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(cxbegin, tc)
@@ -688,6 +702,7 @@ ATF_TC_WITH_CLEANUP(cxrollback);
ATF_TC_HEAD(cxrollback, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(cxrollback, tc)
@@ -727,6 +742,7 @@ ATF_TC_WITH_CLEANUP(commit);
ATF_TC_HEAD(commit, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(commit, tc)
@@ -766,6 +782,7 @@ ATF_TC_WITH_CLEANUP(getsrcnodes);
ATF_TC_HEAD(getsrcnodes, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(getsrcnodes, tc)
@@ -798,6 +815,7 @@ ATF_TC_WITH_CLEANUP(tag);
ATF_TC_HEAD(tag, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(tag, tc)
@@ -835,6 +853,7 @@ ATF_TC_WITH_CLEANUP(rpool_mtx);
ATF_TC_HEAD(rpool_mtx, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(rpool_mtx, tc)
@@ -872,6 +891,7 @@ ATF_TC_WITH_CLEANUP(rpool_mtx2);
ATF_TC_HEAD(rpool_mtx2, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(rpool_mtx2, tc)
@@ -898,6 +918,7 @@ ATF_TC_WITH_CLEANUP(natlook);
ATF_TC_HEAD(natlook, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
+ atf_tc_set_md_var(tc, "require.kmods", "pf");
}
ATF_TC_BODY(natlook, tc)
diff --git a/tests/sys/netpfil/pf/killstate.sh b/tests/sys/netpfil/pf/killstate.sh
index 0d98db822535..ffb01df57908 100644
--- a/tests/sys/netpfil/pf/killstate.sh
+++ b/tests/sys/netpfil/pf/killstate.sh
@@ -105,6 +105,68 @@ v4_cleanup()
pft_cleanup
}
+atf_test_case "src_dst" "cleanup"
+src_dst_head()
+{
+ atf_set descr 'Test killing a state with source and destination specified'
+ atf_set require.user root
+}
+
+src_dst_body()
+{
+ pft_init
+
+ epair=$(vnet_mkepair)
+ ifconfig ${epair}a 192.0.2.1/24 up
+
+ vnet_mkjail alcatraz ${epair}b
+ jexec alcatraz ifconfig ${epair}b 192.0.2.2/24 up
+ jexec alcatraz pfctl -e
+
+ pft_set_rules alcatraz "block all" \
+ "pass in proto icmp" \
+ "set skip on lo"
+
+ # Sanity check & establish state
+ atf_check -s exit:0 -o ignore ${common_dir}/pft_ping.py \
+ --sendif ${epair}a \
+ --to 192.0.2.2 \
+ --replyif ${epair}a
+
+ # Change rules to now deny the ICMP traffic
+ pft_set_rules noflush alcatraz "block all"
+ if ! find_state;
+ then
+ atf_fail "Setting new rules removed the state."
+ fi
+
+ # Killing with the wrong source IP doesn't affect our state
+ jexec alcatraz pfctl -k 192.0.2.3 -k 192.0.2.2
+ if ! find_state;
+ then
+ atf_fail "Killing with the wrong source IP removed our state."
+ fi
+
+ # Killing with the wrong destination IP doesn't affect our state
+ jexec alcatraz pfctl -k 192.0.2.1 -k 192.0.2.3
+ if ! find_state;
+ then
+ atf_fail "Killing with the wrong destination IP removed our state."
+ fi
+
+ # But it does with the correct one
+ jexec alcatraz pfctl -k 192.0.2.1 -k 192.0.2.2
+ if find_state;
+ then
+ atf_fail "Killing with the correct IPs did not remove our state."
+ fi
+}
+
+src_dst_cleanup()
+{
+ pft_cleanup
+}
+
atf_test_case "v6" "cleanup"
v6_head()
{
@@ -698,6 +760,7 @@ nat_cleanup()
atf_init_test_cases()
{
atf_add_test_case "v4"
+ atf_add_test_case "src_dst"
atf_add_test_case "v6"
atf_add_test_case "label"
atf_add_test_case "multilabel"
diff --git a/tests/sys/netpfil/pf/nat44.py b/tests/sys/netpfil/pf/nat44.py
new file mode 100644
index 000000000000..d69e794a62c3
--- /dev/null
+++ b/tests/sys/netpfil/pf/nat44.py
@@ -0,0 +1,76 @@
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2025 Rubicon Communications, LLC (Netgate)
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+import pytest
+from atf_python.sys.net.tools import ToolsHelper
+from atf_python.sys.net.vnet import VnetTestTemplate
+
+class TestNAT44(VnetTestTemplate):
+ REQUIRED_MODULES = [ "pf" ]
+ TOPOLOGY = {
+ "vnet1": {"ifaces": ["if1"]},
+ "vnet2": {"ifaces": ["if1", "if2"]},
+ "vnet3": {"ifaces": ["if2"]},
+ "if1": {"prefixes4": [("192.0.2.2/24", "192.0.2.1/24")]},
+ "if2": {"prefixes4": [("198.51.100.1/24", "198.51.100.2")]},
+ }
+
+ def vnet2_handler(self, vnet):
+ outifname = vnet.iface_alias_map["if2"].name
+ ToolsHelper.print_output("/sbin/sysctl net.inet.ip.forwarding=1")
+
+ ToolsHelper.print_output("/sbin/pfctl -e")
+ ToolsHelper.print_output("/sbin/pfctl -x loud")
+ ToolsHelper.pf_rules([
+ "set reassemble yes",
+ "nat on {} inet from 192.0.2.0/24 -> ({})".format(outifname, outifname),
+ "pass"])
+
+ def vnet3_handler(self, vnet):
+ pass
+
+ @pytest.mark.require_user("root")
+ @pytest.mark.require_progs(["scapy"])
+ def test_nat_igmp(self):
+ "Verify that NAT translation of !(TCP|UDP|SCTP|ICMP) doesn't panic"
+ ToolsHelper.print_output("/sbin/route add default 192.0.2.1")
+ ToolsHelper.print_output("ping -c 3 198.51.100.2")
+
+ # Import in the correct vnet, so at to not confuse Scapy
+ import scapy.all as sp
+ import scapy.contrib as sc
+ import scapy.contrib.igmp
+
+ pkt = sp.IP(dst="198.51.100.2", ttl=64) \
+ / sc.igmp.IGMP(type=0x11, mrcode=1)
+ sp.send(pkt)
+
+ # This time we'll hit an existing state
+ pkt = sp.IP(dst="198.51.100.2", ttl=64) \
+ / sc.igmp.IGMP(type=0x11, mrcode=1)
+ reply = sp.sr1(pkt, timeout=3)
+ if reply:
+ reply.show()
diff --git a/tests/sys/netpfil/pf/table.sh b/tests/sys/netpfil/pf/table.sh
index 65492545a13b..26fc5bf6cda2 100644
--- a/tests/sys/netpfil/pf/table.sh
+++ b/tests/sys/netpfil/pf/table.sh
@@ -673,6 +673,43 @@ large_cleanup()
pft_cleanup
}
+atf_test_case "show_recursive" "cleanup"
+show_recursive_head()
+{
+ atf_set descr 'Test displaying tables in every anchor'
+ atf_set require.user root
+}
+
+show_recursive_body()
+{
+ pft_init
+
+ vnet_mkjail alcatraz
+
+ pft_set_rules alcatraz \
+
+ (echo "table <bar> persist"
+ echo "block in quick from <bar> to any"
+ ) | jexec alcatraz pfctl -a anchorage -f -
+
+ pft_set_rules noflush alcatraz \
+ "table <foo> counters { 192.0.2.1 }" \
+ "pass in from <foo>" \
+ "anchor anchorage"
+
+ jexec alcatraz pfctl -sr -a "*"
+
+ atf_check -s exit:0 -e ignore -o match:'-pa-r-- bar@anchorage' \
+ jexec alcatraz pfctl -v -a "*" -sT
+ atf_check -s exit:0 -e ignore -o match:'--a-r-C foo' \
+ jexec alcatraz pfctl -v -a "*" -sT
+}
+
+show_recursive_cleanup()
+{
+ pft_cleanup
+}
+
atf_init_test_cases()
{
atf_add_test_case "v4_counters"
@@ -689,4 +726,5 @@ atf_init_test_cases()
atf_add_test_case "anchor"
atf_add_test_case "flush"
atf_add_test_case "large"
+ atf_add_test_case "show_recursive"
}
diff --git a/tests/sys/opencrypto/blake2_test.c b/tests/sys/opencrypto/blake2_test.c
index b397f8a8ec4c..0e6943d150cf 100644
--- a/tests/sys/opencrypto/blake2_test.c
+++ b/tests/sys/opencrypto/blake2_test.c
@@ -126,15 +126,12 @@ do_cryptop(int fd, int ses, size_t inlen, void *out)
}
static void
-test_blake2b_vectors(const char *devname, const char *modname)
+test_blake2b_vectors(const char *devname)
{
uint8_t hash[BLAKE2B_OUTBYTES];
int crid, fd, ses;
size_t i;
- ATF_REQUIRE_KERNEL_MODULE(modname);
- ATF_REQUIRE_KERNEL_MODULE("cryptodev");
-
initialize_constant_buffers();
fd = get_handle_fd();
crid = lookup_crid(fd, devname);
@@ -150,15 +147,12 @@ test_blake2b_vectors(const char *devname, const char *modname)
}
static void
-test_blake2s_vectors(const char *devname, const char *modname)
+test_blake2s_vectors(const char *devname)
{
uint8_t hash[BLAKE2S_OUTBYTES];
int crid, fd, ses;
size_t i;
- ATF_REQUIRE_KERNEL_MODULE(modname);
- ATF_REQUIRE_KERNEL_MODULE("cryptodev");
-
initialize_constant_buffers();
fd = get_handle_fd();
crid = lookup_crid(fd, devname);
@@ -173,33 +167,49 @@ test_blake2s_vectors(const char *devname, const char *modname)
}
}
-ATF_TC_WITHOUT_HEAD(blake2b_vectors);
+ATF_TC(blake2b_vectors);
+ATF_TC_HEAD(blake2b_vectors, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "nexus/cryptosoft cryptodev");
+}
ATF_TC_BODY(blake2b_vectors, tc)
{
ATF_REQUIRE_SYSCTL_INT("kern.crypto.allow_soft", 1);
- test_blake2b_vectors("cryptosoft0", "nexus/cryptosoft");
+ test_blake2b_vectors("cryptosoft0");
}
-ATF_TC_WITHOUT_HEAD(blake2s_vectors);
+ATF_TC(blake2s_vectors);
+ATF_TC_HEAD(blake2s_vectors, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "nexus/cryptosoft cryptodev");
+}
ATF_TC_BODY(blake2s_vectors, tc)
{
ATF_REQUIRE_SYSCTL_INT("kern.crypto.allow_soft", 1);
- test_blake2s_vectors("cryptosoft0", "nexus/cryptosoft");
+ test_blake2s_vectors("cryptosoft0");
}
#if defined(__i386__) || defined(__amd64__)
-ATF_TC_WITHOUT_HEAD(blake2b_vectors_x86);
+ATF_TC(blake2b_vectors_x86);
+ATF_TC_HEAD(blake2b_vectors_x86, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "nexus/blake2 cryptodev");
+}
ATF_TC_BODY(blake2b_vectors_x86, tc)
{
ATF_REQUIRE_SYSCTL_INT("kern.crypto.allow_soft", 1);
- test_blake2b_vectors("blaketwo0", "nexus/blake2");
+ test_blake2b_vectors("blaketwo0");
}
-ATF_TC_WITHOUT_HEAD(blake2s_vectors_x86);
+ATF_TC(blake2s_vectors_x86);
+ATF_TC_HEAD(blake2s_vectors_x86, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "nexus/blake2 cryptodev");
+}
ATF_TC_BODY(blake2s_vectors_x86, tc)
{
ATF_REQUIRE_SYSCTL_INT("kern.crypto.allow_soft", 1);
- test_blake2s_vectors("blaketwo0", "nexus/blake2");
+ test_blake2s_vectors("blaketwo0");
}
#endif
diff --git a/tests/sys/opencrypto/poly1305_test.c b/tests/sys/opencrypto/poly1305_test.c
index ab455784efba..c51ffacfd1cc 100644
--- a/tests/sys/opencrypto/poly1305_test.c
+++ b/tests/sys/opencrypto/poly1305_test.c
@@ -350,16 +350,13 @@ do_cryptop(int fd, int ses, const void *inp, size_t inlen, void *out)
}
static void
-test_rfc7539_poly1305_vectors(int crid, const char *modname)
+test_rfc7539_poly1305_vectors(int crid)
{
uint8_t comptag[POLY1305_HASH_LEN], exptag[POLY1305_HASH_LEN],
key[POLY1305_KEY_LEN], msg[512];
int fd, ses;
size_t i;
- ATF_REQUIRE_KERNEL_MODULE(modname);
- ATF_REQUIRE_KERNEL_MODULE("cryptodev");
-
fd = get_handle_fd();
for (i = 0; i < nitems(rfc7539_kats); i++) {
@@ -378,11 +375,15 @@ test_rfc7539_poly1305_vectors(int crid, const char *modname)
}
}
-ATF_TC_WITHOUT_HEAD(poly1305_vectors);
+ATF_TC(poly1305_vectors);
+ATF_TC_HEAD(poly1305_vectors, tc)
+{
+ atf_tc_set_md_var(tc, "require.kmods", "nexus/cryptosoft cryptodev");
+}
ATF_TC_BODY(poly1305_vectors, tc)
{
ATF_REQUIRE_SYSCTL_INT("kern.crypto.allow_soft", 1);
- test_rfc7539_poly1305_vectors(CRYPTO_FLAG_SOFTWARE, "nexus/cryptosoft");
+ test_rfc7539_poly1305_vectors(CRYPTO_FLAG_SOFTWARE);
}
ATF_TP_ADD_TCS(tp)
diff --git a/tests/sys/sound/sndstat.c b/tests/sys/sound/sndstat.c
index ed292b570429..bbf18aca2824 100644
--- a/tests/sys/sound/sndstat.c
+++ b/tests/sys/sound/sndstat.c
@@ -40,17 +40,11 @@
#include <stdlib.h>
#include <unistd.h>
-static void
-load_dummy(void)
-{
- if (kldload("snd_dummy.ko") < 0 && errno != EEXIST)
- atf_tc_skip("snd_dummy.ko not found");
-}
-
ATF_TC(sndstat_nv);
ATF_TC_HEAD(sndstat_nv, tc)
{
atf_tc_set_md_var(tc, "descr", "/dev/sndstat nvlist test");
+ atf_tc_set_md_var(tc, "require.kmods", "snd_dummy");
}
ATF_TC_BODY(sndstat_nv, tc)
@@ -62,8 +56,6 @@ ATF_TC_BODY(sndstat_nv, tc)
size_t nitems, nchans, i, j;
int fd, rc, pchan, rchan;
- load_dummy();
-
if ((fd = open("/dev/sndstat", O_RDONLY)) < 0)
atf_tc_skip("/dev/sndstat not found, load sound(4)");
@@ -223,6 +215,7 @@ ATF_TC(sndstat_udev);
ATF_TC_HEAD(sndstat_udev, tc)
{
atf_tc_set_md_var(tc, "descr", "/dev/sndstat userdev interface test");
+ atf_tc_set_md_var(tc, "require.kmods", "snd_dummy");
}
ATF_TC_BODY(sndstat_udev, tc)
@@ -234,8 +227,6 @@ ATF_TC_BODY(sndstat_udev, tc)
size_t nitems, i;
int fd, rc, pchan, rchan, n;
- load_dummy();
-
if ((fd = open("/dev/sndstat", O_RDWR)) < 0)
atf_tc_skip("/dev/sndstat not found, load sound(4)");
diff --git a/tests/sys/vmm/vmm_cred_jail.sh b/tests/sys/vmm/vmm_cred_jail.sh
index 5b02b5dc0b42..dd7907b15352 100644
--- a/tests/sys/vmm/vmm_cred_jail.sh
+++ b/tests/sys/vmm/vmm_cred_jail.sh
@@ -35,12 +35,10 @@ vmm_cred_jail_host_head()
{
atf_set "descr" "Tests deleting the host's VM from within a jail"
atf_set "require.user" "root"
+ atf_set "require.kmods" "vmm"
}
vmm_cred_jail_host_body()
{
- if ! -c /dev/vmmctl; then
- atf_skip "vmm is not loaded"
- fi
bhyvectl --vm=testvm --create
vmm_mkjail myjail
atf_check -s exit:1 -e ignore jexec myjail bhyvectl --vm=testvm --destroy
@@ -56,12 +54,10 @@ vmm_cred_jail_other_head()
{
atf_set "descr" "Tests deleting a jail's VM from within another jail"
atf_set "require.user" "root"
+ atf_set "require.kmods" "vmm"
}
vmm_cred_jail_other_body()
{
- if ! -c /dev/vmmctl; then
- atf_skip "vmm is not loaded"
- fi
vmm_mkjail myjail1
vmm_mkjail myjail2
atf_check -s exit:0 jexec myjail1 bhyvectl --vm=testvm --create
diff --git a/tools/build/depend-cleanup.sh b/tools/build/depend-cleanup.sh
index 22bf34439758..aa01db6ccc37 100755
--- a/tools/build/depend-cleanup.sh
+++ b/tools/build/depend-cleanup.sh
@@ -470,3 +470,9 @@ fi
# 20250813 4f766afc1ca0 tcopy converted to C++
clean_dep usr.bin/tcopy tcopy c
+
+# 20250904 aef807876c30 moused binary to directory
+if [ -f "$OBJTOP"/usr.sbin/moused/moused ]; then
+ echo "Removing old moused binary"
+ run rm -fv "$OBJTOP"/usr.sbin/moused/moused
+fi
diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc
index 5eea402c4526..a2fb28f1a186 100644
--- a/tools/build/mk/OptionalObsoleteFiles.inc
+++ b/tools/build/mk/OptionalObsoleteFiles.inc
@@ -3793,11 +3793,14 @@ OLD_FILES+=usr/share/man/man1/host.1.gz
.endif
.if ${MK_LEGACY_CONSOLE} == no
+OLD_FILES+=etc/moused.conf
OLD_FILES+=etc/rc.d/moused
+OLD_FILES+=etc/rc.d/msconvd
OLD_FILES+=etc/rc.d/syscons
OLD_FILES+=usr/sbin/kbdcontrol
OLD_FILES+=usr/sbin/kbdmap
OLD_FILES+=usr/sbin/moused
+OLD_FILES+=usr/sbin/msconvd
OLD_FILES+=usr/sbin/vidcontrol
OLD_FILES+=usr/sbin/vidfont
OLD_FILES+=usr/share/man/man1/kbdcontrol.1.gz
@@ -3806,7 +3809,11 @@ OLD_FILES+=usr/share/man/man1/vidcontrol.1.gz
OLD_FILES+=usr/share/man/man1/vidfont.1.gz
OLD_FILES+=usr/share/man/man5/kbdmap.5.gz
OLD_FILES+=usr/share/man/man5/keymap.5.gz
+OLD_FILES+=usr/share/man/man5/moused.conf.5.gz
OLD_FILES+=usr/share/man/man8/moused.8.gz
+OLD_FILES+=usr/share/man/man8/msconvd.8.gz
+OLD_FILES+=usr/share/moused/5-generic-touchpad.quirks
+OLD_DIRS+=usr/share/moused
.endif
.for LIBCOMPAT libcompat in ${_ALL_LIBCOMPATS_libcompats}
diff --git a/tools/build/options/WITH_PTHREADS_ASSERTIONS b/tools/build/options/WITH_PTHREADS_ASSERTIONS
new file mode 100644
index 000000000000..03c15b76fb85
--- /dev/null
+++ b/tools/build/options/WITH_PTHREADS_ASSERTIONS
@@ -0,0 +1 @@
+Enable debugging assertions in pthreads library.
diff --git a/tools/build/options/makeman b/tools/build/options/makeman
index ddd08443e61c..88ee5884d180 100755
--- a/tools/build/options/makeman
+++ b/tools/build/options/makeman
@@ -222,8 +222,11 @@ variables that control the aspects of how the system builds.
.Pp
The default location of
.Nm
-is
-.Pa /etc/src.conf ,
+is the top level of the source tree, or
+.Pa /etc/src.conf
+if no
+.Nm
+is found in the source tree itself,
though an alternative location can be specified in the
.Xr make 1
variable
diff --git a/tools/tools/nanobsd/nanobsd.sh b/tools/tools/nanobsd/nanobsd.sh
index 4c390d8ca371..208bc646122d 100755
--- a/tools/tools/nanobsd/nanobsd.sh
+++ b/tools/tools/nanobsd/nanobsd.sh
@@ -49,7 +49,7 @@ do_prep_image=true
. "${topdir}/legacy.sh"
set +e
-args=`getopt BKXWbc:fhiIknqvw $*`
+args=`getopt BKXWbc:fhiIknpqvw $*`
if [ $? -ne 0 ] ; then
usage
exit 2
@@ -66,6 +66,15 @@ do
do_installkernel=false
shift
;;
+ -I)
+ do_world=false
+ do_kernel=false
+ do_installworld=false
+ do_installkernel=false
+ do_prep_image=false
+ do_image=true
+ shift
+ ;;
-K)
do_installkernel=false
shift
@@ -112,6 +121,10 @@ do
do_clean=false
shift
;;
+ -p)
+ do_prep_image=false
+ shift
+ ;;
-q)
PPLEVEL=$(($PPLEVEL - 1))
shift
@@ -124,15 +137,6 @@ do
do_world=false
shift
;;
- -I)
- do_world=false
- do_kernel=false
- do_installworld=false
- do_installkernel=false
- do_prep_image=false
- do_image=true
- shift
- ;;
--)
shift
break
@@ -158,7 +162,11 @@ fi
pprint 1 "NanoBSD image ${NANO_NAME} build starting"
-run_early_customize
+if $do_prep_image ; then
+ run_early_customize
+else
+ pprint 2 "Skipping early customization for image prep (as instructed)"
+fi
if $do_world ; then
if $do_clean ; then
diff --git a/usr.bin/man/man.1 b/usr.bin/man/man.1
index 820d6a5b33a9..707677ccce06 100644
--- a/usr.bin/man/man.1
+++ b/usr.bin/man/man.1
@@ -33,7 +33,7 @@
.Nd display online manual documentation pages
.Sh SYNOPSIS
.Nm
-.Op Fl adho
+.Op Fl adhlo
.Op Fl t | w
.Op Fl M Ar manpath
.Op Fl P Ar pager
@@ -144,6 +144,15 @@ Search names and descriptions of all manual pages for an extended regular
.Ar expression ,
emulating basic functionality of
.Xr apropos 1 .
+.It Fl l
+Interpret all arguments as absolute or relative filename(s)
+of the manual page(s) to display.
+No search is done and the options
+.Fl M ,
+.Fl m ,
+and
+.Fl S
+are ignored.
.It Fl m Ar arch Ns Op : Ns Ar machine
Override the default architecture and machine settings allowing lookup of
other platform specific manual pages.
@@ -269,12 +278,15 @@ will search the following paths when considering section 4 manual pages in
.Pa /usr/share/man/man4
.El
.Ss Displaying Specific Manual Files
-The
+For compatibility reasons,
.Nm
-utility also supports displaying a specific manual page if passed a path
-to the file as long as it contains a
+will interpret any argument containing at least one
.Ql /
-character.
+character as an absolute or relative path to a manual page to be
+displayed.
+This heuristic, made redundant by the more widely supported
+.Fl l
+option, is now deprecated and may be removed in future releases.
.Sh ENVIRONMENT
The following environment variables affect the execution of
.Nm :
@@ -398,7 +410,7 @@ manual page:
.Pp
Show a manual page in the current working directory:
.Pp
-.Dl $ man ./man.1
+.Dl $ man -l man.1
.Pp
Show the location of manual pages in sections 1 and 8 which contain the word
.Ql arm :
diff --git a/usr.bin/man/man.sh b/usr.bin/man/man.sh
index 18595042da5f..920223ce3c27 100755
--- a/usr.bin/man/man.sh
+++ b/usr.bin/man/man.sh
@@ -511,13 +511,21 @@ man_display_page_groff() {
# Usage: man_find_and_display page
# Search through the manpaths looking for the given page.
man_find_and_display() {
- local found_page locpath p path sect
+ local found_page has_slash locpath p path sect
# Check to see if it's a file. But only if it has a '/' in
- # the filename.
+ # the filename or if -l was specified.
case "$1" in
- */*) if [ -f "$1" -a -r "$1" ]; then
+ */*) has_slash=yes
+ ;;
+ esac
+ if [ -n "$has_slash" -o -n "$lflag" ]; then
+ if [ -f "$1" -a -r "$1" ]; then
decho "Found a usable page, displaying that"
+ if [ -z "$lflag" ]; then
+ echo "Opening a file directly is deprecated," \
+ "use -l instead." >&2
+ fi
unset use_cat
manpage="$1"
setup_cattool "$manpage"
@@ -531,9 +539,12 @@ man_find_and_display() {
man_display_page
fi
return
+ elif [ -n "$lflag" ]; then
+ echo "Cannot read $1" >&2
+ ret=1
+ return
fi
- ;;
- esac
+ fi
IFS=:
for sect in $MANSECT; do
@@ -601,7 +612,7 @@ man_parse_opts() {
local cmd_arg
OPTIND=1
- while getopts 'K:M:P:S:adfhkm:op:tw' cmd_arg; do
+ while getopts 'K:M:P:S:adfhklm:op:tw' cmd_arg; do
case "${cmd_arg}" in
K) Kflag=Kflag
REGEXP=$OPTARG ;;
@@ -613,6 +624,7 @@ man_parse_opts() {
f) fflag=fflag ;;
h) man_usage 0 ;;
k) kflag=kflag ;;
+ l) lflag=lflag ;;
m) mflag=$OPTARG ;;
o) oflag=oflag ;;
p) MANROFFSEQ=$OPTARG ;;
@@ -625,16 +637,19 @@ man_parse_opts() {
shift $(( $OPTIND - 1 ))
# Check the args for incompatible options.
-
- case "${Kflag}${fflag}${kflag}${tflag}${wflag}" in
+ case "${Kflag}${fflag}${kflag}${lflag}${tflag}${wflag}" in
Kflagfflag*) echo "Incompatible options: -K and -f"; man_usage ;;
Kflag*kflag*) echo "Incompatible options: -K and -k"; man_usage ;;
+ Kflag*lflag*) echo "Incompatible options: -K and -l"; man_usage ;;
Kflag*tflag) echo "Incompatible options: -K and -t"; man_usage ;;
fflagkflag*) echo "Incompatible options: -f and -k"; man_usage ;;
+ fflag*lflag*) echo "Incompatible options: -f and -l"; man_usage ;;
fflag*tflag*) echo "Incompatible options: -f and -t"; man_usage ;;
fflag*wflag) echo "Incompatible options: -f and -w"; man_usage ;;
- *kflagtflag*) echo "Incompatible options: -k and -t"; man_usage ;;
+ *kflaglflag*) echo "Incompatible options: -k and -l"; man_usage ;;
+ *kflag*tflag*) echo "Incompatible options: -k and -t"; man_usage ;;
*kflag*wflag) echo "Incompatible options: -k and -w"; man_usage ;;
+ *lflag*wflag) echo "Incompatible options: -l and -w"; man_usage ;;
*tflagwflag) echo "Incompatible options: -t and -w"; man_usage ;;
esac
@@ -751,7 +766,7 @@ man_setup_locale() {
# Display usage for the man utility.
man_usage() {
echo 'Usage:'
- echo ' man [-adho] [-t | -w] [-M manpath] [-P pager] [-S mansect]'
+ echo ' man [-adhlo] [-t | -w] [-M manpath] [-P pager] [-S mansect]'
echo ' [-m arch[:machine]] [-p [eprtv]] [mansect] page [...]'
echo ' man -K | -f | -k expression [...] -- Search manual pages'
diff --git a/usr.bin/sockstat/main.c b/usr.bin/sockstat/main.c
index b5e0248b743a..2e75e4966d80 100644
--- a/usr.bin/sockstat/main.c
+++ b/usr.bin/sockstat/main.c
@@ -1612,7 +1612,7 @@ display(void)
}
}
if (opt_j >= 0)
- return;
+ goto out;
SLIST_FOREACH(s, &nosocks, socket_list) {
if (!check_ports(s))
continue;
@@ -1637,6 +1637,7 @@ display(void)
display_sock(s, &cw, buf, bufsize);
xo_close_instance("socket");
}
+out:
xo_close_list("socket");
xo_close_container("sockstat");
if (xo_finish() < 0)
diff --git a/usr.sbin/bhyve/aarch64/vmexit.c b/usr.sbin/bhyve/aarch64/vmexit.c
index 3acad4020a3c..2457cbe76b5e 100644
--- a/usr.sbin/bhyve/aarch64/vmexit.c
+++ b/usr.sbin/bhyve/aarch64/vmexit.c
@@ -122,6 +122,8 @@ vmexit_suspend(struct vmctx *ctx, struct vcpu *vcpu, struct vm_run *vmrun)
exit(1);
case VM_SUSPEND_HALT:
exit(2);
+ case VM_SUSPEND_DESTROY:
+ exit(4);
default:
fprintf(stderr, "vmexit_suspend: invalid reason %d\n", how);
exit(100);
diff --git a/usr.sbin/bhyve/amd64/vmexit.c b/usr.sbin/bhyve/amd64/vmexit.c
index 944f5de34645..14f89563fd0f 100644
--- a/usr.sbin/bhyve/amd64/vmexit.c
+++ b/usr.sbin/bhyve/amd64/vmexit.c
@@ -418,6 +418,8 @@ vmexit_suspend(struct vmctx *ctx, struct vcpu *vcpu, struct vm_run *vmrun)
exit(2);
case VM_SUSPEND_TRIPLEFAULT:
exit(3);
+ case VM_SUSPEND_DESTROY:
+ exit(4);
default:
EPRINTLN("vmexit_suspend: invalid reason %d", how);
exit(100);
diff --git a/usr.sbin/bhyve/bhyve.8 b/usr.sbin/bhyve/bhyve.8
index 89c0b23961a8..c902c265da9e 100644
--- a/usr.sbin/bhyve/bhyve.8
+++ b/usr.sbin/bhyve/bhyve.8
@@ -1126,7 +1126,7 @@ powered off
.It 2
halted
.It 3
-triple fault
+triple fault (amd64 only)
.It 4
exited due to an error
.El
diff --git a/usr.sbin/bhyve/bhyverun.c b/usr.sbin/bhyve/bhyverun.c
index 9ead49582a7d..bfc0b949a75d 100644
--- a/usr.sbin/bhyve/bhyverun.c
+++ b/usr.sbin/bhyve/bhyverun.c
@@ -561,10 +561,8 @@ fbsdrun_start_thread(void *param)
#endif
vm_loop(vi->ctx, vi->vcpu);
-
- /* not reached */
- exit(1);
- return (NULL);
+ /* We get here if the VM was destroyed asynchronously. */
+ exit(4);
}
void
diff --git a/usr.sbin/bhyve/riscv/vmexit.c b/usr.sbin/bhyve/riscv/vmexit.c
index 3bc83b3bef4e..985f8e4e9065 100644
--- a/usr.sbin/bhyve/riscv/vmexit.c
+++ b/usr.sbin/bhyve/riscv/vmexit.c
@@ -121,6 +121,8 @@ vmexit_suspend(struct vmctx *ctx, struct vcpu *vcpu, struct vm_run *vmrun)
exit(1);
case VM_SUSPEND_HALT:
exit(2);
+ case VM_SUSPEND_DESTROY:
+ exit(4);
default:
fprintf(stderr, "vmexit_suspend: invalid reason %d\n", how);
exit(100);
diff --git a/usr.sbin/bsdinstall/bsdinstall.8 b/usr.sbin/bsdinstall/bsdinstall.8
index 181abdcf9d05..5ccbaef87835 100644
--- a/usr.sbin/bsdinstall/bsdinstall.8
+++ b/usr.sbin/bsdinstall/bsdinstall.8
@@ -693,7 +693,7 @@ is:
# Home directories separated so they are common to all BEs
/home mountpoint=/home
-# Compress /tmp, allow exec but not setuid
+# Create /tmp and allow exec but not setuid
/tmp mountpoint=/tmp,exec=on,setuid=off
# Do not mount /usr so that 'base' files go to the BEROOT
@@ -702,7 +702,7 @@ is:
# Ports tree
/usr/ports setuid=off
-# Source tree (compressed)
+# Source tree
/usr/src
# Create /var and friends
diff --git a/usr.sbin/bsdinstall/scripts/zfsboot b/usr.sbin/bsdinstall/scripts/zfsboot
index a3c1e2ddb89f..aa05faa7d3dd 100755
--- a/usr.sbin/bsdinstall/scripts/zfsboot
+++ b/usr.sbin/bsdinstall/scripts/zfsboot
@@ -152,7 +152,7 @@ f_isset ZFSBOOT_DATASETS || ZFSBOOT_DATASETS="
# Home directories separated so they are common to all BEs
/home mountpoint=/home
- # Compress /tmp, allow exec but not setuid
+ # Create /tmp and allow exec but not setuid
/tmp mountpoint=/tmp,exec=on,setuid=off
# Don't mount /usr so that 'base' files go to the BEROOT
@@ -161,7 +161,7 @@ f_isset ZFSBOOT_DATASETS || ZFSBOOT_DATASETS="
# Ports tree
/usr/ports setuid=off
- # Source tree (compressed)
+ # Source tree
/usr/src
# Create /var and friends
diff --git a/usr.sbin/certctl/certctl.c b/usr.sbin/certctl/certctl.c
index 3601f6929fc4..a53ed7b2b4b2 100644
--- a/usr.sbin/certctl/certctl.c
+++ b/usr.sbin/certctl/certctl.c
@@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
+#include <sys/types.h>
#include <sys/sysctl.h>
#include <sys/stat.h>
#include <sys/tree.h>
@@ -379,7 +380,7 @@ static int
read_certs(const char *path, struct cert_tree *tree, struct cert_tree *exclude)
{
struct stat sb;
- char *paths[] = { (char *)(uintptr_t)path, NULL };
+ char *paths[] = { __DECONST(char *, path), NULL };
FTS *fts;
FTSENT *ent;
int fts_options = FTS_LOGICAL | FTS_NOCHDIR;
diff --git a/usr.sbin/cpucontrol/cpucontrol.h b/usr.sbin/cpucontrol/cpucontrol.h
index a4b3a94c19e6..d03c30a6bd6d 100644
--- a/usr.sbin/cpucontrol/cpucontrol.h
+++ b/usr.sbin/cpucontrol/cpucontrol.h
@@ -43,6 +43,7 @@ typedef void ucode_update_t(const struct ucode_update_params *params);
extern int verbosity_level;
#ifdef DEBUG
+#include <stdio.h>
# define WARNX(level, ...) \
if ((level) <= verbosity_level) { \
fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \
diff --git a/usr.sbin/freebsd-update/freebsd-update.sh b/usr.sbin/freebsd-update/freebsd-update.sh
index 81040431ea79..b3775382f66c 100644
--- a/usr.sbin/freebsd-update/freebsd-update.sh
+++ b/usr.sbin/freebsd-update/freebsd-update.sh
@@ -512,14 +512,14 @@ parse_cmdline () {
if [ $# -eq 1 ]; then usage; fi; shift
config_KeyPrint $1 || usage
;;
- -s)
- if [ $# -eq 1 ]; then usage; fi; shift
- config_ServerName $1 || usage
- ;;
-r)
if [ $# -eq 1 ]; then usage; fi; shift
config_TargetRelease $1 || usage
;;
+ -s)
+ if [ $# -eq 1 ]; then usage; fi; shift
+ config_ServerName $1 || usage
+ ;;
-t)
if [ $# -eq 1 ]; then usage; fi; shift
config_MailTo $1 || usage
diff --git a/usr.sbin/moused/Makefile b/usr.sbin/moused/Makefile
index 2a7aa0484542..b6319b6fef20 100644
--- a/usr.sbin/moused/Makefile
+++ b/usr.sbin/moused/Makefile
@@ -1,10 +1,4 @@
-PACKAGE= console-tools
-PROG= moused
-MAN= moused.8
+SUBDIR+=moused
+SUBDIR+=msconvd
-LIBADD= m util
-
-#BINMODE=4555
-#PRECIOUSPROG=
-
-.include <bsd.prog.mk>
+.include <bsd.subdir.mk>
diff --git a/usr.sbin/moused/Makefile.depend b/usr.sbin/moused/Makefile.depend
deleted file mode 100644
index af3b7054df7a..000000000000
--- a/usr.sbin/moused/Makefile.depend
+++ /dev/null
@@ -1,17 +0,0 @@
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/libutil \
- lib/msun \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
diff --git a/usr.sbin/moused/moused/Makefile b/usr.sbin/moused/moused/Makefile
new file mode 100644
index 000000000000..8479764b710b
--- /dev/null
+++ b/usr.sbin/moused/moused/Makefile
@@ -0,0 +1,28 @@
+PACKAGE= console-tools
+PROG= moused
+
+SRCS= moused.c \
+ event-names.h \
+ quirks.c \
+ quirks.h \
+ util.c \
+ util.h \
+ util-evdev.c \
+ util-evdev.h \
+ util-list.c \
+ util-list.h
+MAN= moused.8 \
+ moused.conf.5
+CONFS= moused.conf
+QUIRKS= 5-generic-touchpad.quirks
+
+CWARNFLAGS.quirks.c+= -Wno-cast-align -Wno-shadow -Wno-cast-qual \
+ -Wno-unused-variable -Wno-unused-parameter
+CWARNFLAGS.util.c+= -Wno-shadow
+LIBADD= m util
+BINDIR= /usr/sbin
+
+FILES= ${QUIRKS:S|^|quirks/|}
+FILESDIR= /usr/share/${PROG}
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/moused/moused/event-names.h b/usr.sbin/moused/moused/event-names.h
new file mode 100644
index 000000000000..05093a1d0db3
--- /dev/null
+++ b/usr.sbin/moused/moused/event-names.h
@@ -0,0 +1,1656 @@
+/* THIS FILE IS GENERATED, DO NOT EDIT */
+
+#ifndef EVENT_NAMES_H
+#define EVENT_NAMES_H
+
+static const char * const ev_map[EV_MAX + 1] = {
+ [EV_SYN] = "EV_SYN",
+ [EV_KEY] = "EV_KEY",
+ [EV_REL] = "EV_REL",
+ [EV_ABS] = "EV_ABS",
+ [EV_MSC] = "EV_MSC",
+ [EV_SW] = "EV_SW",
+ [EV_LED] = "EV_LED",
+ [EV_SND] = "EV_SND",
+ [EV_REP] = "EV_REP",
+ [EV_FF] = "EV_FF",
+ [EV_PWR] = "EV_PWR",
+ [EV_FF_STATUS] = "EV_FF_STATUS",
+ [EV_MAX] = "EV_MAX",
+};
+
+static const char * const rel_map[REL_MAX + 1] = {
+ [REL_X] = "REL_X",
+ [REL_Y] = "REL_Y",
+ [REL_Z] = "REL_Z",
+ [REL_RX] = "REL_RX",
+ [REL_RY] = "REL_RY",
+ [REL_RZ] = "REL_RZ",
+ [REL_HWHEEL] = "REL_HWHEEL",
+ [REL_DIAL] = "REL_DIAL",
+ [REL_WHEEL] = "REL_WHEEL",
+ [REL_MISC] = "REL_MISC",
+ [REL_RESERVED] = "REL_RESERVED",
+ [REL_WHEEL_HI_RES] = "REL_WHEEL_HI_RES",
+ [REL_HWHEEL_HI_RES] = "REL_HWHEEL_HI_RES",
+ [REL_MAX] = "REL_MAX",
+};
+
+static const char * const abs_map[ABS_MAX + 1] = {
+ [ABS_X] = "ABS_X",
+ [ABS_Y] = "ABS_Y",
+ [ABS_Z] = "ABS_Z",
+ [ABS_RX] = "ABS_RX",
+ [ABS_RY] = "ABS_RY",
+ [ABS_RZ] = "ABS_RZ",
+ [ABS_THROTTLE] = "ABS_THROTTLE",
+ [ABS_RUDDER] = "ABS_RUDDER",
+ [ABS_WHEEL] = "ABS_WHEEL",
+ [ABS_GAS] = "ABS_GAS",
+ [ABS_BRAKE] = "ABS_BRAKE",
+ [ABS_HAT0X] = "ABS_HAT0X",
+ [ABS_HAT0Y] = "ABS_HAT0Y",
+ [ABS_HAT1X] = "ABS_HAT1X",
+ [ABS_HAT1Y] = "ABS_HAT1Y",
+ [ABS_HAT2X] = "ABS_HAT2X",
+ [ABS_HAT2Y] = "ABS_HAT2Y",
+ [ABS_HAT3X] = "ABS_HAT3X",
+ [ABS_HAT3Y] = "ABS_HAT3Y",
+ [ABS_PRESSURE] = "ABS_PRESSURE",
+ [ABS_DISTANCE] = "ABS_DISTANCE",
+ [ABS_TILT_X] = "ABS_TILT_X",
+ [ABS_TILT_Y] = "ABS_TILT_Y",
+ [ABS_TOOL_WIDTH] = "ABS_TOOL_WIDTH",
+ [ABS_VOLUME] = "ABS_VOLUME",
+ // [ABS_PROFILE] = "ABS_PROFILE",
+ [ABS_MISC] = "ABS_MISC",
+ [ABS_RESERVED] = "ABS_RESERVED",
+ [ABS_MT_SLOT] = "ABS_MT_SLOT",
+ [ABS_MT_TOUCH_MAJOR] = "ABS_MT_TOUCH_MAJOR",
+ [ABS_MT_TOUCH_MINOR] = "ABS_MT_TOUCH_MINOR",
+ [ABS_MT_WIDTH_MAJOR] = "ABS_MT_WIDTH_MAJOR",
+ [ABS_MT_WIDTH_MINOR] = "ABS_MT_WIDTH_MINOR",
+ [ABS_MT_ORIENTATION] = "ABS_MT_ORIENTATION",
+ [ABS_MT_POSITION_X] = "ABS_MT_POSITION_X",
+ [ABS_MT_POSITION_Y] = "ABS_MT_POSITION_Y",
+ [ABS_MT_TOOL_TYPE] = "ABS_MT_TOOL_TYPE",
+ [ABS_MT_BLOB_ID] = "ABS_MT_BLOB_ID",
+ [ABS_MT_TRACKING_ID] = "ABS_MT_TRACKING_ID",
+ [ABS_MT_PRESSURE] = "ABS_MT_PRESSURE",
+ [ABS_MT_DISTANCE] = "ABS_MT_DISTANCE",
+ [ABS_MT_TOOL_X] = "ABS_MT_TOOL_X",
+ [ABS_MT_TOOL_Y] = "ABS_MT_TOOL_Y",
+ [ABS_MAX] = "ABS_MAX",
+};
+
+static const char * const key_map[KEY_MAX + 1] = {
+ [KEY_RESERVED] = "KEY_RESERVED",
+ [KEY_ESC] = "KEY_ESC",
+ [KEY_1] = "KEY_1",
+ [KEY_2] = "KEY_2",
+ [KEY_3] = "KEY_3",
+ [KEY_4] = "KEY_4",
+ [KEY_5] = "KEY_5",
+ [KEY_6] = "KEY_6",
+ [KEY_7] = "KEY_7",
+ [KEY_8] = "KEY_8",
+ [KEY_9] = "KEY_9",
+ [KEY_0] = "KEY_0",
+ [KEY_MINUS] = "KEY_MINUS",
+ [KEY_EQUAL] = "KEY_EQUAL",
+ [KEY_BACKSPACE] = "KEY_BACKSPACE",
+ [KEY_TAB] = "KEY_TAB",
+ [KEY_Q] = "KEY_Q",
+ [KEY_W] = "KEY_W",
+ [KEY_E] = "KEY_E",
+ [KEY_R] = "KEY_R",
+ [KEY_T] = "KEY_T",
+ [KEY_Y] = "KEY_Y",
+ [KEY_U] = "KEY_U",
+ [KEY_I] = "KEY_I",
+ [KEY_O] = "KEY_O",
+ [KEY_P] = "KEY_P",
+ [KEY_LEFTBRACE] = "KEY_LEFTBRACE",
+ [KEY_RIGHTBRACE] = "KEY_RIGHTBRACE",
+ [KEY_ENTER] = "KEY_ENTER",
+ [KEY_LEFTCTRL] = "KEY_LEFTCTRL",
+ [KEY_A] = "KEY_A",
+ [KEY_S] = "KEY_S",
+ [KEY_D] = "KEY_D",
+ [KEY_F] = "KEY_F",
+ [KEY_G] = "KEY_G",
+ [KEY_H] = "KEY_H",
+ [KEY_J] = "KEY_J",
+ [KEY_K] = "KEY_K",
+ [KEY_L] = "KEY_L",
+ [KEY_SEMICOLON] = "KEY_SEMICOLON",
+ [KEY_APOSTROPHE] = "KEY_APOSTROPHE",
+ [KEY_GRAVE] = "KEY_GRAVE",
+ [KEY_LEFTSHIFT] = "KEY_LEFTSHIFT",
+ [KEY_BACKSLASH] = "KEY_BACKSLASH",
+ [KEY_Z] = "KEY_Z",
+ [KEY_X] = "KEY_X",
+ [KEY_C] = "KEY_C",
+ [KEY_V] = "KEY_V",
+ [KEY_B] = "KEY_B",
+ [KEY_N] = "KEY_N",
+ [KEY_M] = "KEY_M",
+ [KEY_COMMA] = "KEY_COMMA",
+ [KEY_DOT] = "KEY_DOT",
+ [KEY_SLASH] = "KEY_SLASH",
+ [KEY_RIGHTSHIFT] = "KEY_RIGHTSHIFT",
+ [KEY_KPASTERISK] = "KEY_KPASTERISK",
+ [KEY_LEFTALT] = "KEY_LEFTALT",
+ [KEY_SPACE] = "KEY_SPACE",
+ [KEY_CAPSLOCK] = "KEY_CAPSLOCK",
+ [KEY_F1] = "KEY_F1",
+ [KEY_F2] = "KEY_F2",
+ [KEY_F3] = "KEY_F3",
+ [KEY_F4] = "KEY_F4",
+ [KEY_F5] = "KEY_F5",
+ [KEY_F6] = "KEY_F6",
+ [KEY_F7] = "KEY_F7",
+ [KEY_F8] = "KEY_F8",
+ [KEY_F9] = "KEY_F9",
+ [KEY_F10] = "KEY_F10",
+ [KEY_NUMLOCK] = "KEY_NUMLOCK",
+ [KEY_SCROLLLOCK] = "KEY_SCROLLLOCK",
+ [KEY_KP7] = "KEY_KP7",
+ [KEY_KP8] = "KEY_KP8",
+ [KEY_KP9] = "KEY_KP9",
+ [KEY_KPMINUS] = "KEY_KPMINUS",
+ [KEY_KP4] = "KEY_KP4",
+ [KEY_KP5] = "KEY_KP5",
+ [KEY_KP6] = "KEY_KP6",
+ [KEY_KPPLUS] = "KEY_KPPLUS",
+ [KEY_KP1] = "KEY_KP1",
+ [KEY_KP2] = "KEY_KP2",
+ [KEY_KP3] = "KEY_KP3",
+ [KEY_KP0] = "KEY_KP0",
+ [KEY_KPDOT] = "KEY_KPDOT",
+ [KEY_ZENKAKUHANKAKU] = "KEY_ZENKAKUHANKAKU",
+ [KEY_102ND] = "KEY_102ND",
+ [KEY_F11] = "KEY_F11",
+ [KEY_F12] = "KEY_F12",
+ [KEY_RO] = "KEY_RO",
+ [KEY_KATAKANA] = "KEY_KATAKANA",
+ [KEY_HIRAGANA] = "KEY_HIRAGANA",
+ [KEY_HENKAN] = "KEY_HENKAN",
+ [KEY_KATAKANAHIRAGANA] = "KEY_KATAKANAHIRAGANA",
+ [KEY_MUHENKAN] = "KEY_MUHENKAN",
+ [KEY_KPJPCOMMA] = "KEY_KPJPCOMMA",
+ [KEY_KPENTER] = "KEY_KPENTER",
+ [KEY_RIGHTCTRL] = "KEY_RIGHTCTRL",
+ [KEY_KPSLASH] = "KEY_KPSLASH",
+ [KEY_SYSRQ] = "KEY_SYSRQ",
+ [KEY_RIGHTALT] = "KEY_RIGHTALT",
+ [KEY_LINEFEED] = "KEY_LINEFEED",
+ [KEY_HOME] = "KEY_HOME",
+ [KEY_UP] = "KEY_UP",
+ [KEY_PAGEUP] = "KEY_PAGEUP",
+ [KEY_LEFT] = "KEY_LEFT",
+ [KEY_RIGHT] = "KEY_RIGHT",
+ [KEY_END] = "KEY_END",
+ [KEY_DOWN] = "KEY_DOWN",
+ [KEY_PAGEDOWN] = "KEY_PAGEDOWN",
+ [KEY_INSERT] = "KEY_INSERT",
+ [KEY_DELETE] = "KEY_DELETE",
+ [KEY_MACRO] = "KEY_MACRO",
+ [KEY_MUTE] = "KEY_MUTE",
+ [KEY_VOLUMEDOWN] = "KEY_VOLUMEDOWN",
+ [KEY_VOLUMEUP] = "KEY_VOLUMEUP",
+ [KEY_POWER] = "KEY_POWER",
+ [KEY_KPEQUAL] = "KEY_KPEQUAL",
+ [KEY_KPPLUSMINUS] = "KEY_KPPLUSMINUS",
+ [KEY_PAUSE] = "KEY_PAUSE",
+ [KEY_SCALE] = "KEY_SCALE",
+ [KEY_KPCOMMA] = "KEY_KPCOMMA",
+ [KEY_HANGEUL] = "KEY_HANGEUL",
+ [KEY_HANJA] = "KEY_HANJA",
+ [KEY_YEN] = "KEY_YEN",
+ [KEY_LEFTMETA] = "KEY_LEFTMETA",
+ [KEY_RIGHTMETA] = "KEY_RIGHTMETA",
+ [KEY_COMPOSE] = "KEY_COMPOSE",
+ [KEY_STOP] = "KEY_STOP",
+ [KEY_AGAIN] = "KEY_AGAIN",
+ [KEY_PROPS] = "KEY_PROPS",
+ [KEY_UNDO] = "KEY_UNDO",
+ [KEY_FRONT] = "KEY_FRONT",
+ [KEY_COPY] = "KEY_COPY",
+ [KEY_OPEN] = "KEY_OPEN",
+ [KEY_PASTE] = "KEY_PASTE",
+ [KEY_FIND] = "KEY_FIND",
+ [KEY_CUT] = "KEY_CUT",
+ [KEY_HELP] = "KEY_HELP",
+ [KEY_MENU] = "KEY_MENU",
+ [KEY_CALC] = "KEY_CALC",
+ [KEY_SETUP] = "KEY_SETUP",
+ [KEY_SLEEP] = "KEY_SLEEP",
+ [KEY_WAKEUP] = "KEY_WAKEUP",
+ [KEY_FILE] = "KEY_FILE",
+ [KEY_SENDFILE] = "KEY_SENDFILE",
+ [KEY_DELETEFILE] = "KEY_DELETEFILE",
+ [KEY_XFER] = "KEY_XFER",
+ [KEY_PROG1] = "KEY_PROG1",
+ [KEY_PROG2] = "KEY_PROG2",
+ [KEY_WWW] = "KEY_WWW",
+ [KEY_MSDOS] = "KEY_MSDOS",
+ [KEY_COFFEE] = "KEY_COFFEE",
+ [KEY_ROTATE_DISPLAY] = "KEY_ROTATE_DISPLAY",
+ [KEY_CYCLEWINDOWS] = "KEY_CYCLEWINDOWS",
+ [KEY_MAIL] = "KEY_MAIL",
+ [KEY_BOOKMARKS] = "KEY_BOOKMARKS",
+ [KEY_COMPUTER] = "KEY_COMPUTER",
+ [KEY_BACK] = "KEY_BACK",
+ [KEY_FORWARD] = "KEY_FORWARD",
+ [KEY_CLOSECD] = "KEY_CLOSECD",
+ [KEY_EJECTCD] = "KEY_EJECTCD",
+ [KEY_EJECTCLOSECD] = "KEY_EJECTCLOSECD",
+ [KEY_NEXTSONG] = "KEY_NEXTSONG",
+ [KEY_PLAYPAUSE] = "KEY_PLAYPAUSE",
+ [KEY_PREVIOUSSONG] = "KEY_PREVIOUSSONG",
+ [KEY_STOPCD] = "KEY_STOPCD",
+ [KEY_RECORD] = "KEY_RECORD",
+ [KEY_REWIND] = "KEY_REWIND",
+ [KEY_PHONE] = "KEY_PHONE",
+ [KEY_ISO] = "KEY_ISO",
+ [KEY_CONFIG] = "KEY_CONFIG",
+ [KEY_HOMEPAGE] = "KEY_HOMEPAGE",
+ [KEY_REFRESH] = "KEY_REFRESH",
+ [KEY_EXIT] = "KEY_EXIT",
+ [KEY_MOVE] = "KEY_MOVE",
+ [KEY_EDIT] = "KEY_EDIT",
+ [KEY_SCROLLUP] = "KEY_SCROLLUP",
+ [KEY_SCROLLDOWN] = "KEY_SCROLLDOWN",
+ [KEY_KPLEFTPAREN] = "KEY_KPLEFTPAREN",
+ [KEY_KPRIGHTPAREN] = "KEY_KPRIGHTPAREN",
+ [KEY_NEW] = "KEY_NEW",
+ [KEY_REDO] = "KEY_REDO",
+ [KEY_F13] = "KEY_F13",
+ [KEY_F14] = "KEY_F14",
+ [KEY_F15] = "KEY_F15",
+ [KEY_F16] = "KEY_F16",
+ [KEY_F17] = "KEY_F17",
+ [KEY_F18] = "KEY_F18",
+ [KEY_F19] = "KEY_F19",
+ [KEY_F20] = "KEY_F20",
+ [KEY_F21] = "KEY_F21",
+ [KEY_F22] = "KEY_F22",
+ [KEY_F23] = "KEY_F23",
+ [KEY_F24] = "KEY_F24",
+ [KEY_PLAYCD] = "KEY_PLAYCD",
+ [KEY_PAUSECD] = "KEY_PAUSECD",
+ [KEY_PROG3] = "KEY_PROG3",
+ [KEY_PROG4] = "KEY_PROG4",
+ // [KEY_ALL_APPLICATIONS] = "KEY_ALL_APPLICATIONS",
+ [KEY_SUSPEND] = "KEY_SUSPEND",
+ [KEY_CLOSE] = "KEY_CLOSE",
+ [KEY_PLAY] = "KEY_PLAY",
+ [KEY_FASTFORWARD] = "KEY_FASTFORWARD",
+ [KEY_BASSBOOST] = "KEY_BASSBOOST",
+ [KEY_PRINT] = "KEY_PRINT",
+ [KEY_HP] = "KEY_HP",
+ [KEY_CAMERA] = "KEY_CAMERA",
+ [KEY_SOUND] = "KEY_SOUND",
+ [KEY_QUESTION] = "KEY_QUESTION",
+ [KEY_EMAIL] = "KEY_EMAIL",
+ [KEY_CHAT] = "KEY_CHAT",
+ [KEY_SEARCH] = "KEY_SEARCH",
+ [KEY_CONNECT] = "KEY_CONNECT",
+ [KEY_FINANCE] = "KEY_FINANCE",
+ [KEY_SPORT] = "KEY_SPORT",
+ [KEY_SHOP] = "KEY_SHOP",
+ [KEY_ALTERASE] = "KEY_ALTERASE",
+ [KEY_CANCEL] = "KEY_CANCEL",
+ [KEY_BRIGHTNESSDOWN] = "KEY_BRIGHTNESSDOWN",
+ [KEY_BRIGHTNESSUP] = "KEY_BRIGHTNESSUP",
+ [KEY_MEDIA] = "KEY_MEDIA",
+ [KEY_SWITCHVIDEOMODE] = "KEY_SWITCHVIDEOMODE",
+ [KEY_KBDILLUMTOGGLE] = "KEY_KBDILLUMTOGGLE",
+ [KEY_KBDILLUMDOWN] = "KEY_KBDILLUMDOWN",
+ [KEY_KBDILLUMUP] = "KEY_KBDILLUMUP",
+ [KEY_SEND] = "KEY_SEND",
+ [KEY_REPLY] = "KEY_REPLY",
+ [KEY_FORWARDMAIL] = "KEY_FORWARDMAIL",
+ [KEY_SAVE] = "KEY_SAVE",
+ [KEY_DOCUMENTS] = "KEY_DOCUMENTS",
+ [KEY_BATTERY] = "KEY_BATTERY",
+ [KEY_BLUETOOTH] = "KEY_BLUETOOTH",
+ [KEY_WLAN] = "KEY_WLAN",
+ [KEY_UWB] = "KEY_UWB",
+ [KEY_UNKNOWN] = "KEY_UNKNOWN",
+ [KEY_VIDEO_NEXT] = "KEY_VIDEO_NEXT",
+ [KEY_VIDEO_PREV] = "KEY_VIDEO_PREV",
+ [KEY_BRIGHTNESS_CYCLE] = "KEY_BRIGHTNESS_CYCLE",
+ [KEY_BRIGHTNESS_AUTO] = "KEY_BRIGHTNESS_AUTO",
+ [KEY_DISPLAY_OFF] = "KEY_DISPLAY_OFF",
+ [KEY_WWAN] = "KEY_WWAN",
+ [KEY_RFKILL] = "KEY_RFKILL",
+ [KEY_MICMUTE] = "KEY_MICMUTE",
+ [KEY_OK] = "KEY_OK",
+ [KEY_SELECT] = "KEY_SELECT",
+ [KEY_GOTO] = "KEY_GOTO",
+ [KEY_CLEAR] = "KEY_CLEAR",
+ [KEY_POWER2] = "KEY_POWER2",
+ [KEY_OPTION] = "KEY_OPTION",
+ [KEY_INFO] = "KEY_INFO",
+ [KEY_TIME] = "KEY_TIME",
+ [KEY_VENDOR] = "KEY_VENDOR",
+ [KEY_ARCHIVE] = "KEY_ARCHIVE",
+ [KEY_PROGRAM] = "KEY_PROGRAM",
+ [KEY_CHANNEL] = "KEY_CHANNEL",
+ [KEY_FAVORITES] = "KEY_FAVORITES",
+ [KEY_EPG] = "KEY_EPG",
+ [KEY_PVR] = "KEY_PVR",
+ [KEY_MHP] = "KEY_MHP",
+ [KEY_LANGUAGE] = "KEY_LANGUAGE",
+ [KEY_TITLE] = "KEY_TITLE",
+ [KEY_SUBTITLE] = "KEY_SUBTITLE",
+ [KEY_ANGLE] = "KEY_ANGLE",
+ [KEY_FULL_SCREEN] = "KEY_FULL_SCREEN",
+ [KEY_MODE] = "KEY_MODE",
+ [KEY_KEYBOARD] = "KEY_KEYBOARD",
+ [KEY_ASPECT_RATIO] = "KEY_ASPECT_RATIO",
+ [KEY_PC] = "KEY_PC",
+ [KEY_TV] = "KEY_TV",
+ [KEY_TV2] = "KEY_TV2",
+ [KEY_VCR] = "KEY_VCR",
+ [KEY_VCR2] = "KEY_VCR2",
+ [KEY_SAT] = "KEY_SAT",
+ [KEY_SAT2] = "KEY_SAT2",
+ [KEY_CD] = "KEY_CD",
+ [KEY_TAPE] = "KEY_TAPE",
+ [KEY_RADIO] = "KEY_RADIO",
+ [KEY_TUNER] = "KEY_TUNER",
+ [KEY_PLAYER] = "KEY_PLAYER",
+ [KEY_TEXT] = "KEY_TEXT",
+ [KEY_DVD] = "KEY_DVD",
+ [KEY_AUX] = "KEY_AUX",
+ [KEY_MP3] = "KEY_MP3",
+ [KEY_AUDIO] = "KEY_AUDIO",
+ [KEY_VIDEO] = "KEY_VIDEO",
+ [KEY_DIRECTORY] = "KEY_DIRECTORY",
+ [KEY_LIST] = "KEY_LIST",
+ [KEY_MEMO] = "KEY_MEMO",
+ [KEY_CALENDAR] = "KEY_CALENDAR",
+ [KEY_RED] = "KEY_RED",
+ [KEY_GREEN] = "KEY_GREEN",
+ [KEY_YELLOW] = "KEY_YELLOW",
+ [KEY_BLUE] = "KEY_BLUE",
+ [KEY_CHANNELUP] = "KEY_CHANNELUP",
+ [KEY_CHANNELDOWN] = "KEY_CHANNELDOWN",
+ [KEY_FIRST] = "KEY_FIRST",
+ [KEY_LAST] = "KEY_LAST",
+ [KEY_AB] = "KEY_AB",
+ [KEY_NEXT] = "KEY_NEXT",
+ [KEY_RESTART] = "KEY_RESTART",
+ [KEY_SLOW] = "KEY_SLOW",
+ [KEY_SHUFFLE] = "KEY_SHUFFLE",
+ [KEY_BREAK] = "KEY_BREAK",
+ [KEY_PREVIOUS] = "KEY_PREVIOUS",
+ [KEY_DIGITS] = "KEY_DIGITS",
+ [KEY_TEEN] = "KEY_TEEN",
+ [KEY_TWEN] = "KEY_TWEN",
+ [KEY_VIDEOPHONE] = "KEY_VIDEOPHONE",
+ [KEY_GAMES] = "KEY_GAMES",
+ [KEY_ZOOMIN] = "KEY_ZOOMIN",
+ [KEY_ZOOMOUT] = "KEY_ZOOMOUT",
+ [KEY_ZOOMRESET] = "KEY_ZOOMRESET",
+ [KEY_WORDPROCESSOR] = "KEY_WORDPROCESSOR",
+ [KEY_EDITOR] = "KEY_EDITOR",
+ [KEY_SPREADSHEET] = "KEY_SPREADSHEET",
+ [KEY_GRAPHICSEDITOR] = "KEY_GRAPHICSEDITOR",
+ [KEY_PRESENTATION] = "KEY_PRESENTATION",
+ [KEY_DATABASE] = "KEY_DATABASE",
+ [KEY_NEWS] = "KEY_NEWS",
+ [KEY_VOICEMAIL] = "KEY_VOICEMAIL",
+ [KEY_ADDRESSBOOK] = "KEY_ADDRESSBOOK",
+ [KEY_MESSENGER] = "KEY_MESSENGER",
+ [KEY_DISPLAYTOGGLE] = "KEY_DISPLAYTOGGLE",
+ [KEY_SPELLCHECK] = "KEY_SPELLCHECK",
+ [KEY_LOGOFF] = "KEY_LOGOFF",
+ [KEY_DOLLAR] = "KEY_DOLLAR",
+ [KEY_EURO] = "KEY_EURO",
+ [KEY_FRAMEBACK] = "KEY_FRAMEBACK",
+ [KEY_FRAMEFORWARD] = "KEY_FRAMEFORWARD",
+ [KEY_CONTEXT_MENU] = "KEY_CONTEXT_MENU",
+ [KEY_MEDIA_REPEAT] = "KEY_MEDIA_REPEAT",
+ [KEY_10CHANNELSUP] = "KEY_10CHANNELSUP",
+ [KEY_10CHANNELSDOWN] = "KEY_10CHANNELSDOWN",
+ [KEY_IMAGES] = "KEY_IMAGES",
+ // [KEY_NOTIFICATION_CENTER] = "KEY_NOTIFICATION_CENTER",
+ // [KEY_PICKUP_PHONE] = "KEY_PICKUP_PHONE",
+ // [KEY_HANGUP_PHONE] = "KEY_HANGUP_PHONE",
+ [KEY_DEL_EOL] = "KEY_DEL_EOL",
+ [KEY_DEL_EOS] = "KEY_DEL_EOS",
+ [KEY_INS_LINE] = "KEY_INS_LINE",
+ [KEY_DEL_LINE] = "KEY_DEL_LINE",
+ [KEY_FN] = "KEY_FN",
+ [KEY_FN_ESC] = "KEY_FN_ESC",
+ [KEY_FN_F1] = "KEY_FN_F1",
+ [KEY_FN_F2] = "KEY_FN_F2",
+ [KEY_FN_F3] = "KEY_FN_F3",
+ [KEY_FN_F4] = "KEY_FN_F4",
+ [KEY_FN_F5] = "KEY_FN_F5",
+ [KEY_FN_F6] = "KEY_FN_F6",
+ [KEY_FN_F7] = "KEY_FN_F7",
+ [KEY_FN_F8] = "KEY_FN_F8",
+ [KEY_FN_F9] = "KEY_FN_F9",
+ [KEY_FN_F10] = "KEY_FN_F10",
+ [KEY_FN_F11] = "KEY_FN_F11",
+ [KEY_FN_F12] = "KEY_FN_F12",
+ [KEY_FN_1] = "KEY_FN_1",
+ [KEY_FN_2] = "KEY_FN_2",
+ [KEY_FN_D] = "KEY_FN_D",
+ [KEY_FN_E] = "KEY_FN_E",
+ [KEY_FN_F] = "KEY_FN_F",
+ [KEY_FN_S] = "KEY_FN_S",
+ [KEY_FN_B] = "KEY_FN_B",
+ // [KEY_FN_RIGHT_SHIFT] = "KEY_FN_RIGHT_SHIFT",
+ [KEY_BRL_DOT1] = "KEY_BRL_DOT1",
+ [KEY_BRL_DOT2] = "KEY_BRL_DOT2",
+ [KEY_BRL_DOT3] = "KEY_BRL_DOT3",
+ [KEY_BRL_DOT4] = "KEY_BRL_DOT4",
+ [KEY_BRL_DOT5] = "KEY_BRL_DOT5",
+ [KEY_BRL_DOT6] = "KEY_BRL_DOT6",
+ [KEY_BRL_DOT7] = "KEY_BRL_DOT7",
+ [KEY_BRL_DOT8] = "KEY_BRL_DOT8",
+ [KEY_BRL_DOT9] = "KEY_BRL_DOT9",
+ [KEY_BRL_DOT10] = "KEY_BRL_DOT10",
+ [KEY_NUMERIC_0] = "KEY_NUMERIC_0",
+ [KEY_NUMERIC_1] = "KEY_NUMERIC_1",
+ [KEY_NUMERIC_2] = "KEY_NUMERIC_2",
+ [KEY_NUMERIC_3] = "KEY_NUMERIC_3",
+ [KEY_NUMERIC_4] = "KEY_NUMERIC_4",
+ [KEY_NUMERIC_5] = "KEY_NUMERIC_5",
+ [KEY_NUMERIC_6] = "KEY_NUMERIC_6",
+ [KEY_NUMERIC_7] = "KEY_NUMERIC_7",
+ [KEY_NUMERIC_8] = "KEY_NUMERIC_8",
+ [KEY_NUMERIC_9] = "KEY_NUMERIC_9",
+ [KEY_NUMERIC_STAR] = "KEY_NUMERIC_STAR",
+ [KEY_NUMERIC_POUND] = "KEY_NUMERIC_POUND",
+ [KEY_NUMERIC_A] = "KEY_NUMERIC_A",
+ [KEY_NUMERIC_B] = "KEY_NUMERIC_B",
+ [KEY_NUMERIC_C] = "KEY_NUMERIC_C",
+ [KEY_NUMERIC_D] = "KEY_NUMERIC_D",
+ [KEY_CAMERA_FOCUS] = "KEY_CAMERA_FOCUS",
+ [KEY_WPS_BUTTON] = "KEY_WPS_BUTTON",
+ [KEY_TOUCHPAD_TOGGLE] = "KEY_TOUCHPAD_TOGGLE",
+ [KEY_TOUCHPAD_ON] = "KEY_TOUCHPAD_ON",
+ [KEY_TOUCHPAD_OFF] = "KEY_TOUCHPAD_OFF",
+ [KEY_CAMERA_ZOOMIN] = "KEY_CAMERA_ZOOMIN",
+ [KEY_CAMERA_ZOOMOUT] = "KEY_CAMERA_ZOOMOUT",
+ [KEY_CAMERA_UP] = "KEY_CAMERA_UP",
+ [KEY_CAMERA_DOWN] = "KEY_CAMERA_DOWN",
+ [KEY_CAMERA_LEFT] = "KEY_CAMERA_LEFT",
+ [KEY_CAMERA_RIGHT] = "KEY_CAMERA_RIGHT",
+ [KEY_ATTENDANT_ON] = "KEY_ATTENDANT_ON",
+ [KEY_ATTENDANT_OFF] = "KEY_ATTENDANT_OFF",
+ [KEY_ATTENDANT_TOGGLE] = "KEY_ATTENDANT_TOGGLE",
+ [KEY_LIGHTS_TOGGLE] = "KEY_LIGHTS_TOGGLE",
+ [KEY_ALS_TOGGLE] = "KEY_ALS_TOGGLE",
+ [KEY_ROTATE_LOCK_TOGGLE] = "KEY_ROTATE_LOCK_TOGGLE",
+ [KEY_BUTTONCONFIG] = "KEY_BUTTONCONFIG",
+ [KEY_TASKMANAGER] = "KEY_TASKMANAGER",
+ [KEY_JOURNAL] = "KEY_JOURNAL",
+ [KEY_CONTROLPANEL] = "KEY_CONTROLPANEL",
+ [KEY_APPSELECT] = "KEY_APPSELECT",
+ [KEY_SCREENSAVER] = "KEY_SCREENSAVER",
+ [KEY_VOICECOMMAND] = "KEY_VOICECOMMAND",
+ [KEY_ASSISTANT] = "KEY_ASSISTANT",
+ [KEY_KBD_LAYOUT_NEXT] = "KEY_KBD_LAYOUT_NEXT",
+ // [KEY_EMOJI_PICKER] = "KEY_EMOJI_PICKER",
+ //[KEY_DICTATE] = "KEY_DICTATE",
+ //[KEY_CAMERA_ACCESS_ENABLE] = "KEY_CAMERA_ACCESS_ENABLE",
+ //[KEY_CAMERA_ACCESS_DISABLE] = "KEY_CAMERA_ACCESS_DISABLE",
+ //[KEY_CAMERA_ACCESS_TOGGLE] = "KEY_CAMERA_ACCESS_TOGGLE",
+ [KEY_BRIGHTNESS_MIN] = "KEY_BRIGHTNESS_MIN",
+ [KEY_BRIGHTNESS_MAX] = "KEY_BRIGHTNESS_MAX",
+ [KEY_KBDINPUTASSIST_PREV] = "KEY_KBDINPUTASSIST_PREV",
+ [KEY_KBDINPUTASSIST_NEXT] = "KEY_KBDINPUTASSIST_NEXT",
+ [KEY_KBDINPUTASSIST_PREVGROUP] = "KEY_KBDINPUTASSIST_PREVGROUP",
+ [KEY_KBDINPUTASSIST_NEXTGROUP] = "KEY_KBDINPUTASSIST_NEXTGROUP",
+ [KEY_KBDINPUTASSIST_ACCEPT] = "KEY_KBDINPUTASSIST_ACCEPT",
+ [KEY_KBDINPUTASSIST_CANCEL] = "KEY_KBDINPUTASSIST_CANCEL",
+ [KEY_RIGHT_UP] = "KEY_RIGHT_UP",
+ [KEY_RIGHT_DOWN] = "KEY_RIGHT_DOWN",
+ [KEY_LEFT_UP] = "KEY_LEFT_UP",
+ [KEY_LEFT_DOWN] = "KEY_LEFT_DOWN",
+ [KEY_ROOT_MENU] = "KEY_ROOT_MENU",
+ [KEY_MEDIA_TOP_MENU] = "KEY_MEDIA_TOP_MENU",
+ [KEY_NUMERIC_11] = "KEY_NUMERIC_11",
+ [KEY_NUMERIC_12] = "KEY_NUMERIC_12",
+ [KEY_AUDIO_DESC] = "KEY_AUDIO_DESC",
+ [KEY_3D_MODE] = "KEY_3D_MODE",
+ [KEY_NEXT_FAVORITE] = "KEY_NEXT_FAVORITE",
+ [KEY_STOP_RECORD] = "KEY_STOP_RECORD",
+ [KEY_PAUSE_RECORD] = "KEY_PAUSE_RECORD",
+ [KEY_VOD] = "KEY_VOD",
+ [KEY_UNMUTE] = "KEY_UNMUTE",
+ [KEY_FASTREVERSE] = "KEY_FASTREVERSE",
+ [KEY_SLOWREVERSE] = "KEY_SLOWREVERSE",
+ [KEY_DATA] = "KEY_DATA",
+ [KEY_ONSCREEN_KEYBOARD] = "KEY_ONSCREEN_KEYBOARD",
+ [KEY_PRIVACY_SCREEN_TOGGLE] = "KEY_PRIVACY_SCREEN_TOGGLE",
+ [KEY_SELECTIVE_SCREENSHOT] = "KEY_SELECTIVE_SCREENSHOT",
+ // [KEY_NEXT_ELEMENT] = "KEY_NEXT_ELEMENT",
+ // [KEY_PREVIOUS_ELEMENT] = "KEY_PREVIOUS_ELEMENT",
+ // [KEY_AUTOPILOT_ENGAGE_TOGGLE] = "KEY_AUTOPILOT_ENGAGE_TOGGLE",
+ // [KEY_MARK_WAYPOINT] = "KEY_MARK_WAYPOINT",
+ // [KEY_SOS] = "KEY_SOS",
+ // [KEY_NAV_CHART] = "KEY_NAV_CHART",
+ // [KEY_FISHING_CHART] = "KEY_FISHING_CHART",
+ // [KEY_SINGLE_RANGE_RADAR] = "KEY_SINGLE_RANGE_RADAR",
+ // [KEY_DUAL_RANGE_RADAR] = "KEY_DUAL_RANGE_RADAR",
+ // [KEY_RADAR_OVERLAY] = "KEY_RADAR_OVERLAY",
+ // [KEY_TRADITIONAL_SONAR] = "KEY_TRADITIONAL_SONAR",
+ // [KEY_CLEARVU_SONAR] = "KEY_CLEARVU_SONAR",
+ // [KEY_SIDEVU_SONAR] = "KEY_SIDEVU_SONAR",
+ // [KEY_NAV_INFO] = "KEY_NAV_INFO",
+ // [KEY_BRIGHTNESS_MENU] = "KEY_BRIGHTNESS_MENU",
+ [KEY_MACRO1] = "KEY_MACRO1",
+ [KEY_MACRO2] = "KEY_MACRO2",
+ [KEY_MACRO3] = "KEY_MACRO3",
+ [KEY_MACRO4] = "KEY_MACRO4",
+ [KEY_MACRO5] = "KEY_MACRO5",
+ [KEY_MACRO6] = "KEY_MACRO6",
+ [KEY_MACRO7] = "KEY_MACRO7",
+ [KEY_MACRO8] = "KEY_MACRO8",
+ [KEY_MACRO9] = "KEY_MACRO9",
+ [KEY_MACRO10] = "KEY_MACRO10",
+ [KEY_MACRO11] = "KEY_MACRO11",
+ [KEY_MACRO12] = "KEY_MACRO12",
+ [KEY_MACRO13] = "KEY_MACRO13",
+ [KEY_MACRO14] = "KEY_MACRO14",
+ [KEY_MACRO15] = "KEY_MACRO15",
+ [KEY_MACRO16] = "KEY_MACRO16",
+ [KEY_MACRO17] = "KEY_MACRO17",
+ [KEY_MACRO18] = "KEY_MACRO18",
+ [KEY_MACRO19] = "KEY_MACRO19",
+ [KEY_MACRO20] = "KEY_MACRO20",
+ [KEY_MACRO21] = "KEY_MACRO21",
+ [KEY_MACRO22] = "KEY_MACRO22",
+ [KEY_MACRO23] = "KEY_MACRO23",
+ [KEY_MACRO24] = "KEY_MACRO24",
+ [KEY_MACRO25] = "KEY_MACRO25",
+ [KEY_MACRO26] = "KEY_MACRO26",
+ [KEY_MACRO27] = "KEY_MACRO27",
+ [KEY_MACRO28] = "KEY_MACRO28",
+ [KEY_MACRO29] = "KEY_MACRO29",
+ [KEY_MACRO30] = "KEY_MACRO30",
+ [KEY_MACRO_RECORD_START] = "KEY_MACRO_RECORD_START",
+ [KEY_MACRO_RECORD_STOP] = "KEY_MACRO_RECORD_STOP",
+ [KEY_MACRO_PRESET_CYCLE] = "KEY_MACRO_PRESET_CYCLE",
+ [KEY_MACRO_PRESET1] = "KEY_MACRO_PRESET1",
+ [KEY_MACRO_PRESET2] = "KEY_MACRO_PRESET2",
+ [KEY_MACRO_PRESET3] = "KEY_MACRO_PRESET3",
+ [KEY_KBD_LCD_MENU1] = "KEY_KBD_LCD_MENU1",
+ [KEY_KBD_LCD_MENU2] = "KEY_KBD_LCD_MENU2",
+ [KEY_KBD_LCD_MENU3] = "KEY_KBD_LCD_MENU3",
+ [KEY_KBD_LCD_MENU4] = "KEY_KBD_LCD_MENU4",
+ [KEY_KBD_LCD_MENU5] = "KEY_KBD_LCD_MENU5",
+ [KEY_MAX] = "KEY_MAX",
+ [BTN_0] = "BTN_0",
+ [BTN_1] = "BTN_1",
+ [BTN_2] = "BTN_2",
+ [BTN_3] = "BTN_3",
+ [BTN_4] = "BTN_4",
+ [BTN_5] = "BTN_5",
+ [BTN_6] = "BTN_6",
+ [BTN_7] = "BTN_7",
+ [BTN_8] = "BTN_8",
+ [BTN_9] = "BTN_9",
+ [BTN_LEFT] = "BTN_LEFT",
+ [BTN_RIGHT] = "BTN_RIGHT",
+ [BTN_MIDDLE] = "BTN_MIDDLE",
+ [BTN_SIDE] = "BTN_SIDE",
+ [BTN_EXTRA] = "BTN_EXTRA",
+ [BTN_FORWARD] = "BTN_FORWARD",
+ [BTN_BACK] = "BTN_BACK",
+ [BTN_TASK] = "BTN_TASK",
+ [BTN_TRIGGER] = "BTN_TRIGGER",
+ [BTN_THUMB] = "BTN_THUMB",
+ [BTN_THUMB2] = "BTN_THUMB2",
+ [BTN_TOP] = "BTN_TOP",
+ [BTN_TOP2] = "BTN_TOP2",
+ [BTN_PINKIE] = "BTN_PINKIE",
+ [BTN_BASE] = "BTN_BASE",
+ [BTN_BASE2] = "BTN_BASE2",
+ [BTN_BASE3] = "BTN_BASE3",
+ [BTN_BASE4] = "BTN_BASE4",
+ [BTN_BASE5] = "BTN_BASE5",
+ [BTN_BASE6] = "BTN_BASE6",
+ [BTN_DEAD] = "BTN_DEAD",
+ [BTN_SOUTH] = "BTN_SOUTH",
+ [BTN_EAST] = "BTN_EAST",
+ [BTN_C] = "BTN_C",
+ [BTN_NORTH] = "BTN_NORTH",
+ [BTN_WEST] = "BTN_WEST",
+ [BTN_Z] = "BTN_Z",
+ [BTN_TL] = "BTN_TL",
+ [BTN_TR] = "BTN_TR",
+ [BTN_TL2] = "BTN_TL2",
+ [BTN_TR2] = "BTN_TR2",
+ [BTN_SELECT] = "BTN_SELECT",
+ [BTN_START] = "BTN_START",
+ [BTN_MODE] = "BTN_MODE",
+ [BTN_THUMBL] = "BTN_THUMBL",
+ [BTN_THUMBR] = "BTN_THUMBR",
+ [BTN_TOOL_PEN] = "BTN_TOOL_PEN",
+ [BTN_TOOL_RUBBER] = "BTN_TOOL_RUBBER",
+ [BTN_TOOL_BRUSH] = "BTN_TOOL_BRUSH",
+ [BTN_TOOL_PENCIL] = "BTN_TOOL_PENCIL",
+ [BTN_TOOL_AIRBRUSH] = "BTN_TOOL_AIRBRUSH",
+ [BTN_TOOL_FINGER] = "BTN_TOOL_FINGER",
+ [BTN_TOOL_MOUSE] = "BTN_TOOL_MOUSE",
+ [BTN_TOOL_LENS] = "BTN_TOOL_LENS",
+ [BTN_TOOL_QUINTTAP] = "BTN_TOOL_QUINTTAP",
+ [BTN_STYLUS3] = "BTN_STYLUS3",
+ [BTN_TOUCH] = "BTN_TOUCH",
+ [BTN_STYLUS] = "BTN_STYLUS",
+ [BTN_STYLUS2] = "BTN_STYLUS2",
+ [BTN_TOOL_DOUBLETAP] = "BTN_TOOL_DOUBLETAP",
+ [BTN_TOOL_TRIPLETAP] = "BTN_TOOL_TRIPLETAP",
+ [BTN_TOOL_QUADTAP] = "BTN_TOOL_QUADTAP",
+ [BTN_GEAR_DOWN] = "BTN_GEAR_DOWN",
+ [BTN_GEAR_UP] = "BTN_GEAR_UP",
+ [BTN_DPAD_UP] = "BTN_DPAD_UP",
+ [BTN_DPAD_DOWN] = "BTN_DPAD_DOWN",
+ [BTN_DPAD_LEFT] = "BTN_DPAD_LEFT",
+ [BTN_DPAD_RIGHT] = "BTN_DPAD_RIGHT",
+ [BTN_TRIGGER_HAPPY1] = "BTN_TRIGGER_HAPPY1",
+ [BTN_TRIGGER_HAPPY2] = "BTN_TRIGGER_HAPPY2",
+ [BTN_TRIGGER_HAPPY3] = "BTN_TRIGGER_HAPPY3",
+ [BTN_TRIGGER_HAPPY4] = "BTN_TRIGGER_HAPPY4",
+ [BTN_TRIGGER_HAPPY5] = "BTN_TRIGGER_HAPPY5",
+ [BTN_TRIGGER_HAPPY6] = "BTN_TRIGGER_HAPPY6",
+ [BTN_TRIGGER_HAPPY7] = "BTN_TRIGGER_HAPPY7",
+ [BTN_TRIGGER_HAPPY8] = "BTN_TRIGGER_HAPPY8",
+ [BTN_TRIGGER_HAPPY9] = "BTN_TRIGGER_HAPPY9",
+ [BTN_TRIGGER_HAPPY10] = "BTN_TRIGGER_HAPPY10",
+ [BTN_TRIGGER_HAPPY11] = "BTN_TRIGGER_HAPPY11",
+ [BTN_TRIGGER_HAPPY12] = "BTN_TRIGGER_HAPPY12",
+ [BTN_TRIGGER_HAPPY13] = "BTN_TRIGGER_HAPPY13",
+ [BTN_TRIGGER_HAPPY14] = "BTN_TRIGGER_HAPPY14",
+ [BTN_TRIGGER_HAPPY15] = "BTN_TRIGGER_HAPPY15",
+ [BTN_TRIGGER_HAPPY16] = "BTN_TRIGGER_HAPPY16",
+ [BTN_TRIGGER_HAPPY17] = "BTN_TRIGGER_HAPPY17",
+ [BTN_TRIGGER_HAPPY18] = "BTN_TRIGGER_HAPPY18",
+ [BTN_TRIGGER_HAPPY19] = "BTN_TRIGGER_HAPPY19",
+ [BTN_TRIGGER_HAPPY20] = "BTN_TRIGGER_HAPPY20",
+ [BTN_TRIGGER_HAPPY21] = "BTN_TRIGGER_HAPPY21",
+ [BTN_TRIGGER_HAPPY22] = "BTN_TRIGGER_HAPPY22",
+ [BTN_TRIGGER_HAPPY23] = "BTN_TRIGGER_HAPPY23",
+ [BTN_TRIGGER_HAPPY24] = "BTN_TRIGGER_HAPPY24",
+ [BTN_TRIGGER_HAPPY25] = "BTN_TRIGGER_HAPPY25",
+ [BTN_TRIGGER_HAPPY26] = "BTN_TRIGGER_HAPPY26",
+ [BTN_TRIGGER_HAPPY27] = "BTN_TRIGGER_HAPPY27",
+ [BTN_TRIGGER_HAPPY28] = "BTN_TRIGGER_HAPPY28",
+ [BTN_TRIGGER_HAPPY29] = "BTN_TRIGGER_HAPPY29",
+ [BTN_TRIGGER_HAPPY30] = "BTN_TRIGGER_HAPPY30",
+ [BTN_TRIGGER_HAPPY31] = "BTN_TRIGGER_HAPPY31",
+ [BTN_TRIGGER_HAPPY32] = "BTN_TRIGGER_HAPPY32",
+ [BTN_TRIGGER_HAPPY33] = "BTN_TRIGGER_HAPPY33",
+ [BTN_TRIGGER_HAPPY34] = "BTN_TRIGGER_HAPPY34",
+ [BTN_TRIGGER_HAPPY35] = "BTN_TRIGGER_HAPPY35",
+ [BTN_TRIGGER_HAPPY36] = "BTN_TRIGGER_HAPPY36",
+ [BTN_TRIGGER_HAPPY37] = "BTN_TRIGGER_HAPPY37",
+ [BTN_TRIGGER_HAPPY38] = "BTN_TRIGGER_HAPPY38",
+ [BTN_TRIGGER_HAPPY39] = "BTN_TRIGGER_HAPPY39",
+ [BTN_TRIGGER_HAPPY40] = "BTN_TRIGGER_HAPPY40",
+};
+
+static const char * const led_map[LED_MAX + 1] = {
+ [LED_NUML] = "LED_NUML",
+ [LED_CAPSL] = "LED_CAPSL",
+ [LED_SCROLLL] = "LED_SCROLLL",
+ [LED_COMPOSE] = "LED_COMPOSE",
+ [LED_KANA] = "LED_KANA",
+ [LED_SLEEP] = "LED_SLEEP",
+ [LED_SUSPEND] = "LED_SUSPEND",
+ [LED_MUTE] = "LED_MUTE",
+ [LED_MISC] = "LED_MISC",
+ [LED_MAIL] = "LED_MAIL",
+ [LED_CHARGING] = "LED_CHARGING",
+ [LED_MAX] = "LED_MAX",
+};
+
+static const char * const snd_map[SND_MAX + 1] = {
+ [SND_CLICK] = "SND_CLICK",
+ [SND_BELL] = "SND_BELL",
+ [SND_TONE] = "SND_TONE",
+ [SND_MAX] = "SND_MAX",
+};
+
+static const char * const msc_map[MSC_MAX + 1] = {
+ [MSC_SERIAL] = "MSC_SERIAL",
+ [MSC_PULSELED] = "MSC_PULSELED",
+ [MSC_GESTURE] = "MSC_GESTURE",
+ [MSC_RAW] = "MSC_RAW",
+ [MSC_SCAN] = "MSC_SCAN",
+ [MSC_TIMESTAMP] = "MSC_TIMESTAMP",
+ [MSC_MAX] = "MSC_MAX",
+};
+
+static const char * const sw_map[SW_MAX + 1] = {
+ [SW_LID] = "SW_LID",
+ [SW_TABLET_MODE] = "SW_TABLET_MODE",
+ [SW_HEADPHONE_INSERT] = "SW_HEADPHONE_INSERT",
+ [SW_RFKILL_ALL] = "SW_RFKILL_ALL",
+ [SW_MICROPHONE_INSERT] = "SW_MICROPHONE_INSERT",
+ [SW_DOCK] = "SW_DOCK",
+ [SW_LINEOUT_INSERT] = "SW_LINEOUT_INSERT",
+ [SW_JACK_PHYSICAL_INSERT] = "SW_JACK_PHYSICAL_INSERT",
+ [SW_VIDEOOUT_INSERT] = "SW_VIDEOOUT_INSERT",
+ [SW_CAMERA_LENS_COVER] = "SW_CAMERA_LENS_COVER",
+ [SW_KEYPAD_SLIDE] = "SW_KEYPAD_SLIDE",
+ [SW_FRONT_PROXIMITY] = "SW_FRONT_PROXIMITY",
+ [SW_ROTATE_LOCK] = "SW_ROTATE_LOCK",
+ [SW_LINEIN_INSERT] = "SW_LINEIN_INSERT",
+ [SW_MUTE_DEVICE] = "SW_MUTE_DEVICE",
+ [SW_PEN_INSERTED] = "SW_PEN_INSERTED",
+ [SW_MACHINE_COVER] = "SW_MACHINE_COVER",
+};
+
+static const char * const ff_map[FF_MAX + 1] = {
+ [FF_STATUS_STOPPED] = "FF_STATUS_STOPPED",
+ [FF_STATUS_MAX] = "FF_STATUS_MAX",
+ [FF_RUMBLE] = "FF_RUMBLE",
+ [FF_PERIODIC] = "FF_PERIODIC",
+ [FF_CONSTANT] = "FF_CONSTANT",
+ [FF_SPRING] = "FF_SPRING",
+ [FF_FRICTION] = "FF_FRICTION",
+ [FF_DAMPER] = "FF_DAMPER",
+ [FF_INERTIA] = "FF_INERTIA",
+ [FF_RAMP] = "FF_RAMP",
+ [FF_SQUARE] = "FF_SQUARE",
+ [FF_TRIANGLE] = "FF_TRIANGLE",
+ [FF_SINE] = "FF_SINE",
+ [FF_SAW_UP] = "FF_SAW_UP",
+ [FF_SAW_DOWN] = "FF_SAW_DOWN",
+ [FF_CUSTOM] = "FF_CUSTOM",
+ [FF_GAIN] = "FF_GAIN",
+ [FF_AUTOCENTER] = "FF_AUTOCENTER",
+ [FF_MAX] = "FF_MAX",
+};
+
+static const char * const syn_map[SYN_MAX + 1] = {
+ [SYN_REPORT] = "SYN_REPORT",
+ [SYN_CONFIG] = "SYN_CONFIG",
+ [SYN_MT_REPORT] = "SYN_MT_REPORT",
+ [SYN_DROPPED] = "SYN_DROPPED",
+ [SYN_MAX] = "SYN_MAX",
+};
+
+static const char * const rep_map[REP_MAX + 1] = {
+ [REP_DELAY] = "REP_DELAY",
+ [REP_PERIOD] = "REP_PERIOD",
+};
+
+static const char * const input_prop_map[INPUT_PROP_MAX + 1] = {
+ [INPUT_PROP_POINTER] = "INPUT_PROP_POINTER",
+ [INPUT_PROP_DIRECT] = "INPUT_PROP_DIRECT",
+ [INPUT_PROP_BUTTONPAD] = "INPUT_PROP_BUTTONPAD",
+ [INPUT_PROP_SEMI_MT] = "INPUT_PROP_SEMI_MT",
+ [INPUT_PROP_TOPBUTTONPAD] = "INPUT_PROP_TOPBUTTONPAD",
+ [INPUT_PROP_POINTING_STICK] = "INPUT_PROP_POINTING_STICK",
+ [INPUT_PROP_ACCELEROMETER] = "INPUT_PROP_ACCELEROMETER",
+ [INPUT_PROP_MAX] = "INPUT_PROP_MAX",
+};
+
+static const char * const mt_tool_map[MT_TOOL_MAX + 1] = {
+ [MT_TOOL_FINGER] = "MT_TOOL_FINGER",
+ [MT_TOOL_PEN] = "MT_TOOL_PEN",
+ [MT_TOOL_PALM] = "MT_TOOL_PALM",
+ [MT_TOOL_DIAL] = "MT_TOOL_DIAL",
+ [MT_TOOL_MAX] = "MT_TOOL_MAX",
+};
+
+static const char * const * const event_type_map[EV_MAX + 1] = {
+ [EV_REL] = rel_map,
+ [EV_ABS] = abs_map,
+ [EV_KEY] = key_map,
+ [EV_LED] = led_map,
+ [EV_SND] = snd_map,
+ [EV_MSC] = msc_map,
+ [EV_SW] = sw_map,
+ [EV_FF] = ff_map,
+ [EV_SYN] = syn_map,
+ [EV_REP] = rep_map,
+};
+
+#if __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Winitializer-overrides"
+#elif __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Woverride-init"
+#endif
+static const int ev_max[EV_MAX + 1] = {
+ SYN_MAX,
+ KEY_MAX,
+ REL_MAX,
+ ABS_MAX,
+ MSC_MAX,
+ SW_MAX,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ LED_MAX,
+ SND_MAX,
+ -1,
+ REP_MAX,
+ FF_MAX,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+};
+#if __clang__
+#pragma clang diagnostic pop /* "-Winitializer-overrides" */
+#elif __GNUC__
+#pragma GCC diagnostic pop /* "-Woverride-init" */
+#endif
+
+struct name_entry {
+ const char *name;
+ unsigned int value;
+};
+
+static const struct name_entry tool_type_names[] = {
+ { .name = "MT_TOOL_DIAL", .value = MT_TOOL_DIAL },
+ { .name = "MT_TOOL_FINGER", .value = MT_TOOL_FINGER },
+ { .name = "MT_TOOL_MAX", .value = MT_TOOL_MAX },
+ { .name = "MT_TOOL_PALM", .value = MT_TOOL_PALM },
+ { .name = "MT_TOOL_PEN", .value = MT_TOOL_PEN },
+};
+
+static const struct name_entry ev_names[] = {
+ { .name = "EV_ABS", .value = EV_ABS },
+ { .name = "EV_FF", .value = EV_FF },
+ { .name = "EV_FF_STATUS", .value = EV_FF_STATUS },
+ { .name = "EV_KEY", .value = EV_KEY },
+ { .name = "EV_LED", .value = EV_LED },
+ { .name = "EV_MAX", .value = EV_MAX },
+ { .name = "EV_MSC", .value = EV_MSC },
+ { .name = "EV_PWR", .value = EV_PWR },
+ { .name = "EV_REL", .value = EV_REL },
+ { .name = "EV_REP", .value = EV_REP },
+ { .name = "EV_SND", .value = EV_SND },
+ { .name = "EV_SW", .value = EV_SW },
+ { .name = "EV_SYN", .value = EV_SYN },
+};
+
+static const struct name_entry code_names[] = {
+ { .name = "ABS_BRAKE", .value = ABS_BRAKE },
+ { .name = "ABS_DISTANCE", .value = ABS_DISTANCE },
+ { .name = "ABS_GAS", .value = ABS_GAS },
+ { .name = "ABS_HAT0X", .value = ABS_HAT0X },
+ { .name = "ABS_HAT0Y", .value = ABS_HAT0Y },
+ { .name = "ABS_HAT1X", .value = ABS_HAT1X },
+ { .name = "ABS_HAT1Y", .value = ABS_HAT1Y },
+ { .name = "ABS_HAT2X", .value = ABS_HAT2X },
+ { .name = "ABS_HAT2Y", .value = ABS_HAT2Y },
+ { .name = "ABS_HAT3X", .value = ABS_HAT3X },
+ { .name = "ABS_HAT3Y", .value = ABS_HAT3Y },
+ { .name = "ABS_MAX", .value = ABS_MAX },
+ { .name = "ABS_MISC", .value = ABS_MISC },
+ { .name = "ABS_MT_BLOB_ID", .value = ABS_MT_BLOB_ID },
+ { .name = "ABS_MT_DISTANCE", .value = ABS_MT_DISTANCE },
+ { .name = "ABS_MT_ORIENTATION", .value = ABS_MT_ORIENTATION },
+ { .name = "ABS_MT_POSITION_X", .value = ABS_MT_POSITION_X },
+ { .name = "ABS_MT_POSITION_Y", .value = ABS_MT_POSITION_Y },
+ { .name = "ABS_MT_PRESSURE", .value = ABS_MT_PRESSURE },
+ { .name = "ABS_MT_SLOT", .value = ABS_MT_SLOT },
+ { .name = "ABS_MT_TOOL_TYPE", .value = ABS_MT_TOOL_TYPE },
+ { .name = "ABS_MT_TOOL_X", .value = ABS_MT_TOOL_X },
+ { .name = "ABS_MT_TOOL_Y", .value = ABS_MT_TOOL_Y },
+ { .name = "ABS_MT_TOUCH_MAJOR", .value = ABS_MT_TOUCH_MAJOR },
+ { .name = "ABS_MT_TOUCH_MINOR", .value = ABS_MT_TOUCH_MINOR },
+ { .name = "ABS_MT_TRACKING_ID", .value = ABS_MT_TRACKING_ID },
+ { .name = "ABS_MT_WIDTH_MAJOR", .value = ABS_MT_WIDTH_MAJOR },
+ { .name = "ABS_MT_WIDTH_MINOR", .value = ABS_MT_WIDTH_MINOR },
+ { .name = "ABS_PRESSURE", .value = ABS_PRESSURE },
+ // { .name = "ABS_PROFILE", .value = ABS_PROFILE },
+ { .name = "ABS_RESERVED", .value = ABS_RESERVED },
+ { .name = "ABS_RUDDER", .value = ABS_RUDDER },
+ { .name = "ABS_RX", .value = ABS_RX },
+ { .name = "ABS_RY", .value = ABS_RY },
+ { .name = "ABS_RZ", .value = ABS_RZ },
+ { .name = "ABS_THROTTLE", .value = ABS_THROTTLE },
+ { .name = "ABS_TILT_X", .value = ABS_TILT_X },
+ { .name = "ABS_TILT_Y", .value = ABS_TILT_Y },
+ { .name = "ABS_TOOL_WIDTH", .value = ABS_TOOL_WIDTH },
+ { .name = "ABS_VOLUME", .value = ABS_VOLUME },
+ { .name = "ABS_WHEEL", .value = ABS_WHEEL },
+ { .name = "ABS_X", .value = ABS_X },
+ { .name = "ABS_Y", .value = ABS_Y },
+ { .name = "ABS_Z", .value = ABS_Z },
+ { .name = "BTN_0", .value = BTN_0 },
+ { .name = "BTN_1", .value = BTN_1 },
+ { .name = "BTN_2", .value = BTN_2 },
+ { .name = "BTN_3", .value = BTN_3 },
+ { .name = "BTN_4", .value = BTN_4 },
+ { .name = "BTN_5", .value = BTN_5 },
+ { .name = "BTN_6", .value = BTN_6 },
+ { .name = "BTN_7", .value = BTN_7 },
+ { .name = "BTN_8", .value = BTN_8 },
+ { .name = "BTN_9", .value = BTN_9 },
+ { .name = "BTN_A", .value = BTN_A },
+ { .name = "BTN_B", .value = BTN_B },
+ { .name = "BTN_BACK", .value = BTN_BACK },
+ { .name = "BTN_BASE", .value = BTN_BASE },
+ { .name = "BTN_BASE2", .value = BTN_BASE2 },
+ { .name = "BTN_BASE3", .value = BTN_BASE3 },
+ { .name = "BTN_BASE4", .value = BTN_BASE4 },
+ { .name = "BTN_BASE5", .value = BTN_BASE5 },
+ { .name = "BTN_BASE6", .value = BTN_BASE6 },
+ { .name = "BTN_C", .value = BTN_C },
+ { .name = "BTN_DEAD", .value = BTN_DEAD },
+ { .name = "BTN_DPAD_DOWN", .value = BTN_DPAD_DOWN },
+ { .name = "BTN_DPAD_LEFT", .value = BTN_DPAD_LEFT },
+ { .name = "BTN_DPAD_RIGHT", .value = BTN_DPAD_RIGHT },
+ { .name = "BTN_DPAD_UP", .value = BTN_DPAD_UP },
+ { .name = "BTN_EAST", .value = BTN_EAST },
+ { .name = "BTN_EXTRA", .value = BTN_EXTRA },
+ { .name = "BTN_FORWARD", .value = BTN_FORWARD },
+ { .name = "BTN_GEAR_DOWN", .value = BTN_GEAR_DOWN },
+ { .name = "BTN_GEAR_UP", .value = BTN_GEAR_UP },
+ { .name = "BTN_LEFT", .value = BTN_LEFT },
+ { .name = "BTN_MIDDLE", .value = BTN_MIDDLE },
+ { .name = "BTN_MODE", .value = BTN_MODE },
+ { .name = "BTN_NORTH", .value = BTN_NORTH },
+ { .name = "BTN_PINKIE", .value = BTN_PINKIE },
+ { .name = "BTN_RIGHT", .value = BTN_RIGHT },
+ { .name = "BTN_SELECT", .value = BTN_SELECT },
+ { .name = "BTN_SIDE", .value = BTN_SIDE },
+ { .name = "BTN_SOUTH", .value = BTN_SOUTH },
+ { .name = "BTN_START", .value = BTN_START },
+ { .name = "BTN_STYLUS", .value = BTN_STYLUS },
+ { .name = "BTN_STYLUS2", .value = BTN_STYLUS2 },
+ { .name = "BTN_STYLUS3", .value = BTN_STYLUS3 },
+ { .name = "BTN_TASK", .value = BTN_TASK },
+ { .name = "BTN_THUMB", .value = BTN_THUMB },
+ { .name = "BTN_THUMB2", .value = BTN_THUMB2 },
+ { .name = "BTN_THUMBL", .value = BTN_THUMBL },
+ { .name = "BTN_THUMBR", .value = BTN_THUMBR },
+ { .name = "BTN_TL", .value = BTN_TL },
+ { .name = "BTN_TL2", .value = BTN_TL2 },
+ { .name = "BTN_TOOL_AIRBRUSH", .value = BTN_TOOL_AIRBRUSH },
+ { .name = "BTN_TOOL_BRUSH", .value = BTN_TOOL_BRUSH },
+ { .name = "BTN_TOOL_DOUBLETAP", .value = BTN_TOOL_DOUBLETAP },
+ { .name = "BTN_TOOL_FINGER", .value = BTN_TOOL_FINGER },
+ { .name = "BTN_TOOL_LENS", .value = BTN_TOOL_LENS },
+ { .name = "BTN_TOOL_MOUSE", .value = BTN_TOOL_MOUSE },
+ { .name = "BTN_TOOL_PEN", .value = BTN_TOOL_PEN },
+ { .name = "BTN_TOOL_PENCIL", .value = BTN_TOOL_PENCIL },
+ { .name = "BTN_TOOL_QUADTAP", .value = BTN_TOOL_QUADTAP },
+ { .name = "BTN_TOOL_QUINTTAP", .value = BTN_TOOL_QUINTTAP },
+ { .name = "BTN_TOOL_RUBBER", .value = BTN_TOOL_RUBBER },
+ { .name = "BTN_TOOL_TRIPLETAP", .value = BTN_TOOL_TRIPLETAP },
+ { .name = "BTN_TOP", .value = BTN_TOP },
+ { .name = "BTN_TOP2", .value = BTN_TOP2 },
+ { .name = "BTN_TOUCH", .value = BTN_TOUCH },
+ { .name = "BTN_TR", .value = BTN_TR },
+ { .name = "BTN_TR2", .value = BTN_TR2 },
+ { .name = "BTN_TRIGGER", .value = BTN_TRIGGER },
+ { .name = "BTN_TRIGGER_HAPPY1", .value = BTN_TRIGGER_HAPPY1 },
+ { .name = "BTN_TRIGGER_HAPPY10", .value = BTN_TRIGGER_HAPPY10 },
+ { .name = "BTN_TRIGGER_HAPPY11", .value = BTN_TRIGGER_HAPPY11 },
+ { .name = "BTN_TRIGGER_HAPPY12", .value = BTN_TRIGGER_HAPPY12 },
+ { .name = "BTN_TRIGGER_HAPPY13", .value = BTN_TRIGGER_HAPPY13 },
+ { .name = "BTN_TRIGGER_HAPPY14", .value = BTN_TRIGGER_HAPPY14 },
+ { .name = "BTN_TRIGGER_HAPPY15", .value = BTN_TRIGGER_HAPPY15 },
+ { .name = "BTN_TRIGGER_HAPPY16", .value = BTN_TRIGGER_HAPPY16 },
+ { .name = "BTN_TRIGGER_HAPPY17", .value = BTN_TRIGGER_HAPPY17 },
+ { .name = "BTN_TRIGGER_HAPPY18", .value = BTN_TRIGGER_HAPPY18 },
+ { .name = "BTN_TRIGGER_HAPPY19", .value = BTN_TRIGGER_HAPPY19 },
+ { .name = "BTN_TRIGGER_HAPPY2", .value = BTN_TRIGGER_HAPPY2 },
+ { .name = "BTN_TRIGGER_HAPPY20", .value = BTN_TRIGGER_HAPPY20 },
+ { .name = "BTN_TRIGGER_HAPPY21", .value = BTN_TRIGGER_HAPPY21 },
+ { .name = "BTN_TRIGGER_HAPPY22", .value = BTN_TRIGGER_HAPPY22 },
+ { .name = "BTN_TRIGGER_HAPPY23", .value = BTN_TRIGGER_HAPPY23 },
+ { .name = "BTN_TRIGGER_HAPPY24", .value = BTN_TRIGGER_HAPPY24 },
+ { .name = "BTN_TRIGGER_HAPPY25", .value = BTN_TRIGGER_HAPPY25 },
+ { .name = "BTN_TRIGGER_HAPPY26", .value = BTN_TRIGGER_HAPPY26 },
+ { .name = "BTN_TRIGGER_HAPPY27", .value = BTN_TRIGGER_HAPPY27 },
+ { .name = "BTN_TRIGGER_HAPPY28", .value = BTN_TRIGGER_HAPPY28 },
+ { .name = "BTN_TRIGGER_HAPPY29", .value = BTN_TRIGGER_HAPPY29 },
+ { .name = "BTN_TRIGGER_HAPPY3", .value = BTN_TRIGGER_HAPPY3 },
+ { .name = "BTN_TRIGGER_HAPPY30", .value = BTN_TRIGGER_HAPPY30 },
+ { .name = "BTN_TRIGGER_HAPPY31", .value = BTN_TRIGGER_HAPPY31 },
+ { .name = "BTN_TRIGGER_HAPPY32", .value = BTN_TRIGGER_HAPPY32 },
+ { .name = "BTN_TRIGGER_HAPPY33", .value = BTN_TRIGGER_HAPPY33 },
+ { .name = "BTN_TRIGGER_HAPPY34", .value = BTN_TRIGGER_HAPPY34 },
+ { .name = "BTN_TRIGGER_HAPPY35", .value = BTN_TRIGGER_HAPPY35 },
+ { .name = "BTN_TRIGGER_HAPPY36", .value = BTN_TRIGGER_HAPPY36 },
+ { .name = "BTN_TRIGGER_HAPPY37", .value = BTN_TRIGGER_HAPPY37 },
+ { .name = "BTN_TRIGGER_HAPPY38", .value = BTN_TRIGGER_HAPPY38 },
+ { .name = "BTN_TRIGGER_HAPPY39", .value = BTN_TRIGGER_HAPPY39 },
+ { .name = "BTN_TRIGGER_HAPPY4", .value = BTN_TRIGGER_HAPPY4 },
+ { .name = "BTN_TRIGGER_HAPPY40", .value = BTN_TRIGGER_HAPPY40 },
+ { .name = "BTN_TRIGGER_HAPPY5", .value = BTN_TRIGGER_HAPPY5 },
+ { .name = "BTN_TRIGGER_HAPPY6", .value = BTN_TRIGGER_HAPPY6 },
+ { .name = "BTN_TRIGGER_HAPPY7", .value = BTN_TRIGGER_HAPPY7 },
+ { .name = "BTN_TRIGGER_HAPPY8", .value = BTN_TRIGGER_HAPPY8 },
+ { .name = "BTN_TRIGGER_HAPPY9", .value = BTN_TRIGGER_HAPPY9 },
+ { .name = "BTN_WEST", .value = BTN_WEST },
+ { .name = "BTN_X", .value = BTN_X },
+ { .name = "BTN_Y", .value = BTN_Y },
+ { .name = "BTN_Z", .value = BTN_Z },
+ { .name = "FF_AUTOCENTER", .value = FF_AUTOCENTER },
+ { .name = "FF_CONSTANT", .value = FF_CONSTANT },
+ { .name = "FF_CUSTOM", .value = FF_CUSTOM },
+ { .name = "FF_DAMPER", .value = FF_DAMPER },
+ { .name = "FF_FRICTION", .value = FF_FRICTION },
+ { .name = "FF_GAIN", .value = FF_GAIN },
+ { .name = "FF_INERTIA", .value = FF_INERTIA },
+ { .name = "FF_MAX", .value = FF_MAX },
+ { .name = "FF_PERIODIC", .value = FF_PERIODIC },
+ { .name = "FF_RAMP", .value = FF_RAMP },
+ { .name = "FF_RUMBLE", .value = FF_RUMBLE },
+ { .name = "FF_SAW_DOWN", .value = FF_SAW_DOWN },
+ { .name = "FF_SAW_UP", .value = FF_SAW_UP },
+ { .name = "FF_SINE", .value = FF_SINE },
+ { .name = "FF_SPRING", .value = FF_SPRING },
+ { .name = "FF_SQUARE", .value = FF_SQUARE },
+ { .name = "FF_STATUS_MAX", .value = FF_STATUS_MAX },
+ { .name = "FF_STATUS_STOPPED", .value = FF_STATUS_STOPPED },
+ { .name = "FF_TRIANGLE", .value = FF_TRIANGLE },
+ { .name = "KEY_0", .value = KEY_0 },
+ { .name = "KEY_1", .value = KEY_1 },
+ { .name = "KEY_102ND", .value = KEY_102ND },
+ { .name = "KEY_10CHANNELSDOWN", .value = KEY_10CHANNELSDOWN },
+ { .name = "KEY_10CHANNELSUP", .value = KEY_10CHANNELSUP },
+ { .name = "KEY_2", .value = KEY_2 },
+ { .name = "KEY_3", .value = KEY_3 },
+ { .name = "KEY_3D_MODE", .value = KEY_3D_MODE },
+ { .name = "KEY_4", .value = KEY_4 },
+ { .name = "KEY_5", .value = KEY_5 },
+ { .name = "KEY_6", .value = KEY_6 },
+ { .name = "KEY_7", .value = KEY_7 },
+ { .name = "KEY_8", .value = KEY_8 },
+ { .name = "KEY_9", .value = KEY_9 },
+ { .name = "KEY_A", .value = KEY_A },
+ { .name = "KEY_AB", .value = KEY_AB },
+ { .name = "KEY_ADDRESSBOOK", .value = KEY_ADDRESSBOOK },
+ { .name = "KEY_AGAIN", .value = KEY_AGAIN },
+ // { .name = "KEY_ALL_APPLICATIONS", .value = KEY_ALL_APPLICATIONS },
+ { .name = "KEY_ALS_TOGGLE", .value = KEY_ALS_TOGGLE },
+ { .name = "KEY_ALTERASE", .value = KEY_ALTERASE },
+ { .name = "KEY_ANGLE", .value = KEY_ANGLE },
+ { .name = "KEY_APOSTROPHE", .value = KEY_APOSTROPHE },
+ { .name = "KEY_APPSELECT", .value = KEY_APPSELECT },
+ { .name = "KEY_ARCHIVE", .value = KEY_ARCHIVE },
+ { .name = "KEY_ASPECT_RATIO", .value = KEY_ASPECT_RATIO },
+ { .name = "KEY_ASSISTANT", .value = KEY_ASSISTANT },
+ { .name = "KEY_ATTENDANT_OFF", .value = KEY_ATTENDANT_OFF },
+ { .name = "KEY_ATTENDANT_ON", .value = KEY_ATTENDANT_ON },
+ { .name = "KEY_ATTENDANT_TOGGLE", .value = KEY_ATTENDANT_TOGGLE },
+ { .name = "KEY_AUDIO", .value = KEY_AUDIO },
+ { .name = "KEY_AUDIO_DESC", .value = KEY_AUDIO_DESC },
+ // { .name = "KEY_AUTOPILOT_ENGAGE_TOGGLE", .value = KEY_AUTOPILOT_ENGAGE_TOGGLE },
+ { .name = "KEY_AUX", .value = KEY_AUX },
+ { .name = "KEY_B", .value = KEY_B },
+ { .name = "KEY_BACK", .value = KEY_BACK },
+ { .name = "KEY_BACKSLASH", .value = KEY_BACKSLASH },
+ { .name = "KEY_BACKSPACE", .value = KEY_BACKSPACE },
+ { .name = "KEY_BASSBOOST", .value = KEY_BASSBOOST },
+ { .name = "KEY_BATTERY", .value = KEY_BATTERY },
+ { .name = "KEY_BLUE", .value = KEY_BLUE },
+ { .name = "KEY_BLUETOOTH", .value = KEY_BLUETOOTH },
+ { .name = "KEY_BOOKMARKS", .value = KEY_BOOKMARKS },
+ { .name = "KEY_BREAK", .value = KEY_BREAK },
+ { .name = "KEY_BRIGHTNESSDOWN", .value = KEY_BRIGHTNESSDOWN },
+ { .name = "KEY_BRIGHTNESSUP", .value = KEY_BRIGHTNESSUP },
+ { .name = "KEY_BRIGHTNESS_AUTO", .value = KEY_BRIGHTNESS_AUTO },
+ { .name = "KEY_BRIGHTNESS_CYCLE", .value = KEY_BRIGHTNESS_CYCLE },
+ { .name = "KEY_BRIGHTNESS_MAX", .value = KEY_BRIGHTNESS_MAX },
+ // { .name = "KEY_BRIGHTNESS_MENU", .value = KEY_BRIGHTNESS_MENU },
+ { .name = "KEY_BRIGHTNESS_MIN", .value = KEY_BRIGHTNESS_MIN },
+ { .name = "KEY_BRL_DOT1", .value = KEY_BRL_DOT1 },
+ { .name = "KEY_BRL_DOT10", .value = KEY_BRL_DOT10 },
+ { .name = "KEY_BRL_DOT2", .value = KEY_BRL_DOT2 },
+ { .name = "KEY_BRL_DOT3", .value = KEY_BRL_DOT3 },
+ { .name = "KEY_BRL_DOT4", .value = KEY_BRL_DOT4 },
+ { .name = "KEY_BRL_DOT5", .value = KEY_BRL_DOT5 },
+ { .name = "KEY_BRL_DOT6", .value = KEY_BRL_DOT6 },
+ { .name = "KEY_BRL_DOT7", .value = KEY_BRL_DOT7 },
+ { .name = "KEY_BRL_DOT8", .value = KEY_BRL_DOT8 },
+ { .name = "KEY_BRL_DOT9", .value = KEY_BRL_DOT9 },
+ { .name = "KEY_BUTTONCONFIG", .value = KEY_BUTTONCONFIG },
+ { .name = "KEY_C", .value = KEY_C },
+ { .name = "KEY_CALC", .value = KEY_CALC },
+ { .name = "KEY_CALENDAR", .value = KEY_CALENDAR },
+ { .name = "KEY_CAMERA", .value = KEY_CAMERA },
+ // { .name = "KEY_CAMERA_ACCESS_DISABLE", .value = KEY_CAMERA_ACCESS_DISABLE },
+ // { .name = "KEY_CAMERA_ACCESS_ENABLE", .value = KEY_CAMERA_ACCESS_ENABLE },
+ // { .name = "KEY_CAMERA_ACCESS_TOGGLE", .value = KEY_CAMERA_ACCESS_TOGGLE },
+ { .name = "KEY_CAMERA_DOWN", .value = KEY_CAMERA_DOWN },
+ { .name = "KEY_CAMERA_FOCUS", .value = KEY_CAMERA_FOCUS },
+ { .name = "KEY_CAMERA_LEFT", .value = KEY_CAMERA_LEFT },
+ { .name = "KEY_CAMERA_RIGHT", .value = KEY_CAMERA_RIGHT },
+ { .name = "KEY_CAMERA_UP", .value = KEY_CAMERA_UP },
+ { .name = "KEY_CAMERA_ZOOMIN", .value = KEY_CAMERA_ZOOMIN },
+ { .name = "KEY_CAMERA_ZOOMOUT", .value = KEY_CAMERA_ZOOMOUT },
+ { .name = "KEY_CANCEL", .value = KEY_CANCEL },
+ { .name = "KEY_CAPSLOCK", .value = KEY_CAPSLOCK },
+ { .name = "KEY_CD", .value = KEY_CD },
+ { .name = "KEY_CHANNEL", .value = KEY_CHANNEL },
+ { .name = "KEY_CHANNELDOWN", .value = KEY_CHANNELDOWN },
+ { .name = "KEY_CHANNELUP", .value = KEY_CHANNELUP },
+ { .name = "KEY_CHAT", .value = KEY_CHAT },
+ { .name = "KEY_CLEAR", .value = KEY_CLEAR },
+ // { .name = "KEY_CLEARVU_SONAR", .value = KEY_CLEARVU_SONAR },
+ { .name = "KEY_CLOSE", .value = KEY_CLOSE },
+ { .name = "KEY_CLOSECD", .value = KEY_CLOSECD },
+ { .name = "KEY_COFFEE", .value = KEY_COFFEE },
+ { .name = "KEY_COMMA", .value = KEY_COMMA },
+ { .name = "KEY_COMPOSE", .value = KEY_COMPOSE },
+ { .name = "KEY_COMPUTER", .value = KEY_COMPUTER },
+ { .name = "KEY_CONFIG", .value = KEY_CONFIG },
+ { .name = "KEY_CONNECT", .value = KEY_CONNECT },
+ { .name = "KEY_CONTEXT_MENU", .value = KEY_CONTEXT_MENU },
+ { .name = "KEY_CONTROLPANEL", .value = KEY_CONTROLPANEL },
+ { .name = "KEY_COPY", .value = KEY_COPY },
+ { .name = "KEY_CUT", .value = KEY_CUT },
+ { .name = "KEY_CYCLEWINDOWS", .value = KEY_CYCLEWINDOWS },
+ { .name = "KEY_D", .value = KEY_D },
+ { .name = "KEY_DATA", .value = KEY_DATA },
+ { .name = "KEY_DATABASE", .value = KEY_DATABASE },
+ { .name = "KEY_DELETE", .value = KEY_DELETE },
+ { .name = "KEY_DELETEFILE", .value = KEY_DELETEFILE },
+ { .name = "KEY_DEL_EOL", .value = KEY_DEL_EOL },
+ { .name = "KEY_DEL_EOS", .value = KEY_DEL_EOS },
+ { .name = "KEY_DEL_LINE", .value = KEY_DEL_LINE },
+ // { .name = "KEY_DICTATE", .value = KEY_DICTATE },
+ { .name = "KEY_DIGITS", .value = KEY_DIGITS },
+ { .name = "KEY_DIRECTORY", .value = KEY_DIRECTORY },
+ { .name = "KEY_DISPLAYTOGGLE", .value = KEY_DISPLAYTOGGLE },
+ { .name = "KEY_DISPLAY_OFF", .value = KEY_DISPLAY_OFF },
+ { .name = "KEY_DOCUMENTS", .value = KEY_DOCUMENTS },
+ { .name = "KEY_DOLLAR", .value = KEY_DOLLAR },
+ { .name = "KEY_DOT", .value = KEY_DOT },
+ { .name = "KEY_DOWN", .value = KEY_DOWN },
+ // { .name = "KEY_DUAL_RANGE_RADAR", .value = KEY_DUAL_RANGE_RADAR },
+ { .name = "KEY_DVD", .value = KEY_DVD },
+ { .name = "KEY_E", .value = KEY_E },
+ { .name = "KEY_EDIT", .value = KEY_EDIT },
+ { .name = "KEY_EDITOR", .value = KEY_EDITOR },
+ { .name = "KEY_EJECTCD", .value = KEY_EJECTCD },
+ { .name = "KEY_EJECTCLOSECD", .value = KEY_EJECTCLOSECD },
+ { .name = "KEY_EMAIL", .value = KEY_EMAIL },
+ // { .name = "KEY_EMOJI_PICKER", .value = KEY_EMOJI_PICKER },
+ { .name = "KEY_END", .value = KEY_END },
+ { .name = "KEY_ENTER", .value = KEY_ENTER },
+ { .name = "KEY_EPG", .value = KEY_EPG },
+ { .name = "KEY_EQUAL", .value = KEY_EQUAL },
+ { .name = "KEY_ESC", .value = KEY_ESC },
+ { .name = "KEY_EURO", .value = KEY_EURO },
+ { .name = "KEY_EXIT", .value = KEY_EXIT },
+ { .name = "KEY_F", .value = KEY_F },
+ { .name = "KEY_F1", .value = KEY_F1 },
+ { .name = "KEY_F10", .value = KEY_F10 },
+ { .name = "KEY_F11", .value = KEY_F11 },
+ { .name = "KEY_F12", .value = KEY_F12 },
+ { .name = "KEY_F13", .value = KEY_F13 },
+ { .name = "KEY_F14", .value = KEY_F14 },
+ { .name = "KEY_F15", .value = KEY_F15 },
+ { .name = "KEY_F16", .value = KEY_F16 },
+ { .name = "KEY_F17", .value = KEY_F17 },
+ { .name = "KEY_F18", .value = KEY_F18 },
+ { .name = "KEY_F19", .value = KEY_F19 },
+ { .name = "KEY_F2", .value = KEY_F2 },
+ { .name = "KEY_F20", .value = KEY_F20 },
+ { .name = "KEY_F21", .value = KEY_F21 },
+ { .name = "KEY_F22", .value = KEY_F22 },
+ { .name = "KEY_F23", .value = KEY_F23 },
+ { .name = "KEY_F24", .value = KEY_F24 },
+ { .name = "KEY_F3", .value = KEY_F3 },
+ { .name = "KEY_F4", .value = KEY_F4 },
+ { .name = "KEY_F5", .value = KEY_F5 },
+ { .name = "KEY_F6", .value = KEY_F6 },
+ { .name = "KEY_F7", .value = KEY_F7 },
+ { .name = "KEY_F8", .value = KEY_F8 },
+ { .name = "KEY_F9", .value = KEY_F9 },
+ { .name = "KEY_FASTFORWARD", .value = KEY_FASTFORWARD },
+ { .name = "KEY_FASTREVERSE", .value = KEY_FASTREVERSE },
+ { .name = "KEY_FAVORITES", .value = KEY_FAVORITES },
+ { .name = "KEY_FILE", .value = KEY_FILE },
+ { .name = "KEY_FINANCE", .value = KEY_FINANCE },
+ { .name = "KEY_FIND", .value = KEY_FIND },
+ { .name = "KEY_FIRST", .value = KEY_FIRST },
+ // { .name = "KEY_FISHING_CHART", .value = KEY_FISHING_CHART },
+ { .name = "KEY_FN", .value = KEY_FN },
+ { .name = "KEY_FN_1", .value = KEY_FN_1 },
+ { .name = "KEY_FN_2", .value = KEY_FN_2 },
+ { .name = "KEY_FN_B", .value = KEY_FN_B },
+ { .name = "KEY_FN_D", .value = KEY_FN_D },
+ { .name = "KEY_FN_E", .value = KEY_FN_E },
+ { .name = "KEY_FN_ESC", .value = KEY_FN_ESC },
+ { .name = "KEY_FN_F", .value = KEY_FN_F },
+ { .name = "KEY_FN_F1", .value = KEY_FN_F1 },
+ { .name = "KEY_FN_F10", .value = KEY_FN_F10 },
+ { .name = "KEY_FN_F11", .value = KEY_FN_F11 },
+ { .name = "KEY_FN_F12", .value = KEY_FN_F12 },
+ { .name = "KEY_FN_F2", .value = KEY_FN_F2 },
+ { .name = "KEY_FN_F3", .value = KEY_FN_F3 },
+ { .name = "KEY_FN_F4", .value = KEY_FN_F4 },
+ { .name = "KEY_FN_F5", .value = KEY_FN_F5 },
+ { .name = "KEY_FN_F6", .value = KEY_FN_F6 },
+ { .name = "KEY_FN_F7", .value = KEY_FN_F7 },
+ { .name = "KEY_FN_F8", .value = KEY_FN_F8 },
+ { .name = "KEY_FN_F9", .value = KEY_FN_F9 },
+ // { .name = "KEY_FN_RIGHT_SHIFT", .value = KEY_FN_RIGHT_SHIFT },
+ { .name = "KEY_FN_S", .value = KEY_FN_S },
+ { .name = "KEY_FORWARD", .value = KEY_FORWARD },
+ { .name = "KEY_FORWARDMAIL", .value = KEY_FORWARDMAIL },
+ { .name = "KEY_FRAMEBACK", .value = KEY_FRAMEBACK },
+ { .name = "KEY_FRAMEFORWARD", .value = KEY_FRAMEFORWARD },
+ { .name = "KEY_FRONT", .value = KEY_FRONT },
+ { .name = "KEY_FULL_SCREEN", .value = KEY_FULL_SCREEN },
+ { .name = "KEY_G", .value = KEY_G },
+ { .name = "KEY_GAMES", .value = KEY_GAMES },
+ { .name = "KEY_GOTO", .value = KEY_GOTO },
+ { .name = "KEY_GRAPHICSEDITOR", .value = KEY_GRAPHICSEDITOR },
+ { .name = "KEY_GRAVE", .value = KEY_GRAVE },
+ { .name = "KEY_GREEN", .value = KEY_GREEN },
+ { .name = "KEY_H", .value = KEY_H },
+ { .name = "KEY_HANGEUL", .value = KEY_HANGEUL },
+ // { .name = "KEY_HANGUP_PHONE", .value = KEY_HANGUP_PHONE },
+ { .name = "KEY_HANJA", .value = KEY_HANJA },
+ { .name = "KEY_HELP", .value = KEY_HELP },
+ { .name = "KEY_HENKAN", .value = KEY_HENKAN },
+ { .name = "KEY_HIRAGANA", .value = KEY_HIRAGANA },
+ { .name = "KEY_HOME", .value = KEY_HOME },
+ { .name = "KEY_HOMEPAGE", .value = KEY_HOMEPAGE },
+ { .name = "KEY_HP", .value = KEY_HP },
+ { .name = "KEY_I", .value = KEY_I },
+ { .name = "KEY_IMAGES", .value = KEY_IMAGES },
+ { .name = "KEY_INFO", .value = KEY_INFO },
+ { .name = "KEY_INSERT", .value = KEY_INSERT },
+ { .name = "KEY_INS_LINE", .value = KEY_INS_LINE },
+ { .name = "KEY_ISO", .value = KEY_ISO },
+ { .name = "KEY_J", .value = KEY_J },
+ { .name = "KEY_JOURNAL", .value = KEY_JOURNAL },
+ { .name = "KEY_K", .value = KEY_K },
+ { .name = "KEY_KATAKANA", .value = KEY_KATAKANA },
+ { .name = "KEY_KATAKANAHIRAGANA", .value = KEY_KATAKANAHIRAGANA },
+ { .name = "KEY_KBDILLUMDOWN", .value = KEY_KBDILLUMDOWN },
+ { .name = "KEY_KBDILLUMTOGGLE", .value = KEY_KBDILLUMTOGGLE },
+ { .name = "KEY_KBDILLUMUP", .value = KEY_KBDILLUMUP },
+ { .name = "KEY_KBDINPUTASSIST_ACCEPT", .value = KEY_KBDINPUTASSIST_ACCEPT },
+ { .name = "KEY_KBDINPUTASSIST_CANCEL", .value = KEY_KBDINPUTASSIST_CANCEL },
+ { .name = "KEY_KBDINPUTASSIST_NEXT", .value = KEY_KBDINPUTASSIST_NEXT },
+ { .name = "KEY_KBDINPUTASSIST_NEXTGROUP", .value = KEY_KBDINPUTASSIST_NEXTGROUP },
+ { .name = "KEY_KBDINPUTASSIST_PREV", .value = KEY_KBDINPUTASSIST_PREV },
+ { .name = "KEY_KBDINPUTASSIST_PREVGROUP", .value = KEY_KBDINPUTASSIST_PREVGROUP },
+ { .name = "KEY_KBD_LAYOUT_NEXT", .value = KEY_KBD_LAYOUT_NEXT },
+ { .name = "KEY_KBD_LCD_MENU1", .value = KEY_KBD_LCD_MENU1 },
+ { .name = "KEY_KBD_LCD_MENU2", .value = KEY_KBD_LCD_MENU2 },
+ { .name = "KEY_KBD_LCD_MENU3", .value = KEY_KBD_LCD_MENU3 },
+ { .name = "KEY_KBD_LCD_MENU4", .value = KEY_KBD_LCD_MENU4 },
+ { .name = "KEY_KBD_LCD_MENU5", .value = KEY_KBD_LCD_MENU5 },
+ { .name = "KEY_KEYBOARD", .value = KEY_KEYBOARD },
+ { .name = "KEY_KP0", .value = KEY_KP0 },
+ { .name = "KEY_KP1", .value = KEY_KP1 },
+ { .name = "KEY_KP2", .value = KEY_KP2 },
+ { .name = "KEY_KP3", .value = KEY_KP3 },
+ { .name = "KEY_KP4", .value = KEY_KP4 },
+ { .name = "KEY_KP5", .value = KEY_KP5 },
+ { .name = "KEY_KP6", .value = KEY_KP6 },
+ { .name = "KEY_KP7", .value = KEY_KP7 },
+ { .name = "KEY_KP8", .value = KEY_KP8 },
+ { .name = "KEY_KP9", .value = KEY_KP9 },
+ { .name = "KEY_KPASTERISK", .value = KEY_KPASTERISK },
+ { .name = "KEY_KPCOMMA", .value = KEY_KPCOMMA },
+ { .name = "KEY_KPDOT", .value = KEY_KPDOT },
+ { .name = "KEY_KPENTER", .value = KEY_KPENTER },
+ { .name = "KEY_KPEQUAL", .value = KEY_KPEQUAL },
+ { .name = "KEY_KPJPCOMMA", .value = KEY_KPJPCOMMA },
+ { .name = "KEY_KPLEFTPAREN", .value = KEY_KPLEFTPAREN },
+ { .name = "KEY_KPMINUS", .value = KEY_KPMINUS },
+ { .name = "KEY_KPPLUS", .value = KEY_KPPLUS },
+ { .name = "KEY_KPPLUSMINUS", .value = KEY_KPPLUSMINUS },
+ { .name = "KEY_KPRIGHTPAREN", .value = KEY_KPRIGHTPAREN },
+ { .name = "KEY_KPSLASH", .value = KEY_KPSLASH },
+ { .name = "KEY_L", .value = KEY_L },
+ { .name = "KEY_LANGUAGE", .value = KEY_LANGUAGE },
+ { .name = "KEY_LAST", .value = KEY_LAST },
+ { .name = "KEY_LEFT", .value = KEY_LEFT },
+ { .name = "KEY_LEFTALT", .value = KEY_LEFTALT },
+ { .name = "KEY_LEFTBRACE", .value = KEY_LEFTBRACE },
+ { .name = "KEY_LEFTCTRL", .value = KEY_LEFTCTRL },
+ { .name = "KEY_LEFTMETA", .value = KEY_LEFTMETA },
+ { .name = "KEY_LEFTSHIFT", .value = KEY_LEFTSHIFT },
+ { .name = "KEY_LEFT_DOWN", .value = KEY_LEFT_DOWN },
+ { .name = "KEY_LEFT_UP", .value = KEY_LEFT_UP },
+ { .name = "KEY_LIGHTS_TOGGLE", .value = KEY_LIGHTS_TOGGLE },
+ { .name = "KEY_LINEFEED", .value = KEY_LINEFEED },
+ { .name = "KEY_LIST", .value = KEY_LIST },
+ { .name = "KEY_LOGOFF", .value = KEY_LOGOFF },
+ { .name = "KEY_M", .value = KEY_M },
+ { .name = "KEY_MACRO", .value = KEY_MACRO },
+ { .name = "KEY_MACRO1", .value = KEY_MACRO1 },
+ { .name = "KEY_MACRO10", .value = KEY_MACRO10 },
+ { .name = "KEY_MACRO11", .value = KEY_MACRO11 },
+ { .name = "KEY_MACRO12", .value = KEY_MACRO12 },
+ { .name = "KEY_MACRO13", .value = KEY_MACRO13 },
+ { .name = "KEY_MACRO14", .value = KEY_MACRO14 },
+ { .name = "KEY_MACRO15", .value = KEY_MACRO15 },
+ { .name = "KEY_MACRO16", .value = KEY_MACRO16 },
+ { .name = "KEY_MACRO17", .value = KEY_MACRO17 },
+ { .name = "KEY_MACRO18", .value = KEY_MACRO18 },
+ { .name = "KEY_MACRO19", .value = KEY_MACRO19 },
+ { .name = "KEY_MACRO2", .value = KEY_MACRO2 },
+ { .name = "KEY_MACRO20", .value = KEY_MACRO20 },
+ { .name = "KEY_MACRO21", .value = KEY_MACRO21 },
+ { .name = "KEY_MACRO22", .value = KEY_MACRO22 },
+ { .name = "KEY_MACRO23", .value = KEY_MACRO23 },
+ { .name = "KEY_MACRO24", .value = KEY_MACRO24 },
+ { .name = "KEY_MACRO25", .value = KEY_MACRO25 },
+ { .name = "KEY_MACRO26", .value = KEY_MACRO26 },
+ { .name = "KEY_MACRO27", .value = KEY_MACRO27 },
+ { .name = "KEY_MACRO28", .value = KEY_MACRO28 },
+ { .name = "KEY_MACRO29", .value = KEY_MACRO29 },
+ { .name = "KEY_MACRO3", .value = KEY_MACRO3 },
+ { .name = "KEY_MACRO30", .value = KEY_MACRO30 },
+ { .name = "KEY_MACRO4", .value = KEY_MACRO4 },
+ { .name = "KEY_MACRO5", .value = KEY_MACRO5 },
+ { .name = "KEY_MACRO6", .value = KEY_MACRO6 },
+ { .name = "KEY_MACRO7", .value = KEY_MACRO7 },
+ { .name = "KEY_MACRO8", .value = KEY_MACRO8 },
+ { .name = "KEY_MACRO9", .value = KEY_MACRO9 },
+ { .name = "KEY_MACRO_PRESET1", .value = KEY_MACRO_PRESET1 },
+ { .name = "KEY_MACRO_PRESET2", .value = KEY_MACRO_PRESET2 },
+ { .name = "KEY_MACRO_PRESET3", .value = KEY_MACRO_PRESET3 },
+ { .name = "KEY_MACRO_PRESET_CYCLE", .value = KEY_MACRO_PRESET_CYCLE },
+ { .name = "KEY_MACRO_RECORD_START", .value = KEY_MACRO_RECORD_START },
+ { .name = "KEY_MACRO_RECORD_STOP", .value = KEY_MACRO_RECORD_STOP },
+ { .name = "KEY_MAIL", .value = KEY_MAIL },
+ // { .name = "KEY_MARK_WAYPOINT", .value = KEY_MARK_WAYPOINT },
+ { .name = "KEY_MAX", .value = KEY_MAX },
+ { .name = "KEY_MEDIA", .value = KEY_MEDIA },
+ { .name = "KEY_MEDIA_REPEAT", .value = KEY_MEDIA_REPEAT },
+ { .name = "KEY_MEDIA_TOP_MENU", .value = KEY_MEDIA_TOP_MENU },
+ { .name = "KEY_MEMO", .value = KEY_MEMO },
+ { .name = "KEY_MENU", .value = KEY_MENU },
+ { .name = "KEY_MESSENGER", .value = KEY_MESSENGER },
+ { .name = "KEY_MHP", .value = KEY_MHP },
+ { .name = "KEY_MICMUTE", .value = KEY_MICMUTE },
+ { .name = "KEY_MINUS", .value = KEY_MINUS },
+ { .name = "KEY_MODE", .value = KEY_MODE },
+ { .name = "KEY_MOVE", .value = KEY_MOVE },
+ { .name = "KEY_MP3", .value = KEY_MP3 },
+ { .name = "KEY_MSDOS", .value = KEY_MSDOS },
+ { .name = "KEY_MUHENKAN", .value = KEY_MUHENKAN },
+ { .name = "KEY_MUTE", .value = KEY_MUTE },
+ { .name = "KEY_N", .value = KEY_N },
+ // { .name = "KEY_NAV_CHART", .value = KEY_NAV_CHART },
+ // { .name = "KEY_NAV_INFO", .value = KEY_NAV_INFO },
+ { .name = "KEY_NEW", .value = KEY_NEW },
+ { .name = "KEY_NEWS", .value = KEY_NEWS },
+ { .name = "KEY_NEXT", .value = KEY_NEXT },
+ { .name = "KEY_NEXTSONG", .value = KEY_NEXTSONG },
+ // { .name = "KEY_NEXT_ELEMENT", .value = KEY_NEXT_ELEMENT },
+ { .name = "KEY_NEXT_FAVORITE", .value = KEY_NEXT_FAVORITE },
+ // { .name = "KEY_NOTIFICATION_CENTER", .value = KEY_NOTIFICATION_CENTER },
+ { .name = "KEY_NUMERIC_0", .value = KEY_NUMERIC_0 },
+ { .name = "KEY_NUMERIC_1", .value = KEY_NUMERIC_1 },
+ { .name = "KEY_NUMERIC_11", .value = KEY_NUMERIC_11 },
+ { .name = "KEY_NUMERIC_12", .value = KEY_NUMERIC_12 },
+ { .name = "KEY_NUMERIC_2", .value = KEY_NUMERIC_2 },
+ { .name = "KEY_NUMERIC_3", .value = KEY_NUMERIC_3 },
+ { .name = "KEY_NUMERIC_4", .value = KEY_NUMERIC_4 },
+ { .name = "KEY_NUMERIC_5", .value = KEY_NUMERIC_5 },
+ { .name = "KEY_NUMERIC_6", .value = KEY_NUMERIC_6 },
+ { .name = "KEY_NUMERIC_7", .value = KEY_NUMERIC_7 },
+ { .name = "KEY_NUMERIC_8", .value = KEY_NUMERIC_8 },
+ { .name = "KEY_NUMERIC_9", .value = KEY_NUMERIC_9 },
+ { .name = "KEY_NUMERIC_A", .value = KEY_NUMERIC_A },
+ { .name = "KEY_NUMERIC_B", .value = KEY_NUMERIC_B },
+ { .name = "KEY_NUMERIC_C", .value = KEY_NUMERIC_C },
+ { .name = "KEY_NUMERIC_D", .value = KEY_NUMERIC_D },
+ { .name = "KEY_NUMERIC_POUND", .value = KEY_NUMERIC_POUND },
+ { .name = "KEY_NUMERIC_STAR", .value = KEY_NUMERIC_STAR },
+ { .name = "KEY_NUMLOCK", .value = KEY_NUMLOCK },
+ { .name = "KEY_O", .value = KEY_O },
+ { .name = "KEY_OK", .value = KEY_OK },
+ { .name = "KEY_ONSCREEN_KEYBOARD", .value = KEY_ONSCREEN_KEYBOARD },
+ { .name = "KEY_OPEN", .value = KEY_OPEN },
+ { .name = "KEY_OPTION", .value = KEY_OPTION },
+ { .name = "KEY_P", .value = KEY_P },
+ { .name = "KEY_PAGEDOWN", .value = KEY_PAGEDOWN },
+ { .name = "KEY_PAGEUP", .value = KEY_PAGEUP },
+ { .name = "KEY_PASTE", .value = KEY_PASTE },
+ { .name = "KEY_PAUSE", .value = KEY_PAUSE },
+ { .name = "KEY_PAUSECD", .value = KEY_PAUSECD },
+ { .name = "KEY_PAUSE_RECORD", .value = KEY_PAUSE_RECORD },
+ { .name = "KEY_PC", .value = KEY_PC },
+ { .name = "KEY_PHONE", .value = KEY_PHONE },
+ // { .name = "KEY_PICKUP_PHONE", .value = KEY_PICKUP_PHONE },
+ { .name = "KEY_PLAY", .value = KEY_PLAY },
+ { .name = "KEY_PLAYCD", .value = KEY_PLAYCD },
+ { .name = "KEY_PLAYER", .value = KEY_PLAYER },
+ { .name = "KEY_PLAYPAUSE", .value = KEY_PLAYPAUSE },
+ { .name = "KEY_POWER", .value = KEY_POWER },
+ { .name = "KEY_POWER2", .value = KEY_POWER2 },
+ { .name = "KEY_PRESENTATION", .value = KEY_PRESENTATION },
+ { .name = "KEY_PREVIOUS", .value = KEY_PREVIOUS },
+ { .name = "KEY_PREVIOUSSONG", .value = KEY_PREVIOUSSONG },
+ // { .name = "KEY_PREVIOUS_ELEMENT", .value = KEY_PREVIOUS_ELEMENT },
+ { .name = "KEY_PRINT", .value = KEY_PRINT },
+ { .name = "KEY_PRIVACY_SCREEN_TOGGLE", .value = KEY_PRIVACY_SCREEN_TOGGLE },
+ { .name = "KEY_PROG1", .value = KEY_PROG1 },
+ { .name = "KEY_PROG2", .value = KEY_PROG2 },
+ { .name = "KEY_PROG3", .value = KEY_PROG3 },
+ { .name = "KEY_PROG4", .value = KEY_PROG4 },
+ { .name = "KEY_PROGRAM", .value = KEY_PROGRAM },
+ { .name = "KEY_PROPS", .value = KEY_PROPS },
+ { .name = "KEY_PVR", .value = KEY_PVR },
+ { .name = "KEY_Q", .value = KEY_Q },
+ { .name = "KEY_QUESTION", .value = KEY_QUESTION },
+ { .name = "KEY_R", .value = KEY_R },
+ // { .name = "KEY_RADAR_OVERLAY", .value = KEY_RADAR_OVERLAY },
+ { .name = "KEY_RADIO", .value = KEY_RADIO },
+ { .name = "KEY_RECORD", .value = KEY_RECORD },
+ { .name = "KEY_RED", .value = KEY_RED },
+ { .name = "KEY_REDO", .value = KEY_REDO },
+ { .name = "KEY_REFRESH", .value = KEY_REFRESH },
+ { .name = "KEY_REPLY", .value = KEY_REPLY },
+ { .name = "KEY_RESERVED", .value = KEY_RESERVED },
+ { .name = "KEY_RESTART", .value = KEY_RESTART },
+ { .name = "KEY_REWIND", .value = KEY_REWIND },
+ { .name = "KEY_RFKILL", .value = KEY_RFKILL },
+ { .name = "KEY_RIGHT", .value = KEY_RIGHT },
+ { .name = "KEY_RIGHTALT", .value = KEY_RIGHTALT },
+ { .name = "KEY_RIGHTBRACE", .value = KEY_RIGHTBRACE },
+ { .name = "KEY_RIGHTCTRL", .value = KEY_RIGHTCTRL },
+ { .name = "KEY_RIGHTMETA", .value = KEY_RIGHTMETA },
+ { .name = "KEY_RIGHTSHIFT", .value = KEY_RIGHTSHIFT },
+ { .name = "KEY_RIGHT_DOWN", .value = KEY_RIGHT_DOWN },
+ { .name = "KEY_RIGHT_UP", .value = KEY_RIGHT_UP },
+ { .name = "KEY_RO", .value = KEY_RO },
+ { .name = "KEY_ROOT_MENU", .value = KEY_ROOT_MENU },
+ { .name = "KEY_ROTATE_DISPLAY", .value = KEY_ROTATE_DISPLAY },
+ { .name = "KEY_ROTATE_LOCK_TOGGLE", .value = KEY_ROTATE_LOCK_TOGGLE },
+ { .name = "KEY_S", .value = KEY_S },
+ { .name = "KEY_SAT", .value = KEY_SAT },
+ { .name = "KEY_SAT2", .value = KEY_SAT2 },
+ { .name = "KEY_SAVE", .value = KEY_SAVE },
+ { .name = "KEY_SCALE", .value = KEY_SCALE },
+ { .name = "KEY_SCREENSAVER", .value = KEY_SCREENSAVER },
+ { .name = "KEY_SCROLLDOWN", .value = KEY_SCROLLDOWN },
+ { .name = "KEY_SCROLLLOCK", .value = KEY_SCROLLLOCK },
+ { .name = "KEY_SCROLLUP", .value = KEY_SCROLLUP },
+ { .name = "KEY_SEARCH", .value = KEY_SEARCH },
+ { .name = "KEY_SELECT", .value = KEY_SELECT },
+ { .name = "KEY_SELECTIVE_SCREENSHOT", .value = KEY_SELECTIVE_SCREENSHOT },
+ { .name = "KEY_SEMICOLON", .value = KEY_SEMICOLON },
+ { .name = "KEY_SEND", .value = KEY_SEND },
+ { .name = "KEY_SENDFILE", .value = KEY_SENDFILE },
+ { .name = "KEY_SETUP", .value = KEY_SETUP },
+ { .name = "KEY_SHOP", .value = KEY_SHOP },
+ { .name = "KEY_SHUFFLE", .value = KEY_SHUFFLE },
+ // { .name = "KEY_SIDEVU_SONAR", .value = KEY_SIDEVU_SONAR },
+ // { .name = "KEY_SINGLE_RANGE_RADAR", .value = KEY_SINGLE_RANGE_RADAR },
+ { .name = "KEY_SLASH", .value = KEY_SLASH },
+ { .name = "KEY_SLEEP", .value = KEY_SLEEP },
+ { .name = "KEY_SLOW", .value = KEY_SLOW },
+ { .name = "KEY_SLOWREVERSE", .value = KEY_SLOWREVERSE },
+ // { .name = "KEY_SOS", .value = KEY_SOS },
+ { .name = "KEY_SOUND", .value = KEY_SOUND },
+ { .name = "KEY_SPACE", .value = KEY_SPACE },
+ { .name = "KEY_SPELLCHECK", .value = KEY_SPELLCHECK },
+ { .name = "KEY_SPORT", .value = KEY_SPORT },
+ { .name = "KEY_SPREADSHEET", .value = KEY_SPREADSHEET },
+ { .name = "KEY_STOP", .value = KEY_STOP },
+ { .name = "KEY_STOPCD", .value = KEY_STOPCD },
+ { .name = "KEY_STOP_RECORD", .value = KEY_STOP_RECORD },
+ { .name = "KEY_SUBTITLE", .value = KEY_SUBTITLE },
+ { .name = "KEY_SUSPEND", .value = KEY_SUSPEND },
+ { .name = "KEY_SWITCHVIDEOMODE", .value = KEY_SWITCHVIDEOMODE },
+ { .name = "KEY_SYSRQ", .value = KEY_SYSRQ },
+ { .name = "KEY_T", .value = KEY_T },
+ { .name = "KEY_TAB", .value = KEY_TAB },
+ { .name = "KEY_TAPE", .value = KEY_TAPE },
+ { .name = "KEY_TASKMANAGER", .value = KEY_TASKMANAGER },
+ { .name = "KEY_TEEN", .value = KEY_TEEN },
+ { .name = "KEY_TEXT", .value = KEY_TEXT },
+ { .name = "KEY_TIME", .value = KEY_TIME },
+ { .name = "KEY_TITLE", .value = KEY_TITLE },
+ { .name = "KEY_TOUCHPAD_OFF", .value = KEY_TOUCHPAD_OFF },
+ { .name = "KEY_TOUCHPAD_ON", .value = KEY_TOUCHPAD_ON },
+ { .name = "KEY_TOUCHPAD_TOGGLE", .value = KEY_TOUCHPAD_TOGGLE },
+ // { .name = "KEY_TRADITIONAL_SONAR", .value = KEY_TRADITIONAL_SONAR },
+ { .name = "KEY_TUNER", .value = KEY_TUNER },
+ { .name = "KEY_TV", .value = KEY_TV },
+ { .name = "KEY_TV2", .value = KEY_TV2 },
+ { .name = "KEY_TWEN", .value = KEY_TWEN },
+ { .name = "KEY_U", .value = KEY_U },
+ { .name = "KEY_UNDO", .value = KEY_UNDO },
+ { .name = "KEY_UNKNOWN", .value = KEY_UNKNOWN },
+ { .name = "KEY_UNMUTE", .value = KEY_UNMUTE },
+ { .name = "KEY_UP", .value = KEY_UP },
+ { .name = "KEY_UWB", .value = KEY_UWB },
+ { .name = "KEY_V", .value = KEY_V },
+ { .name = "KEY_VCR", .value = KEY_VCR },
+ { .name = "KEY_VCR2", .value = KEY_VCR2 },
+ { .name = "KEY_VENDOR", .value = KEY_VENDOR },
+ { .name = "KEY_VIDEO", .value = KEY_VIDEO },
+ { .name = "KEY_VIDEOPHONE", .value = KEY_VIDEOPHONE },
+ { .name = "KEY_VIDEO_NEXT", .value = KEY_VIDEO_NEXT },
+ { .name = "KEY_VIDEO_PREV", .value = KEY_VIDEO_PREV },
+ { .name = "KEY_VOD", .value = KEY_VOD },
+ { .name = "KEY_VOICECOMMAND", .value = KEY_VOICECOMMAND },
+ { .name = "KEY_VOICEMAIL", .value = KEY_VOICEMAIL },
+ { .name = "KEY_VOLUMEDOWN", .value = KEY_VOLUMEDOWN },
+ { .name = "KEY_VOLUMEUP", .value = KEY_VOLUMEUP },
+ { .name = "KEY_W", .value = KEY_W },
+ { .name = "KEY_WAKEUP", .value = KEY_WAKEUP },
+ { .name = "KEY_WLAN", .value = KEY_WLAN },
+ { .name = "KEY_WORDPROCESSOR", .value = KEY_WORDPROCESSOR },
+ { .name = "KEY_WPS_BUTTON", .value = KEY_WPS_BUTTON },
+ { .name = "KEY_WWAN", .value = KEY_WWAN },
+ { .name = "KEY_WWW", .value = KEY_WWW },
+ { .name = "KEY_X", .value = KEY_X },
+ { .name = "KEY_XFER", .value = KEY_XFER },
+ { .name = "KEY_Y", .value = KEY_Y },
+ { .name = "KEY_YELLOW", .value = KEY_YELLOW },
+ { .name = "KEY_YEN", .value = KEY_YEN },
+ { .name = "KEY_Z", .value = KEY_Z },
+ { .name = "KEY_ZENKAKUHANKAKU", .value = KEY_ZENKAKUHANKAKU },
+ { .name = "KEY_ZOOMIN", .value = KEY_ZOOMIN },
+ { .name = "KEY_ZOOMOUT", .value = KEY_ZOOMOUT },
+ { .name = "KEY_ZOOMRESET", .value = KEY_ZOOMRESET },
+ { .name = "LED_CAPSL", .value = LED_CAPSL },
+ { .name = "LED_CHARGING", .value = LED_CHARGING },
+ { .name = "LED_COMPOSE", .value = LED_COMPOSE },
+ { .name = "LED_KANA", .value = LED_KANA },
+ { .name = "LED_MAIL", .value = LED_MAIL },
+ { .name = "LED_MAX", .value = LED_MAX },
+ { .name = "LED_MISC", .value = LED_MISC },
+ { .name = "LED_MUTE", .value = LED_MUTE },
+ { .name = "LED_NUML", .value = LED_NUML },
+ { .name = "LED_SCROLLL", .value = LED_SCROLLL },
+ { .name = "LED_SLEEP", .value = LED_SLEEP },
+ { .name = "LED_SUSPEND", .value = LED_SUSPEND },
+ { .name = "MSC_GESTURE", .value = MSC_GESTURE },
+ { .name = "MSC_MAX", .value = MSC_MAX },
+ { .name = "MSC_PULSELED", .value = MSC_PULSELED },
+ { .name = "MSC_RAW", .value = MSC_RAW },
+ { .name = "MSC_SCAN", .value = MSC_SCAN },
+ { .name = "MSC_SERIAL", .value = MSC_SERIAL },
+ { .name = "MSC_TIMESTAMP", .value = MSC_TIMESTAMP },
+ { .name = "REL_DIAL", .value = REL_DIAL },
+ { .name = "REL_HWHEEL", .value = REL_HWHEEL },
+ { .name = "REL_HWHEEL_HI_RES", .value = REL_HWHEEL_HI_RES },
+ { .name = "REL_MAX", .value = REL_MAX },
+ { .name = "REL_MISC", .value = REL_MISC },
+ { .name = "REL_RESERVED", .value = REL_RESERVED },
+ { .name = "REL_RX", .value = REL_RX },
+ { .name = "REL_RY", .value = REL_RY },
+ { .name = "REL_RZ", .value = REL_RZ },
+ { .name = "REL_WHEEL", .value = REL_WHEEL },
+ { .name = "REL_WHEEL_HI_RES", .value = REL_WHEEL_HI_RES },
+ { .name = "REL_X", .value = REL_X },
+ { .name = "REL_Y", .value = REL_Y },
+ { .name = "REL_Z", .value = REL_Z },
+ { .name = "REP_DELAY", .value = REP_DELAY },
+ { .name = "REP_MAX", .value = REP_MAX },
+ { .name = "REP_PERIOD", .value = REP_PERIOD },
+ { .name = "SND_BELL", .value = SND_BELL },
+ { .name = "SND_CLICK", .value = SND_CLICK },
+ { .name = "SND_MAX", .value = SND_MAX },
+ { .name = "SND_TONE", .value = SND_TONE },
+ { .name = "SW_CAMERA_LENS_COVER", .value = SW_CAMERA_LENS_COVER },
+ { .name = "SW_DOCK", .value = SW_DOCK },
+ { .name = "SW_FRONT_PROXIMITY", .value = SW_FRONT_PROXIMITY },
+ { .name = "SW_HEADPHONE_INSERT", .value = SW_HEADPHONE_INSERT },
+ { .name = "SW_JACK_PHYSICAL_INSERT", .value = SW_JACK_PHYSICAL_INSERT },
+ { .name = "SW_KEYPAD_SLIDE", .value = SW_KEYPAD_SLIDE },
+ { .name = "SW_LID", .value = SW_LID },
+ { .name = "SW_LINEIN_INSERT", .value = SW_LINEIN_INSERT },
+ { .name = "SW_LINEOUT_INSERT", .value = SW_LINEOUT_INSERT },
+ { .name = "SW_MACHINE_COVER", .value = SW_MACHINE_COVER },
+ { .name = "SW_MAX", .value = SW_MAX },
+ { .name = "SW_MICROPHONE_INSERT", .value = SW_MICROPHONE_INSERT },
+ { .name = "SW_MUTE_DEVICE", .value = SW_MUTE_DEVICE },
+ { .name = "SW_PEN_INSERTED", .value = SW_PEN_INSERTED },
+ { .name = "SW_RFKILL_ALL", .value = SW_RFKILL_ALL },
+ { .name = "SW_ROTATE_LOCK", .value = SW_ROTATE_LOCK },
+ { .name = "SW_TABLET_MODE", .value = SW_TABLET_MODE },
+ { .name = "SW_VIDEOOUT_INSERT", .value = SW_VIDEOOUT_INSERT },
+ { .name = "SYN_CONFIG", .value = SYN_CONFIG },
+ { .name = "SYN_DROPPED", .value = SYN_DROPPED },
+ { .name = "SYN_MAX", .value = SYN_MAX },
+ { .name = "SYN_MT_REPORT", .value = SYN_MT_REPORT },
+ { .name = "SYN_REPORT", .value = SYN_REPORT },
+};
+
+static const struct name_entry prop_names[] = {
+ { .name = "INPUT_PROP_ACCELEROMETER", .value = INPUT_PROP_ACCELEROMETER },
+ { .name = "INPUT_PROP_BUTTONPAD", .value = INPUT_PROP_BUTTONPAD },
+ { .name = "INPUT_PROP_DIRECT", .value = INPUT_PROP_DIRECT },
+ { .name = "INPUT_PROP_MAX", .value = INPUT_PROP_MAX },
+ { .name = "INPUT_PROP_POINTER", .value = INPUT_PROP_POINTER },
+ { .name = "INPUT_PROP_POINTING_STICK", .value = INPUT_PROP_POINTING_STICK },
+ { .name = "INPUT_PROP_SEMI_MT", .value = INPUT_PROP_SEMI_MT },
+ { .name = "INPUT_PROP_TOPBUTTONPAD", .value = INPUT_PROP_TOPBUTTONPAD },
+};
+
+#endif /* EVENT_NAMES_H */
diff --git a/usr.sbin/moused/moused/moused.8 b/usr.sbin/moused/moused/moused.8
new file mode 100644
index 000000000000..96feeda336c9
--- /dev/null
+++ b/usr.sbin/moused/moused/moused.8
@@ -0,0 +1,538 @@
+.\" SPDX-License-Identifier: BSD-4-Clause
+.\"
+.\" Copyright (c) 1996 Mike Pritchard <mpp@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\" must display the following acknowledgement:
+.\" This product includes software developed by Mike Pritchard.
+.\" 4. Neither the name of the author nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd June 14, 2025
+.Dt MOUSED 8
+.Os
+.Sh NAME
+.Nm moused
+.Nd pass mouse data to the console driver
+.Sh SYNOPSIS
+.Nm
+.Op Fl dfg
+.Op Fl I Ar file
+.Op Fl F Ar rate
+.Op Fl r Ar resolution
+.Op Fl VH Op Fl U Ar distance Fl L Ar distance
+.Op Fl A Ar exp Ns Op , Ns Ar offset
+.Op Fl a Ar X Ns Op , Ns Ar Y
+.Op Fl C Ar threshold
+.Op Fl m Ar N=M
+.Op Fl w Ar N
+.Op Fl z Ar target
+.Op Fl t Ar mousetype
+.Op Fl l Ar level
+.Op Fl 3 Op Fl E Ar timeout
+.Op Fl T Ar distance Ns Op , Ns Ar time Ns Op , Ns Ar after
+.Fl p Ar port
+.Pp
+.Nm
+.Op Fl d
+.Fl p Ar port
+.Fl i Ar info
+.Sh DESCRIPTION
+The
+.Nm
+utility and the console driver work together to support
+mouse operation in the text console and user programs.
+They virtualize the mouse and provide user programs with mouse data
+in the standard format
+(see
+.Xr sysmouse 4 ) .
+.Pp
+The mouse daemon listens to the specified port for mouse data,
+interprets and then passes it via ioctls to the console driver.
+Supported data interfaces are
+.Qq input event device
+AKA evdev and
+.Xr sysmouse 4
+level 1.
+The mouse daemon
+reports translation movement, button press/release
+events and movement of the roller or the wheel if available.
+The roller/wheel movement is reported as
+.Dq Z
+axis movement.
+.Pp
+The console driver will display the mouse pointer on the screen
+and provide cut and paste functions if the mouse pointer is enabled
+in the virtual console via
+.Xr vidcontrol 1 .
+If
+.Xr sysmouse 4
+is opened by the user program, the console driver also passes the mouse
+data to the device so that the user program will see it.
+.Pp
+If the mouse daemon receives the signal
+.Dv SIGHUP ,
+it will reopen the mouse port and reinitialize itself.
+Useful if
+the mouse is attached/detached while the system is suspended.
+.Pp
+If the mouse daemon receives the signal
+.Dv SIGUSR1 ,
+it will stop passing mouse events.
+Sending the signal
+.Dv SIGUSR1
+again will resume passing mouse events.
+Useful if your typing on a laptop is
+interrupted by accidentally touching the mouse pad.
+.Pp
+The following options are available:
+.Bl -tag -width indent
+.It Fl 3
+Emulate the third (middle) button for 2-button mice.
+It is emulated
+by pressing the left and right physical buttons simultaneously.
+.It Fl C Ar threshold
+Set double click speed as the maximum interval in msec between button clicks.
+Without this option, the default value of 500 msec will be assumed.
+This option will have effect only on the cut and paste operations
+in the text mode console.
+The user program which is reading mouse data
+via
+.Xr sysmouse 4
+will not be affected.
+.It Fl E Ar timeout
+When the third button emulation is enabled
+(see above),
+the
+.Nm
+utility waits
+.Ar timeout
+msec at most before deciding whether two buttons are being pressed
+simultaneously.
+The default timeout is 100 msec.
+.It Fl F Ar rate
+Only for
+.Xr sysmouse 4
+interface.
+Set the report rate (reports/sec) of the device if supported.
+.It Fl L Ar distance
+When
+.Dq Virtual Scrolling
+is enabled, the
+.Fl L
+option can be used to set the
+.Ar distance
+(in pixels) that the mouse must move before a scroll event
+is generated. This effectively controls the scrolling speed.
+The default
+.Ar distance
+is 2 pixels.
+.It Fl H
+Enable
+.Dq Horizontal Virtual Scrolling .
+With this option set, holding the middle mouse
+button down will cause motion to be interpreted as
+horizontal scrolling.
+Use the
+.Fl U
+option to set the distance the mouse must move before the scrolling mode is
+activated and the
+.Fl L
+option to set the scrolling speed.
+This option may be used with or without the
+.Fl V
+option.
+.It Fl I Ar file
+Write the process id of the
+.Nm
+utility in the specified file.
+Without this option, the process id will be stored in
+.Pa /var/run/moused.pid .
+.It Fl T Ar distance Ns Op , Ns Ar time Ns Op , Ns Ar after
+Terminate drift.
+Use this option if mouse pointer slowly wanders when mouse is not moved.
+Movements up to
+.Ar distance
+(for example 4) pixels (X+Y) in
+.Ar time
+msec (default 500) are ignored, except during
+.Ar after
+msec (default 4000) since last real mouse movement.
+.It Fl V
+Enable
+.Dq Virtual Scrolling .
+With this option set, holding the middle mouse
+button down will cause motion to be interpreted as scrolling.
+Use the
+.Fl U
+option to set the distance the mouse must move before the scrolling mode is
+activated and the
+.Fl L
+option to set the scrolling speed.
+.It Fl U Ar distance
+When
+.Dq Virtual Scrolling
+is enabled, the
+.Fl U
+option can be used to set the
+.Ar distance
+(in pixels) that the mouse must move before the scrolling
+mode is activated.
+The default
+.Ar distance
+is 3 pixels.
+.It Fl A Ar exp Ns Op , Ns Ar offset
+Apply exponential (dynamic) acceleration to mouse movements:
+the faster you move the mouse, the more it will be accelerated.
+That means that small mouse movements are not accelerated,
+so they are still very accurate, while a faster movement will
+drive the pointer quickly across the screen.
+.Pp
+The
+.Ar exp
+value specifies the exponent, which is basically
+the amount of acceleration. Useful values are in the
+range 1.1 to 2.0, but it depends on your mouse hardware
+and your personal preference. A value of 1.0 means no
+exponential acceleration. A value of 2.0 means squared
+acceleration (i.e. if you move the mouse twice as fast,
+the pointer will move four times as fast on the screen).
+Values beyond 2.0 are possible but not recommended.
+A good value to start is probably 1.5.
+.Pp
+The optional
+.Ar offset
+value specifies the distance at which the acceleration
+begins. The default is 1.0, which means that the
+acceleration is applied to movements larger than one unit.
+If you specify a larger value, it takes more speed for
+the acceleration to kick in, i.e. the speed range for
+small and accurate movements is wider.
+Usually the default should be sufficient, but if you're
+not satisfied with the behaviour, try a value of 2.0.
+.Pp
+Note that the
+.Fl A
+option interacts badly with the X server's own acceleration,
+which doesn't work very well anyway. Therefore it is
+recommended to switch it off if necessary:
+.Dq xset m 1 .
+.It Fl a Ar X Ns Op , Ns Ar Y
+Accelerate or decelerate the mouse input.
+This is a linear acceleration only.
+Values less than 1.0 slow down movement, values greater than 1.0 speed it
+up.
+Specifying only one value sets the acceleration for both axes.
+.Pp
+You can use the
+.Fl a
+and
+.Fl A
+options at the same time to have the combined effect
+of linear and exponential acceleration.
+.It Fl d
+Enable debugging messages.
+.It Fl f
+Do not become a daemon and instead run as a foreground process.
+Useful for testing and debugging.
+.It Fl g
+Only for evdev interface.
+Become the sole recipient of all incoming input events.
+This prevents other processes from getting input events on the device.
+.It Fl i Ar info
+Print specified information and quit.
+Available pieces of
+information are:
+.Pp
+.Bl -tag -compact -width modelxxx
+.It Ar port
+Port (device file) name, i.e.\&
+.Pa /dev/input/event0 ,
+.Pa /dev/ums0
+and
+.Pa /dev/psm0 .
+.It Ar if
+Interface type:
+.Dq evdev
+or
+.Dq sysmouse .
+.It Ar type
+Device type:
+.Dq mouse
+or
+.Dq touchpad .
+.It Ar model
+Mouse model.
+.It Ar all
+All of the above items.
+Print port, type and model in this order
+in one line.
+.El
+.Pp
+If the
+.Nm
+utility cannot determine the requested information, it prints
+.Dq Li unknown
+or
+.Dq Li generic .
+.It Fl l Ar level
+Ignored.
+Used for compatibiliy with legacy
+.Nm .
+.It Fl m Ar N=M
+Assign the physical button
+.Ar M
+to the logical button
+.Ar N .
+You may specify as many instances of this option as you like.
+More than one physical button may be assigned to a logical button at the
+same time.
+In this case the logical button will be down,
+if either of the assigned physical buttons is held down.
+Do not put space around
+.Ql = .
+.It Fl p Ar port
+Use
+.Ar port
+to communicate with the mouse.
+.It Fl r Ar resolution
+Only for
+.Xr sysmouse 4
+interface.
+Set the resolution of the device; in Dots Per Inch, or
+.Ar low ,
+.Ar medium-low ,
+.Ar medium-high
+or
+.Ar high .
+This option may not be supported by all the device.
+.It Fl t Ar type
+Ignored.
+Used for compatibiliy with legacy
+.Nm .
+.It Fl q Ar config
+Path to configuration file.
+.It Fl Q Ar quirks
+Path to quirks directory.
+.It Fl w Ar N
+Make the physical button
+.Ar N
+act as the wheel mode button.
+While this button is pressed, X and Y axis movement is reported to be zero
+and the Y axis movement is mapped to Z axis.
+You may further map the Z axis movement to virtual buttons by the
+.Fl z
+option below.
+.It Fl z Ar target
+Map Z axis (roller/wheel) movement to another axis or to virtual buttons.
+Valid
+.Ar target
+maybe:
+.Bl -tag -compact -width x__
+.It Ar x
+.It Ar y
+X or Y axis movement will be reported when the Z axis movement is detected.
+.It Ar N
+Report down events for the virtual buttons
+.Ar N
+and
+.Ar N+1
+respectively when negative and positive Z axis movement
+is detected.
+There do not need to be physical buttons
+.Ar N
+and
+.Ar N+1 .
+Note that mapping to logical buttons is carried out after mapping
+from the Z axis movement to the virtual buttons is done.
+.It Ar N1 N2
+Report down events for the virtual buttons
+.Ar N1
+and
+.Ar N2
+respectively when negative and positive Z axis movement
+is detected.
+.It Ar N1 N2 N3 N4
+This is useful for the mouse with two wheels of which
+the second wheel is used to generate horizontal scroll action,
+and for the mouse which has a knob or a stick which can detect
+the horizontal force applied by the user.
+.Pp
+The motion of the second wheel will be mapped to the buttons
+.Ar N3 ,
+for the negative direction, and
+.Ar N4 ,
+for the positive direction.
+If the buttons
+.Ar N3
+and
+.Ar N4
+actually exist in this mouse, their actions will not be detected.
+.Pp
+Note that horizontal movement or second roller/wheel movement may not
+always be detected,
+because there appears to be no accepted standard as to how it is encoded.
+.Pp
+Note also that some mice think left is the negative horizontal direction;
+others may think otherwise.
+Moreover, there are some mice whose two wheels are both mounted vertically,
+and the direction of the second vertical wheel does not match the
+first one.
+.El
+.Ss Multiple Mice
+The
+.Nm
+utility may operate in 2 different modes depending on the value of
+.Fl p
+option.
+When started with
+.Fl p Ar auto
+option specified the
+.Nm
+handles all recognized pointing devices in a single instance.
+Device hotplug is supported through
+.Xr devd 8 .
+Only evdev interface is available in this mode.
+When started with
+.Fl p Ar <selected_port>
+option specified the
+.Nm
+handles single device located at
+.Ar <selected_port> .
+Both evdev and
+.Xr sysmouse 4
+level 1 interfaces are available in this mode.
+Multiple
+.Nm
+instances may be run simultaneously.
+.Sh FILES
+.Bl -tag -width /var/run/moused.pid -compact
+.It Pa /dev/consolectl
+device to control the console
+.It Pa /dev/input/event%d
+Input event device
+.It Pa /dev/psm%d
+PS/2 mouse driver
+.It Pa /dev/sysmouse
+virtualized mouse driver
+.It Pa /dev/ums%d
+USB mouse driver
+.It Pa /var/run/moused.pid
+process id of the currently running
+.Nm
+utility
+.El
+.Sh EXAMPLES
+.Bd -literal -offset indent
+moused -p auto
+vidcontrol -m on
+.Ed
+.Pp
+Start
+.Nm
+utility to handle all evdev pointing devices automatically with hotplug
+support.
+And enable the mouse pointer in the text console after than.
+The daemon can be started without the
+.Fl p
+option as well.
+.Pp
+.Dl "moused -f -d -g -p /dev/input/event0"
+.Ed
+.Pp
+Start the mouse daemon on the
+.Pa /dev/input/event0
+in the exclusive foreground debug mode.
+Exclusive mode may disable mouse in Xorg session.
+.Pp
+.Dl "moused -p /dev/input/event0 -m 1=3 -m 3=1"
+.Pp
+Assign the physical button 3 (right button) to the logical button 1
+(logical left) and the physical button 1 (left) to the logical
+button 3 (logical right).
+This will effectively swap the left and right buttons.
+.Pp
+.Dl "moused -p /dev/input/event0 -z 4"
+.Pp
+Report negative Z axis movement (i.e., mouse wheel) as the button 4 pressed
+and positive Z axis movement (i.e., mouse wheel) as the button 5 pressed.
+.Pp
+If you add
+.Pp
+.Dl "ALL ALL = NOPASSWD: /usr/bin/killall -USR1 moused"
+.Pp
+to your
+.Pa /usr/local/etc/sudoers
+file, and bind
+.Pp
+.Dl "killall -USR1 moused"
+.Pp
+to a key in your window manager, you can suspend mouse events on your laptop if
+you keep brushing over the mouse pad while typing.
+.Sh SEE ALSO
+.Xr moused.conf 5 ,
+.Xr kill 1 ,
+.Xr vidcontrol 1 ,
+.Xr xset 1 ,
+.Xr keyboard 4 ,
+.Xr psm 4 ,
+.Xr sysmouse 4 ,
+.Xr ums 4 ,
+.Xr devd 8
+.Sh HISTORY
+The
+.Nm
+utility first appeared in
+.Fx 2.2 .
+It was rewriten to support multiple input event devices in
+.Fx 15.0 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+utility was originally written by
+.An Michael Smith Aq Mt msmith@FreeBSD.org .
+This manual page was written by
+.An Mike Pritchard Aq Mt mpp@FreeBSD.org .
+The command and manual page have since been updated by
+.An Kazutaka Yokota Aq Mt yokota@FreeBSD.org .
+Multiple input event devices support was added by
+.An Vladimir Kondratyev Aq Mt wulf@FreeBSD.org .
+.Sh CAVEATS
+Cut and paste functions in the virtual console assume that there
+are three buttons on the mouse.
+The logical button 1 (logical left) selects a region of text in the
+console and copies it to the cut buffer.
+The logical button 3 (logical right) extends the selected region.
+The logical button 2 (logical middle) pastes the selected text
+at the text cursor position.
+If the mouse has only two buttons, the middle, `paste' button
+is not available.
+To obtain the paste function, use the
+.Fl 3
+option to emulate the middle button, or use the
+.Fl m
+option to assign the physical right button to the logical middle button:
+.Dq Fl m Li 2=3 .
diff --git a/usr.sbin/moused/moused/moused.c b/usr.sbin/moused/moused/moused.c
new file mode 100644
index 000000000000..acd6e5223685
--- /dev/null
+++ b/usr.sbin/moused/moused/moused.c
@@ -0,0 +1,3205 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 1997-2000 Kazutaka YOKOTA <yokota@FreeBSD.org>
+ * Copyright (c) 2004-2008 Philip Paeps <philip@FreeBSD.org>
+ * Copyright (c) 2008 Jean-Sebastien Pedron <dumbbell@FreeBSD.org>
+ * Copyright (c) 2021,2024 Vladimir Kondratyev <wulf@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * MOUSED.C
+ *
+ * Mouse daemon : listens to a evdev device node for mouse data stream,
+ * interprets data and passes ioctls off to the console driver.
+ *
+ */
+
+#include <sys/param.h>
+#include <sys/consio.h>
+#include <sys/event.h>
+#include <sys/mouse.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/un.h>
+
+#include <dev/evdev/input.h>
+
+#include <bitstring.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <fnmatch.h>
+#include <libutil.h>
+#include <math.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <unistd.h>
+
+#include "util.h"
+#include "quirks.h"
+
+/*
+ * bitstr_t implementation must be identical to one found in EVIOCG*
+ * libevdev ioctls. Our bitstring(3) API is compatible since r299090.
+ */
+_Static_assert(sizeof(bitstr_t) == sizeof(unsigned long),
+ "bitstr_t size mismatch");
+
+#define MAX_CLICKTHRESHOLD 2000 /* 2 seconds */
+#define MAX_BUTTON2TIMEOUT 2000 /* 2 seconds */
+#define DFLT_CLICKTHRESHOLD 500 /* 0.5 second */
+#define DFLT_BUTTON2TIMEOUT 100 /* 0.1 second */
+#define DFLT_SCROLLTHRESHOLD 3 /* 3 pixels */
+#define DFLT_SCROLLSPEED 2 /* 2 pixels */
+#define DFLT_MOUSE_RESOLUTION 8 /* dpmm, == 200dpi */
+#define DFLT_TPAD_RESOLUTION 40 /* dpmm, typical X res for Synaptics */
+#define DFLT_LINEHEIGHT 10 /* pixels per line */
+
+/* Abort 3-button emulation delay after this many movement events. */
+#define BUTTON2_MAXMOVE 3
+
+#define MOUSE_XAXIS (-1)
+#define MOUSE_YAXIS (-2)
+
+#define ZMAP_MAXBUTTON 4 /* Number of zmap items */
+#define MAX_FINGERS 10
+
+#define ID_NONE 0
+#define ID_PORT 1
+#define ID_IF 2
+#define ID_TYPE 4
+#define ID_MODEL 8
+#define ID_ALL (ID_PORT | ID_IF | ID_TYPE | ID_MODEL)
+
+/* Operations on timespecs */
+#define tsclr(tvp) timespecclear(tvp)
+#define tscmp(tvp, uvp, cmp) timespeccmp(tvp, uvp, cmp)
+#define tssub(tvp, uvp, vvp) timespecsub(tvp, uvp, vvp)
+#define msec2ts(msec) (struct timespec) { \
+ .tv_sec = (msec) / 1000, \
+ .tv_nsec = (msec) % 1000 * 1000000, \
+}
+static inline struct timespec
+tsaddms(struct timespec* tsp, u_int ms)
+{
+ struct timespec ret;
+
+ ret = msec2ts(ms);
+ timespecadd(tsp, &ret, &ret);
+
+ return (ret);
+};
+
+static inline struct timespec
+tssubms(struct timespec* tsp, u_int ms)
+{
+ struct timespec ret;
+
+ ret = msec2ts(ms);
+ timespecsub(tsp, &ret, &ret);
+
+ return (ret);
+};
+
+#define debug(...) do { \
+ if (debug && nodaemon) \
+ warnx(__VA_ARGS__); \
+} while (0)
+
+#define logerr(e, ...) do { \
+ log_or_warn(LOG_DAEMON | LOG_ERR, errno, __VA_ARGS__); \
+ exit(e); \
+} while (0)
+
+#define logerrx(e, ...) do { \
+ log_or_warn(LOG_DAEMON | LOG_ERR, 0, __VA_ARGS__); \
+ exit(e); \
+} while (0)
+
+#define logwarn(...) \
+ log_or_warn(LOG_DAEMON | LOG_WARNING, errno, __VA_ARGS__)
+
+#define logwarnx(...) \
+ log_or_warn(LOG_DAEMON | LOG_WARNING, 0, __VA_ARGS__)
+
+/* structures */
+
+enum gesture {
+ GEST_IGNORE,
+ GEST_ACCUMULATE,
+ GEST_MOVE,
+ GEST_VSCROLL,
+ GEST_HSCROLL,
+};
+
+/* interfaces (the table must be ordered by DEVICE_IF_XXX in util.h) */
+static const struct {
+ const char *name;
+ size_t p_size;
+} rifs[] = {
+ [DEVICE_IF_EVDEV] = { "evdev", sizeof(struct input_event) },
+ [DEVICE_IF_SYSMOUSE] = { "sysmouse", MOUSE_SYS_PACKETSIZE },
+};
+
+/* types (the table must be ordered by DEVICE_TYPE_XXX in util.h) */
+static const char *rnames[] = {
+ [DEVICE_TYPE_MOUSE] = "mouse",
+ [DEVICE_TYPE_POINTINGSTICK] = "pointing stick",
+ [DEVICE_TYPE_TOUCHPAD] = "touchpad",
+ [DEVICE_TYPE_TOUCHSCREEN] = "touchscreen",
+ [DEVICE_TYPE_TABLET] = "tablet",
+ [DEVICE_TYPE_TABLET_PAD] = "tablet pad",
+ [DEVICE_TYPE_KEYBOARD] = "keyboard",
+ [DEVICE_TYPE_JOYSTICK] = "joystick",
+};
+
+/* Default phisical to logical button mapping */
+static const u_int default_p2l[MOUSE_MAXBUTTON] = {
+ MOUSE_BUTTON1DOWN, MOUSE_BUTTON2DOWN, MOUSE_BUTTON3DOWN, MOUSE_BUTTON4DOWN,
+ MOUSE_BUTTON5DOWN, MOUSE_BUTTON6DOWN, MOUSE_BUTTON7DOWN, MOUSE_BUTTON8DOWN,
+ 0x00000100, 0x00000200, 0x00000400, 0x00000800,
+ 0x00001000, 0x00002000, 0x00004000, 0x00008000,
+ 0x00010000, 0x00020000, 0x00040000, 0x00080000,
+ 0x00100000, 0x00200000, 0x00400000, 0x00800000,
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000,
+};
+
+struct tpcaps {
+ bool is_clickpad;
+ bool is_topbuttonpad;
+ bool is_mt;
+ bool cap_touch;
+ bool cap_pressure;
+ bool cap_width;
+ int min_x;
+ int max_x;
+ int min_y;
+ int max_y;
+ int res_x; /* dots per mm */
+ int res_y; /* dots per mm */
+ int min_p;
+ int max_p;
+};
+
+struct tpinfo {
+ bool two_finger_scroll; /* Enable two finger scrolling */
+ bool natural_scroll; /* Enable natural scrolling */
+ bool three_finger_drag; /* Enable dragging with three fingers */
+ u_int min_pressure_hi; /* Min pressure to start an action */
+ u_int min_pressure_lo; /* Min pressure to continue an action */
+ u_int max_pressure; /* Maximum pressure to detect palm */
+ u_int max_width; /* Max finger width to detect palm */
+ int margin_top; /* Top margin */
+ int margin_right; /* Right margin */
+ int margin_bottom; /* Bottom margin */
+ int margin_left; /* Left margin */
+ u_int tap_timeout; /* */
+ u_int tap_threshold; /* Minimum pressure to detect a tap */
+ double tap_max_delta; /* Length of segments above which a tap is ignored */
+ u_int taphold_timeout; /* Maximum elapsed time between two taps to consider a tap-hold action */
+ double vscroll_ver_area; /* Area reserved for vertical virtual scrolling */
+ double vscroll_hor_area; /* Area reserved for horizontal virtual scrolling */
+ double vscroll_min_delta; /* Minimum movement to consider virtual scrolling */
+ int softbuttons_y; /* Vertical size of softbuttons area */
+ int softbutton2_x; /* Horizontal offset of 2-nd softbutton left edge */
+ int softbutton3_x; /* Horizontal offset of 3-rd softbutton left edge */
+};
+
+struct tpstate {
+ int start_x;
+ int start_y;
+ int prev_x;
+ int prev_y;
+ int prev_nfingers;
+ int fingers_nb;
+ int tap_button;
+ bool fingerdown;
+ bool in_taphold;
+ int in_vscroll;
+ u_int zmax; /* maximum pressure value */
+ struct timespec taptimeout; /* tap timeout for touchpads */
+ int idletimeout;
+ bool timer_armed;
+};
+
+struct tpad {
+ struct tpcaps hw; /* touchpad capabilities */
+ struct tpinfo info; /* touchpad gesture parameters */
+ struct tpstate gest; /* touchpad gesture state */
+};
+
+struct finger {
+ int x;
+ int y;
+ int p;
+ int w;
+ int id; /* id=0 - no touch, id>1 - touch id */
+};
+
+struct evstate {
+ int buttons;
+ /* Relative */
+ int dx;
+ int dy;
+ int dz;
+ int dw;
+ int acc_dx;
+ int acc_dy;
+ /* Absolute single-touch */
+ int nfingers;
+ struct finger st;
+ /* Absolute multi-touch */
+ int slot;
+ struct finger mt[MAX_FINGERS];
+ bitstr_t bit_decl(key_ignore, KEY_CNT);
+ bitstr_t bit_decl(rel_ignore, REL_CNT);
+ bitstr_t bit_decl(abs_ignore, ABS_CNT);
+ bitstr_t bit_decl(prop_ignore, INPUT_PROP_CNT);
+};
+
+/* button status */
+struct button_state {
+ int count; /* 0: up, 1: single click, 2: double click,... */
+ struct timespec ts; /* timestamp on the last button event */
+};
+
+struct btstate {
+ u_int wmode; /* wheel mode button number */
+ u_int clickthreshold; /* double click speed in msec */
+ struct button_state bstate[MOUSE_MAXBUTTON]; /* button state */
+ struct button_state *mstate[MOUSE_MAXBUTTON];/* mapped button st.*/
+ u_int p2l[MOUSE_MAXBUTTON];/* phisical to logical button mapping */
+ int zmap[ZMAP_MAXBUTTON];/* MOUSE_{X|Y}AXIS or a button number */
+ struct button_state zstate[ZMAP_MAXBUTTON]; /* Z/W axis state */
+};
+
+/* state machine for 3 button emulation */
+
+enum bt3_emul_state {
+ S0, /* start */
+ S1, /* button 1 delayed down */
+ S2, /* button 3 delayed down */
+ S3, /* both buttons down -> button 2 down */
+ S4, /* button 1 delayed up */
+ S5, /* button 1 down */
+ S6, /* button 3 down */
+ S7, /* both buttons down */
+ S8, /* button 3 delayed up */
+ S9, /* button 1 or 3 up after S3 */
+};
+
+#define A(b1, b3) (((b1) ? 2 : 0) | ((b3) ? 1 : 0))
+#define A_TIMEOUT 4
+#define S_DELAYED(st) (states[st].s[A_TIMEOUT] != (st))
+
+static const struct {
+ enum bt3_emul_state s[A_TIMEOUT + 1];
+ int buttons;
+ int mask;
+ bool timeout;
+} states[10] = {
+ /* S0 */
+ { { S0, S2, S1, S3, S0 }, 0, ~(MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN), false },
+ /* S1 */
+ { { S4, S2, S1, S3, S5 }, 0, ~MOUSE_BUTTON1DOWN, false },
+ /* S2 */
+ { { S8, S2, S1, S3, S6 }, 0, ~MOUSE_BUTTON3DOWN, false },
+ /* S3 */
+ { { S0, S9, S9, S3, S3 }, MOUSE_BUTTON2DOWN, ~0, false },
+ /* S4 */
+ { { S0, S2, S1, S3, S0 }, MOUSE_BUTTON1DOWN, ~0, true },
+ /* S5 */
+ { { S0, S2, S5, S7, S5 }, MOUSE_BUTTON1DOWN, ~0, false },
+ /* S6 */
+ { { S0, S6, S1, S7, S6 }, MOUSE_BUTTON3DOWN, ~0, false },
+ /* S7 */
+ { { S0, S6, S5, S7, S7 }, MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN, ~0, false },
+ /* S8 */
+ { { S0, S2, S1, S3, S0 }, MOUSE_BUTTON3DOWN, ~0, true },
+ /* S9 */
+ { { S0, S9, S9, S3, S9 }, 0, ~(MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN), false },
+};
+
+struct e3bstate {
+ bool enabled;
+ u_int button2timeout; /* 3 button emulation timeout */
+ enum bt3_emul_state mouse_button_state;
+ struct timespec mouse_button_state_ts;
+ int mouse_move_delayed;
+ bool timer_armed;
+};
+
+enum scroll_state {
+ SCROLL_NOTSCROLLING,
+ SCROLL_PREPARE,
+ SCROLL_SCROLLING,
+};
+
+struct scroll {
+ bool enable_vert;
+ bool enable_hor;
+ u_int threshold; /* Movement distance before virtual scrolling */
+ u_int speed; /* Movement distance to rate of scrolling */
+ enum scroll_state state;
+ int movement;
+ int hmovement;
+};
+
+struct drift_xy {
+ int x;
+ int y;
+};
+struct drift {
+ u_int distance; /* max steps X+Y */
+ u_int time; /* ms */
+ struct timespec time_ts;
+ struct timespec twotime_ts; /* 2*drift_time */
+ u_int after; /* ms */
+ struct timespec after_ts;
+ bool terminate;
+ struct timespec current_ts;
+ struct timespec last_activity;
+ struct timespec since;
+ struct drift_xy last; /* steps in last drift_time */
+ struct drift_xy previous; /* steps in prev. drift_time */
+};
+
+struct accel {
+ bool is_exponential; /* Exponential acceleration is enabled */
+ double accelx; /* Acceleration in the X axis */
+ double accely; /* Acceleration in the Y axis */
+ double accelz; /* Acceleration in the wheel axis */
+ double expoaccel; /* Exponential acceleration */
+ double expoffset; /* Movement offset for exponential accel. */
+ double remainx; /* Remainder on X, Y and wheel axis, ... */
+ double remainy; /* ... respectively to compensate */
+ double remainz; /* ... for rounding errors. */
+ double lastlength[3];
+};
+
+struct rodent {
+ struct device dev; /* Device */
+ int mfd; /* mouse file descriptor */
+ struct btstate btstate; /* button status */
+ struct e3bstate e3b; /* 3 button emulation state */
+ struct drift drift;
+ struct accel accel; /* cursor acceleration state */
+ struct scroll scroll; /* virtual scroll state */
+ struct tpad tp; /* touchpad info and gesture state */
+ struct evstate ev; /* event device state */
+ SLIST_ENTRY(rodent) next;
+};
+
+/* global variables */
+
+static SLIST_HEAD(rodent_list, rodent) rodents = SLIST_HEAD_INITIALIZER();
+
+static int debug = 0;
+static bool nodaemon = false;
+static bool background = false;
+static bool paused = false;
+static bool opt_grab = false;
+static int identify = ID_NONE;
+static int cfd = -1; /* /dev/consolectl file descriptor */
+static int kfd = -1; /* kqueue file descriptor */
+static int dfd = -1; /* devd socket descriptor */
+static const char *portname = NULL;
+static const char *pidfile = "/var/run/moused.pid";
+static struct pidfh *pfh;
+#ifndef CONFDIR
+#define CONFDIR "/etc"
+#endif
+static const char *config_file = CONFDIR "/moused.conf";
+#ifndef QUIRKSDIR
+#define QUIRKSDIR "/usr/share/moused"
+#endif
+static const char *quirks_path = QUIRKSDIR;
+static struct quirks_context *quirks;
+
+static int opt_rate = 0;
+static int opt_resolution = MOUSE_RES_UNKNOWN;
+
+static u_int opt_wmode = 0;
+static int opt_clickthreshold = -1;
+static bool opt_e3b_enabled = false;
+static int opt_e3b_button2timeout = -1;
+static struct btstate opt_btstate;
+
+static bool opt_drift_terminate = false;
+static u_int opt_drift_distance = 4; /* max steps X+Y */
+static u_int opt_drift_time = 500; /* ms */
+static u_int opt_drift_after = 4000; /* ms */
+
+static double opt_accelx = 1.0;
+static double opt_accely = 1.0;
+static bool opt_exp_accel = false;
+static double opt_expoaccel = 1.0;
+static double opt_expoffset = 1.0;
+
+static bool opt_virtual_scroll = false;
+static bool opt_hvirtual_scroll = false;
+static int opt_scroll_speed = -1;
+static int opt_scroll_threshold = -1;
+
+static jmp_buf env;
+
+/* function prototypes */
+
+static moused_log_handler log_or_warn_va;
+
+static void linacc(struct accel *, int, int, int, int*, int*, int*);
+static void expoacc(struct accel *, int, int, int, int*, int*, int*);
+static void moused(void);
+static void reset(int sig);
+static void pause_mouse(int sig);
+static int connect_devd(void);
+static void fetch_and_parse_devd(void);
+static void usage(void);
+static void log_or_warn(int log_pri, int errnum, const char *fmt, ...)
+ __printflike(3, 4);
+
+static int r_daemon(void);
+static enum device_if r_identify_if(int fd);
+static enum device_type r_identify_evdev(int fd);
+static enum device_type r_identify_sysmouse(int fd);
+static const char *r_if(enum device_if type);
+static const char *r_name(enum device_type type);
+static struct rodent *r_init(const char *path);
+static void r_init_all(void);
+static void r_deinit(struct rodent *r);
+static void r_deinit_all(void);
+static int r_protocol_evdev(enum device_type type, struct tpad *tp,
+ struct evstate *ev, struct input_event *ie,
+ mousestatus_t *act);
+static int r_protocol_sysmouse(uint8_t *pBuf, mousestatus_t *act);
+static void r_vscroll_detect(struct rodent *r, struct scroll *sc,
+ mousestatus_t *act);
+static void r_vscroll(struct scroll *sc, mousestatus_t *act);
+static int r_statetrans(struct rodent *r, mousestatus_t *a1,
+ mousestatus_t *a2, int trans);
+static bool r_installmap(char *arg, struct btstate *bt);
+static char * r_installzmap(char **argv, int argc, int* idx, struct btstate *bt);
+static void r_map(mousestatus_t *act1, mousestatus_t *act2,
+ struct btstate *bt);
+static void r_timestamp(mousestatus_t *act, struct btstate *bt,
+ struct e3bstate *e3b, struct drift *drift);
+static bool r_timeout(struct e3bstate *e3b);
+static void r_move(mousestatus_t *act, struct accel *acc);
+static void r_click(mousestatus_t *act, struct btstate *bt);
+static bool r_drift(struct drift *, mousestatus_t *);
+static enum gesture r_gestures(struct tpad *tp, int x0, int y0, u_int z, int w,
+ int nfingers, struct timespec *time, mousestatus_t *ms);
+
+int
+main(int argc, char *argv[])
+{
+ struct rodent *r;
+ pid_t mpid;
+ int c;
+ int i;
+ u_long ul;
+ char *errstr;
+
+ while ((c = getopt(argc, argv, "3A:C:E:F:HI:L:T:VU:a:dfghi:l:m:p:r:t:q:w:z:")) != -1) {
+ switch(c) {
+
+ case '3':
+ opt_e3b_enabled = true;
+ break;
+
+ case 'E':
+ errno = 0;
+ ul = strtoul(optarg, NULL, 10);
+ if ((ul == 0 && errno != 0) ||
+ ul > MAX_BUTTON2TIMEOUT) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ opt_e3b_button2timeout = ul;
+ break;
+
+ case 'a':
+ i = sscanf(optarg, "%lf,%lf", &opt_accelx, &opt_accely);
+ if (i == 0) {
+ warnx("invalid linear acceleration argument "
+ "'%s'", optarg);
+ usage();
+ }
+ if (i == 1)
+ opt_accely = opt_accelx;
+ break;
+
+ case 'A':
+ opt_exp_accel = true;
+ i = sscanf(optarg, "%lf,%lf", &opt_expoaccel,
+ &opt_expoffset);
+ if (i == 0) {
+ warnx("invalid exponential acceleration "
+ "argument '%s'", optarg);
+ usage();
+ }
+ if (i == 1)
+ opt_expoffset = 1.0;
+ break;
+
+ case 'd':
+ ++debug;
+ break;
+
+ case 'f':
+ nodaemon = true;
+ break;
+
+ case 'g':
+ opt_grab = true;
+ break;
+
+ case 'i':
+ if (strcmp(optarg, "all") == 0)
+ identify = ID_ALL;
+ else if (strcmp(optarg, "port") == 0)
+ identify = ID_PORT;
+ else if (strcmp(optarg, "if") == 0)
+ identify = ID_IF;
+ else if (strcmp(optarg, "type") == 0)
+ identify = ID_TYPE;
+ else if (strcmp(optarg, "model") == 0)
+ identify = ID_MODEL;
+ else {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ nodaemon = true;
+ break;
+
+ case 'l':
+ ul = strtoul(optarg, NULL, 10);
+ if (ul != 1)
+ warnx("ignore mouse level `%s'", optarg);
+ break;
+
+ case 'm':
+ if (!r_installmap(optarg, &opt_btstate)) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ break;
+
+ case 'p':
+ /* "auto" is an alias to no portname */
+ if (strcmp(optarg, "auto") != 0)
+ portname = optarg;
+ break;
+
+ case 'r':
+ if (strcmp(optarg, "high") == 0)
+ opt_resolution = MOUSE_RES_HIGH;
+ else if (strcmp(optarg, "medium-high") == 0)
+ opt_resolution = MOUSE_RES_HIGH;
+ else if (strcmp(optarg, "medium-low") == 0)
+ opt_resolution = MOUSE_RES_MEDIUMLOW;
+ else if (strcmp(optarg, "low") == 0)
+ opt_resolution = MOUSE_RES_LOW;
+ else if (strcmp(optarg, "default") == 0)
+ opt_resolution = MOUSE_RES_DEFAULT;
+ else {
+ ul= strtoul(optarg, NULL, 10);
+ if (ul == 0) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ opt_resolution = ul;
+ }
+ break;
+
+ case 't':
+ if (strcmp(optarg, "auto") != 0)
+ warnx("ignore mouse type `%s'", optarg);
+ break;
+
+ case 'w':
+ ul = strtoul(optarg, NULL, 10);
+ if (ul == 0 || ul > MOUSE_MAXBUTTON) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ opt_wmode = ul;
+ break;
+
+ case 'z':
+ --optind;
+ errstr = r_installzmap(argv, argc, &optind, &opt_btstate);
+ if (errstr != NULL) {
+ warnx("%s", errstr);
+ free(errstr);
+ usage();
+ }
+ break;
+
+ case 'C':
+ ul = strtoul(optarg, NULL, 10);
+ if (ul > MAX_CLICKTHRESHOLD) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ opt_clickthreshold = ul;
+ break;
+
+ case 'F':
+ ul = strtoul(optarg, NULL, 10);
+ if (ul == 0) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ opt_rate = ul;
+ break;
+
+ case 'H':
+ opt_hvirtual_scroll = true;
+ break;
+
+ case 'I':
+ pidfile = optarg;
+ break;
+
+ case 'L':
+ errno = 0;
+ ul = strtoul(optarg, NULL, 10);
+ if ((ul == 0 && errno != 0) || ul > INT_MAX) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ opt_scroll_speed = ul;
+ break;
+
+ case 'q':
+ config_file = optarg;
+ break;
+
+ case 'Q':
+ quirks_path = optarg;
+ break;
+
+ case 'T':
+ opt_drift_terminate = true;
+ sscanf(optarg, "%u,%u,%u", &opt_drift_distance,
+ &opt_drift_time, &opt_drift_after);
+ if (opt_drift_distance == 0 ||
+ opt_drift_time == 0 ||
+ opt_drift_after == 0) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ break;
+
+ case 'V':
+ opt_virtual_scroll = true;
+ break;
+
+ case 'U':
+ errno = 0;
+ ul = strtoul(optarg, NULL, 10);
+ if ((ul == 0 && errno != 0) || ul > INT_MAX) {
+ warnx("invalid argument `%s'", optarg);
+ usage();
+ }
+ opt_scroll_threshold = ul;
+ break;
+
+ case 'h':
+ case '?':
+ default:
+ usage();
+ }
+ }
+
+ if ((cfd = open("/dev/consolectl", O_RDWR, 0)) == -1)
+ logerr(1, "cannot open /dev/consolectl");
+ if ((kfd = kqueue()) == -1)
+ logerr(1, "cannot create kqueue");
+ if (portname == NULL && (dfd = connect_devd()) == -1)
+ logwarnx("cannot open devd socket");
+
+ switch (setjmp(env)) {
+ case SIGHUP:
+ quirks_context_unref(quirks);
+ r_deinit_all();
+ /* FALLTHROUGH */
+ case 0:
+ break;
+ case SIGINT:
+ case SIGQUIT:
+ case SIGTERM:
+ exit(0);
+ /* NOT REACHED */
+ default:
+ goto out;
+ }
+
+ signal(SIGHUP , reset);
+ signal(SIGINT , reset);
+ signal(SIGQUIT, reset);
+ signal(SIGTERM, reset);
+ signal(SIGUSR1, pause_mouse);
+
+ quirks = quirks_init_subsystem(quirks_path, config_file,
+ log_or_warn_va,
+ background ? QLOG_MOUSED_LOGGING : QLOG_CUSTOM_LOG_PRIORITIES);
+ if (quirks == NULL)
+ logwarnx("cannot open configuration file %s", config_file);
+
+ if (portname == NULL) {
+ r_init_all();
+ } else {
+ if ((r = r_init(portname)) == NULL)
+ logerrx(1, "Can not initialize device");
+ }
+
+ /* print some information */
+ if (identify != ID_NONE) {
+ SLIST_FOREACH(r, &rodents, next) {
+ if (identify == ID_ALL)
+ printf("%s %s %s %s\n",
+ r->dev.path, r_if(r->dev.iftype),
+ r_name(r->dev.type), r->dev.name);
+ else if (identify & ID_PORT)
+ printf("%s\n", r->dev.path);
+ else if (identify & ID_IF)
+ printf("%s\n", r_if(r->dev.iftype));
+ else if (identify & ID_TYPE)
+ printf("%s\n", r_name(r->dev.type));
+ else if (identify & ID_MODEL)
+ printf("%s\n", r->dev.name);
+ }
+ exit(0);
+ }
+
+ if (!nodaemon && !background) {
+ pfh = pidfile_open(pidfile, 0600, &mpid);
+ if (pfh == NULL) {
+ if (errno == EEXIST)
+ logerrx(1, "moused already running, pid: %d", mpid);
+ logwarn("cannot open pid file");
+ }
+ if (r_daemon()) {
+ int saved_errno = errno;
+ pidfile_remove(pfh);
+ errno = saved_errno;
+ logerr(1, "failed to become a daemon");
+ } else {
+ background = true;
+ pidfile_write(pfh);
+ }
+ }
+
+ moused();
+
+out:
+ quirks_context_unref(quirks);
+
+ r_deinit_all();
+ if (dfd != -1)
+ close(dfd);
+ if (kfd != -1)
+ close(kfd);
+ if (cfd != -1)
+ close(cfd);
+
+ exit(0);
+}
+
+/*
+ * Function to calculate linear acceleration.
+ *
+ * If there are any rounding errors, the remainder
+ * is stored in the remainx and remainy variables
+ * and taken into account upon the next movement.
+ */
+
+static void
+linacc(struct accel *acc, int dx, int dy, int dz,
+ int *movex, int *movey, int *movez)
+{
+ double fdx, fdy, fdz;
+
+ if (dx == 0 && dy == 0 && dz == 0) {
+ *movex = *movey = *movez = 0;
+ return;
+ }
+ fdx = dx * acc->accelx + acc->remainx;
+ fdy = dy * acc->accely + acc->remainy;
+ fdz = dz * acc->accelz + acc->remainz;
+ *movex = lround(fdx);
+ *movey = lround(fdy);
+ *movez = lround(fdz);
+ acc->remainx = fdx - *movex;
+ acc->remainy = fdy - *movey;
+ acc->remainz = fdz - *movez;
+}
+
+/*
+ * Function to calculate exponential acceleration.
+ * (Also includes linear acceleration if enabled.)
+ *
+ * In order to give a smoother behaviour, we record the four
+ * most recent non-zero movements and use their average value
+ * to calculate the acceleration.
+ */
+
+static void
+expoacc(struct accel *acc, int dx, int dy, int dz,
+ int *movex, int *movey, int *movez)
+{
+ double fdx, fdy, fdz, length, lbase, accel;
+
+ if (dx == 0 && dy == 0 && dz == 0) {
+ *movex = *movey = *movez = 0;
+ return;
+ }
+ fdx = dx * acc->accelx;
+ fdy = dy * acc->accely;
+ fdz = dz * acc->accelz;
+ length = sqrt((fdx * fdx) + (fdy * fdy)); /* Pythagoras */
+ length = (length + acc->lastlength[0] + acc->lastlength[1] +
+ acc->lastlength[2]) / 4;
+ lbase = length / acc->expoffset;
+ accel = pow(lbase, acc->expoaccel) / lbase;
+ fdx = fdx * accel + acc->remainx;
+ fdy = fdy * accel + acc->remainy;
+ *movex = lround(fdx);
+ *movey = lround(fdy);
+ *movez = lround(fdz);
+ acc->remainx = fdx - *movex;
+ acc->remainy = fdy - *movey;
+ acc->remainz = fdz - *movez;
+ acc->lastlength[2] = acc->lastlength[1];
+ acc->lastlength[1] = acc->lastlength[0];
+ /* Insert new average, not original length! */
+ acc->lastlength[0] = length;
+}
+
+static void
+moused(void)
+{
+ struct rodent *r = NULL;
+ mousestatus_t action0; /* original mouse action */
+ mousestatus_t action; /* interim buffer */
+ mousestatus_t action2; /* mapped action */
+ struct kevent ke[3];
+ int nchanges;
+ union {
+ struct input_event ie;
+ uint8_t se[MOUSE_SYS_PACKETSIZE];
+ } b;
+ size_t b_size;
+ ssize_t r_size;
+ int flags;
+ int c;
+
+ /* clear mouse data */
+ bzero(&action0, sizeof(action0));
+ bzero(&action, sizeof(action));
+ bzero(&action2, sizeof(action2));
+ /* process mouse data */
+ for (;;) {
+
+ if (dfd == -1 && portname == NULL)
+ dfd = connect_devd();
+ nchanges = 0;
+ if (r != NULL && r->e3b.enabled &&
+ S_DELAYED(r->e3b.mouse_button_state)) {
+ EV_SET(ke + nchanges, r->mfd << 1, EVFILT_TIMER,
+ EV_ADD | EV_ENABLE | EV_DISPATCH, 0, 20, r);
+ nchanges++;
+ r->e3b.timer_armed = true;
+ }
+ if (r != NULL && r->tp.gest.idletimeout > 0) {
+ EV_SET(ke + nchanges, r->mfd << 1 | 1, EVFILT_TIMER,
+ EV_ADD | EV_ENABLE | EV_DISPATCH,
+ 0, r->tp.gest.idletimeout, r);
+ nchanges++;
+ r->tp.gest.timer_armed = true;
+ }
+ if (dfd == -1 && nchanges == 0 && portname == NULL) {
+ EV_SET(ke + nchanges, UINTPTR_MAX, EVFILT_TIMER,
+ EV_ADD | EV_ENABLE | EV_ONESHOT, 0, 1000, NULL);
+ nchanges++;
+ }
+
+ if (!(r != NULL && r->tp.gest.idletimeout == 0)) {
+ c = kevent(kfd, ke, nchanges, ke, 1, NULL);
+ if (c <= 0) { /* error */
+ logwarn("failed to read from mouse");
+ continue;
+ }
+ } else
+ c = 0;
+ /* Devd event */
+ if (c > 0 && ke[0].udata == NULL) {
+ if (ke[0].filter == EVFILT_READ) {
+ if ((ke[0].flags & EV_EOF) != 0) {
+ logwarn("devd connection is closed");
+ close(dfd);
+ dfd = -1;
+ } else
+ fetch_and_parse_devd();
+ } else if (ke[0].filter == EVFILT_TIMER) {
+ /* DO NOTHING */
+ }
+ continue;
+ }
+ if (c > 0)
+ r = ke[0].udata;
+ /* E3B timeout */
+ if (c > 0 && ke[0].filter == EVFILT_TIMER &&
+ (ke[0].ident & 1) == 0) {
+ /* assert(rodent.flags & Emulate3Button) */
+ action0.button = action0.obutton;
+ action0.dx = action0.dy = action0.dz = 0;
+ action0.flags = flags = 0;
+ r->e3b.timer_armed = false;
+ if (r_timeout(&r->e3b) &&
+ r_statetrans(r, &action0, &action, A_TIMEOUT)) {
+ if (debug > 2)
+ debug("flags:%08x buttons:%08x obuttons:%08x",
+ action.flags, action.button, action.obutton);
+ } else {
+ action0.obutton = action0.button;
+ continue;
+ }
+ } else {
+ /* mouse movement */
+ if (c > 0 && ke[0].filter == EVFILT_READ) {
+ b_size = rifs[r->dev.iftype].p_size;
+ r_size = read(r->mfd, &b, b_size);
+ if (r_size == -1) {
+ if (errno == EWOULDBLOCK)
+ continue;
+ else if (portname == NULL) {
+ r_deinit(r);
+ r = NULL;
+ continue;
+ } else
+ return;
+ }
+ if (r_size != (ssize_t)b_size) {
+ logwarn("Short read from mouse: "
+ "%zd bytes", r_size);
+ continue;
+ }
+ /* Disarm nonexpired timers */
+ nchanges = 0;
+ if (r->e3b.timer_armed) {
+ EV_SET(ke + nchanges, r->mfd << 1,
+ EVFILT_TIMER, EV_DISABLE, 0, 0, r);
+ nchanges++;
+ r->e3b.timer_armed = false;
+ }
+ if (r->tp.gest.timer_armed) {
+ EV_SET(ke + nchanges, r->mfd << 1 | 1,
+ EVFILT_TIMER, EV_DISABLE, 0, 0, r);
+ nchanges++;
+ r->tp.gest.timer_armed = false;
+ }
+ if (nchanges != 0)
+ kevent(kfd, ke, nchanges, NULL, 0, NULL);
+ } else {
+ /*
+ * Gesture timeout expired.
+ * Notify r_gestures by empty packet.
+ */
+#ifdef DONE_RIGHT
+ struct timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ b.ie.time.tv_sec = ts.tv_sec;
+ b.ie.time.tv_usec = ts.tv_nsec / 1000;
+#else
+ /* Hacky but cheap */
+ b.ie.time.tv_sec =
+ r->tp.gest.idletimeout == 0 ? 0 : LONG_MAX;
+ b.ie.time.tv_usec = 0;
+#endif
+ b.ie.type = EV_SYN;
+ b.ie.code = SYN_REPORT;
+ b.ie.value = 1;
+ if (c > 0)
+ r->tp.gest.timer_armed = false;
+ }
+ r->tp.gest.idletimeout = -1;
+ flags = r->dev.iftype == DEVICE_IF_EVDEV ?
+ r_protocol_evdev(r->dev.type,
+ &r->tp, &r->ev, &b.ie, &action0) :
+ r_protocol_sysmouse(b.se, &action0);
+ if (flags == 0)
+ continue;
+
+ if (r->scroll.enable_vert || r->scroll.enable_hor) {
+ if (action0.button == MOUSE_BUTTON2DOWN) {
+ debug("[BUTTON2] flags:%08x buttons:%08x obuttons:%08x",
+ action.flags, action.button, action.obutton);
+ } else {
+ debug("[NOTBUTTON2] flags:%08x buttons:%08x obuttons:%08x",
+ action.flags, action.button, action.obutton);
+ }
+ r_vscroll_detect(r, &r->scroll, &action0);
+ }
+
+ r_timestamp(&action0, &r->btstate, &r->e3b, &r->drift);
+ r_statetrans(r, &action0, &action,
+ A(action0.button & MOUSE_BUTTON1DOWN,
+ action0.button & MOUSE_BUTTON3DOWN));
+ debug("flags:%08x buttons:%08x obuttons:%08x", action.flags,
+ action.button, action.obutton);
+ }
+ action0.obutton = action0.button;
+ flags &= MOUSE_POSCHANGED;
+ flags |= action.obutton ^ action.button;
+ action.flags = flags;
+
+ if (flags == 0)
+ continue;
+
+ /* handler detected action */
+ r_map(&action, &action2, &r->btstate);
+ debug("activity : buttons 0x%08x dx %d dy %d dz %d",
+ action2.button, action2.dx, action2.dy, action2.dz);
+
+ if (r->scroll.enable_vert || r->scroll.enable_hor) {
+ /*
+ * If *only* the middle button is pressed AND we are moving
+ * the stick/trackpoint/nipple, scroll!
+ */
+ r_vscroll(&r->scroll, &action2);
+ }
+
+ if (r->drift.terminate) {
+ if ((flags & MOUSE_POSCHANGED) == 0 ||
+ action.dz || action2.dz)
+ r->drift.last_activity = r->drift.current_ts;
+ else {
+ if (r_drift (&r->drift, &action2))
+ continue;
+ }
+ }
+
+ /* Defer clicks until we aren't VirtualScroll'ing. */
+ if (r->scroll.state == SCROLL_NOTSCROLLING)
+ r_click(&action2, &r->btstate);
+
+ if (action2.flags & MOUSE_POSCHANGED)
+ r_move(&action2, &r->accel);
+
+ /*
+ * If the Z axis movement is mapped to an imaginary physical
+ * button, we need to cook up a corresponding button `up' event
+ * after sending a button `down' event.
+ */
+ if ((r->btstate.zmap[0] > 0) && (action.dz != 0)) {
+ action.obutton = action.button;
+ action.dx = action.dy = action.dz = 0;
+ r_map(&action, &action2, &r->btstate);
+ debug("activity : buttons 0x%08x dx %d dy %d dz %d",
+ action2.button, action2.dx, action2.dy, action2.dz);
+
+ r_click(&action2, &r->btstate);
+ }
+ }
+ /* NOT REACHED */
+}
+
+static void
+reset(int sig)
+{
+ longjmp(env, sig);
+}
+
+static void
+pause_mouse(__unused int sig)
+{
+ paused = !paused;
+}
+
+static int
+connect_devd(void)
+{
+ static const struct sockaddr_un sa = {
+ .sun_family = AF_UNIX,
+ .sun_path = "/var/run/devd.seqpacket.pipe",
+ };
+ struct kevent kev;
+ int fd;
+
+ fd = socket(AF_UNIX, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
+ if (fd < 0)
+ return (-1);
+ if (connect(fd, (const struct sockaddr *) &sa, sizeof(sa)) < 0) {
+ close(fd);
+ return (-1);
+ }
+ EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, 0);
+ if (kevent(kfd, &kev, 1, NULL, 0, NULL) < 0) {
+ close(fd);
+ return (-1);
+ }
+
+ return (fd);
+}
+
+static void
+fetch_and_parse_devd(void)
+{
+ char ev[1024];
+ char path[22] = "/dev/";
+ char *cdev, *cr;
+ ssize_t len;
+
+ if ((len = recv(dfd, ev, sizeof(ev), MSG_WAITALL)) <= 0) {
+ close(dfd);
+ dfd = -1;
+ return;
+ }
+
+ if (ev[0] != '!')
+ return;
+ if (strnstr(ev, "system=DEVFS", len) == NULL)
+ return;
+ if (strnstr(ev, "subsystem=CDEV", len) == NULL)
+ return;
+ if (strnstr(ev, "type=CREATE", len) == NULL)
+ return;
+ if ((cdev = strnstr(ev, "cdev=input/event", len)) == NULL)
+ return;
+ cr = strchr(cdev, '\n');
+ if (cr != NULL)
+ *cr = '\0';
+ cr = strchr(cdev, ' ');
+ if (cr != NULL)
+ *cr = '\0';
+ strncpy(path + 5, cdev + 5, 17);
+ (void)r_init(path);
+ return;
+}
+
+/*
+ * usage
+ *
+ * Complain, and free the CPU for more worthy tasks
+ */
+static void
+usage(void)
+{
+ fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
+ "usage: moused [-dfg] [-I file] [-F rate] [-r resolution]",
+ " [-VH [-U threshold]] [-a X[,Y]] [-C threshold] [-m N=M] [-w N]",
+ " [-z N] [-t <mousetype>] [-l level] [-3 [-E timeout]]",
+ " [-T distance[,time[,after]]] -p <port> [-q config] [-Q quirks]",
+ " moused [-d] -i <port|if|type|model|all> -p <port>");
+ exit(1);
+}
+
+/*
+ * Output an error message to syslog or stderr as appropriate. If
+ * `errnum' is non-zero, append its string form to the message.
+ */
+static void
+log_or_warn_va(int log_pri, int errnum, const char *fmt, va_list ap)
+{
+ char buf[256];
+ size_t len;
+
+ if (debug == 0 && log_pri > LOG_ERR)
+ return;
+
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+
+ /* Strip trailing line-feed appended by quirk subsystem */
+ len = strlen(buf);
+ if (len != 0 && buf[len - 1] == '\n')
+ buf[len - 1] = '\0';
+
+ if (errnum) {
+ strlcat(buf, ": ", sizeof(buf));
+ strlcat(buf, strerror(errnum), sizeof(buf));
+ }
+
+ if (background)
+ syslog(log_pri, "%s", buf);
+ else
+ warnx("%s", buf);
+}
+
+static void
+log_or_warn(int log_pri, int errnum, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ log_or_warn_va(log_pri, errnum, fmt, ap);
+ va_end(ap);
+}
+
+static int
+r_daemon(void)
+{
+ struct sigaction osa, sa;
+ pid_t newgrp;
+ int oerrno;
+ int osa_ok;
+ int nullfd;
+
+ /* A SIGHUP may be thrown when the parent exits below. */
+ sigemptyset(&sa.sa_mask);
+ sa.sa_handler = SIG_IGN;
+ sa.sa_flags = 0;
+ osa_ok = sigaction(SIGHUP, &sa, &osa);
+
+ /* Keep kqueue fd alive */
+ switch (rfork(RFPROC)) {
+ case -1:
+ return (-1);
+ case 0:
+ break;
+ default:
+ /*
+ * A fine point: _exit(0), not exit(0), to avoid triggering
+ * atexit(3) processing
+ */
+ _exit(0);
+ }
+
+ newgrp = setsid();
+ oerrno = errno;
+ if (osa_ok != -1)
+ sigaction(SIGHUP, &osa, NULL);
+
+ if (newgrp == -1) {
+ errno = oerrno;
+ return (-1);
+ }
+
+ (void)chdir("/");
+
+ nullfd = open("/dev/null", O_RDWR, 0);
+ if (nullfd != -1) {
+ (void)dup2(nullfd, STDIN_FILENO);
+ (void)dup2(nullfd, STDOUT_FILENO);
+ (void)dup2(nullfd, STDERR_FILENO);
+ }
+ if (nullfd > 2)
+ close(nullfd);
+
+ return (0);
+}
+
+static inline int
+bit_find(bitstr_t *array, int start, int stop)
+{
+ int res;
+
+ bit_ffs_at(array, start, stop + 1, &res);
+ return (res != -1);
+}
+
+static enum device_if
+r_identify_if(int fd)
+{
+ int dummy;
+
+ if (ioctl(fd, EVIOCGVERSION, &dummy) >= 0)
+ return (DEVICE_IF_EVDEV);
+ if (ioctl(fd, MOUSE_GETLEVEL, &dummy) >= 0)
+ return (DEVICE_IF_SYSMOUSE);
+ return (DEVICE_IF_UNKNOWN);
+}
+
+/* Derived from EvdevProbe() function of xf86-input-evdev driver */
+static enum device_type
+r_identify_evdev(int fd)
+{
+ enum device_type type;
+ bitstr_t bit_decl(key_bits, KEY_CNT); /* */
+ bitstr_t bit_decl(rel_bits, REL_CNT); /* Evdev capabilities */
+ bitstr_t bit_decl(abs_bits, ABS_CNT); /* */
+ bitstr_t bit_decl(prop_bits, INPUT_PROP_CNT);
+ bool has_keys, has_buttons, has_lmr, has_rel_axes, has_abs_axes;
+ bool has_mt;
+
+ /* maybe this is a evdev mouse... */
+ if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(rel_bits)), rel_bits) < 0 ||
+ ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(abs_bits)), abs_bits) < 0 ||
+ ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bits)), key_bits) < 0 ||
+ ioctl(fd, EVIOCGPROP(sizeof(prop_bits)), prop_bits) < 0) {
+ return (DEVICE_TYPE_UNKNOWN);
+ }
+
+ has_keys = bit_find(key_bits, 0, BTN_MISC - 1);
+ has_buttons = bit_find(key_bits, BTN_MISC, BTN_JOYSTICK - 1);
+ has_lmr = bit_find(key_bits, BTN_LEFT, BTN_MIDDLE);
+ has_rel_axes = bit_find(rel_bits, 0, REL_MAX);
+ has_abs_axes = bit_find(abs_bits, 0, ABS_MAX);
+ has_mt = bit_find(abs_bits, ABS_MT_SLOT, ABS_MAX);
+ type = DEVICE_TYPE_UNKNOWN;
+
+ if (has_abs_axes) {
+ if (has_mt && !has_buttons) {
+ /* TBD:Improve joystick detection */
+ if (bit_test(key_bits, BTN_JOYSTICK)) {
+ return (DEVICE_TYPE_JOYSTICK);
+ } else {
+ has_buttons = true;
+ }
+ }
+
+ if (bit_test(abs_bits, ABS_X) &&
+ bit_test(abs_bits, ABS_Y)) {
+ if (bit_test(key_bits, BTN_TOOL_PEN) ||
+ bit_test(key_bits, BTN_STYLUS) ||
+ bit_test(key_bits, BTN_STYLUS2)) {
+ type = DEVICE_TYPE_TABLET;
+ } else if (bit_test(abs_bits, ABS_PRESSURE) ||
+ bit_test(key_bits, BTN_TOUCH)) {
+ if (has_lmr ||
+ bit_test(key_bits, BTN_TOOL_FINGER)) {
+ type = DEVICE_TYPE_TOUCHPAD;
+ } else {
+ type = DEVICE_TYPE_TOUCHSCREEN;
+ }
+ /* some touchscreens use BTN_LEFT rather than BTN_TOUCH */
+ } else if (!(bit_test(rel_bits, REL_X) &&
+ bit_test(rel_bits, REL_Y)) &&
+ has_lmr) {
+ type = DEVICE_TYPE_TOUCHSCREEN;
+ }
+ }
+ }
+
+ if (type == DEVICE_TYPE_UNKNOWN) {
+ if (has_keys)
+ type = DEVICE_TYPE_KEYBOARD;
+ else if (has_rel_axes || has_buttons)
+ type = DEVICE_TYPE_MOUSE;
+ }
+
+ return (type);
+}
+
+static enum device_type
+r_identify_sysmouse(int fd __unused)
+{
+ /* All sysmouse devices act like mices */
+ return (DEVICE_TYPE_MOUSE);
+}
+
+static const char *
+r_if(enum device_if type)
+{
+ const char *unknown = "unknown";
+
+ return (type == DEVICE_IF_UNKNOWN || type >= (int)nitems(rifs) ?
+ unknown : rifs[type].name);
+}
+
+static const char *
+r_name(enum device_type type)
+{
+ const char *unknown = "unknown";
+
+ return (type == DEVICE_TYPE_UNKNOWN || type >= (int)nitems(rnames) ?
+ unknown : rnames[type]);
+}
+
+static int
+r_init_dev_evdev(int fd, struct device *dev)
+{
+ if (ioctl(fd, EVIOCGNAME(sizeof(dev->name) - 1), dev->name) < 0) {
+ logwarnx("unable to get device %s name", dev->path);
+ return (errno);
+ }
+ /* Do not loop events */
+ if (strncmp(dev->name, "System mouse", sizeof(dev->name)) == 0) {
+ return (ENOTSUP);
+ }
+ if (ioctl(fd, EVIOCGID, &dev->id) < 0) {
+ logwarnx("unable to get device %s ID", dev->path);
+ return (errno);
+ }
+ (void)ioctl(fd, EVIOCGUNIQ(sizeof(dev->uniq) - 1), dev->uniq);
+
+ return (0);
+}
+
+static int
+r_init_dev_sysmouse(int fd, struct device *dev)
+{
+ mousemode_t *mode = &dev->mode;
+ int level;
+
+ level = 1;
+ if (ioctl(fd, MOUSE_SETLEVEL, &level) < 0) {
+ logwarnx("unable to MOUSE_SETLEVEL for device %s", dev->path);
+ return (errno);
+ }
+ if (ioctl(fd, MOUSE_GETLEVEL, &level) < 0) {
+ logwarnx("unable to MOUSE_GETLEVEL for device %s", dev->path);
+ return (errno);
+ }
+ if (level != 1) {
+ logwarnx("unable to set level to 1 for device %s", dev->path);
+ return (ENOTSUP);
+ }
+ memset(mode, 0, sizeof(*mode));
+ if (ioctl(fd, MOUSE_GETMODE, mode) < 0) {
+ logwarnx("unable to MOUSE_GETMODE for device %s", dev->path);
+ return (errno);
+ }
+ if (mode->protocol != MOUSE_PROTO_SYSMOUSE) {
+ logwarnx("unable to set sysmouse protocol for device %s",
+ dev->path);
+ return (ENOTSUP);
+ }
+ if (mode->packetsize != MOUSE_SYS_PACKETSIZE) {
+ logwarnx("unable to set sysmouse packet size for device %s",
+ dev->path);
+ return (ENOTSUP);
+ }
+
+ /* TODO: Fill name, id and uniq from dev.* sysctls */
+ strlcpy(dev->name, dev->path, sizeof(dev->name));
+
+ return (0);
+}
+
+static void
+r_init_evstate(struct quirks *q, struct evstate *ev)
+{
+ const struct quirk_tuples *t;
+ bitstr_t *bitstr;
+ int maxbit;
+
+ if (quirks_get_tuples(q, QUIRK_ATTR_EVENT_CODE, &t)) {
+ for (size_t i = 0; i < t->ntuples; i++) {
+ int type = t->tuples[i].first;
+ int code = t->tuples[i].second;
+ bool enable = t->tuples[i].third;
+
+ switch (type) {
+ case EV_KEY:
+ bitstr = (bitstr_t *)&ev->key_ignore;
+ maxbit = KEY_MAX;
+ break;
+ case EV_REL:
+ bitstr = (bitstr_t *)&ev->rel_ignore;
+ maxbit = REL_MAX;
+ break;
+ case EV_ABS:
+ bitstr = (bitstr_t *)&ev->abs_ignore;
+ maxbit = ABS_MAX;
+ break;
+ default:
+ continue;
+ }
+
+ if (code == EVENT_CODE_UNDEFINED) {
+ if (enable)
+ bit_nclear(bitstr, 0, maxbit);
+ else
+ bit_nset(bitstr, 0, maxbit);
+ } else {
+ if (code > maxbit)
+ continue;
+ if (enable)
+ bit_clear(bitstr, code);
+ else
+ bit_set(bitstr, code);
+ }
+ }
+ }
+
+ if (quirks_get_tuples(q, QUIRK_ATTR_INPUT_PROP, &t)) {
+ for (size_t idx = 0; idx < t->ntuples; idx++) {
+ unsigned int p = t->tuples[idx].first;
+ bool enable = t->tuples[idx].second;
+
+ if (p > INPUT_PROP_MAX)
+ continue;
+ if (enable)
+ bit_clear(ev->prop_ignore, p);
+ else
+ bit_set(ev->prop_ignore, p);
+ }
+ }
+}
+
+static void
+r_init_buttons(struct quirks *q, struct btstate *bt, struct e3bstate *e3b)
+{
+ struct timespec ts;
+ int i, j;
+
+ *bt = (struct btstate) {
+ .clickthreshold = DFLT_CLICKTHRESHOLD,
+ .zmap = { 0, 0, 0, 0 },
+ };
+
+ memcpy(bt->p2l, default_p2l, sizeof(bt->p2l));
+ for (i = 0; i < MOUSE_MAXBUTTON; ++i) {
+ j = i;
+ if (opt_btstate.p2l[i] != 0)
+ bt->p2l[i] = opt_btstate.p2l[i];
+ if (opt_btstate.mstate[i] != NULL)
+ j = opt_btstate.mstate[i] - opt_btstate.bstate;
+ bt->mstate[i] = bt->bstate + j;
+ }
+
+ if (opt_btstate.zmap[0] != 0)
+ memcpy(bt->zmap, opt_btstate.zmap, sizeof(bt->zmap));
+ if (opt_clickthreshold >= 0)
+ bt->clickthreshold = opt_clickthreshold;
+ else
+ quirks_get_uint32(q, MOUSED_CLICK_THRESHOLD, &bt->clickthreshold);
+ if (opt_wmode != 0)
+ bt->wmode = opt_wmode;
+ else
+ quirks_get_uint32(q, MOUSED_WMODE, &bt->wmode);
+ if (bt->wmode != 0)
+ bt->wmode = 1 << (bt->wmode - 1);
+
+ /* fix Z axis mapping */
+ for (i = 0; i < ZMAP_MAXBUTTON; ++i) {
+ if (bt->zmap[i] <= 0)
+ continue;
+ for (j = 0; j < MOUSE_MAXBUTTON; ++j) {
+ if (bt->mstate[j] == &bt->bstate[bt->zmap[i] - 1])
+ bt->mstate[j] = &bt->zstate[i];
+ }
+ bt->zmap[i] = 1 << (bt->zmap[i] - 1);
+ }
+
+ clock_gettime(CLOCK_MONOTONIC_FAST, &ts);
+
+ *e3b = (struct e3bstate) {
+ .enabled = false,
+ .button2timeout = DFLT_BUTTON2TIMEOUT,
+ };
+ e3b->enabled = opt_e3b_enabled;
+ if (!e3b->enabled)
+ quirks_get_bool(q, MOUSED_EMULATE_THIRD_BUTTON, &e3b->enabled);
+ if (opt_e3b_button2timeout >= 0)
+ e3b->button2timeout = opt_e3b_button2timeout;
+ else
+ quirks_get_uint32(q, MOUSED_EMULATE_THIRD_BUTTON_TIMEOUT,
+ &e3b->button2timeout);
+ e3b->mouse_button_state = S0;
+ e3b->mouse_button_state_ts = ts;
+ e3b->mouse_move_delayed = 0;
+
+ for (i = 0; i < MOUSE_MAXBUTTON; ++i) {
+ bt->bstate[i].count = 0;
+ bt->bstate[i].ts = ts;
+ }
+ for (i = 0; i < ZMAP_MAXBUTTON; ++i) {
+ bt->zstate[i].count = 0;
+ bt->zstate[i].ts = ts;
+ }
+}
+
+static void
+r_init_touchpad_hw(int fd, struct quirks *q, struct tpcaps *tphw,
+ struct evstate *ev)
+{
+ struct input_absinfo ai;
+ bitstr_t bit_decl(key_bits, KEY_CNT);
+ bitstr_t bit_decl(abs_bits, ABS_CNT);
+ bitstr_t bit_decl(prop_bits, INPUT_PROP_CNT);
+ struct quirk_range r;
+ struct quirk_dimensions dim;
+ u_int u;
+
+ ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(abs_bits)), abs_bits);
+ ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bits)), key_bits);
+
+ if (!bit_test(ev->abs_ignore, ABS_X) &&
+ ioctl(fd, EVIOCGABS(ABS_X), &ai) >= 0) {
+ tphw->min_x = (ai.maximum > ai.minimum) ? ai.minimum : INT_MIN;
+ tphw->max_x = (ai.maximum > ai.minimum) ? ai.maximum : INT_MAX;
+ tphw->res_x = ai.resolution == 0 ?
+ DFLT_TPAD_RESOLUTION : ai.resolution;
+ }
+ if (!bit_test(ev->abs_ignore, ABS_Y) &&
+ ioctl(fd, EVIOCGABS(ABS_Y), &ai) >= 0) {
+ tphw->min_y = (ai.maximum > ai.minimum) ? ai.minimum : INT_MIN;
+ tphw->max_y = (ai.maximum > ai.minimum) ? ai.maximum : INT_MAX;
+ tphw->res_y = ai.resolution == 0 ?
+ DFLT_TPAD_RESOLUTION : ai.resolution;
+ }
+ if (quirks_get_dimensions(q, QUIRK_ATTR_RESOLUTION_HINT, &dim)) {
+ tphw->res_x = dim.x;
+ tphw->res_y = dim.y;
+ } else if (tphw->max_x != INT_MAX && tphw->max_y != INT_MAX &&
+ quirks_get_dimensions(q, QUIRK_ATTR_SIZE_HINT, &dim)) {
+ tphw->res_x = (tphw->max_x - tphw->min_x) / dim.x;
+ tphw->res_y = (tphw->max_y - tphw->min_y) / dim.y;
+ }
+ if (!bit_test(ev->key_ignore, BTN_TOUCH) &&
+ bit_test(key_bits, BTN_TOUCH))
+ tphw->cap_touch = true;
+ /* XXX: libinput uses ABS_MT_PRESSURE where available */
+ if (!bit_test(ev->abs_ignore, ABS_PRESSURE) &&
+ bit_test(abs_bits, ABS_PRESSURE) &&
+ ioctl(fd, EVIOCGABS(ABS_PRESSURE), &ai) >= 0) {
+ tphw->cap_pressure = true;
+ tphw->min_p = ai.minimum;
+ tphw->max_p = ai.maximum;
+ }
+ if (tphw->cap_pressure &&
+ quirks_get_range(q, QUIRK_ATTR_PRESSURE_RANGE, &r)) {
+ if (r.upper == 0 && r.lower == 0) {
+ debug("pressure-based touch detection disabled");
+ tphw->cap_pressure = false;
+ } else if (r.upper > tphw->max_p || r.upper < tphw->min_p ||
+ r.lower > tphw->max_p || r.lower < tphw->min_p) {
+ debug("discarding out-of-bounds pressure range %d:%d",
+ r.lower, r.upper);
+ tphw->cap_pressure = false;
+ }
+ }
+ /* XXX: libinput uses ABS_MT_TOUCH_MAJOR where available */
+ if (!bit_test(ev->abs_ignore, ABS_TOOL_WIDTH) &&
+ bit_test(abs_bits, ABS_TOOL_WIDTH) &&
+ quirks_get_uint32(q, QUIRK_ATTR_PALM_SIZE_THRESHOLD, &u) &&
+ u != 0)
+ tphw->cap_width = true;
+ if (!bit_test(ev->abs_ignore, ABS_MT_SLOT) &&
+ bit_test(abs_bits, ABS_MT_SLOT) &&
+ !bit_test(ev->abs_ignore, ABS_MT_TRACKING_ID) &&
+ bit_test(abs_bits, ABS_MT_TRACKING_ID) &&
+ !bit_test(ev->abs_ignore, ABS_MT_POSITION_X) &&
+ bit_test(abs_bits, ABS_MT_POSITION_X) &&
+ !bit_test(ev->abs_ignore, ABS_MT_POSITION_Y) &&
+ bit_test(abs_bits, ABS_MT_POSITION_Y))
+ tphw->is_mt = true;
+ if ( ioctl(fd, EVIOCGPROP(sizeof(prop_bits)), prop_bits) >= 0 &&
+ !bit_test(ev->prop_ignore, INPUT_PROP_BUTTONPAD) &&
+ bit_test(prop_bits, INPUT_PROP_BUTTONPAD))
+ tphw->is_clickpad = true;
+ if ( tphw->is_clickpad &&
+ !bit_test(ev->prop_ignore, INPUT_PROP_TOPBUTTONPAD) &&
+ bit_test(prop_bits, INPUT_PROP_TOPBUTTONPAD))
+ tphw->is_topbuttonpad = true;
+}
+
+static void
+r_init_touchpad_info(struct quirks *q, struct tpcaps *tphw,
+ struct tpinfo *tpinfo)
+{
+ struct quirk_range r;
+ int i;
+ u_int u;
+ int sz_x, sz_y;
+
+ *tpinfo = (struct tpinfo) {
+ .two_finger_scroll = true,
+ .natural_scroll = false,
+ .three_finger_drag = false,
+ .min_pressure_hi = 1,
+ .min_pressure_lo = 1,
+ .max_pressure = 130,
+ .max_width = 16,
+ .tap_timeout = 180, /* ms */
+ .tap_threshold = 0,
+ .tap_max_delta = 1.3, /* mm */
+ .taphold_timeout = 300, /* ms */
+ .vscroll_min_delta = 1.25, /* mm */
+ .vscroll_hor_area = 0.0, /* mm */
+ .vscroll_ver_area = -15.0, /* mm */
+ };
+
+ quirks_get_bool(q, MOUSED_TWO_FINGER_SCROLL, &tpinfo->two_finger_scroll);
+ quirks_get_bool(q, MOUSED_NATURAL_SCROLL, &tpinfo->natural_scroll);
+ quirks_get_bool(q, MOUSED_THREE_FINGER_DRAG, &tpinfo->three_finger_drag);
+ quirks_get_uint32(q, MOUSED_TAP_TIMEOUT, &tpinfo->tap_timeout);
+ quirks_get_double(q, MOUSED_TAP_MAX_DELTA, &tpinfo->tap_max_delta);
+ quirks_get_uint32(q, MOUSED_TAPHOLD_TIMEOUT, &tpinfo->taphold_timeout);
+ quirks_get_double(q, MOUSED_VSCROLL_MIN_DELTA, &tpinfo->vscroll_min_delta);
+ quirks_get_double(q, MOUSED_VSCROLL_HOR_AREA, &tpinfo->vscroll_hor_area);
+ quirks_get_double(q, MOUSED_VSCROLL_VER_AREA, &tpinfo->vscroll_ver_area);
+
+ if (tphw->cap_pressure &&
+ quirks_get_range(q, QUIRK_ATTR_PRESSURE_RANGE, &r)) {
+ tpinfo->min_pressure_lo = r.lower;
+ tpinfo->min_pressure_hi = r.upper;
+ quirks_get_uint32(q, QUIRK_ATTR_PALM_PRESSURE_THRESHOLD,
+ &tpinfo->max_pressure);
+ quirks_get_uint32(q, MOUSED_TAP_PRESSURE_THRESHOLD,
+ &tpinfo->tap_threshold);
+ }
+ if (tphw->cap_width)
+ quirks_get_uint32(q, QUIRK_ATTR_PALM_SIZE_THRESHOLD,
+ &tpinfo->max_width);
+ /* Set bottom quarter as 42% - 16% - 42% sized softbuttons */
+ if (tphw->is_clickpad) {
+ sz_x = tphw->max_x - tphw->min_x;
+ sz_y = tphw->max_y - tphw->min_y;
+ i = 25;
+ if (tphw->is_topbuttonpad)
+ i = -i;
+ quirks_get_int32(q, MOUSED_SOFTBUTTONS_Y, &i);
+ tpinfo->softbuttons_y = sz_y * i / 100;
+ u = 42;
+ quirks_get_uint32(q, MOUSED_SOFTBUTTON2_X, &u);
+ tpinfo->softbutton2_x = sz_x * u / 100;
+ u = 58;
+ quirks_get_uint32(q, MOUSED_SOFTBUTTON3_X, &u);
+ tpinfo->softbutton3_x = sz_x * u / 100;
+ }
+}
+
+static void
+r_init_touchpad_accel(struct tpcaps *tphw, struct accel *accel)
+{
+ /* Normalize pointer movement to match 200dpi mouse */
+ accel->accelx *= DFLT_MOUSE_RESOLUTION;
+ accel->accelx /= tphw->res_x;
+ accel->accely *= DFLT_MOUSE_RESOLUTION;
+ accel->accely /= tphw->res_y;
+ accel->accelz *= DFLT_MOUSE_RESOLUTION;
+ accel->accelz /= (tphw->res_x * DFLT_LINEHEIGHT);
+}
+
+static void
+r_init_touchpad_gesture(struct tpstate *gest)
+{
+ gest->idletimeout = -1;
+}
+
+static void
+r_init_drift(struct quirks *q, struct drift *d)
+{
+ if (opt_drift_terminate) {
+ d->terminate = true;
+ d->distance = opt_drift_distance;
+ d->time = opt_drift_time;
+ d->after = opt_drift_after;
+ } else if (quirks_get_bool(q, MOUSED_DRIFT_TERMINATE, &d->terminate) &&
+ d->terminate) {
+ quirks_get_uint32(q, MOUSED_DRIFT_DISTANCE, &d->distance);
+ quirks_get_uint32(q, MOUSED_DRIFT_TIME, &d->time);
+ quirks_get_uint32(q, MOUSED_DRIFT_AFTER, &d->after);
+ } else
+ return;
+
+ if (d->distance == 0 || d->time == 0 || d->after == 0) {
+ warnx("invalid drift parameter");
+ exit(1);
+ }
+
+ debug("terminate drift: distance %d, time %d, after %d",
+ d->distance, d->time, d->after);
+
+ d->time_ts = msec2ts(d->time);
+ d->twotime_ts = msec2ts(d->time * 2);
+ d->after_ts = msec2ts(d->after);
+}
+
+static void
+r_init_accel(struct quirks *q, struct accel *acc)
+{
+ bool r1, r2;
+
+ acc->accelx = opt_accelx;
+ if (opt_accelx == 1.0)
+ quirks_get_double(q, MOUSED_LINEAR_ACCEL_X, &acc->accelx);
+ acc->accely = opt_accely;
+ if (opt_accely == 1.0)
+ quirks_get_double(q, MOUSED_LINEAR_ACCEL_Y, &acc->accely);
+ if (!quirks_get_double(q, MOUSED_LINEAR_ACCEL_Z, &acc->accelz))
+ acc->accelz = 1.0;
+ acc->lastlength[0] = acc->lastlength[1] = acc->lastlength[2] = 0.0;
+ if (opt_exp_accel) {
+ acc->is_exponential = true;
+ acc->expoaccel = opt_expoaccel;
+ acc->expoffset = opt_expoffset;
+ return;
+ }
+ acc->expoaccel = acc->expoffset = 1.0;
+ r1 = quirks_get_double(q, MOUSED_EXPONENTIAL_ACCEL, &acc->expoaccel);
+ r2 = quirks_get_double(q, MOUSED_EXPONENTIAL_OFFSET, &acc->expoffset);
+ if (r1 || r2)
+ acc->is_exponential = true;
+}
+
+static void
+r_init_scroll(struct quirks *q, struct scroll *scroll)
+{
+ *scroll = (struct scroll) {
+ .threshold = DFLT_SCROLLTHRESHOLD,
+ .speed = DFLT_SCROLLSPEED,
+ .state = SCROLL_NOTSCROLLING,
+ };
+ scroll->enable_vert = opt_virtual_scroll;
+ if (!opt_virtual_scroll)
+ quirks_get_bool(q, MOUSED_VIRTUAL_SCROLL_ENABLE, &scroll->enable_vert);
+ scroll->enable_hor = opt_hvirtual_scroll;
+ if (!opt_hvirtual_scroll)
+ quirks_get_bool(q, MOUSED_HOR_VIRTUAL_SCROLL_ENABLE, &scroll->enable_hor);
+ if (opt_scroll_speed >= 0)
+ scroll->speed = opt_scroll_speed;
+ else
+ quirks_get_uint32(q, MOUSED_VIRTUAL_SCROLL_SPEED, &scroll->speed);
+ if (opt_scroll_threshold >= 0)
+ scroll->threshold = opt_scroll_threshold;
+ else
+ quirks_get_uint32(q, MOUSED_VIRTUAL_SCROLL_THRESHOLD, &scroll->threshold);
+}
+
+static struct rodent *
+r_init(const char *path)
+{
+ struct rodent *r;
+ struct device dev;
+ struct quirks *q;
+ struct kevent kev;
+ enum device_if iftype;
+ enum device_type type;
+ int fd, err;
+ bool grab;
+ bool ignore;
+ bool qvalid;
+
+ fd = open(path, O_RDWR | O_NONBLOCK);
+ if (fd == -1) {
+ logwarnx("unable to open %s", path);
+ return (NULL);
+ }
+
+ iftype = r_identify_if(fd);
+ switch (iftype) {
+ case DEVICE_IF_UNKNOWN:
+ debug("cannot determine interface type on %s", path);
+ close(fd);
+ errno = ENOTSUP;
+ return (NULL);
+ case DEVICE_IF_EVDEV:
+ type = r_identify_evdev(fd);
+ break;
+ case DEVICE_IF_SYSMOUSE:
+ type = r_identify_sysmouse(fd);
+ break;
+ default:
+ debug("unsupported interface type: %s on %s",
+ r_if(iftype), path);
+ close(fd);
+ errno = ENXIO;
+ return (NULL);
+ }
+
+ switch (type) {
+ case DEVICE_TYPE_UNKNOWN:
+ debug("cannot determine device type on %s", path);
+ close(fd);
+ errno = ENOTSUP;
+ return (NULL);
+ case DEVICE_TYPE_MOUSE:
+ case DEVICE_TYPE_TOUCHPAD:
+ break;
+ default:
+ debug("unsupported device type: %s on %s",
+ r_name(type), path);
+ close(fd);
+ errno = ENXIO;
+ return (NULL);
+ }
+
+ memset(&dev, 0, sizeof(struct device));
+ strlcpy(dev.path, path, sizeof(dev.path));
+ dev.iftype = iftype;
+ dev.type = type;
+ switch (iftype) {
+ case DEVICE_IF_EVDEV:
+ err = r_init_dev_evdev(fd, &dev);
+ break;
+ case DEVICE_IF_SYSMOUSE:
+ err = r_init_dev_sysmouse(fd, &dev);
+ break;
+ default:
+ debug("unsupported interface type: %s on %s",
+ r_if(iftype), path);
+ err = ENXIO;
+ }
+ if (err != 0) {
+ debug("failed to initialize device: %s %s on %s",
+ r_if(iftype), r_name(type), path);
+ close(fd);
+ errno = err;
+ return (NULL);
+ }
+
+ debug("port: %s interface: %s type: %s model: %s",
+ path, r_if(iftype), r_name(type), dev.name);
+
+ q = quirks_fetch_for_device(quirks, &dev);
+
+ qvalid = quirks_get_bool(q, MOUSED_IGNORE_DEVICE, &ignore);
+ if (qvalid && ignore) {
+ debug("%s: device ignored", path);
+ close(fd);
+ quirks_unref(q);
+ errno = EPERM;
+ return (NULL);
+ }
+
+ switch (iftype) {
+ case DEVICE_IF_EVDEV:
+ grab = opt_grab;
+ if (!grab)
+ qvalid = quirks_get_bool(q, MOUSED_GRAB_DEVICE, &grab);
+ if (qvalid && grab && ioctl(fd, EVIOCGRAB, 1) == -1) {
+ logwarnx("failed to grab %s", path);
+ err = errno;
+ }
+ break;
+ case DEVICE_IF_SYSMOUSE:
+ if (opt_resolution == MOUSE_RES_UNKNOWN && opt_rate == 0)
+ break;
+ if (opt_resolution != MOUSE_RES_UNKNOWN)
+ dev.mode.resolution = opt_resolution;
+ if (opt_resolution != 0)
+ dev.mode.rate = opt_rate;
+ if (ioctl(fd, MOUSE_SETMODE, &dev.mode) < 0)
+ debug("failed to MOUSE_SETMODE for device %s", path);
+ break;
+ default:
+ debug("unsupported interface type: %s on %s",
+ r_if(iftype), path);
+ err = ENXIO;
+ }
+ if (err != 0) {
+ debug("failed to initialize device: %s %s on %s",
+ r_if(iftype), r_name(type), path);
+ close(fd);
+ quirks_unref(q);
+ errno = err;
+ return (NULL);
+ }
+
+ r = calloc(1, sizeof(struct rodent));
+ memcpy(&r->dev, &dev, sizeof(struct device));
+ r->mfd = fd;
+
+ EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, r);
+ err = kevent(kfd, &kev, 1, NULL, 0, NULL);
+ if (err == -1) {
+ logwarnx("failed to register kevent on %s", path);
+ close(fd);
+ free(r);
+ quirks_unref(q);
+ return (NULL);
+ }
+
+ if (iftype == DEVICE_IF_EVDEV)
+ r_init_evstate(q, &r->ev);
+ r_init_buttons(q, &r->btstate, &r->e3b);
+ r_init_scroll(q, &r->scroll);
+ r_init_accel(q, &r->accel);
+ switch (type) {
+ case DEVICE_TYPE_TOUCHPAD:
+ r_init_touchpad_hw(fd, q, &r->tp.hw, &r->ev);
+ r_init_touchpad_info(q, &r->tp.hw, &r->tp.info);
+ r_init_touchpad_accel(&r->tp.hw, &r->accel);
+ r_init_touchpad_gesture(&r->tp.gest);
+ break;
+
+ case DEVICE_TYPE_MOUSE:
+ r_init_drift(q, &r->drift);
+ break;
+
+ default:
+ debug("unsupported device type: %s", r_name(type));
+ break;
+ }
+
+ quirks_unref(q);
+
+ SLIST_INSERT_HEAD(&rodents, r, next);
+
+ return (r);
+}
+
+static void
+r_init_all(void)
+{
+ char path[22] = "/dev/input/";
+ DIR *dirp;
+ struct dirent *dp;
+
+ dirp = opendir("/dev/input");
+ if (dirp == NULL)
+ logerr(1, "Failed to open /dev/input");
+
+ while ((dp = readdir(dirp)) != NULL) {
+ if (fnmatch("event[0-9]*", dp->d_name, 0) == 0) {
+ strncpy(path + 11, dp->d_name, 10);
+ (void)r_init(path);
+ }
+ }
+ (void)closedir(dirp);
+
+ return;
+}
+
+static void
+r_deinit(struct rodent *r)
+{
+ struct kevent ke[3];
+
+ if (r == NULL)
+ return;
+ if (r->mfd != -1) {
+ EV_SET(ke, r->mfd, EVFILT_READ, EV_DELETE, 0, 0, r);
+ EV_SET(ke + 1, r->mfd << 1, EVFILT_TIMER, EV_DELETE, 0, 0, r);
+ EV_SET(ke + 2, r->mfd << 1 | 1,
+ EVFILT_TIMER, EV_DELETE, 0, 0, r);
+ kevent(kfd, ke, nitems(ke), NULL, 0, NULL);
+ close(r->mfd);
+ }
+ SLIST_REMOVE(&rodents, r, rodent, next);
+ debug("destroy device: port: %s model: %s", r->dev.path, r->dev.name);
+ free(r);
+}
+
+static void
+r_deinit_all(void)
+{
+ while (!SLIST_EMPTY(&rodents))
+ r_deinit(SLIST_FIRST(&rodents));
+}
+
+static int
+r_protocol_evdev(enum device_type type, struct tpad *tp, struct evstate *ev,
+ struct input_event *ie, mousestatus_t *act)
+{
+ const struct tpcaps *tphw = &tp->hw;
+ const struct tpinfo *tpinfo = &tp->info;
+
+ static int butmapev[8] = { /* evdev */
+ 0,
+ MOUSE_BUTTON1DOWN,
+ MOUSE_BUTTON3DOWN,
+ MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN,
+ MOUSE_BUTTON2DOWN,
+ MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN,
+ MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN,
+ MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN
+ };
+ struct timespec ietime;
+
+ /* Drop ignored codes */
+ switch (ie->type) {
+ case EV_REL:
+ if (bit_test(ev->rel_ignore, ie->code))
+ return (0);
+ case EV_ABS:
+ if (bit_test(ev->abs_ignore, ie->code))
+ return (0);
+ case EV_KEY:
+ if (bit_test(ev->key_ignore, ie->code))
+ return (0);
+ }
+
+ if (debug > 1)
+ debug("received event 0x%02x, 0x%04x, %d",
+ ie->type, ie->code, ie->value);
+
+ switch (ie->type) {
+ case EV_REL:
+ switch (ie->code) {
+ case REL_X:
+ ev->dx += ie->value;
+ break;
+ case REL_Y:
+ ev->dy += ie->value;
+ break;
+ case REL_WHEEL:
+ ev->dz += ie->value;
+ break;
+ case REL_HWHEEL:
+ ev->dw += ie->value;
+ break;
+ }
+ break;
+ case EV_ABS:
+ switch (ie->code) {
+ case ABS_X:
+ if (!tphw->is_mt)
+ ev->dx += ie->value - ev->st.x;
+ ev->st.x = ie->value;
+ break;
+ case ABS_Y:
+ if (!tphw->is_mt)
+ ev->dy += ie->value - ev->st.y;
+ ev->st.y = ie->value;
+ break;
+ case ABS_PRESSURE:
+ ev->st.p = ie->value;
+ break;
+ case ABS_TOOL_WIDTH:
+ ev->st.w = ie->value;
+ break;
+ case ABS_MT_SLOT:
+ if (tphw->is_mt)
+ ev->slot = ie->value;
+ break;
+ case ABS_MT_TRACKING_ID:
+ if (tphw->is_mt &&
+ ev->slot >= 0 && ev->slot < MAX_FINGERS) {
+ if (ie->value != -1 && ev->mt[ev->slot].id > 0 &&
+ ie->value + 1 != ev->mt[ev->slot].id) {
+ debug("tracking id changed %d->%d",
+ ie->value, ev->mt[ev->slot].id - 1);
+ ev->mt[ev->slot].id = 0;
+ } else
+ ev->mt[ev->slot].id = ie->value + 1;
+ }
+ break;
+ case ABS_MT_POSITION_X:
+ if (tphw->is_mt &&
+ ev->slot >= 0 && ev->slot < MAX_FINGERS) {
+ /* Find fastest finger */
+ int dx = ie->value - ev->mt[ev->slot].x;
+ if (abs(dx) > abs(ev->dx))
+ ev->dx = dx;
+ ev->mt[ev->slot].x = ie->value;
+ }
+ break;
+ case ABS_MT_POSITION_Y:
+ if (tphw->is_mt &&
+ ev->slot >= 0 && ev->slot < MAX_FINGERS) {
+ /* Find fastest finger */
+ int dy = ie->value - ev->mt[ev->slot].y;
+ if (abs(dy) > abs(ev->dy))
+ ev->dy = dy;
+ ev->mt[ev->slot].y = ie->value;
+ }
+ break;
+ }
+ break;
+ case EV_KEY:
+ switch (ie->code) {
+ case BTN_TOUCH:
+ ev->st.id = ie->value != 0 ? 1 : 0;
+ break;
+ case BTN_TOOL_FINGER:
+ ev->nfingers = ie->value != 0 ? 1 : ev->nfingers;
+ break;
+ case BTN_TOOL_DOUBLETAP:
+ ev->nfingers = ie->value != 0 ? 2 : ev->nfingers;
+ break;
+ case BTN_TOOL_TRIPLETAP:
+ ev->nfingers = ie->value != 0 ? 3 : ev->nfingers;
+ break;
+ case BTN_TOOL_QUADTAP:
+ ev->nfingers = ie->value != 0 ? 4 : ev->nfingers;
+ break;
+ case BTN_TOOL_QUINTTAP:
+ ev->nfingers = ie->value != 0 ? 5 : ev->nfingers;
+ break;
+ case BTN_LEFT ... BTN_LEFT + 7:
+ ev->buttons &= ~(1 << (ie->code - BTN_LEFT));
+ ev->buttons |= ((!!ie->value) << (ie->code - BTN_LEFT));
+ break;
+ }
+ break;
+ }
+
+ if ( ie->type != EV_SYN ||
+ (ie->code != SYN_REPORT && ie->code != SYN_DROPPED))
+ return (0);
+
+ /*
+ * assembly full package
+ */
+
+ ietime.tv_sec = ie->time.tv_sec;
+ ietime.tv_nsec = ie->time.tv_usec * 1000;
+
+ if (!tphw->cap_pressure && ev->st.id != 0)
+ ev->st.p = MAX(tpinfo->min_pressure_hi, tpinfo->tap_threshold);
+ if (tphw->cap_touch && ev->st.id == 0)
+ ev->st.p = 0;
+
+ act->obutton = act->button;
+ act->button = butmapev[ev->buttons & MOUSE_SYS_STDBUTTONS];
+ act->button |= (ev->buttons & ~MOUSE_SYS_STDBUTTONS);
+
+ if (type == DEVICE_TYPE_TOUCHPAD) {
+ if (debug > 1)
+ debug("absolute data %d,%d,%d,%d", ev->st.x, ev->st.y,
+ ev->st.p, ev->st.w);
+ switch (r_gestures(tp, ev->st.x, ev->st.y, ev->st.p, ev->st.w,
+ ev->nfingers, &ietime, act)) {
+ case GEST_IGNORE:
+ ev->dx = 0;
+ ev->dy = 0;
+ ev->dz = 0;
+ ev->acc_dx = ev->acc_dy = 0;
+ debug("gesture IGNORE");
+ break;
+ case GEST_ACCUMULATE: /* Revertable pointer movement. */
+ ev->acc_dx += ev->dx;
+ ev->acc_dy += ev->dy;
+ debug("gesture ACCUMULATE %d,%d", ev->dx, ev->dy);
+ ev->dx = 0;
+ ev->dy = 0;
+ break;
+ case GEST_MOVE: /* Pointer movement. */
+ ev->dx += ev->acc_dx;
+ ev->dy += ev->acc_dy;
+ ev->acc_dx = ev->acc_dy = 0;
+ debug("gesture MOVE %d,%d", ev->dx, ev->dy);
+ break;
+ case GEST_VSCROLL: /* Vertical scrolling. */
+ if (tpinfo->natural_scroll)
+ ev->dz = -ev->dy;
+ else
+ ev->dz = ev->dy;
+ ev->dx = -ev->acc_dx;
+ ev->dy = -ev->acc_dy;
+ ev->acc_dx = ev->acc_dy = 0;
+ debug("gesture VSCROLL %d", ev->dz);
+ break;
+ case GEST_HSCROLL: /* Horizontal scrolling. */
+/*
+ if (ev.dx != 0) {
+ if (tpinfo->natural_scroll)
+ act->button |= (ev.dx > 0)
+ ? MOUSE_BUTTON6DOWN
+ : MOUSE_BUTTON7DOWN;
+ else
+ act->button |= (ev.dx > 0)
+ ? MOUSE_BUTTON7DOWN
+ : MOUSE_BUTTON6DOWN;
+ }
+*/
+ ev->dx = -ev->acc_dx;
+ ev->dy = -ev->acc_dy;
+ ev->acc_dx = ev->acc_dy = 0;
+ debug("gesture HSCROLL %d", ev->dw);
+ break;
+ }
+ }
+
+ debug("assembled full packet %d,%d,%d", ev->dx, ev->dy, ev->dz);
+ act->dx = ev->dx;
+ act->dy = ev->dy;
+ act->dz = ev->dz;
+ ev->dx = ev->dy = ev->dz = ev->dw = 0;
+
+ /* has something changed? */
+ act->flags = ((act->dx || act->dy || act->dz) ? MOUSE_POSCHANGED : 0)
+ | (act->obutton ^ act->button);
+
+ return (act->flags);
+}
+
+static int
+r_protocol_sysmouse(uint8_t *pBuf, mousestatus_t *act)
+{
+ static int butmapmsc[8] = { /* sysmouse */
+ 0,
+ MOUSE_BUTTON3DOWN,
+ MOUSE_BUTTON2DOWN,
+ MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN,
+ MOUSE_BUTTON1DOWN,
+ MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN,
+ MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN,
+ MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN
+ };
+
+ debug("%02x %02x %02x %02x %02x %02x %02x %02x", pBuf[0], pBuf[1],
+ pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7]);
+
+ if ((pBuf[0] & MOUSE_SYS_SYNCMASK) != MOUSE_SYS_SYNC)
+ return (0);
+
+ act->button = butmapmsc[(~pBuf[0]) & MOUSE_SYS_STDBUTTONS];
+ act->dx = (signed char)(pBuf[1]) + (signed char)(pBuf[3]);
+ act->dy = - ((signed char)(pBuf[2]) + (signed char)(pBuf[4]));
+ act->dz = ((signed char)(pBuf[5] << 1) + (signed char)(pBuf[6] << 1)) >> 1;
+ act->button |= ((~pBuf[7] & MOUSE_SYS_EXTBUTTONS) << 3);
+
+ /* has something changed? */
+ act->flags = ((act->dx || act->dy || act->dz) ? MOUSE_POSCHANGED : 0)
+ | (act->obutton ^ act->button);
+
+ return (act->flags);
+}
+
+static void
+r_vscroll_detect(struct rodent *r, struct scroll *sc, mousestatus_t *act)
+{
+ mousestatus_t newaction;
+
+ /* Allow middle button drags to scroll up and down */
+ if (act->button == MOUSE_BUTTON2DOWN) {
+ if (sc->state == SCROLL_NOTSCROLLING) {
+ sc->state = SCROLL_PREPARE;
+ sc->movement = sc->hmovement = 0;
+ debug("PREPARING TO SCROLL");
+ }
+ return;
+ }
+
+ /* This isn't a middle button down... move along... */
+ switch (sc->state) {
+ case SCROLL_SCROLLING:
+ /*
+ * We were scrolling, someone let go of button 2.
+ * Now turn autoscroll off.
+ */
+ sc->state = SCROLL_NOTSCROLLING;
+ debug("DONE WITH SCROLLING / %d", sc->state);
+ break;
+ case SCROLL_PREPARE:
+ newaction = *act;
+
+ /* We were preparing to scroll, but we never moved... */
+ r_timestamp(act, &r->btstate, &r->e3b, &r->drift);
+ r_statetrans(r, act, &newaction,
+ A(newaction.button & MOUSE_BUTTON1DOWN,
+ act->button & MOUSE_BUTTON3DOWN));
+
+ /* Send middle down */
+ newaction.button = MOUSE_BUTTON2DOWN;
+ r_click(&newaction, &r->btstate);
+
+ /* Send middle up */
+ r_timestamp(&newaction, &r->btstate, &r->e3b, &r->drift);
+ newaction.obutton = newaction.button;
+ newaction.button = act->button;
+ r_click(&newaction, &r->btstate);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+r_vscroll(struct scroll *sc, mousestatus_t *act)
+{
+ switch (sc->state) {
+ case SCROLL_PREPARE:
+ /* Middle button down, waiting for movement threshold */
+ if (act->dy == 0 && act->dx == 0)
+ break;
+ if (sc->enable_vert) {
+ sc->movement += act->dy;
+ if ((u_int)abs(sc->movement) > sc->threshold)
+ sc->state = SCROLL_SCROLLING;
+ }
+ if (sc->enable_hor) {
+ sc->hmovement += act->dx;
+ if ((u_int)abs(sc->hmovement) > sc->threshold)
+ sc->state = SCROLL_SCROLLING;
+ }
+ if (sc->state == SCROLL_SCROLLING)
+ sc->movement = sc->hmovement = 0;
+ break;
+ case SCROLL_SCROLLING:
+ if (sc->enable_vert) {
+ sc->movement += act->dy;
+ debug("SCROLL: %d", sc->movement);
+ if (sc->movement < -(int)sc->speed) {
+ /* Scroll down */
+ act->dz = -1;
+ sc->movement = 0;
+ }
+ else if (sc->movement > (int)sc->speed) {
+ /* Scroll up */
+ act->dz = 1;
+ sc->movement = 0;
+ }
+ }
+ if (sc->enable_hor) {
+ sc->hmovement += act->dx;
+ debug("HORIZONTAL SCROLL: %d", sc->hmovement);
+
+ if (sc->hmovement < -(int)sc->speed) {
+ act->dz = -2;
+ sc->hmovement = 0;
+ }
+ else if (sc->hmovement > (int)sc->speed) {
+ act->dz = 2;
+ sc->hmovement = 0;
+ }
+ }
+
+ /* Don't move while scrolling */
+ act->dx = act->dy = 0;
+ break;
+ default:
+ break;
+ }
+}
+
+static bool
+r_drift (struct drift *drift, mousestatus_t *act)
+{
+ struct timespec tmp;
+
+ /* X or/and Y movement only - possibly drift */
+ tssub(&drift->current_ts, &drift->last_activity, &tmp);
+ if (tscmp(&tmp, &drift->after_ts, >)) {
+ tssub(&drift->current_ts, &drift->since, &tmp);
+ if (tscmp(&tmp, &drift->time_ts, <)) {
+ drift->last.x += act->dx;
+ drift->last.y += act->dy;
+ } else {
+ /* discard old accumulated steps (drift) */
+ if (tscmp(&tmp, &drift->twotime_ts, >))
+ drift->previous.x = drift->previous.y = 0;
+ else
+ drift->previous = drift->last;
+ drift->last.x = act->dx;
+ drift->last.y = act->dy;
+ drift->since = drift->current_ts;
+ }
+ if ((u_int)abs(drift->last.x) + abs(drift->last.y) > drift->distance) {
+ /* real movement, pass all accumulated steps */
+ act->dx = drift->previous.x + drift->last.x;
+ act->dy = drift->previous.y + drift->last.y;
+ /* and reset accumulators */
+ tsclr(&drift->since);
+ drift->last.x = drift->last.y = 0;
+ /* drift_previous will be cleared at next movement*/
+ drift->last_activity = drift->current_ts;
+ } else {
+ return (true); /* don't pass current movement to
+ * console driver */
+ }
+ }
+ return (false);
+}
+
+static int
+r_statetrans(struct rodent *r, mousestatus_t *a1, mousestatus_t *a2, int trans)
+{
+ struct e3bstate *e3b = &r->e3b;
+ bool changed;
+ int flags;
+
+ a2->dx = a1->dx;
+ a2->dy = a1->dy;
+ a2->dz = a1->dz;
+ a2->obutton = a2->button;
+ a2->button = a1->button;
+ a2->flags = a1->flags;
+ changed = false;
+
+ if (!e3b->enabled)
+ return (false);
+
+ if (debug > 2)
+ debug("state:%d, trans:%d -> state:%d",
+ e3b->mouse_button_state, trans,
+ states[e3b->mouse_button_state].s[trans]);
+ /*
+ * Avoid re-ordering button and movement events. While a button
+ * event is deferred, throw away up to BUTTON2_MAXMOVE movement
+ * events to allow for mouse jitter. If more movement events
+ * occur, then complete the deferred button events immediately.
+ */
+ if ((a2->dx != 0 || a2->dy != 0) &&
+ S_DELAYED(states[e3b->mouse_button_state].s[trans])) {
+ if (++e3b->mouse_move_delayed > BUTTON2_MAXMOVE) {
+ e3b->mouse_move_delayed = 0;
+ e3b->mouse_button_state =
+ states[e3b->mouse_button_state].s[A_TIMEOUT];
+ changed = true;
+ } else
+ a2->dx = a2->dy = 0;
+ } else
+ e3b->mouse_move_delayed = 0;
+ if (e3b->mouse_button_state != states[e3b->mouse_button_state].s[trans])
+ changed = true;
+ if (changed)
+ clock_gettime(CLOCK_MONOTONIC_FAST,
+ &e3b->mouse_button_state_ts);
+ e3b->mouse_button_state = states[e3b->mouse_button_state].s[trans];
+ a2->button &= ~(MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN |
+ MOUSE_BUTTON3DOWN);
+ a2->button &= states[e3b->mouse_button_state].mask;
+ a2->button |= states[e3b->mouse_button_state].buttons;
+ flags = a2->flags & MOUSE_POSCHANGED;
+ flags |= a2->obutton ^ a2->button;
+ if (flags & MOUSE_BUTTON2DOWN) {
+ a2->flags = flags & MOUSE_BUTTON2DOWN;
+ r_timestamp(a2, &r->btstate, e3b, &r->drift);
+ }
+ a2->flags = flags;
+
+ return (changed);
+}
+
+static char *
+skipspace(char *s)
+{
+ while(isspace(*s))
+ ++s;
+ return (s);
+}
+
+static bool
+r_installmap(char *arg, struct btstate *bt)
+{
+ u_long pbutton;
+ u_long lbutton;
+ char *s;
+
+ while (*arg) {
+ arg = skipspace(arg);
+ s = arg;
+ while (isdigit(*arg))
+ ++arg;
+ arg = skipspace(arg);
+ if ((arg <= s) || (*arg != '='))
+ return (false);
+ lbutton = strtoul(s, NULL, 10);
+
+ arg = skipspace(++arg);
+ s = arg;
+ while (isdigit(*arg))
+ ++arg;
+ if ((arg <= s) || (!isspace(*arg) && (*arg != '\0')))
+ return (false);
+ pbutton = strtoul(s, NULL, 10);
+
+ if (lbutton == 0 || lbutton > MOUSE_MAXBUTTON)
+ return (false);
+ if (pbutton == 0 || pbutton > MOUSE_MAXBUTTON)
+ return (false);
+ bt->p2l[pbutton - 1] = 1 << (lbutton - 1);
+ bt->mstate[lbutton - 1] = &bt->bstate[pbutton - 1];
+ }
+
+ return (true);
+}
+
+static char *
+r_installzmap(char **argv, int argc, int* idx, struct btstate *bt)
+{
+ char *arg, *errstr;
+ u_long i, j;
+
+ arg = argv[*idx];
+ ++*idx;
+ if (strcmp(arg, "x") == 0) {
+ bt->zmap[0] = MOUSE_XAXIS;
+ return (NULL);
+ }
+ if (strcmp(arg, "y") == 0) {
+ bt->zmap[0] = MOUSE_YAXIS;
+ return (NULL);
+ }
+ i = strtoul(arg, NULL, 10);
+ /*
+ * Use button i for negative Z axis movement and
+ * button (i + 1) for positive Z axis movement.
+ */
+ if (i == 0 || i >= MOUSE_MAXBUTTON) {
+ asprintf(&errstr, "invalid argument `%s'", arg);
+ return (errstr);
+ }
+ bt->zmap[0] = i;
+ bt->zmap[1] = i + 1;
+ debug("optind: %d, optarg: '%s'", *idx, arg);
+ for (j = 1; j < ZMAP_MAXBUTTON; ++j) {
+ if ((*idx >= argc) || !isdigit(*argv[*idx]))
+ break;
+ i = strtoul(argv[*idx], NULL, 10);
+ if (i == 0 || i >= MOUSE_MAXBUTTON) {
+ asprintf(&errstr, "invalid argument `%s'", argv[*idx]);
+ return (errstr);
+ }
+ bt->zmap[j] = i;
+ ++*idx;
+ }
+ if ((bt->zmap[2] != 0) && (bt->zmap[3] == 0))
+ bt->zmap[3] = bt->zmap[2] + 1;
+
+ return (NULL);
+}
+
+static void
+r_map(mousestatus_t *act1, mousestatus_t *act2, struct btstate *bt)
+{
+ int pb;
+ int pbuttons;
+ int lbuttons;
+
+ pbuttons = act1->button;
+ lbuttons = 0;
+
+ act2->obutton = act2->button;
+ if (pbuttons & bt->wmode) {
+ pbuttons &= ~bt->wmode;
+ act1->dz = act1->dy;
+ act1->dx = 0;
+ act1->dy = 0;
+ }
+ act2->dx = act1->dx;
+ act2->dy = act1->dy;
+ act2->dz = act1->dz;
+
+ switch (bt->zmap[0]) {
+ case 0: /* do nothing */
+ break;
+ case MOUSE_XAXIS:
+ if (act1->dz != 0) {
+ act2->dx = act1->dz;
+ act2->dz = 0;
+ }
+ break;
+ case MOUSE_YAXIS:
+ if (act1->dz != 0) {
+ act2->dy = act1->dz;
+ act2->dz = 0;
+ }
+ break;
+ default: /* buttons */
+ pbuttons &= ~(bt->zmap[0] | bt->zmap[1]
+ | bt->zmap[2] | bt->zmap[3]);
+ if ((act1->dz < -1) && bt->zmap[2]) {
+ pbuttons |= bt->zmap[2];
+ bt->zstate[2].count = 1;
+ } else if (act1->dz < 0) {
+ pbuttons |= bt->zmap[0];
+ bt->zstate[0].count = 1;
+ } else if ((act1->dz > 1) && bt->zmap[3]) {
+ pbuttons |= bt->zmap[3];
+ bt->zstate[3].count = 1;
+ } else if (act1->dz > 0) {
+ pbuttons |= bt->zmap[1];
+ bt->zstate[1].count = 1;
+ }
+ act2->dz = 0;
+ break;
+ }
+
+ for (pb = 0; (pb < MOUSE_MAXBUTTON) && (pbuttons != 0); ++pb) {
+ lbuttons |= (pbuttons & 1) ? bt->p2l[pb] : 0;
+ pbuttons >>= 1;
+ }
+ act2->button = lbuttons;
+
+ act2->flags =
+ ((act2->dx || act2->dy || act2->dz) ? MOUSE_POSCHANGED : 0)
+ | (act2->obutton ^ act2->button);
+}
+
+static void
+r_timestamp(mousestatus_t *act, struct btstate *bt, struct e3bstate *e3b,
+ struct drift *drift)
+{
+ struct timespec ts;
+ struct timespec ts1;
+ struct timespec ts2;
+ int button;
+ int mask;
+ int i;
+
+ mask = act->flags & MOUSE_BUTTONS;
+#if 0
+ if (mask == 0)
+ return;
+#endif
+
+ clock_gettime(CLOCK_MONOTONIC_FAST, &ts1);
+ drift->current_ts = ts1;
+
+ /* double click threshold */
+ ts = tssubms(&ts1, bt->clickthreshold);
+ debug("ts: %jd %ld", (intmax_t)ts.tv_sec, ts.tv_nsec);
+
+ /* 3 button emulation timeout */
+ ts2 = tssubms(&ts1, e3b->button2timeout);
+
+ button = MOUSE_BUTTON1DOWN;
+ for (i = 0; (i < MOUSE_MAXBUTTON) && (mask != 0); ++i) {
+ if (mask & 1) {
+ if (act->button & button) {
+ /* the button is down */
+ debug(" : %jd %ld",
+ (intmax_t)bt->bstate[i].ts.tv_sec,
+ bt->bstate[i].ts.tv_nsec);
+ if (tscmp(&ts, &bt->bstate[i].ts, >)) {
+ bt->bstate[i].count = 1;
+ } else {
+ ++bt->bstate[i].count;
+ }
+ bt->bstate[i].ts = ts1;
+ } else {
+ /* the button is up */
+ bt->bstate[i].ts = ts1;
+ }
+ } else {
+ if (act->button & button) {
+ /* the button has been down */
+ if (tscmp(&ts2, &bt->bstate[i].ts, >)) {
+ bt->bstate[i].count = 1;
+ bt->bstate[i].ts = ts1;
+ act->flags |= button;
+ debug("button %d timeout", i + 1);
+ }
+ } else {
+ /* the button has been up */
+ }
+ }
+ button <<= 1;
+ mask >>= 1;
+ }
+}
+
+static bool
+r_timeout(struct e3bstate *e3b)
+{
+ struct timespec ts;
+ struct timespec ts1;
+
+ if (states[e3b->mouse_button_state].timeout)
+ return (true);
+ clock_gettime(CLOCK_MONOTONIC_FAST, &ts1);
+ ts = tssubms(&ts1, e3b->button2timeout);
+ return (tscmp(&ts, &e3b->mouse_button_state_ts, >));
+}
+
+static void
+r_move(mousestatus_t *act, struct accel *acc)
+{
+ struct mouse_info mouse;
+
+ bzero(&mouse, sizeof(mouse));
+ if (acc->is_exponential) {
+ expoacc(acc, act->dx, act->dy, act->dz,
+ &mouse.u.data.x, &mouse.u.data.y, &mouse.u.data.z);
+ } else {
+ linacc(acc, act->dx, act->dy, act->dz,
+ &mouse.u.data.x, &mouse.u.data.y, &mouse.u.data.z);
+ }
+ mouse.operation = MOUSE_MOTION_EVENT;
+ mouse.u.data.buttons = act->button;
+ if (debug < 2 && !paused)
+ ioctl(cfd, CONS_MOUSECTL, &mouse);
+}
+
+static void
+r_click(mousestatus_t *act, struct btstate *bt)
+{
+ struct mouse_info mouse;
+ int button;
+ int mask;
+ int i;
+
+ mask = act->flags & MOUSE_BUTTONS;
+ if (mask == 0)
+ return;
+
+ button = MOUSE_BUTTON1DOWN;
+ for (i = 0; (i < MOUSE_MAXBUTTON) && (mask != 0); ++i) {
+ if (mask & 1) {
+ debug("mstate[%d]->count:%d", i, bt->mstate[i]->count);
+ if (act->button & button) {
+ /* the button is down */
+ mouse.u.event.value = bt->mstate[i]->count;
+ } else {
+ /* the button is up */
+ mouse.u.event.value = 0;
+ }
+ mouse.operation = MOUSE_BUTTON_EVENT;
+ mouse.u.event.id = button;
+ if (debug < 2 && !paused)
+ ioctl(cfd, CONS_MOUSECTL, &mouse);
+ debug("button %d count %d", i + 1,
+ mouse.u.event.value);
+ }
+ button <<= 1;
+ mask >>= 1;
+ }
+}
+
+static enum gesture
+r_gestures(struct tpad *tp, int x0, int y0, u_int z, int w, int nfingers,
+ struct timespec *time, mousestatus_t *ms)
+{
+ struct tpstate *gest = &tp->gest;
+ const struct tpcaps *tphw = &tp->hw;
+ const struct tpinfo *tpinfo = &tp->info;
+ int tap_timeout = tpinfo->tap_timeout;
+
+ /*
+ * Check pressure to detect a real wanted action on the
+ * touchpad.
+ */
+ if (z >= tpinfo->min_pressure_hi ||
+ (gest->fingerdown && z >= tpinfo->min_pressure_lo)) {
+ /* XXX Verify values? */
+ bool two_finger_scroll = tpinfo->two_finger_scroll;
+ bool three_finger_drag = tpinfo->three_finger_drag;
+ int max_width = tpinfo->max_width;
+ u_int max_pressure = tpinfo->max_pressure;
+ int margin_top = tpinfo->margin_top;
+ int margin_right = tpinfo->margin_right;
+ int margin_bottom = tpinfo->margin_bottom;
+ int margin_left = tpinfo->margin_left;
+ int vscroll_hor_area = tpinfo->vscroll_hor_area * tphw->res_x;
+ int vscroll_ver_area = tpinfo->vscroll_ver_area * tphw->res_y;;
+
+ int max_x = tphw->max_x;
+ int max_y = tphw->max_y;
+ int min_x = tphw->min_x;
+ int min_y = tphw->min_y;
+
+ int dx, dy;
+ int start_x, start_y;
+ int tap_max_delta_x, tap_max_delta_y;
+ int prev_nfingers;
+
+ /* Palm detection. */
+ if (nfingers == 1 &&
+ ((tphw->cap_width && w > max_width) ||
+ (tphw->cap_pressure && z > max_pressure))) {
+ /*
+ * We consider the packet irrelevant for the current
+ * action when:
+ * - there is a single active touch
+ * - the width isn't comprised in:
+ * [0; max_width]
+ * - the pressure isn't comprised in:
+ * [min_pressure; max_pressure]
+ *
+ * Note that this doesn't terminate the current action.
+ */
+ debug("palm detected! (%d)", z);
+ return(GEST_IGNORE);
+ }
+
+ /*
+ * Limit the coordinates to the specified margins because
+ * this area isn't very reliable.
+ */
+ if (margin_left != 0 && x0 <= min_x + margin_left)
+ x0 = min_x + margin_left;
+ else if (margin_right != 0 && x0 >= max_x - margin_right)
+ x0 = max_x - margin_right;
+ if (margin_bottom != 0 && y0 <= min_y + margin_bottom)
+ y0 = min_y + margin_bottom;
+ else if (margin_top != 0 && y0 >= max_y - margin_top)
+ y0 = max_y - margin_top;
+
+ debug("packet: [%d, %d], %d, %d", x0, y0, z, w);
+
+ /*
+ * If the action is just beginning, init the structure and
+ * compute tap timeout.
+ */
+ if (!gest->fingerdown) {
+ debug("----");
+
+ /* Reset pressure peak. */
+ gest->zmax = 0;
+
+ /* Reset fingers count. */
+ gest->fingers_nb = 0;
+
+ /* Reset virtual scrolling state. */
+ gest->in_vscroll = 0;
+
+ /* Compute tap timeout. */
+ if (tap_timeout != 0)
+ gest->taptimeout = tsaddms(time, tap_timeout);
+ else
+ tsclr(&gest->taptimeout);
+
+ gest->fingerdown = true;
+
+ gest->start_x = x0;
+ gest->start_y = y0;
+ }
+
+ prev_nfingers = gest->prev_nfingers;
+
+ gest->prev_x = x0;
+ gest->prev_y = y0;
+ gest->prev_nfingers = nfingers;
+
+ start_x = gest->start_x;
+ start_y = gest->start_y;
+
+ /* Process ClickPad softbuttons */
+ if (tphw->is_clickpad && ms->button & MOUSE_BUTTON1DOWN) {
+ int y_ok, center_bt, center_x, right_bt, right_x;
+ y_ok = tpinfo->softbuttons_y < 0
+ ? start_y < min_y - tpinfo->softbuttons_y
+ : start_y > max_y - tpinfo->softbuttons_y;
+
+ center_bt = MOUSE_BUTTON2DOWN;
+ center_x = min_x + tpinfo->softbutton2_x;
+ right_bt = MOUSE_BUTTON3DOWN;
+ right_x = min_x + tpinfo->softbutton3_x;
+
+ if (center_x > 0 && right_x > 0 && center_x > right_x) {
+ center_bt = MOUSE_BUTTON3DOWN;
+ center_x = min_x + tpinfo->softbutton3_x;
+ right_bt = MOUSE_BUTTON2DOWN;
+ right_x = min_x + tpinfo->softbutton2_x;
+ }
+
+ if (right_x > 0 && start_x > right_x && y_ok)
+ ms->button = (ms->button &
+ ~MOUSE_BUTTON1DOWN) | right_bt;
+ else if (center_x > 0 && start_x > center_x && y_ok)
+ ms->button = (ms->button &
+ ~MOUSE_BUTTON1DOWN) | center_bt;
+ }
+
+ /* If in tap-hold or three fingers, add the recorded button. */
+ if (gest->in_taphold || (nfingers == 3 && three_finger_drag))
+ ms->button |= gest->tap_button;
+
+ /*
+ * For tap, we keep the maximum number of fingers and the
+ * pressure peak.
+ */
+ gest->fingers_nb = MAX(nfingers, gest->fingers_nb);
+ gest->zmax = MAX(z, gest->zmax);
+
+ dx = abs(x0 - start_x);
+ dy = abs(y0 - start_y);
+
+ /*
+ * A scrolling action must not conflict with a tap action.
+ * Here are the conditions to consider a scrolling action:
+ * - the action in a configurable area
+ * - one of the following:
+ * . the distance between the last packet and the
+ * first should be above a configurable minimum
+ * . tap timed out
+ */
+ if (!gest->in_taphold && !ms->button &&
+ (!gest->in_vscroll || two_finger_scroll) &&
+ (tscmp(time, &gest->taptimeout, >) ||
+ ((gest->fingers_nb == 2 || !two_finger_scroll) &&
+ (dx >= tpinfo->vscroll_min_delta * tphw->res_x ||
+ dy >= tpinfo->vscroll_min_delta * tphw->res_y)))) {
+ /*
+ * Handle two finger scrolling.
+ * Note that we don't rely on fingers_nb
+ * as that keeps the maximum number of fingers.
+ */
+ if (two_finger_scroll) {
+ if (nfingers == 2) {
+ gest->in_vscroll += dy ? 2 : 0;
+ gest->in_vscroll += dx ? 1 : 0;
+ }
+ } else {
+ /* Check for horizontal scrolling. */
+ if ((vscroll_hor_area > 0 &&
+ start_y <= min_y + vscroll_hor_area) ||
+ (vscroll_hor_area < 0 &&
+ start_y >= max_y + vscroll_hor_area))
+ gest->in_vscroll += 2;
+
+ /* Check for vertical scrolling. */
+ if ((vscroll_ver_area > 0 &&
+ start_x <= min_x + vscroll_ver_area) ||
+ (vscroll_ver_area < 0 &&
+ start_x >= max_x + vscroll_ver_area))
+ gest->in_vscroll += 1;
+ }
+ /* Avoid conflicts if area overlaps. */
+ if (gest->in_vscroll >= 3)
+ gest->in_vscroll = (dx > dy) ? 2 : 1;
+ }
+ /*
+ * Reset two finger scrolling when the number of fingers
+ * is different from two or any button is pressed.
+ */
+ if (two_finger_scroll && gest->in_vscroll != 0 &&
+ (nfingers != 2 || ms->button))
+ gest->in_vscroll = 0;
+
+ debug("virtual scrolling: %s "
+ "(direction=%d, dx=%d, dy=%d, fingers=%d)",
+ gest->in_vscroll != 0 ? "YES" : "NO",
+ gest->in_vscroll, dx, dy, gest->fingers_nb);
+
+ /* Workaround cursor jump on finger set changes */
+ if (prev_nfingers != nfingers)
+ return (GEST_IGNORE);
+
+ switch (gest->in_vscroll) {
+ case 1:
+ return (GEST_VSCROLL);
+ case 2:
+ return (GEST_HSCROLL);
+ default:
+ /* NO-OP */;
+ }
+
+ /* Max delta is disabled for multi-fingers tap. */
+ if (gest->fingers_nb == 1 &&
+ tscmp(time, &gest->taptimeout, <=)) {
+ tap_max_delta_x = tpinfo->tap_max_delta * tphw->res_x;
+ tap_max_delta_y = tpinfo->tap_max_delta * tphw->res_y;
+
+ debug("dx=%d, dy=%d, deltax=%d, deltay=%d",
+ dx, dy, tap_max_delta_x, tap_max_delta_y);
+ if (dx > tap_max_delta_x || dy > tap_max_delta_y) {
+ debug("not a tap");
+ tsclr(&gest->taptimeout);
+ }
+ }
+
+ if (tscmp(time, &gest->taptimeout, <=))
+ return (gest->fingers_nb > 1 ?
+ GEST_IGNORE : GEST_ACCUMULATE);
+ else
+ return (GEST_MOVE);
+ }
+
+ /*
+ * Handle a case when clickpad pressure drops before than
+ * button up event when surface is released after click.
+ * It interferes with softbuttons.
+ */
+ if (tphw->is_clickpad && tpinfo->softbuttons_y != 0)
+ ms->button &= ~MOUSE_BUTTON1DOWN;
+
+ gest->prev_nfingers = 0;
+
+ if (gest->fingerdown) {
+ /*
+ * An action is currently taking place but the pressure
+ * dropped under the minimum, putting an end to it.
+ */
+
+ gest->fingerdown = false;
+
+ /* Check for tap. */
+ debug("zmax=%d fingers=%d", gest->zmax, gest->fingers_nb);
+ if (!gest->in_vscroll && gest->zmax >= tpinfo->tap_threshold &&
+ tscmp(time, &gest->taptimeout, <=)) {
+ /*
+ * We have a tap if:
+ * - the maximum pressure went over tap_threshold
+ * - the action ended before tap_timeout
+ *
+ * To handle tap-hold, we must delay any button push to
+ * the next action.
+ */
+ if (gest->in_taphold) {
+ /*
+ * This is the second and last tap of a
+ * double tap action, not a tap-hold.
+ */
+ gest->in_taphold = false;
+
+ /*
+ * For double-tap to work:
+ * - no button press is emitted (to
+ * simulate a button release)
+ * - PSM_FLAGS_FINGERDOWN is set to
+ * force the next packet to emit a
+ * button press)
+ */
+ debug("button RELEASE: %d", gest->tap_button);
+ gest->fingerdown = true;
+
+ /* Schedule button press on next event */
+ gest->idletimeout = 0;
+ } else {
+ /*
+ * This is the first tap: we set the
+ * tap-hold state and notify the button
+ * down event.
+ */
+ gest->in_taphold = true;
+ gest->idletimeout = tpinfo->taphold_timeout;
+ gest->taptimeout = tsaddms(time, tap_timeout);
+
+ switch (gest->fingers_nb) {
+ case 3:
+ gest->tap_button =
+ MOUSE_BUTTON2DOWN;
+ break;
+ case 2:
+ gest->tap_button =
+ MOUSE_BUTTON3DOWN;
+ break;
+ default:
+ gest->tap_button =
+ MOUSE_BUTTON1DOWN;
+ }
+ debug("button PRESS: %d", gest->tap_button);
+ ms->button |= gest->tap_button;
+ }
+ } else {
+ /*
+ * Not enough pressure or timeout: reset
+ * tap-hold state.
+ */
+ if (gest->in_taphold) {
+ debug("button RELEASE: %d", gest->tap_button);
+ gest->in_taphold = false;
+ } else {
+ debug("not a tap-hold");
+ }
+ }
+ } else if (!gest->fingerdown && gest->in_taphold) {
+ /*
+ * For a tap-hold to work, the button must remain down at
+ * least until timeout (where the in_taphold flags will be
+ * cleared) or during the next action.
+ */
+ if (tscmp(time, &gest->taptimeout, <=)) {
+ ms->button |= gest->tap_button;
+ } else {
+ debug("button RELEASE: %d", gest->tap_button);
+ gest->in_taphold = false;
+ }
+ }
+
+ return (GEST_IGNORE);
+}
diff --git a/usr.sbin/moused/moused/moused.conf b/usr.sbin/moused/moused/moused.conf
new file mode 100644
index 000000000000..04970c820c7f
--- /dev/null
+++ b/usr.sbin/moused/moused/moused.conf
@@ -0,0 +1,43 @@
+[Default]
+MatchName=*
+
+MousedGrabDevice=0 # 1/0
+MousedIgnoreDevice=0 # 1/0
+
+MousedClickThreshold=500 # ms
+MousedEmulateThirdButton=0 # 1/0
+MousedEmulateThirdButtonTimeout=100 # ms
+MousedExponentialAccel=1.3 # float
+MousedExponentialOffset=2.0 # dots
+MousedLinearAccelX=1.0 # float
+MousedLinearAccelY=1.0 # float
+MousedLinearAccelZ=1.0 # float
+#MousedMapZAxis=0
+MousedVirtualScrollEnable=0 # 1/0
+MousedHorVirtualScrollEnable=0 # 1/0
+MousedVirtualScrollSpeed=2 # dots
+MousedVirtualScrollThreshold=3 # dots
+MousedWMode=0 # button num
+
+[Mouse drift termination]
+MatchDevType=mouse # mouse/touchpad
+MousedDriftTerminate=0 # 1/0
+MousedDriftDistance=4 # dots
+MousedDriftTime=500 # ms
+MousedDriftAfter=4000 # ms
+
+[Default touchpad gesture settings]
+MatchDevType=touchpad # mouse/touchpad
+MousedTwoFingerScroll=1 # 1/0
+MousedNaturalScroll=0 # 1/0
+MousedThreeFingerDrag=0 # 1/0
+MousedSoftButton2X=42 # pct
+MousedSoftButton3X=58 # pct
+MousedSoftButtonsY=25 # pct
+MousedTapTimeout=180 # ms
+#MousedTapPressureThreshold=20
+MousedTapMaxDelta=1.3 # mm
+MousedTapholdTimeout=300 # ms
+MousedVScrollMinDelta=1.25 # mm
+MousedVScrollHorArea=0.0 # mm
+MousedVScrollVerArea=-15.0 # mm
diff --git a/usr.sbin/moused/moused/moused.conf.5 b/usr.sbin/moused/moused/moused.conf.5
new file mode 100644
index 000000000000..bc62b5d00995
--- /dev/null
+++ b/usr.sbin/moused/moused/moused.conf.5
@@ -0,0 +1,422 @@
+.\" SPDX-License-Identifier: BSD-2-Clause
+.\"
+.\" Copyright (c) 2025 Vladimir Kondratyev <wulf@FreeBSD.org>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd May 19, 2025
+.Dt MOUSED.CONF 5
+.Os
+.Sh NAME
+.Nm moused.conf
+.Nd mouse daemon configuration file
+.Sh DESCRIPTION
+The
+.Nm
+file specifies how the
+.Xr moused 8
+(mouse daemon) should operate. It provides ability to adjust certain
+mice parameters on per-device basis.
+.Pp
+Configuration file format is derrived from
+.Xr libinput 1
+device quirk files.
+A file may contain multiple section headers ([some identifier])
+followed by one or more MatchFoo=Bar directives, followed by at least
+one of MousedFoo=bar or AttrFoo=bar directive.
+A configuration file must contain at least one section, each section
+must have at least one
+.Sq Match
+tag and at least one of either
+.Sq Attr
+or
+.Sq Moused .
+Section names are free-form and may contain spaces.
+.Ss List of currently available matches.
+.Bl -tag -width indent
+.It MatchName, MatchUniq
+Match on the NAME or UNIQ udev property on this device. These
+properties are typically derived from the device’s kernel name or uniq.
+These matches use
+.Fn fnmatch
+globs.
+.It MatchBus
+A lower-case bus name. Currently supported are usb, bluetooth, ps2,
+rmi, i2c, and spi.
+.It MatchVendor, MatchProduct, MatchVersion
+The hexadecmial 4-digit vendor ID, product ID or driver version as
+exported, without a 0x prefix.
+.It MatchDMIModalias, MatchDeviceTree
+An
+.Fn fnmatch
+glob for the DMI modalias or the DeviceTree compatible string.
+.It MatchDevType
+One of touchpad, mouse, pointingstick, keyboard, joystick, tablet,
+tablet-pad.
+Only touchpad and mouse types are suppported.
+.El
+.Ss List of currently available Moused tags.
+.Bl -tag -width indent
+.It MousedGrabDevice
+Only for evdev interface.
+Become the sole recipient of all incoming input events.
+This prevents other processes from getting input events on the device.
+.Pp
+Use
+.Fl g
+option alternatively.
+.It MousedIgnoreDevice
+Ignore given device.
+.It MousedClickThreshold
+Set double click speed as the maximum interval in msec between button clicks.
+Without this option, the default value of 500 msec will be assumed.
+This option will have effect only on the cut and paste operations
+in the text mode console.
+The user program which is reading mouse data
+via
+.Xr sysmouse 4
+will not be affected.
+.Pp
+Use
+.Fl C
+option alternatively.
+.It MousedEmulateThirdButton
+Emulate the third (middle) button for 2-button mice.
+It is emulated
+by pressing the left and right physical buttons simultaneously.
+.Pp
+Use
+.Fl 3
+option alternatively.
+.It MousedEmulateThirdButtonTimeout
+When the third button emulation is enabled
+(see above),
+the
+.Xr moused 8
+utility waits
+.Ar MousedEmulateThirdButtonTimeout
+msec at most before deciding whether two buttons are being pressed
+simultaneously.
+The default timeout is 100 msec.
+.Pp
+Use
+.Fl E
+option alternatively.
+.It MousedLinearAccelX
+.It MousedLinearAccelY
+.It MousedLinearAccelZ
+Accelerate or decelerate the mouse input.
+This is a linear acceleration only.
+Values less than 1.0 slow down movement, values greater than 1.0 speed it
+up.
+.Pp
+You can use the
+.Ar MousedLinearAccel
+and
+.Ar MousedExponentialAccel
+options at the same time to have the combined effect
+of linear and exponential acceleration.
+.Pp
+Use
+.Fl a
+option alternatively.
+.It MousedExponentialAccel
+.It MousedExponentialOffset
+Apply exponential (dynamic) acceleration to mouse movements:
+the faster you move the mouse, the more it will be accelerated.
+That means that small mouse movements are not accelerated,
+so they are still very accurate, while a faster movement will
+drive the pointer quickly across the screen.
+.Pp
+The
+.Ar MousedExponentialAccel
+value specifies the exponent, which is basically
+the amount of acceleration. Useful values are in the
+range 1.1 to 2.0, but it depends on your mouse hardware
+and your personal preference. A value of 1.0 means no
+exponential acceleration. A value of 2.0 means squared
+acceleration (i.e. if you move the mouse twice as fast,
+the pointer will move four times as fast on the screen).
+Values beyond 2.0 are possible but not recommended.
+A good value to start is probably 1.5.
+.Pp
+The optional
+.Ar MousedExponentialOffset
+value specifies the distance at which the acceleration
+begins. The default is 1.0, which means that the
+acceleration is applied to movements larger than one unit.
+If you specify a larger value, it takes more speed for
+the acceleration to kick in, i.e. the speed range for
+small and accurate movements is wider.
+Usually the default should be sufficient, but if you're
+not satisfied with the behaviour, try a value of 2.0.
+.Pp
+Note that the
+.Fl A
+option interacts badly with the X server's own acceleration,
+which doesn't work very well anyway. Therefore it is
+recommended to switch it off if necessary:
+.Dq xset m 1 .
+.Pp
+Use
+.Fl A
+option alternatively.
+.It MousedMapZAxis
+Map Z axis (roller/wheel) movement to another axis or to virtual buttons.
+Does not supported yet.
+Use
+.Fl z
+option instead.
+.It MousedVirtualScrollEnable
+Enable
+.Dq Virtual Scrolling .
+With this option set, holding the middle mouse
+button down will cause motion to be interpreted as scrolling.
+Use the
+.Ar MousedVirtualScrollThreshold
+option to set the distance the mouse must move before the scrolling mode is
+activated and the
+.Ar MousedVirtualScrollSpeed
+option to set the scrolling speed.
+.Pp
+Use
+.Fl V
+option alternatively.
+.It MousedHorVirtualScrollEnable
+Enable
+.Dq Horizontal Virtual Scrolling .
+With this option set, holding the middle mouse
+button down will cause motion to be interpreted as
+horizontal scrolling.
+Use the
+.Ar MousedVirtualScrollThreshold
+option to set the distance the mouse must move before the scrolling mode is
+activated and the
+.Ar MousedVirtualScrollSpeed
+option to set the scrolling speed.
+This option may be used with or without the
+.Ar MousedVirtualScrollEnable
+option.
+.Pp
+Use
+.Fl H
+option alternatively.
+.It MousedVirtualScrollSpeed= Ar distance
+When
+.Dq Virtual Scrolling
+is enabled, the
+.Ar MousedVirtualScrollSpeed
+option can be used to set the
+.Ar distance
+(in pixels) that the mouse must move before a scroll event
+is generated.
+This effectively controls the scrolling speed.
+The default
+.Ar distance
+is 2 pixels.
+.Pp
+Use
+.Fl L
+option alternatively.
+.It MousedVirtualScrollThreshold= Ar distance
+When
+.Dq Virtual Scrolling
+is enabled, the
+.Ar MousedVirtualScrollThreshold
+option can be used to set the
+.Ar distance
+(in pixels) that the mouse must move before the scrolling
+mode is activated.
+The default
+.Ar distance
+is 3 pixels.
+.Pp
+Use
+.Fl U
+option alternatively.
+.It MousedWMode= Ar N
+Make the physical button
+.Ar N
+act as the wheel mode button.
+While this button is pressed, X and Y axis movement is reported to be zero
+and the Y axis movement is mapped to Z axis.
+You may further map the Z axis movement to virtual buttons by the
+.Ar MousedMapZAxis
+tag.
+.Pp
+Use
+.Fl w
+option alternatively.
+.El
+.Ss List of currently available Moused mice specific tags.
+.Bl -tag -width indent
+.It MousedDriftTerminate
+.It MousedDriftDistance
+.It MousedDriftTime
+.It MousedDriftAfter
+Terminate drift.
+Use this option if mouse pointer slowly wanders when mouse is not moved.
+Movements up to
+.Ar MousedDriftDistance
+(for example 4) pixels (X+Y) in
+.Ar MousedDriftTime
+msec (default 500) are ignored, except during
+.Ar MousedDriftAfter
+msec (default 4000) since last real mouse movement.
+.Pp
+Use
+.Fl T
+option alternatively.
+.El
+.Ss List of currently available Moused touchpad specific tags.
+.Bl -tag -width indent
+.It MousedTwoFingerScroll
+Enable two finger scrolling.
+.It MousedNaturalScroll
+Enable natural scrolling.
+.It MousedThreeFingerDrag
+Enable dragging with three fingers.
+.It MousedSoftButton2X
+Horisontal position of 2-nd softbutton left edge in percents.
+(0-disable)
+.It MousedSoftButton3X
+Horisontal position of 3-rd softbutton left edge in percents.
+(0-disable)
+.It MousedSoftButtonsY
+Vertical size of softbuttons area in percents.
+Use negative values to place softbutton area at top of touchpad.
+.It MousedTapTimeout
+Tap timeout in milliseconds
+.It MousedTapPressureThreshold
+Pressure threshold to detect tap.
+.It MousedTapMaxDelta
+Length of finger movement above which a tap is ignored measured in mm.
+.It MousedTapholdTimeout
+Maximum elapsed time between two taps to consider a tap-hold action.
+.It MousedVScrollMinDelta
+Minimum movement to consider virtual scrolling.
+.It MousedVScrollHorArea
+ Area reserved for horizontal virtual scrolling in mm.
+.It MousedVScrollVerArea
+Area reserved for vertical virtual scrolling in mm.
+.El
+.Ss List of currently available libinput-compatible tags.
+.Bl -tag -width indent
+.It AttrSizeHint
+Hints at the width x height of the device in mm.
+.It AttrTouchSizeRange
+Not supported yet.
+.It AttrPalmSizeThreshold
+Maximum finger width to detect palm in mm.
+.It AttrLidSwitchReliability
+Not supported yet.
+.It AttrKeyboardIntegration
+Not supported yet.
+.It AttrPointingStickIntegration
+Not supported yet.
+.It AttrTPKComboLayout
+Not supported yet.
+.It AttrPressureRange= Ar N : Ar M
+Specifies the touch pressure required to trigger a press
+.Ar N
+and to trigger a release
+.Ar M .
+.It AttrPalmPressureThreshold
+Maximum pressure to detect palm.
+.It AttrResolutionHint
+Hints at the resolution of the x/y axis in units/mm.
+.It AttrTrackpointMultiplier
+Not supported yet.
+.It AttrThumbPressureThreshold
+Not supported yet.
+.It AttrUseVelocityAveraging
+Not supported yet.
+.It AttrTabletSmoothing
+Not supported yet.
+.It AttrThumbSizeThreshold
+Not supported yet.
+.It AttrMscTimestamp
+Not supported yet.
+.It AttrEventCode
+Enables or disables the evdev event type/code tuples on the device.
+The prefix for each entry is either
+.Sq +
+(enable) or
+.Sq -
+(disable).
+Entries may be a named event type, or a named event code, or a named
+event type with a hexadecimal event code, separated by a single colon.
+.It AttrInputProp
+Enables or disables the evdev input property on the device.
+The prefix for each entry is either
+,Sq +
+(enable) or
+.Sq -
+(disable).
+Entries may be a named input property or the hexadecimal value of that
+property.
+.El
+.Pp
+All
+.Xr libinput 1
+.Sq Model
+quirks are currently ignored.
+.Sh FILES
+.Bl -tag -width /usr/local/etc/moused.conf -compact
+.It Pa /usr/local/etc/moused.conf
+The file
+.Nm
+resides in
+.Pa /usr/local/etc .
+.It Pa /usr/local/share/moused/*.quirks
+Predefined quirks processed before
+.Nm .
+.El
+.Sh EXAMPLES
+Set touch pressure and palm detection thesholds for PS/2 Synaptics
+touchpad:
+.Bd -literal -offset indent
+[SynPS/2 Synaptics TouchPad]
+MatchDevType=touchpad
+MatchName=SynPS/2 Synaptics TouchPad
+AttrPressureRange=35:30
+AttrPalmPressureThreshold=220
+.Ed
+.Sh SEE ALSO
+.Xr moused 8
+.Pp
+.Xr libinput 1
+device quirk format:
+.Lk https://wayland.freedesktop.org/libinput/doc/latest/device-quirks.html
+.Sh HISTORY
+The
+.Nm
+file format first appeared in
+.Fx 15.0 .
+.Sh AUTHORS
+This manual page was written by
+.An Vladimir Kondratyev Aq Mt wulf@FreeBSD.org
+based on
+. Xr moused 8
+manual page and
+.Xr libinput 1
+documentation.
diff --git a/usr.sbin/moused/moused/quirks.c b/usr.sbin/moused/moused/quirks.c
new file mode 100644
index 000000000000..3b87b34419e9
--- /dev/null
+++ b/usr.sbin/moused/moused/quirks.c
@@ -0,0 +1,2033 @@
+/*
+ * Copyright © 2018 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/* This has the hallmarks of a library to make it re-usable from the tests
+ * and from the list-quirks tool. It doesn't have all of the features from a
+ * library you'd expect though
+ */
+
+#include <sys/types.h>
+#include <dev/evdev/input.h>
+
+#undef NDEBUG /* You don't get to disable asserts here */
+#include <assert.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fnmatch.h>
+#include <kenv.h>
+#include <libgen.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "quirks.h"
+#include "util.h"
+#include "util-list.h"
+
+
+/* Custom logging so we can have detailed output for the tool but minimal
+ * logging for moused itself. */
+#define qlog_debug(ctx_, ...) quirk_log_msg((ctx_), QLOG_NOISE, __VA_ARGS__)
+#define qlog_info(ctx_, ...) quirk_log_msg((ctx_), QLOG_INFO, __VA_ARGS__)
+#define qlog_error(ctx_, ...) quirk_log_msg((ctx_), QLOG_ERROR, __VA_ARGS__)
+#define qlog_parser(ctx_, ...) quirk_log_msg((ctx_), QLOG_PARSER_ERROR, __VA_ARGS__)
+
+enum property_type {
+ PT_UINT,
+ PT_INT,
+ PT_STRING,
+ PT_BOOL,
+ PT_DIMENSION,
+ PT_RANGE,
+ PT_DOUBLE,
+ PT_TUPLES,
+ PT_UINT_ARRAY,
+};
+
+struct quirk_array {
+ union {
+ uint32_t u[32];
+ } data;
+ size_t nelements;
+};
+
+/**
+ * Generic value holder for the property types we support. The type
+ * identifies which value in the union is defined and we expect callers to
+ * already know which type yields which value.
+ */
+struct property {
+ size_t refcount;
+ struct list link; /* struct sections.properties */
+
+ enum quirk id;
+ enum property_type type;
+ union {
+ bool b;
+ uint32_t u;
+ int32_t i;
+ char *s;
+ double d;
+ struct quirk_dimensions dim;
+ struct quirk_range range;
+ struct quirk_tuples tuples;
+ struct quirk_array array;
+ } value;
+};
+
+enum match_flags {
+ M_NAME = bit(0),
+ M_BUS = bit(1),
+ M_VID = bit(2),
+ M_PID = bit(3),
+ M_DMI = bit(4),
+ M_UDEV_TYPE = bit(5),
+ M_DT = bit(6),
+ M_VERSION = bit(7),
+ M_UNIQ = bit(8),
+
+ M_LAST = M_UNIQ,
+};
+
+enum bustype {
+ BT_UNKNOWN,
+ BT_USB,
+ BT_BLUETOOTH,
+ BT_PS2,
+ BT_RMI,
+ BT_I2C,
+ BT_SPI,
+};
+
+enum udev_type {
+ UDEV_MOUSE = bit(1),
+ UDEV_POINTINGSTICK = bit(2),
+ UDEV_TOUCHPAD = bit(3),
+ UDEV_TABLET = bit(4),
+ UDEV_TABLET_PAD = bit(5),
+ UDEV_JOYSTICK = bit(6),
+ UDEV_KEYBOARD = bit(7),
+};
+
+/**
+ * Contains the combined set of matches for one section or the values for
+ * one device.
+ *
+ * bits defines which fields are set, the rest is zero.
+ */
+struct match {
+ uint32_t bits;
+
+ char *name;
+ char *uniq;
+ enum bustype bus;
+ uint32_t vendor;
+ uint32_t product[64]; /* zero-terminated */
+ uint32_t version;
+
+ char *dmi; /* dmi modalias with preceding "dmi:" */
+
+ /* We can have more than one type set, so this is a bitfield */
+ uint32_t udev_type;
+
+ char *dt; /* device tree compatible (first) string */
+};
+
+/**
+ * Represents one section in the .quirks file.
+ */
+struct section {
+ struct list link;
+
+ bool has_match; /* to check for empty sections */
+ bool has_property; /* to check for empty sections */
+
+ char *name; /* the [Section Name] */
+ struct match match;
+ struct list properties;
+};
+
+/**
+ * The struct returned to the caller. It contains the
+ * properties for a given device.
+ */
+struct quirks {
+ size_t refcount;
+ struct list link; /* struct quirks_context.quirks */
+
+ /* These are not ref'd, just a collection of pointers */
+ struct property **properties;
+ size_t nproperties;
+
+ /* Special properties for AttrEventCode and AttrInputCode, these are
+ * owned by us, not the section */
+ struct list floating_properties;
+};
+
+/**
+ * Quirk matching context, initialized once with quirks_init_subsystem()
+ */
+struct quirks_context {
+ size_t refcount;
+
+ moused_log_handler *log_handler;
+ enum quirks_log_type log_type;
+
+ char *dmi;
+ char *dt;
+
+ struct list sections;
+
+ /* list of quirks handed to moused, just for bookkeeping */
+ struct list quirks;
+};
+
+MOUSED_ATTRIBUTE_PRINTF(3, 0)
+static inline void
+quirk_log_msg_va(struct quirks_context *ctx,
+ enum quirks_log_priorities priority,
+ const char *format,
+ va_list args)
+{
+ switch (priority) {
+ /* We don't use this if we're logging through syslog */
+ default:
+ case QLOG_NOISE:
+ case QLOG_PARSER_ERROR:
+ if (ctx->log_type == QLOG_MOUSED_LOGGING)
+ return;
+ break;
+ case QLOG_DEBUG: /* These map straight to syslog priorities */
+ case QLOG_INFO:
+ case QLOG_ERROR:
+ break;
+ }
+
+ ctx->log_handler(priority,
+ 0,
+ format,
+ args);
+}
+
+MOUSED_ATTRIBUTE_PRINTF(3, 4)
+static inline void
+quirk_log_msg(struct quirks_context *ctx,
+ enum quirks_log_priorities priority,
+ const char *format,
+ ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ quirk_log_msg_va(ctx, priority, format, args);
+ va_end(args);
+
+}
+
+const char *
+quirk_get_name(enum quirk q)
+{
+ switch(q) {
+ case QUIRK_MODEL_ALPS_SERIAL_TOUCHPAD: return "ModelALPSSerialTouchpad";
+ case QUIRK_MODEL_APPLE_TOUCHPAD: return "ModelAppleTouchpad";
+ case QUIRK_MODEL_APPLE_TOUCHPAD_ONEBUTTON: return "ModelAppleTouchpadOneButton";
+ case QUIRK_MODEL_BOUNCING_KEYS: return "ModelBouncingKeys";
+ case QUIRK_MODEL_CHROMEBOOK: return "ModelChromebook";
+ case QUIRK_MODEL_CLEVO_W740SU: return "ModelClevoW740SU";
+ case QUIRK_MODEL_DELL_CANVAS_TOTEM: return "ModelDellCanvasTotem";
+ case QUIRK_MODEL_HP_PAVILION_DM4_TOUCHPAD: return "ModelHPPavilionDM4Touchpad";
+ case QUIRK_MODEL_HP_ZBOOK_STUDIO_G3: return "ModelHPZBookStudioG3";
+ case QUIRK_MODEL_INVERT_HORIZONTAL_SCROLLING: return "ModelInvertHorizontalScrolling";
+ case QUIRK_MODEL_LENOVO_SCROLLPOINT: return "ModelLenovoScrollPoint";
+ case QUIRK_MODEL_LENOVO_T450_TOUCHPAD: return "ModelLenovoT450Touchpad";
+ case QUIRK_MODEL_LENOVO_X1GEN6_TOUCHPAD: return "ModelLenovoX1Gen6Touchpad";
+ case QUIRK_MODEL_LENOVO_X230: return "ModelLenovoX230";
+ case QUIRK_MODEL_SYNAPTICS_SERIAL_TOUCHPAD: return "ModelSynapticsSerialTouchpad";
+ case QUIRK_MODEL_SYSTEM76_BONOBO: return "ModelSystem76Bonobo";
+ case QUIRK_MODEL_SYSTEM76_GALAGO: return "ModelSystem76Galago";
+ case QUIRK_MODEL_SYSTEM76_KUDU: return "ModelSystem76Kudu";
+ case QUIRK_MODEL_TABLET_MODE_NO_SUSPEND: return "ModelTabletModeNoSuspend";
+ case QUIRK_MODEL_TABLET_MODE_SWITCH_UNRELIABLE: return "ModelTabletModeSwitchUnreliable";
+ case QUIRK_MODEL_TOUCHPAD_VISIBLE_MARKER: return "ModelTouchpadVisibleMarker";
+ case QUIRK_MODEL_TOUCHPAD_PHANTOM_CLICKS: return "ModelTouchpadPhantomClicks";
+ case QUIRK_MODEL_TRACKBALL: return "ModelTrackball";
+ case QUIRK_MODEL_WACOM_TOUCHPAD: return "ModelWacomTouchpad";
+ case QUIRK_MODEL_PRESSURE_PAD: return "ModelPressurePad";
+
+ case QUIRK_ATTR_SIZE_HINT: return "AttrSizeHint";
+ case QUIRK_ATTR_TOUCH_SIZE_RANGE: return "AttrTouchSizeRange";
+ case QUIRK_ATTR_PALM_SIZE_THRESHOLD: return "AttrPalmSizeThreshold";
+ case QUIRK_ATTR_LID_SWITCH_RELIABILITY: return "AttrLidSwitchReliability";
+ case QUIRK_ATTR_KEYBOARD_INTEGRATION: return "AttrKeyboardIntegration";
+ case QUIRK_ATTR_TRACKPOINT_INTEGRATION: return "AttrPointingStickIntegration";
+ case QUIRK_ATTR_TPKBCOMBO_LAYOUT: return "AttrTPKComboLayout";
+ case QUIRK_ATTR_PRESSURE_RANGE: return "AttrPressureRange";
+ case QUIRK_ATTR_PALM_PRESSURE_THRESHOLD: return "AttrPalmPressureThreshold";
+ case QUIRK_ATTR_RESOLUTION_HINT: return "AttrResolutionHint";
+ case QUIRK_ATTR_TRACKPOINT_MULTIPLIER: return "AttrTrackpointMultiplier";
+ case QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD: return "AttrThumbPressureThreshold";
+ case QUIRK_ATTR_USE_VELOCITY_AVERAGING: return "AttrUseVelocityAveraging";
+ case QUIRK_ATTR_TABLET_SMOOTHING: return "AttrTabletSmoothing";
+ case QUIRK_ATTR_THUMB_SIZE_THRESHOLD: return "AttrThumbSizeThreshold";
+ case QUIRK_ATTR_MSC_TIMESTAMP: return "AttrMscTimestamp";
+ case QUIRK_ATTR_EVENT_CODE: return "AttrEventCode";
+ case QUIRK_ATTR_INPUT_PROP: return "AttrInputProp";
+
+ case MOUSED_GRAB_DEVICE: return "MousedGrabDevice";
+ case MOUSED_IGNORE_DEVICE: return "MousedIgnoreDevice";
+
+ case MOUSED_CLICK_THRESHOLD: return "MousedClickThreshold";
+ case MOUSED_DRIFT_TERMINATE: return "MousedDriftTerminate";
+ case MOUSED_DRIFT_DISTANCE: return "MousedDriftDistance";
+ case MOUSED_DRIFT_TIME: return "MousedDriftTime";
+ case MOUSED_DRIFT_AFTER: return "MousedDriftAfter";
+ case MOUSED_EMULATE_THIRD_BUTTON: return "MousedEmulateThirdButton";
+ case MOUSED_EMULATE_THIRD_BUTTON_TIMEOUT: return "MousedEmulateThirdButtonTimeout";
+ case MOUSED_EXPONENTIAL_ACCEL: return "MousedExponentialAccel";
+ case MOUSED_EXPONENTIAL_OFFSET: return "MousedExponentialOffset";
+ case MOUSED_LINEAR_ACCEL_X: return "MousedLinearAccelX";
+ case MOUSED_LINEAR_ACCEL_Y: return "MousedLinearAccelY";
+ case MOUSED_LINEAR_ACCEL_Z: return "MousedLinearAccelZ";
+ case MOUSED_MAP_Z_AXIS: return "MousedMapZAxis";
+ case MOUSED_VIRTUAL_SCROLL_ENABLE: return "MousedVirtualScrollEnable";
+ case MOUSED_HOR_VIRTUAL_SCROLL_ENABLE: return "MousedHorVirtualScrollEnable";
+ case MOUSED_VIRTUAL_SCROLL_SPEED: return "MousedVirtualScrollSpeed";
+ case MOUSED_VIRTUAL_SCROLL_THRESHOLD: return "MousedVirtualScrollThreshold";
+ case MOUSED_WMODE: return "MousedWMode";
+
+ case MOUSED_TWO_FINGER_SCROLL: return "MousedTwoFingerScroll";
+ case MOUSED_NATURAL_SCROLL: return "MousedNaturalScroll";
+ case MOUSED_THREE_FINGER_DRAG: return "MousedThreeFingerDrag";
+ case MOUSED_SOFTBUTTON2_X: return "MousedSoftButton2X";
+ case MOUSED_SOFTBUTTON3_X: return "MousedSoftButton3X";
+ case MOUSED_SOFTBUTTONS_Y: return "MousedSoftButtonsY";
+ case MOUSED_TAP_TIMEOUT: return "MousedTapTimeout";
+ case MOUSED_TAP_PRESSURE_THRESHOLD: return "MousedTapPressureThreshold";
+ case MOUSED_TAP_MAX_DELTA: return "MousedTapMaxDelta";
+ case MOUSED_TAPHOLD_TIMEOUT: return "MousedTapholdTimeout";
+ case MOUSED_VSCROLL_MIN_DELTA: return "MousedVScrollMinDelta";
+ case MOUSED_VSCROLL_HOR_AREA: return "MousedVScrollHorArea";
+ case MOUSED_VSCROLL_VER_AREA: return "MousedVScrollVerArea";
+
+
+ default:
+ abort();
+ }
+}
+
+static inline const char *
+matchflagname(enum match_flags f)
+{
+ switch(f) {
+ case M_NAME: return "MatchName"; break;
+ case M_BUS: return "MatchBus"; break;
+ case M_VID: return "MatchVendor"; break;
+ case M_PID: return "MatchProduct"; break;
+ case M_VERSION: return "MatchVersion"; break;
+ case M_DMI: return "MatchDMIModalias"; break;
+ case M_UDEV_TYPE: return "MatchDevType"; break;
+ case M_DT: return "MatchDeviceTree"; break;
+ case M_UNIQ: return "MatchUniq"; break;
+ default:
+ abort();
+ }
+}
+
+static inline struct property *
+property_new(void)
+{
+ struct property *p;
+
+ p = zalloc(sizeof *p);
+ p->refcount = 1;
+ list_init(&p->link);
+
+ return p;
+}
+
+static inline struct property *
+property_ref(struct property *p)
+{
+ assert(p->refcount > 0);
+ p->refcount++;
+ return p;
+}
+
+static inline struct property *
+property_unref(struct property *p)
+{
+ /* Note: we don't cleanup here, that is a separate call so we
+ can abort if we haven't cleaned up correctly. */
+ assert(p->refcount > 0);
+ p->refcount--;
+
+ return NULL;
+}
+
+/* Separate call so we can verify that the caller unrefs the property
+ * before shutting down the subsystem.
+ */
+static inline void
+property_cleanup(struct property *p)
+{
+ /* If we get here, the quirks must've been removed already */
+ property_unref(p);
+ assert(p->refcount == 0);
+
+ list_remove(&p->link);
+ if (p->type == PT_STRING)
+ free(p->value.s);
+ free(p);
+}
+
+/**
+ * Return the system DMI info in modalias format.
+ */
+static inline char *
+init_dmi(void)
+{
+#define LEN (KENV_MVALLEN + 1)
+ char *modalias;
+ char bios_vendor[LEN], bios_version[LEN], bios_date[LEN];
+ char sys_vendor[LEN], product_name[LEN], product_version[LEN];
+ char board_vendor[LEN], board_name[LEN], board_version[LEN];
+ char chassis_vendor[LEN], chassis_type[LEN], chassis_version[LEN];
+ int chassis_type_num = 0x2;
+
+ kenv(KENV_GET, "smbios.bios.vendor", bios_vendor, LEN);
+ kenv(KENV_GET, "smbios.bios.version", bios_version, LEN);
+ kenv(KENV_GET, "smbios.bios.reldate", bios_date, LEN);
+ kenv(KENV_GET, "smbios.system.maker", sys_vendor, LEN);
+ kenv(KENV_GET, "smbios.system.product", product_name, LEN);
+ kenv(KENV_GET, "smbios.system.version", product_version, LEN);
+ kenv(KENV_GET, "smbios.planar.maker", board_vendor, LEN);
+ kenv(KENV_GET, "smbios.planar.product", board_name, LEN);
+ kenv(KENV_GET, "smbios.planar.version", board_version, LEN);
+ kenv(KENV_GET, "smbios.chassis.vendor", chassis_vendor, LEN);
+ kenv(KENV_GET, "smbios.chassis.type", chassis_type, LEN);
+ kenv(KENV_GET, "smbios.chassis.version", chassis_version, LEN);
+#undef LEN
+
+ if (strcmp(chassis_type, "Desktop") == 0)
+ chassis_type_num = 0x3;
+ else if (strcmp(chassis_type, "Portable") == 0)
+ chassis_type_num = 0x8;
+ else if (strcmp(chassis_type, "Laptop") == 0)
+ chassis_type_num = 0x9;
+ else if (strcmp(chassis_type, "Notebook") == 0)
+ chassis_type_num = 0xA;
+ else if (strcmp(chassis_type, "Tablet") == 0)
+ chassis_type_num = 0x1E;
+ else if (strcmp(chassis_type, "Convertible") == 0)
+ chassis_type_num = 0x1F;
+ else if (strcmp(chassis_type, "Detachable") == 0)
+ chassis_type_num = 0x20;
+
+ xasprintf(&modalias,
+ "dmi:bvn%s:bvr%s:bd%s:svn%s:pn%s:pvr%s:rvn%s:rn%s:rvr%s:cvn%s:ct%d:cvr%s:",
+ bios_vendor, bios_version, bios_date, sys_vendor, product_name,
+ product_version, board_vendor, board_name, board_version, chassis_vendor,
+ chassis_type_num, chassis_version);
+
+ return modalias;
+}
+
+/**
+ * Return the dt compatible string
+ */
+static inline char *
+init_dt(void)
+{
+ char compatible[1024];
+ char *copy = NULL;
+ const char *syspath = "/sys/firmware/devicetree/base/compatible";
+ FILE *fp;
+
+ if (getenv("LIBINPUT_RUNNING_TEST_SUITE"))
+ return safe_strdup("");
+
+ fp = fopen(syspath, "r");
+ if (!fp)
+ return NULL;
+
+ /* devicetree/base/compatible has multiple null-terminated entries
+ but we only care about the first one here, so strdup is enough */
+ if (fgets(compatible, sizeof(compatible), fp)) {
+ copy = safe_strdup(compatible);
+ }
+
+ fclose(fp);
+
+ return copy;
+}
+
+static inline struct section *
+section_new(const char *path, const char *name)
+{
+ struct section *s = zalloc(sizeof(*s));
+
+ char *path_dup = safe_strdup(path);
+ xasprintf(&s->name, "%s (%s)", name, basename(path_dup));
+ free(path_dup);
+ list_init(&s->link);
+ list_init(&s->properties);
+
+ return s;
+}
+
+static inline void
+section_destroy(struct section *s)
+{
+ struct property *p;
+
+ free(s->name);
+ free(s->match.name);
+ free(s->match.uniq);
+ free(s->match.dmi);
+ free(s->match.dt);
+
+ list_for_each_safe(p, &s->properties, link)
+ property_cleanup(p);
+
+ assert(list_empty(&s->properties));
+
+ list_remove(&s->link);
+ free(s);
+}
+
+static inline bool
+parse_hex(const char *value, unsigned int *parsed)
+{
+ return strstartswith(value, "0x") &&
+ safe_atou_base(value, parsed, 16) &&
+ strspn(value, "0123456789xABCDEF") == strlen(value) &&
+ *parsed <= 0xFFFF;
+}
+
+static int
+strv_parse_hex(const char *str, size_t index, void *data)
+{
+ unsigned int *product = data;
+
+ return !parse_hex(str, &product[index]); /* 0 for success */
+}
+
+/**
+ * Parse a MatchFooBar=banana line.
+ *
+ * @param section The section struct to be filled in
+ * @param key The MatchFooBar part of the line
+ * @param value The banana part of the line.
+ *
+ * @return true on success, false otherwise.
+ */
+static bool
+parse_match(struct quirks_context *ctx,
+ struct section *s,
+ const char *key,
+ const char *value)
+{
+ int rc = false;
+
+#define check_set_bit(s_, bit_) { \
+ if ((s_)->match.bits & (bit_)) goto out; \
+ (s_)->match.bits |= (bit_); \
+ }
+
+ assert(strlen(value) >= 1);
+
+ if (streq(key, "MatchName")) {
+ check_set_bit(s, M_NAME);
+ s->match.name = safe_strdup(value);
+ } else if (streq(key, "MatchUniq")) {
+ check_set_bit(s, M_UNIQ);
+ s->match.uniq = safe_strdup(value);
+ } else if (streq(key, "MatchBus")) {
+ check_set_bit(s, M_BUS);
+ if (streq(value, "usb"))
+ s->match.bus = BT_USB;
+ else if (streq(value, "bluetooth"))
+ s->match.bus = BT_BLUETOOTH;
+ else if (streq(value, "ps2"))
+ s->match.bus = BT_PS2;
+ else if (streq(value, "rmi"))
+ s->match.bus = BT_RMI;
+ else if (streq(value, "i2c"))
+ s->match.bus = BT_I2C;
+ else if (streq(value, "spi"))
+ s->match.bus = BT_SPI;
+ else
+ goto out;
+ } else if (streq(key, "MatchVendor")) {
+ unsigned int vendor;
+
+ check_set_bit(s, M_VID);
+ if (!parse_hex(value, &vendor))
+ goto out;
+
+ s->match.vendor = vendor;
+ } else if (streq(key, "MatchProduct")) {
+ unsigned int product[ARRAY_LENGTH(s->match.product)] = {0};
+ const size_t max = ARRAY_LENGTH(s->match.product) - 1;
+
+ size_t nelems = 0;
+ char **strs = strv_from_string(value, ";", &nelems);
+ int rc = strv_for_each_n((const char**)strs, max, strv_parse_hex, product);
+ strv_free(strs);
+ if (rc != 0)
+ goto out;
+
+ check_set_bit(s, M_PID);
+ memcpy(s->match.product, product, sizeof(product));
+ } else if (streq(key, "MatchVersion")) {
+ unsigned int version;
+
+ check_set_bit(s, M_VERSION);
+ if (!parse_hex(value, &version))
+ goto out;
+
+ s->match.version = version;
+ } else if (streq(key, "MatchDMIModalias")) {
+ check_set_bit(s, M_DMI);
+ if (!strstartswith(value, "dmi:")) {
+ qlog_parser(ctx,
+ "%s: MatchDMIModalias must start with 'dmi:'\n",
+ s->name);
+ goto out;
+ }
+ s->match.dmi = safe_strdup(value);
+ } else if (streq(key, "MatchUdevType") || streq(key, "MatchDevType")) {
+ check_set_bit(s, M_UDEV_TYPE);
+ if (streq(value, "touchpad"))
+ s->match.udev_type = UDEV_TOUCHPAD;
+ else if (streq(value, "mouse"))
+ s->match.udev_type = UDEV_MOUSE;
+ else if (streq(value, "pointingstick"))
+ s->match.udev_type = UDEV_POINTINGSTICK;
+ else if (streq(value, "keyboard"))
+ s->match.udev_type = UDEV_KEYBOARD;
+ else if (streq(value, "joystick"))
+ s->match.udev_type = UDEV_JOYSTICK;
+ else if (streq(value, "tablet"))
+ s->match.udev_type = UDEV_TABLET;
+ else if (streq(value, "tablet-pad"))
+ s->match.udev_type = UDEV_TABLET_PAD;
+ else
+ goto out;
+ } else if (streq(key, "MatchDeviceTree")) {
+ check_set_bit(s, M_DT);
+ s->match.dt = safe_strdup(value);
+ } else {
+ qlog_error(ctx, "Unknown match key '%s'\n", key);
+ goto out;
+ }
+
+#undef check_set_bit
+ s->has_match = true;
+ rc = true;
+out:
+ return rc;
+}
+
+/**
+ * Parse a ModelFooBar=1 line.
+ *
+ * @param section The section struct to be filled in
+ * @param key The ModelFooBar part of the line
+ * @param value The value after the =, must be 1 or 0.
+ *
+ * @return true on success, false otherwise.
+ */
+static bool
+parse_model(struct quirks_context *ctx,
+ struct section *s,
+ const char *key,
+ const char *value)
+{
+ bool b;
+ enum quirk q = QUIRK_MODEL_ALPS_SERIAL_TOUCHPAD;
+
+ assert(strstartswith(key, "Model"));
+
+ if (!parse_boolean_property(value, &b))
+ return false;
+
+ do {
+ if (streq(key, quirk_get_name(q))) {
+ struct property *p = property_new();
+ p->id = q,
+ p->type = PT_BOOL;
+ p->value.b = b;
+ list_append(&s->properties, &p->link);
+ s->has_property = true;
+ return true;
+ }
+ } while (++q < _QUIRK_LAST_MODEL_QUIRK_);
+
+ qlog_error(ctx, "Unknown key %s in %s\n", key, s->name);
+
+ return false;
+}
+
+/**
+ * Parse a AttrFooBar=banana line.
+ *
+ * @param section The section struct to be filled in
+ * @param key The AttrFooBar part of the line
+ * @param value The banana part of the line.
+ *
+ * Value parsing depends on the attribute type.
+ *
+ * @return true on success, false otherwise.
+ */
+static inline bool
+parse_attr(struct quirks_context *ctx,
+ struct section *s,
+ const char *key,
+ const char *value)
+{
+ struct property *p = property_new();
+ bool rc = false;
+ struct quirk_dimensions dim;
+ struct quirk_range range;
+ unsigned int v;
+ bool b;
+ double d;
+
+ if (streq(key, quirk_get_name(QUIRK_ATTR_SIZE_HINT))) {
+ p->id = QUIRK_ATTR_SIZE_HINT;
+ if (!parse_dimension_property(value, &dim.x, &dim.y))
+ goto out;
+ p->type = PT_DIMENSION;
+ p->value.dim = dim;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_TOUCH_SIZE_RANGE))) {
+ p->id = QUIRK_ATTR_TOUCH_SIZE_RANGE;
+ if (!parse_range_property(value, &range.upper, &range.lower))
+ goto out;
+ p->type = PT_RANGE;
+ p->value.range = range;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_PALM_SIZE_THRESHOLD))) {
+ p->id = QUIRK_ATTR_PALM_SIZE_THRESHOLD;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_LID_SWITCH_RELIABILITY))) {
+ p->id = QUIRK_ATTR_LID_SWITCH_RELIABILITY;
+ if (!streq(value, "reliable") &&
+ !streq(value, "write_open") &&
+ !streq(value, "unreliable"))
+ goto out;
+ p->type = PT_STRING;
+ p->value.s = safe_strdup(value);
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_KEYBOARD_INTEGRATION))) {
+ p->id = QUIRK_ATTR_KEYBOARD_INTEGRATION;
+ if (!streq(value, "internal") && !streq(value, "external"))
+ goto out;
+ p->type = PT_STRING;
+ p->value.s = safe_strdup(value);
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_TRACKPOINT_INTEGRATION))) {
+ p->id = QUIRK_ATTR_TRACKPOINT_INTEGRATION;
+ if (!streq(value, "internal") && !streq(value, "external"))
+ goto out;
+ p->type = PT_STRING;
+ p->value.s = safe_strdup(value);
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_TPKBCOMBO_LAYOUT))) {
+ p->id = QUIRK_ATTR_TPKBCOMBO_LAYOUT;
+ if (!streq(value, "below"))
+ goto out;
+ p->type = PT_STRING;
+ p->value.s = safe_strdup(value);
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_PRESSURE_RANGE))) {
+ p->id = QUIRK_ATTR_PRESSURE_RANGE;
+ if (!parse_range_property(value, &range.upper, &range.lower))
+ goto out;
+ p->type = PT_RANGE;
+ p->value.range = range;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_PALM_PRESSURE_THRESHOLD))) {
+ p->id = QUIRK_ATTR_PALM_PRESSURE_THRESHOLD;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_RESOLUTION_HINT))) {
+ p->id = QUIRK_ATTR_RESOLUTION_HINT;
+ if (!parse_dimension_property(value, &dim.x, &dim.y))
+ goto out;
+ p->type = PT_DIMENSION;
+ p->value.dim = dim;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_TRACKPOINT_MULTIPLIER))) {
+ p->id = QUIRK_ATTR_TRACKPOINT_MULTIPLIER;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_USE_VELOCITY_AVERAGING))) {
+ p->id = QUIRK_ATTR_USE_VELOCITY_AVERAGING;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_TABLET_SMOOTHING))) {
+ p->id = QUIRK_ATTR_TABLET_SMOOTHING;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD))) {
+ p->id = QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_THUMB_SIZE_THRESHOLD))) {
+ p->id = QUIRK_ATTR_THUMB_SIZE_THRESHOLD;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_MSC_TIMESTAMP))) {
+ p->id = QUIRK_ATTR_MSC_TIMESTAMP;
+ if (!streq(value, "watch"))
+ goto out;
+ p->type = PT_STRING;
+ p->value.s = safe_strdup(value);
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_EVENT_CODE))) {
+ struct input_event events[32];
+ size_t nevents = ARRAY_LENGTH(events);
+
+ p->id = QUIRK_ATTR_EVENT_CODE;
+
+ if (!parse_evcode_property(value, events, &nevents) ||
+ nevents == 0)
+ goto out;
+
+ for (size_t i = 0; i < nevents; i++) {
+ p->value.tuples.tuples[i].first = events[i].type;
+ p->value.tuples.tuples[i].second = events[i].code;
+ p->value.tuples.tuples[i].third = events[i].value;
+ }
+ p->value.tuples.ntuples = nevents;
+ p->type = PT_TUPLES;
+
+ rc = true;
+ } else if (streq(key, quirk_get_name(QUIRK_ATTR_INPUT_PROP))) {
+ struct input_prop props[INPUT_PROP_CNT];
+ size_t nprops = ARRAY_LENGTH(props);
+
+ p->id = QUIRK_ATTR_INPUT_PROP;
+
+ if (!parse_input_prop_property(value, props, &nprops) ||
+ nprops == 0)
+ goto out;
+
+ for (size_t i = 0; i < nprops; i++) {
+ p->value.tuples.tuples[i].first = props[i].prop;
+ p->value.tuples.tuples[i].second = props[i].enabled;
+ }
+
+ rc = true;
+ } else {
+ qlog_error(ctx, "Unknown key %s in %s\n", key, s->name);
+ }
+out:
+ if (rc) {
+ list_append(&s->properties, &p->link);
+ s->has_property = true;
+ } else {
+ property_cleanup(p);
+ }
+ return rc;
+}
+
+/**
+ * Parse a MousedFooBar=banana line.
+ *
+ * @param section The section struct to be filled in
+ * @param key The MousedFooBar part of the line
+ * @param value The banana part of the line.
+ *
+ * Value parsing depends on the attribute type.
+ *
+ * @return true on success, false otherwise.
+ */
+static inline bool
+parse_moused(struct quirks_context *ctx,
+ struct section *s,
+ const char *key,
+ const char *value)
+{
+ struct property *p = property_new();
+ bool rc = false;
+ struct quirk_dimensions dim;
+ struct quirk_range range;
+ unsigned int v;
+ int i;
+ bool b;
+ double d;
+
+ if (streq(key, quirk_get_name(MOUSED_GRAB_DEVICE))) {
+ p->id = MOUSED_GRAB_DEVICE;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_IGNORE_DEVICE))) {
+ p->id = MOUSED_IGNORE_DEVICE;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_CLICK_THRESHOLD))) {
+ p->id = MOUSED_CLICK_THRESHOLD;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_DRIFT_TERMINATE))) {
+ p->id = MOUSED_DRIFT_TERMINATE;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_DRIFT_DISTANCE))) {
+ p->id = MOUSED_DRIFT_DISTANCE;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_DRIFT_TIME))) {
+ p->id = MOUSED_DRIFT_TIME;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_DRIFT_AFTER))) {
+ p->id = MOUSED_DRIFT_AFTER;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_EMULATE_THIRD_BUTTON))) {
+ p->id = MOUSED_EMULATE_THIRD_BUTTON;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_EMULATE_THIRD_BUTTON_TIMEOUT))) {
+ p->id = MOUSED_EMULATE_THIRD_BUTTON_TIMEOUT;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_EXPONENTIAL_ACCEL))) {
+ p->id = MOUSED_EXPONENTIAL_ACCEL;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_EXPONENTIAL_OFFSET))) {
+ p->id = MOUSED_EXPONENTIAL_OFFSET;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_LINEAR_ACCEL_X))) {
+ p->id = MOUSED_LINEAR_ACCEL_X;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_LINEAR_ACCEL_Y))) {
+ p->id = MOUSED_LINEAR_ACCEL_Y;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_LINEAR_ACCEL_Z))) {
+ p->id = MOUSED_LINEAR_ACCEL_Z;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_MAP_Z_AXIS))) {
+ } else if (streq(key, quirk_get_name(MOUSED_VIRTUAL_SCROLL_ENABLE))) {
+ p->id = MOUSED_VIRTUAL_SCROLL_ENABLE;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_HOR_VIRTUAL_SCROLL_ENABLE))) {
+ p->id = MOUSED_HOR_VIRTUAL_SCROLL_ENABLE;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_VIRTUAL_SCROLL_SPEED))) {
+ p->id = MOUSED_VIRTUAL_SCROLL_SPEED;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_VIRTUAL_SCROLL_THRESHOLD))) {
+ p->id = MOUSED_VIRTUAL_SCROLL_THRESHOLD;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_WMODE))) {
+ p->id = MOUSED_WMODE;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_TWO_FINGER_SCROLL))) {
+ p->id = MOUSED_TWO_FINGER_SCROLL;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_NATURAL_SCROLL))) {
+ p->id = MOUSED_NATURAL_SCROLL;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_THREE_FINGER_DRAG))) {
+ p->id = MOUSED_THREE_FINGER_DRAG;
+ if (!parse_boolean_property(value, &b))
+ goto out;
+ p->type = PT_BOOL;
+ p->value.b = b;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_SOFTBUTTON2_X))) {
+ p->id = MOUSED_SOFTBUTTON2_X;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_SOFTBUTTON3_X))) {
+ p->id = MOUSED_SOFTBUTTON3_X;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_SOFTBUTTONS_Y))) {
+ p->id = MOUSED_SOFTBUTTONS_Y;
+ if (!safe_atoi(value, &i))
+ goto out;
+ p->type = PT_INT;
+ p->value.i = i;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_TAP_TIMEOUT))) {
+ p->id = MOUSED_TAP_TIMEOUT;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_TAP_PRESSURE_THRESHOLD))) {
+ p->id = MOUSED_TAP_PRESSURE_THRESHOLD;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_TAP_MAX_DELTA))) {
+ p->id = MOUSED_TAP_MAX_DELTA;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_TAPHOLD_TIMEOUT))) {
+ p->id = MOUSED_TAPHOLD_TIMEOUT;
+ if (!safe_atou(value, &v))
+ goto out;
+ p->type = PT_UINT;
+ p->value.u = v;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_VSCROLL_MIN_DELTA))) {
+ p->id = MOUSED_VSCROLL_MIN_DELTA;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_VSCROLL_HOR_AREA))) {
+ p->id = MOUSED_VSCROLL_HOR_AREA;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else if (streq(key, quirk_get_name(MOUSED_VSCROLL_VER_AREA))) {
+ p->id = MOUSED_VSCROLL_VER_AREA;
+ if (!safe_atod(value, &d))
+ goto out;
+ p->type = PT_DOUBLE;
+ p->value.d = d;
+ rc = true;
+ } else {
+ qlog_error(ctx, "Unknown key %s in %s\n", key, s->name);
+ }
+out:
+ if (rc) {
+ list_append(&s->properties, &p->link);
+ s->has_property = true;
+ } else {
+ property_cleanup(p);
+ }
+ return rc;
+}
+
+/**
+ * Parse a single line, expected to be in the format Key=value. Anything
+ * else will be rejected with a failure.
+ *
+ * Our data files can only have Match, Model and Attr, so let's check for
+ * those too.
+ */
+static bool
+parse_value_line(struct quirks_context *ctx, struct section *s, const char *line)
+{
+ bool rc = false;
+
+ size_t nelem;
+ char **strv = strv_from_string(line, "=", &nelem);
+ if (!strv || nelem != 2)
+ goto out;
+
+ const char *key = strv[0];
+ const char *value = strv[1];
+ if (strlen(key) == 0 || strlen(value) == 0)
+ goto out;
+
+ /* Whatever the value is, it's not supposed to be in quotes */
+ if (value[0] == '"' || value[0] == '\'')
+ goto out;
+
+ if (strstartswith(key, "Match"))
+ rc = parse_match(ctx, s, key, value);
+ else if (strstartswith(key, "Model"))
+ rc = parse_model(ctx, s, key, value);
+ else if (strstartswith(key, "Attr"))
+ rc = parse_attr(ctx, s, key, value);
+ else if (strstartswith(key, "Moused"))
+ rc = parse_moused(ctx, s, key, value);
+ else
+ qlog_error(ctx, "Unknown value prefix %s\n", line);
+out:
+ strv_free(strv);
+ return rc;
+}
+
+static inline bool
+parse_file(struct quirks_context *ctx, const char *path)
+{
+ enum state {
+ STATE_SECTION,
+ STATE_MATCH,
+ STATE_MATCH_OR_VALUE,
+ STATE_VALUE_OR_SECTION,
+ STATE_ANY,
+ };
+ FILE *fp;
+ char line[512];
+ bool rc = false;
+ enum state state = STATE_SECTION;
+ struct section *section = NULL;
+ int lineno = -1;
+
+ qlog_debug(ctx, "%s\n", path);
+
+ /* Not using open_restricted here, if we can't access
+ * our own data files, our installation is screwed up.
+ */
+ fp = fopen(path, "r");
+ if (!fp) {
+ /* If the file doesn't exist that's fine. Only way this can
+ * happen is for the custom override file, all others are
+ * provided by scandir so they do exist. Short of races we
+ * don't care about. */
+ if (errno == ENOENT)
+ return true;
+
+ qlog_error(ctx, "%s: failed to open file\n", path);
+ goto out;
+ }
+
+ while (fgets(line, sizeof(line), fp)) {
+ char *comment;
+
+ lineno++;
+
+ comment = strstr(line, "#");
+ if (comment) {
+ /* comment points to # but we need to remove the
+ * preceding whitespaces too */
+ comment--;
+ while (comment >= line) {
+ if (*comment != ' ' && *comment != '\t')
+ break;
+ comment--;
+ }
+ *(comment + 1) = '\0';
+ } else { /* strip the trailing newline */
+ comment = strstr(line, "\n");
+ if (comment)
+ *comment = '\0';
+ }
+ if (strlen(line) == 0)
+ continue;
+
+ /* We don't use quotes for strings, so we really don't want
+ * erroneous trailing whitespaces */
+ switch (line[strlen(line) - 1]) {
+ case ' ':
+ case '\t':
+ qlog_parser(ctx,
+ "%s:%d: Trailing whitespace '%s'\n",
+ path, lineno, line);
+ goto out;
+ }
+
+ switch (line[0]) {
+ case '\0':
+ case '\n':
+ case '#':
+ break;
+ /* white space not allowed */
+ case ' ':
+ case '\t':
+ qlog_parser(ctx, "%s:%d: Preceding whitespace '%s'\n",
+ path, lineno, line);
+ goto out;
+ /* section title */
+ case '[':
+ if (line[strlen(line) - 1] != ']') {
+ qlog_parser(ctx, "%s:%d: Closing ] missing '%s'\n",
+ path, lineno, line);
+ goto out;
+ }
+
+ if (state != STATE_SECTION &&
+ state != STATE_VALUE_OR_SECTION) {
+ qlog_parser(ctx, "%s:%d: expected section before %s\n",
+ path, lineno, line);
+ goto out;
+ }
+ if (section &&
+ (!section->has_match || !section->has_property)) {
+ qlog_parser(ctx, "%s:%d: previous section %s was empty\n",
+ path, lineno, section->name);
+ goto out; /* Previous section was empty */
+ }
+
+ state = STATE_MATCH;
+ section = section_new(path, line);
+ list_append(&ctx->sections, &section->link);
+ break;
+ default:
+ /* entries must start with A-Z */
+ if (line[0] < 'A' || line[0] > 'Z') {
+ qlog_parser(ctx, "%s:%d: Unexpected line %s\n",
+ path, lineno, line);
+ goto out;
+ }
+ switch (state) {
+ case STATE_SECTION:
+ qlog_parser(ctx, "%s:%d: expected [Section], got %s\n",
+ path, lineno, line);
+ goto out;
+ case STATE_MATCH:
+ if (!strstartswith(line, "Match")) {
+ qlog_parser(ctx, "%s:%d: expected MatchFoo=bar, have %s\n",
+ path, lineno, line);
+ goto out;
+ }
+ state = STATE_MATCH_OR_VALUE;
+ break;
+ case STATE_MATCH_OR_VALUE:
+ if (!strstartswith(line, "Match"))
+ state = STATE_VALUE_OR_SECTION;
+ break;
+ case STATE_VALUE_OR_SECTION:
+ if (strstartswith(line, "Match")) {
+ qlog_parser(ctx, "%s:%d: expected value or [Section], have %s\n",
+ path, lineno, line);
+ goto out;
+ }
+ break;
+ case STATE_ANY:
+ break;
+ }
+
+ if (!parse_value_line(ctx, section, line)) {
+ qlog_parser(ctx, "%s:%d: failed to parse %s\n",
+ path, lineno, line);
+ goto out;
+ }
+ break;
+ }
+ }
+
+ if (!section) {
+ qlog_parser(ctx, "%s: is an empty file\n", path);
+ goto out;
+ }
+
+ if ((!section->has_match || !section->has_property)) {
+ qlog_parser(ctx, "%s:%d: previous section %s was empty\n",
+ path, lineno, section->name);
+ goto out; /* Previous section was empty */
+ }
+
+ rc = true;
+out:
+ if (fp)
+ fclose(fp);
+
+ return rc;
+}
+
+static int
+is_data_file(const struct dirent *dir) {
+ return strendswith(dir->d_name, ".quirks");
+}
+
+static inline bool
+parse_files(struct quirks_context *ctx, const char *data_path)
+{
+ struct dirent **namelist;
+ int ndev = -1;
+ int idx = 0;
+
+ ndev = scandir(data_path, &namelist, is_data_file, versionsort);
+ if (ndev <= 0) {
+ qlog_error(ctx,
+ "%s: failed to find data files\n",
+ data_path);
+ return false;
+ }
+
+ for (idx = 0; idx < ndev; idx++) {
+ char path[PATH_MAX];
+
+ snprintf(path,
+ sizeof(path),
+ "%s/%s",
+ data_path,
+ namelist[idx]->d_name);
+
+ if (!parse_file(ctx, path))
+ break;
+ }
+
+ for (int i = 0; i < ndev; i++)
+ free(namelist[i]);
+ free(namelist);
+
+ return idx == ndev;
+}
+
+struct quirks_context *
+quirks_init_subsystem(const char *data_path,
+ const char *override_file,
+ moused_log_handler log_handler,
+ enum quirks_log_type log_type)
+{
+ _unref_(quirks_context) *ctx = zalloc(sizeof *ctx);
+
+ assert(data_path);
+
+ ctx->refcount = 1;
+ ctx->log_handler = log_handler;
+ ctx->log_type = log_type;
+ list_init(&ctx->quirks);
+ list_init(&ctx->sections);
+
+ qlog_debug(ctx, "%s is data root\n", data_path);
+
+ ctx->dmi = init_dmi();
+ ctx->dt = init_dt();
+ if (!ctx->dmi && !ctx->dt)
+ return NULL;
+
+ if (!parse_files(ctx, data_path))
+ return NULL;
+
+ if (override_file && !parse_file(ctx, override_file))
+ return NULL;
+
+ return steal(&ctx);
+}
+
+struct quirks_context *
+quirks_context_ref(struct quirks_context *ctx)
+{
+ assert(ctx->refcount > 0);
+ ctx->refcount++;
+
+ return ctx;
+}
+
+struct quirks_context *
+quirks_context_unref(struct quirks_context *ctx)
+{
+ struct section *s;
+
+ if (!ctx)
+ return NULL;
+
+ assert(ctx->refcount >= 1);
+ ctx->refcount--;
+
+ if (ctx->refcount > 0)
+ return NULL;
+
+ /* Caller needs to clean up before calling this */
+ assert(list_empty(&ctx->quirks));
+
+ list_for_each_safe(s, &ctx->sections, link) {
+ section_destroy(s);
+ }
+
+ free(ctx->dmi);
+ free(ctx->dt);
+ free(ctx);
+
+ return NULL;
+}
+
+static struct quirks *
+quirks_new(void)
+{
+ struct quirks *q;
+
+ q = zalloc(sizeof *q);
+ q->refcount = 1;
+ q->nproperties = 0;
+ list_init(&q->link);
+ list_init(&q->floating_properties);
+
+ return q;
+}
+
+struct quirks *
+quirks_unref(struct quirks *q)
+{
+ if (!q)
+ return NULL;
+
+ /* We don't really refcount, but might
+ * as well have the API in place */
+ assert(q->refcount == 1);
+
+ for (size_t i = 0; i < q->nproperties; i++) {
+ property_unref(q->properties[i]);
+ }
+
+ /* Floating properties are owned by our quirks context, need to be
+ * cleaned up here */
+ struct property *p;
+ list_for_each_safe(p, &q->floating_properties, link) {
+ property_cleanup(p);
+ }
+
+ list_remove(&q->link);
+ free(q->properties);
+ free(q);
+
+ return NULL;
+}
+
+static inline void
+match_fill_name(struct match *m,
+ struct device *device)
+{
+ if (device->name[0] == 0)
+ return;
+
+ m->name = safe_strdup(device->name);
+
+ m->bits |= M_NAME;
+}
+
+static inline void
+match_fill_uniq(struct match *m,
+ struct device *device)
+{
+ if (device->uniq[0] == 0)
+ return;
+
+ m->uniq = safe_strdup(device->uniq);
+
+ m->bits |= M_UNIQ;
+}
+
+static inline void
+match_fill_bus_vid_pid(struct match *m,
+ struct device *device)
+{
+ m->product[0] = device->id.product;
+ m->product[1] = 0;
+ m->vendor = device->id.vendor;
+ m->version = device->id.version;
+ m->bits |= M_PID|M_VID|M_VERSION;
+ switch (device->id.bustype) {
+ case BUS_USB:
+ m->bus = BT_USB;
+ m->bits |= M_BUS;
+ break;
+ case BUS_BLUETOOTH:
+ m->bus = BT_BLUETOOTH;
+ m->bits |= M_BUS;
+ break;
+ case BUS_I8042:
+ m->bus = BT_PS2;
+ m->bits |= M_BUS;
+ break;
+ case BUS_RMI:
+ m->bus = BT_RMI;
+ m->bits |= M_BUS;
+ break;
+ case BUS_I2C:
+ m->bus = BT_I2C;
+ m->bits |= M_BUS;
+ break;
+ case BUS_SPI:
+ m->bus = BT_SPI;
+ m->bits |= M_BUS;
+ break;
+ default:
+ break;
+ }
+}
+
+static inline void
+match_fill_udev_type(struct match *m,
+ struct device *device)
+{
+ switch (device->type) {
+ case DEVICE_TYPE_MOUSE:
+ m->udev_type |= UDEV_MOUSE;
+ break;
+ case DEVICE_TYPE_POINTINGSTICK:
+ m->udev_type |= UDEV_MOUSE | UDEV_POINTINGSTICK;
+ break;
+ case DEVICE_TYPE_TOUCHPAD:
+ m->udev_type |= UDEV_TOUCHPAD;
+ break;
+ case DEVICE_TYPE_TABLET:
+ m->udev_type |= UDEV_TABLET;
+ break;
+ case DEVICE_TYPE_TABLET_PAD:
+ m->udev_type |= UDEV_TABLET_PAD;
+ break;
+ case DEVICE_TYPE_KEYBOARD:
+ m->udev_type |= UDEV_KEYBOARD;
+ break;
+ case DEVICE_TYPE_JOYSTICK:
+ m->udev_type |= UDEV_JOYSTICK;
+ break;
+ default:
+ break;
+ }
+ m->bits |= M_UDEV_TYPE;
+}
+
+static inline void
+match_fill_dmi_dt(struct match *m, char *dmi, char *dt)
+{
+ if (dmi) {
+ m->dmi = dmi;
+ m->bits |= M_DMI;
+ }
+
+ if (dt) {
+ m->dt = dt;
+ m->bits |= M_DT;
+ }
+}
+
+static struct match *
+match_new(struct device *device,
+ char *dmi, char *dt)
+{
+ struct match *m = zalloc(sizeof *m);
+
+ match_fill_name(m, device);
+ match_fill_uniq(m, device);
+ match_fill_bus_vid_pid(m, device);
+ match_fill_dmi_dt(m, dmi, dt);
+ match_fill_udev_type(m, device);
+ return m;
+}
+
+static void
+match_free(struct match *m)
+{
+ /* dmi and dt are global */
+ free(m->name);
+ free(m->uniq);
+ free(m);
+}
+
+static void
+quirk_merge_event_codes(struct quirks_context *ctx,
+ struct quirks *q,
+ const struct property *property)
+{
+ for (size_t i = 0; i < q->nproperties; i++) {
+ struct property *p = q->properties[i];
+
+ if (p->id != property->id)
+ continue;
+
+ /* We have a duplicated property, merge in with ours */
+ size_t offset = p->value.tuples.ntuples;
+ size_t max = ARRAY_LENGTH(p->value.tuples.tuples);
+ for (size_t j = 0; j < property->value.tuples.ntuples; j++) {
+ if (offset + j >= max)
+ break;
+ p->value.tuples.tuples[offset + j] = property->value.tuples.tuples[j];
+ p->value.tuples.ntuples++;
+ }
+ return;
+ }
+
+ /* First time we add AttrEventCode: create a new property.
+ * Unlike the other properties, this one isn't part of a section, it belongs
+ * to the quirks */
+ struct property *newprop = property_new();
+ newprop->id = property->id;
+ newprop->type = property->type;
+ newprop->value.tuples = property->value.tuples;
+ /* Caller responsible for pre-allocating space */
+ q->properties[q->nproperties++] = property_ref(newprop);
+ list_append(&q->floating_properties, &newprop->link);
+}
+
+static void
+quirk_apply_section(struct quirks_context *ctx,
+ struct quirks *q,
+ const struct section *s)
+{
+ struct property *p;
+ size_t nprops = 0;
+ void *tmp;
+
+ list_for_each(p, &s->properties, link) {
+ nprops++;
+ }
+
+ nprops += q->nproperties;
+ tmp = realloc(q->properties, nprops * sizeof(p));
+ if (!tmp)
+ return;
+
+ q->properties = tmp;
+ list_for_each(p, &s->properties, link) {
+ qlog_debug(ctx, "property added: %s from %s\n",
+ quirk_get_name(p->id), s->name);
+
+ /* All quirks but AttrEventCode and AttrInputProp
+ * simply overwrite each other, so we can just append the
+ * matching property and, later when checking the quirk, pick
+ * the last one in the array.
+ *
+ * The event codes/input props are special because they're lists
+ * that may *partially* override each other, e.g. a section may
+ * enable BTN_LEFT and BTN_RIGHT but a later section may disable
+ * only BTN_RIGHT. This should result in BTN_LEFT force-enabled
+ * and BTN_RIGHT force-disabled.
+ *
+ * To hack around this, those are the only ones where only ever
+ * have one struct property in the list (not owned by a section)
+ * and we simply merge any extra sections onto that.
+ */
+ if (p->id == QUIRK_ATTR_EVENT_CODE ||
+ p->id == QUIRK_ATTR_INPUT_PROP)
+ quirk_merge_event_codes(ctx, q, p);
+ else
+ q->properties[q->nproperties++] = property_ref(p);
+ }
+}
+
+static bool
+quirk_match_section(struct quirks_context *ctx,
+ struct quirks *q,
+ struct section *s,
+ struct match *m,
+ struct device *device)
+{
+ uint32_t matched_flags = 0x0;
+
+ for (uint32_t flag = 0x1; flag <= M_LAST; flag <<= 1) {
+ uint32_t prev_matched_flags = matched_flags;
+ /* section doesn't have this bit set, continue */
+ if ((s->match.bits & flag) == 0)
+ continue;
+
+ /* Couldn't fill in this bit for the match, so we
+ * do not match on it */
+ if ((m->bits & flag) == 0) {
+ qlog_debug(ctx,
+ "%s wants %s but we don't have that\n",
+ s->name, matchflagname(flag));
+ continue;
+ }
+
+ /* now check the actual matching bit */
+ switch (flag) {
+ case M_NAME:
+ if (fnmatch(s->match.name, m->name, 0) == 0)
+ matched_flags |= flag;
+ break;
+ case M_UNIQ:
+ if (fnmatch(s->match.uniq, m->uniq, 0) == 0)
+ matched_flags |= flag;
+ break;
+ case M_BUS:
+ if (m->bus == s->match.bus)
+ matched_flags |= flag;
+ break;
+ case M_VID:
+ if (m->vendor == s->match.vendor)
+ matched_flags |= flag;
+ break;
+ case M_PID:
+ ARRAY_FOR_EACH(m->product, mi) {
+ if (*mi == 0 || matched_flags & flag)
+ break;
+
+ ARRAY_FOR_EACH(s->match.product, si) {
+ if (*si == 0)
+ break;
+ if (*mi == *si) {
+ matched_flags |= flag;
+ break;
+ }
+ }
+ }
+ break;
+ case M_VERSION:
+ if (m->version == s->match.version)
+ matched_flags |= flag;
+ break;
+ case M_DMI:
+ if (fnmatch(s->match.dmi, m->dmi, 0) == 0)
+ matched_flags |= flag;
+ break;
+ case M_DT:
+ if (fnmatch(s->match.dt, m->dt, 0) == 0)
+ matched_flags |= flag;
+ break;
+ case M_UDEV_TYPE:
+ if (s->match.udev_type & m->udev_type)
+ matched_flags |= flag;
+ break;
+ default:
+ abort();
+ }
+
+ if (prev_matched_flags != matched_flags) {
+ qlog_debug(ctx,
+ "%s matches for %s\n",
+ s->name,
+ matchflagname(flag));
+ }
+ }
+
+ if (s->match.bits == matched_flags) {
+ qlog_debug(ctx, "%s is full match\n", s->name);
+ quirk_apply_section(ctx, q, s);
+ }
+
+ return true;
+}
+
+struct quirks *
+quirks_fetch_for_device(struct quirks_context *ctx,
+ struct device *device)
+{
+ struct section *s;
+ struct match *m;
+
+ if (!ctx)
+ return NULL;
+
+ qlog_debug(ctx, "%s: fetching quirks\n", device->path);
+
+ _unref_(quirks) *q = quirks_new();
+
+ m = match_new(device, ctx->dmi, ctx->dt);
+
+ list_for_each(s, &ctx->sections, link) {
+ quirk_match_section(ctx, q, s, m, device);
+ }
+
+ match_free(m);
+
+ if (q->nproperties == 0) {
+ return NULL;
+ }
+
+ list_insert(&ctx->quirks, &q->link);
+
+ return steal(&q);
+}
+
+static inline struct property *
+quirk_find_prop(struct quirks *q, enum quirk which)
+{
+ /* Run backwards to only handle the last one assigned */
+ for (ssize_t i = q->nproperties - 1; i >= 0; i--) {
+ struct property *p = q->properties[i];
+ if (p->id == which)
+ return p;
+ }
+
+ return NULL;
+}
+
+bool
+quirks_has_quirk(struct quirks *q, enum quirk which)
+{
+ return quirk_find_prop(q, which) != NULL;
+}
+
+bool
+quirks_get_int32(struct quirks *q, enum quirk which, int32_t *val)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_INT);
+ *val = p->value.i;
+
+ return true;
+}
+
+bool
+quirks_get_uint32(struct quirks *q, enum quirk which, uint32_t *val)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_UINT);
+ *val = p->value.u;
+
+ return true;
+}
+
+bool
+quirks_get_double(struct quirks *q, enum quirk which, double *val)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_DOUBLE);
+ *val = p->value.d;
+
+ return true;
+}
+
+bool
+quirks_get_string(struct quirks *q, enum quirk which, char **val)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_STRING);
+ *val = p->value.s;
+
+ return true;
+}
+
+bool
+quirks_get_bool(struct quirks *q, enum quirk which, bool *val)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_BOOL);
+ *val = p->value.b;
+
+ return true;
+}
+
+bool
+quirks_get_dimensions(struct quirks *q,
+ enum quirk which,
+ struct quirk_dimensions *val)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_DIMENSION);
+ *val = p->value.dim;
+
+ return true;
+}
+
+bool
+quirks_get_range(struct quirks *q,
+ enum quirk which,
+ struct quirk_range *val)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_RANGE);
+ *val = p->value.range;
+
+ return true;
+}
+
+bool
+quirks_get_tuples(struct quirks *q,
+ enum quirk which,
+ const struct quirk_tuples **tuples)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_TUPLES);
+ *tuples = &p->value.tuples;
+
+ return true;
+}
+
+bool
+quirks_get_uint32_array(struct quirks *q,
+ enum quirk which,
+ const uint32_t **array,
+ size_t *nelements)
+{
+ struct property *p;
+
+ if (!q)
+ return false;
+
+ p = quirk_find_prop(q, which);
+ if (!p)
+ return false;
+
+ assert(p->type == PT_UINT_ARRAY);
+ *array = p->value.array.data.u;
+ *nelements = p->value.array.nelements;
+
+ return true;
+}
diff --git a/usr.sbin/moused/moused/quirks.h b/usr.sbin/moused/moused/quirks.h
new file mode 100644
index 000000000000..6a34d17be83c
--- /dev/null
+++ b/usr.sbin/moused/moused/quirks.h
@@ -0,0 +1,369 @@
+/*
+ * Copyright © 2018 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#pragma once
+
+#include "util.h"
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <syslog.h>
+
+/**
+ * Handle to the quirks context.
+ */
+struct quirks_context;
+
+/**
+ * Contains all quirks set for a single device.
+ */
+struct quirks;
+
+struct quirk_dimensions {
+ size_t x, y;
+};
+
+struct quirk_range {
+ int lower, upper;
+};
+
+struct quirk_tuples {
+ struct {
+ int first;
+ int second;
+ int third;
+ } tuples[32];
+ size_t ntuples;
+};
+
+/**
+ * Quirks known to libinput. Moused does not support all of them.
+ */
+enum quirk {
+ QUIRK_MODEL_ALPS_SERIAL_TOUCHPAD = 100,
+ QUIRK_MODEL_APPLE_TOUCHPAD,
+ QUIRK_MODEL_APPLE_TOUCHPAD_ONEBUTTON,
+ QUIRK_MODEL_BOUNCING_KEYS,
+ QUIRK_MODEL_CHROMEBOOK,
+ QUIRK_MODEL_CLEVO_W740SU,
+ QUIRK_MODEL_DELL_CANVAS_TOTEM,
+ QUIRK_MODEL_HP_PAVILION_DM4_TOUCHPAD,
+ QUIRK_MODEL_HP_ZBOOK_STUDIO_G3,
+ QUIRK_MODEL_INVERT_HORIZONTAL_SCROLLING,
+ QUIRK_MODEL_LENOVO_SCROLLPOINT,
+ QUIRK_MODEL_LENOVO_T450_TOUCHPAD,
+ QUIRK_MODEL_LENOVO_X1GEN6_TOUCHPAD,
+ QUIRK_MODEL_LENOVO_X230,
+ QUIRK_MODEL_SYNAPTICS_SERIAL_TOUCHPAD,
+ QUIRK_MODEL_SYSTEM76_BONOBO,
+ QUIRK_MODEL_SYSTEM76_GALAGO,
+ QUIRK_MODEL_SYSTEM76_KUDU,
+ QUIRK_MODEL_TABLET_MODE_NO_SUSPEND,
+ QUIRK_MODEL_TABLET_MODE_SWITCH_UNRELIABLE,
+ QUIRK_MODEL_TOUCHPAD_VISIBLE_MARKER,
+ QUIRK_MODEL_TRACKBALL,
+ QUIRK_MODEL_WACOM_TOUCHPAD,
+ QUIRK_MODEL_PRESSURE_PAD,
+ QUIRK_MODEL_TOUCHPAD_PHANTOM_CLICKS,
+
+ _QUIRK_LAST_MODEL_QUIRK_, /* Guard: do not modify */
+
+ QUIRK_ATTR_SIZE_HINT = 300,
+ QUIRK_ATTR_TOUCH_SIZE_RANGE,
+ QUIRK_ATTR_PALM_SIZE_THRESHOLD,
+ QUIRK_ATTR_LID_SWITCH_RELIABILITY,
+ QUIRK_ATTR_KEYBOARD_INTEGRATION,
+ QUIRK_ATTR_TRACKPOINT_INTEGRATION,
+ QUIRK_ATTR_TPKBCOMBO_LAYOUT,
+ QUIRK_ATTR_PRESSURE_RANGE,
+ QUIRK_ATTR_PALM_PRESSURE_THRESHOLD,
+ QUIRK_ATTR_RESOLUTION_HINT,
+ QUIRK_ATTR_TRACKPOINT_MULTIPLIER,
+ QUIRK_ATTR_THUMB_PRESSURE_THRESHOLD,
+ QUIRK_ATTR_USE_VELOCITY_AVERAGING,
+ QUIRK_ATTR_TABLET_SMOOTHING,
+ QUIRK_ATTR_THUMB_SIZE_THRESHOLD,
+ QUIRK_ATTR_MSC_TIMESTAMP,
+ QUIRK_ATTR_EVENT_CODE,
+ QUIRK_ATTR_INPUT_PROP,
+
+ _QUIRK_LAST_ATTR_QUIRK_, /* Guard: do not modify */
+
+
+ /* Daemon parameters */
+ MOUSED_GRAB_DEVICE = 1000,
+ MOUSED_IGNORE_DEVICE,
+
+ /* Standard moused parameters */
+ MOUSED_CLICK_THRESHOLD,
+ MOUSED_DRIFT_TERMINATE,
+ MOUSED_DRIFT_DISTANCE,
+ MOUSED_DRIFT_TIME,
+ MOUSED_DRIFT_AFTER,
+ MOUSED_EMULATE_THIRD_BUTTON,
+ MOUSED_EMULATE_THIRD_BUTTON_TIMEOUT,
+ MOUSED_EXPONENTIAL_ACCEL,
+ MOUSED_EXPONENTIAL_OFFSET,
+ MOUSED_LINEAR_ACCEL_X,
+ MOUSED_LINEAR_ACCEL_Y,
+ MOUSED_LINEAR_ACCEL_Z,
+ MOUSED_MAP_Z_AXIS,
+ MOUSED_VIRTUAL_SCROLL_ENABLE,
+ MOUSED_HOR_VIRTUAL_SCROLL_ENABLE,
+ MOUSED_VIRTUAL_SCROLL_SPEED,
+ MOUSED_VIRTUAL_SCROLL_THRESHOLD,
+ MOUSED_WMODE,
+
+ /* Touchpad parameters from psm(4) driver */
+ MOUSED_TWO_FINGER_SCROLL,
+ MOUSED_NATURAL_SCROLL,
+ MOUSED_THREE_FINGER_DRAG,
+ MOUSED_SOFTBUTTON2_X,
+ MOUSED_SOFTBUTTON3_X,
+ MOUSED_SOFTBUTTONS_Y,
+ MOUSED_TAP_TIMEOUT,
+ MOUSED_TAP_PRESSURE_THRESHOLD,
+ MOUSED_TAP_MAX_DELTA,
+ MOUSED_TAPHOLD_TIMEOUT,
+ MOUSED_VSCROLL_MIN_DELTA,
+ MOUSED_VSCROLL_HOR_AREA,
+ MOUSED_VSCROLL_VER_AREA,
+
+ _MOUSED_LAST_OPTION_ /* Guard: do not modify */
+};
+
+/**
+ * Returns a printable name for the quirk. This name is for developer
+ * tools, not user consumption. Do not display this in a GUI.
+ */
+const char*
+quirk_get_name(enum quirk q);
+
+/**
+ * Log priorities used if custom logging is enabled.
+ */
+enum quirks_log_priorities {
+ QLOG_NOISE = LOG_DEBUG + 1,
+ QLOG_DEBUG = LOG_DEBUG,
+ QLOG_INFO = LOG_INFO,
+ QLOG_ERROR = LOG_ERR,
+ QLOG_PARSER_ERROR = LOG_CRIT,
+};
+
+/**
+ * Log type to be used for logging. Use the moused logging to hook up a
+ * moused log handler. This will cause the quirks to reduce the noise and
+ * only provide useful messages.
+ *
+ * QLOG_CUSTOM_LOG_PRIORITIES enables more fine-grained and verbose logging,
+ * allowing debugging tools to be more useful.
+ */
+enum quirks_log_type {
+ QLOG_MOUSED_LOGGING,
+ QLOG_CUSTOM_LOG_PRIORITIES,
+};
+
+/**
+ * Initialize the quirks subsystem. This function must be called
+ * before anything else.
+ *
+ * If log_type is QLOG_CUSTOM_LOG_PRIORITIES, the log handler is called with
+ * the custom QLOG_* log priorities. Otherwise, the log handler only uses
+ * the moused (syslog) log priorities.
+ *
+ * @param config_file A file path to main configuration file
+ * @param quirks_path The directory containing the various quirk files
+ * @param log_handler The moused log handler called for debugging output
+ *
+ * @return an opaque handle to the context
+ */
+struct quirks_context *
+quirks_init_subsystem(const char *config_file,
+ const char *quirks_path,
+ moused_log_handler log_handler,
+ enum quirks_log_type log_type);
+
+/**
+ * Clean up after ourselves. This function must be called
+ * as the last call to the quirks subsystem.
+ *
+ * All quirks returned to the caller in quirks_fetch_for_device() must be
+ * unref'd before this call.
+ *
+ * @return Always NULL
+ */
+struct quirks_context *
+quirks_context_unref(struct quirks_context *ctx);
+
+DEFINE_UNREF_CLEANUP_FUNC(quirks_context);
+
+struct quirks_context *
+quirks_context_ref(struct quirks_context *ctx);
+
+/**
+ * Fetch the quirks for a given device. If no quirks are defined, this
+ * function returns NULL.
+ *
+ * @return A new quirks struct, use quirks_unref() to release
+ */
+struct quirks *
+quirks_fetch_for_device(struct quirks_context *ctx,
+ struct device *device);
+
+/**
+ * Reduce the refcount by one. When the refcount reaches zero, the
+ * associated struct is released.
+ *
+ * @return Always NULL
+ */
+struct quirks *
+quirks_unref(struct quirks *q);
+
+DEFINE_UNREF_CLEANUP_FUNC(quirks);
+
+/**
+ * Returns true if the given quirk applies is in this quirk list.
+ */
+bool
+quirks_has_quirk(struct quirks *q, enum quirk which);
+
+/**
+ * Get the value of the given quirk, as unsigned integer.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, val is
+ * unchanged.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_uint32(struct quirks *q,
+ enum quirk which,
+ uint32_t *val);
+
+/**
+ * Get the value of the given quirk, as signed integer.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, val is
+ * unchanged.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_int32(struct quirks *q,
+ enum quirk which,
+ int32_t *val);
+
+/**
+ * Get the value of the given quirk, as double.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, val is
+ * unchanged.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_double(struct quirks *q,
+ enum quirk which,
+ double *val);
+
+/**
+ * Get the value of the given quirk, as string.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, val is
+ * unchanged.
+ *
+ * val is set to the string, do not modify or free it. The lifetime of the
+ * returned string is bound to the lifetime of the quirk.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_string(struct quirks *q,
+ enum quirk which,
+ char **val);
+
+/**
+ * Get the value of the given quirk, as bool.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, val is
+ * unchanged.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_bool(struct quirks *q,
+ enum quirk which,
+ bool *val);
+
+/**
+ * Get the value of the given quirk, as dimension.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, val is
+ * unchanged.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_dimensions(struct quirks *q,
+ enum quirk which,
+ struct quirk_dimensions *val);
+
+/**
+ * Get the value of the given quirk, as range.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, val is
+ * unchanged.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_range(struct quirks *q,
+ enum quirk which,
+ struct quirk_range *val);
+
+/**
+ * Get the tuples of the given quirk.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, tuples is
+ * unchanged.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_tuples(struct quirks *q,
+ enum quirk which,
+ const struct quirk_tuples **tuples);
+
+/**
+ * Get the uint32 array of the given quirk.
+ * This function will assert if the quirk type does not match the
+ * requested type. If the quirk is not set for this device, tuples is
+ * unchanged.
+ *
+ * @return true if the quirk value is valid, false otherwise.
+ */
+bool
+quirks_get_uint32_array(struct quirks *q,
+ enum quirk which,
+ const uint32_t **array,
+ size_t *nelements);
diff --git a/usr.sbin/moused/moused/quirks/5-generic-touchpad.quirks b/usr.sbin/moused/moused/quirks/5-generic-touchpad.quirks
new file mode 100644
index 000000000000..c741ffc80bd6
--- /dev/null
+++ b/usr.sbin/moused/moused/quirks/5-generic-touchpad.quirks
@@ -0,0 +1,9 @@
+# Do not edit this file, it will be overwritten on update
+
+[SynPS/2 Synaptics TouchPad]
+MatchDevType=touchpad
+MatchName=SynPS/2 Synaptics TouchPad
+AttrPressureRange=35:30
+MousedTapPressureThreshold=44
+#AttrThumbPressureThreshold=45
+AttrPalmPressureThreshold=220
diff --git a/usr.sbin/moused/moused/util-evdev.c b/usr.sbin/moused/moused/util-evdev.c
new file mode 100644
index 000000000000..925979fdc02c
--- /dev/null
+++ b/usr.sbin/moused/moused/util-evdev.c
@@ -0,0 +1,173 @@
+/*
+ * Copyright © 2013 David Herrmann <dh.herrmann@gmail.com>
+ * Copyright © 2013 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <dev/evdev/input.h>
+
+#include "event-names.h"
+#include "util-evdev.h"
+
+#define ARRAY_LENGTH(a) (sizeof(a) / (sizeof((a)[0])))
+
+struct name_lookup {
+ const char *name;
+ size_t len;
+};
+
+static inline bool
+startswith(const char *str, size_t len, const char *prefix, size_t plen)
+{
+ return len >= plen && !strncmp(str, prefix, plen);
+}
+
+static int type_from_prefix(const char *name, ssize_t len)
+{
+ const char *e;
+ size_t i;
+ ssize_t l;
+
+ /* MAX_ is not allowed, even though EV_MAX exists */
+ if (startswith(name, len, "MAX_", 4))
+ return -1;
+ /* BTN_ is special as there is no EV_BTN type */
+ if (startswith(name, len, "BTN_", 4))
+ return EV_KEY;
+ /* FF_STATUS_ is special as FF_ is a prefix of it, so test it first */
+ if (startswith(name, len, "FF_STATUS_", 10))
+ return EV_FF_STATUS;
+
+ for (i = 0; i < ARRAY_LENGTH(ev_names); ++i) {
+ /* skip EV_ prefix so @e is suffix of [EV_]XYZ */
+ e = &ev_names[i].name[3];
+ l = strlen(e);
+
+ /* compare prefix and test for trailing _ */
+ if (len > l && startswith(name, len, e, l) && name[l] == '_')
+ return ev_names[i].value;
+ }
+
+ return -1;
+}
+
+static int cmp_entry(const void *vlookup, const void *ventry)
+{
+ const struct name_lookup *lookup = vlookup;
+ const struct name_entry *entry = ventry;
+ int r;
+
+ r = strncmp(lookup->name, entry->name, lookup->len);
+ if (!r) {
+ if (entry->name[lookup->len])
+ r = -1;
+ else
+ r = 0;
+ }
+
+ return r;
+}
+
+static const struct name_entry*
+lookup_name(const struct name_entry *array, size_t asize,
+ struct name_lookup *lookup)
+{
+ const struct name_entry *entry;
+
+ entry = bsearch(lookup, array, asize, sizeof(*array), cmp_entry);
+ if (!entry)
+ return NULL;
+
+ return entry;
+}
+
+int
+libevdev_event_type_get_max(unsigned int type)
+{
+ if (type > EV_MAX)
+ return -1;
+
+ return ev_max[type];
+}
+
+int
+libevdev_event_code_from_name(unsigned int type, const char *name)
+{
+ struct name_lookup lookup;
+ const struct name_entry *entry;
+ int real_type;
+ size_t len = strlen(name);
+
+ real_type = type_from_prefix(name, len);
+ if (real_type < 0 || (unsigned int)real_type != type)
+ return -1;
+
+ lookup.name = name;
+ lookup.len = len;
+
+ entry = lookup_name(code_names, ARRAY_LENGTH(code_names), &lookup);
+
+ return entry ? (int)entry->value : -1;
+}
+
+static int
+libevdev_event_type_from_name_n(const char *name, size_t len)
+{
+ struct name_lookup lookup;
+ const struct name_entry *entry;
+
+ lookup.name = name;
+ lookup.len = len;
+
+ entry = lookup_name(ev_names, ARRAY_LENGTH(ev_names), &lookup);
+
+ return entry ? (int)entry->value : -1;
+}
+
+int
+libevdev_event_type_from_name(const char *name)
+{
+ return libevdev_event_type_from_name_n(name, strlen(name));
+}
+
+static int
+libevdev_property_from_name_n(const char *name, size_t len)
+{
+ struct name_lookup lookup;
+ const struct name_entry *entry;
+
+ lookup.name = name;
+ lookup.len = len;
+
+ entry = lookup_name(prop_names, ARRAY_LENGTH(prop_names), &lookup);
+
+ return entry ? (int)entry->value : -1;
+}
+
+int
+libevdev_property_from_name(const char *name)
+{
+ return libevdev_property_from_name_n(name, strlen(name));
+}
diff --git a/usr.sbin/moused/moused/util-evdev.h b/usr.sbin/moused/moused/util-evdev.h
new file mode 100644
index 000000000000..cb2e3f1fb935
--- /dev/null
+++ b/usr.sbin/moused/moused/util-evdev.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright © 2013 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#ifndef UTIL_EVDEV_H
+#define UTIL_EVDEV_H
+
+#include <dev/evdev/input.h>
+
+int libevdev_event_code_from_name(unsigned int type, const char *name);
+int libevdev_event_type_get_max(unsigned int type);
+int libevdev_event_type_from_name(const char *name);
+int libevdev_property_from_name(const char *name);
+
+#endif
diff --git a/usr.sbin/moused/moused/util-list.c b/usr.sbin/moused/moused/util-list.c
new file mode 100644
index 000000000000..7f85b368076c
--- /dev/null
+++ b/usr.sbin/moused/moused/util-list.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright © 2008-2011 Kristian Høgsberg
+ * Copyright © 2011 Intel Corporation
+ * Copyright © 2013-2015 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <assert.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+#include "util-list.h"
+
+void
+list_init(struct list *list)
+{
+ list->prev = list;
+ list->next = list;
+}
+
+void
+list_insert(struct list *list, struct list *elm)
+{
+ assert((list->next != NULL && list->prev != NULL) ||
+ !"list->next|prev is NULL, possibly missing list_init()");
+ assert(((elm->next == NULL && elm->prev == NULL) || list_empty(elm)) ||
+ !"elm->next|prev is not NULL, list node used twice?");
+
+ elm->prev = list;
+ elm->next = list->next;
+ list->next = elm;
+ elm->next->prev = elm;
+}
+
+void
+list_append(struct list *list, struct list *elm)
+{
+ assert((list->next != NULL && list->prev != NULL) ||
+ !"list->next|prev is NULL, possibly missing list_init()");
+ assert(((elm->next == NULL && elm->prev == NULL) || list_empty(elm)) ||
+ !"elm->next|prev is not NULL, list node used twice?");
+
+ elm->next = list;
+ elm->prev = list->prev;
+ list->prev = elm;
+ elm->prev->next = elm;
+}
+
+void
+list_remove(struct list *elm)
+{
+ assert((elm->next != NULL && elm->prev != NULL) ||
+ !"list->next|prev is NULL, possibly missing list_init()");
+
+ elm->prev->next = elm->next;
+ elm->next->prev = elm->prev;
+ elm->next = NULL;
+ elm->prev = NULL;
+}
+
+bool
+list_empty(const struct list *list)
+{
+ assert((list->next != NULL && list->prev != NULL) ||
+ !"list->next|prev is NULL, possibly missing list_init()");
+
+ return list->next == list;
+}
diff --git a/usr.sbin/moused/moused/util-list.h b/usr.sbin/moused/moused/util-list.h
new file mode 100644
index 000000000000..d7a8ce724d22
--- /dev/null
+++ b/usr.sbin/moused/moused/util-list.h
@@ -0,0 +1,194 @@
+/*
+ * Copyright © 2008-2011 Kristian Høgsberg
+ * Copyright © 2011 Intel Corporation
+ * Copyright © 2013-2015 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#pragma once
+
+#include <stdbool.h>
+#include <stddef.h>
+
+/*
+ * This list data structure is a verbatim copy from wayland-util.h from the
+ * Wayland project; except that wl_ prefix has been removed.
+ */
+
+
+/**
+ * Doubly linked list implementation. This struct is used for both the list
+ * nodes and the list head. Use like this:
+ *
+ * @code
+ *
+ * struct foo {
+ * struct list list_of_bars; // the list head
+ * };
+ *
+ * struct bar {
+ * struct list link; // links between the bars
+ * };
+ *
+ * struct foo *f = zalloc(sizeof *f);
+ * struct bar *b = make_some_bar();
+ *
+ * list_init(&f->list_of_bars);
+ * list_append(&f->list_of_bars, &b->link);
+ * list_remove(&b->link);
+ * @endcode
+ */
+struct list {
+ struct list *prev;
+ struct list *next;
+};
+
+/**
+ * Initialize a list head. This function *must* be called once for each list
+ * head. This function *must not* be called for a node to be added to a
+ * list.
+ */
+void list_init(struct list *list);
+
+/**
+ * Insert an element at the front of the list
+ */
+void list_insert(struct list *list, struct list *elm);
+/**
+ * Append an element to the back of the list
+ */
+void list_append(struct list *list, struct list *elm);
+
+/**
+ * Remove an element from list.
+ *
+ * Removing a list element is only possible once, the caller must track
+ * whether the list node has already been removed.
+ *
+ */
+void list_remove(struct list *elm);
+/**
+ * Returns true if the given list head is an empty list.
+ */
+bool list_empty(const struct list *list);
+
+/**
+ * Return the 'type' parent container struct of 'ptr' of which
+ * 'member' is our 'ptr' field. For example:
+ *
+ * @code
+ * struct foo { // the parent container struct
+ * uint32_t a;
+ * struct bar bar_member; // the member field
+ * };
+ *
+ * struct foo *f = zalloc(sizeof *f);
+ * struct bar *b = &f->bar_member;
+ * struct foo *f2 = container_of(b, struct foo, bar_member);
+ *
+ * assert(f == f2);
+ * @endcode
+ */
+#define container_of(ptr, type, member) \
+ (__typeof__(type) *)((char *)(ptr) - \
+ offsetof(__typeof__(type), member))
+
+/**
+ * Given a list 'head', return the first entry of type 'pos' that has a
+ * member 'link'.
+ *
+ * The 'pos' argument is solely used to determine the type be returned and
+ * not modified otherwise. It is common to use the same pointer that the
+ * return value of list_first_entry() is assigned to, for example:
+ *
+ * @code
+ * struct foo {
+ * struct list list_of_bars;
+ * };
+ *
+ * struct bar {
+ * struct list link;
+ * }
+ *
+ * struct foo *f = get_a_foo();
+ * struct bar *b = 0; // initialize to avoid static analysis errors
+ * b = list_first_entry(&f->list_of_bars, b, link);
+ * @endcode
+ */
+#define list_first_entry(head, pointer_of_type, member) \
+ container_of((head)->next, __typeof__(*pointer_of_type), member)
+
+/**
+ * Given a list 'head', return the first entry of type 'container_type' that
+ * has a member 'link'.
+ *
+ * @code
+ * struct foo {
+ * struct list list_of_bars;
+ * };
+ *
+ * struct bar {
+ * struct list link;
+ * }
+ *
+ * struct foo *f = get_a_foo();
+ * struct bar *b = list_first_entry(&f->list_of_bars, struct bar, link);
+ * @endcode
+ */
+#define list_first_entry_by_type(head, container_type, member) \
+ container_of((head)->next, container_type, member)
+
+/**
+ * Iterate through the list.
+ *
+ * @code
+ * struct foo *f = get_a_foo();
+ * struct bar *element;
+ * list_for_each(element, &f->list_of_bars, link) {
+ * }
+ * @endcode
+ *
+ * If a list node needs to be removed during iteration, use
+ * list_for_each_safe().
+ */
+#define list_for_each(pos, head, member) \
+ for (pos = list_first_entry_by_type(head, __typeof__(*pos), member); \
+ &pos->member != (head); \
+ pos = list_first_entry_by_type(&pos->member, __typeof__(*pos), member))
+
+/**
+ * Iterate through the list. Equivalent to list_for_each() but allows
+ * calling list_remove() on the element.
+ *
+ * @code
+ * struct foo *f = get_a_foo();
+ * struct bar *element;
+ * list_for_each(element, tmp, &f->list_of_bars, link) {
+ * list_remove(&element->link);
+ * }
+ * @endcode
+ */
+#define list_for_each_safe(pos, head, member) \
+ pos = list_first_entry_by_type(head, __typeof__(*pos), member); \
+ for (__typeof__(pos) _tmp = list_first_entry_by_type(&pos->member, __typeof__(*_tmp), member); \
+ &pos->member != (head); \
+ pos = _tmp, \
+ _tmp = list_first_entry_by_type(&pos->member, __typeof__(*_tmp), member))
diff --git a/usr.sbin/moused/moused/util.c b/usr.sbin/moused/moused/util.c
new file mode 100644
index 000000000000..09bcc42b0f19
--- /dev/null
+++ b/usr.sbin/moused/moused/util.c
@@ -0,0 +1,423 @@
+/*
+ * Copyright © 2008 Kristian Høgsberg
+ * Copyright © 2013-2019 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <dev/evdev/input.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <dirent.h>
+#include <errno.h>
+#include <limits.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <xlocale.h>
+
+#include "util.h"
+#include "util-evdev.h"
+#include "util-list.h"
+
+/* util-strings.c */
+
+/**
+ * Return the next word in a string pointed to by state before the first
+ * separator character. Call repeatedly to tokenize a whole string.
+ *
+ * @param state Current state
+ * @param len String length of the word returned
+ * @param separators List of separator characters
+ *
+ * @return The first word in *state, NOT null-terminated
+ */
+static const char *
+next_word(const char **state, size_t *len, const char *separators)
+{
+ const char *next = *state;
+ size_t l;
+
+ if (!*next)
+ return NULL;
+
+ next += strspn(next, separators);
+ if (!*next) {
+ *state = next;
+ return NULL;
+ }
+
+ l = strcspn(next, separators);
+ *state = next + l;
+ *len = l;
+
+ return next;
+}
+
+/**
+ * Return a null-terminated string array with the tokens in the input
+ * string, e.g. "one two\tthree" with a separator list of " \t" will return
+ * an array [ "one", "two", "three", NULL ] and num elements 3.
+ *
+ * Use strv_free() to free the array.
+ *
+ * Another example:
+ * result = strv_from_string("+1-2++3--4++-+5-+-", "+-", &nelem)
+ * result == [ "1", "2", "3", "4", "5", NULL ] and nelem == 5
+ *
+ * @param in Input string
+ * @param separators List of separator characters
+ * @param num_elements Number of elements found in the input string
+ *
+ * @return A null-terminated string array or NULL on errors
+ */
+char **
+strv_from_string(const char *in, const char *separators, size_t *num_elements)
+{
+ assert(in != NULL);
+ assert(separators != NULL);
+ assert(num_elements != NULL);
+
+ const char *s = in;
+ size_t l, nelems = 0;
+ while (next_word(&s, &l, separators) != NULL)
+ nelems++;
+
+ if (nelems == 0) {
+ *num_elements = 0;
+ return NULL;
+ }
+
+ size_t strv_len = nelems + 1; /* NULL-terminated */
+ char **strv = zalloc(strv_len * sizeof *strv);
+
+ size_t idx = 0;
+ const char *word;
+ s = in;
+ while ((word = next_word(&s, &l, separators)) != NULL) {
+ char *copy = strndup(word, l);
+ if (!copy) {
+ strv_free(strv);
+ *num_elements = 0;
+ return NULL;
+ }
+
+ strv[idx++] = copy;
+ }
+
+ *num_elements = nelems;
+
+ return strv;
+}
+
+/**
+ * Iterate through strv, calling func with each string and its respective index.
+ * Iteration stops successfully after max elements or at the last element,
+ * whichever occurs first.
+ *
+ * If func returns non-zero, iteration stops and strv_for_each returns
+ * that value.
+ *
+ * @return zero on success, otherwise the error returned by the callback
+ */
+int strv_for_each_n(const char **strv, size_t max, strv_foreach_callback_t func, void *data)
+{
+ for (size_t i = 0; i < max && strv && strv[i]; i++) {
+ int ret = func(strv[i], i, data);
+ if (ret)
+ return ret;
+ }
+ return 0;
+}
+
+/* !util-strings.c */
+
+/* util-prop-parsers.c */
+
+/**
+ * Parses a simple dimension string in the form of "10x40". The two
+ * numbers must be positive integers in decimal notation.
+ * On success, the two numbers are stored in w and h. On failure, w and h
+ * are unmodified.
+ *
+ * @param prop The value of the property
+ * @param w Returns the first component of the dimension
+ * @param h Returns the second component of the dimension
+ * @return true on success, false otherwise
+ */
+bool
+parse_dimension_property(const char *prop, size_t *w, size_t *h)
+{
+ int x, y;
+
+ if (!prop)
+ return false;
+
+ if (sscanf(prop, "%dx%d", &x, &y) != 2)
+ return false;
+
+ if (x <= 0 || y <= 0)
+ return false;
+
+ *w = (size_t)x;
+ *h = (size_t)y;
+ return true;
+}
+
+/**
+ * Parses a string of the format "a:b" where both a and b must be integer
+ * numbers and a > b. Also allowed is the special string value "none" which
+ * amounts to unsetting the property.
+ *
+ * @param prop The value of the property
+ * @param hi Set to the first digit or 0 in case of 'none'
+ * @param lo Set to the second digit or 0 in case of 'none'
+ * @return true on success, false otherwise
+ */
+bool
+parse_range_property(const char *prop, int *hi, int *lo)
+{
+ int first, second;
+
+ if (!prop)
+ return false;
+
+ if (streq(prop, "none")) {
+ *hi = 0;
+ *lo = 0;
+ return true;
+ }
+
+ if (sscanf(prop, "%d:%d", &first, &second) != 2)
+ return false;
+
+ if (second >= first)
+ return false;
+
+ *hi = first;
+ *lo = second;
+
+ return true;
+}
+
+bool
+parse_boolean_property(const char *prop, bool *b)
+{
+ if (!prop)
+ return false;
+
+ if (streq(prop, "1"))
+ *b = true;
+ else if (streq(prop, "0"))
+ *b = false;
+ else
+ return false;
+
+ return true;
+}
+
+static bool
+parse_evcode_string(const char *s, int *type_out, int *code_out)
+{
+ int type, code;
+
+ if (strstartswith(s, "EV_")) {
+ type = libevdev_event_type_from_name(s);
+ if (type == -1)
+ return false;
+
+ code = EVENT_CODE_UNDEFINED;
+ } else {
+ struct map {
+ const char *str;
+ int type;
+ } map[] = {
+ { "KEY_", EV_KEY },
+ { "BTN_", EV_KEY },
+ { "ABS_", EV_ABS },
+ { "REL_", EV_REL },
+ { "SW_", EV_SW },
+ };
+ bool found = false;
+
+ ARRAY_FOR_EACH(map, m) {
+ if (!strstartswith(s, m->str))
+ continue;
+
+ type = m->type;
+ code = libevdev_event_code_from_name(type, s);
+ if (code == -1)
+ return false;
+
+ found = true;
+ break;
+ }
+ if (!found)
+ return false;
+ }
+
+ *type_out = type;
+ *code_out = code;
+
+ return true;
+}
+
+/**
+ * Parses a string of the format "+EV_ABS;+KEY_A;-BTN_TOOL_DOUBLETAP;-ABS_X;"
+ * where each element must be + or - (enable/disable) followed by a named event
+ * type OR a named event code OR a tuple in the form of EV_KEY:0x123, i.e. a
+ * named event type followed by a hex event code.
+ *
+ * events must point to an existing array of size nevents.
+ * nevents specifies the size of the array in events and returns the number
+ * of items, elements exceeding nevents are simply ignored, just make sure
+ * events is large enough for your use-case.
+ *
+ * The results are returned as input events with type and code set, all
+ * other fields undefined. Where only the event type is specified, the code
+ * is set to EVENT_CODE_UNDEFINED.
+ *
+ * On success, events contains nevents events with each event's value set to 1
+ * or 0 depending on the + or - prefix.
+ */
+bool
+parse_evcode_property(const char *prop, struct input_event *events, size_t *nevents)
+{
+ bool rc = false;
+ /* A randomly chosen max so we avoid crazy quirks */
+ struct input_event evs[32];
+
+ memset(evs, 0, sizeof evs);
+
+ size_t ncodes;
+ char **strv = strv_from_string(prop, ";", &ncodes);
+ if (!strv || ncodes == 0 || ncodes > ARRAY_LENGTH(evs))
+ goto out;
+
+ ncodes = min(*nevents, ncodes);
+ for (size_t idx = 0; strv[idx]; idx++) {
+ char *s = strv[idx];
+ bool enable;
+
+ switch (*s) {
+ case '+': enable = true; break;
+ case '-': enable = false; break;
+ default:
+ goto out;
+ }
+
+ s++;
+
+ int type, code;
+
+ if (strstr(s, ":") == NULL) {
+ if (!parse_evcode_string(s, &type, &code))
+ goto out;
+ } else {
+ int consumed;
+ char stype[13] = {0}; /* EV_FF_STATUS + '\0' */
+
+ if (sscanf(s, "%12[A-Z_]:%x%n", stype, &code, &consumed) != 2 ||
+ strlen(s) != (size_t)consumed ||
+ (type = libevdev_event_type_from_name(stype)) == -1 ||
+ code < 0 || code > libevdev_event_type_get_max(type))
+ goto out;
+ }
+
+ evs[idx].type = type;
+ evs[idx].code = code;
+ evs[idx].value = enable;
+ }
+
+ memcpy(events, evs, ncodes * sizeof *events);
+ *nevents = ncodes;
+ rc = true;
+
+out:
+ strv_free(strv);
+ return rc;
+}
+
+/**
+ * Parses a string of the format "+INPUT_PROP_BUTTONPAD;-INPUT_PROP_POINTER;+0x123;"
+ * where each element must be a named input prop OR a hexcode in the form
+ * 0x1234. The prefix for each element must be either '+' (enable) or '-' (disable).
+ *
+ * props must point to an existing array of size nprops.
+ * nprops specifies the size of the array in props and returns the number
+ * of elements, elements exceeding nprops are simply ignored, just make sure
+ * props is large enough for your use-case.
+ *
+ * On success, props contains nprops elements.
+ */
+bool
+parse_input_prop_property(const char *prop, struct input_prop *props_out, size_t *nprops)
+{
+ bool rc = false;
+ struct input_prop props[INPUT_PROP_CNT]; /* doubling up on quirks is a bug */
+
+ size_t count;
+ char **strv = strv_from_string(prop, ";", &count);
+ if (!strv || count == 0 || count > ARRAY_LENGTH(props))
+ goto out;
+
+ count = min(*nprops, count);
+ for (size_t idx = 0; strv[idx]; idx++) {
+ char *s = strv[idx];
+ unsigned int prop;
+ bool enable;
+
+ switch (*s) {
+ case '+': enable = true; break;
+ case '-': enable = false; break;
+ default:
+ goto out;
+ }
+
+ s++;
+
+ if (safe_atou_base(s, &prop, 16)) {
+ if (prop > INPUT_PROP_MAX)
+ goto out;
+ } else {
+ int val = libevdev_property_from_name(s);
+ if (val == -1)
+ goto out;
+ prop = (unsigned int)val;
+ }
+ props[idx].prop = prop;
+ props[idx].enabled = enable;
+ }
+
+ memcpy(props_out, props, count * sizeof *props);
+ *nprops = count;
+ rc = true;
+
+out:
+ strv_free(strv);
+ return rc;
+}
+
+/* !util-prop-parsers.c */
diff --git a/usr.sbin/moused/moused/util.h b/usr.sbin/moused/moused/util.h
new file mode 100644
index 000000000000..a359cbc1079a
--- /dev/null
+++ b/usr.sbin/moused/moused/util.h
@@ -0,0 +1,413 @@
+/*
+ * Copyright © 2008-2011 Kristian Høgsberg
+ * Copyright © 2011 Intel Corporation
+ * Copyright © 2013-2015 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#pragma once
+
+#include <sys/types.h>
+#include <sys/mouse.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <math.h>
+#include <xlocale.h>
+
+#define HAVE_LOCALE_H 1
+
+#define MOUSED_ATTRIBUTE_PRINTF(_format, _args) \
+ __attribute__ ((format (printf, _format, _args)))
+
+#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
+/**
+ * Iterate through the array _arr, assigning the variable elem to each
+ * element. elem only exists within the loop.
+ */
+#define ARRAY_FOR_EACH(_arr, _elem) \
+ for (__typeof__((_arr)[0]) *_elem = _arr; \
+ _elem < (_arr) + ARRAY_LENGTH(_arr); \
+ _elem++)
+
+#define versionsort(...) alphasort(__VA_ARGS__)
+#define bit(x_) (1UL << (x_))
+#define min(a, b) (((a) < (b)) ? (a) : (b))
+
+/* Supported device interfaces */
+enum device_if {
+ DEVICE_IF_UNKNOWN = -1,
+ DEVICE_IF_EVDEV = 0,
+ DEVICE_IF_SYSMOUSE,
+};
+
+/* Recognized device types */
+enum device_type {
+ DEVICE_TYPE_UNKNOWN = -1,
+ DEVICE_TYPE_MOUSE = 0,
+ DEVICE_TYPE_POINTINGSTICK,
+ DEVICE_TYPE_TOUCHPAD,
+ DEVICE_TYPE_TOUCHSCREEN,
+ DEVICE_TYPE_TABLET,
+ DEVICE_TYPE_TABLET_PAD,
+ DEVICE_TYPE_KEYBOARD,
+ DEVICE_TYPE_JOYSTICK,
+};
+
+struct device {
+ char path[80];
+ enum device_if iftype;
+ enum device_type type;
+ char name[80];
+ char uniq[80];
+ struct input_id id;
+ mousemode_t mode;
+};
+
+/**
+ * @ingroup base
+ *
+ * Log handler type for custom logging.
+ *
+ * @param priority The priority of the current message
+ * @param format Message format in printf-style
+ * @param args Message arguments
+ */
+typedef void moused_log_handler(int priority, int errnum,
+ const char *format, va_list args);
+
+/* util-mem.h */
+
+/**
+ * Use: _unref_(foo) struct foo *bar;
+ *
+ * This requires foo_unrefp() to be present, use DEFINE_UNREF_CLEANUP_FUNC.
+ */
+#define _unref_(_type) __attribute__((cleanup(_type##_unrefp))) struct _type
+
+/**
+ * Define a cleanup function for the struct type foo with a matching
+ * foo_unref(). Use:
+ * DEFINE_UNREF_CLEANUP_FUNC(foo)
+ * _unref_(foo) struct foo *bar;
+ */
+#define DEFINE_UNREF_CLEANUP_FUNC(_type) \
+ static inline void _type##_unrefp(struct _type **_p) { \
+ if (*_p) \
+ _type##_unref(*_p); \
+ } \
+ struct __useless_struct_to_allow_trailing_semicolon__
+
+static inline void*
+_steal(void *ptr) {
+ void **original = (void**)ptr;
+ void *swapped = *original;
+ *original = NULL;
+ return swapped;
+}
+
+/**
+ * Resets the pointer content and resets the data to NULL.
+ * This circumvents _cleanup_ handling for that pointer.
+ * Use:
+ * _cleanup_free_ char *data = malloc();
+ * return steal(&data);
+ *
+ */
+#define steal(ptr_) \
+ (typeof(*ptr_))_steal(ptr_)
+
+/* ! util-mem.h */
+
+/* util-strings.h */
+
+static inline bool
+streq(const char *str1, const char *str2)
+{
+ /* one NULL, one not NULL is always false */
+ if (str1 && str2)
+ return strcmp(str1, str2) == 0;
+ return str1 == str2;
+}
+
+static inline bool
+strneq(const char *str1, const char *str2, int n)
+{
+ /* one NULL, one not NULL is always false */
+ if (str1 && str2)
+ return strncmp(str1, str2, n) == 0;
+ return str1 == str2;
+}
+
+static inline void *
+zalloc(size_t size)
+{
+ void *p;
+
+ /* We never need to alloc anything more than 1,5 MB so we can assume
+ * if we ever get above that something's going wrong */
+ if (size > 1536 * 1024)
+ assert(!"bug: internal malloc size limit exceeded");
+
+ p = calloc(1, size);
+ if (!p)
+ abort();
+
+ return p;
+}
+
+/**
+ * strdup guaranteed to succeed. If the input string is NULL, the output
+ * string is NULL. If the input string is a string pointer, we strdup or
+ * abort on failure.
+ */
+static inline char*
+safe_strdup(const char *str)
+{
+ char *s;
+
+ if (!str)
+ return NULL;
+
+ s = strdup(str);
+ if (!s)
+ abort();
+ return s;
+}
+
+/**
+ * Simple wrapper for asprintf that ensures the passed in-pointer is set
+ * to NULL upon error.
+ * The standard asprintf() call does not guarantee the passed in pointer
+ * will be NULL'ed upon failure, whereas this wrapper does.
+ *
+ * @param strp pointer to set to newly allocated string.
+ * This pointer should be passed to free() to release when done.
+ * @param fmt the format string to use for printing.
+ * @return The number of bytes printed (excluding the null byte terminator)
+ * upon success or -1 upon failure. In the case of failure the pointer is set
+ * to NULL.
+ */
+__attribute__ ((format (printf, 2, 3)))
+static inline int
+xasprintf(char **strp, const char *fmt, ...)
+{
+ int rc = 0;
+ va_list args;
+
+ va_start(args, fmt);
+ rc = vasprintf(strp, fmt, args);
+ va_end(args);
+ if ((rc == -1) && strp)
+ *strp = NULL;
+
+ return rc;
+}
+
+static inline bool
+safe_atoi_base(const char *str, int *val, int base)
+{
+ assert(str != NULL);
+
+ char *endptr;
+ long v;
+
+ assert(base == 10 || base == 16 || base == 8);
+
+ errno = 0;
+ v = strtol(str, &endptr, base);
+ if (errno > 0)
+ return false;
+ if (str == endptr)
+ return false;
+ if (*str != '\0' && *endptr != '\0')
+ return false;
+
+ if (v > INT_MAX || v < INT_MIN)
+ return false;
+
+ *val = v;
+ return true;
+}
+
+static inline bool
+safe_atoi(const char *str, int *val)
+{
+ assert(str != NULL);
+ return safe_atoi_base(str, val, 10);
+}
+
+static inline bool
+safe_atou_base(const char *str, unsigned int *val, int base)
+{
+ assert(str != NULL);
+
+ char *endptr;
+ unsigned long v;
+
+ assert(base == 10 || base == 16 || base == 8);
+
+ errno = 0;
+ v = strtoul(str, &endptr, base);
+ if (errno > 0)
+ return false;
+ if (str == endptr)
+ return false;
+ if (*str != '\0' && *endptr != '\0')
+ return false;
+
+ if ((long)v < 0)
+ return false;
+
+ *val = v;
+ return true;
+}
+
+static inline bool
+safe_atou(const char *str, unsigned int *val)
+{
+ assert(str != NULL);
+ return safe_atou_base(str, val, 10);
+}
+
+static inline bool
+safe_atod(const char *str, double *val)
+{
+ assert(str != NULL);
+
+ char *endptr;
+ double v;
+ size_t slen = strlen(str);
+
+ /* We don't have a use-case where we want to accept hex for a double
+ * or any of the other values strtod can parse */
+ for (size_t i = 0; i < slen; i++) {
+ char c = str[i];
+
+ if (isdigit(c))
+ continue;
+ switch(c) {
+ case '+':
+ case '-':
+ case '.':
+ break;
+ default:
+ return false;
+ }
+ }
+
+#ifdef HAVE_LOCALE_H
+ /* Create a "C" locale to force strtod to use '.' as separator */
+ locale_t c_locale = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0);
+ if (c_locale == (locale_t)0)
+ return false;
+
+ errno = 0;
+ v = strtod_l(str, &endptr, c_locale);
+ freelocale(c_locale);
+#else
+ /* No locale support in provided libc, assume it already uses '.' */
+ errno = 0;
+ v = strtod(str, &endptr);
+#endif
+ if (errno > 0)
+ return false;
+ if (str == endptr)
+ return false;
+ if (*str != '\0' && *endptr != '\0')
+ return false;
+ if (v != 0.0 && !isnormal(v))
+ return false;
+
+ *val = v;
+ return true;
+}
+
+char **strv_from_string(const char *in, const char *separator, size_t *num_elements);
+
+typedef int (*strv_foreach_callback_t)(const char *str, size_t index, void *data);
+int strv_for_each_n(const char **strv, size_t max, strv_foreach_callback_t func, void *data);
+
+static inline void
+strv_free(char **strv) {
+ char **s = strv;
+
+ if (!strv)
+ return;
+
+ while (*s != NULL) {
+ free(*s);
+ *s = (char*)0x1; /* detect use-after-free */
+ s++;
+ }
+
+ free (strv);
+}
+
+/**
+ * Return true if str ends in suffix, false otherwise. If the suffix is the
+ * empty string, strendswith() always returns false.
+ */
+static inline bool
+strendswith(const char *str, const char *suffix)
+{
+ if (str == NULL)
+ return false;
+
+ size_t slen = strlen(str);
+ size_t suffixlen = strlen(suffix);
+ size_t offset;
+
+ if (slen == 0 || suffixlen == 0 || suffixlen > slen)
+ return false;
+
+ offset = slen - suffixlen;
+ return strneq(&str[offset], suffix, suffixlen);
+}
+
+static inline bool
+strstartswith(const char *str, const char *prefix)
+{
+ if (str == NULL)
+ return false;
+
+ size_t prefixlen = strlen(prefix);
+
+ return prefixlen > 0 ? strneq(str, prefix, strlen(prefix)) : false;
+}
+
+/* !util-strings.h */
+
+/* util-prop-parsers.h */
+
+struct input_prop {
+ unsigned int prop;
+ bool enabled;
+};
+
+bool parse_dimension_property(const char *prop, size_t *w, size_t *h);
+bool parse_range_property(const char *prop, int *hi, int *lo);
+bool parse_boolean_property(const char *prop, bool *b);
+#define EVENT_CODE_UNDEFINED 0xffff
+bool parse_evcode_property(const char *prop, struct input_event *events, size_t *nevents);
+bool parse_input_prop_property(const char *prop, struct input_prop *props_out, size_t *nprops);
+
+/* !util-prop-parsers.h */
diff --git a/usr.sbin/moused/msconvd/Makefile b/usr.sbin/moused/msconvd/Makefile
new file mode 100644
index 000000000000..6ea5eee7db3b
--- /dev/null
+++ b/usr.sbin/moused/msconvd/Makefile
@@ -0,0 +1,8 @@
+PACKAGE= console-tools
+PROG= msconvd
+SRCS= ${PROG}.c
+LIBADD= util
+BINDIR= /usr/sbin
+MAN= ${PROG}.8
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/moused/moused.8 b/usr.sbin/moused/msconvd/msconvd.8
index cd5d8ddde339..17434ecb9b60 100644
--- a/usr.sbin/moused/moused.8
+++ b/usr.sbin/moused/msconvd/msconvd.8
@@ -31,30 +31,21 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd July 7, 2024
-.Dt MOUSED 8
+.Dd May 18, 2025
+.Dt MSCONVD 8
.Os
.Sh NAME
-.Nm moused
-.Nd pass mouse data to the system video console driver
+.Nm msconvd
+.Nd mouse protocol conversion daemon
.Sh SYNOPSIS
.Nm
-.Op Fl DPRacdfs
+.Op Fl DPRcdfs
.Op Fl I Ar file
.Op Fl F Ar rate
.Op Fl r Ar resolution
.Op Fl S Ar baudrate
-.Op Fl VH Op Fl U Ar distance Fl L Ar distance
-.Op Fl A Ar exp Ns Op , Ns Ar offset
-.Op Fl a Ar X Ns Op , Ns Ar Y
-.Op Fl C Ar threshold
-.Op Fl m Ar N=M
-.Op Fl w Ar N
-.Op Fl z Ar target
.Op Fl t Ar mousetype
.Op Fl l Ar level
-.Op Fl 3 Op Fl E Ar timeout
-.Op Fl T Ar distance Ns Op , Ns Ar time Ns Op , Ns Ar after
.Fl p Ar port
.Pp
.Nm
@@ -64,38 +55,41 @@
.Sh DESCRIPTION
The
.Nm
-utility and the console driver work together to support
-mouse operation in the text console and user programs.
-They virtualize the mouse and provide user programs with mouse data
-in the standard format
-(see
-.Xr sysmouse 4 ) .
-.Pp
-The mouse daemon listens to the specified port for mouse data,
-interprets and then passes it via ioctls to the console driver.
-The mouse daemon
-reports translation movement, button press/release
+utility and the
+.Xr moused 8
+driver work together to support legacy devices like COM,
+.Xr ams 4
+mices and X10 remotes as well.
+.Xr psm 4 ,
+.Xr ums 4
+and some other devices are supported too but not recomended to use with
+.Nm
+unless kernel is compiled without
+.Dq option EVDEV_SUPPORT .
+The
+.Nm
+listens to the specified port for mouse data, decodes and then passes
+it via input event device a.k.a evdev to consumer aplications like
+.Xr moused 8
+or
+.Xr libinput 1 .
+It does not display the mouse pointer on the screen or provide cut and
+paste functions.
+The msconv daemon converts translation movement, button press/release
events and movement of the roller or the wheel if available.
-The roller/wheel movement is reported as
-.Dq Z
-axis movement.
-.Pp
-The console driver will display the mouse pointer on the screen
-and provide cut and paste functions if the mouse pointer is enabled
-in the virtual console via
-.Xr vidcontrol 1 .
-If
-.Xr sysmouse 4
-is opened by the user program, the console driver also passes the mouse
-data to the device so that the user program will see it.
-.Pp
-If the mouse daemon receives the signal
+.Pp
+.Pp
+If the
+.Nm
+receives the signal
.Dv SIGHUP ,
it will reopen the mouse port and reinitialize itself.
Useful if
the mouse is attached/detached while the system is suspended.
.Pp
-If the mouse daemon receives the signal
+If the
+.Nm
+receives the signal
.Dv SIGUSR1 ,
it will stop passing mouse events.
Sending the signal
@@ -106,19 +100,6 @@ interrupted by accidentally touching the mouse pad.
.Pp
The following options are available:
.Bl -tag -width indent
-.It Fl 3
-Emulate the third (middle) button for 2-button mice.
-It is emulated
-by pressing the left and right physical buttons simultaneously.
-.It Fl C Ar threshold
-Set double click speed as the maximum interval in msec between button clicks.
-Without this option, the default value of 500 msec will be assumed.
-This option will have effect only on the cut and paste operations
-in the text mode console.
-The user program which is reading mouse data
-via
-.Xr sysmouse 4
-will not be affected.
.It Fl D
Lower DTR on the serial port.
This option is valid only if
@@ -128,46 +109,8 @@ The DTR line may need to be dropped for a 3-button mouse
to operate in the
.Ar mousesystems
mode.
-.It Fl E Ar timeout
-When the third button emulation is enabled
-(see above),
-the
-.Nm
-utility waits
-.Ar timeout
-msec at most before deciding whether two buttons are being pressed
-simultaneously.
-The default timeout is 100 msec.
.It Fl F Ar rate
Set the report rate (reports/sec) of the device if supported.
-.It Fl L Ar distance
-When
-.Dq Virtual Scrolling
-is enabled, the
-.Fl L
-option can be used to set the
-.Ar distance
-(in pixels) that the mouse must move before a scroll event
-is generated.
-This effectively controls the scrolling speed.
-The default
-.Ar distance
-is 2 pixels.
-.It Fl H
-Enable
-.Dq Horizontal Virtual Scrolling .
-With this option set, holding the middle mouse
-button down will cause motion to be interpreted as
-horizontal scrolling.
-Use the
-.Fl U
-option to set the distance the mouse must move before the scrolling mode is
-activated and the
-.Fl L
-option to set the scrolling speed.
-This option may be used with or without the
-.Fl V
-option.
.It Fl I Ar file
Write the process id of the
.Nm
@@ -199,89 +142,6 @@ mode.
.It Fl S Ar baudrate
Select the baudrate for the serial port (1200 to 9600).
Not all serial mice support this option.
-.It Fl T Ar distance Ns Op , Ns Ar time Ns Op , Ns Ar after
-Terminate drift.
-Use this option if mouse pointer slowly wanders when mouse is not moved.
-Movements up to
-.Ar distance
-(for example 4) pixels (X+Y) in
-.Ar time
-msec (default 500) are ignored, except during
-.Ar after
-msec (default 4000) since last real mouse movement.
-.It Fl V
-Enable
-.Dq Virtual Scrolling .
-With this option set, holding the middle mouse
-button down will cause motion to be interpreted as scrolling.
-Use the
-.Fl U
-option to set the distance the mouse must move before the scrolling mode is
-activated and the
-.Fl L
-option to set the scrolling speed.
-.It Fl U Ar distance
-When
-.Dq Virtual Scrolling
-is enabled, the
-.Fl U
-option can be used to set the
-.Ar distance
-(in pixels) that the mouse must move before the scrolling
-mode is activated.
-The default
-.Ar distance
-is 3 pixels.
-.It Fl A Ar exp Ns Op , Ns Ar offset
-Apply exponential (dynamic) acceleration to mouse movements:
-the faster you move the mouse, the more it will be accelerated.
-That means that small mouse movements are not accelerated,
-so they are still very accurate, while a faster movement will
-drive the pointer quickly across the screen.
-.Pp
-The
-.Ar exp
-value specifies the exponent, which is basically
-the amount of acceleration.
-Useful values are in the range 1.1 to 2.0, but it depends on
-your mouse hardware and your personal preference.
-A value of 1.0 means no exponential acceleration.
-A value of 2.0 means squared acceleration (i.e. if
-you move the mouse twice as fast, the pointer will move
-four times as fast on the screen).
-Values beyond 2.0 are possible but not recommended.
-A good value to start is probably 1.5.
-.Pp
-The optional
-.Ar offset
-value specifies the distance at which the acceleration begins.
-The default is 1.0, which means that the acceleration is applied
-to movements larger than one unit.
-If you specify a larger value, it takes more speed for
-the acceleration to kick in, i.e. the speed range for
-small and accurate movements is wider.
-Usually the default should be sufficient, but if you're
-not satisfied with the behaviour, try a value of 2.0.
-.Pp
-Note that the
-.Fl A
-option interacts badly with the X server's own acceleration,
-which doesn't work very well anyway.
-Therefore it is recommended to switch it off if necessary:
-.Dq xset m 1 .
-.It Fl a Ar X Ns Op , Ns Ar Y
-Accelerate or decelerate the mouse input.
-This is a linear acceleration only.
-Values less than 1.0 slow down movement, values greater than 1.0 speed it
-up.
-Specifying only one value sets the acceleration for both axes.
-.Pp
-You can use the
-.Fl a
-and
-.Fl A
-options at the same time to have the combined effect
-of linear and exponential acceleration.
.It Fl c
Some mice report middle button down events
as if the left and right buttons are being pressed.
@@ -339,18 +199,6 @@ Refer to
in
.Xr psm 4
for more information on this.
-.It Fl m Ar N=M
-Assign the physical button
-.Ar M
-to the logical button
-.Ar N .
-You may specify as many instances of this option as you like.
-More than one physical button may be assigned to a logical button at the
-same time.
-In this case the logical button will be down,
-if either of the assigned physical buttons is held down.
-Do not put space around
-.Ql = .
.It Fl p Ar port
Use
.Ar port
@@ -382,7 +230,7 @@ you need to use this option only if the
.Nm
utility is not able to detect the protocol automatically
(see
-.Sx "Configuring Mouse Daemon" ) .
+.Sx "Configuring Mouse Protocol Conversion Daemon" ) .
.Pp
Note that if a protocol type is specified with this option, the
.Fl P
@@ -475,73 +323,9 @@ For the USB mouse,
.Ar auto
is the only protocol type available for the USB mouse
and should be specified for any USB mice, regardless of the brand.
-.It Fl w Ar N
-Make the physical button
-.Ar N
-act as the wheel mode button.
-While this button is pressed, X and Y axis movement is reported to be zero
-and the Y axis movement is mapped to Z axis.
-You may further map the Z axis movement to virtual buttons by the
-.Fl z
-option below.
-.It Fl z Ar target
-Map Z axis (roller/wheel) movement to another axis or to virtual buttons.
-Valid
-.Ar target
-maybe:
-.Bl -tag -compact -width x__
-.It Ar x
-.It Ar y
-X or Y axis movement will be reported when the Z axis movement is detected.
-.It Ar N
-Report down events for the virtual buttons
-.Ar N
-and
-.Ar N+1
-respectively when negative and positive Z axis movement
-is detected.
-There do not need to be physical buttons
-.Ar N
-and
-.Ar N+1 .
-Note that mapping to logical buttons is carried out after mapping
-from the Z axis movement to the virtual buttons is done.
-.It Ar N1 N2
-Report down events for the virtual buttons
-.Ar N1
-and
-.Ar N2
-respectively when negative and positive Z axis movement
-is detected.
-.It Ar N1 N2 N3 N4
-This is useful for the mouse with two wheels of which
-the second wheel is used to generate horizontal scroll action,
-and for the mouse which has a knob or a stick which can detect
-the horizontal force applied by the user.
-.Pp
-The motion of the second wheel will be mapped to the buttons
-.Ar N3 ,
-for the negative direction, and
-.Ar N4 ,
-for the positive direction.
-If the buttons
-.Ar N3
-and
-.Ar N4
-actually exist in this mouse, their actions will not be detected.
-.Pp
-Note that horizontal movement or second roller/wheel movement may not
-always be detected,
-because there appears to be no accepted standard as to how it is encoded.
-.Pp
-Note also that some mice think left is the negative horizontal direction;
-others may think otherwise.
-Moreover, there are some mice whose two wheels are both mounted vertically,
-and the direction of the second vertical wheel does not match the
-first one.
.El
.El
-.Ss Configuring Mouse Daemon
+.Ss Configuring Mouse Protocol Conversion Daemon
The first thing you need to know is the interface type
of the mouse you are going to use.
It can be determined by looking at the connector of the mouse.
@@ -673,13 +457,17 @@ protocol.
.El
.Pp
To test if the selected protocol type is correct for the given mouse,
-enable the mouse pointer in the current virtual console,
+ensure the
+.Xr moused 8
+is running in auto port mode,
.Pp
-.Dl "vidcontrol -m on"
+.Dl "moused -p auto"
.Pp
-start the mouse daemon in the foreground mode,
+start the
+.Nm
+in the foreground mode,
.Pp
-.Dl "moused -f -p <selected_port> -t <selected_protocol>"
+.Dl "msconvd -f -p <selected_port> -t <selected_protocol>"
.Pp
and see if the mouse pointer travels correctly
according to the mouse movement.
@@ -688,19 +476,20 @@ clicking the left, right and middle buttons.
Type ^C to stop
the command.
.Ss Multiple Mice
-As many instances of the mouse daemon as the number of mice attached to
-the system may be run simultaneously; one
-instance for each mouse.
+As many instances of the
+.Nm
+as the number of mice attached to the system may be run simultaneously;
+one instance for each mouse.
This is useful if the user wants to use the built-in PS/2 pointing device
of a laptop computer while on the road, but wants to use a serial
mouse when s/he attaches the system to the docking station in the office.
-Run two mouse daemons and tell the application program
-(such as the
-.Tn "X\ Window System" )
-to use
-.Xr sysmouse 4 ,
-then the application program will always see mouse data from either mouse.
-When the serial mouse is not attached, the corresponding mouse daemon
+Run two
+.Nm
+and then the application program e.g.
+.Xr moused 8
+will always see mouse data from either mouse.
+When the serial mouse is not attached, the corresponding
+.Nm
will not detect any movement or button state change and the application
program will only see mouse data coming from the daemon for the
PS/2 mouse.
@@ -709,18 +498,18 @@ are moved at the same time in this configuration,
the mouse pointer will travel across the screen just as if movement of
the mice is combined all together.
.Sh FILES
-.Bl -tag -width /dev/consolectl -compact
-.It Pa /dev/consolectl
-device to control the console
+.Bl -tag -width /dev/input/event%d -compact
+.It Pa /dev/input/event%d
+input event device
.It Pa /dev/psm%d
PS/2 mouse driver
-.It Pa /dev/sysmouse
-virtualized mouse driver
+.It Pa /dev/cuau%d
+serial port
.It Pa /dev/ttyv%d
virtual consoles
.It Pa /dev/ums%d
USB mouse driver
-.It Pa /var/run/moused.pid
+.It Pa /var/run/msconvd.pid
process id of the currently running
.Nm
utility
@@ -728,7 +517,7 @@ utility
UNIX-domain stream socket for X10 MouseRemote events
.El
.Sh EXAMPLES
-.Dl "moused -p /dev/cuau0 -i type"
+.Dl "msconvd -p /dev/cuau0 -i type"
.Pp
Let the
.Nm
@@ -737,8 +526,7 @@ utility determine the protocol type of the mouse at the serial port
If successful, the command will print the type, otherwise it will say
.Dq Li unknown .
.Bd -literal -offset indent
-moused -p /dev/cuau0
-vidcontrol -m on
+msconvd -p /dev/cuau0
.Ed
.Pp
If the
@@ -746,10 +534,9 @@ If the
utility is able to identify the protocol type of the mouse at the specified
port automatically, you can start the daemon without the
.Fl t
-option and enable the mouse pointer in the text console as above.
+option.
.Bd -literal -offset indent
-moused -p /dev/mouse -t microsoft
-vidcontrol -m on
+msconvd -p /dev/mouse -t microsoft
.Ed
.Pp
Start the mouse daemon on the serial port
@@ -760,39 +547,26 @@ is explicitly specified by the
.Fl t
option.
.Pp
-.Dl "moused -p /dev/mouse -m 1=3 -m 3=1"
-.Pp
-Assign the physical button 3 (right button) to the logical button 1
-(logical left) and the physical button 1 (left) to the logical
-button 3 (logical right).
-This will effectively swap the left and right buttons.
-.Pp
-.Dl "moused -p /dev/mouse -t intellimouse -z 4"
-.Pp
-Report negative Z axis movement (i.e., mouse wheel) as the button 4 pressed
-and positive Z axis movement (i.e., mouse wheel) as the button 5 pressed.
-.Pp
If you add
.Pp
-.Dl "ALL ALL = NOPASSWD: /usr/bin/killall -USR1 moused"
+.Dl "ALL ALL = NOPASSWD: /usr/bin/killall -USR1 msconvd"
.Pp
to your
.Pa /usr/local/etc/sudoers
file, and bind
.Pp
-.Dl "killall -USR1 moused"
+.Dl "killall -USR1 msconvd"
.Pp
to a key in your window manager, you can suspend mouse events on your laptop if
you keep brushing over the mouse pad while typing.
.Sh SEE ALSO
+.Xr moused 8 ,
.Xr kill 1 ,
-.Xr vidcontrol 1 ,
.Xr xset 1 ,
-.Xr keyboard 4 ,
.Xr psm 4 ,
.Xr screen 4 ,
.Xr sysmouse 4 ,
-.Xr ums 4
+.Xr uart 4
.Sh STANDARDS
The
.Nm
@@ -809,14 +583,23 @@ for the given serial mouse.
The
.Nm
utility first appeared in
+.Fx 15.0 .
+It is a cropped-down version of
+.Fx 14.0
+.Xr moused 8
+utility originated back in
.Fx 2.2 .
.Sh AUTHORS
.An -nosplit
The
.Nm
-utility was written by
+utility is based on
+.Xr moused 8
+written by
.An Michael Smith Aq Mt msmith@FreeBSD.org .
-This manual page was written by
+This manual page is extracted from
+.Xr moused 8
+page written by
.An Mike Pritchard Aq Mt mpp@FreeBSD.org .
The command and manual page have since been updated by
.An Kazutaka Yokota Aq Mt yokota@FreeBSD.org .
@@ -830,21 +613,7 @@ treat the tapping action
as fourth button events.
Use the option
.Dq Fl m Li 1=4
+of
+.Xr moused 8
for these models
to obtain the same effect as the other pad devices.
-.Pp
-Cut and paste functions in the virtual console assume that there
-are three buttons on the mouse.
-The logical button 1 (logical left) selects a region of text in the
-console and copies it to the cut buffer.
-The logical button 3 (logical right) extends the selected region.
-The logical button 2 (logical middle) pastes the selected text
-at the text cursor position.
-If the mouse has only two buttons, the middle, `paste' button
-is not available.
-To obtain the paste function, use the
-.Fl 3
-option to emulate the middle button, or use the
-.Fl m
-option to assign the physical right button to the logical middle button:
-.Dq Fl m Li 2=3 .
diff --git a/usr.sbin/moused/moused.c b/usr.sbin/moused/msconvd/msconvd.c
index 068919f2e941..7b06d92019aa 100644
--- a/usr.sbin/moused/moused.c
+++ b/usr.sbin/moused/msconvd/msconvd.c
@@ -34,11 +34,11 @@
**/
/**
- ** MOUSED.C
+ ** MSCONVD.C
**
- ** Mouse daemon : listens to a serial port, the bus mouse interface, or
- ** the PS/2 mouse port for mouse data stream, interprets data and passes
- ** ioctls off to the console driver.
+ ** Mouse protocol conversion daemon : listens to a serial port or
+ ** the PS/2 mouse port for mouse data stream, decodes data and passes
+ ** writes off to the uinput driver.
**
** The mouse interface functions are derived closely from the mouse
** handler in the XFree86 X server. Many thanks to the XFree86 people
@@ -54,15 +54,20 @@
#include <sys/time.h>
#include <sys/un.h>
+#include <dev/evdev/input.h>
+#include <dev/evdev/uinput.h>
+
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
+#include <libgen.h>
#include <libutil.h>
#include <limits.h>
#include <setjmp.h>
#include <signal.h>
#include <stdarg.h>
+#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -70,23 +75,6 @@
#include <syslog.h>
#include <termios.h>
#include <unistd.h>
-#include <math.h>
-
-#define MAX_CLICKTHRESHOLD 2000 /* 2 seconds */
-#define MAX_BUTTON2TIMEOUT 2000 /* 2 seconds */
-#define DFLT_CLICKTHRESHOLD 500 /* 0.5 second */
-#define DFLT_BUTTON2TIMEOUT 100 /* 0.1 second */
-#define DFLT_SCROLLTHRESHOLD 3 /* 3 pixels */
-#define DFLT_SCROLLSPEED 2 /* 2 pixels */
-
-/* Abort 3-button emulation delay after this many movement events. */
-#define BUTTON2_MAXMOVE 3
-
-#define TRUE 1
-#define FALSE 0
-
-#define MOUSE_XAXIS (-1)
-#define MOUSE_YAXIS (-2)
/* Logitech PS2++ protocol */
#define MOUSE_PS2PLUS_CHECKBITS(b) \
@@ -95,13 +83,9 @@
(((b[0] & 0x30) >> 2) | ((b[1] & 0x30) >> 4))
#define ChordMiddle 0x0001
-#define Emulate3Button 0x0002
#define ClearDTR 0x0004
#define ClearRTS 0x0008
#define NoPnP 0x0010
-#define VirtualScroll 0x0020
-#define HVirtualScroll 0x0040
-#define ExponentialAcc 0x0080
#define ID_NONE 0
#define ID_PORT 1
@@ -110,22 +94,6 @@
#define ID_MODEL 8
#define ID_ALL (ID_PORT | ID_IF | ID_TYPE | ID_MODEL)
-/* Operations on timespecs */
-#define tsclr(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0)
-#define tscmp(tvp, uvp, cmp) \
- (((tvp)->tv_sec == (uvp)->tv_sec) ? \
- ((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \
- ((tvp)->tv_sec cmp (uvp)->tv_sec))
-#define tssub(tvp, uvp, vvp) \
- do { \
- (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
- (vvp)->tv_nsec = (tvp)->tv_nsec - (uvp)->tv_nsec; \
- if ((vvp)->tv_nsec < 0) { \
- (vvp)->tv_sec--; \
- (vvp)->tv_nsec += 1000000000; \
- } \
- } while (0)
-
#define debug(...) do { \
if (debug && nodaemon) \
warnx(__VA_ARGS__); \
@@ -174,30 +142,21 @@ typedef struct {
/* global variables */
static int debug = 0;
-static int nodaemon = FALSE;
-static int background = FALSE;
-static int paused = FALSE;
+static bool nodaemon = false;
+static bool background = false;
+static bool paused = false;
static int identify = ID_NONE;
-static int extioctl = FALSE;
-static const char *pidfile = "/var/run/moused.pid";
+static const char *pidfile = "/var/run/msconvd.pid";
static struct pidfh *pfh;
-#define SCROLL_NOTSCROLLING 0
-#define SCROLL_PREPARE 1
-#define SCROLL_SCROLLING 2
-
-static int scroll_state;
-static int scroll_movement;
-static int hscroll_movement;
-
/* local variables */
/* interface (the table must be ordered by MOUSE_IF_XXX in mouse.h) */
static symtab_t rifs[] = {
- { "serial", MOUSE_IF_SERIAL, 0 },
- { "ps/2", MOUSE_IF_PS2, 0 },
- { "sysmouse", MOUSE_IF_SYSMOUSE, 0 },
- { "usb", MOUSE_IF_USB, 0 },
+ { "serial", MOUSE_IF_SERIAL, BUS_RS232 },
+ { "ps/2", MOUSE_IF_PS2, BUS_I8042 },
+ { "sysmouse", MOUSE_IF_SYSMOUSE, BUS_VIRTUAL },
+ { "usb", MOUSE_IF_USB, BUS_USB },
{ NULL, MOUSE_IF_UNKNOWN, 0 },
};
@@ -381,6 +340,18 @@ static unsigned short rodentcflags[] =
(CS8 | CREAD | HUPCL ), /* GTCO Digi-Pad */
};
+/* evdev button codes */
+static const int16_t evdev_buttons[8] = {
+ BTN_LEFT,
+ BTN_MIDDLE,
+ BTN_RIGHT,
+ BTN_SIDE,
+ BTN_EXTRA,
+ BTN_FORWARD,
+ BTN_BACK,
+ BTN_TASK
+};
+
static struct rodentparam {
int flags;
const char *portname; /* /dev/XXX */
@@ -389,25 +360,13 @@ static struct rodentparam {
int baudrate;
int rate; /* report rate */
int resolution; /* MOUSE_RES_XXX or a positive number */
- int zmap[4]; /* MOUSE_{X|Y}AXIS or a button number */
- int wmode; /* wheel mode button number */
int mfd; /* mouse file descriptor */
- int cfd; /* /dev/consolectl file descriptor */
+ int ufd; /* /dev/uinput file descriptor */
int mremsfd; /* mouse remote server file descriptor */
int mremcfd; /* mouse remote client file descriptor */
int is_removable; /* set if device is removable, like USB */
- long clickthreshold; /* double click speed in msec */
- long button2timeout; /* 3 button emulation timeout */
mousehw_t hw; /* mouse device hardware information */
mousemode_t mode; /* protocol information */
- float accelx; /* Acceleration in the X axis */
- float accely; /* Acceleration in the Y axis */
- float expoaccel; /* Exponential acceleration */
- float expoffset; /* Movement offset for exponential accel. */
- float remainx; /* Remainder on X and Y axis, respectively... */
- float remainy; /* ... to compensate for rounding errors. */
- int scrollthreshold; /* Movement distance before virtual scrolling */
- int scrollspeed; /* Movement distance to rate of scrolling */
} rodent = {
.flags = 0,
.portname = NULL,
@@ -416,107 +375,18 @@ static struct rodentparam {
.baudrate = 1200,
.rate = 0,
.resolution = MOUSE_RES_UNKNOWN,
- .zmap = { 0, 0, 0, 0 },
- .wmode = 0,
.mfd = -1,
- .cfd = -1,
+ .ufd = -1,
.mremsfd = -1,
.mremcfd = -1,
.is_removable = 0,
- .clickthreshold = DFLT_CLICKTHRESHOLD,
- .button2timeout = DFLT_BUTTON2TIMEOUT,
- .accelx = 1.0,
- .accely = 1.0,
- .expoaccel = 1.0,
- .expoffset = 1.0,
- .remainx = 0.0,
- .remainy = 0.0,
- .scrollthreshold = DFLT_SCROLLTHRESHOLD,
- .scrollspeed = DFLT_SCROLLSPEED,
-};
-
-/* button status */
-struct button_state {
- int count; /* 0: up, 1: single click, 2: double click,... */
- struct timespec ts; /* timestamp on the last button event */
-};
-static struct button_state bstate[MOUSE_MAXBUTTON]; /* button state */
-static struct button_state *mstate[MOUSE_MAXBUTTON];/* mapped button st.*/
-static struct button_state zstate[4]; /* Z/W axis state */
-
-/* state machine for 3 button emulation */
-
-#define S0 0 /* start */
-#define S1 1 /* button 1 delayed down */
-#define S2 2 /* button 3 delayed down */
-#define S3 3 /* both buttons down -> button 2 down */
-#define S4 4 /* button 1 delayed up */
-#define S5 5 /* button 1 down */
-#define S6 6 /* button 3 down */
-#define S7 7 /* both buttons down */
-#define S8 8 /* button 3 delayed up */
-#define S9 9 /* button 1 or 3 up after S3 */
-
-#define A(b1, b3) (((b1) ? 2 : 0) | ((b3) ? 1 : 0))
-#define A_TIMEOUT 4
-#define S_DELAYED(st) (states[st].s[A_TIMEOUT] != (st))
-
-static struct {
- int s[A_TIMEOUT + 1];
- int buttons;
- int mask;
- int timeout;
-} states[10] = {
- /* S0 */
- { { S0, S2, S1, S3, S0 }, 0, ~(MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN), FALSE },
- /* S1 */
- { { S4, S2, S1, S3, S5 }, 0, ~MOUSE_BUTTON1DOWN, FALSE },
- /* S2 */
- { { S8, S2, S1, S3, S6 }, 0, ~MOUSE_BUTTON3DOWN, FALSE },
- /* S3 */
- { { S0, S9, S9, S3, S3 }, MOUSE_BUTTON2DOWN, ~0, FALSE },
- /* S4 */
- { { S0, S2, S1, S3, S0 }, MOUSE_BUTTON1DOWN, ~0, TRUE },
- /* S5 */
- { { S0, S2, S5, S7, S5 }, MOUSE_BUTTON1DOWN, ~0, FALSE },
- /* S6 */
- { { S0, S6, S1, S7, S6 }, MOUSE_BUTTON3DOWN, ~0, FALSE },
- /* S7 */
- { { S0, S6, S5, S7, S7 }, MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN, ~0, FALSE },
- /* S8 */
- { { S0, S2, S1, S3, S0 }, MOUSE_BUTTON3DOWN, ~0, TRUE },
- /* S9 */
- { { S0, S9, S9, S3, S9 }, 0, ~(MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN), FALSE },
};
-static int mouse_button_state;
-static struct timespec mouse_button_state_ts;
-static int mouse_move_delayed;
static jmp_buf env;
-struct drift_xy {
- int x;
- int y;
-};
-static int drift_distance = 4; /* max steps X+Y */
-static int drift_time = 500; /* in 0.5 sec */
-static struct timespec drift_time_ts;
-static struct timespec drift_2time_ts; /* 2*drift_time */
-static int drift_after = 4000; /* 4 sec */
-static struct timespec drift_after_ts;
-static int drift_terminate = FALSE;
-static struct timespec drift_current_ts;
-static struct timespec drift_tmp;
-static struct timespec drift_last_activity = {0, 0};
-static struct timespec drift_since = {0, 0};
-static struct drift_xy drift_last = {0, 0}; /* steps in last drift_time */
-static struct drift_xy drift_previous = {0, 0}; /* steps in prev. drift_time */
-
/* function prototypes */
-static void linacc(int, int, int*, int*);
-static void expoacc(int, int, int*, int*);
-static void moused(void);
+static void msconvd(void);
static void hup(int sig);
static void cleanup(int sig);
static void pause_mouse(int sig);
@@ -524,31 +394,29 @@ static void usage(void);
static void log_or_warn(int log_pri, int errnum, const char *fmt, ...)
__printflike(3, 4);
+static int r_uinput_register(void);
+static int r_uinput_report(int fd, mousestatus_t *act);
static int r_identify(void);
static const char *r_if(int type);
+static uint16_t r_bustype(int type);
static const char *r_name(int type);
static const char *r_model(int model);
static void r_init(void);
static int r_protocol(u_char b, mousestatus_t *act);
-static int r_statetrans(mousestatus_t *a1, mousestatus_t *a2, int trans);
-static int r_installmap(char *arg);
-static void r_map(mousestatus_t *act1, mousestatus_t *act2);
-static void r_timestamp(mousestatus_t *act);
-static int r_timeout(void);
-static void r_click(mousestatus_t *act);
static void setmousespeed(int old, int new, unsigned cflag);
-static int pnpwakeup1(void);
-static int pnpwakeup2(void);
+static bool pnpwakeup1(void);
+static bool pnpwakeup2(void);
static int pnpgets(char *buf);
-static int pnpparse(pnpid_t *id, char *buf, int len);
+static bool pnpparse(pnpid_t *id, char *buf, int len);
static symtab_t *pnpproto(pnpid_t *id);
static symtab_t *gettoken(symtab_t *tab, const char *s, int len);
static const char *gettokenname(symtab_t *tab, int val);
+static int gettokenval2(symtab_t *tab, int val);
static void mremote_serversetup(void);
-static void mremote_clientchg(int add);
+static void mremote_clientchg(bool add);
static int kidspad(u_char rxc, mousestatus_t *act);
static int gtco_digipad(u_char, mousestatus_t *);
@@ -558,52 +426,10 @@ main(int argc, char *argv[])
{
int c;
int i;
- int j;
- for (i = 0; i < MOUSE_MAXBUTTON; ++i)
- mstate[i] = &bstate[i];
-
- while ((c = getopt(argc, argv, "3A:C:DE:F:HI:L:PRS:T:VU:a:cdfhi:l:m:p:r:st:w:z:")) != -1)
+ while ((c = getopt(argc, argv, "DF:I:PRS:cdfhi:l:p:r:st:")) != -1)
switch(c) {
- case '3':
- rodent.flags |= Emulate3Button;
- break;
-
- case 'E':
- rodent.button2timeout = atoi(optarg);
- if ((rodent.button2timeout < 0) ||
- (rodent.button2timeout > MAX_BUTTON2TIMEOUT)) {
- warnx("invalid argument `%s'", optarg);
- usage();
- }
- break;
-
- case 'a':
- i = sscanf(optarg, "%f,%f", &rodent.accelx, &rodent.accely);
- if (i == 0) {
- warnx("invalid linear acceleration argument '%s'", optarg);
- usage();
- }
-
- if (i == 1)
- rodent.accely = rodent.accelx;
-
- break;
-
- case 'A':
- rodent.flags |= ExponentialAcc;
- i = sscanf(optarg, "%f,%f", &rodent.expoaccel, &rodent.expoffset);
- if (i == 0) {
- warnx("invalid exponential acceleration argument '%s'", optarg);
- usage();
- }
-
- if (i == 1)
- rodent.expoffset = 1.0;
-
- break;
-
case 'c':
rodent.flags |= ChordMiddle;
break;
@@ -613,7 +439,7 @@ main(int argc, char *argv[])
break;
case 'f':
- nodaemon = TRUE;
+ nodaemon = true;
break;
case 'i':
@@ -631,7 +457,7 @@ main(int argc, char *argv[])
warnx("invalid argument `%s'", optarg);
usage();
}
- nodaemon = TRUE;
+ nodaemon = true;
break;
case 'l':
@@ -642,13 +468,6 @@ main(int argc, char *argv[])
}
break;
- case 'm':
- if (!r_installmap(optarg)) {
- warnx("invalid argument `%s'", optarg);
- usage();
- }
- break;
-
case 'p':
rodent.portname = optarg;
break;
@@ -677,58 +496,6 @@ main(int argc, char *argv[])
rodent.baudrate = 9600;
break;
- case 'w':
- i = atoi(optarg);
- if ((i <= 0) || (i > MOUSE_MAXBUTTON)) {
- warnx("invalid argument `%s'", optarg);
- usage();
- }
- rodent.wmode = 1 << (i - 1);
- break;
-
- case 'z':
- if (strcmp(optarg, "x") == 0)
- rodent.zmap[0] = MOUSE_XAXIS;
- else if (strcmp(optarg, "y") == 0)
- rodent.zmap[0] = MOUSE_YAXIS;
- else {
- i = atoi(optarg);
- /*
- * Use button i for negative Z axis movement and
- * button (i + 1) for positive Z axis movement.
- */
- if ((i <= 0) || (i > MOUSE_MAXBUTTON - 1)) {
- warnx("invalid argument `%s'", optarg);
- usage();
- }
- rodent.zmap[0] = i;
- rodent.zmap[1] = i + 1;
- debug("optind: %d, optarg: '%s'", optind, optarg);
- for (j = 1; j < 4; ++j) {
- if ((optind >= argc) || !isdigit(*argv[optind]))
- break;
- i = atoi(argv[optind]);
- if ((i <= 0) || (i > MOUSE_MAXBUTTON - 1)) {
- warnx("invalid argument `%s'", argv[optind]);
- usage();
- }
- rodent.zmap[j] = i;
- ++optind;
- }
- if ((rodent.zmap[2] != 0) && (rodent.zmap[3] == 0))
- rodent.zmap[3] = rodent.zmap[2] + 1;
- }
- break;
-
- case 'C':
- rodent.clickthreshold = atoi(optarg);
- if ((rodent.clickthreshold < 0) ||
- (rodent.clickthreshold > MAX_CLICKTHRESHOLD)) {
- warnx("invalid argument `%s'", optarg);
- usage();
- }
- break;
-
case 'D':
rodent.flags |= ClearDTR;
break;
@@ -741,22 +508,10 @@ main(int argc, char *argv[])
}
break;
- case 'H':
- rodent.flags |= HVirtualScroll;
- break;
-
case 'I':
pidfile = optarg;
break;
- case 'L':
- rodent.scrollspeed = atoi(optarg);
- if (rodent.scrollspeed < 0) {
- warnx("invalid argument `%s'", optarg);
- usage();
- }
- break;
-
case 'P':
rodent.flags |= NoPnP;
break;
@@ -774,24 +529,6 @@ main(int argc, char *argv[])
debug("rodent baudrate %d", rodent.baudrate);
break;
- case 'T':
- drift_terminate = TRUE;
- sscanf(optarg, "%d,%d,%d", &drift_distance, &drift_time,
- &drift_after);
- if (drift_distance <= 0 || drift_time <= 0 || drift_after <= 0) {
- warnx("invalid argument `%s'", optarg);
- usage();
- }
- debug("terminate drift: distance %d, time %d, after %d",
- drift_distance, drift_time, drift_after);
- drift_time_ts.tv_sec = drift_time / 1000;
- drift_time_ts.tv_nsec = (drift_time % 1000) * 1000000;
- drift_2time_ts.tv_sec = (drift_time *= 2) / 1000;
- drift_2time_ts.tv_nsec = (drift_time % 1000) * 1000000;
- drift_after_ts.tv_sec = drift_after / 1000;
- drift_after_ts.tv_nsec = (drift_after % 1000) * 1000000;
- break;
-
case 't':
if (strcmp(optarg, "auto") == 0) {
rodent.rtype = MOUSE_PROTO_UNKNOWN;
@@ -812,34 +549,12 @@ main(int argc, char *argv[])
}
break;
- case 'V':
- rodent.flags |= VirtualScroll;
- break;
- case 'U':
- rodent.scrollthreshold = atoi(optarg);
- if (rodent.scrollthreshold < 0) {
- warnx("invalid argument `%s'", optarg);
- usage();
- }
- break;
-
case 'h':
case '?':
default:
usage();
}
- /* fix Z axis mapping */
- for (i = 0; i < 4; ++i) {
- if (rodent.zmap[i] > 0) {
- for (j = 0; j < MOUSE_MAXBUTTON; ++j) {
- if (mstate[j] == &bstate[rodent.zmap[i] - 1])
- mstate[j] = &zstate[i];
- }
- rodent.zmap[i] = 1 << (rodent.zmap[i] - 1);
- }
- }
-
/* the default port name */
switch(rodent.rtype) {
@@ -908,14 +623,14 @@ main(int argc, char *argv[])
}
r_init(); /* call init function */
- moused();
+ msconvd();
}
if (rodent.mfd != -1)
close(rodent.mfd);
- if (rodent.cfd != -1)
- close(rodent.cfd);
- rodent.mfd = rodent.cfd = -1;
+ if (rodent.ufd != -1)
+ close(rodent.ufd);
+ rodent.mfd = rodent.ufd = -1;
if (rodent.is_removable)
exit(0);
}
@@ -924,90 +639,24 @@ main(int argc, char *argv[])
exit(0);
}
-/*
- * Function to calculate linear acceleration.
- *
- * If there are any rounding errors, the remainder
- * is stored in the remainx and remainy variables
- * and taken into account upon the next movement.
- */
-
-static void
-linacc(int dx, int dy, int *movex, int *movey)
-{
- float fdx, fdy;
-
- if (dx == 0 && dy == 0) {
- *movex = *movey = 0;
- return;
- }
- fdx = dx * rodent.accelx + rodent.remainx;
- fdy = dy * rodent.accely + rodent.remainy;
- *movex = lround(fdx);
- *movey = lround(fdy);
- rodent.remainx = fdx - *movex;
- rodent.remainy = fdy - *movey;
-}
-
-/*
- * Function to calculate exponential acceleration.
- * (Also includes linear acceleration if enabled.)
- *
- * In order to give a smoother behaviour, we record the four
- * most recent non-zero movements and use their average value
- * to calculate the acceleration.
- */
-
-static void
-expoacc(int dx, int dy, int *movex, int *movey)
-{
- static float lastlength[3] = {0.0, 0.0, 0.0};
- float fdx, fdy, length, lbase, accel;
-
- if (dx == 0 && dy == 0) {
- *movex = *movey = 0;
- return;
- }
- fdx = dx * rodent.accelx;
- fdy = dy * rodent.accely;
- length = sqrtf((fdx * fdx) + (fdy * fdy)); /* Pythagoras */
- length = (length + lastlength[0] + lastlength[1] + lastlength[2]) / 4;
- lbase = length / rodent.expoffset;
- accel = powf(lbase, rodent.expoaccel) / lbase;
- fdx = fdx * accel + rodent.remainx;
- fdy = fdy * accel + rodent.remainy;
- *movex = lroundf(fdx);
- *movey = lroundf(fdy);
- rodent.remainx = fdx - *movex;
- rodent.remainy = fdy - *movey;
- lastlength[2] = lastlength[1];
- lastlength[1] = lastlength[0];
- lastlength[0] = length; /* Insert new average, not original length! */
-}
-
static void
-moused(void)
+msconvd(void)
{
- struct mouse_info mouse;
- mousestatus_t action0; /* original mouse action */
- mousestatus_t action; /* interim buffer */
- mousestatus_t action2; /* mapped action */
- struct timeval timeout;
+ mousestatus_t action; /* mouse action */
fd_set fds;
u_char b;
pid_t mpid;
int flags;
int c;
- int i;
- if ((rodent.cfd = open("/dev/consolectl", O_RDWR, 0)) == -1)
- logerr(1, "cannot open /dev/consolectl");
+ if ((rodent.ufd = r_uinput_register()) == -1)
+ logerr(1, "cannot register uinput device");
if (!nodaemon && !background) {
pfh = pidfile_open(pidfile, 0600, &mpid);
if (pfh == NULL) {
if (errno == EEXIST)
- logerrx(1, "moused already running, pid: %d", mpid);
+ logerrx(1, "msconvd already running, pid: %d", mpid);
logwarn("cannot open pid file");
}
if (daemon(0, 0)) {
@@ -1016,35 +665,15 @@ moused(void)
errno = saved_errno;
logerr(1, "failed to become a daemon");
} else {
- background = TRUE;
+ background = true;
pidfile_write(pfh);
}
}
/* clear mouse data */
- bzero(&action0, sizeof(action0));
bzero(&action, sizeof(action));
- bzero(&action2, sizeof(action2));
- bzero(&mouse, sizeof(mouse));
- mouse_button_state = S0;
- clock_gettime(CLOCK_MONOTONIC_FAST, &mouse_button_state_ts);
- mouse_move_delayed = 0;
- for (i = 0; i < MOUSE_MAXBUTTON; ++i) {
- bstate[i].count = 0;
- bstate[i].ts = mouse_button_state_ts;
- }
- for (i = 0; i < (int)nitems(zstate); ++i) {
- zstate[i].count = 0;
- zstate[i].ts = mouse_button_state_ts;
- }
-
- /* choose which ioctl command to use */
- mouse.operation = MOUSE_MOTION_EVENT;
- extioctl = (ioctl(rodent.cfd, CONS_MOUSECTL, &mouse) == 0);
/* process mouse data */
- timeout.tv_sec = 0;
- timeout.tv_usec = 20000; /* 20 msec */
for (;;) {
FD_ZERO(&fds);
@@ -1054,265 +683,37 @@ moused(void)
if (rodent.mremcfd >= 0)
FD_SET(rodent.mremcfd, &fds);
- c = select(FD_SETSIZE, &fds, NULL, NULL,
- ((rodent.flags & Emulate3Button) &&
- S_DELAYED(mouse_button_state)) ? &timeout : NULL);
+ c = select(FD_SETSIZE, &fds, NULL, NULL, NULL);
if (c < 0) { /* error */
logwarn("failed to read from mouse");
continue;
- } else if (c == 0) { /* timeout */
- /* assert(rodent.flags & Emulate3Button) */
- action0.button = action0.obutton;
- action0.dx = action0.dy = action0.dz = 0;
- action0.flags = flags = 0;
- if (r_timeout() && r_statetrans(&action0, &action, A_TIMEOUT)) {
- if (debug > 2)
- debug("flags:%08x buttons:%08x obuttons:%08x",
- action.flags, action.button, action.obutton);
- } else {
- action0.obutton = action0.button;
- continue;
- }
- } else {
- /* MouseRemote client connect/disconnect */
- if ((rodent.mremsfd >= 0) && FD_ISSET(rodent.mremsfd, &fds)) {
- mremote_clientchg(TRUE);
- continue;
- }
- if ((rodent.mremcfd >= 0) && FD_ISSET(rodent.mremcfd, &fds)) {
- mremote_clientchg(FALSE);
- continue;
- }
- /* mouse movement */
- if (read(rodent.mfd, &b, 1) == -1) {
- if (errno == EWOULDBLOCK)
- continue;
- else
- return;
- }
- if ((flags = r_protocol(b, &action0)) == 0)
+ }
+ /* MouseRemote client connect/disconnect */
+ if ((rodent.mremsfd >= 0) && FD_ISSET(rodent.mremsfd, &fds)) {
+ mremote_clientchg(true);
+ continue;
+ }
+ if ((rodent.mremcfd >= 0) && FD_ISSET(rodent.mremcfd, &fds)) {
+ mremote_clientchg(false);
+ continue;
+ }
+ /* mouse movement */
+ if (read(rodent.mfd, &b, 1) == -1) {
+ if (errno == EWOULDBLOCK)
continue;
-
- if ((rodent.flags & VirtualScroll) || (rodent.flags & HVirtualScroll)) {
- /* Allow middle button drags to scroll up and down */
- if (action0.button == MOUSE_BUTTON2DOWN) {
- if (scroll_state == SCROLL_NOTSCROLLING) {
- scroll_state = SCROLL_PREPARE;
- scroll_movement = hscroll_movement = 0;
- debug("PREPARING TO SCROLL");
- }
- debug("[BUTTON2] flags:%08x buttons:%08x obuttons:%08x",
- action.flags, action.button, action.obutton);
- } else {
- debug("[NOTBUTTON2] flags:%08x buttons:%08x obuttons:%08x",
- action.flags, action.button, action.obutton);
-
- /* This isn't a middle button down... move along... */
- if (scroll_state == SCROLL_SCROLLING) {
- /*
- * We were scrolling, someone let go of button 2.
- * Now turn autoscroll off.
- */
- scroll_state = SCROLL_NOTSCROLLING;
- debug("DONE WITH SCROLLING / %d", scroll_state);
- } else if (scroll_state == SCROLL_PREPARE) {
- mousestatus_t newaction = action0;
-
- /* We were preparing to scroll, but we never moved... */
- r_timestamp(&action0);
- r_statetrans(&action0, &newaction,
- A(newaction.button & MOUSE_BUTTON1DOWN,
- action0.button & MOUSE_BUTTON3DOWN));
-
- /* Send middle down */
- newaction.button = MOUSE_BUTTON2DOWN;
- r_click(&newaction);
-
- /* Send middle up */
- r_timestamp(&newaction);
- newaction.obutton = newaction.button;
- newaction.button = action0.button;
- r_click(&newaction);
- }
- }
- }
-
- r_timestamp(&action0);
- r_statetrans(&action0, &action,
- A(action0.button & MOUSE_BUTTON1DOWN,
- action0.button & MOUSE_BUTTON3DOWN));
- debug("flags:%08x buttons:%08x obuttons:%08x", action.flags,
- action.button, action.obutton);
+ else
+ return;
}
- action0.obutton = action0.button;
- flags &= MOUSE_POSCHANGED;
- flags |= action.obutton ^ action.button;
- action.flags = flags;
-
- if (flags) { /* handler detected action */
- r_map(&action, &action2);
- debug("activity : buttons 0x%08x dx %d dy %d dz %d",
- action2.button, action2.dx, action2.dy, action2.dz);
+ if ((flags = r_protocol(b, &action)) == 0)
+ continue;
- if ((rodent.flags & VirtualScroll) || (rodent.flags & HVirtualScroll)) {
- /*
- * If *only* the middle button is pressed AND we are moving
- * the stick/trackpoint/nipple, scroll!
- */
- if (scroll_state == SCROLL_PREPARE) {
- /* Middle button down, waiting for movement threshold */
- if (action2.dy || action2.dx) {
- if (rodent.flags & VirtualScroll) {
- scroll_movement += action2.dy;
- if (scroll_movement < -rodent.scrollthreshold) {
- scroll_state = SCROLL_SCROLLING;
- } else if (scroll_movement > rodent.scrollthreshold) {
- scroll_state = SCROLL_SCROLLING;
- }
- }
- if (rodent.flags & HVirtualScroll) {
- hscroll_movement += action2.dx;
- if (hscroll_movement < -rodent.scrollthreshold) {
- scroll_state = SCROLL_SCROLLING;
- } else if (hscroll_movement > rodent.scrollthreshold) {
- scroll_state = SCROLL_SCROLLING;
- }
- }
- if (scroll_state == SCROLL_SCROLLING) scroll_movement = hscroll_movement = 0;
- }
- } else if (scroll_state == SCROLL_SCROLLING) {
- if (rodent.flags & VirtualScroll) {
- scroll_movement += action2.dy;
- debug("SCROLL: %d", scroll_movement);
- if (scroll_movement < -rodent.scrollspeed) {
- /* Scroll down */
- action2.dz = -1;
- scroll_movement = 0;
- }
- else if (scroll_movement > rodent.scrollspeed) {
- /* Scroll up */
- action2.dz = 1;
- scroll_movement = 0;
- }
- }
- if (rodent.flags & HVirtualScroll) {
- hscroll_movement += action2.dx;
- debug("HORIZONTAL SCROLL: %d", hscroll_movement);
-
- if (hscroll_movement < -rodent.scrollspeed) {
- action2.dz = -2;
- hscroll_movement = 0;
- }
- else if (hscroll_movement > rodent.scrollspeed) {
- action2.dz = 2;
- hscroll_movement = 0;
- }
- }
-
- /* Don't move while scrolling */
- action2.dx = action2.dy = 0;
- }
- }
+ debug("flags:%08x buttons:%08x obuttons:%08x", action.flags,
+ action.button, action.obutton);
- if (drift_terminate) {
- if ((flags & MOUSE_POSCHANGED) == 0 || action.dz || action2.dz)
- drift_last_activity = drift_current_ts;
- else {
- /* X or/and Y movement only - possibly drift */
- tssub(&drift_current_ts, &drift_last_activity, &drift_tmp);
- if (tscmp(&drift_tmp, &drift_after_ts, >)) {
- tssub(&drift_current_ts, &drift_since, &drift_tmp);
- if (tscmp(&drift_tmp, &drift_time_ts, <)) {
- drift_last.x += action2.dx;
- drift_last.y += action2.dy;
- } else {
- /* discard old accumulated steps (drift) */
- if (tscmp(&drift_tmp, &drift_2time_ts, >))
- drift_previous.x = drift_previous.y = 0;
- else
- drift_previous = drift_last;
- drift_last.x = action2.dx;
- drift_last.y = action2.dy;
- drift_since = drift_current_ts;
- }
- if (abs(drift_last.x) + abs(drift_last.y)
- > drift_distance) {
- /* real movement, pass all accumulated steps */
- action2.dx = drift_previous.x + drift_last.x;
- action2.dy = drift_previous.y + drift_last.y;
- /* and reset accumulators */
- tsclr(&drift_since);
- drift_last.x = drift_last.y = 0;
- /* drift_previous will be cleared at next movement*/
- drift_last_activity = drift_current_ts;
- } else {
- continue; /* don't pass current movement to
- * console driver */
- }
- }
- }
- }
-
- if (extioctl) {
- /* Defer clicks until we aren't VirtualScroll'ing. */
- if (scroll_state == SCROLL_NOTSCROLLING)
- r_click(&action2);
-
- if (action2.flags & MOUSE_POSCHANGED) {
- mouse.operation = MOUSE_MOTION_EVENT;
- mouse.u.data.buttons = action2.button;
- if (rodent.flags & ExponentialAcc) {
- expoacc(action2.dx, action2.dy,
- &mouse.u.data.x, &mouse.u.data.y);
- }
- else {
- linacc(action2.dx, action2.dy,
- &mouse.u.data.x, &mouse.u.data.y);
- }
- mouse.u.data.z = action2.dz;
- if (debug < 2)
- if (!paused)
- ioctl(rodent.cfd, CONS_MOUSECTL, &mouse);
- }
- } else {
- mouse.operation = MOUSE_ACTION;
- mouse.u.data.buttons = action2.button;
- if (rodent.flags & ExponentialAcc) {
- expoacc(action2.dx, action2.dy,
- &mouse.u.data.x, &mouse.u.data.y);
- }
- else {
- linacc(action2.dx, action2.dy,
- &mouse.u.data.x, &mouse.u.data.y);
- }
- mouse.u.data.z = action2.dz;
- if (debug < 2)
- if (!paused)
- ioctl(rodent.cfd, CONS_MOUSECTL, &mouse);
- }
-
- /*
- * If the Z axis movement is mapped to an imaginary physical
- * button, we need to cook up a corresponding button `up' event
- * after sending a button `down' event.
- */
- if ((rodent.zmap[0] > 0) && (action.dz != 0)) {
- action.obutton = action.button;
- action.dx = action.dy = action.dz = 0;
- r_map(&action, &action2);
- debug("activity : buttons 0x%08x dx %d dy %d dz %d",
- action2.button, action2.dx, action2.dy, action2.dz);
-
- if (extioctl) {
- r_click(&action2);
- } else {
- mouse.operation = MOUSE_ACTION;
- mouse.u.data.buttons = action2.button;
- mouse.u.data.x = mouse.u.data.y = mouse.u.data.z = 0;
- if (debug < 2)
- if (!paused)
- ioctl(rodent.cfd, CONS_MOUSECTL, &mouse);
- }
+ if (flags) {
+ if (r_uinput_report(rodent.ufd, &action) == -1) {
+ logwarn("failed to write to uinput");
+ return;
}
}
}
@@ -1347,12 +748,10 @@ pause_mouse(__unused int sig)
static void
usage(void)
{
- fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
- "usage: moused [-DRcdfs] [-I file] [-F rate] [-r resolution] [-S baudrate]",
- " [-VH [-U threshold]] [-a X[,Y]] [-C threshold] [-m N=M] [-w N]",
- " [-z N] [-t <mousetype>] [-l level] [-3 [-E timeout]]",
- " [-T distance[,time[,after]]] -p <port>",
- " moused [-d] -i <port|if|type|model|all> -p <port>");
+ fprintf(stderr, "%s\n%s\n%s\n",
+ "usage: msconvd [-DPRcdfs] [-I file] [-F rate] [-r resolution] [-S baudrate]",
+ " [-t <mousetype>] [-l level] -p <port>",
+ " msconvd [-Pd] -i <port|if|type|model|all> -p <port>");
exit(1);
}
@@ -1380,6 +779,98 @@ log_or_warn(int log_pri, int errnum, const char *fmt, ...)
warnx("%s", buf);
}
+/*
+ * Setup uinput device as 8button mouse with wheel
+ */
+static int
+r_uinput_register(void)
+{
+ struct uinput_setup uisetup;
+ char *phys;
+ int fd;
+ size_t i;
+
+ fd = open("/dev/uinput", O_RDWR | O_NONBLOCK);
+ if (fd < 0)
+ return (-1);
+
+ /* Set device name and bus/vendor information */
+ memset(&uisetup, 0, sizeof(uisetup));
+ snprintf(uisetup.name, UINPUT_MAX_NAME_SIZE,
+ "%s mouse on %s", r_model(rodent.hw.model), rodent.portname);
+ uisetup.id.bustype = r_bustype(rodent.hw.iftype);
+ uisetup.id.vendor = 0;
+ uisetup.id.product = 0;
+ uisetup.id.version = 0;
+ phys = basename(__DECONST(char *, rodent.portname));
+ if (ioctl(fd, UI_SET_PHYS, phys) < 0 ||
+ ioctl(fd, UI_DEV_SETUP, &uisetup) < 0)
+ goto bail_out;
+
+ /* Advertise events and axes */
+ if (ioctl(fd, UI_SET_EVBIT, EV_SYN) < 0 ||
+ ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0 ||
+ ioctl(fd, UI_SET_EVBIT, EV_REL) < 0 ||
+ ioctl(fd, UI_SET_RELBIT, REL_X) < 0 ||
+ ioctl(fd, UI_SET_RELBIT, REL_Y) < 0 ||
+ ioctl(fd, UI_SET_RELBIT, REL_WHEEL) < 0 ||
+ ioctl(fd, UI_SET_PROPBIT, INPUT_PROP_POINTER) < 0)
+ goto bail_out;
+
+ /* Advertise mouse buttons */
+ for (i = 0; i < nitems(evdev_buttons); i++)
+ if (ioctl(fd, UI_SET_KEYBIT, evdev_buttons[i]) < 0)
+ goto bail_out;
+
+ if (ioctl(fd, UI_DEV_CREATE) >= 0)
+ return (fd); /* SUCCESS */
+
+bail_out:
+ close (fd);
+ return (-1);
+}
+
+static int
+uinput_event(int fd, uint16_t type, uint16_t code, int32_t value)
+{
+ struct input_event ie;
+
+ if (debug >= 2 || paused)
+ return (0);
+
+ memset(&ie, 0, sizeof(ie));
+ ie.type = type;
+ ie.code = code;
+ ie.value = value;
+ return (write(fd, &ie, sizeof(ie)));
+}
+
+static int
+r_uinput_report(int fd, mousestatus_t *act)
+{
+ size_t i;
+ int32_t mask;
+
+ if ((act->dx != 0 && uinput_event(fd, EV_REL, REL_X, act->dx) < 0) ||
+ (act->dy != 0 && uinput_event(fd, EV_REL, REL_Y, act->dy) < 0) ||
+ (act->dz != 0 && uinput_event(fd, EV_REL, REL_WHEEL, -act->dz) < 0))
+ return (-1);
+
+ for (i = 0; i < nitems(evdev_buttons); i++) {
+ mask = 1 << i;
+ if ((act->button & mask) == (act->obutton & mask))
+ continue;
+ if (uinput_event(fd, EV_KEY, evdev_buttons[i],
+ (act->button & mask) != 0) < 0)
+ return (-1);
+ }
+
+ if (uinput_event(fd, EV_SYN, SYN_REPORT, 0) < 0)
+ return (-1);
+
+ return (0);
+}
+
/**
** Mouse interface code, courtesy of XFree86 3.1.2.
**
@@ -1559,6 +1050,12 @@ r_if(int iftype)
return (gettokenname(rifs, iftype));
}
+static uint16_t
+r_bustype(int iftype)
+{
+ return (gettokenval2(rifs, iftype));
+}
+
static const char *
r_name(int type)
{
@@ -1875,7 +1372,7 @@ r_protocol(u_char rBuf, mousestatus_t *act)
static int pBufP = 0;
static unsigned char pBuf[8];
static int prev_x, prev_y;
- static int on = FALSE;
+ static bool on = false;
int x, y;
debug("received char 0x%x",(int)rBuf);
@@ -2109,7 +1606,7 @@ r_protocol(u_char rBuf, mousestatus_t *act)
act->button |= (pBuf[0] & MOUSE_VERSA_TAP) ? MOUSE_BUTTON4DOWN : 0;
act->dx = act->dy = 0;
if (!(pBuf[0] & MOUSE_VERSA_IN_USE)) {
- on = FALSE;
+ on = false;
break;
}
x = (pBuf[2] << 6) | pBuf[1];
@@ -2122,7 +1619,7 @@ r_protocol(u_char rBuf, mousestatus_t *act)
act->dx = prev_x - x;
act->dy = prev_y - y;
} else {
- on = TRUE;
+ on = true;
}
prev_x = x;
prev_y = y;
@@ -2245,7 +1742,7 @@ r_protocol(u_char rBuf, mousestatus_t *act)
(pBuf[0] & MOUSE_PS2VERSA_TAP) ? MOUSE_BUTTON4DOWN : 0;
act->dx = act->dy = 0;
if (!(pBuf[0] & MOUSE_PS2VERSA_IN_USE)) {
- on = FALSE;
+ on = false;
break;
}
x = ((pBuf[4] << 8) & 0xf00) | pBuf[1];
@@ -2258,7 +1755,7 @@ r_protocol(u_char rBuf, mousestatus_t *act)
act->dx = prev_x - x;
act->dy = prev_y - y;
} else {
- on = TRUE;
+ on = true;
}
prev_x = x;
prev_y = y;
@@ -2324,301 +1821,6 @@ r_protocol(u_char rBuf, mousestatus_t *act)
return (act->flags);
}
-static int
-r_statetrans(mousestatus_t *a1, mousestatus_t *a2, int trans)
-{
- int changed;
- int flags;
-
- a2->dx = a1->dx;
- a2->dy = a1->dy;
- a2->dz = a1->dz;
- a2->obutton = a2->button;
- a2->button = a1->button;
- a2->flags = a1->flags;
- changed = FALSE;
-
- if (rodent.flags & Emulate3Button) {
- if (debug > 2)
- debug("state:%d, trans:%d -> state:%d",
- mouse_button_state, trans,
- states[mouse_button_state].s[trans]);
- /*
- * Avoid re-ordering button and movement events. While a button
- * event is deferred, throw away up to BUTTON2_MAXMOVE movement
- * events to allow for mouse jitter. If more movement events
- * occur, then complete the deferred button events immediately.
- */
- if ((a2->dx != 0 || a2->dy != 0) &&
- S_DELAYED(states[mouse_button_state].s[trans])) {
- if (++mouse_move_delayed > BUTTON2_MAXMOVE) {
- mouse_move_delayed = 0;
- mouse_button_state =
- states[mouse_button_state].s[A_TIMEOUT];
- changed = TRUE;
- } else
- a2->dx = a2->dy = 0;
- } else
- mouse_move_delayed = 0;
- if (mouse_button_state != states[mouse_button_state].s[trans])
- changed = TRUE;
- if (changed)
- clock_gettime(CLOCK_MONOTONIC_FAST, &mouse_button_state_ts);
- mouse_button_state = states[mouse_button_state].s[trans];
- a2->button &=
- ~(MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN);
- a2->button &= states[mouse_button_state].mask;
- a2->button |= states[mouse_button_state].buttons;
- flags = a2->flags & MOUSE_POSCHANGED;
- flags |= a2->obutton ^ a2->button;
- if (flags & MOUSE_BUTTON2DOWN) {
- a2->flags = flags & MOUSE_BUTTON2DOWN;
- r_timestamp(a2);
- }
- a2->flags = flags;
- }
- return (changed);
-}
-
-/* phisical to logical button mapping */
-static int p2l[MOUSE_MAXBUTTON] = {
- MOUSE_BUTTON1DOWN, MOUSE_BUTTON2DOWN, MOUSE_BUTTON3DOWN, MOUSE_BUTTON4DOWN,
- MOUSE_BUTTON5DOWN, MOUSE_BUTTON6DOWN, MOUSE_BUTTON7DOWN, MOUSE_BUTTON8DOWN,
- 0x00000100, 0x00000200, 0x00000400, 0x00000800,
- 0x00001000, 0x00002000, 0x00004000, 0x00008000,
- 0x00010000, 0x00020000, 0x00040000, 0x00080000,
- 0x00100000, 0x00200000, 0x00400000, 0x00800000,
- 0x01000000, 0x02000000, 0x04000000, 0x08000000,
- 0x10000000, 0x20000000, 0x40000000,
-};
-
-static char *
-skipspace(char *s)
-{
- while(isspace(*s))
- ++s;
- return (s);
-}
-
-static int
-r_installmap(char *arg)
-{
- int pbutton;
- int lbutton;
- char *s;
-
- while (*arg) {
- arg = skipspace(arg);
- s = arg;
- while (isdigit(*arg))
- ++arg;
- arg = skipspace(arg);
- if ((arg <= s) || (*arg != '='))
- return (FALSE);
- lbutton = atoi(s);
-
- arg = skipspace(++arg);
- s = arg;
- while (isdigit(*arg))
- ++arg;
- if ((arg <= s) || (!isspace(*arg) && (*arg != '\0')))
- return (FALSE);
- pbutton = atoi(s);
-
- if ((lbutton <= 0) || (lbutton > MOUSE_MAXBUTTON))
- return (FALSE);
- if ((pbutton <= 0) || (pbutton > MOUSE_MAXBUTTON))
- return (FALSE);
- p2l[pbutton - 1] = 1 << (lbutton - 1);
- mstate[lbutton - 1] = &bstate[pbutton - 1];
- }
-
- return (TRUE);
-}
-
-static void
-r_map(mousestatus_t *act1, mousestatus_t *act2)
-{
- register int pb;
- register int pbuttons;
- int lbuttons;
-
- pbuttons = act1->button;
- lbuttons = 0;
-
- act2->obutton = act2->button;
- if (pbuttons & rodent.wmode) {
- pbuttons &= ~rodent.wmode;
- act1->dz = act1->dy;
- act1->dx = 0;
- act1->dy = 0;
- }
- act2->dx = act1->dx;
- act2->dy = act1->dy;
- act2->dz = act1->dz;
-
- switch (rodent.zmap[0]) {
- case 0: /* do nothing */
- break;
- case MOUSE_XAXIS:
- if (act1->dz != 0) {
- act2->dx = act1->dz;
- act2->dz = 0;
- }
- break;
- case MOUSE_YAXIS:
- if (act1->dz != 0) {
- act2->dy = act1->dz;
- act2->dz = 0;
- }
- break;
- default: /* buttons */
- pbuttons &= ~(rodent.zmap[0] | rodent.zmap[1]
- | rodent.zmap[2] | rodent.zmap[3]);
- if ((act1->dz < -1) && rodent.zmap[2]) {
- pbuttons |= rodent.zmap[2];
- zstate[2].count = 1;
- } else if (act1->dz < 0) {
- pbuttons |= rodent.zmap[0];
- zstate[0].count = 1;
- } else if ((act1->dz > 1) && rodent.zmap[3]) {
- pbuttons |= rodent.zmap[3];
- zstate[3].count = 1;
- } else if (act1->dz > 0) {
- pbuttons |= rodent.zmap[1];
- zstate[1].count = 1;
- }
- act2->dz = 0;
- break;
- }
-
- for (pb = 0; (pb < MOUSE_MAXBUTTON) && (pbuttons != 0); ++pb) {
- lbuttons |= (pbuttons & 1) ? p2l[pb] : 0;
- pbuttons >>= 1;
- }
- act2->button = lbuttons;
-
- act2->flags = ((act2->dx || act2->dy || act2->dz) ? MOUSE_POSCHANGED : 0)
- | (act2->obutton ^ act2->button);
-}
-
-static void
-r_timestamp(mousestatus_t *act)
-{
- struct timespec ts;
- struct timespec ts1;
- struct timespec ts2;
- struct timespec ts3;
- int button;
- int mask;
- int i;
-
- mask = act->flags & MOUSE_BUTTONS;
-#if 0
- if (mask == 0)
- return;
-#endif
-
- clock_gettime(CLOCK_MONOTONIC_FAST, &ts1);
- drift_current_ts = ts1;
-
- /* double click threshold */
- ts2.tv_sec = rodent.clickthreshold / 1000;
- ts2.tv_nsec = (rodent.clickthreshold % 1000) * 1000000;
- tssub(&ts1, &ts2, &ts);
- debug("ts: %jd %ld", (intmax_t)ts.tv_sec, ts.tv_nsec);
-
- /* 3 button emulation timeout */
- ts2.tv_sec = rodent.button2timeout / 1000;
- ts2.tv_nsec = (rodent.button2timeout % 1000) * 1000000;
- tssub(&ts1, &ts2, &ts3);
-
- button = MOUSE_BUTTON1DOWN;
- for (i = 0; (i < MOUSE_MAXBUTTON) && (mask != 0); ++i) {
- if (mask & 1) {
- if (act->button & button) {
- /* the button is down */
- debug(" : %jd %ld",
- (intmax_t)bstate[i].ts.tv_sec, bstate[i].ts.tv_nsec);
- if (tscmp(&ts, &bstate[i].ts, >)) {
- bstate[i].count = 1;
- } else {
- ++bstate[i].count;
- }
- bstate[i].ts = ts1;
- } else {
- /* the button is up */
- bstate[i].ts = ts1;
- }
- } else {
- if (act->button & button) {
- /* the button has been down */
- if (tscmp(&ts3, &bstate[i].ts, >)) {
- bstate[i].count = 1;
- bstate[i].ts = ts1;
- act->flags |= button;
- debug("button %d timeout", i + 1);
- }
- } else {
- /* the button has been up */
- }
- }
- button <<= 1;
- mask >>= 1;
- }
-}
-
-static int
-r_timeout(void)
-{
- struct timespec ts;
- struct timespec ts1;
- struct timespec ts2;
-
- if (states[mouse_button_state].timeout)
- return (TRUE);
- clock_gettime(CLOCK_MONOTONIC_FAST, &ts1);
- ts2.tv_sec = rodent.button2timeout / 1000;
- ts2.tv_nsec = (rodent.button2timeout % 1000) * 1000000;
- tssub(&ts1, &ts2, &ts);
- return (tscmp(&ts, &mouse_button_state_ts, >));
-}
-
-static void
-r_click(mousestatus_t *act)
-{
- struct mouse_info mouse;
- int button;
- int mask;
- int i;
-
- mask = act->flags & MOUSE_BUTTONS;
- if (mask == 0)
- return;
-
- button = MOUSE_BUTTON1DOWN;
- for (i = 0; (i < MOUSE_MAXBUTTON) && (mask != 0); ++i) {
- if (mask & 1) {
- debug("mstate[%d]->count:%d", i, mstate[i]->count);
- if (act->button & button) {
- /* the button is down */
- mouse.u.event.value = mstate[i]->count;
- } else {
- /* the button is up */
- mouse.u.event.value = 0;
- }
- mouse.operation = MOUSE_BUTTON_EVENT;
- mouse.u.event.id = button;
- if (debug < 2)
- if (!paused)
- ioctl(rodent.cfd, CONS_MOUSECTL, &mouse);
- debug("button %d count %d", i + 1, mouse.u.event.value);
- }
- button <<= 1;
- mask >>= 1;
- }
-}
-
/* $XConsortium: posix_tty.c,v 1.3 95/01/05 20:42:55 kaleb Exp $ */
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/posix_tty.c,v 3.4 1995/01/28 17:05:03 dawes Exp $ */
/*
@@ -2745,7 +1947,7 @@ setmousespeed(int old, int new, unsigned cflag)
* The routine does not fully implement the COM Enumerator as par Section
* 2.1 of the document. In particular, we don't have idle state in which
* the driver software monitors the com port for dynamic connection or
- * removal of a device at the port, because `moused' simply quits if no
+ * removal of a device at the port, because `msconvd' simply quits if no
* device is found.
*
* In addition, as PnP COM device enumeration procedure slightly has
@@ -2753,7 +1955,7 @@ setmousespeed(int old, int new, unsigned cflag)
* revisions of the above spec. may fail to respond if the rev 1.0
* procedure is used. XXX
*/
-static int
+static bool
pnpwakeup1(void)
{
struct timeval timeout;
@@ -2783,7 +1985,7 @@ pnpwakeup1(void)
ioctl(rodent.mfd, TIOCMGET, &i);
debug("modem status 0%o", i);
if ((i & TIOCM_DSR) == 0)
- return (FALSE);
+ return (false);
/* port setup, 1st phase (2.1.3) */
setmousespeed(1200, 1200, (CS7 | CREAD | CLOCAL | HUPCL));
@@ -2807,7 +2009,7 @@ pnpwakeup1(void)
timeout.tv_usec = 240000;
if (select(FD_SETSIZE, &fds, NULL, NULL, &timeout) > 0) {
debug("pnpwakeup1(): valid response in first phase.");
- return (TRUE);
+ return (true);
}
/* port setup, 2nd phase (2.1.5) */
@@ -2828,13 +2030,13 @@ pnpwakeup1(void)
timeout.tv_usec = 240000;
if (select(FD_SETSIZE, &fds, NULL, NULL, &timeout) > 0) {
debug("pnpwakeup1(): valid response in second phase.");
- return (TRUE);
+ return (true);
}
- return (FALSE);
+ return (false);
}
-static int
+static bool
pnpwakeup2(void)
{
struct timeval timeout;
@@ -2867,10 +2069,10 @@ pnpwakeup2(void)
timeout.tv_usec = 240000;
if (select(FD_SETSIZE, &fds, NULL, NULL, &timeout) > 0) {
debug("pnpwakeup2(): valid response.");
- return (TRUE);
+ return (true);
}
- return (FALSE);
+ return (false);
}
static int
@@ -2885,7 +2087,7 @@ pnpgets(char *buf)
if (!pnpwakeup1() && !pnpwakeup2()) {
/*
* According to PnP spec, we should set DTR = 1 and RTS = 0 while
- * in idle state. But, `moused' shall set DTR = RTS = 1 and proceed,
+ * in idle state. But, `msconvd' shall set DTR = RTS = 1 and proceed,
* assuming there is something at the port even if it didn't
* respond to the PnP enumeration procedure.
*/
@@ -2942,7 +2144,7 @@ pnpgets(char *buf)
/*
* According to PnP spec, we should set DTR = 1 and RTS = 0 while
- * in idle state. But, `moused' shall leave the modem control lines
+ * in idle state. But, `msconvd' shall leave the modem control lines
* as they are. See above.
*/
connect_idle:
@@ -2951,7 +2153,7 @@ connect_idle:
return (MAX(i, 0));
}
-static int
+static bool
pnpparse(pnpid_t *id, char *buf, int len)
{
char s[3];
@@ -2975,7 +2177,7 @@ pnpparse(pnpid_t *id, char *buf, int len)
/* non-PnP mice */
switch(buf[0]) {
default:
- return (FALSE);
+ return (false);
case 'M': /* Microsoft */
id->eisaid = "PNP0F01";
break;
@@ -2987,7 +2189,7 @@ pnpparse(pnpid_t *id, char *buf, int len)
id->class = "MOUSE";
id->nclass = strlen(id->class);
debug("non-PnP mouse '%c'", buf[0]);
- return (TRUE);
+ return (true);
}
/* PnP mice */
@@ -3086,12 +2288,12 @@ pnpparse(pnpid_t *id, char *buf, int len)
* spec regarding checksum... XXX
*/
logwarnx("PnP checksum error", 0);
- return (FALSE);
+ return (false);
#endif
}
}
- return (TRUE);
+ return (true);
}
static symtab_t *
@@ -3159,6 +2361,18 @@ gettokenname(symtab_t *tab, int val)
return (unknown);
}
+static int
+gettokenval2(symtab_t *tab, int val)
+{
+ int i;
+
+ for (i = 0; tab[i].name != NULL; ++i) {
+ if (tab[i].val == val)
+ return (tab[i].val2);
+ }
+ return (0);
+}
+
/*
* code to read from the Genius Kidspad tablet.
@@ -3355,7 +2569,7 @@ mremote_serversetup(void)
}
static void
-mremote_clientchg(int add)
+mremote_clientchg(bool add)
{
struct sockaddr_un ad;
socklen_t ad_len;
diff --git a/usr.sbin/newsyslog/newsyslog.conf.5 b/usr.sbin/newsyslog/newsyslog.conf.5
index d94c39332597..0a47af7285c6 100644
--- a/usr.sbin/newsyslog/newsyslog.conf.5
+++ b/usr.sbin/newsyslog/newsyslog.conf.5
@@ -69,7 +69,7 @@ and
.Dq Ar <include>
lines are defined as follows:
.Bl -tag -width indent
-.It Ar <compress> Ns Ar none Ns | Ns Ar legacy Ns | Ns Ar bzip2 Ns | Ns Ar gzip Ns | Ns Ar xz Ns | Ns Ar zstd
+.It Ar <compress> Ar none Ns | Ns Ar legacy Ns | Ns Ar bzip2 Ns | Ns Ar gzip Ns | Ns Ar xz Ns | Ns Ar zstd
This special option sets the global compress method,
it should be placed before all log file entries in
.Nm
diff --git a/usr.sbin/ngctl/main.c b/usr.sbin/ngctl/main.c
index b32e4f878b6e..b86f1ca27e71 100644
--- a/usr.sbin/ngctl/main.c
+++ b/usr.sbin/ngctl/main.c
@@ -144,7 +144,9 @@ main(int ac, char *av[])
char name[NG_NODESIZ];
int interactive = isatty(0) && isatty(1);
FILE *fp = NULL;
+#ifdef JAIL
const char *jail_name = NULL;
+#endif
int ch, rtn = 0;
/* Set default node name */
@@ -181,6 +183,7 @@ main(int ac, char *av[])
ac -= optind;
av += optind;
+#ifdef JAIL
if (jail_name != NULL) {
int jid;
@@ -196,6 +199,7 @@ main(int ac, char *av[])
errx((errno == EPERM) ? EX_NOPERM : EX_OSERR,
"cannot attach to jail");
}
+#endif
/* Create a new socket node */
if (NgMkSockNode(name, &csock, &dsock) < 0)
diff --git a/usr.sbin/ntp/ntpd/leap-seconds b/usr.sbin/ntp/ntpd/leap-seconds
index da0efc8c8566..649a22c6278f 100644
--- a/usr.sbin/ntp/ntpd/leap-seconds
+++ b/usr.sbin/ntp/ntpd/leap-seconds
@@ -60,15 +60,15 @@
#
# The following line shows the last update of this file in NTP timestamp:
#
-#$ 3929093563
+#$ 3960835200
#
# 2) Expiration date of the file given on a semi-annual basis: last June or last December
#
-# File expires on 28 June 2025
+# File expires on 28 June 2026
#
# Expire date in NTP timestamp:
#
-#@ 3960057600
+#@ 3991593600
#
#
# LIST OF LEAP SECONDS
@@ -117,4 +117,4 @@
# please see the readme file in the 'source' directory :
# https://hpiers.obspm.fr/iers/bul/bulc/ntp/sources/README
#
-#h be738595 57b0cf1b b0218343 fb77062f 5a775e7
+#h 49db2447 571e5e1b 2f002a53 9c8da8e4 39b8e49e