diff options
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/af-to-name.awk | 9 | ||||
-rw-r--r-- | src/basic/arphrd-to-name.awk | 9 | ||||
-rw-r--r-- | src/basic/blkid-util.h | 2 | ||||
-rw-r--r-- | src/basic/cap-to-name.awk | 9 | ||||
-rw-r--r-- | src/basic/def.h | 4 | ||||
-rw-r--r-- | src/basic/errno-to-name.awk | 9 | ||||
-rw-r--r-- | src/basic/extract-word.c | 7 | ||||
-rw-r--r-- | src/basic/extract-word.h | 2 | ||||
-rwxr-xr-x | src/basic/generate-af-list.sh | 5 | ||||
-rwxr-xr-x | src/basic/generate-arphrd-list.sh | 5 | ||||
-rwxr-xr-x | src/basic/generate-cap-list.sh | 5 | ||||
-rwxr-xr-x | src/basic/generate-errno-list.sh | 4 | ||||
-rw-r--r-- | src/basic/generate-gperfs.py | 16 | ||||
-rw-r--r-- | src/basic/log.c | 13 | ||||
-rw-r--r-- | src/basic/log.h | 19 | ||||
-rw-r--r-- | src/basic/meson.build | 281 | ||||
-rw-r--r-- | src/basic/missing.h | 29 | ||||
-rw-r--r-- | src/basic/random-util.c | 8 | ||||
-rw-r--r-- | src/basic/rm-rf.c | 7 |
19 files changed, 423 insertions, 20 deletions
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/blkid-util.h b/src/basic/blkid-util.h index 7aa75eb091..1b9cace040 100644 --- a/src/basic/blkid-util.h +++ b/src/basic/blkid-util.h @@ -20,7 +20,7 @@ ***/ #ifdef HAVE_BLKID -#include <blkid/blkid.h> +#include <blkid.h> #endif #include "util.h" 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/def.h b/src/basic/def.h index 200ea973c1..b1a3bc190b 100644 --- a/src/basic/def.h +++ b/src/basic/def.h @@ -67,10 +67,6 @@ .un.sun_path = "\0/org/freedesktop/plymouthd", \ } -#ifndef TTY_GID -#define TTY_GID 5 -#endif - #define NOTIFY_FD_MAX 768 #define NOTIFY_BUFFER_MAX PIPE_BUF 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/extract-word.c b/src/basic/extract-word.c index f8cac3e911..804f14c44c 100644 --- a/src/basic/extract-word.c +++ b/src/basic/extract-word.c @@ -241,7 +241,12 @@ int extract_first_word_and_warn( return log_syntax(unit, LOG_ERR, filename, line, r, "Unable to decode word \"%s\", ignoring: %m", rvalue); } -int extract_many_words(const char **p, const char *separators, ExtractFlags flags, ...) { +/* We pass ExtractFlags as unsigned int (to avoid undefined behaviour when passing + * an object that undergoes default argument promotion as an argument to va_start). + * Let's make sure that ExtractFlags fits into an unsigned int. */ +assert_cc(sizeof(enum ExtractFlags) <= sizeof(unsigned)); + +int extract_many_words(const char **p, const char *separators, unsigned flags, ...) { va_list ap; char **l; int n = 0, i, c, r; diff --git a/src/basic/extract-word.h b/src/basic/extract-word.h index 21db5ef33f..04746c6d08 100644 --- a/src/basic/extract-word.h +++ b/src/basic/extract-word.h @@ -32,4 +32,4 @@ typedef enum ExtractFlags { int extract_first_word(const char **p, char **ret, const char *separators, ExtractFlags flags); int extract_first_word_and_warn(const char **p, char **ret, const char *separators, ExtractFlags flags, const char *unit, const char *filename, unsigned line, const char *rvalue); -int extract_many_words(const char **p, const char *separators, ExtractFlags flags, ...) _sentinel_; +int extract_many_words(const char **p, const char *separators, unsigned flags, ...) _sentinel_; 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/log.c b/src/basic/log.c index 36efc9ac7d..0d0ced00bd 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -553,7 +553,7 @@ static int write_to_journal( return 1; } -static int log_dispatch( +int log_dispatch_internal( int level, int error, const char *file, @@ -653,7 +653,7 @@ int log_dump_internal( if (_likely_(LOG_PRI(level) > log_max_level)) return -error; - return log_dispatch(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer); + return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer); } int log_internalv( @@ -680,7 +680,7 @@ int log_internalv( vsnprintf(buffer, sizeof(buffer), format, ap); - return log_dispatch(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer); + return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buffer); } int log_internal( @@ -744,7 +744,8 @@ int log_object_internalv( vsnprintf(b, l, format, ap); - return log_dispatch(level, error, file, line, func, object_field, object, extra_field, extra, buffer); + return log_dispatch_internal(level, error, file, line, func, + object_field, object, extra_field, extra, buffer); } int log_object_internal( @@ -788,7 +789,7 @@ static void log_assert( log_abort_msg = buffer; - log_dispatch(level, 0, file, line, func, NULL, NULL, NULL, NULL, buffer); + log_dispatch_internal(level, 0, file, line, func, NULL, NULL, NULL, NULL, buffer); } noreturn void log_assert_failed(const char *text, const char *file, int line, const char *func) { @@ -943,7 +944,7 @@ int log_struct_internal( if (!found) return -error; - return log_dispatch(level, error, file, line, func, NULL, NULL, NULL, NULL, buf + 8); + return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buf + 8); } int log_set_target_from_string(const char *e) { diff --git a/src/basic/log.h b/src/basic/log.h index 72714e02e5..b3e4060b5d 100644 --- a/src/basic/log.h +++ b/src/basic/log.h @@ -75,6 +75,18 @@ void log_close_console(void); void log_parse_environment(void); +int log_dispatch_internal( + int level, + int error, + const char *file, + int line, + const char *func, + const char *object_field, + const char *object, + const char *extra, + const char *extra_field, + char *buffer); + int log_internal( int level, int error, @@ -115,7 +127,7 @@ int log_object_internalv( const char *extra_field, const char *extra, const char *format, - va_list ap) _printf_(9,0); + va_list ap) _printf_(10,0); int log_struct_internal( int level, @@ -137,7 +149,7 @@ int log_format_iovec( bool newline_separator, int error, const char *format, - va_list ap); + va_list ap) _printf_(6, 0); /* This modifies the buffer passed! */ int log_dump_internal( @@ -167,6 +179,9 @@ void log_assert_failed_return( int line, const char *func); +#define log_dispatch(level, error, buffer) \ + log_dispatch_internal(level, error, __FILE__, __LINE__, __func__, NULL, NULL, NULL, NULL, buffer) + /* Logging with level */ #define log_full_errno(level, error, ...) \ ({ \ 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/basic/missing.h b/src/basic/missing.h index 480462357d..55028754cd 100644 --- a/src/basic/missing.h +++ b/src/basic/missing.h @@ -68,8 +68,6 @@ struct sockaddr_vm { }; #endif /* !HAVE_LINUX_VM_SOCKETS_H */ -#include "macro.h" - #ifndef RLIMIT_RTTIME #define RLIMIT_RTTIME 15 #endif @@ -726,7 +724,7 @@ struct btrfs_ioctl_quota_ctl_args { #define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) #endif -#if !HAVE_DECL_IFLA_VXLAN_REMCSUM_NOPARTIAL +#if !HAVE_DECL_IFLA_VXLAN_GPE #define IFLA_VXLAN_UNSPEC 0 #define IFLA_VXLAN_ID 1 #define IFLA_VXLAN_GROUP 2 @@ -752,11 +750,34 @@ struct btrfs_ioctl_quota_ctl_args { #define IFLA_VXLAN_REMCSUM_RX 22 #define IFLA_VXLAN_GBP 23 #define IFLA_VXLAN_REMCSUM_NOPARTIAL 24 -#define __IFLA_VXLAN_MAX 25 +#define IFLA_VXLAN_COLLECT_METADATA 25 +#define IFLA_VXLAN_LABEL 26 +#define IFLA_VXLAN_GPE 27 + +#define __IFLA_VXLAN_MAX 28 #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) #endif +#if !HAVE_DECL_IFLA_GENEVE_LABEL +#define IFLA_GENEVE_UNSPEC 0 +#define IFLA_GENEVE_ID 1 +#define IFLA_GENEVE_REMOTE 2 +#define IFLA_GENEVE_TTL 3 +#define IFLA_GENEVE_TOS 4 +#define IFLA_GENEVE_PORT 5 +#define IFLA_GENEVE_COLLECT_METADATA 6 +#define IFLA_GENEVE_REMOTE6 7 +#define IFLA_GENEVE_UDP_CSUM 8 +#define IFLA_GENEVE_UDP_ZERO_CSUM6_TX 9 +#define IFLA_GENEVE_UDP_ZERO_CSUM6_RX 10 +#define IFLA_GENEVE_LABEL 11 + +#define __IFLA_GENEVE_MAX 12 + +#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) +#endif + #if !HAVE_DECL_IFLA_IPTUN_ENCAP_DPORT #define IFLA_IPTUN_UNSPEC 0 #define IFLA_IPTUN_LINK 1 diff --git a/src/basic/random-util.c b/src/basic/random-util.c index ad7b3eedf2..b216be579d 100644 --- a/src/basic/random-util.c +++ b/src/basic/random-util.c @@ -27,7 +27,13 @@ #include <stdint.h> #ifdef HAVE_SYS_AUXV_H -#include <sys/auxv.h> +# include <sys/auxv.h> +#endif + +#ifdef USE_SYS_RANDOM_H +# include <sys/random.h> +#else +# include <linux/random.h> #endif #include "fd-util.h" diff --git a/src/basic/rm-rf.c b/src/basic/rm-rf.c index 08497af729..bdaca264ff 100644 --- a/src/basic/rm-rf.c +++ b/src/basic/rm-rf.c @@ -187,6 +187,13 @@ int rm_rf(const char *path, RemoveFlags flags) { return -EPERM; } + /* Another safe-check. Removing "/path/.." could easily remove entire root as well. + * It's especially easy to do using globs in tmpfiles, like "/path/.*", which the glob() + * function expands to both "/path/." and "/path/..". + * Return -EINVAL to be consistent with rmdir("/path/."). */ + if (endswith(path, "/..") || endswith(path, "/../")) + return -EINVAL; + if ((flags & (REMOVE_SUBVOLUME|REMOVE_ROOT|REMOVE_PHYSICAL)) == (REMOVE_SUBVOLUME|REMOVE_ROOT|REMOVE_PHYSICAL)) { /* Try to remove as subvolume first */ r = btrfs_subvol_remove(path, BTRFS_REMOVE_RECURSIVE|BTRFS_REMOVE_QUOTA); |