From 1a60b97524d8408e5f059b09ae316987c698e671 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 6 Jul 2025 12:19:26 +0900 Subject: [PATCH 1/9] include: move libc header wrappers to src/include/override/, and kernel headers to src/include/uapi/ Preparation for later changes. --- man/meson.build | 2 +- meson.build | 17 +++++++++++++---- src/basic/meson.build | 10 +++++----- src/{basic/include => include/override}/fcntl.h | 0 .../include => include/override}/malloc.h | 0 .../include => include/override}/net/if.h | 0 .../include => include/override}/net/if_arp.h | 0 .../include => include/override}/netinet/in.h | 0 src/{basic/include => include/override}/sched.h | 0 .../include => include/override}/sys/mman.h | 0 .../include => include/override}/sys/mount.h | 0 .../include => include/override}/sys/param.h | 0 .../include => include/override}/sys/pidfd.h | 0 .../include => include/override}/sys/random.h | 0 .../include => include/override}/sys/socket.h | 0 .../include => include/override}/sys/wait.h | 0 .../include => include/override}/sys/xattr.h | 0 .../uapi}/linux/.clang-format | 0 .../uapi}/linux/auto_dev-ioctl.h | 0 .../include => include/uapi}/linux/auto_fs.h | 0 .../include => include/uapi}/linux/batman_adv.h | 0 src/{basic/include => include/uapi}/linux/bpf.h | 0 .../include => include/uapi}/linux/bpf_common.h | 0 .../include => include/uapi}/linux/bpf_insn.h | 0 .../include => include/uapi}/linux/btrfs.h | 0 .../include => include/uapi}/linux/btrfs_tree.h | 0 .../uapi}/linux/can/netlink.h | 0 .../include => include/uapi}/linux/can/vxcan.h | 0 .../include => include/uapi}/linux/capability.h | 0 .../include => include/uapi}/linux/cfm_bridge.h | 0 .../include => include/uapi}/linux/const.h | 0 .../include => include/uapi}/linux/dm-ioctl.h | 0 .../include => include/uapi}/linux/ethtool.h | 0 .../include => include/uapi}/linux/fib_rules.h | 0 .../include => include/uapi}/linux/filter.h | 0 src/{basic/include => include/uapi}/linux/fou.h | 0 src/{basic/include => include/uapi}/linux/fs.h | 0 .../include => include/uapi}/linux/fscrypt.h | 0 .../include => include/uapi}/linux/fsverity.h | 0 .../include => include/uapi}/linux/genetlink.h | 0 .../include => include/uapi}/linux/hdlc/ioctl.h | 0 src/{basic/include => include/uapi}/linux/hid.h | 0 .../include => include/uapi}/linux/hidraw.h | 0 src/{basic/include => include/uapi}/linux/if.h | 0 .../include => include/uapi}/linux/if_addr.h | 0 .../uapi}/linux/if_addrlabel.h | 0 .../include => include/uapi}/linux/if_arp.h | 0 .../include => include/uapi}/linux/if_bonding.h | 0 .../include => include/uapi}/linux/if_bridge.h | 0 .../include => include/uapi}/linux/if_ether.h | 0 .../uapi}/linux/if_infiniband.h | 0 .../include => include/uapi}/linux/if_link.h | 0 .../include => include/uapi}/linux/if_macsec.h | 0 .../include => include/uapi}/linux/if_packet.h | 0 .../include => include/uapi}/linux/if_tun.h | 0 .../include => include/uapi}/linux/if_tunnel.h | 0 .../include => include/uapi}/linux/if_vlan.h | 0 src/{basic/include => include/uapi}/linux/in.h | 0 src/{basic/include => include/uapi}/linux/in6.h | 0 .../uapi}/linux/input-event-codes.h | 0 .../include => include/uapi}/linux/input.h | 0 .../include => include/uapi}/linux/ioprio.h | 0 src/{basic/include => include/uapi}/linux/ip.h | 0 .../include => include/uapi}/linux/ip6_tunnel.h | 0 .../include => include/uapi}/linux/ipv6.h | 0 .../include => include/uapi}/linux/ipv6_route.h | 0 .../include => include/uapi}/linux/keyctl.h | 0 .../include => include/uapi}/linux/l2tp.h | 0 .../uapi}/linux/libc-compat.h | 0 .../include => include/uapi}/linux/limits.h | 0 .../include => include/uapi}/linux/loop.h | 0 .../include => include/uapi}/linux/magic.h | 0 .../include => include/uapi}/linux/mempolicy.h | 0 .../include => include/uapi}/linux/mount.h | 0 .../include => include/uapi}/linux/mrp_bridge.h | 0 .../include => include/uapi}/linux/neighbour.h | 0 .../uapi}/linux/net_namespace.h | 0 .../include => include/uapi}/linux/netdevice.h | 0 .../include => include/uapi}/linux/netfilter.h | 0 .../uapi}/linux/netfilter/nf_conntrack_common.h | 0 .../linux/netfilter/nf_conntrack_tuple_common.h | 0 .../uapi}/linux/netfilter/nf_nat.h | 0 .../uapi}/linux/netfilter/nf_tables.h | 0 .../uapi}/linux/netfilter/nfnetlink.h | 0 .../uapi}/linux/netfilter/nfnetlink_compat.h | 0 .../uapi}/linux/netfilter/x_tables.h | 0 .../uapi}/linux/netfilter/xt_addrtype.h | 0 .../uapi}/linux/netfilter/xt_tcpudp.h | 0 .../uapi}/linux/netfilter_ipv4.h | 0 .../uapi}/linux/netfilter_ipv4/ip_tables.h | 0 .../include => include/uapi}/linux/netlink.h | 0 .../include => include/uapi}/linux/nexthop.h | 0 .../include => include/uapi}/linux/nl80211.h | 0 .../include => include/uapi}/linux/pkt_sched.h | 0 .../include => include/uapi}/linux/prctl.h | 0 .../include => include/uapi}/linux/rtnetlink.h | 0 .../uapi}/linux/sched/types.h | 0 .../include => include/uapi}/linux/socket.h | 0 .../include => include/uapi}/linux/sockios.h | 0 .../include => include/uapi}/linux/stat.h | 0 .../include => include/uapi}/linux/stddef.h | 0 .../include => include/uapi}/linux/update.sh | 0 .../include => include/uapi}/linux/veth.h | 0 .../include => include/uapi}/linux/vm_sockets.h | 0 .../include => include/uapi}/linux/wireguard.h | 0 .../include => include/uapi}/linux/xattr.h | 0 src/shared/meson.build | 4 ++-- src/udev/meson.build | 2 +- 108 files changed, 22 insertions(+), 13 deletions(-) rename src/{basic/include => include/override}/fcntl.h (100%) rename src/{basic/include => include/override}/malloc.h (100%) rename src/{basic/include => include/override}/net/if.h (100%) rename src/{basic/include => include/override}/net/if_arp.h (100%) rename src/{basic/include => include/override}/netinet/in.h (100%) rename src/{basic/include => include/override}/sched.h (100%) rename src/{basic/include => include/override}/sys/mman.h (100%) rename src/{basic/include => include/override}/sys/mount.h (100%) rename src/{basic/include => include/override}/sys/param.h (100%) rename src/{basic/include => include/override}/sys/pidfd.h (100%) rename src/{basic/include => include/override}/sys/random.h (100%) rename src/{basic/include => include/override}/sys/socket.h (100%) rename src/{basic/include => include/override}/sys/wait.h (100%) rename src/{basic/include => include/override}/sys/xattr.h (100%) rename src/{basic/include => include/uapi}/linux/.clang-format (100%) rename src/{basic/include => include/uapi}/linux/auto_dev-ioctl.h (100%) rename src/{basic/include => include/uapi}/linux/auto_fs.h (100%) rename src/{basic/include => include/uapi}/linux/batman_adv.h (100%) rename src/{basic/include => include/uapi}/linux/bpf.h (100%) rename src/{basic/include => include/uapi}/linux/bpf_common.h (100%) rename src/{basic/include => include/uapi}/linux/bpf_insn.h (100%) rename src/{basic/include => include/uapi}/linux/btrfs.h (100%) rename src/{basic/include => include/uapi}/linux/btrfs_tree.h (100%) rename src/{basic/include => include/uapi}/linux/can/netlink.h (100%) rename src/{basic/include => include/uapi}/linux/can/vxcan.h (100%) rename src/{basic/include => include/uapi}/linux/capability.h (100%) rename src/{basic/include => include/uapi}/linux/cfm_bridge.h (100%) rename src/{basic/include => include/uapi}/linux/const.h (100%) rename src/{basic/include => include/uapi}/linux/dm-ioctl.h (100%) rename src/{basic/include => include/uapi}/linux/ethtool.h (100%) rename src/{basic/include => include/uapi}/linux/fib_rules.h (100%) rename src/{basic/include => include/uapi}/linux/filter.h (100%) rename src/{basic/include => include/uapi}/linux/fou.h (100%) rename src/{basic/include => include/uapi}/linux/fs.h (100%) rename src/{basic/include => include/uapi}/linux/fscrypt.h (100%) rename src/{basic/include => include/uapi}/linux/fsverity.h (100%) rename src/{basic/include => include/uapi}/linux/genetlink.h (100%) rename src/{basic/include => include/uapi}/linux/hdlc/ioctl.h (100%) rename src/{basic/include => include/uapi}/linux/hid.h (100%) rename src/{basic/include => include/uapi}/linux/hidraw.h (100%) rename src/{basic/include => include/uapi}/linux/if.h (100%) rename src/{basic/include => include/uapi}/linux/if_addr.h (100%) rename src/{basic/include => include/uapi}/linux/if_addrlabel.h (100%) rename src/{basic/include => include/uapi}/linux/if_arp.h (100%) rename src/{basic/include => include/uapi}/linux/if_bonding.h (100%) rename src/{basic/include => include/uapi}/linux/if_bridge.h (100%) rename src/{basic/include => include/uapi}/linux/if_ether.h (100%) rename src/{basic/include => include/uapi}/linux/if_infiniband.h (100%) rename src/{basic/include => include/uapi}/linux/if_link.h (100%) rename src/{basic/include => include/uapi}/linux/if_macsec.h (100%) rename src/{basic/include => include/uapi}/linux/if_packet.h (100%) rename src/{basic/include => include/uapi}/linux/if_tun.h (100%) rename src/{basic/include => include/uapi}/linux/if_tunnel.h (100%) rename src/{basic/include => include/uapi}/linux/if_vlan.h (100%) rename src/{basic/include => include/uapi}/linux/in.h (100%) rename src/{basic/include => include/uapi}/linux/in6.h (100%) rename src/{basic/include => include/uapi}/linux/input-event-codes.h (100%) rename src/{basic/include => include/uapi}/linux/input.h (100%) rename src/{basic/include => include/uapi}/linux/ioprio.h (100%) rename src/{basic/include => include/uapi}/linux/ip.h (100%) rename src/{basic/include => include/uapi}/linux/ip6_tunnel.h (100%) rename src/{basic/include => include/uapi}/linux/ipv6.h (100%) rename src/{basic/include => include/uapi}/linux/ipv6_route.h (100%) rename src/{basic/include => include/uapi}/linux/keyctl.h (100%) rename src/{basic/include => include/uapi}/linux/l2tp.h (100%) rename src/{basic/include => include/uapi}/linux/libc-compat.h (100%) rename src/{basic/include => include/uapi}/linux/limits.h (100%) rename src/{basic/include => include/uapi}/linux/loop.h (100%) rename src/{basic/include => include/uapi}/linux/magic.h (100%) rename src/{basic/include => include/uapi}/linux/mempolicy.h (100%) rename src/{basic/include => include/uapi}/linux/mount.h (100%) rename src/{basic/include => include/uapi}/linux/mrp_bridge.h (100%) rename src/{basic/include => include/uapi}/linux/neighbour.h (100%) rename src/{basic/include => include/uapi}/linux/net_namespace.h (100%) rename src/{basic/include => include/uapi}/linux/netdevice.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/nf_conntrack_common.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/nf_conntrack_tuple_common.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/nf_nat.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/nf_tables.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/nfnetlink.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/nfnetlink_compat.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/x_tables.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/xt_addrtype.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter/xt_tcpudp.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter_ipv4.h (100%) rename src/{basic/include => include/uapi}/linux/netfilter_ipv4/ip_tables.h (100%) rename src/{basic/include => include/uapi}/linux/netlink.h (100%) rename src/{basic/include => include/uapi}/linux/nexthop.h (100%) rename src/{basic/include => include/uapi}/linux/nl80211.h (100%) rename src/{basic/include => include/uapi}/linux/pkt_sched.h (100%) rename src/{basic/include => include/uapi}/linux/prctl.h (100%) rename src/{basic/include => include/uapi}/linux/rtnetlink.h (100%) rename src/{basic/include => include/uapi}/linux/sched/types.h (100%) rename src/{basic/include => include/uapi}/linux/socket.h (100%) rename src/{basic/include => include/uapi}/linux/sockios.h (100%) rename src/{basic/include => include/uapi}/linux/stat.h (100%) rename src/{basic/include => include/uapi}/linux/stddef.h (100%) rename src/{basic/include => include/uapi}/linux/update.sh (100%) rename src/{basic/include => include/uapi}/linux/veth.h (100%) rename src/{basic/include => include/uapi}/linux/vm_sockets.h (100%) rename src/{basic/include => include/uapi}/linux/wireguard.h (100%) rename src/{basic/include => include/uapi}/linux/xattr.h (100%) diff --git a/man/meson.build b/man/meson.build index 15f3fdb34b..4aa9ed237c 100644 --- a/man/meson.build +++ b/man/meson.build @@ -38,7 +38,7 @@ man_page_depends += custom_entities_ent generate_bpf_delegate_configs = find_program('../src/basic/generate-bpf-delegate-configs.py') bpf_delegate_xml = custom_target( - input : files('../src/basic/include/linux/bpf.h'), + input : files('../src/include/uapi/linux/bpf.h'), output : 'bpf-delegate.xml', command : [generate_bpf_delegate_configs, 'doc', diff --git a/meson.build b/meson.build index 6f8397c966..8b7809043d 100644 --- a/meson.build +++ b/meson.build @@ -2008,16 +2008,25 @@ dbus_programs = [] # A list of boot stubs. Required for testing of ukify. boot_stubs = [] +system_includes = [ + include_directories( + # gcc(1) says + # "Directories specified with -isystem options are scanned in left-to-right order", + # and meson puts the directories in the reversed order. Hence, a directory with a lower + # priority must be listed earlier. + 'src/include/uapi', + 'src/include/override', + is_system : true, + ), +] + basic_includes = [ include_directories( 'src/basic', 'src/fundamental', 'src/systemd', ), - include_directories( - 'src/basic/include', - is_system : true, - ), + system_includes, version_include, ] diff --git a/src/basic/meson.build b/src/basic/meson.build index 2627cdb164..19ed187646 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -127,19 +127,19 @@ basic_sources += missing_syscall_def_h generate_af_list = find_program('generate-af-list.sh') af_list_txt = custom_target( output : 'af-list.txt', - command : [generate_af_list, cpp, files('include/sys/socket.h')], + command : [generate_af_list, cpp, files('../include/override/sys/socket.h')], capture : true) generate_arphrd_list = find_program('generate-arphrd-list.sh') arphrd_list_txt = custom_target( output : 'arphrd-list.txt', - command : [generate_arphrd_list, cpp, files('include/linux/if_arp.h')], + command : [generate_arphrd_list, cpp, files('../include/uapi/linux/if_arp.h')], capture : true) generate_cap_list = find_program('generate-cap-list.sh') cap_list_txt = custom_target( output : 'cap-list.txt', - command : [generate_cap_list, cpp, files('include/linux/capability.h')], + command : [generate_cap_list, cpp, files('../include/uapi/linux/capability.h')], capture : true) generate_errno_list = find_program('generate-errno-list.sh') @@ -234,7 +234,7 @@ run_target( ############################################################ filesystem_includes = files( - 'include/linux/magic.h', + '../include/uapi/linux/magic.h', 'missing_magic.h', ) @@ -275,7 +275,7 @@ filesystem_switch_case_inc = custom_target( generate_bpf_delegate_configs = find_program('generate-bpf-delegate-configs.py') bpf_delegate_configs_inc = custom_target( - input : files('include/linux/bpf.h'), + input : files('../include/uapi/linux/bpf.h'), output : 'bpf-delegate-configs.inc', command : [generate_bpf_delegate_configs, 'code', diff --git a/src/basic/include/fcntl.h b/src/include/override/fcntl.h similarity index 100% rename from src/basic/include/fcntl.h rename to src/include/override/fcntl.h diff --git a/src/basic/include/malloc.h b/src/include/override/malloc.h similarity index 100% rename from src/basic/include/malloc.h rename to src/include/override/malloc.h diff --git a/src/basic/include/net/if.h b/src/include/override/net/if.h similarity index 100% rename from src/basic/include/net/if.h rename to src/include/override/net/if.h diff --git a/src/basic/include/net/if_arp.h b/src/include/override/net/if_arp.h similarity index 100% rename from src/basic/include/net/if_arp.h rename to src/include/override/net/if_arp.h diff --git a/src/basic/include/netinet/in.h b/src/include/override/netinet/in.h similarity index 100% rename from src/basic/include/netinet/in.h rename to src/include/override/netinet/in.h diff --git a/src/basic/include/sched.h b/src/include/override/sched.h similarity index 100% rename from src/basic/include/sched.h rename to src/include/override/sched.h diff --git a/src/basic/include/sys/mman.h b/src/include/override/sys/mman.h similarity index 100% rename from src/basic/include/sys/mman.h rename to src/include/override/sys/mman.h diff --git a/src/basic/include/sys/mount.h b/src/include/override/sys/mount.h similarity index 100% rename from src/basic/include/sys/mount.h rename to src/include/override/sys/mount.h diff --git a/src/basic/include/sys/param.h b/src/include/override/sys/param.h similarity index 100% rename from src/basic/include/sys/param.h rename to src/include/override/sys/param.h diff --git a/src/basic/include/sys/pidfd.h b/src/include/override/sys/pidfd.h similarity index 100% rename from src/basic/include/sys/pidfd.h rename to src/include/override/sys/pidfd.h diff --git a/src/basic/include/sys/random.h b/src/include/override/sys/random.h similarity index 100% rename from src/basic/include/sys/random.h rename to src/include/override/sys/random.h diff --git a/src/basic/include/sys/socket.h b/src/include/override/sys/socket.h similarity index 100% rename from src/basic/include/sys/socket.h rename to src/include/override/sys/socket.h diff --git a/src/basic/include/sys/wait.h b/src/include/override/sys/wait.h similarity index 100% rename from src/basic/include/sys/wait.h rename to src/include/override/sys/wait.h diff --git a/src/basic/include/sys/xattr.h b/src/include/override/sys/xattr.h similarity index 100% rename from src/basic/include/sys/xattr.h rename to src/include/override/sys/xattr.h diff --git a/src/basic/include/linux/.clang-format b/src/include/uapi/linux/.clang-format similarity index 100% rename from src/basic/include/linux/.clang-format rename to src/include/uapi/linux/.clang-format diff --git a/src/basic/include/linux/auto_dev-ioctl.h b/src/include/uapi/linux/auto_dev-ioctl.h similarity index 100% rename from src/basic/include/linux/auto_dev-ioctl.h rename to src/include/uapi/linux/auto_dev-ioctl.h diff --git a/src/basic/include/linux/auto_fs.h b/src/include/uapi/linux/auto_fs.h similarity index 100% rename from src/basic/include/linux/auto_fs.h rename to src/include/uapi/linux/auto_fs.h diff --git a/src/basic/include/linux/batman_adv.h b/src/include/uapi/linux/batman_adv.h similarity index 100% rename from src/basic/include/linux/batman_adv.h rename to src/include/uapi/linux/batman_adv.h diff --git a/src/basic/include/linux/bpf.h b/src/include/uapi/linux/bpf.h similarity index 100% rename from src/basic/include/linux/bpf.h rename to src/include/uapi/linux/bpf.h diff --git a/src/basic/include/linux/bpf_common.h b/src/include/uapi/linux/bpf_common.h similarity index 100% rename from src/basic/include/linux/bpf_common.h rename to src/include/uapi/linux/bpf_common.h diff --git a/src/basic/include/linux/bpf_insn.h b/src/include/uapi/linux/bpf_insn.h similarity index 100% rename from src/basic/include/linux/bpf_insn.h rename to src/include/uapi/linux/bpf_insn.h diff --git a/src/basic/include/linux/btrfs.h b/src/include/uapi/linux/btrfs.h similarity index 100% rename from src/basic/include/linux/btrfs.h rename to src/include/uapi/linux/btrfs.h diff --git a/src/basic/include/linux/btrfs_tree.h b/src/include/uapi/linux/btrfs_tree.h similarity index 100% rename from src/basic/include/linux/btrfs_tree.h rename to src/include/uapi/linux/btrfs_tree.h diff --git a/src/basic/include/linux/can/netlink.h b/src/include/uapi/linux/can/netlink.h similarity index 100% rename from src/basic/include/linux/can/netlink.h rename to src/include/uapi/linux/can/netlink.h diff --git a/src/basic/include/linux/can/vxcan.h b/src/include/uapi/linux/can/vxcan.h similarity index 100% rename from src/basic/include/linux/can/vxcan.h rename to src/include/uapi/linux/can/vxcan.h diff --git a/src/basic/include/linux/capability.h b/src/include/uapi/linux/capability.h similarity index 100% rename from src/basic/include/linux/capability.h rename to src/include/uapi/linux/capability.h diff --git a/src/basic/include/linux/cfm_bridge.h b/src/include/uapi/linux/cfm_bridge.h similarity index 100% rename from src/basic/include/linux/cfm_bridge.h rename to src/include/uapi/linux/cfm_bridge.h diff --git a/src/basic/include/linux/const.h b/src/include/uapi/linux/const.h similarity index 100% rename from src/basic/include/linux/const.h rename to src/include/uapi/linux/const.h diff --git a/src/basic/include/linux/dm-ioctl.h b/src/include/uapi/linux/dm-ioctl.h similarity index 100% rename from src/basic/include/linux/dm-ioctl.h rename to src/include/uapi/linux/dm-ioctl.h diff --git a/src/basic/include/linux/ethtool.h b/src/include/uapi/linux/ethtool.h similarity index 100% rename from src/basic/include/linux/ethtool.h rename to src/include/uapi/linux/ethtool.h diff --git a/src/basic/include/linux/fib_rules.h b/src/include/uapi/linux/fib_rules.h similarity index 100% rename from src/basic/include/linux/fib_rules.h rename to src/include/uapi/linux/fib_rules.h diff --git a/src/basic/include/linux/filter.h b/src/include/uapi/linux/filter.h similarity index 100% rename from src/basic/include/linux/filter.h rename to src/include/uapi/linux/filter.h diff --git a/src/basic/include/linux/fou.h b/src/include/uapi/linux/fou.h similarity index 100% rename from src/basic/include/linux/fou.h rename to src/include/uapi/linux/fou.h diff --git a/src/basic/include/linux/fs.h b/src/include/uapi/linux/fs.h similarity index 100% rename from src/basic/include/linux/fs.h rename to src/include/uapi/linux/fs.h diff --git a/src/basic/include/linux/fscrypt.h b/src/include/uapi/linux/fscrypt.h similarity index 100% rename from src/basic/include/linux/fscrypt.h rename to src/include/uapi/linux/fscrypt.h diff --git a/src/basic/include/linux/fsverity.h b/src/include/uapi/linux/fsverity.h similarity index 100% rename from src/basic/include/linux/fsverity.h rename to src/include/uapi/linux/fsverity.h diff --git a/src/basic/include/linux/genetlink.h b/src/include/uapi/linux/genetlink.h similarity index 100% rename from src/basic/include/linux/genetlink.h rename to src/include/uapi/linux/genetlink.h diff --git a/src/basic/include/linux/hdlc/ioctl.h b/src/include/uapi/linux/hdlc/ioctl.h similarity index 100% rename from src/basic/include/linux/hdlc/ioctl.h rename to src/include/uapi/linux/hdlc/ioctl.h diff --git a/src/basic/include/linux/hid.h b/src/include/uapi/linux/hid.h similarity index 100% rename from src/basic/include/linux/hid.h rename to src/include/uapi/linux/hid.h diff --git a/src/basic/include/linux/hidraw.h b/src/include/uapi/linux/hidraw.h similarity index 100% rename from src/basic/include/linux/hidraw.h rename to src/include/uapi/linux/hidraw.h diff --git a/src/basic/include/linux/if.h b/src/include/uapi/linux/if.h similarity index 100% rename from src/basic/include/linux/if.h rename to src/include/uapi/linux/if.h diff --git a/src/basic/include/linux/if_addr.h b/src/include/uapi/linux/if_addr.h similarity index 100% rename from src/basic/include/linux/if_addr.h rename to src/include/uapi/linux/if_addr.h diff --git a/src/basic/include/linux/if_addrlabel.h b/src/include/uapi/linux/if_addrlabel.h similarity index 100% rename from src/basic/include/linux/if_addrlabel.h rename to src/include/uapi/linux/if_addrlabel.h diff --git a/src/basic/include/linux/if_arp.h b/src/include/uapi/linux/if_arp.h similarity index 100% rename from src/basic/include/linux/if_arp.h rename to src/include/uapi/linux/if_arp.h diff --git a/src/basic/include/linux/if_bonding.h b/src/include/uapi/linux/if_bonding.h similarity index 100% rename from src/basic/include/linux/if_bonding.h rename to src/include/uapi/linux/if_bonding.h diff --git a/src/basic/include/linux/if_bridge.h b/src/include/uapi/linux/if_bridge.h similarity index 100% rename from src/basic/include/linux/if_bridge.h rename to src/include/uapi/linux/if_bridge.h diff --git a/src/basic/include/linux/if_ether.h b/src/include/uapi/linux/if_ether.h similarity index 100% rename from src/basic/include/linux/if_ether.h rename to src/include/uapi/linux/if_ether.h diff --git a/src/basic/include/linux/if_infiniband.h b/src/include/uapi/linux/if_infiniband.h similarity index 100% rename from src/basic/include/linux/if_infiniband.h rename to src/include/uapi/linux/if_infiniband.h diff --git a/src/basic/include/linux/if_link.h b/src/include/uapi/linux/if_link.h similarity index 100% rename from src/basic/include/linux/if_link.h rename to src/include/uapi/linux/if_link.h diff --git a/src/basic/include/linux/if_macsec.h b/src/include/uapi/linux/if_macsec.h similarity index 100% rename from src/basic/include/linux/if_macsec.h rename to src/include/uapi/linux/if_macsec.h diff --git a/src/basic/include/linux/if_packet.h b/src/include/uapi/linux/if_packet.h similarity index 100% rename from src/basic/include/linux/if_packet.h rename to src/include/uapi/linux/if_packet.h diff --git a/src/basic/include/linux/if_tun.h b/src/include/uapi/linux/if_tun.h similarity index 100% rename from src/basic/include/linux/if_tun.h rename to src/include/uapi/linux/if_tun.h diff --git a/src/basic/include/linux/if_tunnel.h b/src/include/uapi/linux/if_tunnel.h similarity index 100% rename from src/basic/include/linux/if_tunnel.h rename to src/include/uapi/linux/if_tunnel.h diff --git a/src/basic/include/linux/if_vlan.h b/src/include/uapi/linux/if_vlan.h similarity index 100% rename from src/basic/include/linux/if_vlan.h rename to src/include/uapi/linux/if_vlan.h diff --git a/src/basic/include/linux/in.h b/src/include/uapi/linux/in.h similarity index 100% rename from src/basic/include/linux/in.h rename to src/include/uapi/linux/in.h diff --git a/src/basic/include/linux/in6.h b/src/include/uapi/linux/in6.h similarity index 100% rename from src/basic/include/linux/in6.h rename to src/include/uapi/linux/in6.h diff --git a/src/basic/include/linux/input-event-codes.h b/src/include/uapi/linux/input-event-codes.h similarity index 100% rename from src/basic/include/linux/input-event-codes.h rename to src/include/uapi/linux/input-event-codes.h diff --git a/src/basic/include/linux/input.h b/src/include/uapi/linux/input.h similarity index 100% rename from src/basic/include/linux/input.h rename to src/include/uapi/linux/input.h diff --git a/src/basic/include/linux/ioprio.h b/src/include/uapi/linux/ioprio.h similarity index 100% rename from src/basic/include/linux/ioprio.h rename to src/include/uapi/linux/ioprio.h diff --git a/src/basic/include/linux/ip.h b/src/include/uapi/linux/ip.h similarity index 100% rename from src/basic/include/linux/ip.h rename to src/include/uapi/linux/ip.h diff --git a/src/basic/include/linux/ip6_tunnel.h b/src/include/uapi/linux/ip6_tunnel.h similarity index 100% rename from src/basic/include/linux/ip6_tunnel.h rename to src/include/uapi/linux/ip6_tunnel.h diff --git a/src/basic/include/linux/ipv6.h b/src/include/uapi/linux/ipv6.h similarity index 100% rename from src/basic/include/linux/ipv6.h rename to src/include/uapi/linux/ipv6.h diff --git a/src/basic/include/linux/ipv6_route.h b/src/include/uapi/linux/ipv6_route.h similarity index 100% rename from src/basic/include/linux/ipv6_route.h rename to src/include/uapi/linux/ipv6_route.h diff --git a/src/basic/include/linux/keyctl.h b/src/include/uapi/linux/keyctl.h similarity index 100% rename from src/basic/include/linux/keyctl.h rename to src/include/uapi/linux/keyctl.h diff --git a/src/basic/include/linux/l2tp.h b/src/include/uapi/linux/l2tp.h similarity index 100% rename from src/basic/include/linux/l2tp.h rename to src/include/uapi/linux/l2tp.h diff --git a/src/basic/include/linux/libc-compat.h b/src/include/uapi/linux/libc-compat.h similarity index 100% rename from src/basic/include/linux/libc-compat.h rename to src/include/uapi/linux/libc-compat.h diff --git a/src/basic/include/linux/limits.h b/src/include/uapi/linux/limits.h similarity index 100% rename from src/basic/include/linux/limits.h rename to src/include/uapi/linux/limits.h diff --git a/src/basic/include/linux/loop.h b/src/include/uapi/linux/loop.h similarity index 100% rename from src/basic/include/linux/loop.h rename to src/include/uapi/linux/loop.h diff --git a/src/basic/include/linux/magic.h b/src/include/uapi/linux/magic.h similarity index 100% rename from src/basic/include/linux/magic.h rename to src/include/uapi/linux/magic.h diff --git a/src/basic/include/linux/mempolicy.h b/src/include/uapi/linux/mempolicy.h similarity index 100% rename from src/basic/include/linux/mempolicy.h rename to src/include/uapi/linux/mempolicy.h diff --git a/src/basic/include/linux/mount.h b/src/include/uapi/linux/mount.h similarity index 100% rename from src/basic/include/linux/mount.h rename to src/include/uapi/linux/mount.h diff --git a/src/basic/include/linux/mrp_bridge.h b/src/include/uapi/linux/mrp_bridge.h similarity index 100% rename from src/basic/include/linux/mrp_bridge.h rename to src/include/uapi/linux/mrp_bridge.h diff --git a/src/basic/include/linux/neighbour.h b/src/include/uapi/linux/neighbour.h similarity index 100% rename from src/basic/include/linux/neighbour.h rename to src/include/uapi/linux/neighbour.h diff --git a/src/basic/include/linux/net_namespace.h b/src/include/uapi/linux/net_namespace.h similarity index 100% rename from src/basic/include/linux/net_namespace.h rename to src/include/uapi/linux/net_namespace.h diff --git a/src/basic/include/linux/netdevice.h b/src/include/uapi/linux/netdevice.h similarity index 100% rename from src/basic/include/linux/netdevice.h rename to src/include/uapi/linux/netdevice.h diff --git a/src/basic/include/linux/netfilter.h b/src/include/uapi/linux/netfilter.h similarity index 100% rename from src/basic/include/linux/netfilter.h rename to src/include/uapi/linux/netfilter.h diff --git a/src/basic/include/linux/netfilter/nf_conntrack_common.h b/src/include/uapi/linux/netfilter/nf_conntrack_common.h similarity index 100% rename from src/basic/include/linux/netfilter/nf_conntrack_common.h rename to src/include/uapi/linux/netfilter/nf_conntrack_common.h diff --git a/src/basic/include/linux/netfilter/nf_conntrack_tuple_common.h b/src/include/uapi/linux/netfilter/nf_conntrack_tuple_common.h similarity index 100% rename from src/basic/include/linux/netfilter/nf_conntrack_tuple_common.h rename to src/include/uapi/linux/netfilter/nf_conntrack_tuple_common.h diff --git a/src/basic/include/linux/netfilter/nf_nat.h b/src/include/uapi/linux/netfilter/nf_nat.h similarity index 100% rename from src/basic/include/linux/netfilter/nf_nat.h rename to src/include/uapi/linux/netfilter/nf_nat.h diff --git a/src/basic/include/linux/netfilter/nf_tables.h b/src/include/uapi/linux/netfilter/nf_tables.h similarity index 100% rename from src/basic/include/linux/netfilter/nf_tables.h rename to src/include/uapi/linux/netfilter/nf_tables.h diff --git a/src/basic/include/linux/netfilter/nfnetlink.h b/src/include/uapi/linux/netfilter/nfnetlink.h similarity index 100% rename from src/basic/include/linux/netfilter/nfnetlink.h rename to src/include/uapi/linux/netfilter/nfnetlink.h diff --git a/src/basic/include/linux/netfilter/nfnetlink_compat.h b/src/include/uapi/linux/netfilter/nfnetlink_compat.h similarity index 100% rename from src/basic/include/linux/netfilter/nfnetlink_compat.h rename to src/include/uapi/linux/netfilter/nfnetlink_compat.h diff --git a/src/basic/include/linux/netfilter/x_tables.h b/src/include/uapi/linux/netfilter/x_tables.h similarity index 100% rename from src/basic/include/linux/netfilter/x_tables.h rename to src/include/uapi/linux/netfilter/x_tables.h diff --git a/src/basic/include/linux/netfilter/xt_addrtype.h b/src/include/uapi/linux/netfilter/xt_addrtype.h similarity index 100% rename from src/basic/include/linux/netfilter/xt_addrtype.h rename to src/include/uapi/linux/netfilter/xt_addrtype.h diff --git a/src/basic/include/linux/netfilter/xt_tcpudp.h b/src/include/uapi/linux/netfilter/xt_tcpudp.h similarity index 100% rename from src/basic/include/linux/netfilter/xt_tcpudp.h rename to src/include/uapi/linux/netfilter/xt_tcpudp.h diff --git a/src/basic/include/linux/netfilter_ipv4.h b/src/include/uapi/linux/netfilter_ipv4.h similarity index 100% rename from src/basic/include/linux/netfilter_ipv4.h rename to src/include/uapi/linux/netfilter_ipv4.h diff --git a/src/basic/include/linux/netfilter_ipv4/ip_tables.h b/src/include/uapi/linux/netfilter_ipv4/ip_tables.h similarity index 100% rename from src/basic/include/linux/netfilter_ipv4/ip_tables.h rename to src/include/uapi/linux/netfilter_ipv4/ip_tables.h diff --git a/src/basic/include/linux/netlink.h b/src/include/uapi/linux/netlink.h similarity index 100% rename from src/basic/include/linux/netlink.h rename to src/include/uapi/linux/netlink.h diff --git a/src/basic/include/linux/nexthop.h b/src/include/uapi/linux/nexthop.h similarity index 100% rename from src/basic/include/linux/nexthop.h rename to src/include/uapi/linux/nexthop.h diff --git a/src/basic/include/linux/nl80211.h b/src/include/uapi/linux/nl80211.h similarity index 100% rename from src/basic/include/linux/nl80211.h rename to src/include/uapi/linux/nl80211.h diff --git a/src/basic/include/linux/pkt_sched.h b/src/include/uapi/linux/pkt_sched.h similarity index 100% rename from src/basic/include/linux/pkt_sched.h rename to src/include/uapi/linux/pkt_sched.h diff --git a/src/basic/include/linux/prctl.h b/src/include/uapi/linux/prctl.h similarity index 100% rename from src/basic/include/linux/prctl.h rename to src/include/uapi/linux/prctl.h diff --git a/src/basic/include/linux/rtnetlink.h b/src/include/uapi/linux/rtnetlink.h similarity index 100% rename from src/basic/include/linux/rtnetlink.h rename to src/include/uapi/linux/rtnetlink.h diff --git a/src/basic/include/linux/sched/types.h b/src/include/uapi/linux/sched/types.h similarity index 100% rename from src/basic/include/linux/sched/types.h rename to src/include/uapi/linux/sched/types.h diff --git a/src/basic/include/linux/socket.h b/src/include/uapi/linux/socket.h similarity index 100% rename from src/basic/include/linux/socket.h rename to src/include/uapi/linux/socket.h diff --git a/src/basic/include/linux/sockios.h b/src/include/uapi/linux/sockios.h similarity index 100% rename from src/basic/include/linux/sockios.h rename to src/include/uapi/linux/sockios.h diff --git a/src/basic/include/linux/stat.h b/src/include/uapi/linux/stat.h similarity index 100% rename from src/basic/include/linux/stat.h rename to src/include/uapi/linux/stat.h diff --git a/src/basic/include/linux/stddef.h b/src/include/uapi/linux/stddef.h similarity index 100% rename from src/basic/include/linux/stddef.h rename to src/include/uapi/linux/stddef.h diff --git a/src/basic/include/linux/update.sh b/src/include/uapi/linux/update.sh similarity index 100% rename from src/basic/include/linux/update.sh rename to src/include/uapi/linux/update.sh diff --git a/src/basic/include/linux/veth.h b/src/include/uapi/linux/veth.h similarity index 100% rename from src/basic/include/linux/veth.h rename to src/include/uapi/linux/veth.h diff --git a/src/basic/include/linux/vm_sockets.h b/src/include/uapi/linux/vm_sockets.h similarity index 100% rename from src/basic/include/linux/vm_sockets.h rename to src/include/uapi/linux/vm_sockets.h diff --git a/src/basic/include/linux/wireguard.h b/src/include/uapi/linux/wireguard.h similarity index 100% rename from src/basic/include/linux/wireguard.h rename to src/include/uapi/linux/wireguard.h diff --git a/src/basic/include/linux/xattr.h b/src/include/uapi/linux/xattr.h similarity index 100% rename from src/basic/include/linux/xattr.h rename to src/include/uapi/linux/xattr.h diff --git a/src/shared/meson.build b/src/shared/meson.build index 78e435de35..94a7eaa469 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -296,7 +296,7 @@ shared_sources += [target1, target2] fname = 'ethtool-link-mode.inc' ethtool_link_mode_inc = custom_target( - input : ['ethtool-link-mode.py', '../basic/include/linux/ethtool.h'], + input : ['ethtool-link-mode.py', '../include/uapi/linux/ethtool.h'], output : fname, command : [python, '@INPUT0@', '--header', cpp, '@INPUT1@'], capture : true) @@ -307,7 +307,7 @@ sources += shared_sources fname = 'ethtool-link-mode.xml' ethtool_link_mode_xml = custom_target( - input : ['ethtool-link-mode.py', '../basic/include/linux/ethtool.h'], + input : ['ethtool-link-mode.py', '../include/uapi/linux/ethtool.h'], output : fname, command : [python, '@INPUT0@', '--xml', cpp, '@INPUT1@'], capture : true) diff --git a/src/udev/meson.build b/src/udev/meson.build index 34fc427478..6b37b669d0 100644 --- a/src/udev/meson.build +++ b/src/udev/meson.build @@ -63,7 +63,7 @@ endif generate_keyboard_keys_list = find_program('generate-keyboard-keys-list.sh') keyboard_keys_list_txt = custom_target( - input : files('../basic/include/linux/input.h'), + input : files('../include/uapi/linux/input.h'), output : 'keyboard-keys-list.txt', command : [generate_keyboard_keys_list, cpp, '@INPUT@'], capture : true) From 2b912d20669fb572ee24d986478e8e738306580c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 8 Jul 2025 13:07:32 +0900 Subject: [PATCH 2/9] tree-wide: several cleanups for generating symbol lists and gperf files - pass our system include directories to make generators use our libc wrappers and latest kernel headers, - include relevant headers in generated gperf file, - use files() rather than find_program(), as the result of find_program() cannot be passed to 'input' of custom_target(), - move generate-bpf-delegate-configs.py to src/core/, as it is only used by libcore. --- .github/workflows/linter.yml | 10 ++-- man/meson.build | 16 +---- meson.build | 9 +++ src/basic/generate-af-list.sh | 5 +- src/basic/generate-arphrd-list.sh | 5 +- src/basic/generate-cap-list.sh | 5 +- src/basic/generate-errno-list.sh | 5 +- src/basic/meson.build | 60 ++++++------------- .../generate-bpf-delegate-configs.py | 0 src/core/meson.build | 25 +++++++- src/include/meson.build | 38 ++++++++++++ .../sd-journal/generate-audit_type-list.sh | 10 ++-- src/libsystemd/sd-journal/meson.build | 5 +- src/shared/ethtool-link-mode.py | 6 +- src/shared/generate-ip-protocol-list.sh | 5 +- src/shared/meson.build | 14 +++-- src/udev/generate-keyboard-keys-gperf.sh | 1 + src/udev/generate-keyboard-keys-list.sh | 5 +- src/udev/meson.build | 12 ++-- tools/xml_helper.py | 2 +- 20 files changed, 147 insertions(+), 91 deletions(-) rename src/{basic => core}/generate-bpf-delegate-configs.py (100%) create mode 100644 src/include/meson.build diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index a489b55661..8c0ec63d40 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -41,7 +41,7 @@ jobs: - uses: systemd/mkosi@184472f0f1f831ca29953546ec01fd941ff763a6 - name: Check that tabs are not used in Python code - run: sh -c '! git grep -P "\\t" -- src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py' + run: sh -c '! git grep -P "\\t" -- src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py' - name: Build tools tree run: | @@ -56,20 +56,20 @@ jobs: - name: Run mypy run: | mkosi box -- mypy --version - mkosi box -- mypy src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py + mkosi box -- mypy src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py - name: Run ruff check run: | mkosi box -- ruff --version - mkosi box -- ruff check src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py + mkosi box -- ruff check src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py - name: Run ruff format run: | mkosi box -- ruff --version - if ! mkosi box -- ruff format --check src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py + if ! mkosi box -- ruff format --check src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py then echo "Please run 'ruff format' on the above files or apply the diffs below manually" - mkosi box -- ruff format --check --quiet --diff src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py + mkosi box -- ruff format --check --quiet --diff src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py fi - name: Configure meson diff --git a/man/meson.build b/man/meson.build index 4aa9ed237c..89e813ee32 100644 --- a/man/meson.build +++ b/man/meson.build @@ -20,9 +20,10 @@ xsltproc_flags = [ '--stringparam', 'man.copyright.section.enabled', '0', '--stringparam', 'systemd.version', '@0@'.format(meson.project_version()), '--path', - '@0@:@1@:@2@'.format(meson.current_build_dir(), + '@0@:@1@:@2@:@3@'.format(meson.current_build_dir(), meson.current_source_dir(), - libshared_build_dir)] + libshared_build_dir, + libcore_build_dir)] custom_man_xsl = files('custom-man.xsl') custom_html_xsl = files('custom-html.xsl') @@ -35,17 +36,6 @@ custom_entities_ent = custom_target( man_page_depends += custom_entities_ent -generate_bpf_delegate_configs = find_program('../src/basic/generate-bpf-delegate-configs.py') - -bpf_delegate_xml = custom_target( - input : files('../src/include/uapi/linux/bpf.h'), - output : 'bpf-delegate.xml', - command : [generate_bpf_delegate_configs, - 'doc', - '@INPUT@'], - capture : true) -man_page_depends += bpf_delegate_xml - man_pages = [] html_pages = [] source_xml_files = [] diff --git a/meson.build b/meson.build index 8b7809043d..b97fe3aa41 100644 --- a/meson.build +++ b/meson.build @@ -2008,6 +2008,14 @@ dbus_programs = [] # A list of boot stubs. Required for testing of ukify. boot_stubs = [] +# This is similar to system_includes below, but for passing custom_target(). +system_include_args = [ + '-isystem', meson.project_build_root() / 'src/include/override', + '-isystem', meson.project_source_root() / 'src/include/override', + '-isystem', meson.project_build_root() / 'src/include/uapi', + '-isystem', meson.project_source_root() / 'src/include/uapi', +] + system_includes = [ include_directories( # gcc(1) says @@ -2048,6 +2056,7 @@ includes = [libsystemd_includes, include_directories('src/shared')] subdir('po') subdir('catalog') +subdir('src/include') subdir('src/fundamental') subdir('src/basic') subdir('src/libsystemd') diff --git a/src/basic/generate-af-list.sh b/src/basic/generate-af-list.sh index 4fec46a2ef..d7c777507b 100755 --- a/src/basic/generate-af-list.sh +++ b/src/basic/generate-af-list.sh @@ -3,6 +3,9 @@ set -eu set -o pipefail -${1:?} -E -dM -include sys/socket.h -include "${2:?}" - ']], - ['arphrd', arphrd_list_txt, 'arphrd', 'ARPHRD_', []], - ['cap', cap_list_txt, 'capability', '', []], - ['errno', errno_list_txt, 'errno', '', []]] +foreach item : [ + # name, source, struct name, prefix, headers + ['af', af_sources, 'af', '', [''], ], + ['arphrd', arphrd_sources, 'arphrd', 'ARPHRD_', [''], ], + ['cap', cap_sources, 'capability', '', [''], ], + ['errno', [], 'errno', '', [''], ], +] + + fname = '@0@-list.txt'.format(item[0]) + generate_list = files('generate-@0@-list.sh'.format(item[0])) + list_txt = custom_target( + input : [generate_list, item[1]], + output : fname, + command : [env, 'bash', generate_list, cpp, system_include_args], + capture : true) fname = '@0@-from-name.gperf'.format(item[0]) gperf_file = custom_target( - input : item[1], + input : list_txt, output : fname, command : [generate_gperfs, item[2], item[3], '@INPUT@'] + item[4], capture : true) @@ -176,7 +163,7 @@ foreach item : [['af', af_list_txt, 'af', '', ['= 15\n\ _Pragma(\"GCC diagnostic ignored \\\"-Wzero-as-null-pointer-constant\\\"\")\n\ #endif\n\ +#include \n\ %}" print "struct key_name { const char* name; unsigned short id; };" print "%null-strings" diff --git a/src/udev/generate-keyboard-keys-list.sh b/src/udev/generate-keyboard-keys-list.sh index 4cac507322..5809119224 100755 --- a/src/udev/generate-keyboard-keys-list.sh +++ b/src/udev/generate-keyboard-keys-list.sh @@ -3,7 +3,10 @@ set -eu set -o pipefail -${1:?} -dM -include "${2:?}" - / { next } /^#define[ \t]+(KEY|BTN)_[^ ]+[ \t]+[0-9BK]/ { print $2 } ' diff --git a/src/udev/meson.build b/src/udev/meson.build index 6b37b669d0..7e49959bc5 100644 --- a/src/udev/meson.build +++ b/src/udev/meson.build @@ -61,19 +61,19 @@ endif ############################################################ -generate_keyboard_keys_list = find_program('generate-keyboard-keys-list.sh') +generate_keyboard_keys_list = files('generate-keyboard-keys-list.sh') keyboard_keys_list_txt = custom_target( - input : files('../include/uapi/linux/input.h'), + input : [generate_keyboard_keys_list, keyboard_sources], output : 'keyboard-keys-list.txt', - command : [generate_keyboard_keys_list, cpp, '@INPUT@'], + command : [env, 'bash', generate_keyboard_keys_list, cpp, system_include_args], capture : true) -generate_keyboard_keys_gperf = find_program('generate-keyboard-keys-gperf.sh') +generate_keyboard_keys_gperf = files('generate-keyboard-keys-gperf.sh') fname = 'keyboard-keys-from-name.gperf' gperf_file = custom_target( - input : keyboard_keys_list_txt, + input : [generate_keyboard_keys_gperf, keyboard_keys_list_txt], output : fname, - command : [generate_keyboard_keys_gperf, '@INPUT@'], + command : [env, 'bash', '@INPUT@'], capture : true) fname = 'keyboard-keys-from-name.inc' diff --git a/tools/xml_helper.py b/tools/xml_helper.py index 294630ded1..0383ef7187 100755 --- a/tools/xml_helper.py +++ b/tools/xml_helper.py @@ -11,7 +11,7 @@ class CustomResolver(tree.Resolver): if 'ethtool-link-mode' in url: return self.resolve_filename('src/shared/ethtool-link-mode.xml', context) if 'bpf-delegate' in url: - return self.resolve_filename('man/bpf-delegate.xml', context) + return self.resolve_filename('src/core/bpf-delegate.xml', context) return None From da522c9921f85c2369cae17c75c48174c3b410cd Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 19 Jun 2025 08:35:35 +0900 Subject: [PATCH 3/9] basic: move basic/missing_syscall_defs.h -> include/override/sys/syscall.h This also moves syscall tables and generators to the same directory. Note, inclusion of asm/sgidefs.h is dropped, as it is already included by unistd.h and sys/syscall.h. --- src/basic/meson.build | 47 ------ src/basic/missing_syscall.h | 5 - src/include/meson.build | 2 + .../override/sys/generate-syscall.py} | 27 +-- src/include/override/sys/meson.build | 41 +++++ src/include/override/sys/mount.h | 2 - .../override/sys}/syscall-list.txt | 0 .../override/sys/syscall.h} | 156 +++++++++--------- .../override/sys}/syscalls-alpha.txt | 0 .../override/sys}/syscalls-arc.txt | 0 .../override/sys}/syscalls-arm.txt | 0 .../override/sys}/syscalls-arm64.txt | 0 .../override/sys}/syscalls-i386.txt | 0 .../override/sys}/syscalls-ia64.txt | 0 .../override/sys}/syscalls-loongarch64.txt | 0 .../override/sys}/syscalls-m68k.txt | 0 .../override/sys}/syscalls-mips64.txt | 0 .../override/sys}/syscalls-mips64n32.txt | 0 .../override/sys}/syscalls-mipso32.txt | 0 .../override/sys}/syscalls-parisc.txt | 0 .../override/sys}/syscalls-powerpc.txt | 0 .../override/sys}/syscalls-powerpc64.txt | 0 .../override/sys}/syscalls-riscv32.txt | 0 .../override/sys}/syscalls-riscv64.txt | 0 .../override/sys}/syscalls-s390.txt | 0 .../override/sys}/syscalls-s390x.txt | 0 .../override/sys}/syscalls-sparc.txt | 0 .../override/sys}/syscalls-x86_64.txt | 0 28 files changed, 139 insertions(+), 141 deletions(-) rename src/{basic/missing_syscalls.py => include/override/sys/generate-syscall.py} (94%) create mode 100644 src/include/override/sys/meson.build rename src/{basic => include/override/sys}/syscall-list.txt (100%) rename src/{basic/missing_syscall_def.h => include/override/sys/syscall.h} (96%) rename src/{basic => include/override/sys}/syscalls-alpha.txt (100%) rename src/{basic => include/override/sys}/syscalls-arc.txt (100%) rename src/{basic => include/override/sys}/syscalls-arm.txt (100%) rename src/{basic => include/override/sys}/syscalls-arm64.txt (100%) rename src/{basic => include/override/sys}/syscalls-i386.txt (100%) rename src/{basic => include/override/sys}/syscalls-ia64.txt (100%) rename src/{basic => include/override/sys}/syscalls-loongarch64.txt (100%) rename src/{basic => include/override/sys}/syscalls-m68k.txt (100%) rename src/{basic => include/override/sys}/syscalls-mips64.txt (100%) rename src/{basic => include/override/sys}/syscalls-mips64n32.txt (100%) rename src/{basic => include/override/sys}/syscalls-mipso32.txt (100%) rename src/{basic => include/override/sys}/syscalls-parisc.txt (100%) rename src/{basic => include/override/sys}/syscalls-powerpc.txt (100%) rename src/{basic => include/override/sys}/syscalls-powerpc64.txt (100%) rename src/{basic => include/override/sys}/syscalls-riscv32.txt (100%) rename src/{basic => include/override/sys}/syscalls-riscv64.txt (100%) rename src/{basic => include/override/sys}/syscalls-s390.txt (100%) rename src/{basic => include/override/sys}/syscalls-s390x.txt (100%) rename src/{basic => include/override/sys}/syscalls-sparc.txt (100%) rename src/{basic => include/override/sys}/syscalls-x86_64.txt (100%) diff --git a/src/basic/meson.build b/src/basic/meson.build index b7b2253586..ece4bf1e92 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -121,9 +121,6 @@ sources += basic_sources missing_audit_h = files('missing_audit.h') -missing_syscall_def_h = files('missing_syscall_def.h') -basic_sources += missing_syscall_def_h - generated_gperf_headers = [] foreach item : [ # name, source, struct name, prefix, headers @@ -176,50 +173,6 @@ basic_sources += generated_gperf_headers ############################################################ -arch_list = [ - 'alpha', - 'arc', - 'arm', - 'arm64', - 'i386', - 'ia64', - 'loongarch64', - 'm68k', - 'mips64', - 'mips64n32', - 'mipso32', - 'parisc', - 'powerpc', - 'powerpc64', - 'riscv32', - 'riscv64', - 's390', - 's390x', - 'sparc', - 'x86_64' -] - -run_target( - 'update-syscall-tables', - command : [update_syscall_tables_sh, meson.current_source_dir()] + arch_list) - -syscall_list_txt = files('syscall-list.txt') - -syscall_lists = [] -foreach arch: arch_list - syscall_lists += files('syscalls-@0@.txt'.format(arch)) -endforeach - -missing_syscalls_py = find_program('missing_syscalls.py') - -run_target( - 'update-syscall-header', - command : [missing_syscalls_py, - missing_syscall_def_h, - syscall_lists]) - -############################################################ - filesystem_includes = files( '../include/uapi/linux/magic.h', 'missing_magic.h', diff --git a/src/basic/missing_syscall.h b/src/basic/missing_syscall.h index 76074d1c04..994bda9a3e 100644 --- a/src/basic/missing_syscall.h +++ b/src/basic/missing_syscall.h @@ -10,13 +10,8 @@ #include #include -#ifdef ARCH_MIPS -#include -#endif - #include "forward.h" #include "missing_keyctl.h" -#include "missing_syscall_def.h" /* ======================================================================= */ diff --git a/src/include/meson.build b/src/include/meson.build index 74f4437df0..9786723b1b 100644 --- a/src/include/meson.build +++ b/src/include/meson.build @@ -1,5 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-or-later +subdir('override/sys') + # Source files that provides AF_XYZ af_sources = files( 'override/sys/socket.h', diff --git a/src/basic/missing_syscalls.py b/src/include/override/sys/generate-syscall.py similarity index 94% rename from src/basic/missing_syscalls.py rename to src/include/override/sys/generate-syscall.py index dd26b76b4c..b58f1d6bcf 100644 --- a/src/basic/missing_syscalls.py +++ b/src/include/override/sys/generate-syscall.py @@ -33,6 +33,20 @@ def parse_syscall_tables(filenames): return {filename.split('-')[-1][:-4]: parse_syscall_table(filename) for filename in filenames} +HEADER = '''\ +/* SPDX-License-Identifier: LGPL-2.1-or-later + * This file is generated by src/include/override/sys/generate-syscall.py. Do not edit! + * + * Use 'ninja -C build update-syscall-tables' to download new syscall tables, + * and 'ninja -C build update-syscall-header' to regenerate this file. + */ +#pragma once + +#include_next + +#include +''' + DEF_TEMPLATE_A = '''\ #ifndef __IGNORE_{syscall} @@ -97,7 +111,7 @@ DEF_TEMPLATE_C = '''\ /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_{syscall} && __NR_{syscall} >= 0 # if defined systemd_NR_{syscall} -_Static_assert(__NR_{syscall} == systemd_NR_{syscall}, ""); +static_assert(__NR_{syscall} == systemd_NR_{syscall}, ""); # endif # else # if defined __NR_{syscall} @@ -128,16 +142,7 @@ def print_syscall_def(syscall, tables, out): file=out) def print_syscall_defs(syscalls, tables, out): - print('''\ -/* SPDX-License-Identifier: LGPL-2.1-or-later - * This file is generated by src/basic/missing_syscalls.py. Do not edit! - * - * Use 'ninja -C build update-syscall-tables' to download new syscall tables, - * and 'ninja -C build update-syscall-header' to regenerate this file. - */ -#pragma once -''', - file=out) + print(HEADER, file=out) print(ARCH_CHECK, file=out) for syscall in syscalls: print_syscall_def(syscall, tables, out) diff --git a/src/include/override/sys/meson.build b/src/include/override/sys/meson.build new file mode 100644 index 0000000000..b66f9d055f --- /dev/null +++ b/src/include/override/sys/meson.build @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +arch_list = [ + 'alpha', + 'arc', + 'arm', + 'arm64', + 'i386', + 'ia64', + 'loongarch64', + 'm68k', + 'mips64', + 'mips64n32', + 'mipso32', + 'parisc', + 'powerpc', + 'powerpc64', + 'riscv32', + 'riscv64', + 's390', + 's390x', + 'sparc', + 'x86_64' +] + +run_target( + 'update-syscall-tables', + command : [update_syscall_tables_sh, meson.current_source_dir()] + arch_list) + +syscall_list_txt = files('syscall-list.txt') + +syscall_lists = [] +foreach arch: arch_list + syscall_lists += files('syscalls-@0@.txt'.format(arch)) +endforeach + +generate_syscall_py = find_program('generate-syscall.py') + +run_target( + 'update-syscall-header', + command : [generate_syscall_py, files('syscall.h')] + syscall_lists) diff --git a/src/include/override/sys/mount.h b/src/include/override/sys/mount.h index 3c9cd8ef5b..050c23cc6a 100644 --- a/src/include/override/sys/mount.h +++ b/src/include/override/sys/mount.h @@ -11,8 +11,6 @@ #include #include -#include "missing_syscall_def.h" - /* Since glibc-2.37 (774058d72942249f71d74e7f2b639f77184160a6), sys/mount.h includes linux/mount.h, and * we can safely include both headers in the same source file. However, we cannot do that with older glibc. * To avoid conflicts, let's not use glibc's sys/mount.h, and provide our own minimal implementation. diff --git a/src/basic/syscall-list.txt b/src/include/override/sys/syscall-list.txt similarity index 100% rename from src/basic/syscall-list.txt rename to src/include/override/sys/syscall-list.txt diff --git a/src/basic/missing_syscall_def.h b/src/include/override/sys/syscall.h similarity index 96% rename from src/basic/missing_syscall_def.h rename to src/include/override/sys/syscall.h index a34cb36f14..894394a76b 100644 --- a/src/basic/missing_syscall_def.h +++ b/src/include/override/sys/syscall.h @@ -1,11 +1,15 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later - * This file is generated by src/basic/missing_syscalls.py. Do not edit! + * This file is generated by src/include/override/sys/generate-syscall.py. Do not edit! * * Use 'ninja -C build update-syscall-tables' to download new syscall tables, * and 'ninja -C build update-syscall-header' to regenerate this file. */ #pragma once +#include_next + +#include + /* Note: if this code looks strange, this is because it is derived from the same * template as the per-syscall blocks below. */ # if defined(__aarch64__) @@ -98,7 +102,7 @@ /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_close_range && __NR_close_range >= 0 # if defined systemd_NR_close_range -_Static_assert(__NR_close_range == systemd_NR_close_range, ""); +static_assert(__NR_close_range == systemd_NR_close_range, ""); # endif # else # if defined __NR_close_range @@ -166,7 +170,7 @@ _Static_assert(__NR_close_range == systemd_NR_close_range, ""); /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_fchmodat2 && __NR_fchmodat2 >= 0 # if defined systemd_NR_fchmodat2 -_Static_assert(__NR_fchmodat2 == systemd_NR_fchmodat2, ""); +static_assert(__NR_fchmodat2 == systemd_NR_fchmodat2, ""); # endif # else # if defined __NR_fchmodat2 @@ -234,7 +238,7 @@ _Static_assert(__NR_fchmodat2 == systemd_NR_fchmodat2, ""); /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_mount_setattr && __NR_mount_setattr >= 0 # if defined systemd_NR_mount_setattr -_Static_assert(__NR_mount_setattr == systemd_NR_mount_setattr, ""); +static_assert(__NR_mount_setattr == systemd_NR_mount_setattr, ""); # endif # else # if defined __NR_mount_setattr @@ -246,6 +250,74 @@ _Static_assert(__NR_mount_setattr == systemd_NR_mount_setattr, ""); # endif #endif +#ifndef __IGNORE_open_tree_attr +# if defined(__aarch64__) +# define systemd_NR_open_tree_attr 467 +# elif defined(__alpha__) +# define systemd_NR_open_tree_attr 577 +# elif defined(__arc__) || defined(__tilegx__) +# define systemd_NR_open_tree_attr 467 +# elif defined(__arm__) +# define systemd_NR_open_tree_attr 467 +# elif defined(__i386__) +# define systemd_NR_open_tree_attr 467 +# elif defined(__ia64__) +# define systemd_NR_open_tree_attr -1 +# elif defined(__loongarch_lp64) +# define systemd_NR_open_tree_attr 467 +# elif defined(__m68k__) +# define systemd_NR_open_tree_attr 467 +# elif defined(_MIPS_SIM) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# define systemd_NR_open_tree_attr 4467 +# elif _MIPS_SIM == _MIPS_SIM_NABI32 +# define systemd_NR_open_tree_attr 6467 +# elif _MIPS_SIM == _MIPS_SIM_ABI64 +# define systemd_NR_open_tree_attr 5467 +# else +# error "Unknown MIPS ABI" +# endif +# elif defined(__hppa__) +# define systemd_NR_open_tree_attr 467 +# elif defined(__powerpc__) +# define systemd_NR_open_tree_attr 467 +# elif defined(__riscv) +# if __riscv_xlen == 32 +# define systemd_NR_open_tree_attr 467 +# elif __riscv_xlen == 64 +# define systemd_NR_open_tree_attr 467 +# else +# error "Unknown RISC-V ABI" +# endif +# elif defined(__s390__) +# define systemd_NR_open_tree_attr 467 +# elif defined(__sparc__) +# define systemd_NR_open_tree_attr 467 +# elif defined(__x86_64__) +# if defined(__ILP32__) +# define systemd_NR_open_tree_attr (467 | /* __X32_SYSCALL_BIT */ 0x40000000) +# else +# define systemd_NR_open_tree_attr 467 +# endif +# elif !defined(missing_arch_template) +# warning "open_tree_attr() syscall number is unknown for your architecture" +# endif + +/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ +# if defined __NR_open_tree_attr && __NR_open_tree_attr >= 0 +# if defined systemd_NR_open_tree_attr +static_assert(__NR_open_tree_attr == systemd_NR_open_tree_attr, ""); +# endif +# else +# if defined __NR_open_tree_attr +# undef __NR_open_tree_attr +# endif +# if defined systemd_NR_open_tree_attr && systemd_NR_open_tree_attr >= 0 +# define __NR_open_tree_attr systemd_NR_open_tree_attr +# endif +# endif +#endif + #ifndef __IGNORE_openat2 # if defined(__aarch64__) # define systemd_NR_openat2 437 @@ -302,7 +374,7 @@ _Static_assert(__NR_mount_setattr == systemd_NR_mount_setattr, ""); /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_openat2 && __NR_openat2 >= 0 # if defined systemd_NR_openat2 -_Static_assert(__NR_openat2 == systemd_NR_openat2, ""); +static_assert(__NR_openat2 == systemd_NR_openat2, ""); # endif # else # if defined __NR_openat2 @@ -370,7 +442,7 @@ _Static_assert(__NR_openat2 == systemd_NR_openat2, ""); /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_quotactl_fd && __NR_quotactl_fd >= 0 # if defined systemd_NR_quotactl_fd -_Static_assert(__NR_quotactl_fd == systemd_NR_quotactl_fd, ""); +static_assert(__NR_quotactl_fd == systemd_NR_quotactl_fd, ""); # endif # else # if defined __NR_quotactl_fd @@ -438,7 +510,7 @@ _Static_assert(__NR_quotactl_fd == systemd_NR_quotactl_fd, ""); /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_removexattrat && __NR_removexattrat >= 0 # if defined systemd_NR_removexattrat -_Static_assert(__NR_removexattrat == systemd_NR_removexattrat, ""); +static_assert(__NR_removexattrat == systemd_NR_removexattrat, ""); # endif # else # if defined __NR_removexattrat @@ -506,7 +578,7 @@ _Static_assert(__NR_removexattrat == systemd_NR_removexattrat, ""); /* may be an (invalid) negative number due to libseccomp, see PR 13319 */ # if defined __NR_setxattrat && __NR_setxattrat >= 0 # if defined systemd_NR_setxattrat -_Static_assert(__NR_setxattrat == systemd_NR_setxattrat, ""); +static_assert(__NR_setxattrat == systemd_NR_setxattrat, ""); # endif # else # if defined __NR_setxattrat @@ -517,71 +589,3 @@ _Static_assert(__NR_setxattrat == systemd_NR_setxattrat, ""); # endif # endif #endif - -#ifndef __IGNORE_open_tree_attr -# if defined(__aarch64__) -# define systemd_NR_open_tree_attr 467 -# elif defined(__alpha__) -# define systemd_NR_open_tree_attr 577 -# elif defined(__arc__) || defined(__tilegx__) -# define systemd_NR_open_tree_attr 467 -# elif defined(__arm__) -# define systemd_NR_open_tree_attr 467 -# elif defined(__i386__) -# define systemd_NR_open_tree_attr 467 -# elif defined(__ia64__) -# define systemd_NR_open_tree_attr -1 -# elif defined(__loongarch_lp64) -# define systemd_NR_open_tree_attr 467 -# elif defined(__m68k__) -# define systemd_NR_open_tree_attr 467 -# elif defined(_MIPS_SIM) -# if _MIPS_SIM == _MIPS_SIM_ABI32 -# define systemd_NR_open_tree_attr 4467 -# elif _MIPS_SIM == _MIPS_SIM_NABI32 -# define systemd_NR_open_tree_attr 6467 -# elif _MIPS_SIM == _MIPS_SIM_ABI64 -# define systemd_NR_open_tree_attr 5467 -# else -# error "Unknown MIPS ABI" -# endif -# elif defined(__hppa__) -# define systemd_NR_open_tree_attr 467 -# elif defined(__powerpc__) -# define systemd_NR_open_tree_attr 467 -# elif defined(__riscv) -# if __riscv_xlen == 32 -# define systemd_NR_open_tree_attr 467 -# elif __riscv_xlen == 64 -# define systemd_NR_open_tree_attr 467 -# else -# error "Unknown RISC-V ABI" -# endif -# elif defined(__s390__) -# define systemd_NR_open_tree_attr 467 -# elif defined(__sparc__) -# define systemd_NR_open_tree_attr 467 -# elif defined(__x86_64__) -# if defined(__ILP32__) -# define systemd_NR_open_tree_attr (467 | /* __X32_SYSCALL_BIT */ 0x40000000) -# else -# define systemd_NR_open_tree_attr 467 -# endif -# elif !defined(missing_arch_template) -# warning "open_tree_attr() syscall number is unknown for your architecture" -# endif - -/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ -# if defined __NR_open_tree_attr && __NR_open_tree_attr >= 0 -# if defined systemd_NR_open_tree_attr -_Static_assert(__NR_open_tree_attr == systemd_NR_open_tree_attr, ""); -# endif -# else -# if defined __NR_open_tree_attr -# undef __NR_open_tree_attr -# endif -# if defined systemd_NR_open_tree_attr && systemd_NR_open_tree_attr >= 0 -# define __NR_open_tree_attr systemd_NR_open_tree_attr -# endif -# endif -#endif diff --git a/src/basic/syscalls-alpha.txt b/src/include/override/sys/syscalls-alpha.txt similarity index 100% rename from src/basic/syscalls-alpha.txt rename to src/include/override/sys/syscalls-alpha.txt diff --git a/src/basic/syscalls-arc.txt b/src/include/override/sys/syscalls-arc.txt similarity index 100% rename from src/basic/syscalls-arc.txt rename to src/include/override/sys/syscalls-arc.txt diff --git a/src/basic/syscalls-arm.txt b/src/include/override/sys/syscalls-arm.txt similarity index 100% rename from src/basic/syscalls-arm.txt rename to src/include/override/sys/syscalls-arm.txt diff --git a/src/basic/syscalls-arm64.txt b/src/include/override/sys/syscalls-arm64.txt similarity index 100% rename from src/basic/syscalls-arm64.txt rename to src/include/override/sys/syscalls-arm64.txt diff --git a/src/basic/syscalls-i386.txt b/src/include/override/sys/syscalls-i386.txt similarity index 100% rename from src/basic/syscalls-i386.txt rename to src/include/override/sys/syscalls-i386.txt diff --git a/src/basic/syscalls-ia64.txt b/src/include/override/sys/syscalls-ia64.txt similarity index 100% rename from src/basic/syscalls-ia64.txt rename to src/include/override/sys/syscalls-ia64.txt diff --git a/src/basic/syscalls-loongarch64.txt b/src/include/override/sys/syscalls-loongarch64.txt similarity index 100% rename from src/basic/syscalls-loongarch64.txt rename to src/include/override/sys/syscalls-loongarch64.txt diff --git a/src/basic/syscalls-m68k.txt b/src/include/override/sys/syscalls-m68k.txt similarity index 100% rename from src/basic/syscalls-m68k.txt rename to src/include/override/sys/syscalls-m68k.txt diff --git a/src/basic/syscalls-mips64.txt b/src/include/override/sys/syscalls-mips64.txt similarity index 100% rename from src/basic/syscalls-mips64.txt rename to src/include/override/sys/syscalls-mips64.txt diff --git a/src/basic/syscalls-mips64n32.txt b/src/include/override/sys/syscalls-mips64n32.txt similarity index 100% rename from src/basic/syscalls-mips64n32.txt rename to src/include/override/sys/syscalls-mips64n32.txt diff --git a/src/basic/syscalls-mipso32.txt b/src/include/override/sys/syscalls-mipso32.txt similarity index 100% rename from src/basic/syscalls-mipso32.txt rename to src/include/override/sys/syscalls-mipso32.txt diff --git a/src/basic/syscalls-parisc.txt b/src/include/override/sys/syscalls-parisc.txt similarity index 100% rename from src/basic/syscalls-parisc.txt rename to src/include/override/sys/syscalls-parisc.txt diff --git a/src/basic/syscalls-powerpc.txt b/src/include/override/sys/syscalls-powerpc.txt similarity index 100% rename from src/basic/syscalls-powerpc.txt rename to src/include/override/sys/syscalls-powerpc.txt diff --git a/src/basic/syscalls-powerpc64.txt b/src/include/override/sys/syscalls-powerpc64.txt similarity index 100% rename from src/basic/syscalls-powerpc64.txt rename to src/include/override/sys/syscalls-powerpc64.txt diff --git a/src/basic/syscalls-riscv32.txt b/src/include/override/sys/syscalls-riscv32.txt similarity index 100% rename from src/basic/syscalls-riscv32.txt rename to src/include/override/sys/syscalls-riscv32.txt diff --git a/src/basic/syscalls-riscv64.txt b/src/include/override/sys/syscalls-riscv64.txt similarity index 100% rename from src/basic/syscalls-riscv64.txt rename to src/include/override/sys/syscalls-riscv64.txt diff --git a/src/basic/syscalls-s390.txt b/src/include/override/sys/syscalls-s390.txt similarity index 100% rename from src/basic/syscalls-s390.txt rename to src/include/override/sys/syscalls-s390.txt diff --git a/src/basic/syscalls-s390x.txt b/src/include/override/sys/syscalls-s390x.txt similarity index 100% rename from src/basic/syscalls-s390x.txt rename to src/include/override/sys/syscalls-s390x.txt diff --git a/src/basic/syscalls-sparc.txt b/src/include/override/sys/syscalls-sparc.txt similarity index 100% rename from src/basic/syscalls-sparc.txt rename to src/include/override/sys/syscalls-sparc.txt diff --git a/src/basic/syscalls-x86_64.txt b/src/include/override/sys/syscalls-x86_64.txt similarity index 100% rename from src/basic/syscalls-x86_64.txt rename to src/include/override/sys/syscalls-x86_64.txt From 543a48b653ff25cc562ce4dcffec377a875f604e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 21 Jun 2025 20:29:51 +0900 Subject: [PATCH 4/9] libc-wrapper: introduce a tiny libc wrapper Then, move syscall definitions to the wrapper, and prototypes are moved to relevant headers. This also adds checks for add_key() and request_key(), as one day glibc may be going to add some of them separatedly. The check for fspick in meson.build is dropped, as it is currently unused in our code. This also moves - basic/missing_bpf.h -> include/override/linux/bpf.h, - basic/missing_keyctl.h -> include/override/linux/keyctl.h. --- meson.build | 14 +- src/basic/fd-util.c | 3 +- src/basic/fs-util.c | 1 - src/basic/keyring-util.c | 1 - src/basic/keyring-util.h | 3 +- src/basic/missing_syscall.h | 244 ------------------ src/basic/pidfd-util.h | 1 - src/basic/process-util.c | 1 - src/basic/signal-util.c | 1 - src/basic/xattr-util.c | 1 - src/core/bpf-devices.c | 2 +- src/core/exec-invoke.c | 4 +- src/core/meson.build | 1 + src/home/homework-fscrypt.c | 2 - src/home/homework-luks.c | 1 - src/home/homework-password-cache.c | 1 - src/home/homework.c | 1 - src/home/homework.h | 2 +- .../override/linux/bpf.h} | 2 +- .../override/linux/keyctl.h} | 6 +- src/include/override/sched.h | 19 ++ src/include/override/signal.h | 9 + src/include/override/sys/bpf.h | 11 + src/include/override/sys/ioprio.h | 14 + src/include/override/sys/kcmp.h | 11 + src/include/override/sys/keyctl.h | 20 ++ src/include/override/sys/mempolicy.h | 14 + src/include/override/sys/mount.h | 56 ++-- src/include/override/sys/pidfd.h | 21 +- src/include/override/sys/quota.h | 10 + src/include/override/sys/stat.h | 10 + src/include/override/sys/xattr.h | 12 + src/include/override/unistd.h | 23 ++ src/libc/bpf.c | 11 + src/libc/ioprio.c | 17 ++ src/libc/kcmp.c | 11 + src/libc/keyctl.c | 23 ++ src/libc/mempolicy.c | 17 ++ src/libc/meson.build | 28 ++ src/libc/mount.c | 47 ++++ src/libc/pidfd.c | 17 ++ src/libc/quota.c | 11 + src/libc/sched.c | 11 + src/libc/signal.c | 11 + src/libc/stat.c | 11 + src/libc/unistd.c | 25 ++ src/libc/xattr.c | 17 ++ src/libsystemd/meson.build | 3 +- src/libsystemd/sd-id128/sd-id128.c | 1 - src/login/pam_systemd_loadkey.c | 1 - src/login/user-runtime-dir.c | 1 - src/nspawn/nspawn.c | 3 +- src/nsresourced/nsresourcework.c | 1 - src/repart/meson.build | 1 + src/shared/ask-password-api.c | 1 - src/shared/bpf-program.c | 2 +- src/shared/ioprio-util.h | 2 +- src/shared/meson.build | 3 +- src/shared/mount-util.c | 1 - src/shared/numa-util.c | 1 - src/shared/numa-util.h | 3 +- src/shared/quota-util.c | 1 - src/shared/switch-root.c | 1 - src/shutdown/meson.build | 1 + src/sysusers/meson.build | 1 + src/test/meson.build | 12 +- src/test/test-seccomp.c | 1 - src/tmpfiles/meson.build | 1 + 68 files changed, 494 insertions(+), 327 deletions(-) delete mode 100644 src/basic/missing_syscall.h rename src/{basic/missing_bpf.h => include/override/linux/bpf.h} (90%) rename src/{basic/missing_keyctl.h => include/override/linux/keyctl.h} (90%) create mode 100644 src/include/override/signal.h create mode 100644 src/include/override/sys/bpf.h create mode 100644 src/include/override/sys/ioprio.h create mode 100644 src/include/override/sys/kcmp.h create mode 100644 src/include/override/sys/keyctl.h create mode 100644 src/include/override/sys/mempolicy.h create mode 100644 src/include/override/sys/quota.h create mode 100644 src/include/override/sys/stat.h create mode 100644 src/include/override/unistd.h create mode 100644 src/libc/bpf.c create mode 100644 src/libc/ioprio.c create mode 100644 src/libc/kcmp.c create mode 100644 src/libc/keyctl.c create mode 100644 src/libc/mempolicy.c create mode 100644 src/libc/meson.build create mode 100644 src/libc/mount.c create mode 100644 src/libc/pidfd.c create mode 100644 src/libc/quota.c create mode 100644 src/libc/sched.c create mode 100644 src/libc/signal.c create mode 100644 src/libc/stat.c create mode 100644 src/libc/unistd.c create mode 100644 src/libc/xattr.c diff --git a/meson.build b/meson.build index b97fe3aa41..f5362ece8a 100644 --- a/meson.build +++ b/meson.build @@ -580,7 +580,6 @@ foreach ident : [ ['fsconfig', '''#include '''], # since glibc-2.36 ['fsmount', '''#include '''], # since glibc-2.36 ['fsopen', '''#include '''], # since glibc-2.36 - ['fspick', '''#include '''], # since glibc-2.36 ['mount_setattr', '''#include '''], # since glibc-2.36 ['move_mount', '''#include '''], # since glibc-2.36 ['open_tree', '''#include '''], # since glibc-2.36 @@ -591,15 +590,17 @@ foreach ident : [ ['ioprio_get', '''#include '''], # no known header declares ioprio_get ['ioprio_set', '''#include '''], # no known header declares ioprio_set ['rt_tgsigqueueinfo', '''#include '''], # no known header declares rt_tgsigqueueinfo + ['open_tree_attr', '''#include '''], # no known header declares open_tree_attr ['quotactl_fd', '''#include '''], # no known header declares quotactl_fd ['fchmodat2', '''#include '''], # no known header declares fchmodat2 ['bpf', '''#include '''], # no known header declares bpf ['kcmp', '''#include '''], # no known header declares kcmp ['keyctl', '''#include '''], # no known header declares keyctl - ['pivot_root', '''#include '''], # no known header declares pivot_root + ['add_key', '''#include '''], # no known header declares add_key + ['request_key', '''#include '''], # no known header declares request_key ['setxattrat', '''#include '''], # no known header declares setxattrat ['removexattrat', '''#include '''], # no known header declares removexattrat - ['open_tree_attr', '''#include '''], # no known header declares open_tree_attr + ['pivot_root', '''#include '''], # no known header declares pivot_root ] have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE') @@ -2057,6 +2058,7 @@ includes = [libsystemd_includes, include_directories('src/shared')] subdir('po') subdir('catalog') subdir('src/include') +subdir('src/libc') subdir('src/fundamental') subdir('src/basic') subdir('src/libsystemd') @@ -2072,7 +2074,8 @@ libsystemd = shared_library( # Make sure our library is never deleted from memory, so that our open logging fds don't leak on dlopen/dlclose cycles. '-z', 'nodelete', '-Wl,--version-script=' + libsystemd_sym_path], - link_with : [libbasic_static], + link_with : [libc_wrapper_static, + libbasic_static], link_whole : [libsystemd_static], dependencies : [librt, threads, @@ -2085,6 +2088,7 @@ libsystemd = shared_library( if static_libsystemd != 'false' install_libsystemd_static = static_library( 'systemd', + libc_wrapper_sources, libsystemd_sources, basic_sources, fundamental_sources, @@ -2130,6 +2134,7 @@ libudev = shared_library( if static_libudev != 'false' install_libudev_static = static_library( 'udev', + libc_wrapper_sources, basic_sources, fundamental_sources, shared_sources, @@ -2234,6 +2239,7 @@ nss_template = { # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned 'link_args' : ['-z', 'nodelete'], 'link_with' : [ + libc_wrapper_static, libsystemd_static, libshared_static, libbasic_static, diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c index 9cfaf8a849..a6118b4247 100644 --- a/src/basic/fd-util.c +++ b/src/basic/fd-util.c @@ -2,8 +2,8 @@ #include #include -#include #include +#include #include #include #include @@ -16,7 +16,6 @@ #include "format-util.h" #include "fs-util.h" #include "log.h" -#include "missing_syscall.h" #include "mountpoint-util.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 3a3b09776a..9fb6f5d0b8 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -16,7 +16,6 @@ #include "label.h" #include "lock-util.h" #include "log.h" -#include "missing_syscall.h" #include "mkdir.h" #include "path-util.h" #include "process-util.h" diff --git a/src/basic/keyring-util.c b/src/basic/keyring-util.c index 6bfc5e38f6..4158537bd4 100644 --- a/src/basic/keyring-util.c +++ b/src/basic/keyring-util.c @@ -3,7 +3,6 @@ #include "alloc-util.h" #include "keyring-util.h" #include "log.h" -#include "missing_syscall.h" int keyring_read(key_serial_t serial, void **ret, size_t *ret_size) { size_t bufsize = 100; diff --git a/src/basic/keyring-util.h b/src/basic/keyring-util.h index a949f8907e..b8a36a9ad6 100644 --- a/src/basic/keyring-util.h +++ b/src/basic/keyring-util.h @@ -1,8 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include /* IWYU pragma: export */ + #include "forward.h" -#include "missing_keyctl.h" /* Like TAKE_PTR() but for key_serial_t, resetting them to -1 */ #define TAKE_KEY_SERIAL(key_serial) TAKE_GENERIC(key_serial, key_serial_t, -1) diff --git a/src/basic/missing_syscall.h b/src/basic/missing_syscall.h deleted file mode 100644 index 994bda9a3e..0000000000 --- a/src/basic/missing_syscall.h +++ /dev/null @@ -1,244 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ -#pragma once - -/* Missing glibc definitions to access certain kernel APIs */ - -#include -#include -#include -#include -#include -#include - -#include "forward.h" -#include "missing_keyctl.h" - -/* ======================================================================= */ - -#if !HAVE_FCHMODAT2 -/* since kernel v6.6 (78252deb023cf0879256fcfbafe37022c390762b) */ -static inline int missing_fchmodat2(int dirfd, const char *path, mode_t mode, int flags) { - return syscall(__NR_fchmodat2, dirfd, path, mode, flags); -} - -# define fchmodat2 missing_fchmodat2 -#endif - -/* ======================================================================= */ - -#if !HAVE_PIVOT_ROOT -static inline int missing_pivot_root(const char *new_root, const char *put_old) { - return syscall(__NR_pivot_root, new_root, put_old); -} - -# define pivot_root missing_pivot_root -#endif - -/* ======================================================================= */ - -#if !HAVE_IOPRIO_GET -static inline int missing_ioprio_get(int which, int who) { - return syscall(__NR_ioprio_get, which, who); -} - -# define ioprio_get missing_ioprio_get -#endif - -/* ======================================================================= */ - -#if !HAVE_IOPRIO_SET -static inline int missing_ioprio_set(int which, int who, int ioprio) { - return syscall(__NR_ioprio_set, which, who, ioprio); -} - -# define ioprio_set missing_ioprio_set -#endif - -/* ======================================================================= */ - -#if !HAVE_KCMP -static inline int missing_kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) { - return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2); -} - -# define kcmp missing_kcmp -#endif - -/* ======================================================================= */ - -#if !HAVE_KEYCTL -static inline long missing_keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) { - return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5); - -# define keyctl missing_keyctl -} - -/* ======================================================================= */ - -static inline key_serial_t missing_add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) { - return syscall(__NR_add_key, type, description, payload, plen, ringid); - -# define add_key missing_add_key -} - -/* ======================================================================= */ - -static inline key_serial_t missing_request_key(const char *type, const char *description, const char * callout_info, key_serial_t destringid) { - return syscall(__NR_request_key, type, description, callout_info, destringid); - -# define request_key missing_request_key -} -#endif - -/* ======================================================================= */ - -#if !HAVE_BPF -union bpf_attr; - -static inline int missing_bpf(int cmd, union bpf_attr *attr, size_t size) { - return (int) syscall(__NR_bpf, cmd, attr, size); -} - -# define bpf missing_bpf -#endif - -/* ======================================================================= */ - -#if !HAVE_SET_MEMPOLICY -static inline long missing_set_mempolicy(int mode, const unsigned long *nodemask, - unsigned long maxnode) { - return syscall(__NR_set_mempolicy, mode, nodemask, maxnode); -} - -# define set_mempolicy missing_set_mempolicy -#endif - -#if !HAVE_GET_MEMPOLICY -static inline long missing_get_mempolicy(int *mode, unsigned long *nodemask, - unsigned long maxnode, void *addr, - unsigned long flags) { - return syscall(__NR_get_mempolicy, mode, nodemask, maxnode, addr, flags); -} - -# define get_mempolicy missing_get_mempolicy -#endif - -/* ======================================================================= */ - -#if !HAVE_PIDFD_SEND_SIGNAL -/* since kernel v5.1 (3eb39f47934f9d5a3027fe00d906a45fe3a15fad) */ -static inline int missing_pidfd_send_signal(int fd, int sig, siginfo_t *info, unsigned flags) { - return syscall(__NR_pidfd_send_signal, fd, sig, info, flags); -} - -# define pidfd_send_signal missing_pidfd_send_signal -#endif - -/* ======================================================================= */ - -#if !HAVE_PIDFD_OPEN -/* since kernel v5.3 (7615d9e1780e26e0178c93c55b73309a5dc093d7) */ -static inline int missing_pidfd_open(pid_t pid, unsigned flags) { - return syscall(__NR_pidfd_open, pid, flags); -} - -# define pidfd_open missing_pidfd_open -#endif - -/* ======================================================================= */ - -#if !HAVE_RT_TGSIGQUEUEINFO -static inline int missing_rt_tgsigqueueinfo(pid_t tgid, pid_t tid, int sig, siginfo_t *info) { - return syscall(__NR_rt_tgsigqueueinfo, tgid, tid, sig, info); -} - -# define rt_tgsigqueueinfo missing_rt_tgsigqueueinfo -#endif - -/* ======================================================================= */ - -#if !HAVE_EXECVEAT -/* since kernel v3.19 (51f39a1f0cea1cacf8c787f652f26dfee9611874) */ -static inline int missing_execveat(int dirfd, const char *pathname, - char *const argv[], char *const envp[], - int flags) { - return syscall(__NR_execveat, dirfd, pathname, argv, envp, flags); -} - -# define execveat missing_execveat -#endif - -/* ======================================================================= */ - -#if !HAVE_CLOSE_RANGE -/* since kernel v5.9 (9b4feb630e8e9801603f3cab3a36369e3c1cf88d) */ -static inline int missing_close_range(unsigned first_fd, unsigned end_fd, unsigned flags) { - /* Kernel-side the syscall expects fds as unsigned integers (just like close() actually), while - * userspace exclusively uses signed integers for fds. glibc chose to expose it 1:1 however, hence we - * do so here too, even if we end up passing signed fds to it most of the time. */ - return syscall(__NR_close_range, - first_fd, - end_fd, - flags); -} - -# define close_range missing_close_range -#endif - -/* ======================================================================= */ - -#if !HAVE_SCHED_SETATTR -/* since kernel 3.14 (e6cfc0295c7d51b008999a8b13a44fb43f8685ea) */ -static inline ssize_t missing_sched_setattr(pid_t pid, struct sched_attr *attr, unsigned int flags) { - return syscall(__NR_sched_setattr, pid, attr, flags); -} - -# define sched_setattr missing_sched_setattr -#endif - -/* ======================================================================= */ - -/* glibc does not provide clone() on ia64, only clone2(). Not only that, but it also doesn't provide a - * prototype, only the symbol in the shared library (it provides a prototype for clone(), but not the - * symbol in the shared library). */ -#if defined(__ia64__) -int __clone2(int (*fn)(void *), void *stack_base, size_t stack_size, int flags, void *arg); -#define HAVE_CLONE 0 -#else -/* We know that everywhere else clone() is available, so we don't bother with a meson check (that takes time - * at build time) and just define it. Once the kernel drops ia64 support, we can drop this too. */ -#define HAVE_CLONE 1 -#endif - -/* ======================================================================= */ - -#if !HAVE_QUOTACTL_FD -/* since kernel v5.14 (64c2c2c62f92339b176ea24403d8db16db36f9e6) */ -static inline int missing_quotactl_fd(int fd, int cmd, int id, void *addr) { - return syscall(__NR_quotactl_fd, fd, cmd, id, addr); -} - -# define quotactl_fd missing_quotactl_fd -#endif - -/* ======================================================================= */ - -#if !HAVE_SETXATTRAT -/* since kernel v6.13 (6140be90ec70c39fa844741ca3cc807dd0866394) */ -static inline int missing_setxattrat(int fd, const char *path, int at_flags, const char *name, const struct xattr_args *args, size_t size) { - return syscall(__NR_setxattrat, fd, path, at_flags, name, args, size); -} - -# define setxattrat missing_setxattrat -#endif - -/* ======================================================================= */ - -#if !HAVE_REMOVEXATTRAT -/* since kernel v6.13 (6140be90ec70c39fa844741ca3cc807dd0866394) */ -static inline int missing_removexattrat(int fd, const char *path, int at_flags, const char *name) { - return syscall(__NR_removexattrat, fd, path, at_flags, name); -} - -# define removexattrat missing_removexattrat -#endif diff --git a/src/basic/pidfd-util.h b/src/basic/pidfd-util.h index 0cc247ced1..811d40dce9 100644 --- a/src/basic/pidfd-util.h +++ b/src/basic/pidfd-util.h @@ -4,7 +4,6 @@ #include /* IWYU pragma: export */ #include "forward.h" -#include "missing_syscall.h" /* IWYU pragma: export */ int pidfd_get_namespace(int fd, unsigned long ns_type_cmd); diff --git a/src/basic/process-util.c b/src/basic/process-util.c index 1d341aa0a7..de97843816 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -34,7 +34,6 @@ #include "locale-util.h" #include "log.h" #include "memory-util.h" -#include "missing_syscall.h" #include "mountpoint-util.h" #include "namespace-util.h" #include "nulstr-util.h" diff --git a/src/basic/signal-util.c b/src/basic/signal-util.c index 5a14046f01..459328a3c7 100644 --- a/src/basic/signal-util.c +++ b/src/basic/signal-util.c @@ -4,7 +4,6 @@ #include #include "errno-util.h" -#include "missing_syscall.h" #include "parse-util.h" #include "signal-util.h" #include "stdio-util.h" diff --git a/src/basic/xattr-util.c b/src/basic/xattr-util.c index 15072add78..1bde725d1a 100644 --- a/src/basic/xattr-util.c +++ b/src/basic/xattr-util.c @@ -8,7 +8,6 @@ #include "errno-util.h" #include "fd-util.h" #include "fs-util.h" -#include "missing_syscall.h" #include "nulstr-util.h" #include "parse-util.h" #include "sparse-endian.h" diff --git a/src/core/bpf-devices.c b/src/core/bpf-devices.c index 7e6a1d15a4..ef8ba3d572 100644 --- a/src/core/bpf-devices.c +++ b/src/core/bpf-devices.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include @@ -12,7 +13,6 @@ #include "fd-util.h" #include "fileio.h" #include "log.h" -#include "missing_bpf.h" #include "nulstr-util.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/core/exec-invoke.c b/src/core/exec-invoke.c index 3853aef4af..771308848a 100644 --- a/src/core/exec-invoke.c +++ b/src/core/exec-invoke.c @@ -1,13 +1,14 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include -#include #include #include #include #include #include #include +#include +#include #include #include #include @@ -54,7 +55,6 @@ #include "journal-send.h" #include "manager.h" #include "memfd-util.h" -#include "missing_syscall.h" #include "mkdir-label.h" #include "mount-util.h" #include "namespace-util.h" diff --git a/src/core/meson.build b/src/core/meson.build index 067ecee303..991c3bb0d1 100644 --- a/src/core/meson.build +++ b/src/core/meson.build @@ -181,6 +181,7 @@ executor_libs = get_option('link-executor-shared') ? \ libcore, libshared, ] : [ + libc_wrapper_static, libcore_static, libshared_static, libbasic_static, diff --git a/src/home/homework-fscrypt.c b/src/home/homework-fscrypt.c index 8a3bb27655..bfcfb6774f 100644 --- a/src/home/homework-fscrypt.c +++ b/src/home/homework-fscrypt.c @@ -22,8 +22,6 @@ #include "keyring-util.h" #include "log.h" #include "memory-util.h" -#include "missing_keyctl.h" -#include "missing_syscall.h" #include "mkdir.h" #include "mount-util.h" #include "nulstr-util.h" diff --git a/src/home/homework-luks.c b/src/home/homework-luks.c index 326f941312..5c6bd28088 100644 --- a/src/home/homework-luks.c +++ b/src/home/homework-luks.c @@ -46,7 +46,6 @@ #include "loop-util.h" #include "memory-util.h" #include "missing_magic.h" -#include "missing_syscall.h" #include "mkdir.h" #include "mkfs-util.h" #include "openssl-util.h" diff --git a/src/home/homework-password-cache.c b/src/home/homework-password-cache.c index cd497b46e7..fb205153bc 100644 --- a/src/home/homework-password-cache.c +++ b/src/home/homework-password-cache.c @@ -4,7 +4,6 @@ #include "homework-password-cache.h" #include "keyring-util.h" #include "log.h" -#include "missing_syscall.h" #include "string-util.h" #include "user-record.h" diff --git a/src/home/homework.c b/src/home/homework.c index 57a7b77344..1056d27b8b 100644 --- a/src/home/homework.c +++ b/src/home/homework.c @@ -36,7 +36,6 @@ #include "main-func.h" #include "memory-util.h" #include "missing_magic.h" -#include "missing_syscall.h" #include "mount-util.h" #include "path-util.h" #include "recovery-key.h" diff --git a/src/home/homework.h b/src/home/homework.h index abd1c482da..2060d15827 100644 --- a/src/home/homework.h +++ b/src/home/homework.h @@ -2,11 +2,11 @@ #pragma once #include +#include #include "sd-id128.h" #include "homework-forward.h" -#include "missing_keyctl.h" #include "user-record-util.h" typedef struct HomeSetup { diff --git a/src/basic/missing_bpf.h b/src/include/override/linux/bpf.h similarity index 90% rename from src/basic/missing_bpf.h rename to src/include/override/linux/bpf.h index 968bcdfb2d..f33c748fde 100644 --- a/src/basic/missing_bpf.h +++ b/src/include/override/linux/bpf.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include /* IWYU pragma: export */ +#include_next /* IWYU pragma: export */ /* defined in linux/filter.h */ /* Unconditional jumps, goto pc + off16 */ diff --git a/src/basic/missing_keyctl.h b/src/include/override/linux/keyctl.h similarity index 90% rename from src/basic/missing_keyctl.h rename to src/include/override/linux/keyctl.h index 8a9c82b9b4..1f0988371a 100644 --- a/src/basic/missing_keyctl.h +++ b/src/include/override/linux/keyctl.h @@ -1,9 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include /* IWYU pragma: export */ +#include_next /* IWYU pragma: export */ -#include "forward.h" +#include /* From linux/key.h */ #ifndef KEY_POS_VIEW @@ -42,5 +42,5 @@ typedef int32_t key_serial_t; # define KEY_OTH_SETATTR 0x00000020 # define KEY_OTH_ALL 0x0000003f #else -assert_cc(KEY_OTH_ALL == 0x0000003f); +static_assert(KEY_OTH_ALL == 0x0000003f, ""); #endif diff --git a/src/include/override/sched.h b/src/include/override/sched.h index 41c830e26b..f2748b1608 100644 --- a/src/include/override/sched.h +++ b/src/include/override/sched.h @@ -35,3 +35,22 @@ static_assert(PF_KTHREAD == 0x00200000, ""); #else static_assert(TASK_COMM_LEN == 16, ""); #endif + +/* glibc does not provide clone() on ia64, only clone2(). Not only that, but it also doesn't provide a + * prototype, only the symbol in the shared library (it provides a prototype for clone(), but not the + * symbol in the shared library). */ +#if defined(__ia64__) +int __clone2(int (*fn)(void *), void *stack_base, size_t stack_size, int flags, void *arg); +#define HAVE_CLONE 0 +#else +/* We know that everywhere else clone() is available, so we don't bother with a meson check (that takes time + * at build time) and just define it. Once the kernel drops ia64 support, we can drop this too. */ +#define HAVE_CLONE 1 +#endif + +/* Defined since glibc-2.41. + * Supported since kernel 3.14 (e6cfc0295c7d51b008999a8b13a44fb43f8685ea). */ +#if !HAVE_SCHED_SETATTR +int missing_sched_setattr(pid_t pid, struct sched_attr *attr, unsigned flags); +# define sched_setattr missing_sched_setattr +#endif diff --git a/src/include/override/signal.h b/src/include/override/signal.h new file mode 100644 index 0000000000..83aa18dc8f --- /dev/null +++ b/src/include/override/signal.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include_next + +#if !HAVE_RT_TGSIGQUEUEINFO +int missing_rt_tgsigqueueinfo(pid_t tgid, pid_t tid, int sig, siginfo_t *info); +# define rt_tgsigqueueinfo missing_rt_tgsigqueueinfo +#endif diff --git a/src/include/override/sys/bpf.h b/src/include/override/sys/bpf.h new file mode 100644 index 0000000000..56e1466b89 --- /dev/null +++ b/src/include/override/sys/bpf.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include /* IWYU pragma: export */ +#include + +/* Supported since kernel v3.18 (749730ce42a2121e1c88350d69478bff3994b10a). */ +#if !HAVE_BPF +int missing_bpf(int cmd, union bpf_attr *attr, size_t size); +# define bpf missing_bpf +#endif diff --git a/src/include/override/sys/ioprio.h b/src/include/override/sys/ioprio.h new file mode 100644 index 0000000000..c361eba6e6 --- /dev/null +++ b/src/include/override/sys/ioprio.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include /* IWYU pragma: export */ + +#if !HAVE_IOPRIO_GET +int missing_ioprio_get(int which, int who); +# define ioprio_get missing_ioprio_get +#endif + +#if !HAVE_IOPRIO_SET +int missing_ioprio_set(int which, int who, int ioprio); +# define ioprio_set missing_ioprio_set +#endif diff --git a/src/include/override/sys/kcmp.h b/src/include/override/sys/kcmp.h new file mode 100644 index 0000000000..4e47825ac5 --- /dev/null +++ b/src/include/override/sys/kcmp.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include /* IWYU pragma: export */ +#include + +/* Supported since kernel v3.5 (d97b46a64674a267bc41c9e16132ee2a98c3347d). */ +#if !HAVE_KCMP +int missing_kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2); +# define kcmp missing_kcmp +#endif diff --git a/src/include/override/sys/keyctl.h b/src/include/override/sys/keyctl.h new file mode 100644 index 0000000000..88c9c40ea7 --- /dev/null +++ b/src/include/override/sys/keyctl.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include /* IWYU pragma: export */ +#include + +#if !HAVE_KEYCTL +long missing_keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5); +# define keyctl missing_keyctl +#endif + +#if !HAVE_ADD_KEY +key_serial_t missing_add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid); +# define add_key missing_add_key +#endif + +#if !HAVE_REQUEST_KEY +key_serial_t missing_request_key(const char *type, const char *description, const char *callout_info, key_serial_t destringid); +# define request_key missing_request_key +#endif diff --git a/src/include/override/sys/mempolicy.h b/src/include/override/sys/mempolicy.h new file mode 100644 index 0000000000..9858f2812b --- /dev/null +++ b/src/include/override/sys/mempolicy.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include /* IWYU pragma: export */ + +#if !HAVE_SET_MEMPOLICY +int missing_set_mempolicy(int mode, const unsigned long *nodemask, unsigned long maxnode); +# define set_mempolicy missing_set_mempolicy +#endif + +#if !HAVE_GET_MEMPOLICY +int missing_get_mempolicy(int *mode, unsigned long *nodemask, unsigned long maxnode, void *addr, unsigned long flags); +# define get_mempolicy missing_get_mempolicy +#endif diff --git a/src/include/override/sys/mount.h b/src/include/override/sys/mount.h index 050c23cc6a..33a843b8f4 100644 --- a/src/include/override/sys/mount.h +++ b/src/include/override/sys/mount.h @@ -8,8 +8,6 @@ #include #include #include -#include -#include /* Since glibc-2.37 (774058d72942249f71d74e7f2b639f77184160a6), sys/mount.h includes linux/mount.h, and * we can safely include both headers in the same source file. However, we cannot do that with older glibc. @@ -41,67 +39,56 @@ extern int umount2(const char *__special_file, int __flags) __THROW; /* Open the filesystem referenced by FS_NAME so it can be configured for mouting. */ +/* Defined since glibc-2.36. + * Supported since kernel v5.2 (24dcb3d90a1f67fe08c68a004af37df059d74005). */ #if HAVE_FSOPEN extern int fsopen(const char *__fs_name, unsigned int __flags) __THROW; #else -static inline int missing_fsopen(const char *fsname, unsigned flags) { - return syscall(__NR_fsopen, fsname, flags); -} +int missing_fsopen(const char *fsname, unsigned flags); # define fsopen missing_fsopen #endif /* Create a mount representation for the FD created by fsopen using FLAGS with ATTR_FLAGS describing how the mount is to be performed. */ +/* Defined since glibc-2.36. + * Supported since kernel v5.2 (93766fbd2696c2c4453dd8e1070977e9cd4e6b6d). */ #if HAVE_FSMOUNT extern int fsmount(int __fd, unsigned int __flags, unsigned int __ms_flags) __THROW; #else -static inline int missing_fsmount(int fd, unsigned flags, unsigned ms_flags) { - return syscall(__NR_fsmount, fd, flags, ms_flags); -} +int missing_fsmount(int fd, unsigned flags, unsigned ms_flags); # define fsmount missing_fsmount #endif /* Add the mounted FROM_DFD referenced by FROM_PATHNAME filesystem returned by fsmount in the hierarchy in the place TO_DFD reference by TO_PATHNAME using FLAGS. */ +/* Defined since glibc-2.36. + * Supported since kernel v5.2 (2db154b3ea8e14b04fee23e3fdfd5e9d17fbc6ae). */ #if HAVE_MOVE_MOUNT extern int move_mount(int __from_dfd, const char *__from_pathname, int __to_dfd, const char *__to_pathname, unsigned int flags) __THROW; #else -static inline int missing_move_mount( - int from_dfd, - const char *from_pathname, - int to_dfd, - const char *to_pathname, - unsigned flags) { - - return syscall(__NR_move_mount, from_dfd, from_pathname, to_dfd, to_pathname, flags); -} +int missing_move_mount(int from_dfd, const char *from_pathname, int to_dfd, const char *to_pathname, unsigned flags); # define move_mount missing_move_mount #endif /* Set parameters and trigger CMD action on the FD context. KEY, VALUE, and AUX are used depending ng of the CMD. */ +/* Defined since glibc-2.36. + * Supported since kernel v5.2 (ecdab150fddb42fe6a739335257949220033b782). */ #if HAVE_FSCONFIG extern int fsconfig(int __fd, unsigned int __cmd, const char *__key, const void *__value, int __aux) __THROW; #else -static inline int missing_fsconfig(int fd, unsigned cmd, const char *key, const void *value, int aux) { - return syscall(__NR_fsconfig, fd, cmd, key, value, aux); -} +int missing_fsconfig(int fd, unsigned cmd, const char *key, const void *value, int aux); # define fsconfig missing_fsconfig #endif -/* Equivalent of fopen for an existing mount point. */ -#if HAVE_FSPICK -extern int fspick(int __dfd, const char *__path, unsigned int __flags) __THROW; -#endif - /* Open the mount point FILENAME in directory DFD using FLAGS. */ +/* Defined since glibc-2.36. + * Supported since kernel v5.2 (a07b20004793d8926f78d63eb5980559f7813404). */ #if HAVE_OPEN_TREE extern int open_tree(int __dfd, const char *__filename, unsigned int __flags) __THROW; #else -static inline int missing_open_tree(int dfd, const char *filename, unsigned flags) { - return syscall(__NR_open_tree, dfd, filename, flags); -} +int missing_open_tree(int dfd, const char *filename, unsigned flags); # define open_tree missing_open_tree #endif @@ -110,21 +97,20 @@ static inline int missing_open_tree(int dfd, const char *filename, unsigned flag directory referred to by the file descriptor dirfd. Otherwise if DFD is the special value AT_FDCWD then PATH is interpreted relative to the current working directory of the calling process. */ +/* Defined since glibc-2.36. + * Supported since kernel v5.12 (2a1867219c7b27f928e2545782b86daaf9ad50bd). */ #if HAVE_MOUNT_SETATTR extern int mount_setattr(int __dfd, const char *__path, unsigned int __flags, struct mount_attr *__uattr, size_t __usize) __THROW; #else -static inline int missing_mount_setattr(int dfd, const char *path, unsigned flags, struct mount_attr *attr, size_t size) { - return syscall(__NR_mount_setattr, dfd, path, flags, attr, size); -} +int missing_mount_setattr(int dfd, const char *path, unsigned flags, struct mount_attr *attr, size_t size); # define mount_setattr missing_mount_setattr #endif +/* Not defined in glibc yet as of glibc-2.41. + * Supported since kernel v6.15 (c4a16820d90199409c9bf01c4f794e1e9e8d8fd8). */ #if HAVE_OPEN_TREE_ATTR extern int open_tree_attr(int __dfd, const char *__filename, unsigned int __flags, struct mount_attr *__uattr, size_t __usize) __THROW; #else -static inline int missing_open_tree_attr(int dfd, const char *filename, unsigned int flags, struct mount_attr *attr, size_t size) { - return syscall(__NR_open_tree_attr, dfd, filename, flags, attr, size); -} - +int missing_open_tree_attr(int dfd, const char *filename, unsigned int flags, struct mount_attr *attr, size_t size); # define open_tree_attr missing_open_tree_attr #endif diff --git a/src/include/override/sys/pidfd.h b/src/include/override/sys/pidfd.h index de13144524..69eb2eaff9 100644 --- a/src/include/override/sys/pidfd.h +++ b/src/include/override/sys/pidfd.h @@ -1,14 +1,29 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include -#include - /* since glibc-2.36 */ #if HAVE_PIDFD_OPEN #include_next #endif +#include +#include +#include + +/* Defined since glibc-2.36. + * Supported since kernel v5.3 (7615d9e1780e26e0178c93c55b73309a5dc093d7). */ +#if !HAVE_PIDFD_OPEN +int missing_pidfd_open(pid_t pid, unsigned flags); +# define pidfd_open missing_pidfd_open +#endif + +/* Defined since glibc-2.36. + * Supported since kernel v5.1 (3eb39f47934f9d5a3027fe00d906a45fe3a15fad). */ +#if !HAVE_PIDFD_SEND_SIGNAL +int missing_pidfd_send_signal(int fd, int sig, siginfo_t *info, unsigned flags); +# define pidfd_send_signal missing_pidfd_send_signal +#endif + /* since glibc-2.41 */ #ifndef PIDFS_IOCTL_MAGIC # define PIDFS_IOCTL_MAGIC 0xFF diff --git a/src/include/override/sys/quota.h b/src/include/override/sys/quota.h new file mode 100644 index 0000000000..481dbaba21 --- /dev/null +++ b/src/include/override/sys/quota.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include_next + +/* Supported since kernel v5.14 (64c2c2c62f92339b176ea24403d8db16db36f9e6). */ +#if !HAVE_QUOTACTL_FD +int missing_quotactl_fd(int fd, int cmd, int id, void *addr); +# define quotactl_fd missing_quotactl_fd +#endif diff --git a/src/include/override/sys/stat.h b/src/include/override/sys/stat.h new file mode 100644 index 0000000000..37793cff19 --- /dev/null +++ b/src/include/override/sys/stat.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include_next + +/* Supported since kernel v6.6 (78252deb023cf0879256fcfbafe37022c390762b). */ +#if !HAVE_FCHMODAT2 +int missing_fchmodat2(int dirfd, const char *path, mode_t mode, int flags); +# define fchmodat2 missing_fchmodat2 +#endif diff --git a/src/include/override/sys/xattr.h b/src/include/override/sys/xattr.h index 96534832ce..711c5387c1 100644 --- a/src/include/override/sys/xattr.h +++ b/src/include/override/sys/xattr.h @@ -6,3 +6,15 @@ #include #include_next + +/* Supported since kernel v6.13 (6140be90ec70c39fa844741ca3cc807dd0866394). */ +#if !HAVE_SETXATTRAT +int missing_setxattrat(int fd, const char *path, int at_flags, const char *name, const struct xattr_args *args, size_t size); +# define setxattrat missing_setxattrat +#endif + +/* Supported since kernel v6.13 (6140be90ec70c39fa844741ca3cc807dd0866394). */ +#if !HAVE_REMOVEXATTRAT +int missing_removexattrat(int fd, const char *path, int at_flags, const char *name); +# define removexattrat missing_removexattrat +#endif diff --git a/src/include/override/unistd.h b/src/include/override/unistd.h new file mode 100644 index 0000000000..d381f06a53 --- /dev/null +++ b/src/include/override/unistd.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include_next + +/* Defined since glibc-2.34. + * Supported since kernel v5.9 (9b4feb630e8e9801603f3cab3a36369e3c1cf88d). */ +#if !HAVE_CLOSE_RANGE +int missing_close_range(unsigned first_fd, unsigned end_fd, unsigned flags); +# define close_range missing_close_range +#endif + +/* Defined since glibc-2.34. + * Supported since kernel v3.19 (51f39a1f0cea1cacf8c787f652f26dfee9611874). */ +#if !HAVE_EXECVEAT +int missing_execveat(int dirfd, const char *pathname, char * const argv[], char * const envp[], int flags); +# define execveat missing_execveat +#endif + +#if !HAVE_PIVOT_ROOT +int missing_pivot_root(const char *new_root, const char *put_old); +# define pivot_root missing_pivot_root +#endif diff --git a/src/libc/bpf.c b/src/libc/bpf.c new file mode 100644 index 0000000000..4a7498e502 --- /dev/null +++ b/src/libc/bpf.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_BPF +int missing_bpf(int cmd, union bpf_attr *attr, size_t size) { + return syscall(__NR_bpf, cmd, attr, size); +} +#endif diff --git a/src/libc/ioprio.c b/src/libc/ioprio.c new file mode 100644 index 0000000000..5bb640457d --- /dev/null +++ b/src/libc/ioprio.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_IOPRIO_GET +int missing_ioprio_get(int which, int who) { + return syscall(__NR_ioprio_get, which, who); +} +#endif + +#if !HAVE_IOPRIO_SET +int missing_ioprio_set(int which, int who, int ioprio) { + return syscall(__NR_ioprio_set, which, who, ioprio); +} +#endif diff --git a/src/libc/kcmp.c b/src/libc/kcmp.c new file mode 100644 index 0000000000..aafff999ef --- /dev/null +++ b/src/libc/kcmp.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_KCMP +int missing_kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) { + return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2); +} +#endif diff --git a/src/libc/keyctl.c b/src/libc/keyctl.c new file mode 100644 index 0000000000..af4bca87f5 --- /dev/null +++ b/src/libc/keyctl.c @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_KEYCTL +long missing_keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) { + return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5); +} +#endif + +#if !HAVE_ADD_KEY +key_serial_t missing_add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) { + return syscall(__NR_add_key, type, description, payload, plen, ringid); +} +#endif + +#if !HAVE_REQUEST_KEY +key_serial_t missing_request_key(const char *type, const char *description, const char *callout_info, key_serial_t destringid) { + return syscall(__NR_request_key, type, description, callout_info, destringid); +} +#endif diff --git a/src/libc/mempolicy.c b/src/libc/mempolicy.c new file mode 100644 index 0000000000..77b0e1ac01 --- /dev/null +++ b/src/libc/mempolicy.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_SET_MEMPOLICY +int missing_set_mempolicy(int mode, const unsigned long *nodemask, unsigned long maxnode) { + return syscall(__NR_set_mempolicy, mode, nodemask, maxnode); +} +#endif + +#if !HAVE_GET_MEMPOLICY +int missing_get_mempolicy(int *mode, unsigned long *nodemask, unsigned long maxnode, void *addr, unsigned long flags) { + return syscall(__NR_get_mempolicy, mode, nodemask, maxnode, addr, flags); +} +#endif diff --git a/src/libc/meson.build b/src/libc/meson.build new file mode 100644 index 0000000000..eeee98c9d6 --- /dev/null +++ b/src/libc/meson.build @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +libc_wrapper_sources = files( + 'bpf.c', + 'ioprio.c', + 'kcmp.c', + 'keyctl.c', + 'mempolicy.c', + 'mount.c', + 'pidfd.c', + 'quota.c', + 'sched.c', + 'signal.c', + 'stat.c', + 'unistd.c', + 'xattr.c', +) + +sources += libc_wrapper_sources + +libc_wrapper_static = static_library( + 'c-wrapper', + libc_wrapper_sources, + include_directories : system_includes, + implicit_include_directories : false, + dependencies : [userspace], + c_args : ['-fvisibility=default'], + build_by_default : false) diff --git a/src/libc/mount.c b/src/libc/mount.c new file mode 100644 index 0000000000..1d324ef386 --- /dev/null +++ b/src/libc/mount.c @@ -0,0 +1,47 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_FSOPEN +int missing_fsopen(const char *fsname, unsigned flags) { + return syscall(__NR_fsopen, fsname, flags); +} +#endif + +#if !HAVE_FSMOUNT +int missing_fsmount(int fd, unsigned flags, unsigned ms_flags) { + return syscall(__NR_fsmount, fd, flags, ms_flags); +} +#endif + +#if !HAVE_MOVE_MOUNT +int missing_move_mount(int from_dfd, const char *from_pathname, int to_dfd, const char *to_pathname, unsigned flags) { + return syscall(__NR_move_mount, from_dfd, from_pathname, to_dfd, to_pathname, flags); +} +#endif + +#if !HAVE_FSCONFIG +int missing_fsconfig(int fd, unsigned cmd, const char *key, const void *value, int aux) { + return syscall(__NR_fsconfig, fd, cmd, key, value, aux); +} +#endif + +#if !HAVE_OPEN_TREE +int missing_open_tree(int dfd, const char *filename, unsigned flags) { + return syscall(__NR_open_tree, dfd, filename, flags); +} +#endif + +#if !HAVE_MOUNT_SETATTR +int missing_mount_setattr(int dfd, const char *path, unsigned flags, struct mount_attr *attr, size_t size) { + return syscall(__NR_mount_setattr, dfd, path, flags, attr, size); +} +#endif + +#if !HAVE_OPEN_TREE_ATTR +int missing_open_tree_attr(int dfd, const char *filename, unsigned int flags, struct mount_attr *attr, size_t size) { + return syscall(__NR_open_tree_attr, dfd, filename, flags, attr, size); +} +#endif diff --git a/src/libc/pidfd.c b/src/libc/pidfd.c new file mode 100644 index 0000000000..a779e3459c --- /dev/null +++ b/src/libc/pidfd.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_PIDFD_OPEN +int missing_pidfd_open(pid_t pid, unsigned flags) { + return syscall(__NR_pidfd_open, pid, flags); +} +#endif + +#if !HAVE_PIDFD_SEND_SIGNAL +int missing_pidfd_send_signal(int fd, int sig, siginfo_t *info, unsigned flags) { + return syscall(__NR_pidfd_send_signal, fd, sig, info, flags); +} +#endif diff --git a/src/libc/quota.c b/src/libc/quota.c new file mode 100644 index 0000000000..19695df9b3 --- /dev/null +++ b/src/libc/quota.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_QUOTACTL_FD +int missing_quotactl_fd(int fd, int cmd, int id, void *addr) { + return syscall(__NR_quotactl_fd, fd, cmd, id, addr); +} +#endif diff --git a/src/libc/sched.c b/src/libc/sched.c new file mode 100644 index 0000000000..cf1752651b --- /dev/null +++ b/src/libc/sched.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_SCHED_SETATTR +int missing_sched_setattr(pid_t pid, struct sched_attr *attr, unsigned flags) { + return syscall(__NR_sched_setattr, pid, attr, flags); +} +#endif diff --git a/src/libc/signal.c b/src/libc/signal.c new file mode 100644 index 0000000000..1908331b1a --- /dev/null +++ b/src/libc/signal.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_RT_TGSIGQUEUEINFO +int missing_rt_tgsigqueueinfo(pid_t tgid, pid_t tid, int sig, siginfo_t *info) { + return syscall(__NR_rt_tgsigqueueinfo, tgid, tid, sig, info); +} +#endif diff --git a/src/libc/stat.c b/src/libc/stat.c new file mode 100644 index 0000000000..b283005f40 --- /dev/null +++ b/src/libc/stat.c @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_FCHMODAT2 +int missing_fchmodat2(int dirfd, const char *path, mode_t mode, int flags) { + return syscall(__NR_fchmodat2, dirfd, path, mode, flags); +} +#endif diff --git a/src/libc/unistd.c b/src/libc/unistd.c new file mode 100644 index 0000000000..99777b3316 --- /dev/null +++ b/src/libc/unistd.c @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include + +#if !HAVE_CLOSE_RANGE +int missing_close_range(unsigned first_fd, unsigned end_fd, unsigned flags) { + /* Kernel-side the syscall expects fds as unsigned integers (just like close() actually), while + * userspace exclusively uses signed integers for fds. glibc chose to expose it 1:1 however, hence we + * do so here too, even if we end up passing signed fds to it most of the time. */ + return syscall(__NR_close_range, first_fd, end_fd, flags); +} +#endif + +#if !HAVE_EXECVEAT +int missing_execveat(int dirfd, const char *pathname, char * const argv[], char * const envp[], int flags) { + return syscall(__NR_execveat, dirfd, pathname, argv, envp, flags); +} +#endif + +#if !HAVE_PIVOT_ROOT +int missing_pivot_root(const char *new_root, const char *put_old) { + return syscall(__NR_pivot_root, new_root, put_old); +} +#endif diff --git a/src/libc/xattr.c b/src/libc/xattr.c new file mode 100644 index 0000000000..68fa97ab28 --- /dev/null +++ b/src/libc/xattr.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include + +#if !HAVE_SETXATTRAT +int missing_setxattrat(int fd, const char *path, int at_flags, const char *name, const struct xattr_args *args, size_t size) { + return syscall(__NR_setxattrat, fd, path, at_flags, name, args, size); +} +#endif + +#if !HAVE_REMOVEXATTRAT +int missing_removexattrat(int fd, const char *path, int at_flags, const char *name) { + return syscall(__NR_removexattrat, fd, path, at_flags, name); +} +#endif diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build index 52c6cea3c5..fa483836fa 100644 --- a/src/libsystemd/meson.build +++ b/src/libsystemd/meson.build @@ -147,7 +147,8 @@ libsystemd_static = static_library( include_directories : libsystemd_includes, implicit_include_directories : false, c_args : libsystemd_c_args, - link_with : [libbasic_static], + link_with : [libc_wrapper_static, + libbasic_static], dependencies : [threads, libm, librt, diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c index 54fab9284a..d3838ba245 100644 --- a/src/libsystemd/sd-id128/sd-id128.c +++ b/src/libsystemd/sd-id128/sd-id128.c @@ -13,7 +13,6 @@ #include "hmac.h" #include "id128-util.h" #include "keyring-util.h" -#include "missing_syscall.h" #include "path-util.h" #include "random-util.h" #include "stat-util.h" diff --git a/src/login/pam_systemd_loadkey.c b/src/login/pam_systemd_loadkey.c index b1a9aed234..36b4b22552 100644 --- a/src/login/pam_systemd_loadkey.c +++ b/src/login/pam_systemd_loadkey.c @@ -7,7 +7,6 @@ #include #include "keyring-util.h" -#include "missing_syscall.h" #include "nulstr-util.h" #include "pam-util.h" #include "string-util.h" diff --git a/src/login/user-runtime-dir.c b/src/login/user-runtime-dir.c index 77498081ea..30ff2f47c5 100644 --- a/src/login/user-runtime-dir.c +++ b/src/login/user-runtime-dir.c @@ -16,7 +16,6 @@ #include "log.h" #include "main-func.h" #include "missing_magic.h" -#include "missing_syscall.h" #include "mkdir-label.h" #include "mount-util.h" #include "mountpoint-util.h" diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index dfca74b05e..4ccfab8a88 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -66,8 +67,6 @@ #include "loopback-setup.h" #include "machine-credential.h" #include "main-func.h" -#include "missing_keyctl.h" -#include "missing_syscall.h" #include "mkdir.h" #include "mount-util.h" #include "mountpoint-util.h" diff --git a/src/nsresourced/nsresourcework.c b/src/nsresourced/nsresourcework.c index 236d4d4acd..5f99eae4f9 100644 --- a/src/nsresourced/nsresourcework.c +++ b/src/nsresourced/nsresourcework.c @@ -31,7 +31,6 @@ #include "json-util.h" #include "main-func.h" #include "missing_magic.h" -#include "missing_syscall.h" #include "mountpoint-util.h" #include "namespace-util.h" #include "netlink-util.h" diff --git a/src/repart/meson.build b/src/repart/meson.build index 369410bab8..eda4a0a212 100644 --- a/src/repart/meson.build +++ b/src/repart/meson.build @@ -26,6 +26,7 @@ executables += [ 'sources' : files('repart.c'), 'c_args' : '-DSTANDALONE', 'link_with' : [ + libc_wrapper_static, libbasic_static, libshared_fdisk, libshared_static, diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c index 256605ac8a..dd6b8abc65 100644 --- a/src/shared/ask-password-api.c +++ b/src/shared/ask-password-api.c @@ -23,7 +23,6 @@ #include "iovec-util.h" #include "keyring-util.h" #include "log.h" -#include "missing_syscall.h" #include "nulstr-util.h" #include "parse-util.h" #include "path-lookup.h" diff --git a/src/shared/bpf-program.c b/src/shared/bpf-program.c index 5c4bea60c6..f920051832 100644 --- a/src/shared/bpf-program.c +++ b/src/shared/bpf-program.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "alloc-util.h" @@ -14,7 +15,6 @@ #include "fdset.h" #include "log.h" #include "memory-util.h" -#include "missing_syscall.h" #include "parse-util.h" #include "path-util.h" #include "serialize.h" diff --git a/src/shared/ioprio-util.h b/src/shared/ioprio-util.h index 0873d8ef61..468f178cd0 100644 --- a/src/shared/ioprio-util.h +++ b/src/shared/ioprio-util.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include /* IWYU pragma: export */ +#include /* IWYU pragma: export */ #include "forward.h" diff --git a/src/shared/meson.build b/src/shared/meson.build index dc509eeb28..2a49a5e9b8 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -360,7 +360,8 @@ libshared = shared_library( link_args : ['-shared', '-Wl,--version-script=' + libshared_sym_path], link_depends : libshared_sym_path, - link_whole : [libshared_static, + link_whole : [libc_wrapper_static, + libshared_static, libbasic_static, libsystemd_static], dependencies : [libshared_deps, diff --git a/src/shared/mount-util.c b/src/shared/mount-util.c index 3d10a05091..830ebe1c87 100644 --- a/src/shared/mount-util.c +++ b/src/shared/mount-util.c @@ -19,7 +19,6 @@ #include "hashmap.h" #include "libmount-util.h" #include "log.h" -#include "missing_syscall.h" #include "mkdir-label.h" #include "mount-util.h" #include "mountpoint-util.h" diff --git a/src/shared/numa-util.c b/src/shared/numa-util.c index 8c18c58227..c011c4381d 100644 --- a/src/shared/numa-util.c +++ b/src/shared/numa-util.c @@ -8,7 +8,6 @@ #include "fd-util.h" #include "fileio.h" #include "log.h" -#include "missing_syscall.h" #include "numa-util.h" #include "parse-util.h" #include "stdio-util.h" diff --git a/src/shared/numa-util.h b/src/shared/numa-util.h index 571d0d1354..1c3482a590 100644 --- a/src/shared/numa-util.h +++ b/src/shared/numa-util.h @@ -1,9 +1,10 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include + #include "cpu-set-util.h" #include "forward.h" -#include "missing_syscall.h" static inline bool mpol_is_valid(int t) { return t >= MPOL_DEFAULT && t <= MPOL_LOCAL; diff --git a/src/shared/quota-util.c b/src/shared/quota-util.c index 06f27e85f2..265d502971 100644 --- a/src/shared/quota-util.c +++ b/src/shared/quota-util.c @@ -8,7 +8,6 @@ #include "chattr-util.h" #include "device-util.h" #include "errno-util.h" -#include "missing_syscall.h" #include "quota-util.h" int quotactl_fd_with_fallback(int fd, int cmd, int id, void *addr) { diff --git a/src/shared/switch-root.c b/src/shared/switch-root.c index 288280c3d1..d5f34c5d37 100644 --- a/src/shared/switch-root.c +++ b/src/shared/switch-root.c @@ -11,7 +11,6 @@ #include "errno-util.h" #include "fd-util.h" #include "log.h" -#include "missing_syscall.h" #include "mkdir-label.h" #include "mount-util.h" #include "mountpoint-util.h" diff --git a/src/shutdown/meson.build b/src/shutdown/meson.build index c67d19abcc..4893ea62e3 100644 --- a/src/shutdown/meson.build +++ b/src/shutdown/meson.build @@ -23,6 +23,7 @@ executables += [ 'sources' : systemd_shutdown_sources + systemd_shutdown_extract_sources, 'c_args' : '-DSTANDALONE', 'link_with' : [ + libc_wrapper_static, libbasic_static, libshared_static, libsystemd_static, diff --git a/src/sysusers/meson.build b/src/sysusers/meson.build index 88494d8cfc..e2e82889e7 100644 --- a/src/sysusers/meson.build +++ b/src/sysusers/meson.build @@ -17,6 +17,7 @@ executables += [ 'sources' : files('sysusers.c'), 'c_args' : '-DSTANDALONE', 'link_with' : [ + libc_wrapper_static, libbasic_static, libshared_static, libsystemd_static, diff --git a/src/test/meson.build b/src/test/meson.build index c0c2a4e905..5284dc1315 100644 --- a/src/test/meson.build +++ b/src/test/meson.build @@ -289,7 +289,10 @@ executables += [ # only static linking apart from libdl, to make sure that the # module is linked to all libraries that it uses. 'sources' : files('test-dlopen.c'), - 'link_with' : libbasic_static, + 'link_with' : [ + libc_wrapper_static, + libbasic_static, + ], 'dependencies' : libdl, 'install' : false, 'type' : 'manual', @@ -426,7 +429,10 @@ executables += [ }, test_template + { 'sources' : files('test-sizeof.c'), - 'link_with' : libbasic_static, + 'link_with' : [ + libc_wrapper_static, + libbasic_static, + ], }, test_template + { 'sources' : files('test-time-util.c'), @@ -594,6 +600,7 @@ executables += [ test_template + { 'sources' : files('../libsystemd/sd-device/test-sd-device-thread.c'), 'link_with' : [ + libc_wrapper_static, libbasic_static, libsystemd, ], @@ -602,6 +609,7 @@ executables += [ test_template + { 'sources' : files('../libudev/test-udev-device-thread.c'), 'link_with' : [ + libc_wrapper_static, libbasic_static, libudev, ], diff --git a/src/test/test-seccomp.c b/src/test/test-seccomp.c index 7199b2fb33..a1230ec27c 100644 --- a/src/test/test-seccomp.c +++ b/src/test/test-seccomp.c @@ -21,7 +21,6 @@ #include "fileio.h" #include "fs-util.h" #include "memory-util.h" -#include "missing_syscall.h" #include "nsflags.h" #include "nulstr-util.h" #include "process-util.h" diff --git a/src/tmpfiles/meson.build b/src/tmpfiles/meson.build index 404f265f91..a973d16f5c 100644 --- a/src/tmpfiles/meson.build +++ b/src/tmpfiles/meson.build @@ -25,6 +25,7 @@ executables += [ 'sources' : systemd_tmpfiles_sources + systemd_tmpfiles_extract_sources, 'c_args' : '-DSTANDALONE', 'link_with' : [ + libc_wrapper_static, libbasic_static, libshared_static, libsystemd_static, From 3fc2a440430b5dce6a5e1bc5c1773600c3a61db4 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 6 Jul 2025 14:52:23 +0900 Subject: [PATCH 5/9] include: move trivial kernel header wrappers to src/include/override/ --- src/basic/cgroup-util.c | 4 +-- src/basic/check-filesystems.sh | 11 ++----- src/basic/filesystems-gperf.gperf | 1 - src/basic/meson.build | 12 ++----- src/basic/namespace-util.c | 4 +-- src/basic/pidfd-util.c | 4 +-- src/basic/stat-util.c | 2 +- src/basic/terminal-util.c | 2 +- src/core/bpf-foreign.c | 2 +- src/core/namespace.c | 2 +- src/core/service.c | 2 +- src/creds/creds.c | 2 +- src/home/homework-luks.c | 2 +- src/home/homework-quota.c | 3 +- src/home/homework.c | 2 +- src/include/meson.build | 5 +++ .../override/linux/audit.h} | 12 ++++--- .../override/linux/fs.h} | 2 +- .../override/linux/magic.h} | 32 ++++++++++--------- .../override/linux/nsfs.h} | 3 +- .../override/linux/xfs.h} | 3 +- src/journal/journald-audit.c | 3 +- src/journal/journald-manager.c | 2 +- src/libsystemd/sd-daemon/sd-daemon.c | 2 +- src/libsystemd/sd-device/sd-device.c | 2 +- src/libsystemd/sd-event/sd-event.c | 2 +- src/libsystemd/sd-journal/audit-type.c | 3 +- .../sd-journal/generate-audit_type-list.sh | 5 +-- src/libsystemd/sd-journal/meson.build | 4 +-- src/login/user-runtime-dir.c | 2 +- src/nsresourced/nsresourcework.c | 2 +- src/nsresourced/userns-registry.c | 2 +- src/shared/binfmt-util.c | 2 +- src/shared/cgroup-setup.c | 2 +- src/shared/machine-pool.c | 3 +- src/shared/resize-fs.c | 5 ++- src/shared/rm-rf.c | 2 +- src/shared/shift-uid.c | 2 +- src/sysupdate/sysupdate-resource.c | 2 +- src/test/test-recurse-dir.c | 2 +- 40 files changed, 79 insertions(+), 82 deletions(-) rename src/{basic/missing_audit.h => include/override/linux/audit.h} (66%) rename src/{basic/missing_fs.h => include/override/linux/fs.h} (84%) rename src/{basic/missing_magic.h => include/override/linux/magic.h} (73%) rename src/{basic/missing_namespace.h => include/override/linux/nsfs.h} (89%) rename src/{basic/missing_xfs.h => include/override/linux/xfs.h} (96%) diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index e643c71714..f3270ff278 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include +#include #include #include #include @@ -18,8 +20,6 @@ #include "fs-util.h" #include "log.h" #include "login-util.h" -#include "missing_fs.h" -#include "missing_magic.h" #include "parse-util.h" #include "path-util.h" #include "pidref.h" diff --git a/src/basic/check-filesystems.sh b/src/basic/check-filesystems.sh index 696ef610ac..e36890cca1 100755 --- a/src/basic/check-filesystems.sh +++ b/src/basic/check-filesystems.sh @@ -3,19 +3,14 @@ set -eu set -o pipefail -cpp="$1" -filesystems_gperf="$2" +cpp="${1:?}" +filesystems_gperf="${2:?}" shift 2 -includes="" -for i in "$@"; do - includes="$includes -include $i" -done - error=false # shellcheck disable=SC2086 -for fs in $($cpp -dM $includes - #include "filesystems.h" -#include "missing_magic.h" #include "stat-util.h" struct FilesystemMagic { diff --git a/src/basic/meson.build b/src/basic/meson.build index ece4bf1e92..b03df4a9a4 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -119,8 +119,6 @@ basic_sources = files( sources += basic_sources -missing_audit_h = files('missing_audit.h') - generated_gperf_headers = [] foreach item : [ # name, source, struct name, prefix, headers @@ -173,17 +171,13 @@ basic_sources += generated_gperf_headers ############################################################ -filesystem_includes = files( - '../include/uapi/linux/magic.h', - 'missing_magic.h', -) - check_filesystems = find_program('check-filesystems.sh') r = run_command( [ 'env', '--chdir', meson.project_build_root(), - check_filesystems, cpp, files('filesystems-gperf.gperf') - ] + filesystem_includes, + check_filesystems, cpp, files('filesystems-gperf.gperf'), + system_include_args, + ], check: false, ) if r.returncode() != 0 diff --git a/src/basic/namespace-util.c b/src/basic/namespace-util.c index ba1941a0a5..c8ee38b4f1 100644 --- a/src/basic/namespace-util.c +++ b/src/basic/namespace-util.c @@ -1,6 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include +#include #include #include #include @@ -10,8 +12,6 @@ #include "fd-util.h" #include "fileio.h" #include "log.h" -#include "missing_magic.h" -#include "missing_namespace.h" #include "mountpoint-util.h" #include "namespace-util.h" #include "parse-util.h" diff --git a/src/basic/pidfd-util.c b/src/basic/pidfd-util.c index 78f8dc41c6..965f0b86da 100644 --- a/src/basic/pidfd-util.c +++ b/src/basic/pidfd-util.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include +#include #include #include #include @@ -7,8 +9,6 @@ #include "errno-util.h" #include "fd-util.h" #include "fileio.h" -#include "missing_fs.h" -#include "missing_magic.h" #include "mountpoint-util.h" #include "parse-util.h" #include "pidfd-util.h" diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index 94b4f55c34..72360daadf 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include @@ -13,7 +14,6 @@ #include "fs-util.h" #include "hash-funcs.h" #include "log.h" -#include "missing_magic.h" #include "mountpoint-util.h" #include "path-util.h" #include "siphash24.h" diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 65bdd75f31..e15004981b 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -27,7 +28,6 @@ #include "inotify-util.h" #include "io-util.h" #include "log.h" -#include "missing_magic.h" #include "namespace-util.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/core/bpf-foreign.c b/src/core/bpf-foreign.c index 962ff88b55..73933e131a 100644 --- a/src/core/bpf-foreign.c +++ b/src/core/bpf-foreign.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include "alloc-util.h" #include "bpf-foreign.h" @@ -8,7 +9,6 @@ #include "cgroup.h" #include "hash-funcs.h" #include "hashmap.h" -#include "missing_magic.h" #include "siphash24.h" #include "stat-util.h" #include "unit.h" diff --git a/src/core/namespace.c b/src/core/namespace.c index 166fdf253a..c384d67898 100644 --- a/src/core/namespace.c +++ b/src/core/namespace.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include #include @@ -29,7 +30,6 @@ #include "log.h" #include "loop-util.h" #include "loopback-setup.h" -#include "missing_magic.h" #include "mkdir-label.h" #include "mount-util.h" #include "mountpoint-util.h" diff --git a/src/core/service.c b/src/core/service.c index aabaaedf5d..8d7dade83d 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include #include @@ -31,7 +32,6 @@ #include "image-policy.h" #include "log.h" #include "manager.h" -#include "missing_audit.h" #include "mount-util.h" #include "namespace.h" #include "open-file.h" diff --git a/src/creds/creds.c b/src/creds/creds.c index d9845987ad..a121d0695b 100644 --- a/src/creds/creds.c +++ b/src/creds/creds.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include "sd-json.h" @@ -23,7 +24,6 @@ #include "log.h" #include "main-func.h" #include "memory-util.h" -#include "missing_magic.h" #include "pager.h" #include "parse-argument.h" #include "parse-util.h" diff --git a/src/home/homework-luks.c b/src/home/homework-luks.c index 5c6bd28088..2d6a549c22 100644 --- a/src/home/homework-luks.c +++ b/src/home/homework-luks.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include #include @@ -45,7 +46,6 @@ #include "keyring-util.h" #include "loop-util.h" #include "memory-util.h" -#include "missing_magic.h" #include "mkdir.h" #include "mkfs-util.h" #include "openssl-util.h" diff --git a/src/home/homework-quota.c b/src/home/homework-quota.c index f8affe58ed..448f8f1729 100644 --- a/src/home/homework-quota.c +++ b/src/home/homework-quota.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #include "btrfs-util.h" #include "errno-util.h" #include "fd-util.h" @@ -7,7 +9,6 @@ #include "homework-quota.h" #include "log.h" #include "memory-util.h" -#include "missing_magic.h" #include "quota-util.h" #include "stat-util.h" #include "user-record.h" diff --git a/src/home/homework.c b/src/home/homework.c index 1056d27b8b..e796f125fb 100644 --- a/src/home/homework.c +++ b/src/home/homework.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include #include @@ -35,7 +36,6 @@ #include "loop-util.h" #include "main-func.h" #include "memory-util.h" -#include "missing_magic.h" #include "mount-util.h" #include "path-util.h" #include "recovery-key.h" diff --git a/src/include/meson.build b/src/include/meson.build index 9786723b1b..8277574b4d 100644 --- a/src/include/meson.build +++ b/src/include/meson.build @@ -33,6 +33,11 @@ ipproto_sources = files( 'uapi/linux/in.h', ) +# Source files that provides AUDIT_XYZ +audit_sources = files( + 'override/linux/audit.h', +) + # Source files that provides KEY_XYZ keyboard_sources = files( 'uapi/linux/input.h', diff --git a/src/basic/missing_audit.h b/src/include/override/linux/audit.h similarity index 66% rename from src/basic/missing_audit.h rename to src/include/override/linux/audit.h index ff95e5e88a..abdd25b379 100644 --- a/src/basic/missing_audit.h +++ b/src/include/override/linux/audit.h @@ -1,13 +1,15 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include /* IWYU pragma: export */ +#include_next /* IWYU pragma: export */ #if HAVE_AUDIT # include /* IWYU pragma: export */ #endif -/* We use _Static_assert() directly here instead of assert_cc() +#include + +/* We use static_assert() directly here instead of assert_cc() * because if we include macro.h in this header, the invocation * of generate-audit_type-list.sh becomes more complex. */ @@ -15,17 +17,17 @@ #ifndef AUDIT_SERVICE_START # define AUDIT_SERVICE_START 1130 /* Service (daemon) start */ #else -_Static_assert(AUDIT_SERVICE_START == 1130, ""); +static_assert(AUDIT_SERVICE_START == 1130, ""); #endif #ifndef AUDIT_SERVICE_STOP # define AUDIT_SERVICE_STOP 1131 /* Service (daemon) stop */ #else -_Static_assert(AUDIT_SERVICE_STOP == 1131, ""); +static_assert(AUDIT_SERVICE_STOP == 1131, ""); #endif #ifndef MAX_AUDIT_MESSAGE_LENGTH # define MAX_AUDIT_MESSAGE_LENGTH 8970 #else -_Static_assert(MAX_AUDIT_MESSAGE_LENGTH == 8970, ""); +static_assert(MAX_AUDIT_MESSAGE_LENGTH == 8970, ""); #endif diff --git a/src/basic/missing_fs.h b/src/include/override/linux/fs.h similarity index 84% rename from src/basic/missing_fs.h rename to src/include/override/linux/fs.h index d07042a48a..594b1638cc 100644 --- a/src/basic/missing_fs.h +++ b/src/include/override/linux/fs.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include /* IWYU pragma: export */ +#include_next /* IWYU pragma: export */ /* Not exposed yet. Defined at fs/ext4/ext4.h */ #ifndef EXT4_IOC_RESIZE_FS diff --git a/src/basic/missing_magic.h b/src/include/override/linux/magic.h similarity index 73% rename from src/basic/missing_magic.h rename to src/include/override/linux/magic.h index b5357d4f68..d940fa54a2 100644 --- a/src/basic/missing_magic.h +++ b/src/include/override/linux/magic.h @@ -1,102 +1,104 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include /* IWYU pragma: export */ +#include_next /* IWYU pragma: export */ + +#include /* Not exposed yet (4.20). Defined at ipc/mqueue.c */ #ifndef MQUEUE_MAGIC # define MQUEUE_MAGIC 0x19800202 #else -assert_cc(MQUEUE_MAGIC == 0x19800202); +static_assert(MQUEUE_MAGIC == 0x19800202, ""); #endif /* b1123ea6d3b3da25af5c8a9d843bd07ab63213f4 (4.8), dropped by 68f2736a858324c3ec852f6c2cddd9d1c777357d (v6.0) */ #ifndef BALLOON_KVM_MAGIC # define BALLOON_KVM_MAGIC 0x13661366 #else -assert_cc(BALLOON_KVM_MAGIC == 0x13661366); +static_assert(BALLOON_KVM_MAGIC == 0x13661366, ""); #endif /* 48b4800a1c6af2cdda344ea4e2c843dcc1f6afc9 (4.8), dropped by 68f2736a858324c3ec852f6c2cddd9d1c777357d (v6.0) */ #ifndef ZSMALLOC_MAGIC # define ZSMALLOC_MAGIC 0x58295829 #else -assert_cc(ZSMALLOC_MAGIC == 0x58295829); +static_assert(ZSMALLOC_MAGIC == 0x58295829, ""); #endif /* ea8157ab2ae5e914dd427e5cfab533b6da3819cd (5.3), dropped by 68f2736a858324c3ec852f6c2cddd9d1c777357d (v6.0) */ #ifndef Z3FOLD_MAGIC # define Z3FOLD_MAGIC 0x33 #else -assert_cc(Z3FOLD_MAGIC == 0x33); +static_assert(Z3FOLD_MAGIC == 0x33, ""); #endif /* fe030c9b85e6783bc52fe86449c0a4b8aa16c753 (5.5), dropped by 68f2736a858324c3ec852f6c2cddd9d1c777357d (v6.0) */ #ifndef PPC_CMM_MAGIC # define PPC_CMM_MAGIC 0xc7571590 #else -assert_cc(PPC_CMM_MAGIC == 0xc7571590); +static_assert(PPC_CMM_MAGIC == 0xc7571590, ""); #endif /* Not in mainline but included in Ubuntu */ #ifndef SHIFTFS_MAGIC # define SHIFTFS_MAGIC 0x6a656a62 #else -assert_cc(SHIFTFS_MAGIC == 0x6a656a62); +static_assert(SHIFTFS_MAGIC == 0x6a656a62, ""); #endif /* Not exposed yet. Defined at fs/fuse/control.c */ #ifndef FUSE_CTL_SUPER_MAGIC # define FUSE_CTL_SUPER_MAGIC 0x65735543 #else -assert_cc(FUSE_CTL_SUPER_MAGIC == 0x65735543); +static_assert(FUSE_CTL_SUPER_MAGIC == 0x65735543, ""); #endif /* Not exposed yet. Defined at fs/orangefs/orangefs-kernel.h */ #ifndef ORANGEFS_DEVREQ_MAGIC # define ORANGEFS_DEVREQ_MAGIC 0x20030529 #else -assert_cc(ORANGEFS_DEVREQ_MAGIC == 0x20030529); +static_assert(ORANGEFS_DEVREQ_MAGIC == 0x20030529, ""); #endif /* linux/gfs2_ondisk.h */ #ifndef GFS2_MAGIC # define GFS2_MAGIC 0x01161970 #else -assert_cc(GFS2_MAGIC == 0x01161970); +static_assert(GFS2_MAGIC == 0x01161970, ""); #endif /* Not exposed yet. Defined at fs/configfs/mount.c */ #ifndef CONFIGFS_MAGIC # define CONFIGFS_MAGIC 0x62656570 #else -assert_cc(CONFIGFS_MAGIC == 0x62656570); +static_assert(CONFIGFS_MAGIC == 0x62656570, ""); #endif /* Not exposed yet. Defined at fs/vboxsf/super.c */ #ifndef VBOXSF_SUPER_MAGIC # define VBOXSF_SUPER_MAGIC 0x786f4256 #else -assert_cc(VBOXSF_SUPER_MAGIC == 0x786f4256); +static_assert(VBOXSF_SUPER_MAGIC == 0x786f4256, ""); #endif /* Not exposed yet, internally actually called RPCAUTH_GSSMAGIC. Defined in net/sunrpc/rpc_pipe.c */ #ifndef RPC_PIPEFS_SUPER_MAGIC # define RPC_PIPEFS_SUPER_MAGIC 0x67596969 #else -assert_cc(RPC_PIPEFS_SUPER_MAGIC == 0x67596969); +static_assert(RPC_PIPEFS_SUPER_MAGIC == 0x67596969, ""); #endif /* Not exposed yet, defined at fs/ntfs/ntfs.h */ #ifndef NTFS_SB_MAGIC # define NTFS_SB_MAGIC 0x5346544e #else -assert_cc(NTFS_SB_MAGIC == 0x5346544e); +static_assert(NTFS_SB_MAGIC == 0x5346544e, ""); #endif /* Not exposed yet, encoded literally in fs/ntfs3/super.c. */ #ifndef NTFS3_SUPER_MAGIC # define NTFS3_SUPER_MAGIC 0x7366746e #else -assert_cc(NTFS3_SUPER_MAGIC == 0x7366746e); +static_assert(NTFS3_SUPER_MAGIC == 0x7366746e, ""); #endif diff --git a/src/basic/missing_namespace.h b/src/include/override/linux/nsfs.h similarity index 89% rename from src/basic/missing_namespace.h rename to src/include/override/linux/nsfs.h index e40b751b81..a256df1c6f 100644 --- a/src/basic/missing_namespace.h +++ b/src/include/override/linux/nsfs.h @@ -1,8 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include /* IWYU pragma: export */ -#include +#include_next /* IWYU pragma: export */ /* Root namespace inode numbers, as per include/linux/proc_ns.h in the kernel source tree, since v3.8: * https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=98f842e675f96ffac96e6c50315790912b2812be */ diff --git a/src/basic/missing_xfs.h b/src/include/override/linux/xfs.h similarity index 96% rename from src/basic/missing_xfs.h rename to src/include/override/linux/xfs.h index ead7dbc321..1f3b9af066 100644 --- a/src/basic/missing_xfs.h +++ b/src/include/override/linux/xfs.h @@ -1,7 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include "forward.h" +#include +#include /* This is currently not exported in the public kernel headers, but the libxfs library code part of xfsprogs * defines it as public header */ diff --git a/src/journal/journald-audit.c b/src/journal/journald-audit.c index 3147483019..ebf401c4c2 100644 --- a/src/journal/journald-audit.c +++ b/src/journal/journald-audit.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #include "sd-event.h" #include "alloc-util.h" @@ -13,7 +15,6 @@ #include "journald-manager.h" #include "log.h" #include "log-ratelimit.h" -#include "missing_audit.h" #include "stdio-util.h" #include "string-util.h" #include "time-util.h" diff --git a/src/journal/journald-manager.c b/src/journal/journald-manager.c index 9f44fb80b4..ae9c719b83 100644 --- a/src/journal/journald-manager.c +++ b/src/journal/journald-manager.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include #include @@ -50,7 +51,6 @@ #include "log.h" #include "log-ratelimit.h" #include "memory-util.h" -#include "missing_audit.h" #include "mkdir.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/libsystemd/sd-daemon/sd-daemon.c b/src/libsystemd/sd-daemon/sd-daemon.c index d7ed4e88e8..0cf3cbdd4c 100644 --- a/src/libsystemd/sd-daemon/sd-daemon.c +++ b/src/libsystemd/sd-daemon/sd-daemon.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include #include @@ -18,7 +19,6 @@ #include "io-util.h" #include "iovec-util.h" #include "log.h" -#include "missing_magic.h" #include "parse-util.h" #include "path-util.h" #include "pidfd-util.h" diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index 850eff9d02..9987c4be7e 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include "sd-device.h" @@ -19,7 +20,6 @@ #include "fileio.h" #include "fs-util.h" #include "hashmap.h" -#include "missing_magic.h" #include "netlink-util.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index e108ba6546..8ed10c9f8e 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include #include @@ -24,7 +25,6 @@ #include "log.h" #include "logarithm.h" #include "memory-util.h" -#include "missing_magic.h" #include "origin-id.h" #include "path-util.h" #include "pidfd-util.h" diff --git a/src/libsystemd/sd-journal/audit-type.c b/src/libsystemd/sd-journal/audit-type.c index 1995e3fa18..097f725e87 100644 --- a/src/libsystemd/sd-journal/audit-type.c +++ b/src/libsystemd/sd-journal/audit-type.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #include "audit-type.h" -#include "missing_audit.h" #include "audit_type-to-name.inc" diff --git a/src/libsystemd/sd-journal/generate-audit_type-list.sh b/src/libsystemd/sd-journal/generate-audit_type-list.sh index 12103b2a0f..44c743b1a3 100755 --- a/src/libsystemd/sd-journal/generate-audit_type-list.sh +++ b/src/libsystemd/sd-journal/generate-audit_type-list.sh @@ -6,10 +6,7 @@ set -o pipefail CC="${1:?}" shift -HEADER="${1:?}" -shift - -$CC -dM -include "$HEADER" "$@" - #include #include "sd-bus.h" @@ -15,7 +16,6 @@ #include "limits-util.h" #include "log.h" #include "main-func.h" -#include "missing_magic.h" #include "mkdir-label.h" #include "mount-util.h" #include "mountpoint-util.h" diff --git a/src/nsresourced/nsresourcework.c b/src/nsresourced/nsresourcework.c index 5f99eae4f9..9427b1885c 100644 --- a/src/nsresourced/nsresourcework.c +++ b/src/nsresourced/nsresourcework.c @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -30,7 +31,6 @@ #include "io-util.h" #include "json-util.h" #include "main-func.h" -#include "missing_magic.h" #include "mountpoint-util.h" #include "namespace-util.h" #include "netlink-util.h" diff --git a/src/nsresourced/userns-registry.c b/src/nsresourced/userns-registry.c index 6b40d713ff..e576f02c38 100644 --- a/src/nsresourced/userns-registry.c +++ b/src/nsresourced/userns-registry.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include "sd-json.h" @@ -13,7 +14,6 @@ #include "format-util.h" #include "fs-util.h" #include "json-util.h" -#include "missing_magic.h" #include "path-util.h" #include "recurse-dir.h" #include "rm-rf.h" diff --git a/src/shared/binfmt-util.c b/src/shared/binfmt-util.c index d5bf96bbdc..d21fd10136 100644 --- a/src/shared/binfmt-util.c +++ b/src/shared/binfmt-util.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include "binfmt-util.h" @@ -8,7 +9,6 @@ #include "fileio.h" #include "fs-util.h" #include "log.h" -#include "missing_magic.h" #include "stat-util.h" int binfmt_mounted_and_writable(void) { diff --git a/src/shared/cgroup-setup.c b/src/shared/cgroup-setup.c index f6f0fe2c19..323204725f 100644 --- a/src/shared/cgroup-setup.c +++ b/src/shared/cgroup-setup.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include "cgroup-setup.h" @@ -10,7 +11,6 @@ #include "format-util.h" #include "fs-util.h" #include "log.h" -#include "missing_magic.h" #include "mkdir.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/shared/machine-pool.c b/src/shared/machine-pool.c index 8744ec3d5d..2fcb480c51 100644 --- a/src/shared/machine-pool.c +++ b/src/shared/machine-pool.c @@ -1,12 +1,13 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include + #include "sd-bus.h" #include "btrfs-util.h" #include "label-util.h" #include "log.h" #include "machine-pool.h" -#include "missing_magic.h" #include "stat-util.h" static int check_btrfs(void) { diff --git a/src/shared/resize-fs.c b/src/shared/resize-fs.c index 481c2de1e5..147af7ec33 100644 --- a/src/shared/resize-fs.c +++ b/src/shared/resize-fs.c @@ -1,13 +1,12 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include +#include #include #include -#include "missing_fs.h" -#include "missing_magic.h" -#include "missing_xfs.h" #include "resize-fs.h" #include "stat-util.h" #include "stdio-util.h" diff --git a/src/shared/rm-rf.c b/src/shared/rm-rf.c index 71466c8574..1b3ecf0790 100644 --- a/src/shared/rm-rf.c +++ b/src/shared/rm-rf.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include "alloc-util.h" @@ -10,7 +11,6 @@ #include "fd-util.h" #include "fs-util.h" #include "log.h" -#include "missing_magic.h" #include "mountpoint-util.h" #include "path-util.h" #include "rm-rf.h" diff --git a/src/shared/shift-uid.c b/src/shared/shift-uid.c index 1b1af55484..9c7e875dff 100644 --- a/src/shared/shift-uid.c +++ b/src/shared/shift-uid.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include #include #include @@ -10,7 +11,6 @@ #include "fileio.h" #include "fs-util.h" #include "log.h" -#include "missing_magic.h" #include "shift-uid.h" #include "stat-util.h" #include "string-util.h" diff --git a/src/sysupdate/sysupdate-resource.c b/src/sysupdate/sysupdate-resource.c index 6817df1644..cb2b05b901 100644 --- a/src/sysupdate/sysupdate-resource.c +++ b/src/sysupdate/sysupdate-resource.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include @@ -20,7 +21,6 @@ #include "gpt.h" #include "hexdecoct.h" #include "import-util.h" -#include "missing_magic.h" #include "process-util.h" #include "sort-util.h" #include "stat-util.h" diff --git a/src/test/test-recurse-dir.c b/src/test/test-recurse-dir.c index 1502e7f7a8..b29a7eab9d 100644 --- a/src/test/test-recurse-dir.c +++ b/src/test/test-recurse-dir.c @@ -1,10 +1,10 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include "fd-util.h" #include "log.h" -#include "missing_magic.h" #include "recurse-dir.h" #include "stat-util.h" #include "strv.h" From c35606b27219923f0c2157daba0c3286f7891cb5 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 8 Jul 2025 14:30:07 +0900 Subject: [PATCH 6/9] include: use unit8_t for uuid To emphasize it is an array of bytes. This also align variables. No functional changes. Just refactoring. --- src/include/override/linux/xfs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/override/linux/xfs.h b/src/include/override/linux/xfs.h index 1f3b9af066..57112c74a5 100644 --- a/src/include/override/linux/xfs.h +++ b/src/include/override/linux/xfs.h @@ -23,10 +23,10 @@ typedef struct xfs_fsop_geom { uint64_t rtblocks; uint64_t rtextents; uint64_t logstart; - unsigned char uuid[16]; + uint8_t uuid[16]; uint32_t sunit; uint32_t swidth; - int32_t version; + int32_t version; uint32_t flags; uint32_t logsectsize; uint32_t rtsectsize; From 1d81c3a74ea814841969152c1faebbcb99766cc2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 8 Jul 2025 13:52:03 +0900 Subject: [PATCH 7/9] docs: mention src/include/ directories --- docs/ARCHITECTURE.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index ff6c8975d5..33bd992ae9 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -20,6 +20,9 @@ There are many, and more are constantly added, so we will not enumerate them all The code that is shared between components is split into a few directories, each with a different purpose: +- 'src/include/uapi/' contains copy of kernel headers we use. + 'src/include/override/' contains wrappers for libc and kernel headers, to provide several missing symbols. + - `src/basic/` and `src/fundamental/` — those directories contain code primitives that are used by all other code. `src/fundamental/` is stricter, because it used for EFI and user-space code, while `src/basic/` is only used for user-space code. The code in `src/fundamental/` cannot depend on any other code in the tree, and `src/basic/` can depend only on itself and `src/fundamental/`. @@ -43,6 +46,12 @@ Any code that is used only for EFI goes under `src/boot/efi/`, and `src/fundamen To summarize: +`src/include/uapi/` +- copy of kernel headers + +`src/include/override/` +- wrappers for libc and kernel headers + `src/fundamental/` - may be used by all code in the tree - may not use any code outside of `src/fundamental/` From 0939d5c36039c89d02f7db45239bac08b7e44903 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 20 Jun 2025 04:18:00 +0900 Subject: [PATCH 8/9] reboot-util: merge with raw-reboot.h The header raw-reboot.h is only used with reboot-util. Let's merge them. --- src/basic/raw-reboot.h | 15 --------------- src/core/emergency-action.c | 2 -- src/shared/reboot-util.c | 8 +++++--- src/shared/reboot-util.h | 8 ++++++++ src/shutdown/shutdown.c | 2 -- src/systemctl/systemctl-util.c | 1 - 6 files changed, 13 insertions(+), 23 deletions(-) delete mode 100644 src/basic/raw-reboot.h diff --git a/src/basic/raw-reboot.h b/src/basic/raw-reboot.h deleted file mode 100644 index d72ae1e955..0000000000 --- a/src/basic/raw-reboot.h +++ /dev/null @@ -1,15 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ -#pragma once - -#include -#include -#include -#include - -/* glibc defines the reboot() API call, which is a wrapper around the system call of the same name, but without the - * extra "arg" parameter. Since we need that parameter for some calls, let's add a "raw" wrapper that is defined the - * same way, except it takes the additional argument. */ - -static inline int raw_reboot(int cmd, const void *arg) { - return (int) syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, arg); -} diff --git a/src/core/emergency-action.c b/src/core/emergency-action.c index 989bb1753e..439228c899 100644 --- a/src/core/emergency-action.c +++ b/src/core/emergency-action.c @@ -1,12 +1,10 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include #include #include "ansi-color.h" #include "emergency-action.h" #include "manager.h" -#include "raw-reboot.h" #include "reboot-util.h" #include "special.h" #include "string-table.h" diff --git a/src/shared/reboot-util.c b/src/shared/reboot-util.c index f82c0654dc..948e15631d 100644 --- a/src/shared/reboot-util.c +++ b/src/shared/reboot-util.c @@ -1,10 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include #include #include #include -#include +#include #include #if HAVE_XENCTRL @@ -20,13 +19,16 @@ #include "fileio.h" #include "log.h" #include "proc-cmdline.h" -#include "raw-reboot.h" #include "reboot-util.h" #include "string-util.h" #include "umask-util.h" #include "utf8.h" #include "virt.h" +int raw_reboot(int cmd, const void *arg) { + return syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, arg); +} + bool reboot_parameter_is_valid(const char *parameter) { assert(parameter); diff --git a/src/shared/reboot-util.h b/src/shared/reboot-util.h index 55419dfb14..276361aea8 100644 --- a/src/shared/reboot-util.h +++ b/src/shared/reboot-util.h @@ -1,8 +1,16 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include /* IWYU pragma: export */ +#include /* IWYU pragma: export */ + #include "forward.h" +/* glibc defines the reboot() API call, which is a wrapper around the system call of the same name, but + * without the extra "arg" parameter. Since we need that parameter for some calls, let's add a "raw" wrapper + * that is defined the same way, except it takes the additional argument. */ +int raw_reboot(int cmd, const void *arg); + bool reboot_parameter_is_valid(const char *parameter); int update_reboot_parameter_and_warn(const char *parameter, bool keep); diff --git a/src/shutdown/shutdown.c b/src/shutdown/shutdown.c index bb767161bd..3317068e47 100644 --- a/src/shutdown/shutdown.c +++ b/src/shutdown/shutdown.c @@ -4,11 +4,9 @@ ***/ #include -#include #include #include #include -#include #include #include diff --git a/src/systemctl/systemctl-util.c b/src/systemctl/systemctl-util.c index 019b763a86..faefc55619 100644 --- a/src/systemctl/systemctl-util.c +++ b/src/systemctl/systemctl-util.c @@ -1,7 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include -#include #include #include "sd-bus.h" From 531e6a2091ad238f2635858fe78ea01b2dfb8b6d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 20 Jun 2025 04:31:08 +0900 Subject: [PATCH 9/9] raw-clone: move definition to .c file Then, we can decrease the number of headers to be indirectly included by including raw-clone.h. No functional change. --- src/basic/meson.build | 1 + src/basic/raw-clone.c | 84 +++++++++++++++++++++++++++++++++++++++++++ src/basic/raw-clone.h | 83 ++---------------------------------------- 3 files changed, 88 insertions(+), 80 deletions(-) create mode 100644 src/basic/raw-clone.c diff --git a/src/basic/meson.build b/src/basic/meson.build index b03df4a9a4..d8591d49e2 100644 --- a/src/basic/meson.build +++ b/src/basic/meson.build @@ -84,6 +84,7 @@ basic_sources = files( 'psi-util.c', 'random-util.c', 'ratelimit.c', + 'raw-clone.c', 'recurse-dir.c', 'replace-var.c', 'rlimit-util.c', diff --git a/src/basic/raw-clone.c b/src/basic/raw-clone.c new file mode 100644 index 0000000000..aa750acb6d --- /dev/null +++ b/src/basic/raw-clone.c @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +/*** + Copyright © 2016 Michael Karcher +***/ + +#include +#include +#include +#include + +#include "process-util.h" +#include "raw-clone.h" + +/** + * raw_clone() - uses clone to create a new process with clone flags + * @flags: Flags to pass to the clone system call + * + * Uses the clone system call to create a new process with the cloning flags and termination signal passed in the flags + * parameter. Opposed to glibc's clone function, using this function does not set up a separate stack for the child, but + * relies on copy-on-write semantics on the one stack at a common virtual address, just as fork does. + * + * To obtain copy-on-write semantics, flags must not contain CLONE_VM, and thus CLONE_THREAD and CLONE_SIGHAND + * (which require CLONE_VM) are not usable. + * + * Additionally, as this function does not pass the ptid (pidfd in the case of CLONE_PIDFD), newtls and ctid + * parameters to the kernel, flags must not contain CLONE_PARENT_SETTID, CLONE_CHILD_SETTID, CLONE_CHILD_CLEARTID, + * CLONE_SETTLS, or CLONE_PIDFD. + * + * WARNING: 💣 this call (just like glibc's own clone() wrapper) will not synchronize on glibc's malloc + * locks, which means they will be in an undefined state in the child if the parent is + * threaded. This means: the parent must either never use threads, or the child cannot use memory + * allocation itself. This is a major pitfall, hence be careful! 💣 + * + * Returns: 0 in the child process and the child process id in the parent. + */ +pid_t raw_clone(unsigned long flags) { + pid_t ret; + + assert((flags & (CLONE_VM|CLONE_PARENT_SETTID|CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID|CLONE_SETTLS|CLONE_PIDFD)) == 0); +#if defined(__s390x__) || defined(__s390__) || defined(__CRIS__) + /* On s390/s390x and cris the order of the first and second arguments + * of the raw clone() system call is reversed. */ + ret = (pid_t) syscall(__NR_clone, NULL, flags); +#elif defined(__sparc__) + { + /** + * sparc always returns the other process id in %o0, and + * a boolean flag whether this is the child or the parent in + * %o1. Inline assembly is needed to get the flag returned + * in %o1. + */ + int in_child, child_pid, error; + + asm volatile("mov %3, %%g1\n\t" + "mov %4, %%o0\n\t" + "mov 0 , %%o1\n\t" +#if defined(__arch64__) + "t 0x6d\n\t" +#else + "t 0x10\n\t" +#endif + "addx %%g0, 0, %2\n\t" + "mov %%o1, %0\n\t" + "mov %%o0, %1" : + "=r"(in_child), "=r"(child_pid), "=r"(error) : + "i"(__NR_clone), "r"(flags) : + "%o1", "%o0", "%g1", "cc" ); + + if (error) { + errno = child_pid; + ret = -1; + } else + ret = in_child ? 0 : child_pid; + } +#else + ret = (pid_t) syscall(__NR_clone, flags, NULL); +#endif + + if (ret == 0) + reset_cached_pid(); + + return ret; +} diff --git a/src/basic/raw-clone.h b/src/basic/raw-clone.h index 36202cc0ba..af20cde73b 100644 --- a/src/basic/raw-clone.h +++ b/src/basic/raw-clone.h @@ -1,85 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -/*** - Copyright © 2016 Michael Karcher -***/ +#include /* IWYU pragma: export */ -#include -#include -#include +#include "forward.h" -#include "log.h" -#include "macro.h" -#include "process-util.h" - -/** - * raw_clone() - uses clone to create a new process with clone flags - * @flags: Flags to pass to the clone system call - * - * Uses the clone system call to create a new process with the cloning flags and termination signal passed in the flags - * parameter. Opposed to glibc's clone function, using this function does not set up a separate stack for the child, but - * relies on copy-on-write semantics on the one stack at a common virtual address, just as fork does. - * - * To obtain copy-on-write semantics, flags must not contain CLONE_VM, and thus CLONE_THREAD and CLONE_SIGHAND - * (which require CLONE_VM) are not usable. - * - * Additionally, as this function does not pass the ptid (pidfd in the case of CLONE_PIDFD), newtls and ctid - * parameters to the kernel, flags must not contain CLONE_PARENT_SETTID, CLONE_CHILD_SETTID, CLONE_CHILD_CLEARTID, - * CLONE_SETTLS, or CLONE_PIDFD. - * - * WARNING: 💣 this call (just like glibc's own clone() wrapper) will not synchronize on glibc's malloc - * locks, which means they will be in an undefined state in the child if the parent is - * threaded. This means: the parent must either never use threads, or the child cannot use memory - * allocation itself. This is a major pitfall, hence be careful! 💣 - * - * Returns: 0 in the child process and the child process id in the parent. - */ -static inline pid_t raw_clone(unsigned long flags) { - pid_t ret; - - assert((flags & (CLONE_VM|CLONE_PARENT_SETTID|CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID|CLONE_SETTLS|CLONE_PIDFD)) == 0); -#if defined(__s390x__) || defined(__s390__) || defined(__CRIS__) - /* On s390/s390x and cris the order of the first and second arguments - * of the raw clone() system call is reversed. */ - ret = (pid_t) syscall(__NR_clone, NULL, flags); -#elif defined(__sparc__) - { - /** - * sparc always returns the other process id in %o0, and - * a boolean flag whether this is the child or the parent in - * %o1. Inline assembly is needed to get the flag returned - * in %o1. - */ - int in_child, child_pid, error; - - asm volatile("mov %3, %%g1\n\t" - "mov %4, %%o0\n\t" - "mov 0 , %%o1\n\t" -#if defined(__arch64__) - "t 0x6d\n\t" -#else - "t 0x10\n\t" -#endif - "addx %%g0, 0, %2\n\t" - "mov %%o1, %0\n\t" - "mov %%o0, %1" : - "=r"(in_child), "=r"(child_pid), "=r"(error) : - "i"(__NR_clone), "r"(flags) : - "%o1", "%o0", "%g1", "cc" ); - - if (error) { - errno = child_pid; - ret = -1; - } else - ret = in_child ? 0 : child_pid; - } -#else - ret = (pid_t) syscall(__NR_clone, flags, NULL); -#endif - - if (ret == 0) - reset_cached_pid(); - - return ret; -} +pid_t raw_clone(unsigned long flags);