test-cpu-set-util.c: fix typo in comment (#6916)
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
/***
|
||||
This file is part of systemd.
|
||||
|
||||
Copyright 2016 Daniel Mack
|
||||
|
||||
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 <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "bpf-program.h"
|
||||
#include "fd-util.h"
|
||||
#include "log.h"
|
||||
#include "missing.h"
|
||||
|
||||
int bpf_program_new(uint32_t prog_type, BPFProgram **ret) {
|
||||
_cleanup_(bpf_program_unrefp) BPFProgram *p = NULL;
|
||||
|
||||
p = new0(BPFProgram, 1);
|
||||
if (!p)
|
||||
return log_oom();
|
||||
|
||||
p->prog_type = prog_type;
|
||||
p->kernel_fd = -1;
|
||||
|
||||
*ret = p;
|
||||
p = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
BPFProgram *bpf_program_unref(BPFProgram *p) {
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
safe_close(p->kernel_fd);
|
||||
free(p->instructions);
|
||||
|
||||
return mfree(p);
|
||||
}
|
||||
|
||||
int bpf_program_add_instructions(BPFProgram *p, const struct bpf_insn *instructions, size_t count) {
|
||||
|
||||
assert(p);
|
||||
|
||||
if (!GREEDY_REALLOC(p->instructions, p->allocated, p->n_instructions + count))
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(p->instructions + p->n_instructions, instructions, sizeof(struct bpf_insn) * count);
|
||||
p->n_instructions += count;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bpf_program_load_kernel(BPFProgram *p, char *log_buf, size_t log_size) {
|
||||
union bpf_attr attr;
|
||||
|
||||
assert(p);
|
||||
|
||||
if (p->kernel_fd >= 0)
|
||||
return -EBUSY;
|
||||
|
||||
attr = (union bpf_attr) {
|
||||
.prog_type = p->prog_type,
|
||||
.insns = PTR_TO_UINT64(p->instructions),
|
||||
.insn_cnt = p->n_instructions,
|
||||
.license = PTR_TO_UINT64("GPL"),
|
||||
.log_buf = PTR_TO_UINT64(log_buf),
|
||||
.log_level = !!log_buf,
|
||||
.log_size = log_size,
|
||||
};
|
||||
|
||||
p->kernel_fd = bpf(BPF_PROG_LOAD, &attr, sizeof(attr));
|
||||
if (p->kernel_fd < 0)
|
||||
return -errno;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bpf_program_cgroup_attach(BPFProgram *p, int type, const char *path, uint32_t flags) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
union bpf_attr attr;
|
||||
|
||||
assert(p);
|
||||
assert(type >= 0);
|
||||
assert(path);
|
||||
|
||||
fd = open(path, O_DIRECTORY|O_RDONLY|O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
attr = (union bpf_attr) {
|
||||
.attach_type = type,
|
||||
.target_fd = fd,
|
||||
.attach_bpf_fd = p->kernel_fd,
|
||||
.attach_flags = flags,
|
||||
};
|
||||
|
||||
if (bpf(BPF_PROG_ATTACH, &attr, sizeof(attr)) < 0)
|
||||
return -errno;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bpf_program_cgroup_detach(int type, const char *path) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
union bpf_attr attr;
|
||||
|
||||
assert(path);
|
||||
|
||||
fd = open(path, O_DIRECTORY|O_RDONLY|O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
attr = (union bpf_attr) {
|
||||
.attach_type = type,
|
||||
.target_fd = fd,
|
||||
};
|
||||
|
||||
if (bpf(BPF_PROG_DETACH, &attr, sizeof(attr)) < 0)
|
||||
return -errno;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bpf_map_new(enum bpf_map_type type, size_t key_size, size_t value_size, size_t max_entries, uint32_t flags) {
|
||||
union bpf_attr attr = {
|
||||
.map_type = type,
|
||||
.key_size = key_size,
|
||||
.value_size = value_size,
|
||||
.max_entries = max_entries,
|
||||
.map_flags = flags,
|
||||
};
|
||||
int fd;
|
||||
|
||||
fd = bpf(BPF_MAP_CREATE, &attr, sizeof(attr));
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
int bpf_map_update_element(int fd, const void *key, void *value) {
|
||||
|
||||
union bpf_attr attr = {
|
||||
.map_fd = fd,
|
||||
.key = PTR_TO_UINT64(key),
|
||||
.value = PTR_TO_UINT64(value),
|
||||
};
|
||||
|
||||
if (bpf(BPF_MAP_UPDATE_ELEM, &attr, sizeof(attr)) < 0)
|
||||
return -errno;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bpf_map_lookup_element(int fd, const void *key, void *value) {
|
||||
|
||||
union bpf_attr attr = {
|
||||
.map_fd = fd,
|
||||
.key = PTR_TO_UINT64(key),
|
||||
.value = PTR_TO_UINT64(value),
|
||||
};
|
||||
|
||||
if (bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr)) < 0)
|
||||
return -errno;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
#pragma once
|
||||
|
||||
/***
|
||||
This file is part of systemd.
|
||||
|
||||
Copyright 2016 Daniel Mack
|
||||
|
||||
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/>.
|
||||
|
||||
[Except for the stuff copy/pasted from the kernel sources, see below]
|
||||
***/
|
||||
|
||||
#include <linux/bpf.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#include "list.h"
|
||||
#include "macro.h"
|
||||
|
||||
typedef struct BPFProgram BPFProgram;
|
||||
|
||||
struct BPFProgram {
|
||||
int kernel_fd;
|
||||
uint32_t prog_type;
|
||||
|
||||
size_t n_instructions;
|
||||
size_t allocated;
|
||||
struct bpf_insn *instructions;
|
||||
};
|
||||
|
||||
int bpf_program_new(uint32_t prog_type, BPFProgram **ret);
|
||||
BPFProgram *bpf_program_unref(BPFProgram *p);
|
||||
|
||||
int bpf_program_add_instructions(BPFProgram *p, const struct bpf_insn *insn, size_t count);
|
||||
int bpf_program_load_kernel(BPFProgram *p, char *log_buf, size_t log_size);
|
||||
|
||||
int bpf_program_cgroup_attach(BPFProgram *p, int type, const char *path, uint32_t flags);
|
||||
int bpf_program_cgroup_detach(int type, const char *path);
|
||||
|
||||
int bpf_map_new(enum bpf_map_type type, size_t key_size, size_t value_size, size_t max_entries, uint32_t flags);
|
||||
int bpf_map_update_element(int fd, const void *key, void *value);
|
||||
int bpf_map_lookup_element(int fd, const void *key, void *value);
|
||||
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC(BPFProgram*, bpf_program_unref);
|
||||
@@ -103,9 +103,12 @@ int cg_read_pid(FILE *f, pid_t *_pid) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int cg_read_event(const char *controller, const char *path, const char *event,
|
||||
char **val)
|
||||
{
|
||||
int cg_read_event(
|
||||
const char *controller,
|
||||
const char *path,
|
||||
const char *event,
|
||||
char **val) {
|
||||
|
||||
_cleanup_free_ char *events = NULL, *content = NULL;
|
||||
char *p, *line;
|
||||
int r;
|
||||
|
||||
+109
-27
@@ -308,22 +308,22 @@ int in_addr_from_string(int family, const char *s, union in_addr_union *ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int in_addr_from_string_auto(const char *s, int *family, union in_addr_union *ret) {
|
||||
int in_addr_from_string_auto(const char *s, int *ret_family, union in_addr_union *ret) {
|
||||
int r;
|
||||
|
||||
assert(s);
|
||||
|
||||
r = in_addr_from_string(AF_INET, s, ret);
|
||||
if (r >= 0) {
|
||||
if (family)
|
||||
*family = AF_INET;
|
||||
if (ret_family)
|
||||
*ret_family = AF_INET;
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = in_addr_from_string(AF_INET6, s, ret);
|
||||
if (r >= 0) {
|
||||
if (family)
|
||||
*family = AF_INET6;
|
||||
if (ret_family)
|
||||
*ret_family = AF_INET6;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -371,13 +371,13 @@ int in_addr_ifindex_from_string_auto(const char *s, int *family, union in_addr_u
|
||||
return r;
|
||||
}
|
||||
|
||||
unsigned char in_addr_netmask_to_prefixlen(const struct in_addr *addr) {
|
||||
unsigned char in4_addr_netmask_to_prefixlen(const struct in_addr *addr) {
|
||||
assert(addr);
|
||||
|
||||
return 32 - u32ctz(be32toh(addr->s_addr));
|
||||
}
|
||||
|
||||
struct in_addr* in_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char prefixlen) {
|
||||
struct in_addr* in4_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char prefixlen) {
|
||||
assert(addr);
|
||||
assert(prefixlen <= 32);
|
||||
|
||||
@@ -390,7 +390,7 @@ struct in_addr* in_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char
|
||||
return addr;
|
||||
}
|
||||
|
||||
int in_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen) {
|
||||
int in4_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen) {
|
||||
uint8_t msb_octet = *(uint8_t*) addr;
|
||||
|
||||
/* addr may not be aligned, so make sure we only access it byte-wise */
|
||||
@@ -414,18 +414,18 @@ int in_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixl
|
||||
return 0;
|
||||
}
|
||||
|
||||
int in_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask) {
|
||||
int in4_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask) {
|
||||
unsigned char prefixlen;
|
||||
int r;
|
||||
|
||||
assert(addr);
|
||||
assert(mask);
|
||||
|
||||
r = in_addr_default_prefixlen(addr, &prefixlen);
|
||||
r = in4_addr_default_prefixlen(addr, &prefixlen);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
in_addr_prefixlen_to_netmask(mask, prefixlen);
|
||||
in4_addr_prefixlen_to_netmask(mask, prefixlen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -435,7 +435,7 @@ int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen)
|
||||
if (family == AF_INET) {
|
||||
struct in_addr mask;
|
||||
|
||||
if (!in_addr_prefixlen_to_netmask(&mask, prefixlen))
|
||||
if (!in4_addr_prefixlen_to_netmask(&mask, prefixlen))
|
||||
return -EINVAL;
|
||||
|
||||
addr->in.s_addr &= mask.s_addr;
|
||||
@@ -465,10 +465,57 @@ int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen)
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, uint8_t *ret_prefixlen) {
|
||||
int in_addr_prefix_covers(int family,
|
||||
const union in_addr_union *prefix,
|
||||
unsigned char prefixlen,
|
||||
const union in_addr_union *address) {
|
||||
|
||||
union in_addr_union masked_prefix, masked_address;
|
||||
int r;
|
||||
|
||||
assert(prefix);
|
||||
assert(address);
|
||||
|
||||
masked_prefix = *prefix;
|
||||
r = in_addr_mask(family, &masked_prefix, prefixlen);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
masked_address = *address;
|
||||
r = in_addr_mask(family, &masked_address, prefixlen);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return in_addr_equal(family, &masked_prefix, &masked_address);
|
||||
}
|
||||
|
||||
int in_addr_parse_prefixlen(int family, const char *p, unsigned char *ret) {
|
||||
uint8_t u;
|
||||
int r;
|
||||
|
||||
if (!IN_SET(family, AF_INET, AF_INET6))
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
r = safe_atou8(p, &u);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (u > FAMILY_ADDRESS_SIZE(family) * 8)
|
||||
return -ERANGE;
|
||||
|
||||
*ret = u;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int in_addr_prefix_from_string(
|
||||
const char *p,
|
||||
int family,
|
||||
union in_addr_union *ret_prefix,
|
||||
unsigned char *ret_prefixlen) {
|
||||
|
||||
union in_addr_union buffer;
|
||||
const char *e, *l;
|
||||
uint8_t k;
|
||||
unsigned char k;
|
||||
int r;
|
||||
|
||||
assert(p);
|
||||
@@ -486,23 +533,58 @@ int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *r
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
k = FAMILY_ADDRESS_SIZE(family) * 8;
|
||||
|
||||
if (e) {
|
||||
uint8_t n;
|
||||
|
||||
r = safe_atou8(e + 1, &n);
|
||||
r = in_addr_parse_prefixlen(family, e+1, &k);
|
||||
if (r < 0)
|
||||
return r;
|
||||
} else
|
||||
k = FAMILY_ADDRESS_SIZE(family) * 8;
|
||||
|
||||
if (n > k)
|
||||
return -ERANGE;
|
||||
|
||||
k = n;
|
||||
}
|
||||
|
||||
*ret_prefix = buffer;
|
||||
*ret_prefixlen = k;
|
||||
if (ret_prefix)
|
||||
*ret_prefix = buffer;
|
||||
if (ret_prefixlen)
|
||||
*ret_prefixlen = k;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int in_addr_prefix_from_string_auto(
|
||||
const char *p,
|
||||
int *ret_family,
|
||||
union in_addr_union *ret_prefix,
|
||||
unsigned char *ret_prefixlen) {
|
||||
|
||||
union in_addr_union buffer;
|
||||
const char *e, *l;
|
||||
unsigned char k;
|
||||
int family, r;
|
||||
|
||||
assert(p);
|
||||
|
||||
e = strchr(p, '/');
|
||||
if (e)
|
||||
l = strndupa(p, e - p);
|
||||
else
|
||||
l = p;
|
||||
|
||||
r = in_addr_from_string_auto(l, &family, &buffer);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (e) {
|
||||
r = in_addr_parse_prefixlen(family, e+1, &k);
|
||||
if (r < 0)
|
||||
return r;
|
||||
} else
|
||||
k = FAMILY_ADDRESS_SIZE(family) * 8;
|
||||
|
||||
if (ret_family)
|
||||
*ret_family = family;
|
||||
if (ret_prefix)
|
||||
*ret_prefix = buffer;
|
||||
if (ret_prefixlen)
|
||||
*ret_prefixlen = k;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
@@ -53,14 +53,17 @@ int in_addr_prefix_next(int family, union in_addr_union *u, unsigned prefixlen);
|
||||
int in_addr_to_string(int family, const union in_addr_union *u, char **ret);
|
||||
int in_addr_ifindex_to_string(int family, const union in_addr_union *u, int ifindex, char **ret);
|
||||
int in_addr_from_string(int family, const char *s, union in_addr_union *ret);
|
||||
int in_addr_from_string_auto(const char *s, int *family, union in_addr_union *ret);
|
||||
int in_addr_from_string_auto(const char *s, int *ret_family, union in_addr_union *ret);
|
||||
int in_addr_ifindex_from_string_auto(const char *s, int *family, union in_addr_union *ret, int *ifindex);
|
||||
unsigned char in_addr_netmask_to_prefixlen(const struct in_addr *addr);
|
||||
struct in_addr* in_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char prefixlen);
|
||||
int in_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen);
|
||||
int in_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask);
|
||||
unsigned char in4_addr_netmask_to_prefixlen(const struct in_addr *addr);
|
||||
struct in_addr* in4_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char prefixlen);
|
||||
int in4_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen);
|
||||
int in4_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask);
|
||||
int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen);
|
||||
int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, uint8_t *ret_prefixlen);
|
||||
int in_addr_prefix_covers(int family, const union in_addr_union *prefix, unsigned char prefixlen, const union in_addr_union *address);
|
||||
int in_addr_parse_prefixlen(int family, const char *p, unsigned char *ret);
|
||||
int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen);
|
||||
int in_addr_prefix_from_string_auto(const char *p, int *ret_family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen);
|
||||
|
||||
static inline size_t FAMILY_ADDRESS_SIZE(int family) {
|
||||
assert(family == AF_INET || family == AF_INET6);
|
||||
|
||||
+5
-8
@@ -40,14 +40,6 @@ int fd_wait_for_event(int fd, int event, usec_t timeout);
|
||||
|
||||
ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);
|
||||
|
||||
#define IOVEC_SET_STRING(i, s) \
|
||||
do { \
|
||||
struct iovec *_i = &(i); \
|
||||
char *_s = (char *)(s); \
|
||||
_i->iov_base = _s; \
|
||||
_i->iov_len = strlen(_s); \
|
||||
} while (false)
|
||||
|
||||
static inline size_t IOVEC_TOTAL_SIZE(const struct iovec *i, unsigned n) {
|
||||
unsigned j;
|
||||
size_t r = 0;
|
||||
@@ -93,3 +85,8 @@ static inline bool FILE_SIZE_VALID_OR_INFINITY(uint64_t l) {
|
||||
return FILE_SIZE_VALID(l);
|
||||
|
||||
}
|
||||
|
||||
#define IOVEC_INIT(base, len) { .iov_base = (base), .iov_len = (len) }
|
||||
#define IOVEC_MAKE(base, len) (struct iovec) IOVEC_INIT(base, len)
|
||||
#define IOVEC_INIT_STRING(string) IOVEC_INIT((char*) string, strlen(string))
|
||||
#define IOVEC_MAKE_STRING(string) (struct iovec) IOVEC_INIT_STRING(string)
|
||||
|
||||
@@ -20,8 +20,9 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "journal-importer.h"
|
||||
#include "fd-util.h"
|
||||
#include "io-util.h"
|
||||
#include "journal-importer.h"
|
||||
#include "parse-util.h"
|
||||
#include "string-util.h"
|
||||
#include "unaligned.h"
|
||||
@@ -38,7 +39,7 @@ static int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) {
|
||||
if (!GREEDY_REALLOC(iovw->iovec, iovw->size_bytes, iovw->count + 1))
|
||||
return log_oom();
|
||||
|
||||
iovw->iovec[iovw->count++] = (struct iovec) {data, len};
|
||||
iovw->iovec[iovw->count++] = IOVEC_MAKE(data, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+90
-23
@@ -351,22 +351,22 @@ static int write_to_console(
|
||||
|
||||
if (log_target == LOG_TARGET_CONSOLE_PREFIXED) {
|
||||
xsprintf(prefix, "<%i>", level);
|
||||
IOVEC_SET_STRING(iovec[n++], prefix);
|
||||
iovec[n++] = IOVEC_MAKE_STRING(prefix);
|
||||
}
|
||||
|
||||
highlight = LOG_PRI(level) <= LOG_ERR && show_color;
|
||||
|
||||
if (show_location) {
|
||||
snprintf(location, sizeof(location), "(%s:%i) ", file, line);
|
||||
IOVEC_SET_STRING(iovec[n++], location);
|
||||
iovec[n++] = IOVEC_MAKE_STRING(location);
|
||||
}
|
||||
|
||||
if (highlight)
|
||||
IOVEC_SET_STRING(iovec[n++], ANSI_HIGHLIGHT_RED);
|
||||
IOVEC_SET_STRING(iovec[n++], buffer);
|
||||
iovec[n++] = IOVEC_MAKE_STRING(ANSI_HIGHLIGHT_RED);
|
||||
iovec[n++] = IOVEC_MAKE_STRING(buffer);
|
||||
if (highlight)
|
||||
IOVEC_SET_STRING(iovec[n++], ANSI_NORMAL);
|
||||
IOVEC_SET_STRING(iovec[n++], "\n");
|
||||
iovec[n++] = IOVEC_MAKE_STRING(ANSI_NORMAL);
|
||||
iovec[n++] = IOVEC_MAKE_STRING("\n");
|
||||
|
||||
if (writev(console_fd, iovec, n) < 0) {
|
||||
|
||||
@@ -425,11 +425,11 @@ static int write_to_syslog(
|
||||
|
||||
xsprintf(header_pid, "["PID_FMT"]: ", getpid_cached());
|
||||
|
||||
IOVEC_SET_STRING(iovec[0], header_priority);
|
||||
IOVEC_SET_STRING(iovec[1], header_time);
|
||||
IOVEC_SET_STRING(iovec[2], program_invocation_short_name);
|
||||
IOVEC_SET_STRING(iovec[3], header_pid);
|
||||
IOVEC_SET_STRING(iovec[4], buffer);
|
||||
iovec[0] = IOVEC_MAKE_STRING(header_priority);
|
||||
iovec[1] = IOVEC_MAKE_STRING(header_time);
|
||||
iovec[2] = IOVEC_MAKE_STRING(program_invocation_short_name);
|
||||
iovec[3] = IOVEC_MAKE_STRING(header_pid);
|
||||
iovec[4] = IOVEC_MAKE_STRING(buffer);
|
||||
|
||||
/* When using syslog via SOCK_STREAM separate the messages by NUL chars */
|
||||
if (syslog_is_stream)
|
||||
@@ -470,11 +470,11 @@ static int write_to_kmsg(
|
||||
xsprintf(header_priority, "<%i>", level);
|
||||
xsprintf(header_pid, "["PID_FMT"]: ", getpid_cached());
|
||||
|
||||
IOVEC_SET_STRING(iovec[0], header_priority);
|
||||
IOVEC_SET_STRING(iovec[1], program_invocation_short_name);
|
||||
IOVEC_SET_STRING(iovec[2], header_pid);
|
||||
IOVEC_SET_STRING(iovec[3], buffer);
|
||||
IOVEC_SET_STRING(iovec[4], "\n");
|
||||
iovec[0] = IOVEC_MAKE_STRING(header_priority);
|
||||
iovec[1] = IOVEC_MAKE_STRING(program_invocation_short_name);
|
||||
iovec[2] = IOVEC_MAKE_STRING(header_pid);
|
||||
iovec[3] = IOVEC_MAKE_STRING(buffer);
|
||||
iovec[4] = IOVEC_MAKE_STRING("\n");
|
||||
|
||||
if (writev(kmsg_fd, iovec, ELEMENTSOF(iovec)) < 0)
|
||||
return -errno;
|
||||
@@ -547,10 +547,10 @@ static int write_to_journal(
|
||||
|
||||
log_do_header(header, sizeof(header), level, error, file, line, func, object_field, object, extra_field, extra);
|
||||
|
||||
IOVEC_SET_STRING(iovec[0], header);
|
||||
IOVEC_SET_STRING(iovec[1], "MESSAGE=");
|
||||
IOVEC_SET_STRING(iovec[2], buffer);
|
||||
IOVEC_SET_STRING(iovec[3], "\n");
|
||||
iovec[0] = IOVEC_MAKE_STRING(header);
|
||||
iovec[1] = IOVEC_MAKE_STRING("MESSAGE=");
|
||||
iovec[2] = IOVEC_MAKE_STRING(buffer);
|
||||
iovec[3] = IOVEC_MAKE_STRING("\n");
|
||||
|
||||
mh.msg_iov = iovec;
|
||||
mh.msg_iovlen = ELEMENTSOF(iovec);
|
||||
@@ -872,7 +872,7 @@ int log_format_iovec(
|
||||
* the next format string */
|
||||
VA_FORMAT_ADVANCE(format, ap);
|
||||
|
||||
IOVEC_SET_STRING(iovec[(*n)++], m);
|
||||
iovec[(*n)++] = IOVEC_MAKE_STRING(m);
|
||||
|
||||
if (newline_separator) {
|
||||
iovec[*n].iov_base = (char*) &nl;
|
||||
@@ -893,9 +893,9 @@ int log_struct_internal(
|
||||
const char *func,
|
||||
const char *format, ...) {
|
||||
|
||||
LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
|
||||
char buf[LINE_MAX];
|
||||
bool found = false;
|
||||
LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
|
||||
PROTECT_ERRNO;
|
||||
va_list ap;
|
||||
|
||||
@@ -926,7 +926,7 @@ int log_struct_internal(
|
||||
|
||||
/* If the journal is available do structured logging */
|
||||
log_do_header(header, sizeof(header), level, error, file, line, func, NULL, NULL, NULL, NULL);
|
||||
IOVEC_SET_STRING(iovec[n++], header);
|
||||
iovec[n++] = IOVEC_MAKE_STRING(header);
|
||||
|
||||
va_start(ap, format);
|
||||
r = log_format_iovec(iovec, ELEMENTSOF(iovec), &n, true, error, format, ap);
|
||||
@@ -975,6 +975,73 @@ int log_struct_internal(
|
||||
return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, buf + 8);
|
||||
}
|
||||
|
||||
int log_struct_iovec_internal(
|
||||
int level,
|
||||
int error,
|
||||
const char *file,
|
||||
int line,
|
||||
const char *func,
|
||||
const struct iovec input_iovec[],
|
||||
size_t n_input_iovec) {
|
||||
|
||||
LogRealm realm = LOG_REALM_REMOVE_LEVEL(level);
|
||||
PROTECT_ERRNO;
|
||||
size_t i;
|
||||
char *m;
|
||||
|
||||
if (error < 0)
|
||||
error = -error;
|
||||
|
||||
if (_likely_(LOG_PRI(level) > log_max_level[realm]))
|
||||
return -error;
|
||||
|
||||
if (log_target == LOG_TARGET_NULL)
|
||||
return -error;
|
||||
|
||||
if ((level & LOG_FACMASK) == 0)
|
||||
level = log_facility | LOG_PRI(level);
|
||||
|
||||
if (IN_SET(log_target, LOG_TARGET_AUTO,
|
||||
LOG_TARGET_JOURNAL_OR_KMSG,
|
||||
LOG_TARGET_JOURNAL) &&
|
||||
journal_fd >= 0) {
|
||||
|
||||
struct iovec iovec[1 + n_input_iovec*2];
|
||||
char header[LINE_MAX];
|
||||
struct msghdr mh = {
|
||||
.msg_iov = iovec,
|
||||
.msg_iovlen = 1 + n_input_iovec*2,
|
||||
};
|
||||
|
||||
log_do_header(header, sizeof(header), level, error, file, line, func, NULL, NULL, NULL, NULL);
|
||||
iovec[0] = IOVEC_MAKE_STRING(header);
|
||||
|
||||
for (i = 0; i < n_input_iovec; i++) {
|
||||
iovec[1+i*2] = input_iovec[i];
|
||||
iovec[1+i*2+1] = IOVEC_MAKE_STRING("\n");
|
||||
}
|
||||
|
||||
if (sendmsg(journal_fd, &mh, MSG_NOSIGNAL) >= 0)
|
||||
return -error;
|
||||
}
|
||||
|
||||
for (i = 0; i < n_input_iovec; i++) {
|
||||
if (input_iovec[i].iov_len < strlen("MESSAGE="))
|
||||
continue;
|
||||
|
||||
if (memcmp(input_iovec[i].iov_base, "MESSAGE=", strlen("MESSAGE=")) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (_unlikely_(i >= n_input_iovec)) /* Couldn't find MESSAGE=? */
|
||||
return -error;
|
||||
|
||||
m = strndupa(input_iovec[i].iov_base + strlen("MESSAGE="),
|
||||
input_iovec[i].iov_len - strlen("MESSAGE="));
|
||||
|
||||
return log_dispatch_internal(level, error, file, line, func, NULL, NULL, NULL, NULL, m);
|
||||
}
|
||||
|
||||
int log_set_target_from_string(const char *e) {
|
||||
LogTarget t;
|
||||
|
||||
|
||||
@@ -187,6 +187,15 @@ int log_format_iovec(
|
||||
const char *format,
|
||||
va_list ap) _printf_(6, 0);
|
||||
|
||||
int log_struct_iovec_internal(
|
||||
int level,
|
||||
int error,
|
||||
const char *file,
|
||||
int line,
|
||||
const char *func,
|
||||
const struct iovec input_iovec[],
|
||||
size_t n_input_iovec);
|
||||
|
||||
/* This modifies the buffer passed! */
|
||||
int log_dump_internal(
|
||||
int level,
|
||||
@@ -270,6 +279,11 @@ void log_assert_failed_return_realm(
|
||||
error, __FILE__, __LINE__, __func__, __VA_ARGS__)
|
||||
#define log_struct(level, ...) log_struct_errno(level, 0, __VA_ARGS__)
|
||||
|
||||
#define log_struct_iovec_errno(level, error, iovec, n_iovec) \
|
||||
log_struct_iovec_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
|
||||
error, __FILE__, __LINE__, __func__, iovec, n_iovec)
|
||||
#define log_struct_iovec(level, iovec, n_iovec) log_struct_iovec_errno(level, 0, iovec, n_iovec)
|
||||
|
||||
/* This modifies the buffer passed! */
|
||||
#define log_dump(level, buffer) \
|
||||
log_dump_internal(LOG_REALM_PLUS_LEVEL(LOG_REALM, level), \
|
||||
|
||||
+11
-9
@@ -1,4 +1,6 @@
|
||||
basic_sources_plain = files('''
|
||||
MurmurHash2.c
|
||||
MurmurHash2.h
|
||||
af-list.c
|
||||
af-list.h
|
||||
alloc-util.c
|
||||
@@ -16,6 +18,8 @@ basic_sources_plain = files('''
|
||||
bitmap.c
|
||||
bitmap.h
|
||||
blkid-util.h
|
||||
bpf-program.c
|
||||
bpf-program.h
|
||||
btrfs-ctree.h
|
||||
btrfs-util.c
|
||||
btrfs-util.h
|
||||
@@ -24,10 +28,10 @@ basic_sources_plain = files('''
|
||||
bus-label.h
|
||||
calendarspec.c
|
||||
calendarspec.h
|
||||
capability-util.c
|
||||
capability-util.h
|
||||
cap-list.c
|
||||
cap-list.h
|
||||
capability-util.c
|
||||
capability-util.h
|
||||
cgroup-util.c
|
||||
cgroup-util.h
|
||||
chattr-util.c
|
||||
@@ -61,10 +65,10 @@ basic_sources_plain = files('''
|
||||
extract-word.h
|
||||
fd-util.c
|
||||
fd-util.h
|
||||
fileio.c
|
||||
fileio.h
|
||||
fileio-label.c
|
||||
fileio-label.h
|
||||
fileio.c
|
||||
fileio.h
|
||||
format-util.h
|
||||
fs-util.c
|
||||
fs-util.h
|
||||
@@ -82,9 +86,9 @@ basic_sources_plain = files('''
|
||||
hostname-util.h
|
||||
in-addr-util.c
|
||||
in-addr-util.h
|
||||
ioprio.h
|
||||
io-util.c
|
||||
io-util.h
|
||||
ioprio.h
|
||||
journal-importer.c
|
||||
journal-importer.h
|
||||
khash.c
|
||||
@@ -106,13 +110,11 @@ basic_sources_plain = files('''
|
||||
mempool.c
|
||||
mempool.h
|
||||
missing_syscall.h
|
||||
mkdir-label.c
|
||||
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
|
||||
@@ -138,9 +140,9 @@ basic_sources_plain = files('''
|
||||
rlimit-util.h
|
||||
rm-rf.c
|
||||
rm-rf.h
|
||||
securebits.h
|
||||
securebits-util.c
|
||||
securebits-util.h
|
||||
securebits.h
|
||||
selinux-util.c
|
||||
selinux-util.h
|
||||
set.h
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
/* Missing glibc definitions to access certain kernel APIs */
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if !HAVE_DECL_PIVOT_ROOT
|
||||
static inline int pivot_root(const char *new_root, const char *put_old) {
|
||||
return syscall(SYS_pivot_root, new_root, put_old);
|
||||
@@ -316,3 +318,33 @@ static inline ssize_t copy_file_range(int fd_in, loff_t *off_in,
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !HAVE_DECL_BPF
|
||||
# ifndef __NR_bpf
|
||||
# if defined __i386__
|
||||
# define __NR_bpf 357
|
||||
# elif defined __x86_64__
|
||||
# define __NR_bpf 321
|
||||
# elif defined __aarch64__
|
||||
# define __NR_bpf 280
|
||||
# elif defined __sparc__
|
||||
# define __NR_bpf 349
|
||||
# elif defined __s390__
|
||||
# define __NR_bpf 351
|
||||
# else
|
||||
# warning "__NR_bpf not defined for your architecture"
|
||||
# endif
|
||||
# endif
|
||||
|
||||
union bpf_attr;
|
||||
|
||||
static inline int bpf(int cmd, union bpf_attr *attr, size_t size) {
|
||||
#ifdef __NR_bpf
|
||||
return (int) syscall(__NR_bpf, cmd, attr, size);
|
||||
#else
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -42,7 +42,8 @@ int setrlimit_closest(int resource, const struct rlimit *rlim) {
|
||||
|
||||
/* So we failed to set the desired setrlimit, then let's try
|
||||
* to get as close as we can */
|
||||
assert_se(getrlimit(resource, &highest) == 0);
|
||||
if (getrlimit(resource, &highest) < 0)
|
||||
return -errno;
|
||||
|
||||
fixed.rlim_cur = MIN(rlim->rlim_cur, highest.rlim_max);
|
||||
fixed.rlim_max = MIN(rlim->rlim_max, highest.rlim_max);
|
||||
|
||||
@@ -83,7 +83,7 @@ int socket_address_listen(
|
||||
return -errno;
|
||||
}
|
||||
|
||||
if (socket_address_family(a) == AF_INET || socket_address_family(a) == AF_INET6) {
|
||||
if (IN_SET(socket_address_family(a), AF_INET, AF_INET6)) {
|
||||
if (bind_to_device)
|
||||
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, bind_to_device, strlen(bind_to_device)+1) < 0)
|
||||
return -errno;
|
||||
|
||||
Reference in New Issue
Block a user