diff options
Diffstat (limited to 'src')
61 files changed, 3359 insertions, 111 deletions
diff --git a/src/analyze/meson.build b/src/analyze/meson.build new file mode 100644 index 0000000000..fcbd814233 --- /dev/null +++ b/src/analyze/meson.build @@ -0,0 +1,5 @@ +systemd_analyze_sources = files(''' + analyze.c + analyze-verify.c + analyze-verify.h +'''.split()) diff --git a/src/basic/af-to-name.awk b/src/basic/af-to-name.awk new file mode 100644 index 0000000000..18d0a89728 --- /dev/null +++ b/src/basic/af-to-name.awk @@ -0,0 +1,9 @@ +BEGIN{ + print "static const char* const af_names[] = { " +} +!/AF_FILE/ && !/AF_ROUTE/ && !/AF_LOCAL/ { + printf " [%s] = \"%s\",\n", $1, $1 +} +END{ + print "};" +} diff --git a/src/basic/arphrd-to-name.awk b/src/basic/arphrd-to-name.awk new file mode 100644 index 0000000000..5a35673e2c --- /dev/null +++ b/src/basic/arphrd-to-name.awk @@ -0,0 +1,9 @@ +BEGIN{ + print "static const char* const arphrd_names[] = { " +} +!/CISCO/ { + printf " [ARPHRD_%s] = \"%s\",\n", $1, $1 +} +END{ + print "};" +} diff --git a/src/basic/cap-to-name.awk b/src/basic/cap-to-name.awk new file mode 100644 index 0000000000..402a782024 --- /dev/null +++ b/src/basic/cap-to-name.awk @@ -0,0 +1,9 @@ +BEGIN{ + print "static const char* const capability_names[] = { " +} +{ + printf " [%s] = \"%s\",\n", $1, tolower($1) +} +END{ + print "};" +} diff --git a/src/basic/errno-to-name.awk b/src/basic/errno-to-name.awk new file mode 100644 index 0000000000..0878abacbd --- /dev/null +++ b/src/basic/errno-to-name.awk @@ -0,0 +1,9 @@ +BEGIN{ + print "static const char* const errno_names[] = { " +} +!/EDEADLOCK/ && !/EWOULDBLOCK/ && !/ENOTSUP/ { + printf " [%s] = \"%s\",\n", $1, $1 +} +END{ + print "};" +} diff --git a/src/basic/generate-af-list.sh b/src/basic/generate-af-list.sh new file mode 100755 index 0000000000..8d9cdd1836 --- /dev/null +++ b/src/basic/generate-af-list.sh @@ -0,0 +1,5 @@ +#!/bin/sh -eu + +$1 -E -dM -include sys/socket.h - </dev/null | \ + grep -Ev 'AF_UNSPEC|AF_MAX' | \ + awk '/^#define[ \t]+AF_[^ \t]+[ \t]+PF_[^ \t]/ { print $2; }' diff --git a/src/basic/generate-arphrd-list.sh b/src/basic/generate-arphrd-list.sh new file mode 100755 index 0000000000..ee207fb38e --- /dev/null +++ b/src/basic/generate-arphrd-list.sh @@ -0,0 +1,5 @@ +#!/bin/sh -eu + +$1 -dM -include net/if_arp.h - </dev/null | \ + awk '/^#define[ \t]+ARPHRD_[^ \t]+[ \t]+[^ \t]/ { print $2; }' | \ + sed -e 's/ARPHRD_//' diff --git a/src/basic/generate-cap-list.sh b/src/basic/generate-cap-list.sh new file mode 100755 index 0000000000..1d4a562e7c --- /dev/null +++ b/src/basic/generate-cap-list.sh @@ -0,0 +1,5 @@ +#!/bin/sh -eu + +$1 -dM -include linux/capability.h -include "$2" -include "$3" - </dev/null | \ + awk '/^#define[ \t]+CAP_[A-Z_]+[ \t]+/ { print $2; }' | \ + grep -v CAP_LAST_CAP diff --git a/src/basic/generate-errno-list.sh b/src/basic/generate-errno-list.sh new file mode 100755 index 0000000000..e2bab8b320 --- /dev/null +++ b/src/basic/generate-errno-list.sh @@ -0,0 +1,4 @@ +#!/bin/sh -eu + +$1 -dM -include errno.h - </dev/null | \ + awk '/^#define[ \t]+E[^ _]+[ \t]+/ { print $2; }' diff --git a/src/basic/generate-gperfs.py b/src/basic/generate-gperfs.py new file mode 100644 index 0000000000..2e7d8931dd --- /dev/null +++ b/src/basic/generate-gperfs.py @@ -0,0 +1,16 @@ +#!/usr/bin/python3 + +"""Generate %-from-name.gperf from %-list.txt +""" + +import sys + +name, prefix, input = sys.argv[1:] + +print("""\ +struct {}_name {{ const char* name; int id; }}; +%null-strings +%%""".format(name)) + +for line in open(input): + print("{0}, {1}{0}".format(line.rstrip(), prefix)) diff --git a/src/basic/meson.build b/src/basic/meson.build new file mode 100644 index 0000000000..065f0ac4af --- /dev/null +++ b/src/basic/meson.build @@ -0,0 +1,281 @@ +basic_sources_plain = files(''' + af-list.c + af-list.h + alloc-util.c + alloc-util.h + architecture.c + architecture.h + arphrd-list.c + arphrd-list.h + async.c + async.h + audit-util.c + audit-util.h + barrier.c + barrier.h + bitmap.c + bitmap.h + blkid-util.h + btrfs-ctree.h + btrfs-util.c + btrfs-util.h + build.h + bus-label.c + bus-label.h + calendarspec.c + calendarspec.h + capability-util.c + capability-util.h + cap-list.c + cap-list.h + cgroup-util.c + cgroup-util.h + chattr-util.c + chattr-util.h + clock-util.c + clock-util.h + conf-files.c + conf-files.h + copy.c + copy.h + cpu-set-util.c + cpu-set-util.h + def.h + device-nodes.c + device-nodes.h + dirent-util.c + dirent-util.h + env-util.c + env-util.h + errno-list.c + errno-list.h + escape.c + escape.h + ether-addr-util.c + ether-addr-util.h + exec-util.c + exec-util.h + exit-status.c + exit-status.h + extract-word.c + extract-word.h + fd-util.c + fd-util.h + fileio.c + fileio.h + fileio-label.c + fileio-label.h + format-util.h + fs-util.c + fs-util.h + glob-util.c + glob-util.h + gunicode.c + gunicode.h + hash-funcs.c + hash-funcs.h + hashmap.c + hashmap.h + hexdecoct.c + hexdecoct.h + hostname-util.c + hostname-util.h + in-addr-util.c + in-addr-util.h + ioprio.h + io-util.c + io-util.h + journal-importer.c + journal-importer.h + khash.c + khash.h + label.c + label.h + list.h + locale-util.c + locale-util.h + lockfile-util.c + lockfile-util.h + log.c + log.h + login-util.c + login-util.h + macro.h + memfd-util.c + memfd-util.h + mempool.c + mempool.h + missing_syscall.h + mkdir.c + mkdir.h + mkdir-label.c + mount-util.c + mount-util.h + MurmurHash2.c + MurmurHash2.h + nss-util.h + ordered-set.c + ordered-set.h + parse-util.c + parse-util.h + path-util.c + path-util.h + prioq.c + prioq.h + proc-cmdline.c + proc-cmdline.h + process-util.c + process-util.h + random-util.c + random-util.h + ratelimit.c + ratelimit.h + raw-clone.h + refcnt.h + replace-var.c + replace-var.h + rlimit-util.c + rlimit-util.h + rm-rf.c + rm-rf.h + securebits.h + selinux-util.c + selinux-util.h + set.h + sigbus.c + sigbus.h + signal-util.c + signal-util.h + siphash24.c + siphash24.h + smack-util.c + smack-util.h + socket-label.c + socket-util.c + socket-util.h + sparse-endian.h + special.h + stat-util.c + stat-util.h + stdio-util.h + strbuf.c + strbuf.h + string-table.c + string-table.h + string-util.c + string-util.h + strv.c + strv.h + strxcpyx.c + strxcpyx.h + syslog-util.c + syslog-util.h + terminal-util.c + terminal-util.h + time-util.c + time-util.h + umask-util.h + unaligned.h + unit-name.c + unit-name.h + user-util.c + user-util.h + utf8.c + utf8.h + util.c + util.h + verbs.c + verbs.h + virt.c + virt.h + web-util.c + web-util.h + xattr-util.c + xattr-util.h + xml.c + xml.h +'''.split()) + +missing_h = files('missing.h') + +generate_gperfs = find_program('generate-gperfs.py') + +generate_af_list = find_program('generate-af-list.sh') +af_list_txt = custom_target( + 'af-list.txt', + output : 'af-list.txt', + command : [generate_af_list, cpp], + capture : true) + +generate_arphrd_list = find_program('generate-arphrd-list.sh') +arphrd_list_txt = custom_target( + 'arphrd-list.txt', + output : 'arphrd-list.txt', + command : [generate_arphrd_list, cpp], + capture : true) + +generate_cap_list = find_program('generate-cap-list.sh') +cap_list_txt = custom_target( + 'cap-list.txt', + output : 'cap-list.txt', + command : [generate_cap_list, cpp, config_h, missing_h], + capture : true) + +generate_errno_list = find_program('generate-errno-list.sh') +errno_list_txt = custom_target( + 'errno-list.txt', + output : 'errno-list.txt', + command : [generate_errno_list, cpp], + capture : true) + +generated_gperf_headers = [] +foreach item : [['af', af_list_txt, 'af', ''], + ['arphrd', arphrd_list_txt, 'arphrd', 'ARPHRD_'], + ['cap', cap_list_txt, 'capability', ''], + ['errno', errno_list_txt, 'errno', '']] + + fname = '@0@-from-name.gperf'.format(item[0]) + gperf_file = custom_target( + fname, + input : item[1], + output : fname, + command : [generate_gperfs, item[2], item[3], '@INPUT@'], + capture : true) + + fname = '@0@-from-name.h'.format(item[0]) + target1 = custom_target( + fname, + input : gperf_file, + output : fname, + command : [gperf, + '-L', 'ANSI-C', '-t', '--ignore-case', + '-N', 'lookup_@0@'.format(item[2]), + '-H', 'hash_@0@_name'.format(item[2]), + '-p', '-C', + '@INPUT@'], + capture : true) + + fname = '@0@-to-name.h'.format(item[0]) + awkscript = '@0@-to-name.awk'.format(item[0]) + target2 = custom_target( + fname, + input : [awkscript, item[1]], + output : fname, + command : [awk, '-f', '@INPUT0@', '@INPUT1@'], + capture : true) + + generated_gperf_headers += [target1, target2] +endforeach + +basic_sources = basic_sources_plain + [missing_h] + generated_gperf_headers + +libbasic = static_library( + 'basic', + basic_sources, + include_directories : includes, + dependencies : [threads, + libcap, + libblkid, + libselinux, + ], + install : false) diff --git a/src/boot/efi/measure.h b/src/boot/efi/measure.h index a2cfe817d0..43aa8a0058 100644 --- a/src/boot/efi/measure.h +++ b/src/boot/efi/measure.h @@ -13,9 +13,6 @@ #ifndef __SDBOOT_MEASURE_H #define __SDBOOT_MEASURE_H -#ifndef SD_TPM_PCR -#define SD_TPM_PCR 8 -#endif - EFI_STATUS tpm_log_event(UINT32 pcrindex, const EFI_PHYSICAL_ADDRESS buffer, UINTN buffer_size, const CHAR16 *description); + #endif diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build new file mode 100644 index 0000000000..6241cb1c19 --- /dev/null +++ b/src/boot/efi/meson.build @@ -0,0 +1,203 @@ +efi_headers = files(''' + console.h + disk.h + graphics.h + linux.h + measure.h + pefile.h + splash.h + util.h +'''.split()) + +common_sources = ''' + disk.c + graphics.c + measure.c + pefile.c + util.c +'''.split() + +systemd_boot_sources = ''' + boot.c + console.c +'''.split() + +stub_sources = ''' + linux.c + splash.c + stub.c +'''.split() + +if conf.get('ENABLE_EFI', 0) == 1 and get_option('gnu-efi') != 'false' + efi_cc = get_option('efi-cc') + efi_ld = get_option('efi-ld') + + efi_incdir = get_option('efi-includedir') + have_header = (gnu_efi_arch != '' and + cc.has_header('@0@/@1@/efibind.h'.format(efi_incdir, gnu_efi_arch))) + + if have_header and EFI_MACHINE_TYPE_NAME == '' + error('gnu-efi is available, but EFI_MACHINE_TYPE_NAME is unknown') + endif + + efi_libdir = get_option('efi-libdir') + if efi_libdir == '' + cmd = 'cd /usr/lib/$(@0@ -print-multi-os-directory) && pwd'.format(efi_cc) + ret = run_command('sh', '-c', cmd) + if ret.returncode() == 0 + efi_libdir = ret.stdout().strip() + endif + endif + + have_gnu_efi = have_header and efi_libdir != '' +else + have_gnu_efi = false +endif + +if get_option('gnu-efi') == 'true' and not have_gnu_efi + error('gnu-efi support requested, but headers were not found') +endif + +if have_gnu_efi + efi_conf = configuration_data() + efi_conf.set_quoted('PACKAGE_VERSION', meson.project_version()) + efi_conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME) + efi_conf.set('SD_BOOT_LOG_TPM', get_option('tpm')) + efi_conf.set('SD_TPM_PCR', get_option('tpm-pcrindex')) + + efi_config_h = configure_file( + output : 'efi_config.h', + configuration : efi_conf) + + objcopy = find_program('objcopy') + + efi_ldsdir = get_option('efi-ldsdir') + arch_lds = 'elf_@0@_efi.lds'.format(gnu_efi_arch) + if efi_ldsdir == '' + efi_ldsdir = join_paths(efi_libdir, 'gnuefi') + cmd = run_command('test', '-f', join_paths(efi_ldsdir, arch_lds)) + if cmd.returncode() != 0 + efi_ldsdir = efi_libdir + cmd = run_command('test', '-f', join_paths(efi_ldsdir, arch_lds)) + if cmd.returncode() != 0 + error('Cannot find @0@'.format(arch_lds)) + endif + endif + endif + + message('efi-libdir: "@0@"'.format(efi_libdir)) + message('efi-ldsdir: "@0@"'.format(efi_ldsdir)) + message('efi-includedir: "@0@"'.format(efi_incdir)) + + compile_args = ['-Wall', + '-Wextra', + '-std=gnu90', + '-nostdinc', + '-ggdb', '-O0', + '-fpic', + '-fshort-wchar', + '-ffreestanding', + '-fno-strict-aliasing', + '-fno-stack-protector', + '-Wsign-compare', + '-Wno-missing-field-initializers', + '-isystem', efi_incdir, + '-isystem', join_paths(efi_incdir, gnu_efi_arch), + '-include', efi_config_h] + if efi_arch == 'x86_64' + compile_args += ['-mno-red-zone', + '-mno-sse', + '-mno-mmx', + '-DEFI_FUNCTION_WRAPPER', + '-DGNU_EFI_USE_MS_ABI'] + elif efi_arch == 'ia32' + compile_args += ['-mno-sse', + '-mno-mmx'] + endif + + efi_ldflags = ['-T', + join_paths(efi_ldsdir, arch_lds), + '-shared', + '-Bsymbolic', + '-nostdlib', + '-znocombreloc', + '-L', efi_libdir, + join_paths(efi_ldsdir, 'crt0-efi-@0@.o'.format(gnu_efi_arch))] + if efi_arch == 'aarch64' or efi_arch == 'arm' + # Aarch64 and ARM32 don't have an EFI capable objcopy. Use 'binary' + # instead, and add required symbols manually. + efi_ldflags += ['--defsym=EFI_SUBSYSTEM=0xa'] + efi_format = ['-O', 'binary'] + else + efi_format = ['--target=efi-app-@0@'.format(gnu_efi_arch)] + endif + + systemd_boot_objects = [] + stub_objects = [] + foreach file : common_sources + systemd_boot_sources + stub_sources + o_file = custom_target(file + '.o', + input : file, + output : file + '.o', + command : [efi_cc, '-c', '@INPUT@', '-o', '@OUTPUT@'] + + compile_args, + depend_files : efi_headers) + if (common_sources + systemd_boot_sources).contains(file) + systemd_boot_objects += [o_file] + endif + if (common_sources + stub_sources).contains(file) + stub_objects += [o_file] + endif + endforeach + + libgcc_file_name = run_command(efi_cc, '-print-libgcc-file-name').stdout().strip() + systemd_boot_efi_name = 'systemd-boot@0@.efi'.format(EFI_MACHINE_TYPE_NAME) + stub_efi_name = 'linux@0@.efi.stub'.format(EFI_MACHINE_TYPE_NAME) + no_undefined_symbols = find_program('no-undefined-symbols.sh') + + foreach tuple : [['systemd_boot.so', systemd_boot_efi_name, systemd_boot_objects], + ['stub.so', stub_efi_name, stub_objects]] + so = custom_target( + tuple[0], + input : tuple[2], + output : tuple[0], + command : [efi_ld, '-o', '@OUTPUT@'] + + efi_ldflags + tuple[2] + + ['-lefi', '-lgnuefi', libgcc_file_name]) + + test('no-undefined-symbols-' + tuple[0], + no_undefined_symbols, + args : [so]) + + stub = custom_target( + tuple[1], + input : so, + output : tuple[1], + command : [objcopy, + '-j', '.text', + '-j', '.sdata', + '-j', '.data', + '-j', '.dynamic', + '-j', '.dynsym', + '-j', '.rel', + '-j', '.rela', + '-j', '.reloc'] + + efi_format + + ['@INPUT@', '@OUTPUT@'], + install : true, + install_dir : bootlibdir) + + set_variable(tuple[0].underscorify(), so) + set_variable(tuple[0].underscorify() + '_stub', stub) + endforeach +endif + +############################################################ + +if have_gnu_efi + test_efi_disk_img = custom_target( + 'test-efi-disk.img', + input : [systemd_boot_so, stub_so_stub], + output : 'test-efi-disk.img', + command : [test_efi_create_disk_sh, '@OUTPUT@', + '@INPUT0@', '@INPUT1@', splash_bmp]) +endif diff --git a/src/boot/efi/no-undefined-symbols.sh b/src/boot/efi/no-undefined-symbols.sh new file mode 100755 index 0000000000..08b266c455 --- /dev/null +++ b/src/boot/efi/no-undefined-symbols.sh @@ -0,0 +1,6 @@ +#!/bin/sh -eu + +if nm -D -u "$1" | grep ' U '; then + echo "Undefined symbols detected!" + exit 1 +fi diff --git a/src/core/load-fragment-gperf-nulstr.awk b/src/core/load-fragment-gperf-nulstr.awk new file mode 100644 index 0000000000..b52438abe3 --- /dev/null +++ b/src/core/load-fragment-gperf-nulstr.awk @@ -0,0 +1,14 @@ +BEGIN{ + keywords=0 ; FS="," ; + print "extern const char load_fragment_gperf_nulstr[];" ; + print "const char load_fragment_gperf_nulstr[] =" +} +keyword==1 { + print "\"" $$1 "\\0\"" +} +/%%/ { + keyword=1 +} +END { + print ";" +} diff --git a/src/core/main.c b/src/core/main.c index bcf9ea5f25..e6ae0bee31 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1162,6 +1162,8 @@ static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool switching static int bump_rlimit_nofile(struct rlimit *saved_rlimit) { struct rlimit nl; int r; + int min_max; + _cleanup_free_ char *nr_open = NULL; assert(saved_rlimit); @@ -1182,8 +1184,16 @@ static int bump_rlimit_nofile(struct rlimit *saved_rlimit) { arg_default_rlimit[RLIMIT_NOFILE] = rl; } + /* Get current RLIMIT_NOFILE maximum compiled into the kernel. */ + r = read_one_line_file("/proc/sys/fs/nr_open", &nr_open); + if (r == 0) + r = safe_atoi(nr_open, &min_max); + /* If we fail, fallback to the hard-coded kernel limit of 1024 * 1024. */ + if (r < 0) + min_max = 1024 * 1024; + /* Bump up the resource limit for ourselves substantially */ - nl.rlim_cur = nl.rlim_max = 64*1024; + nl.rlim_cur = nl.rlim_max = min_max; r = setrlimit_closest(RLIMIT_NOFILE, &nl); if (r < 0) return log_warning_errno(r, "Setting RLIMIT_NOFILE failed, ignoring: %m"); diff --git a/src/core/meson.build b/src/core/meson.build new file mode 100644 index 0000000000..e41922bf0a --- /dev/null +++ b/src/core/meson.build @@ -0,0 +1,234 @@ +libcore_la_sources = ''' + unit.c + unit.h + unit-printf.c + unit-printf.h + job.c + job.h + manager.c + manager.h + transaction.c + transaction.h + load-fragment.c + load-fragment.h + service.c + service.h + socket.c + socket.h + busname.c + busname.h + bus-policy.c + bus-policy.h + target.c + target.h + device.c + device.h + mount.c + mount.h + automount.c + automount.h + swap.c + swap.h + timer.c + timer.h + path.c + path.h + slice.c + slice.h + scope.c + scope.h + load-dropin.c + load-dropin.h + execute.c + execute.h + dynamic-user.c + dynamic-user.h + kill.c + kill.h + dbus.c + dbus.h + dbus-manager.c + dbus-manager.h + dbus-unit.c + dbus-unit.h + dbus-job.c + dbus-job.h + dbus-service.c + dbus-service.h + dbus-socket.c + dbus-socket.h + dbus-busname.c + dbus-busname.h + dbus-target.c + dbus-target.h + dbus-device.c + dbus-device.h + dbus-mount.c + dbus-mount.h + dbus-automount.c + dbus-automount.h + dbus-swap.c + dbus-swap.h + dbus-timer.c + dbus-timer.h + dbus-path.c + dbus-path.h + dbus-slice.c + dbus-slice.h + dbus-scope.c + dbus-scope.h + dbus-execute.c + dbus-execute.h + dbus-kill.c + dbus-kill.h + dbus-cgroup.c + dbus-cgroup.h + cgroup.c + cgroup.h + selinux-access.c + selinux-access.h + selinux-setup.c + selinux-setup.h + smack-setup.c + smack-setup.h + ima-setup.c + ima-setup.h + locale-setup.h + locale-setup.c + hostname-setup.c + hostname-setup.h + machine-id-setup.c + machine-id-setup.h + mount-setup.c + mount-setup.h + kmod-setup.c + kmod-setup.h + loopback-setup.h + loopback-setup.c + namespace.c + namespace.h + killall.h + killall.c + audit-fd.c + audit-fd.h + show-status.c + show-status.h + emergency-action.c + emergency-action.h +'''.split() + +load_fragment_gperf_gperf = custom_target( + 'load-fragment-gperf.gperf', + input : 'load-fragment-gperf.gperf.m4', + output: 'load-fragment-gperf.gperf', + command : [m4, '-P'] + m4_defines + ['@INPUT@'], + capture : true) + +load_fragment_gperf_c = custom_target( + 'load-fragment-gperf.c', + input : load_fragment_gperf_gperf, + output : 'load-fragment-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + +awkscript = 'load-fragment-gperf-nulstr.awk' +load_fragment_gperf_nulstr_c = custom_target( + 'load-fragment-gperf-nulstr.c', + input : [awkscript, load_fragment_gperf_gperf], + output : 'load-fragment-gperf-nulstr.c', + command : [awk, '-f', '@INPUT0@', '@INPUT1@'], + capture : true) + +libcore = static_library( + 'core', + libcore_la_sources, + load_fragment_gperf_c, + load_fragment_gperf_nulstr_c, + include_directories : includes, + link_with : [libshared_static], + dependencies : [threads, + libpam, + libaudit, + libkmod, + libapparmor, + libmount]) + +systemd_sources = files('main.c') + +systemd_shutdown_sources = files(''' + shutdown.c + umount.c + umount.h + mount-setup.c + mount-setup.h + killall.c + killall.h +'''.split()) + +in_files = [['macros.systemd', rpmmacrosdir], + ['triggers.systemd', ''], + ['systemd.pc', pkgconfigdatadir]] + +foreach item : in_files + file = item[0] + dir = item[1] + + # If 'no', disable generation completely. + # If '', generate, but do not install. + if dir != 'no' + gen = configure_file( + input : file + '.in', + output : file, + configuration : substs) + if dir != '' + install_data(gen, + install_dir : dir) + endif + endif +endforeach + +install_data('org.freedesktop.systemd1.conf', + install_dir : dbuspolicydir) +install_data('org.freedesktop.systemd1.service', + install_dir : dbussystemservicedir) + +policy_in = configure_file( + input : 'org.freedesktop.systemd1.policy.in.in', + output : 'org.freedesktop.systemd1.policy.in', + configuration : substs) + +custom_target( + 'org.freedesktop.systemd1.policy', + input : policy_in, + output : 'org.freedesktop.systemd1.policy', + command : intltool_command, + install : install_polkit, + install_dir : polkitpolicydir) + +# TODO: this might work with meson from git, see +# https://github.com/mesonbuild/meson/issues/1441#issuecomment-283585493 +# +# i18n.merge_file( +# 'org.freedesktop.systemd1.policy', +# po_dir : po_dir, +# input : policy_in, +# output : 'org.freedesktop.systemd1.policy', +# install : install_polkit, +# install_dir : polkitpolicydir) + +install_data('system.conf', + 'user.conf', + install_dir : pkgsysconfdir) + +meson.add_install_script('sh', '-c', mkdir_p.format(systemshutdowndir)) +meson.add_install_script('sh', '-c', mkdir_p.format(systemsleepdir)) +meson.add_install_script('sh', '-c', mkdir_p.format(systemgeneratordir)) +meson.add_install_script('sh', '-c', mkdir_p.format(usergeneratordir)) + +meson.add_install_script('sh', '-c', + mkdir_p.format(join_paths(pkgsysconfdir, 'system/multi-user.target.wants'))) +meson.add_install_script('sh', '-c', + mkdir_p.format(join_paths(pkgsysconfdir, 'system/getty.target.wants'))) +meson.add_install_script('sh', '-c', + mkdir_p.format(join_paths(pkgsysconfdir, 'user'))) +meson.add_install_script('sh', '-c', + mkdir_p.format(join_paths(sysconfdir, 'xdg/systemd'))) diff --git a/src/coredump/meson.build b/src/coredump/meson.build new file mode 100644 index 0000000000..ab3be6a7de --- /dev/null +++ b/src/coredump/meson.build @@ -0,0 +1,24 @@ +systemd_coredump_sources = files(''' + coredump.c + coredump-vacuum.c + coredump-vacuum.h +'''.split()) + +if conf.get('HAVE_ELFUTILS', 0) == 1 + systemd_coredump_sources += files(['stacktrace.c', + 'stacktrace.h']) +endif + +coredumpctl_sources = files('coredumpctl.c') + +install_data('coredump.conf', + install_dir : pkgsysconfdir) + +tests += [ + [['src/coredump/test-coredump-vacuum.c', + 'src/coredump/coredump-vacuum.c', + 'src/coredump/coredump-vacuum.h'], + [], + [], + 'ENABLE_COREDUMP', 'manual'], +] diff --git a/src/hostname/meson.build b/src/hostname/meson.build new file mode 100644 index 0000000000..7cb5fc135a --- /dev/null +++ b/src/hostname/meson.build @@ -0,0 +1,14 @@ +if conf.get('ENABLE_HOSTNAMED', 0) == 1 + install_data('org.freedesktop.hostname1.conf', + install_dir : dbuspolicydir) + install_data('org.freedesktop.hostname1.service', + install_dir : dbussystemservicedir) + + custom_target( + 'org.freedesktop.hostname1.policy', + input : 'org.freedesktop.hostname1.policy.in', + output : 'org.freedesktop.hostname1.policy', + command : intltool_command, + install : install_polkit, + install_dir : polkitpolicydir) +endif diff --git a/src/import/meson.build b/src/import/meson.build new file mode 100644 index 0000000000..f0ed92b4c2 --- /dev/null +++ b/src/import/meson.build @@ -0,0 +1,77 @@ +systemd_importd_sources = files(''' + importd.c +'''.split()) + +systemd_pull_sources = files(''' + pull.c + pull-raw.c + pull-raw.h + pull-tar.c + pull-tar.h + pull-job.c + pull-job.h + pull-common.c + pull-common.h + import-common.c + import-common.h + import-compress.c + import-compress.h + curl-util.c + curl-util.h + qcow2-util.c + qcow2-util.h +'''.split()) + +systemd_import_sources = files(''' + import.c + import-raw.c + import-raw.h + import-tar.c + import-tar.h + import-common.c + import-common.h + import-compress.c + import-compress.h + qcow2-util.c + qcow2-util.h +'''.split()) + +systemd_export_sources = files(''' + export.c + export-tar.c + export-tar.h + export-raw.c + export-raw.h + import-common.c + import-common.h + import-compress.c + import-compress.h +'''.split()) + +if conf.get('ENABLE_IMPORTD', 0) == 1 + install_data('org.freedesktop.import1.conf', + install_dir : dbuspolicydir) + install_data('org.freedesktop.import1.service', + install_dir : dbussystemservicedir) + + custom_target( + 'org.freedesktop.import1.policy', + input : 'org.freedesktop.import1.policy.in', + output : 'org.freedesktop.import1.policy', + command : intltool_command, + install : install_polkit, + install_dir : polkitpolicydir) + + install_data('import-pubring.gpg', + install_dir : rootlibexecdir) + # TODO: shouldn't this be in pkgdatadir? +endif + +tests += [ + [['src/import/test-qcow2.c', + 'src/import/qcow2-util.c', + 'src/import/qcow2-util.h'], + [libshared], + [libz], + 'HAVE_ZLIB', 'manual'], +] diff --git a/src/import/pull-job.c b/src/import/pull-job.c index 8eabb09eed..320c21305a 100644 --- a/src/import/pull-job.c +++ b/src/import/pull-job.c @@ -22,15 +22,15 @@ #include "alloc-util.h" #include "fd-util.h" #include "hexdecoct.h" +#include "import-util.h" #include "io-util.h" #include "machine-pool.h" #include "parse-util.h" +#include "pull-common.h" #include "pull-job.h" #include "string-util.h" #include "strv.h" #include "xattr-util.h" -#include "pull-common.h" -#include "import-util.h" PullJob* pull_job_unref(PullJob *j) { if (!j) @@ -84,10 +84,9 @@ static int pull_job_restart(PullJob *j) { return r; free(j->url); - free(j->payload); j->url = chksum_url; j->state = PULL_JOB_INIT; - j->payload = NULL; + j->payload = mfree(j->payload); j->payload_size = 0; j->payload_allocated = 0; j->written_compressed = 0; @@ -101,7 +100,6 @@ static int pull_job_restart(PullJob *j) { return 0; } - void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) { PullJob *j = NULL; CURLcode code; diff --git a/src/journal-remote/meson.build b/src/journal-remote/meson.build new file mode 100644 index 0000000000..072fa14548 --- /dev/null +++ b/src/journal-remote/meson.build @@ -0,0 +1,49 @@ +systemd_journal_upload_sources = files(''' + journal-upload.h + journal-upload.c + journal-upload-journal.c +'''.split()) + +systemd_journal_remote_sources = files(''' + journal-remote-parse.h + journal-remote-parse.c + journal-remote-write.h + journal-remote-write.c + journal-remote.h + journal-remote.c + microhttpd-util.h + microhttpd-util.c +'''.split()) + +systemd_journal_gatewayd_sources = files(''' + journal-gatewayd.c + microhttpd-util.h + microhttpd-util.c +'''.split()) + +if conf.get('ENABLE_REMOTE', 0) == 1 and conf.get('HAVE_LIBCURL', 0) == 1 + journal_upload_conf = configure_file( + input : 'journal-upload.conf.in', + output : 'journal-upload.conf', + configuration : substs) + install_data(journal_upload_conf, + install_dir : pkgsysconfdir) +endif + +if conf.get('ENABLE_REMOTE', 0) == 1 and conf.get('HAVE_MICROHTTPD', 0) == 1 + journal_remote_conf = configure_file( + input : 'journal-remote.conf.in', + output : 'journal-remote.conf', + configuration : substs) + install_data(journal_remote_conf, + install_dir : pkgsysconfdir) + + install_data('browse.html', + install_dir : join_paths(pkgdatadir, 'gatewayd')) + + meson.add_install_script('sh', '-c', + mkdir_p.format('/var/log/journal/remote')) + meson.add_install_script('sh', '-c', + 'chown 0:0 $DESTDIR/var/log/journal/remote && + chmod 755 $DESTDIR/var/log/journal/remote || :') +endif diff --git a/src/journal/audit_type-to-name.awk b/src/journal/audit_type-to-name.awk new file mode 100644 index 0000000000..44fc702eb3 --- /dev/null +++ b/src/journal/audit_type-to-name.awk @@ -0,0 +1,9 @@ +BEGIN{ + print "const char *audit_type_to_string(int type) {\n\tswitch(type) {" +} +{ + printf " case AUDIT_%s: return \"%s\";\n", $1, $1 +} +END{ + print " default: return NULL;\n\t}\n}\n" +} diff --git a/src/journal/fsprg.c b/src/journal/fsprg.c index 612b10f3a9..e7c22880be 100644 --- a/src/journal/fsprg.c +++ b/src/journal/fsprg.c @@ -40,6 +40,9 @@ #define RND_GEN_Q 0x02 #define RND_GEN_X 0x03 +#pragma GCC diagnostic ignored "-Wpointer-arith" +/* TODO: remove void* arithmetic and this work-around */ + /******************************************************************************/ static void mpi_export(void *buf, size_t buflen, const gcry_mpi_t x) { diff --git a/src/journal/generate-audit_type-list.sh b/src/journal/generate-audit_type-list.sh new file mode 100755 index 0000000000..18cbe0599c --- /dev/null +++ b/src/journal/generate-audit_type-list.sh @@ -0,0 +1,14 @@ +#!/bin/sh -eu + +cpp="$1" +shift + +includes="" +for i in "$@"; do + includes="$includes -include $i" +done + +$cpp -dM $includes - </dev/null | \ + grep -vE 'AUDIT_.*(FIRST|LAST)_' | \ + sed -r -n 's/^#define\s+AUDIT_(\w+)\s+([0-9]{4})\s*$$/\1\t\2/p' | \ + sort -k2 diff --git a/src/journal/meson.build b/src/journal/meson.build new file mode 100644 index 0000000000..37ec559e41 --- /dev/null +++ b/src/journal/meson.build @@ -0,0 +1,122 @@ +journal_internal_sources = files(''' + audit-type.c + audit-type.h + catalog.c + catalog.h + compress.c + compress.h + journal-def.h + journal-file.c + journal-file.h + journal-send.c + journal-vacuum.c + journal-vacuum.h + journal-verify.c + journal-verify.h + lookup3.c + lookup3.h + mmap-cache.c + mmap-cache.h + sd-journal.c +'''.split()) + +if conf.get('HAVE_GCRYPT', 0) == 1 + journal_internal_sources += files(''' + journal-authenticate.c + journal-authenticate.h + fsprg.c + fsprg.h + '''.split()) + + journal_internal_sources += gcrypt_util_sources +endif + +############################################################ + +audit_type_includes = [config_h, + missing_h, + 'linux/audit.h'] +if conf.get('HAVE_AUDIT', 0) == 1 + audit_type_includes += 'libaudit.h' +endif + +generate_audit_type_list = find_program('generate-audit_type-list.sh') +audit_type_list_txt = custom_target( + 'audit_type-list.txt', + output : 'audit_type-list.txt', + command : [generate_audit_type_list, cpp] + audit_type_includes, + capture : true) + +audit_type_to_name = custom_target( + 'audit_type-to-name.h', + input : ['audit_type-to-name.awk', audit_type_list_txt], + output : 'audit_type-to-name.h', + command : [awk, '-f', '@INPUT0@', '@INPUT1@'], + capture : true) + +journal_internal_sources += [audit_type_to_name] + +############################################################ + +libjournal_core_sources = files(''' + journald-kmsg.c + journald-kmsg.h + journald-syslog.c + journald-syslog.h + journald-stream.c + journald-stream.h + journald-server.c + journald-server.h + journald-console.c + journald-console.h + journald-wall.c + journald-wall.h + journald-native.c + journald-native.h + journald-audit.c + journald-audit.h + journald-rate-limit.c + journald-rate-limit.h + journal-internal.h +'''.split()) + +systemd_journald_sources = files(''' + journald.c + journald-server.h +'''.split()) + +journald_gperf_c = custom_target( + 'journald-gperf.c', + input : 'journald-gperf.gperf', + output : 'journald-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + +systemd_cat_sources = files('cat.c') + +journalctl_sources = files('journalctl.c') + +if conf.get('HAVE_QRENCODE', 0) == 1 + journalctl_sources += files('journal-qrcode.c', + 'journal-qrcode.h') +endif + +install_data('journald.conf', + install_dir : pkgsysconfdir) + +meson.add_install_script( + 'sh', '-c', + mkdir_p.format('/var/log/journal')) +meson.add_install_script( + 'sh', '-c', + 'chown 0:0 $DESTDIR/var/log/journal && + chmod 755 $DESTDIR/var/log/journal || :') +if get_option('adm-group') + meson.add_install_script( + 'sh', '-c', + 'setfacl -nm g:adm:rx,d:g:adm:rx $DESTDIR/var/log/journal || :') +endif +if get_option('wheel-group') + meson.add_install_script( + 'sh', '-c', + 'setfacl -nm g:wheel:rx,d:g:wheel:rx $DESTDIR/var/log/journal || :') +endif diff --git a/src/kernel-install/meson.build b/src/kernel-install/meson.build new file mode 100644 index 0000000000..ede3323bab --- /dev/null +++ b/src/kernel-install/meson.build @@ -0,0 +1,11 @@ +install_data('kernel-install', + install_mode : 'rwxr-xr-x', + install_dir : bindir) + +install_data('50-depmod.install', + '90-loaderentry.install', + install_mode : 'rwxr-xr-x', + install_dir : kernelinstalldir) + +meson.add_install_script('sh', '-c', + mkdir_p.format(join_paths(sysconfdir, 'kernel/install.d'))) diff --git a/src/libsystemd-network/meson.build b/src/libsystemd-network/meson.build new file mode 100644 index 0000000000..3285bcaed1 --- /dev/null +++ b/src/libsystemd-network/meson.build @@ -0,0 +1,46 @@ +sources = files(''' + sd-dhcp-client.c + sd-dhcp-server.c + dhcp-network.c + dhcp-option.c + dhcp-packet.c + dhcp-internal.h + dhcp-server-internal.h + dhcp-protocol.h + dhcp-lease-internal.h + sd-dhcp-lease.c + sd-ipv4ll.c + sd-ipv4acd.c + arp-util.h + arp-util.c + network-internal.c + sd-ndisc.c + ndisc-internal.h + ndisc-router.h + ndisc-router.c + icmp6-util.h + icmp6-util.c + sd-dhcp6-client.c + dhcp6-internal.h + dhcp6-protocol.h + dhcp6-network.c + dhcp6-option.c + dhcp6-lease-internal.h + sd-dhcp6-lease.c + dhcp-identifier.h + dhcp-identifier.c + lldp-internal.h + lldp-network.h + lldp-network.c + lldp-neighbor.h + lldp-neighbor.c + sd-lldp.c +'''.split()) + +network_internal_h = files('network-internal.h') + +libsystemd_network = static_library( + 'systemd-network', + sources, + network_internal_h, + include_directories : includes) diff --git a/src/libsystemd/meson.build b/src/libsystemd/meson.build new file mode 100644 index 0000000000..ab69afee42 --- /dev/null +++ b/src/libsystemd/meson.build @@ -0,0 +1,96 @@ +sd_login_c = files('sd-login/sd-login.c') + +libsystemd_internal_sources = files(''' + sd-bus/bus-bloom.c + sd-bus/bus-bloom.h + sd-bus/bus-common-errors.c + sd-bus/bus-common-errors.h + sd-bus/bus-container.c + sd-bus/bus-container.h + sd-bus/bus-control.c + sd-bus/bus-control.h + sd-bus/bus-convenience.c + sd-bus/bus-creds.c + sd-bus/bus-creds.h + sd-bus/bus-dump.c + sd-bus/bus-dump.h + sd-bus/bus-error.c + sd-bus/bus-error.h + sd-bus/bus-gvariant.c + sd-bus/bus-gvariant.h + sd-bus/bus-internal.c + sd-bus/bus-internal.h + sd-bus/bus-introspect.c + sd-bus/bus-introspect.h + sd-bus/bus-kernel.c + sd-bus/bus-kernel.h + sd-bus/bus-match.c + sd-bus/bus-match.h + sd-bus/bus-message.c + sd-bus/bus-message.h + sd-bus/bus-objects.c + sd-bus/bus-objects.h + sd-bus/bus-protocol.h + sd-bus/bus-signature.c + sd-bus/bus-signature.h + sd-bus/bus-slot.c + sd-bus/bus-slot.h + sd-bus/bus-socket.c + sd-bus/bus-socket.h + sd-bus/bus-track.c + sd-bus/bus-track.h + sd-bus/bus-type.c + sd-bus/bus-type.h + sd-bus/kdbus.h + sd-bus/sd-bus.c + sd-daemon/sd-daemon.c + sd-device/device-enumerator-private.h + sd-device/device-enumerator.c + sd-device/device-internal.h + sd-device/device-private.c + sd-device/device-private.h + sd-device/device-util.h + sd-device/sd-device.c + sd-event/sd-event.c + sd-hwdb/hwdb-internal.h + sd-hwdb/hwdb-util.h + sd-hwdb/sd-hwdb.c + sd-id128/id128-util.c + sd-id128/id128-util.h + sd-id128/sd-id128.c + sd-netlink/local-addresses.c + sd-netlink/local-addresses.h + sd-netlink/netlink-internal.h + sd-netlink/netlink-message.c + sd-netlink/netlink-socket.c + sd-netlink/netlink-types.c + sd-netlink/netlink-types.h + sd-netlink/netlink-util.c + sd-netlink/netlink-util.h + sd-netlink/rtnl-message.c + sd-netlink/sd-netlink.c + sd-network/network-util.c + sd-network/network-util.h + sd-network/sd-network.c + sd-path/sd-path.c + sd-resolve/sd-resolve.c + sd-utf8/sd-utf8.c +'''.split()) + sd_login_c + +libsystemd_internal = static_library( + 'systemd', + libsystemd_internal_sources, + install : false, + include_directories : includes, + link_with : libbasic, + dependencies : [threads, + librt]) + +libsystemd_sym = 'src/libsystemd/libsystemd.sym' + +libsystemd_pc = configure_file( + input : 'libsystemd.pc.in', + output : 'libsystemd.pc', + configuration : substs) +install_data(libsystemd_pc, + install_dir : pkgconfiglibdir) diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index 9bd07ffcab..b6f5afe1b3 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -1057,6 +1057,22 @@ static int object_manager_serialize_path( if (r < 0) return r; + r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Peer", 0); + if (r < 0) + return r; + + r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Introspectable", 0); + if (r < 0) + return r; + + r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Properties", 0); + if (r < 0) + return r; + + r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0); + if (r < 0) + return r; + found_something = true; } diff --git a/src/libudev/meson.build b/src/libudev/meson.build new file mode 100644 index 0000000000..1378f9a251 --- /dev/null +++ b/src/libudev/meson.build @@ -0,0 +1,41 @@ +libudev_sources = files(''' + libudev-private.h + libudev-device-internal.h + libudev.c + libudev-list.c + libudev-util.c + libudev-device.c + libudev-device-private.c + libudev-enumerate.c + libudev-monitor.c + libudev-queue.c + libudev-hwdb.c +'''.split()) + +############################################################ + +libudev_sym = 'libudev.sym' +libudev_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libudev_sym) +libudev = shared_library( + 'udev', + libudev_sources, + version : '1.6.6', + include_directories : includes, + link_args : ['-shared', + '-Wl,--version-script=' + libudev_sym_path], + link_with : [libbasic, + libsystemd_internal], + dependencies : [threads], + link_depends : libudev_sym, + install : true, + install_dir : rootlibdir) + +install_headers('libudev.h') +libudev_h_path = '@0@/libudev.h'.format(meson.current_source_dir()) + +libudev_pc = configure_file( + input : 'libudev.pc.in', + output : 'libudev.pc', + configuration : substs) +install_data(libudev_pc, + install_dir : pkgconfiglibdir) diff --git a/src/locale/meson.build b/src/locale/meson.build new file mode 100644 index 0000000000..d03af4c0e2 --- /dev/null +++ b/src/locale/meson.build @@ -0,0 +1,42 @@ +systemd_localed_sources = files(''' + localed.c + keymap-util.c + keymap-util.h +'''.split()) + +localectl_sources = files('localectl.c') + +if conf.get('ENABLE_LOCALED', 0) == 1 + install_data('org.freedesktop.locale1.conf', + install_dir : dbuspolicydir) + install_data('org.freedesktop.locale1.service', + install_dir : dbussystemservicedir) + + custom_target( + 'org.freedesktop.locale1.policy', + input : 'org.freedesktop.locale1.policy.in', + output : 'org.freedesktop.locale1.policy', + command : intltool_command, + install : install_polkit, + install_dir : polkitpolicydir) +endif + +# If you know a way that allows the same variables to be used +# in sources list and concatenated to a string for test_env, +# let me know. +kbd_model_map = join_paths(meson.current_source_dir(), 'kbd-model-map') +language_fallback_map = join_paths(meson.current_source_dir(), 'language-fallback-map') + +if conf.get('ENABLE_LOCALED', 0) == 1 + install_data('kbd-model-map', + 'language-fallback-map', + install_dir : pkgdatadir) +endif + +tests += [ + [['src/locale/test-keymap-util.c', + 'src/locale/keymap-util.c', + 'src/locale/keymap-util.h'], + [libshared], + [libdl]], +] diff --git a/src/login/meson.build b/src/login/meson.build new file mode 100644 index 0000000000..a518215be8 --- /dev/null +++ b/src/login/meson.build @@ -0,0 +1,104 @@ +systemd_logind_sources = files(''' + logind.c + logind.h +'''.split()) + +logind_gperf_c = custom_target( + 'logind_gperf.c', + input : 'logind-gperf.gperf', + output : 'logind-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + +systemd_logind_sources += [logind_gperf_c] + + +liblogind_core_sources = files(''' + logind-core.c + logind-device.c + logind-device.h + logind-button.c + logind-button.h + logind-action.c + logind-action.h + logind-seat.c + logind-seat.h + logind-session.c + logind-session.h + logind-session-device.c + logind-session-device.h + logind-user.c + logind-user.h + logind-inhibit.c + logind-inhibit.h + logind-dbus.c + logind-session-dbus.c + logind-seat-dbus.c + logind-user-dbus.c + logind-utmp.c + logind-acl.h +'''.split()) + +logind_acl_c = files('logind-acl.c') +if conf.get('HAVE_ACL', 0) == 1 + liblogind_core_sources += logind_acl_c +endif + +liblogind_core = static_library( + 'logind-core', + liblogind_core_sources, + include_directories : includes, + dependencies : [libacl]) + +loginctl_sources = files(''' + loginctl.c + sysfs-show.h + sysfs-show.c +'''.split()) + +if conf.get('ENABLE_LOGIND', 0) == 1 + logind_conf = configure_file( + input : 'logind.conf.in', + output : 'logind.conf', + configuration : substs) + install_data(logind_conf, + install_dir : pkgsysconfdir) + + pam_systemd_sym = 'src/login/pam_systemd.sym' + pam_systemd_c = files('pam_systemd.c') + + install_data('org.freedesktop.login1.conf', + install_dir : dbuspolicydir) + install_data('org.freedesktop.login1.service', + install_dir : dbussystemservicedir) + + custom_target( + 'org.freedesktop.login1.policy', + input : 'org.freedesktop.login1.policy.in', + output : 'org.freedesktop.login1.policy', + command : intltool_command, + install : install_polkit, + install_dir : polkitpolicydir) + + install_data('70-power-switch.rules', + '70-uaccess.rules', + install_dir : udevrulesdir) + + foreach file : ['71-seat.rules', + '73-seat-late.rules'] + gen = configure_file( + input : file + '.in', + output : file, + configuration : substs) + install_data(gen, + install_dir : udevrulesdir) + endforeach + + custom_target( + 'systemd-user', + input : 'systemd-user.m4', + output: 'systemd-user', + command : [m4, '-P'] + m4_defines + ['@INPUT@'], + capture : true, + install : pamconfdir != 'no', + install_dir : pamconfdir) +endif diff --git a/src/machine/meson.build b/src/machine/meson.build new file mode 100644 index 0000000000..953774fdb6 --- /dev/null +++ b/src/machine/meson.build @@ -0,0 +1,45 @@ +systemd_machined_sources = files(''' + machined.c + machined.h +'''.split()) + +libmachine_core_sources = files(''' + machine.c + machine.h + machined-dbus.c + machine-dbus.c + machine-dbus.h + image-dbus.c + image-dbus.h + operation.c + operation.h +'''.split()) + +libmachine_core = static_library( + 'machine-core', + libmachine_core_sources, + include_directories : includes, + dependencies : [threads]) + +if conf.get('ENABLE_MACHINED', 0) == 1 + install_data('org.freedesktop.machine1.conf', + install_dir : dbuspolicydir) + install_data('org.freedesktop.machine1.service', + install_dir : dbussystemservicedir) + + custom_target( + 'org.freedesktop.machine1.policy', + input : 'org.freedesktop.machine1.policy.in', + output : 'org.freedesktop.machine1.policy', + command : intltool_command, + install : install_polkit, + install_dir : polkitpolicydir) +endif + +tests += [ + [['src/machine/test-machine-tables.c'], + [libmachine_core, + libshared], + [threads], + 'ENABLE_MACHINED'], +] diff --git a/src/network/meson.build b/src/network/meson.build new file mode 100644 index 0000000000..771aa68ec1 --- /dev/null +++ b/src/network/meson.build @@ -0,0 +1,146 @@ +sources = files(''' + netdev/bond.c + netdev/bond.h + netdev/bridge.c + netdev/bridge.h + netdev/dummy.c + netdev/dummy.h + netdev/ipvlan.c + netdev/ipvlan.h + netdev/macvlan.c + netdev/macvlan.h + netdev/netdev.c + netdev/netdev.h + netdev/tunnel.c + netdev/tunnel.h + netdev/tuntap.c + netdev/tuntap.h + netdev/vcan.c + netdev/vcan.h + netdev/veth.c + netdev/veth.h + netdev/vlan.c + netdev/vlan.h + netdev/vrf.c + netdev/vrf.h + netdev/vxlan.c + netdev/vxlan.h + netdev/geneve.c + netdev/geneve.h + networkd-address-pool.c + networkd-address-pool.h + networkd-address.c + networkd-address.h + networkd-brvlan.c + networkd-brvlan.h + networkd-conf.c + networkd-conf.h + networkd-dhcp4.c + networkd-dhcp6.c + networkd-fdb.c + networkd-fdb.h + networkd-ipv4ll.c + networkd-ipv6-proxy-ndp.c + networkd-ipv6-proxy-ndp.h + networkd-link-bus.c + networkd-link.c + networkd-link.h + networkd-lldp-tx.c + networkd-lldp-tx.h + networkd-manager-bus.c + networkd-manager.c + networkd-manager.h + networkd-ndisc.c + networkd-ndisc.h + networkd-network-bus.c + networkd-network.c + networkd-network.h + networkd-route.c + networkd-route.h + networkd-util.c + networkd-util.h +'''.split()) + +systemd_networkd_sources = files('networkd.c') + +systemd_networkd_wait_online_sources = files(''' + wait-online/link.c + wait-online/link.h + wait-online/manager.c + wait-online/manager.h + wait-online/wait-online.c +'''.split()) + network_internal_h + +networkctl_sources = files('networkctl.c') + +network_include_dir = include_directories('.') + +if conf.get('ENABLE_NETWORKD', 0) == 1 + networkd_gperf_c = custom_target( + 'networkd-gperf.c', + input : 'networkd-gperf.gperf', + output : 'networkd-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + + networkd_network_gperf_c = custom_target( + 'networkd-network-gperf.c', + input : 'networkd-network-gperf.gperf', + output : 'networkd-network-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + + netdev_gperf_c = custom_target( + 'netdev-gperf.c', + input : 'netdev/netdev-gperf.gperf', + output : 'netdev-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + + libnetworkd_core = static_library( + 'networkd-core', + sources, + network_internal_h, + networkd_gperf_c, + networkd_network_gperf_c, + netdev_gperf_c, + include_directories : includes, + link_with : [libshared]) + + install_data('org.freedesktop.network1.conf', + install_dir : dbuspolicydir) + install_data('org.freedesktop.network1.service', + install_dir : dbussystemservicedir) + if install_polkit + install_data('systemd-networkd.rules', + install_dir : polkitrulesdir) + endif + if install_polkit_pkla + install_data('systemd-networkd.pkla', + install_dir : polkitpkladir) + endif + + tests += [ + [['src/network/test-networkd-conf.c'], + [libnetworkd_core, + libsystemd_network, + libudev], + []], + + [['src/network/test-network.c'], + [libnetworkd_core, + libudev_internal, + libsystemd_network, + libshared], + []], + + [['src/network/test-network-tables.c', + 'src/network/test-network-tables.c', + test_tables_h], + [libnetworkd_core, + libudev_internal, + libudev_core, + libsystemd_network, + libshared], + [], + '', '', [], + [network_include_dir] + libudev_core_includes], + ] +endif diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c index bb9807b556..07c69f4711 100644 --- a/src/network/netdev/geneve.c +++ b/src/network/netdev/geneve.c @@ -201,71 +201,6 @@ int config_parse_geneve_vni(const char *unit, return 0; } -int config_parse_geneve_tos(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - Geneve *v = userdata; - uint8_t f; - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - assert(data); - - r = safe_atou8(rvalue, &f); - if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse Geneve TOS '%s'.", rvalue); - return 0; - } - - v->tos = f; - - return 0; -} - -int config_parse_geneve_ttl(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { - Geneve *v = userdata; - uint8_t f; - int r; - - assert(filename); - assert(lvalue); - assert(rvalue); - assert(data); - - r = safe_atou8(rvalue, &f); - if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse Geneve TTL '%s'.", rvalue); - return 0; - } - - if (f == 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Invalid Geneve TTL '%s'.", rvalue); - return 0; - } - - v->ttl = f; - - return 0; -} - int config_parse_geneve_address(const char *unit, const char *filename, unsigned line, @@ -369,6 +304,21 @@ int config_parse_geneve_flow_label(const char *unit, return 0; } +static int netdev_geneve_verify(NetDev *netdev, const char *filename) { + Geneve *v = GENEVE(netdev); + + assert(netdev); + assert(v); + assert(filename); + + if (v->ttl == 0) { + log_warning("Invalid Geneve TTL value '0' configured in '%s'. Ignoring", filename); + return -EINVAL; + } + + return 0; +} + static void geneve_init(NetDev *netdev) { Geneve *v; @@ -391,4 +341,5 @@ const NetDevVTable geneve_vtable = { .sections = "Match\0NetDev\0GENEVE\0", .create = netdev_geneve_create, .create_type = NETDEV_CREATE_INDEPENDENT, + .config_verify = netdev_geneve_verify, }; diff --git a/src/network/netdev/geneve.h b/src/network/netdev/geneve.h index 3ba599aae6..d97dac892c 100644 --- a/src/network/netdev/geneve.h +++ b/src/network/netdev/geneve.h @@ -63,28 +63,6 @@ int config_parse_geneve_vni(const char *unit, void *data, void *userdata); -int config_parse_geneve_tos(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata); - -int config_parse_geneve_ttl(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata); - int config_parse_geneve_address(const char *unit, const char *filename, unsigned line, diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf index a27a3d5562..6016b99b54 100644 --- a/src/network/netdev/netdev-gperf.gperf +++ b/src/network/netdev/netdev-gperf.gperf @@ -83,8 +83,8 @@ VXLAN.DestinationPort, config_parse_destination_port, 0, VXLAN.FlowLabel, config_parse_flow_label, 0, 0 GENEVE.Id, config_parse_geneve_vni, 0, offsetof(Geneve, id) GENEVE.Remote, config_parse_geneve_address, 0, offsetof(Geneve, remote) -GENEVE.TOS, config_parse_geneve_tos, 0, offsetof(Geneve, tos) -GENEVE.TTL, config_parse_geneve_ttl, 0, offsetof(Geneve, ttl) +GENEVE.TOS, config_parse_uint8, 0, offsetof(Geneve, tos) +GENEVE.TTL, config_parse_uint8, 0, offsetof(Geneve, ttl) GENEVE.UDPChecksum, config_parse_bool, 0, offsetof(Geneve, udpcsum) GENEVE.UDP6ZeroCheckSumRx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumrx) GENEVE.UDP6ZeroCheckSumTx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumtx) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 56f831628c..94204bddd0 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -996,6 +996,10 @@ int config_parse_ipv6_route_preference(const char *unit, _cleanup_route_free_ Route *n = NULL; int r; + r = route_new_static(network, filename, section_line, &n); + if (r < 0) + return r; + if (streq(rvalue, "low")) n->pref = ICMPV6_ROUTER_PREF_LOW; else if (streq(rvalue, "medium")) diff --git a/src/nspawn/meson.build b/src/nspawn/meson.build new file mode 100644 index 0000000000..b6ac6006ab --- /dev/null +++ b/src/nspawn/meson.build @@ -0,0 +1,40 @@ +systemd_nspawn_sources = files(''' + nspawn.c + nspawn-settings.c + nspawn-settings.h + nspawn-mount.c + nspawn-mount.h + nspawn-network.c + nspawn-network.h + nspawn-expose-ports.c + nspawn-expose-ports.h + nspawn-cgroup.c + nspawn-cgroup.h + nspawn-seccomp.c + nspawn-seccomp.h + nspawn-register.c + nspawn-register.h + nspawn-setuid.c + nspawn-setuid.h + nspawn-stub-pid1.c + nspawn-stub-pid1.h + nspawn-patch-uid.c + nspawn-patch-uid.h +'''.split()) + +nspawn_gperf_c = custom_target( + 'nspawn-gperf.c', + input : 'nspawn-gperf.gperf', + output : 'nspawn-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + +systemd_nspawn_sources += [nspawn_gperf_c] + +tests += [ + [['src/nspawn/test-patch-uid.c', + 'src/nspawn/nspawn-patch-uid.c', + 'src/nspawn/nspawn-patch-uid.h'], + [libshared], + [libacl], + '', 'manual'], +] diff --git a/src/resolve/dns_type-to-name.awk b/src/resolve/dns_type-to-name.awk new file mode 100644 index 0000000000..badb1824b5 --- /dev/null +++ b/src/resolve/dns_type-to-name.awk @@ -0,0 +1,11 @@ +BEGIN{ + print "const char *dns_type_to_string(int type) {\n\tswitch(type) {" +} +{ + printf " case DNS_TYPE_%s: return ", $1; + sub(/_/, "-"); + printf "\"%s\";\n", $1 +} +END{ + print " default: return NULL;\n\t}\n}\n" +} diff --git a/src/resolve/generate-dns_type-gperf.py b/src/resolve/generate-dns_type-gperf.py new file mode 100644 index 0000000000..fb36c850af --- /dev/null +++ b/src/resolve/generate-dns_type-gperf.py @@ -0,0 +1,18 @@ +#!/usr/bin/python3 + +"""Generate %-from-name.gperf from %-list.txt +""" + +import sys + +name, prefix, input = sys.argv[1:] + +print("""\ +struct {}_name {{ const char* name; int id; }}; +%null-strings +%%""".format(name)) + +for line in open(input): + line = line.rstrip() + s = line.replace('_', '-') + print("{}, {}{}".format(s, prefix, line)) diff --git a/src/resolve/generate-dns_type-list.sed b/src/resolve/generate-dns_type-list.sed new file mode 100644 index 0000000000..b7bc30f1f2 --- /dev/null +++ b/src/resolve/generate-dns_type-list.sed @@ -0,0 +1 @@ +s/.* DNS_TYPE_(\w+).*/\1/p diff --git a/src/resolve/meson.build b/src/resolve/meson.build new file mode 100644 index 0000000000..347ffaaeca --- /dev/null +++ b/src/resolve/meson.build @@ -0,0 +1,178 @@ +basic_dns_sources = files(''' + resolved-dns-dnssec.c + resolved-dns-dnssec.h + resolved-dns-packet.c + resolved-dns-packet.h + resolved-dns-rr.c + resolved-dns-rr.h + resolved-dns-answer.c + resolved-dns-answer.h + resolved-dns-question.c + resolved-dns-question.h + dns-type.c +'''.split()) + +dns_type_h = files('dns-type.h')[0] + +systemd_resolved_only_sources = files(''' + resolved.c + resolved-manager.c + resolved-manager.h + resolved-conf.c + resolved-conf.h + resolved-resolv-conf.c + resolved-resolv-conf.h + resolved-bus.c + resolved-bus.h + resolved-link.h + resolved-link.c + resolved-link-bus.c + resolved-link-bus.h + resolved-llmnr.h + resolved-llmnr.c + resolved-mdns.h + resolved-mdns.c + resolved-def.h + resolved-dns-query.h + resolved-dns-query.c + resolved-dns-synthesize.h + resolved-dns-synthesize.c + resolved-dns-transaction.h + resolved-dns-transaction.c + resolved-dns-scope.h + resolved-dns-scope.c + resolved-dns-server.h + resolved-dns-server.c + resolved-dns-search-domain.h + resolved-dns-search-domain.c + resolved-dns-cache.h + resolved-dns-cache.c + resolved-dns-zone.h + resolved-dns-zone.c + resolved-dns-stream.h + resolved-dns-stream.c + resolved-dns-trust-anchor.h + resolved-dns-trust-anchor.c + resolved-dns-stub.h + resolved-dns-stub.c + resolved-etc-hosts.h + resolved-etc-hosts.c +'''.split()) + +systemd_resolve_only_sources = files('resolve-tool.c') + +############################################################ + +dns_type_list_txt = custom_target( + 'dns_type-list.txt', + input : ['generate-dns_type-list.sed', dns_type_h], + output : 'dns_type-list.txt', + command : [sed, '-n', '-r', '-f', '@INPUT0@', '@INPUT1@'], + capture : true) + +generate_dns_type_gperf = find_program('generate-dns_type-gperf.py') + +dns_type_headers = [dns_type_h] +foreach item : [['dns_type', dns_type_list_txt, 'dns_type', 'DNS_TYPE_']] + + fname = '@0@-from-name.gperf'.format(item[0]) + gperf_file = custom_target( + fname, + input : item[1], + output : fname, + command : [generate_dns_type_gperf, item[2], item[3], '@INPUT@'], + capture : true) + + fname = '@0@-from-name.h'.format(item[0]) + target1 = custom_target( + fname, + input : gperf_file, + output : fname, + command : [gperf, + '-L', 'ANSI-C', '-t', '--ignore-case', + '-N', 'lookup_@0@'.format(item[2]), + '-H', 'hash_@0@_name'.format(item[2]), + '-p', '-C', + '@INPUT@'], + capture : true) + + fname = '@0@-to-name.h'.format(item[0]) + awkscript = '@0@-to-name.awk'.format(item[0]) + target2 = custom_target( + fname, + input : [awkscript, item[1]], + output : fname, + command : [awk, '-f', '@INPUT0@', '@INPUT1@'], + capture : true) + + dns_type_headers += [target1, target2] +endforeach + +resolved_gperf_c = custom_target( + 'resolved_gperf.c', + input : 'resolved-gperf.gperf', + output : 'resolved-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + +systemd_resolved_sources = (basic_dns_sources + + [resolved_gperf_c] + + systemd_resolved_only_sources + + dns_type_headers) + +systemd_resolve_sources = (basic_dns_sources + + systemd_resolve_only_sources + + dns_type_headers) + +if conf.get('ENABLE_RESOLVED', 0) == 1 + install_data('org.freedesktop.resolve1.conf', + install_dir : dbuspolicydir) + install_data('org.freedesktop.resolve1.service', + install_dir : dbussystemservicedir) + + resolved_conf = configure_file( + input : 'resolved.conf.in', + output : 'resolved.conf', + configuration : substs) + install_data(resolved_conf, + install_dir : pkgsysconfdir) + + install_data('resolv.conf', + install_dir : rootlibexecdir) +endif + +tests += [ + [['src/resolve/test-resolve-tables.c', + basic_dns_sources, + dns_type_headers, + 'src/shared/test-tables.h'], + [], + [libgcrypt, + libgpg_error, + libm], + 'ENABLE_RESOLVED'], + + [['src/resolve/test-dns-packet.c', + basic_dns_sources, + dns_type_headers], + [], + [libgcrypt, + libgpg_error, + libm], + 'ENABLE_RESOLVED'], + + [['src/resolve/test-dnssec.c', + basic_dns_sources, + dns_type_headers], + [], + [libgcrypt, + libgpg_error, + libm], + 'ENABLE_RESOLVED'], + + [['src/resolve/test-dnssec-complex.c', + 'src/resolve/dns-type.c', + dns_type_headers], + [], + [], + 'ENABLE_RESOLVED', 'manual'], +] diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index 265ac83dc0..d8393cbc8d 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -506,6 +506,7 @@ int config_parse_many( DEFINE_PARSER(int, int, safe_atoi); DEFINE_PARSER(long, long, safe_atoli); +DEFINE_PARSER(uint8, uint8_t, safe_atou8); DEFINE_PARSER(uint16, uint16_t, safe_atou16); DEFINE_PARSER(uint32, uint32_t, safe_atou32); DEFINE_PARSER(uint64, uint64_t, safe_atou64); diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index 26ff3df16f..82ea5c1288 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -119,6 +119,7 @@ int config_parse_many( int config_parse_int(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); int config_parse_unsigned(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); int config_parse_long(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); +int config_parse_uint8(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); int config_parse_uint16(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); int config_parse_uint32(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); int config_parse_uint64(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata); diff --git a/src/shared/meson.build b/src/shared/meson.build new file mode 100644 index 0000000000..f1d73d1b3f --- /dev/null +++ b/src/shared/meson.build @@ -0,0 +1,165 @@ +shared_sources = ''' + acl-util.h + acpi-fpdt.c + acpi-fpdt.h + apparmor-util.c + apparmor-util.h + ask-password-api.c + ask-password-api.h + base-filesystem.c + base-filesystem.h + boot-timestamps.c + boot-timestamps.h + bus-unit-util.c + bus-unit-util.h + bus-util.c + bus-util.h + cgroup-show.c + cgroup-show.h + clean-ipc.c + clean-ipc.h + condition.c + condition.h + conf-parser.c + conf-parser.h + dev-setup.c + dev-setup.h + dissect-image.c + dissect-image.h + dns-domain.c + dns-domain.h + dropin.c + dropin.h + efivars.c + efivars.h + fdset.c + fdset.h + firewall-util.h + fstab-util.c + fstab-util.h + gcrypt-util.c + gcrypt-util.h + generator.c + generator.h + gpt.h + ima-util.c + ima-util.h + import-util.c + import-util.h + initreq.h + install.c + install.h + install-printf.c + install-printf.h + journal-util.c + journal-util.h + logs-show.c + logs-show.h + loop-util.c + loop-util.h + machine-image.c + machine-image.h + machine-pool.c + machine-pool.h + nsflags.c + nsflags.h + output-mode.c + output-mode.h + pager.c + pager.h + path-lookup.c + path-lookup.h + ptyfwd.c + ptyfwd.h + resolve-util.c + resolve-util.h + seccomp-util.h + sleep-config.c + sleep-config.h + spawn-ask-password-agent.c + spawn-ask-password-agent.h + spawn-polkit-agent.c + spawn-polkit-agent.h + specifier.c + specifier.h + switch-root.c + switch-root.h + sysctl-util.c + sysctl-util.h + tests.c + tests.h + udev-util.h + uid-range.c + uid-range.h + utmp-wtmp.h + vlan-util.c + vlan-util.h + volatile-util.c + volatile-util.h + watchdog.c + watchdog.h +'''.split() + +test_tables_h = files('test-tables.h') +shared_sources += [test_tables_h] + +if conf.get('HAVE_ACL', 0) == 1 + shared_sources += ['acl-util.c'] +endif + +if conf.get('HAVE_UTMP', 0) == 1 + shared_sources += ['utmp-wtmp.c'] +endif + +if conf.get('HAVE_SECCOMP', 0) == 1 + shared_sources += ['seccomp-util.c'] +endif + +if conf.get('HAVE_LIBIPTC', 0) == 1 + shared_sources += ['firewall-util.c'] +endif + +libshared_name = 'systemd-shared-@0@'.format(meson.project_version()) + +libshared = shared_library( + libshared_name, + shared_sources, + basic_sources, + journal_internal_sources, + libsystemd_internal_sources, + libudev_sources, + include_directories : includes, + link_args : ['-shared'], + c_args : ['-fvisibility=default'], + dependencies : [threads, + librt, + libcap, + libacl, + libcryptsetup, + libgcrypt, + libiptc, + libseccomp, + libselinux, + libidn, + libxz, + liblz4, + libblkid], + install : true, + install_dir : rootlibexecdir) + +libshared_static = static_library( + libshared_name, + shared_sources, + basic_sources, + include_directories : includes, + dependencies : [threads, + librt, + libcap, + libacl, + libcryptsetup, + libseccomp, + libselinux, + libidn, + libxz, + liblz4, + libblkid]) diff --git a/src/shared/pager.c b/src/shared/pager.c index 22d7603ec6..4d7b02c63c 100644 --- a/src/shared/pager.c +++ b/src/shared/pager.c @@ -176,12 +176,14 @@ void pager_close(void) { /* Inform pager that we are done */ (void) fflush(stdout); - if (stdout_redirected && ((stored_stdout < 0) || (dup2(stored_stdout, STDOUT_FILENO) < 0))) - (void) close(STDOUT_FILENO); + if (stdout_redirected) + if (stored_stdout < 0 || dup2(stored_stdout, STDOUT_FILENO) < 0) + (void) close(STDOUT_FILENO); stored_stdout = safe_close(stored_stdout); (void) fflush(stderr); - if (stderr_redirected && ((stored_stderr < 0) || (dup2(stored_stderr, STDERR_FILENO) < 0))) - (void) close(STDERR_FILENO); + if (stderr_redirected) + if (stored_stderr < 0 || dup2(stored_stderr, STDERR_FILENO) < 0) + (void) close(STDERR_FILENO); stored_stderr = safe_close(stored_stderr); stdout_redirected = stderr_redirected = false; diff --git a/src/sulogin-shell/meson.build b/src/sulogin-shell/meson.build new file mode 100644 index 0000000000..4ec0d3da1a --- /dev/null +++ b/src/sulogin-shell/meson.build @@ -0,0 +1,7 @@ +gen = configure_file( + input : 'systemd-sulogin-shell.in', + output : 'systemd-sulogin-shell', + configuration : substs) + +install_data(gen, + install_dir : rootlibexecdir) diff --git a/src/systemd/meson.build b/src/systemd/meson.build new file mode 100644 index 0000000000..43fd0130b9 --- /dev/null +++ b/src/systemd/meson.build @@ -0,0 +1,54 @@ +_systemd_headers = ''' + sd-bus.h + sd-bus-protocol.h + sd-bus-vtable.h + sd-daemon.h + sd-event.h + sd-id128.h + sd-journal.h + sd-login.h + sd-messages.h +'''.split() + +# https://github.com/mesonbuild/meson/issues/1633 +systemd_headers = files(_systemd_headers) + +# sd-device.h +# sd-hwdb.h +# sd-dhcp6-client.h +# sd-dhcp6-lease.h +# sd-dhcp-client.h +# sd-dhcp-lease.h +# sd-dhcp-server.h +# sd-ipv4acd.h +# sd-ipv4ll.h +# sd-lldp.h +# sd-ndisc.h +# sd-netlink.h +# sd-network.h +# sd-path.h +# sd-resolve.h +# sd-utf8.h + +install_headers( + systemd_headers, + '_sd-common.h', + subdir : 'systemd') + + +############################################################ + +opts = [[], + ['-ansi'], + ['-std=iso9899:1990']] + +foreach header : _systemd_headers + foreach opt : opts + name = ''.join([header] + opt) + test('cc-' + name, + check_compilation_sh, + args : cc.cmd_array() + ['-x', 'c', '-c'] + opt + + ['-Werror', '-include', + join_paths(meson.current_source_dir(), header)]) + endforeach +endforeach diff --git a/src/test/generate-sym-test.py b/src/test/generate-sym-test.py new file mode 100644 index 0000000000..a3350c8a81 --- /dev/null +++ b/src/test/generate-sym-test.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 +import sys, re + +print('#include <stdio.h>') +for header in sys.argv[2:]: + print('#include "{}"'.format(header.split('/')[-1])) + +print(''' +void* functions[] = {''') + +for line in open(sys.argv[1]): + match = re.search('^ +([a-zA-Z0-9_]+);', line) + if match: + print(' {},'.format(match.group(1))) + +print('''}; + +int main(void) { + unsigned i; + for (i = 0; i < sizeof(functions)/sizeof(void*); i++) + printf("%p\\n", functions[i]); + return 0; +}''') diff --git a/src/test/meson.build b/src/test/meson.build new file mode 100644 index 0000000000..4ae1210fe1 --- /dev/null +++ b/src/test/meson.build @@ -0,0 +1,878 @@ +awkscript = 'test-hashmap-ordered.awk' +test_hashmap_ordered_c = custom_target( + 'test-hashmap-ordered.c', + input : [awkscript, 'test-hashmap-plain.c'], + output : 'test-hashmap-ordered.c', + command : [awk, '-f', '@INPUT0@', '@INPUT1@'], + capture : true) + +test_include_dir = include_directories('.') + +path = run_command('sh', ['-c', 'echo "$PATH"']).stdout() +test_env = environment() +test_env.set('SYSTEMD_KBD_MODEL_MAP', kbd_model_map) +test_env.set('SYSTEMD_LANGUAGE_FALLBACK_MAP', language_fallback_map) +test_env.set('PATH', path) +test_env.prepend('PATH', meson.build_root()) + +############################################################ + +generate_sym_test_py = find_program('generate-sym-test.py') + +test_libsystemd_sym_c = custom_target( + 'test-libsystemd-sym.c', + input : [libsystemd_sym_path] + systemd_headers, + output : 'test-libsystemd-sym.c', + command : [generate_sym_test_py, libsystemd_sym_path] + systemd_headers, + capture : true) + +test_libudev_sym_c = custom_target( + 'test-libudev-sym.c', + input : [libudev_sym_path, libudev_h_path], + output : 'test-libudev-sym.c', + command : [generate_sym_test_py, '@INPUT0@', '@INPUT1@'], + capture : true) + +test_dlopen_c = files('test-dlopen.c') + +############################################################ + +tests += [ + [['src/test/test-device-nodes.c'], + [], + []], + + [['src/test/test-engine.c'], + [libcore, + libudev, + libsystemd_internal], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-job-type.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-ns.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid], + '', 'manual'], + + [['src/test/test-loopback.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-hostname.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid], + '', 'unsafe'], + + [['src/test/test-dns-domain.c'], + [libcore, + libsystemd_network], + []], + + [['src/test/test-boot-timestamps.c'], + [], + [], + 'ENABLE_EFI'], + + [['src/test/test-unit-name.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-unit-file.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-utf8.c'], + [], + []], + + [['src/test/test-capability.c'], + [], + [libcap]], + + [['src/test/test-async.c'], + [], + []], + + [['src/test/test-locale-util.c'], + [], + []], + + [['src/test/test-copy.c'], + [libshared_static], + []], + + [['src/test/test-sigbus.c'], + [], + []], + + [['src/test/test-condition.c'], + [], + []], + + [['src/test/test-fdset.c'], + [], + []], + + [['src/test/test-fstab-util.c'], + [], + []], + + [['src/test/test-ratelimit.c'], + [], + []], + + [['src/test/test-util.c'], + [], + []], + + [['src/test/test-mount-util.c'], + [], + []], + + [['src/test/test-exec-util.c'], + [], + []], + + [['src/test/test-hexdecoct.c'], + [], + []], + + [['src/test/test-alloc-util.c'], + [], + []], + + [['src/test/test-xattr-util.c'], + [], + []], + + [['src/test/test-io-util.c'], + [], + []], + + [['src/test/test-glob-util.c'], + [], + []], + + [['src/test/test-fs-util.c'], + [], + []], + + [['src/test/test-proc-cmdline.c'], + [], + []], + + [['src/test/test-fd-util.c'], + [], + []], + + [['src/test/test-web-util.c'], + [], + []], + + [['src/test/test-cpu-set-util.c'], + [], + []], + + [['src/test/test-stat-util.c'], + [], + []], + + [['src/test/test-escape.c'], + [], + []], + + [['src/test/test-string-util.c'], + [], + []], + + [['src/test/test-extract-word.c'], + [], + []], + + [['src/test/test-parse-util.c'], + [], + []], + + [['src/test/test-user-util.c'], + [], + []], + + [['src/test/test-hostname-util.c'], + [], + []], + + [['src/test/test-process-util.c'], + [], + []], + + [['src/test/test-terminal-util.c'], + [], + []], + + [['src/test/test-path-lookup.c'], + [], + []], + + [['src/test/test-uid-range.c'], + [], + []], + + [['src/test/test-cap-list.c', + generated_gperf_headers], + [], + [libcap]], + + [['src/test/test-socket-util.c'], + [], + []], + + [['src/test/test-barrier.c'], + [], + []], + + [['src/test/test-tmpfiles.c'], + [], + []], + + [['src/test/test-namespace.c'], + [libcore, + libshared], + [threads, + libblkid]], + + [['src/test/test-verbs.c'], + [], + []], + + [['src/test/test-install-root.c'], + [], + []], + + [['src/test/test-acl-util.c'], + [], + [], + 'HAVE_ACL'], + + [['src/test/test-seccomp.c'], + [], + [libseccomp], + 'HAVE_SECCOMP'], + + [['src/test/test-rlimit-util.c'], + [], + []], + + [['src/test/test-ask-password-api.c'], + [], + [], + '', 'manual'], + + [['src/test/test-dissect-image.c'], + [], + [libblkid], + '', 'manual'], + + [['src/test/test-signal-util.c'], + [], + []], + + [['src/test/test-selinux.c'], + [], + []], + + [['src/test/test-sizeof.c'], + [libbasic], + []], + + [['src/test/test-hashmap.c', + 'src/test/test-hashmap-plain.c', + test_hashmap_ordered_c], + [], + [], + '', 'timeout=90'], + + [['src/test/test-set.c'], + [], + []], + + [['src/test/test-bitmap.c'], + [], + []], + + [['src/test/test-xml.c'], + [], + []], + + [['src/test/test-list.c'], + [], + []], + + [['src/test/test-unaligned.c'], + [], + []], + + [['src/test/test-tables.c', + 'src/shared/test-tables.h', + 'src/journal/journald-server.c', + 'src/journal/journald-server.h'], + [libcore, + libjournal_core, + libudev_core, + libudev_internal, + libsystemd_network, + libshared], + [threads, + libseccomp, + libmount, + libxz, + liblz4, + libblkid], + '', '', [], libudev_core_includes], + + [['src/test/test-prioq.c'], + [], + []], + + [['src/test/test-fileio.c'], + [], + []], + + [['src/test/test-time.c'], + [], + []], + + [['src/test/test-clock.c'], + [], + []], + + [['src/test/test-architecture.c'], + [], + []], + + [['src/test/test-log.c'], + [], + []], + + [['src/test/test-ipcrm.c'], + [], + [], + '', 'unsafe'], + + [['src/test/test-btrfs.c'], + [], + [], + '', 'manual'], + + + [['src/test/test-firewall-util.c'], + [libshared], + [], + 'HAVE_LIBIPTC'], + + [['src/test/test-netlink-manual.c'], + [], + [libkmod], + 'HAVE_KMOD', 'manual'], + + [['src/test/test-ellipsize.c'], + [], + []], + + [['src/test/test-date.c'], + [], + []], + + [['src/test/test-sleep.c'], + [], + []], + + [['src/test/test-replace-var.c'], + [], + []], + + [['src/test/test-calendarspec.c'], + [], + []], + + [['src/test/test-strip-tab-ansi.c'], + [], + []], + + [['src/test/test-daemon.c'], + [], + []], + + [['src/test/test-cgroup.c'], + [], + [], + '', 'manual'], + + + [['src/test/test-cgroup-mask.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-cgroup-util.c'], + [], + []], + + [['src/test/test-env-util.c'], + [], + []], + + [['src/test/test-strbuf.c'], + [], + []], + + [['src/test/test-strv.c'], + [], + []], + + [['src/test/test-path-util.c'], + [], + []], + + [['src/test/test-path.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-execute.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-siphash24.c'], + [], + []], + + [['src/test/test-strxcpyx.c'], + [], + []], + + [['src/test/test-install.c'], + [libcore, + libshared], + [], + '', 'manual'], + + [['src/test/test-watchdog.c'], + [], + []], + + [['src/test/test-sched-prio.c'], + [libcore, + libshared], + [threads, + librt, + libseccomp, + libselinux, + libmount, + libblkid]], + + [['src/test/test-conf-files.c'], + [], + []], + + [['src/test/test-conf-parser.c'], + [], + []], + + [['src/test/test-af-list.c', + generated_gperf_headers], + [], + []], + + [['src/test/test-arphrd-list.c', + generated_gperf_headers], + [], + []], + + [['src/test/test-journal-importer.c'], + [], + []], + + [['src/test/test-libudev.c'], + [libshared], + []], + + [['src/test/test-udev.c'], + [libudev_core, + libudev_internal, + libsystemd_network, + libshared], + [threads, + librt, + libblkid, + libkmod, + libacl], + '', 'manual'], + + [['src/test/test-id128.c'], + [], + []], + + [['src/test/test-hash.c'], + [], + []], + + [['src/test/test-nss.c'], + [], + [libdl], + '', 'manual'], +] + +############################################################ + +# define some tests here, because the link_with deps were not defined earlier + +tests += [ + [['src/journal/test-journal.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-journal-send.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-journal-syslog.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4, + libselinux]], + + [['src/journal/test-journal-match.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-journal-enum.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-journal-stream.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-journal-flush.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-journal-init.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-journal-verify.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-journal-interleaving.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-mmap-cache.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4]], + + [['src/journal/test-catalog.c'], + [libjournal_core, + libshared], + [threads, + libxz, + liblz4], + '', '', '-DCATALOG_DIR="@0@"'.format(build_catalog_dir)], + + [['src/journal/test-compress.c'], + [libjournal_core, + libshared], + [liblz4, + libxz]], + + [['src/journal/test-compress-benchmark.c'], + [libjournal_core, + libshared], + [liblz4, + libxz], + '', 'timeout=90'], + + [['src/journal/test-audit-type.c'], + [libjournal_core, + libshared], + [liblz4, + libxz]], +] + +############################################################ + +tests += [ + [['src/libsystemd/sd-bus/test-bus-marshal.c'], + [], + [threads, + libglib, + libgobject, + libgio, + libdbus]], + + [['src/libsystemd/sd-bus/test-bus-signature.c'], + [], + [threads]], + + [['src/libsystemd/sd-bus/test-bus-chat.c'], + [], + [threads]], + + [['src/libsystemd/sd-bus/test-bus-cleanup.c'], + [], + [threads, + libseccomp]], + + [['src/libsystemd/sd-bus/test-bus-error.c'], + [libshared_static, + libsystemd_internal], + []], + + [['src/libsystemd/sd-bus/test-bus-track.c'], + [], + [libseccomp]], + + [['src/libsystemd/sd-bus/test-bus-server.c'], + [], + [threads]], + + [['src/libsystemd/sd-bus/test-bus-objects.c'], + [], + [threads]], + + [['src/libsystemd/sd-bus/test-bus-gvariant.c'], + [], + [libglib, + libgobject, + libgio]], + + [['src/libsystemd/sd-bus/test-bus-creds.c'], + [], + []], + + [['src/libsystemd/sd-bus/test-bus-match.c'], + [], + []], + + [['src/libsystemd/sd-bus/test-bus-kernel.c'], + [], + []], + + [['src/libsystemd/sd-bus/test-bus-kernel-bloom.c'], + [], + []], + + [['src/libsystemd/sd-bus/test-bus-benchmark.c'], + [], + [threads]], + + [['src/libsystemd/sd-bus/test-bus-zero-copy.c'], + [], + []], + + [['src/libsystemd/sd-bus/test-bus-introspect.c'], + [], + []], + + [['src/libsystemd/sd-event/test-event.c'], + [], + []], + + [['src/libsystemd/sd-netlink/test-netlink.c'], + [], + []], + + [['src/libsystemd/sd-netlink/test-local-addresses.c'], + [], + []], + + [['src/libsystemd/sd-resolve/test-resolve.c'], + [], + [threads]], + + [['src/libsystemd/sd-login/test-login.c'], + [], + [], + '', 'manual'], +] + +############################################################ + +tests += [ + [['src/libsystemd-network/test-dhcp-option.c', + 'src/libsystemd-network/dhcp-protocol.h', + 'src/libsystemd-network/dhcp-internal.h'], + [libshared, + libsystemd_network], + []], + + [['src/libsystemd-network/test-dhcp-client.c', + 'src/libsystemd-network/dhcp-protocol.h', + 'src/libsystemd-network/dhcp-internal.h', + 'src/systemd/sd-dhcp-client.h'], + [libshared, + libsystemd_network], + []], + + [['src/libsystemd-network/test-dhcp-server.c'], + [libshared, + libsystemd_network], + []], + + [['src/libsystemd-network/test-ipv4ll.c', + 'src/libsystemd-network/arp-util.h', + 'src/systemd/sd-ipv4ll.h'], + [libshared, + libsystemd_network], + []], + + [['src/libsystemd-network/test-ipv4ll-manual.c', + 'src/systemd/sd-ipv4ll.h'], + [libshared, + libsystemd_network], + [], + '', 'manual'], + + [['src/libsystemd-network/test-acd.c', + 'src/systemd/sd-ipv4acd.h'], + [libshared, + libsystemd_network], + [], + '', 'manual'], + + [['src/libsystemd-network/test-ndisc-rs.c', + 'src/libsystemd-network/dhcp-identifier.h', + 'src/libsystemd-network/dhcp-identifier.c', + 'src/libsystemd-network/icmp6-util.h', + 'src/systemd/sd-dhcp6-client.h', + 'src/systemd/sd-ndisc.h'], + [libshared, + libsystemd_network], + []], + + [['src/libsystemd-network/test-dhcp6-client.c', + 'src/libsystemd-network/dhcp-identifier.h', + 'src/libsystemd-network/dhcp-identifier.c', + 'src/libsystemd-network/dhcp6-internal.h', + 'src/systemd/sd-dhcp6-client.h'], + [libshared, + libsystemd_network], + []], + + [['src/libsystemd-network/test-lldp.c'], + [libshared, + libsystemd_network], + []], +] + +############################################################ + +tests += [ + [['src/login/test-login-shared.c'], + [], + []], + + [['src/login/test-inhibit.c'], + [], + [], + '', 'manual'], + + [['src/login/test-login-tables.c'], + [liblogind_core, + libshared], + [threads]], +] diff --git a/src/test/test-dlopen.c b/src/test/test-dlopen.c new file mode 100644 index 0000000000..9f5343a7ea --- /dev/null +++ b/src/test/test-dlopen.c @@ -0,0 +1,32 @@ +/*** + This file is part of systemd. + + Copyright 2016 Zbigniew Jędrzejewski-Szmek + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include <dlfcn.h> +#include <stdlib.h> + +#include "macro.h" + +int main(int argc, char **argv) { + void *handle; + + assert_se((handle = dlopen(argv[1], RTLD_NOW))); + assert_se(dlclose(handle) == 0); + + return EXIT_SUCCESS; +} diff --git a/src/test/test-hashmap-ordered.awk b/src/test/test-hashmap-ordered.awk new file mode 100644 index 0000000000..10f4386fa4 --- /dev/null +++ b/src/test/test-hashmap-ordered.awk @@ -0,0 +1,11 @@ +BEGIN { + print "/* GENERATED FILE */"; + print "#define ORDERED" +} +{ + if (!match($0, "^#include")) + gsub(/hashmap/, "ordered_hashmap"); + gsub(/HASHMAP/, "ORDERED_HASHMAP"); + gsub(/Hashmap/, "OrderedHashmap"); + print +} diff --git a/src/test/test-nss.c b/src/test/test-nss.c index b59cb7aa69..b4cb3f0d37 100644 --- a/src/test/test-nss.c +++ b/src/test/test-nss.c @@ -71,9 +71,11 @@ static void* open_handle(const char* dir, const char* module, int flags) { const char *path; void *handle; - if (dir) - path = strjoina(dir, "/.libs/libnss_", module, ".so.2"); - else + if (dir) { + path = strjoina(dir, "/libnss_", module, ".so.2"); + if (access(path, F_OK) < 0) + path = strjoina(dir, "/.libs/libnss_", module, ".so.2"); + } else path = strjoina("libnss_", module, ".so.2"); handle = dlopen(path, flags); diff --git a/src/timedate/meson.build b/src/timedate/meson.build new file mode 100644 index 0000000000..2e74245f66 --- /dev/null +++ b/src/timedate/meson.build @@ -0,0 +1,14 @@ +if conf.get('ENABLE_TIMEDATED', 0) == 1 + install_data('org.freedesktop.timedate1.conf', + install_dir : dbuspolicydir) + install_data('org.freedesktop.timedate1.service', + install_dir : dbussystemservicedir) + + custom_target( + 'org.freedesktop.timedate1.policy', + input : 'org.freedesktop.timedate1.policy.in', + output : 'org.freedesktop.timedate1.policy', + command : intltool_command, + install : install_polkit, + install_dir : polkitpolicydir) +endif diff --git a/src/timesync/meson.build b/src/timesync/meson.build new file mode 100644 index 0000000000..dece39ea10 --- /dev/null +++ b/src/timesync/meson.build @@ -0,0 +1,26 @@ +systemd_timesyncd_sources = files(''' + timesyncd.c + timesyncd-manager.c + timesyncd-manager.h + timesyncd-conf.c + timesyncd-conf.h + timesyncd-server.c + timesyncd-server.h +'''.split()) + +timesyncd_gperf_c = custom_target( + 'timesyncd-gperf.c', + input : 'timesyncd-gperf.gperf', + output : 'timesyncd-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + +systemd_timesyncd_sources += [timesyncd_gperf_c] + +if conf.get('ENABLE_TIMESYNCD', 0) == 1 + timesyncd_conf = configure_file( + input : 'timesyncd.conf.in', + output : 'timesyncd.conf', + configuration : substs) + install_data(timesyncd_conf, + install_dir : pkgsysconfdir) +endif diff --git a/src/udev/generate-keyboard-keys-list.sh b/src/udev/generate-keyboard-keys-list.sh new file mode 100755 index 0000000000..479e493182 --- /dev/null +++ b/src/udev/generate-keyboard-keys-list.sh @@ -0,0 +1,4 @@ +#!/bin/sh -eu + +$1 -dM -include linux/input.h - </dev/null | \ + awk '/^#define[ \t]+KEY_[^ ]+[ \t]+[0-9K]/ { if ($2 != "KEY_MAX") { print $2 } }' diff --git a/src/udev/meson.build b/src/udev/meson.build new file mode 100644 index 0000000000..495e9d3c54 --- /dev/null +++ b/src/udev/meson.build @@ -0,0 +1,150 @@ +udevadm_sources = files(''' + udevadm.c + udevadm-info.c + udevadm-control.c + udevadm-monitor.c + udevadm-hwdb.c + udevadm-settle.c + udevadm-trigger.c + udevadm-test.c + udevadm-test-builtin.c + udevadm-util.c + udevadm-util.h +'''.split()) + +systemd_udevd_sources = files('udevd.c') + +libudev_core_sources = ''' + udev.h + udev-event.c + udev-watch.c + udev-node.c + udev-rules.c + udev-ctrl.c + udev-builtin.c + udev-builtin-btrfs.c + udev-builtin-hwdb.c + udev-builtin-input_id.c + udev-builtin-keyboard.c + udev-builtin-net_id.c + udev-builtin-net_setup_link.c + udev-builtin-path_id.c + udev-builtin-usb_id.c + net/link-config.c + net/link-config.h + net/ethtool-util.c + net/ethtool-util.h +'''.split() + +if conf.get('HAVE_KMOD', 0) == 1 + libudev_core_sources += ['udev-builtin-kmod.c'] +endif + +if conf.get('HAVE_BLKID', 0) == 1 + libudev_core_sources += ['udev-builtin-blkid.c'] +endif + +if conf.get('HAVE_ACL', 0) == 1 + libudev_core_sources += ['udev-builtin-uaccess.c', + logind_acl_c, + sd_login_c] +endif + +############################################################ + +generate_keyboard_keys_list = find_program('generate-keyboard-keys-list.sh') +keyboard_keys_list_txt = custom_target( + 'keyboard-keys-list.txt', + output : 'keyboard-keys-list.txt', + command : [generate_keyboard_keys_list, cpp], + capture : true) + +fname = 'keyboard-keys-from-name.gperf' +gperf_file = custom_target( + fname, + input : keyboard_keys_list_txt, + output : fname, + command : [generate_gperfs, 'key', '', '@INPUT@'], + capture : true) + +fname = 'keyboard-keys-from-name.h' +keyboard_keys_from_name_h = custom_target( + fname, + input : gperf_file, + output : fname, + command : [gperf, + '-L', 'ANSI-C', '-t', '--ignore-case', + '-N', 'keyboard_lookup_key', + '-H', 'hash_key_name', + '-p', '-C', + '@INPUT@'], + capture : true) + +############################################################ + +link_config_gperf_c = custom_target( + 'link-config-gperf.c', + input : 'net/link-config-gperf.gperf', + output : 'link-config-gperf.c', + command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) + +############################################################ + +if get_option('link-udev-shared') + udev_link_with = [libshared] + udev_rpath = rootlibexecdir +else + udev_link_with = [libshared_static, + libsystemd_internal] + udev_rpath = '' +endif + +libudev_internal = static_library( + 'udev', + libudev_sources, + include_directories : includes, + link_with : udev_link_with) + +libudev_core_includes = [includes, include_directories('net')] +libudev_core = static_library( + 'udev-core', + libudev_core_sources, + link_config_gperf_c, + keyboard_keys_from_name_h, + include_directories : libudev_core_includes, + link_with : udev_link_with, + dependencies : [libblkid]) + +foreach prog : [['ata_id/ata_id.c'], + ['cdrom_id/cdrom_id.c'], + ['collect/collect.c'], + ['scsi_id/scsi_id.c', + 'scsi_id/scsi_id.h', + 'scsi_id/scsi_serial.c', + 'scsi_id/scsi.h'], + ['v4l_id/v4l_id.c'], + ['mtd_probe/mtd_probe.c', + 'mtd_probe/mtd_probe.h', + 'mtd_probe/probe_smartmedia.c']] + + executable(prog[0].split('/')[0], + prog, + include_directories : includes, + link_with : [libudev_internal], + install_rpath : udev_rpath, + install : true, + install_dir : udevlibexecdir) +endforeach + +install_data('udev.conf', + install_dir : join_paths(sysconfdir, 'udev')) + +udev_pc = configure_file( + input : 'udev.pc.in', + output : 'udev.pc', + configuration : substs) +install_data(udev_pc, + install_dir : pkgconfigdatadir) + +meson.add_install_script('sh', '-c', + mkdir_p.format(join_paths(sysconfdir, 'udev/rules.d'))) diff --git a/src/update-done/update-done.c b/src/update-done/update-done.c index d466e1b759..06e2d7b71b 100644 --- a/src/update-done/update-done.c +++ b/src/update-done/update-done.c @@ -17,8 +17,10 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>. ***/ +#include "alloc-util.h" #include "fd-util.h" #include "fileio.h" +#include "fs-util.h" #include "io-util.h" #include "selinux-util.h" #include "util.h" @@ -36,6 +38,7 @@ static int apply_timestamp(const char *path, struct timespec *ts) { _cleanup_fclose_ FILE *f = NULL; int fd = -1; int r; + _cleanup_(unlink_and_freep) char *tmp = NULL; assert(path); assert(ts); @@ -50,20 +53,20 @@ static int apply_timestamp(const char *path, struct timespec *ts) { if (r < 0) return log_error_errno(r, "Failed to set SELinux context for %s: %m", path); - fd = open(path, O_CREAT|O_WRONLY|O_TRUNC|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0644); + fd = open_tmpfile_linkable(path, O_WRONLY|O_CLOEXEC, &tmp); mac_selinux_create_file_clear(); if (fd < 0) { if (errno == EROFS) - return log_debug("Can't create timestamp file %s, file system is read-only.", path); + return log_debug("Can't create temporary timestamp file %s, file system is read-only.", tmp); - return log_error_errno(errno, "Failed to create/open timestamp file %s: %m", path); + return log_error_errno(errno, "Failed to create/open temporary timestamp file %s: %m", tmp); } f = fdopen(fd, "we"); if (!f) { safe_close(fd); - return log_error_errno(errno, "Failed to fdopen() timestamp file %s: %m", path); + return log_error_errno(errno, "Failed to fdopen() timestamp file %s: %m", tmp); } (void) fprintf(f, @@ -76,7 +79,15 @@ static int apply_timestamp(const char *path, struct timespec *ts) { return log_error_errno(r, "Failed to write timestamp file: %m"); if (futimens(fd, twice) < 0) - return log_error_errno(errno, "Failed to update timestamp on %s: %m", path); + return log_error_errno(errno, "Failed to update timestamp on %s: %m", tmp); + + /* fix permissions */ + (void) fchmod(fd, 0644); + r = link_tmpfile(fd, tmp, path); + if (r < 0) + return log_error_errno(r, "Failed to move \"%s\" to \"%s\": %m", tmp, path); + + tmp = mfree(tmp); return 0; } diff --git a/src/vconsole/meson.build b/src/vconsole/meson.build new file mode 100644 index 0000000000..ac382e3daa --- /dev/null +++ b/src/vconsole/meson.build @@ -0,0 +1,8 @@ +if conf.get('ENABLE_VCONSOLE', 0) == 1 + vconsole_rules = configure_file( + input : '90-vconsole.rules.in', + output : '90-vconsole.rules', + configuration : substs) + install_data(vconsole_rules, + install_dir : udevrulesdir) +endif |