systemd: update code from upstream (2018-02-23)
This is a direct dump from systemd git on 2018-02-23, git commit 6084c4efa8dcc99659f62c7abc70f69a70220eb2 ====== SYSTEMD_DIR=../systemd COMMIT=6084c4efa8dcc99659f62c7abc70f69a70220eb2 ( cd "$SYSTEMD_DIR" git checkout "$COMMIT" git reset --hard git clean -fdx ) git ls-files :/src/systemd/src/ \ :/shared/nm-utils/siphash24.c \ :/shared/nm-utils/siphash24.h \ :/shared/nm-utils/unaligned.h | \ xargs -d '\n' rm -f nm_copy_sd() { mkdir -p "./src/systemd/$(dirname "$1")" cp "$SYSTEMD_DIR/$1" "./src/systemd/$1" } nm_copy_sd_shared() { mkdir -p "./shared/nm-utils/" cp "$SYSTEMD_DIR/$1" "./shared/nm-utils/${1##*/}" } nm_copy_sd "src/basic/alloc-util.c" nm_copy_sd "src/basic/alloc-util.h" nm_copy_sd "src/basic/async.h" nm_copy_sd "src/basic/escape.c" nm_copy_sd "src/basic/escape.h" nm_copy_sd "src/basic/ether-addr-util.c" nm_copy_sd "src/basic/ether-addr-util.h" nm_copy_sd "src/basic/extract-word.c" nm_copy_sd "src/basic/extract-word.h" nm_copy_sd "src/basic/fileio.c" nm_copy_sd "src/basic/fileio.h" nm_copy_sd "src/basic/fd-util.c" nm_copy_sd "src/basic/fd-util.h" nm_copy_sd "src/basic/fs-util.c" nm_copy_sd "src/basic/fs-util.h" nm_copy_sd "src/basic/hash-funcs.c" nm_copy_sd "src/basic/hash-funcs.h" nm_copy_sd "src/basic/hashmap.c" nm_copy_sd "src/basic/hashmap.h" nm_copy_sd "src/basic/hexdecoct.c" nm_copy_sd "src/basic/hexdecoct.h" nm_copy_sd "src/basic/hostname-util.c" nm_copy_sd "src/basic/hostname-util.h" nm_copy_sd "src/basic/in-addr-util.c" nm_copy_sd "src/basic/in-addr-util.h" nm_copy_sd "src/basic/io-util.c" nm_copy_sd "src/basic/io-util.h" nm_copy_sd "src/basic/list.h" nm_copy_sd "src/basic/log.h" nm_copy_sd "src/basic/macro.h" nm_copy_sd "src/basic/mempool.h" nm_copy_sd "src/basic/mempool.c" nm_copy_sd "src/basic/parse-util.c" nm_copy_sd "src/basic/parse-util.h" nm_copy_sd "src/basic/path-util.c" nm_copy_sd "src/basic/path-util.h" nm_copy_sd "src/basic/prioq.h" nm_copy_sd "src/basic/prioq.c" nm_copy_sd "src/basic/process-util.h" nm_copy_sd "src/basic/process-util.c" nm_copy_sd "src/basic/random-util.c" nm_copy_sd "src/basic/random-util.h" nm_copy_sd "src/basic/refcnt.h" nm_copy_sd "src/basic/set.h" nm_copy_sd "src/basic/signal-util.h" nm_copy_sd_shared "src/basic/siphash24.c" nm_copy_sd_shared "src/basic/siphash24.h" nm_copy_sd "src/basic/socket-util.c" nm_copy_sd "src/basic/socket-util.h" nm_copy_sd "src/basic/sparse-endian.h" nm_copy_sd "src/basic/stdio-util.h" nm_copy_sd "src/basic/string-table.c" nm_copy_sd "src/basic/string-table.h" nm_copy_sd "src/basic/string-util.c" nm_copy_sd "src/basic/string-util.h" nm_copy_sd "src/basic/strv.c" nm_copy_sd "src/basic/strv.h" nm_copy_sd "src/basic/time-util.c" nm_copy_sd "src/basic/time-util.h" nm_copy_sd "src/basic/umask-util.h" nm_copy_sd_shared "src/basic/unaligned.h" nm_copy_sd "src/basic/utf8.c" nm_copy_sd "src/basic/utf8.h" nm_copy_sd "src/basic/util.c" nm_copy_sd "src/basic/util.h" nm_copy_sd "src/libsystemd-network/arp-util.c" nm_copy_sd "src/libsystemd-network/arp-util.h" nm_copy_sd "src/libsystemd-network/dhcp6-internal.h" nm_copy_sd "src/libsystemd-network/dhcp6-lease-internal.h" nm_copy_sd "src/libsystemd-network/dhcp6-network.c" nm_copy_sd "src/libsystemd-network/dhcp6-option.c" nm_copy_sd "src/libsystemd-network/dhcp6-protocol.h" nm_copy_sd "src/libsystemd-network/dhcp-identifier.c" nm_copy_sd "src/libsystemd-network/dhcp-identifier.h" nm_copy_sd "src/libsystemd-network/dhcp-internal.h" nm_copy_sd "src/libsystemd-network/dhcp-lease-internal.h" nm_copy_sd "src/libsystemd-network/dhcp-network.c" nm_copy_sd "src/libsystemd-network/dhcp-option.c" nm_copy_sd "src/libsystemd-network/dhcp-packet.c" nm_copy_sd "src/libsystemd-network/dhcp-protocol.h" nm_copy_sd "src/libsystemd-network/lldp-internal.h" nm_copy_sd "src/libsystemd-network/lldp-neighbor.c" nm_copy_sd "src/libsystemd-network/lldp-neighbor.h" nm_copy_sd "src/libsystemd-network/lldp-network.c" nm_copy_sd "src/libsystemd-network/lldp-network.h" nm_copy_sd "src/libsystemd-network/network-internal.c" nm_copy_sd "src/libsystemd-network/network-internal.h" nm_copy_sd "src/libsystemd-network/sd-dhcp6-client.c" nm_copy_sd "src/libsystemd-network/sd-dhcp6-lease.c" nm_copy_sd "src/libsystemd-network/sd-dhcp-client.c" nm_copy_sd "src/libsystemd-network/sd-dhcp-lease.c" nm_copy_sd "src/libsystemd-network/sd-ipv4ll.c" nm_copy_sd "src/libsystemd-network/sd-ipv4acd.c" nm_copy_sd "src/libsystemd-network/sd-lldp.c" nm_copy_sd "src/libsystemd/sd-event/sd-event.c" nm_copy_sd "src/libsystemd/sd-id128/id128-util.c" nm_copy_sd "src/libsystemd/sd-id128/id128-util.h" nm_copy_sd "src/libsystemd/sd-id128/sd-id128.c" nm_copy_sd "src/shared/dns-domain.c" nm_copy_sd "src/shared/dns-domain.h" nm_copy_sd "src/systemd/_sd-common.h" nm_copy_sd "src/systemd/sd-dhcp6-client.h" nm_copy_sd "src/systemd/sd-dhcp6-lease.h" nm_copy_sd "src/systemd/sd-dhcp-client.h" nm_copy_sd "src/systemd/sd-dhcp-lease.h" nm_copy_sd "src/systemd/sd-event.h" nm_copy_sd "src/systemd/sd-ndisc.h" nm_copy_sd "src/systemd/sd-id128.h" nm_copy_sd "src/systemd/sd-ipv4acd.h" nm_copy_sd "src/systemd/sd-ipv4ll.h" nm_copy_sd "src/systemd/sd-lldp.h"
This commit is contained in:
@@ -1187,6 +1187,10 @@ int fflush_sync_and_check(FILE *f) {
|
|||||||
if (fsync(fileno(f)) < 0)
|
if (fsync(fileno(f)) < 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
|
r = fsync_directory_of_file(fileno(f));
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -554,6 +554,17 @@ int tmp_dir(const char **ret) {
|
|||||||
return tmp_dir_internal("/tmp", ret);
|
return tmp_dir_internal("/tmp", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int unlink_or_warn(const char *filename) {
|
||||||
|
if (unlink(filename) < 0 && errno != ENOENT)
|
||||||
|
/* If the file doesn't exist and the fs simply was read-only (in which
|
||||||
|
* case unlink() returns EROFS even if the file doesn't exist), don't
|
||||||
|
* complain */
|
||||||
|
if (errno != EROFS || access(filename, F_OK) >= 0)
|
||||||
|
return log_error_errno(errno, "Failed to remove \"%s\": %m", filename);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int inotify_add_watch_fd(int fd, int what, uint32_t mask) {
|
int inotify_add_watch_fd(int fd, int what, uint32_t mask) {
|
||||||
char path[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int) + 1];
|
char path[STRLEN("/proc/self/fd/") + DECIMAL_STR_MAX(int) + 1];
|
||||||
int r;
|
int r;
|
||||||
@@ -956,3 +967,33 @@ int unlinkat_deallocate(int fd, const char *name, int flags) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fsync_directory_of_file(int fd) {
|
||||||
|
_cleanup_free_ char *path = NULL, *dn = NULL;
|
||||||
|
_cleanup_close_ int dfd = -1;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
r = fd_verify_regular(fd);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = fd_get_path(fd, &path);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (!path_is_absolute(path))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
dn = dirname_malloc(path);
|
||||||
|
if (!dn)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
dfd = open(dn, O_RDONLY|O_CLOEXEC|O_DIRECTORY);
|
||||||
|
if (dfd < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
if (fsync(dfd) < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -64,6 +64,8 @@ int get_files_in_directory(const char *path, char ***list);
|
|||||||
int tmp_dir(const char **ret);
|
int tmp_dir(const char **ret);
|
||||||
int var_tmp_dir(const char **ret);
|
int var_tmp_dir(const char **ret);
|
||||||
|
|
||||||
|
int unlink_or_warn(const char *filename);
|
||||||
|
|
||||||
#define INOTIFY_EVENT_MAX (sizeof(struct inotify_event) + NAME_MAX + 1)
|
#define INOTIFY_EVENT_MAX (sizeof(struct inotify_event) + NAME_MAX + 1)
|
||||||
|
|
||||||
#define FOREACH_INOTIFY_EVENT(e, buffer, sz) \
|
#define FOREACH_INOTIFY_EVENT(e, buffer, sz) \
|
||||||
@@ -105,3 +107,5 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(char*, unlink_and_free);
|
|||||||
int access_fd(int fd, int mode);
|
int access_fd(int fd, int mode);
|
||||||
|
|
||||||
int unlinkat_deallocate(int fd, const char *name, int flags);
|
int unlinkat_deallocate(int fd, const char *name, int flags);
|
||||||
|
|
||||||
|
int fsync_directory_of_file(int fd);
|
||||||
|
@@ -137,7 +137,7 @@ int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll) {
|
|||||||
assert(fd >= 0);
|
assert(fd >= 0);
|
||||||
assert(buf);
|
assert(buf);
|
||||||
|
|
||||||
if (nbytes > (size_t) SSIZE_MAX)
|
if (_unlikely_(nbytes > (size_t) SSIZE_MAX))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@@ -531,6 +531,30 @@ int safe_atoi16(const char *s, int16_t *ret) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int safe_atoux16(const char *s, uint16_t *ret) {
|
||||||
|
char *x = NULL;
|
||||||
|
unsigned long l;
|
||||||
|
|
||||||
|
assert(s);
|
||||||
|
assert(ret);
|
||||||
|
|
||||||
|
s += strspn(s, WHITESPACE);
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
l = strtoul(s, &x, 16);
|
||||||
|
if (errno > 0)
|
||||||
|
return -errno;
|
||||||
|
if (!x || x == s || *x != 0)
|
||||||
|
return -EINVAL;
|
||||||
|
if (s[0] == '-')
|
||||||
|
return -ERANGE;
|
||||||
|
if ((unsigned long) (uint16_t) l != l)
|
||||||
|
return -ERANGE;
|
||||||
|
|
||||||
|
*ret = (uint16_t) l;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int safe_atod(const char *s, double *ret_d) {
|
int safe_atod(const char *s, double *ret_d) {
|
||||||
_cleanup_(freelocalep) locale_t loc = (locale_t) 0;
|
_cleanup_(freelocalep) locale_t loc = (locale_t) 0;
|
||||||
char *x = NULL;
|
char *x = NULL;
|
||||||
|
@@ -54,6 +54,8 @@ int safe_atou8(const char *s, uint8_t *ret);
|
|||||||
int safe_atou16(const char *s, uint16_t *ret);
|
int safe_atou16(const char *s, uint16_t *ret);
|
||||||
int safe_atoi16(const char *s, int16_t *ret);
|
int safe_atoi16(const char *s, int16_t *ret);
|
||||||
|
|
||||||
|
int safe_atoux16(const char *s, uint16_t *ret);
|
||||||
|
|
||||||
static inline int safe_atou32(const char *s, uint32_t *ret_u) {
|
static inline int safe_atou32(const char *s, uint32_t *ret_u) {
|
||||||
assert_cc(sizeof(uint32_t) == sizeof(unsigned));
|
assert_cc(sizeof(uint32_t) == sizeof(unsigned));
|
||||||
return safe_atou(s, (unsigned*) ret_u);
|
return safe_atou(s, (unsigned*) ret_u);
|
||||||
|
@@ -398,37 +398,61 @@ use_saved_argv:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int is_kernel_thread(pid_t pid) {
|
int is_kernel_thread(pid_t pid) {
|
||||||
|
_cleanup_free_ char *line = NULL;
|
||||||
|
unsigned long long flags;
|
||||||
|
size_t l, i;
|
||||||
const char *p;
|
const char *p;
|
||||||
size_t count;
|
char *q;
|
||||||
char c;
|
int r;
|
||||||
bool eof;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
if (IN_SET(pid, 0, 1) || pid == getpid_cached()) /* pid 1, and we ourselves certainly aren't a kernel thread */
|
if (IN_SET(pid, 0, 1) || pid == getpid_cached()) /* pid 1, and we ourselves certainly aren't a kernel thread */
|
||||||
return 0;
|
return 0;
|
||||||
|
if (!pid_is_valid(pid))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
assert(pid > 1);
|
p = procfs_file_alloca(pid, "stat");
|
||||||
|
r = read_one_line_file(p, &line);
|
||||||
|
if (r == -ENOENT)
|
||||||
|
return -ESRCH;
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
p = procfs_file_alloca(pid, "cmdline");
|
/* Skip past the comm field */
|
||||||
f = fopen(p, "re");
|
q = strrchr(line, ')');
|
||||||
if (!f) {
|
if (!q)
|
||||||
if (errno == ENOENT)
|
return -EINVAL;
|
||||||
return -ESRCH;
|
q++;
|
||||||
return -errno;
|
|
||||||
|
/* Skip 6 fields to reach the flags field */
|
||||||
|
for (i = 0; i < 6; i++) {
|
||||||
|
l = strspn(q, WHITESPACE);
|
||||||
|
if (l < 1)
|
||||||
|
return -EINVAL;
|
||||||
|
q += l;
|
||||||
|
|
||||||
|
l = strcspn(q, WHITESPACE);
|
||||||
|
if (l < 1)
|
||||||
|
return -EINVAL;
|
||||||
|
q += l;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) __fsetlocking(f, FSETLOCKING_BYCALLER);
|
/* Skip preceeding whitespace */
|
||||||
|
l = strspn(q, WHITESPACE);
|
||||||
|
if (l < 1)
|
||||||
|
return -EINVAL;
|
||||||
|
q += l;
|
||||||
|
|
||||||
count = fread(&c, 1, 1, f);
|
/* Truncate the rest */
|
||||||
eof = feof(f);
|
l = strcspn(q, WHITESPACE);
|
||||||
fclose(f);
|
if (l < 1)
|
||||||
|
return -EINVAL;
|
||||||
|
q[l] = 0;
|
||||||
|
|
||||||
/* Kernel threads have an empty cmdline */
|
r = safe_atollu(q, &flags);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
if (count <= 0)
|
return !!(flags & PF_KTHREAD);
|
||||||
return eof ? 1 : -errno;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_process_capeff(pid_t pid, char **capeff) {
|
int get_process_capeff(pid_t pid, char **capeff) {
|
||||||
@@ -826,17 +850,33 @@ int kill_and_sigcont(pid_t pid, int sig) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getenv_for_pid(pid_t pid, const char *field, char **_value) {
|
int getenv_for_pid(pid_t pid, const char *field, char **ret) {
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
char *value = NULL;
|
char *value = NULL;
|
||||||
int r;
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
size_t l;
|
|
||||||
const char *path;
|
const char *path;
|
||||||
|
size_t l;
|
||||||
|
|
||||||
assert(pid >= 0);
|
assert(pid >= 0);
|
||||||
assert(field);
|
assert(field);
|
||||||
assert(_value);
|
assert(ret);
|
||||||
|
|
||||||
|
if (pid == 0 || pid == getpid_cached()) {
|
||||||
|
const char *e;
|
||||||
|
|
||||||
|
e = getenv(field);
|
||||||
|
if (!e) {
|
||||||
|
*ret = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = strdup(e);
|
||||||
|
if (!value)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*ret = value;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
path = procfs_file_alloca(pid, "environ");
|
path = procfs_file_alloca(pid, "environ");
|
||||||
|
|
||||||
@@ -844,13 +884,13 @@ int getenv_for_pid(pid_t pid, const char *field, char **_value) {
|
|||||||
if (!f) {
|
if (!f) {
|
||||||
if (errno == ENOENT)
|
if (errno == ENOENT)
|
||||||
return -ESRCH;
|
return -ESRCH;
|
||||||
|
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) __fsetlocking(f, FSETLOCKING_BYCALLER);
|
(void) __fsetlocking(f, FSETLOCKING_BYCALLER);
|
||||||
|
|
||||||
l = strlen(field);
|
l = strlen(field);
|
||||||
r = 0;
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
char line[LINE_MAX];
|
char line[LINE_MAX];
|
||||||
@@ -875,14 +915,14 @@ int getenv_for_pid(pid_t pid, const char *field, char **_value) {
|
|||||||
if (!value)
|
if (!value)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
r = 1;
|
*ret = value;
|
||||||
break;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (!done);
|
} while (!done);
|
||||||
|
|
||||||
*_value = value;
|
*ret = NULL;
|
||||||
return r;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pid_is_unwaited(pid_t pid) {
|
bool pid_is_unwaited(pid_t pid) {
|
||||||
|
@@ -179,6 +179,7 @@ static inline bool strv_fnmatch_or_empty(char* const* patterns, const char *s, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
char ***strv_free_free(char ***l);
|
char ***strv_free_free(char ***l);
|
||||||
|
DEFINE_TRIVIAL_CLEANUP_FUNC(char***, strv_free_free);
|
||||||
|
|
||||||
char **strv_skip(char **l, size_t n);
|
char **strv_skip(char **l, size_t n);
|
||||||
|
|
||||||
|
@@ -408,3 +408,22 @@ int utf8_encoded_valid_unichar(const char *str) {
|
|||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t utf8_n_codepoints(const char *str) {
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
/* Returns the number of UTF-8 codepoints in this string, or (size_t) -1 if the string is not valid UTF-8. */
|
||||||
|
|
||||||
|
while (*str != 0) {
|
||||||
|
int k;
|
||||||
|
|
||||||
|
k = utf8_encoded_valid_unichar(str);
|
||||||
|
if (k < 0)
|
||||||
|
return (size_t) -1;
|
||||||
|
|
||||||
|
str += k;
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
@@ -59,3 +59,5 @@ static inline bool utf16_is_trailing_surrogate(char16_t c) {
|
|||||||
static inline char32_t utf16_surrogate_pair_to_unichar(char16_t lead, char16_t trail) {
|
static inline char32_t utf16_surrogate_pair_to_unichar(char16_t lead, char16_t trail) {
|
||||||
return ((lead - 0xd800) << 10) + (trail - 0xdc00) + 0x10000;
|
return ((lead - 0xd800) << 10) + (trail - 0xdc00) + 0x10000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t utf8_n_codepoints(const char *str);
|
||||||
|
@@ -518,29 +518,6 @@ uint64_t system_tasks_max_scale(uint64_t v, uint64_t max) {
|
|||||||
return m / max;
|
return m / max;
|
||||||
}
|
}
|
||||||
|
|
||||||
int update_reboot_parameter_and_warn(const char *param) {
|
|
||||||
int r;
|
|
||||||
|
|
||||||
if (isempty(param)) {
|
|
||||||
if (unlink("/run/systemd/reboot-param") < 0) {
|
|
||||||
if (errno == ENOENT)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return log_warning_errno(errno, "Failed to unlink reboot parameter file: %m");
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
RUN_WITH_UMASK(0022) {
|
|
||||||
r = write_string_file("/run/systemd/reboot-param", param, WRITE_STRING_FILE_CREATE);
|
|
||||||
if (r < 0)
|
|
||||||
return log_warning_errno(r, "Failed to write reboot parameter file: %m");
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int version(void) {
|
int version(void) {
|
||||||
puts(PACKAGE_STRING "\n"
|
puts(PACKAGE_STRING "\n"
|
||||||
SYSTEMD_FEATURES);
|
SYSTEMD_FEATURES);
|
||||||
|
@@ -186,8 +186,6 @@ uint64_t physical_memory_scale(uint64_t v, uint64_t max);
|
|||||||
uint64_t system_tasks_max(void);
|
uint64_t system_tasks_max(void);
|
||||||
uint64_t system_tasks_max_scale(uint64_t v, uint64_t max);
|
uint64_t system_tasks_max_scale(uint64_t v, uint64_t max);
|
||||||
|
|
||||||
int update_reboot_parameter_and_warn(const char *param);
|
|
||||||
|
|
||||||
int version(void);
|
int version(void);
|
||||||
|
|
||||||
int str_verscmp(const char *s1, const char *s2);
|
int str_verscmp(const char *s1, const char *s2);
|
||||||
|
@@ -49,12 +49,12 @@ int arp_network_bind_raw_socket(int ifindex, be32_t address, const struct ether_
|
|||||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPOP_REPLY, 1, 0), /* protocol == reply ? */
|
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, ARPOP_REPLY, 1, 0), /* protocol == reply ? */
|
||||||
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
|
BPF_STMT(BPF_RET + BPF_K, 0), /* ignore */
|
||||||
/* Sender Hardware Address must be different from our own */
|
/* Sender Hardware Address must be different from our own */
|
||||||
BPF_STMT(BPF_LD + BPF_IMM, unaligned_read_ne32(ð_mac->ether_addr_octet[0])),/* A <- 4 bytes of client's MAC */
|
BPF_STMT(BPF_LD + BPF_IMM, unaligned_read_be32(ð_mac->ether_addr_octet[0])),/* A <- 4 bytes of client's MAC */
|
||||||
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
|
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
|
||||||
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(struct ether_arp, arp_sha)), /* A <- 4 bytes of SHA */
|
BPF_STMT(BPF_LD + BPF_W + BPF_ABS, offsetof(struct ether_arp, arp_sha)), /* A <- 4 bytes of SHA */
|
||||||
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
|
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
|
||||||
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 0, 6), /* A == 0 ? */
|
BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 0, 6), /* A == 0 ? */
|
||||||
BPF_STMT(BPF_LD + BPF_IMM, unaligned_read_ne16(ð_mac->ether_addr_octet[4])),/* A <- remainder of client's MAC */
|
BPF_STMT(BPF_LD + BPF_IMM, unaligned_read_be16(ð_mac->ether_addr_octet[4])),/* A <- remainder of client's MAC */
|
||||||
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
|
BPF_STMT(BPF_MISC + BPF_TAX, 0), /* X <- A */
|
||||||
BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ether_arp, arp_sha) + 4), /* A <- remainder of SHA */
|
BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct ether_arp, arp_sha) + 4), /* A <- remainder of SHA */
|
||||||
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
|
BPF_STMT(BPF_ALU + BPF_XOR + BPF_X, 0), /* A xor X */
|
||||||
|
@@ -771,8 +771,6 @@ static int client_parse_message(
|
|||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
int r;
|
int r;
|
||||||
bool clientid = false;
|
bool clientid = false;
|
||||||
uint8_t *id = NULL;
|
|
||||||
size_t id_len;
|
|
||||||
uint32_t lt_t1 = ~0, lt_t2 = ~0;
|
uint32_t lt_t1 = ~0, lt_t2 = ~0;
|
||||||
|
|
||||||
assert(client);
|
assert(client);
|
||||||
@@ -817,8 +815,8 @@ static int client_parse_message(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SD_DHCP6_OPTION_SERVERID:
|
case SD_DHCP6_OPTION_SERVERID:
|
||||||
r = dhcp6_lease_get_serverid(lease, &id, &id_len);
|
r = dhcp6_lease_get_serverid(lease, NULL, NULL);
|
||||||
if (r >= 0 && id) {
|
if (r >= 0) {
|
||||||
log_dhcp6_client(client, "%s contains multiple serverids",
|
log_dhcp6_client(client, "%s contains multiple serverids",
|
||||||
dhcp6_message_type_to_string(message->type));
|
dhcp6_message_type_to_string(message->type));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -956,24 +954,26 @@ static int client_parse_message(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (client->state != DHCP6_STATE_INFORMATION_REQUEST) {
|
if (client->state != DHCP6_STATE_INFORMATION_REQUEST) {
|
||||||
r = dhcp6_lease_get_serverid(lease, &id, &id_len);
|
r = dhcp6_lease_get_serverid(lease, NULL, NULL);
|
||||||
if (r < 0)
|
if (r < 0) {
|
||||||
log_dhcp6_client(client, "%s has no server id",
|
log_dhcp6_client(client, "%s has no server id",
|
||||||
dhcp6_message_type_to_string(message->type));
|
dhcp6_message_type_to_string(message->type));
|
||||||
return r;
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (lease->ia.addresses) {
|
||||||
|
lease->ia.ia_na.lifetime_t1 = htobe32(lt_t1);
|
||||||
|
lease->ia.ia_na.lifetime_t2 = htobe32(lt_t2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lease->pd.addresses) {
|
||||||
|
lease->pd.ia_pd.lifetime_t1 = htobe32(lt_t1);
|
||||||
|
lease->pd.ia_pd.lifetime_t2 = htobe32(lt_t2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lease->ia.addresses) {
|
return 0;
|
||||||
lease->ia.ia_na.lifetime_t1 = htobe32(lt_t1);
|
|
||||||
lease->ia.ia_na.lifetime_t2 = htobe32(lt_t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lease->pd.addresses) {
|
|
||||||
lease->pd.ia_pd.lifetime_t1 = htobe32(lt_t1);
|
|
||||||
lease->pd.ia_pd.lifetime_t2 = htobe32(lt_t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int client_receive_reply(sd_dhcp6_client *client, DHCP6Message *reply, size_t len) {
|
static int client_receive_reply(sd_dhcp6_client *client, DHCP6Message *reply, size_t len) {
|
||||||
|
@@ -95,11 +95,14 @@ int dhcp6_lease_set_serverid(sd_dhcp6_lease *lease, const uint8_t *id,
|
|||||||
|
|
||||||
int dhcp6_lease_get_serverid(sd_dhcp6_lease *lease, uint8_t **id, size_t *len) {
|
int dhcp6_lease_get_serverid(sd_dhcp6_lease *lease, uint8_t **id, size_t *len) {
|
||||||
assert_return(lease, -EINVAL);
|
assert_return(lease, -EINVAL);
|
||||||
assert_return(id, -EINVAL);
|
|
||||||
assert_return(len, -EINVAL);
|
|
||||||
|
|
||||||
*id = lease->serverid;
|
if (!lease->serverid)
|
||||||
*len = lease->serverid_len;
|
return -ENOMSG;
|
||||||
|
|
||||||
|
if (id)
|
||||||
|
*id = lease->serverid;
|
||||||
|
if (len)
|
||||||
|
*len = lease->serverid_len;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
|
#include "fs-util.h"
|
||||||
#include "hexdecoct.h"
|
#include "hexdecoct.h"
|
||||||
#include "id128-util.h"
|
#include "id128-util.h"
|
||||||
#include "io-util.h"
|
#include "io-util.h"
|
||||||
@@ -180,9 +181,13 @@ int id128_write_fd(int fd, Id128Format f, sd_id128_t id, bool do_sync) {
|
|||||||
if (do_sync) {
|
if (do_sync) {
|
||||||
if (fsync(fd) < 0)
|
if (fsync(fd) < 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
|
r = fsync_directory_of_file(fd);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
return r;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int id128_write(const char *p, Id128Format f, sd_id128_t id, bool do_sync) {
|
int id128_write(const char *p, Id128Format f, sd_id128_t id, bool do_sync) {
|
||||||
|
Reference in New Issue
Block a user