Commit graph

315 commits

Author SHA1 Message Date
Fernando Fernandez Mancera
cd31559ded utils: introduce nm_ether_addr_from_string() helper 2022-08-04 11:18:36 +02:00
Thomas Haller
483d287590
glib-aux: use unsigned long literals in NM_HASH_COMBINE_BOOLS() macro
To avoid the ambiguity for which integer type is used.
2022-08-04 11:05:33 +02:00
Thomas Haller
614e050b24
glib-aux: accept zero bytes for nm_utils_random_bytes()
As an edge case, also accept requesting zero bytes of
randomness.
2022-08-01 11:23:42 +02:00
Thomas Haller
3c349ee11b
glib-aux: reseed state for "bad" random bytes every time
nm_utils_random_bytes() is supposed to give us good random number from
kernel. It guarantees to always provide some bytes, and it has a
boolean return value that estimates whether the bytes are good
randomness. In practice, most callers ignore that return value, because
what would they do about it anyway?

Of course, we want to primarily use getrandom() (or "/dev/urandom"). But
if we fail to get random bytes from them, we have a fallback path that
tries to generate "random" bytes.

It does so, by initializing a global seed from various sources, and keep
sha256 hashing the buffer in a loop. That's certainly not efficient nor
elegant, but we already are in a fallback path.

Still, we can do slightly better. Instead of just using the global state
and keep updating it (entirely deterministically), every time also mix in
the results from getrandom() and a current timestamp. The idea is that if you
have a virtual machine that gets cloned, we don't want that our global
state keeps giving the same random numbers. In particular, because
getrandom() might handle that case, even if it doesn't have good
entropy.
2022-08-01 11:22:07 +02:00
Thomas Haller
5806db7f4e
glib-aux: replace nm_ip4_addr_is_localhost() by nm_utils_ip4_address_is_loopback()
This was duplicated.
2022-07-28 13:08:31 +02:00
Thomas Haller
fdebcfa0a0
glib-aux: use different name for local variables in nm_g_array_index_p() macro
This doesn't use NM_UNIQ_T() to create a truly unique name.

Instead, it avoids "_arr" as local variable name, which other
macros also use. By choosing a different name, we can nest such
macro calls, without getting a "-Wshadow" warning.
2022-07-28 13:08:10 +02:00
Thomas Haller
6501f741fc
std-aux: add argument to "op" parameter for NM_VA_ARGS_FOREACH() macro
This will be needed to pass "NM_UNIQ" to the op macro, to construct
a NM_UNIQ_T() unique name.
2022-07-28 13:06:08 +02:00
Thomas Haller
1f7db38dd7
glib-aux: add nm_ip_addr_cmp_for_sort() helper for sorting IP addresses
It's similar to nm_ip_addr_cmp(), but it can be used as an argument
to g_qsort_with_data() to sort a list of NMIPAddr (or in_addr_t or
struct in6_addr).

The address family needs to be given as user-data.
2022-07-26 12:28:03 +02:00
Thomas Haller
76d63c66d7
glib-aux: add nm_utils_ip4_address_is_loopback() 2022-07-26 12:28:03 +02:00
Thomas Haller
51625013d4
glib-aux: add code comment to nm_ip_addr_set() about using it for NMIPAddr argument 2022-07-26 12:27:58 +02:00
Thomas Haller
22f6ac039d
glib-aux: use max_align_t in NM_HASH_COMBINE_VALS() macro
The _nm_alignas() exists to choose a suitable alignment. Since it's
on the stack, it has (almost) no overhead to just use the maximum
alignment.

That's why gint64 was chosen before. But that isn't the largest
alignment. We rely on C11 already, and we also always include <stddef.h>.
So use max_align_t instead.
2022-07-20 10:21:44 +02:00
Thomas Haller
4dd4d5b759
glib-aux: don't use GPtrArray in nm_utils_strsplit_quoted()
GPtrArray requires an additional heap allocation for the GPtrArray.
Utterly useless in the majority of cases.

Anyway. Allocating (and exponentially grown) a buffer is not too hard,
just slightly more cumbersome. Since nm_utils_strsplit_quoted() is
heavily unit tested and entirely self-contained, let's opt for the
more complicated implementation and avoid the extra allocation.
2022-07-18 14:58:00 +02:00
Thomas Haller
d8a4b3bec2
all: reformat with clang-format (clang-tools-extra-14.0.0-1.fc36) and update gitlab-ci to f36 2022-07-06 11:06:53 +02:00
Thomas Haller
05014b328f
glib-aux: add _nm_utils_ip4_netmask_to_prefix() helper
nm_utils_ip4_netmask_to_prefix() and nm_utils_ip4_prefix_to_netmask()
are public API in libnm.

We thus already have an internal implementation _nm_utils_ip4_prefix_to_netmask(),
for non-libnm users. Internally, we should never use the libnm variant.

For consistency and so that we have the helper available in
libnm-glib-aux, add _nm_utils_ip4_netmask_to_prefix().
2022-06-27 10:50:23 +02:00
Thomas Haller
8f80f3d446
glib-aux: make code in nm_uuid_is_valid_nm() clearer
Setting `NM_SET_OUT(out_normalized, !is_normalized)` is correct, but looks
odd and required a long code comment.

Try to write the same code differently, I think it is easier to
read and requires less comment to explain.
2022-06-24 21:15:11 +02:00
Thomas Haller
e3a0157141
glib-aux: pass string length to nm_uuid_generate_from_string() in nm_uuid_is_valid_nm()
No need to recompute the length. We have it already.
Also no need to NUL terminate the string.
2022-06-24 21:15:11 +02:00
Lubomir Rintel
e2fc81e211 glib-aux: add g_ptr_array_find() compat routine
I want it but GLib is no good. Sad.
2022-06-15 12:13:26 +02:00
Thomas Haller
eed9acc191
glib-aux: add assertions to nm_strvarray_*() helpers 2022-05-31 18:32:33 +02:00
Thomas Haller
08c010cb2b
glib-aux: add nm_g_array_index_p() helper and cleanup nm_g_array*() helpers 2022-05-31 18:32:33 +02:00
Thomas Haller
d81a9aec31
glib-aux/logging: add LOGD_DHCP_af() helper macro 2022-05-31 18:32:33 +02:00
Thomas Haller
835554a4db
glib-aux/tests: fix and extend static assertions for NMIPAddr alignment
On m68k, integers are 2-byte aligned. Hence the assertion was wrong.

What we really want to check, is that NMIPAddr has not a smaller
alignment than in_addr_t and similar.

While at it, also assert the alignment for NMEtherAddr.
2022-05-19 16:08:01 +02:00
Thomas Haller
705e776776
glib-aux: fix static assertion for alignment of NMIPAddr for m68k
On m68k, 32-bit integers are 2-byte aligned, causing the assertion to fail.
Relax the check, it's good enough still.
2022-05-19 13:15:04 +02:00
Thomas Haller
222f404928
glib-aux: add nm_g_bytes_ref() helper
g_bytes_ref() does not accept NULL. But doing so can be convenient,
add a helper for that.

Note that g_bytes_unref() does accept NULL, so there is no corresponding
helper.
2022-05-16 16:32:22 +02:00
Thomas Haller
7d1a9b898d
glib-aux/trivial: fix typo in code comment 2022-05-16 16:32:21 +02:00
Thomas Haller
a34bad8b52
platform: use flexible array members for "NMPlatformIPAddress.address_ptr"/"NMPlatformIPRoute.network_ptr"
Try to workaround a coverity warning:

 30. NetworkManager-1.39.3/src/core/vpn/nm-vpn-connection.c:2000:
     overrun-buffer-val: Overrunning array "address.ax.address_ptr" of 1
     bytes by passing it to a function which accesses it at byte offset 3.
2022-05-11 17:06:12 +02:00
Thomas Haller
5ff08fbbea
glib-aux: add nm_g_array_data() helper
It's annoying to do

  (arr ? arr->data : NULL)

Especially, because usually you'd need to cast the above
(which would have type (char *)).
2022-05-09 19:21:58 +02:00
Thomas Haller
0b7dc4137d
std-aux: include default std-aux headers by "nm-default-std.h" 2022-05-09 19:20:19 +02:00
Thomas Haller
80a19958dc
code-style: fix wrong indentation for code comments 2022-05-09 19:20:18 +02:00
Thomas Haller
560feecb4c
glib-aux: avoid #if in "nm-str-buf.h"
NM_MORE_ASSERT is a compile time constant. The compiler can optimize
it away just fine.
2022-05-09 19:18:30 +02:00
Thomas Haller
532f3e34a8
glib-aux: drop nm_str_buf_init() for NM_STR_BUF_INIT()
NM_STR_BUF_INIT() and nm_str_buf_init() were pretty much redundant. Drop one of
them.

Usually our pattern is that we don't have functions that return structs.
But NM_STR_BUF_INIT() returns a struct, because it's convenient to use
with

  nm_auto_str_buf NMStrBuf strbuf = NM_STR_BUF_INIT(...);

So use that variant instead.
2022-05-09 19:18:30 +02:00
Thomas Haller
13d25f9d0b
glib-aux: add support for starting with stack-allocated buffer in NMStrBuf
Allow to initialize NMStrBuf with an externally allocated array.
Usually a stack buffer. If the NMStrBuf grows beyond the size of
that initial buffer, then it would switch using malloc.

The idea is to support the common case where the result is small enough
to fit on the stack.

I always wanted to do such optimization because the main purpose of
NMStrBuf is to put it on the stack and ad-hoc construct a string.
I just figured, it would complicate the implementation and add
a runtime overhead. But turns out, it doesn't really.
The biggest question is how NMStrBuf should behave with a pre-allocated
buffer? Turns out, most choices can be made in a rather obvious way.
The only non-obvious thing is that nm_str_buf_finalize() would malloc()
a buffer, but that too seems consistent and what a user would probably
expect. As such, this doesn't seem to add unexpected semantics to the API.
2022-05-09 19:18:23 +02:00
Thomas Haller
7fcfc5ccb3
all: hardcode HOST_NAME_MAX to 64
On glibc, HOST_NAME_MAX is defined as 64. Also, Linux'
sethostname() enforces that limit (__NEW_UTS_LEN). Also,
`man gethostname` comments that HOST_NAME_MAX on Linux is
64.

However, when building against musl, HOST_NAME_MAX is defined as 255.
That seems wrong. We use this limit to validate the hostname, and that
should not depend on the libc or on the compilation.

Hardcode the value to 64.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1197
2022-04-26 17:54:56 +02:00
Thomas Haller
b3359126ba
glib-aux/tests: fix test for nm_hostname_is_valid() for different HOST_NAME_MAX
nm_hostname_is_valid() determines the valid length based on
HOST_NAME_MAX, which is defined differently for glibc and musl.

Fixes: 9ff1f66680 ('glib-aux: add nm_hostname_is_valid() helper from systemd')
2022-04-20 19:01:54 +02:00
Thomas Haller
9ff1f66680
glib-aux: add nm_hostname_is_valid() helper from systemd 2022-04-20 12:07:04 +02:00
Thomas Haller
b5f3d88e6f
glib-aux: add path-utils from systemd
We use these functions, currently from our systemd fork. One day we want
to stop importing systemd code, so we need them ourselves.

Copy them, and adjust for NM style.
2022-04-20 12:07:03 +02:00
Thomas Haller
04fc191922
glib-aux: refactor nm_unbase64mem_full()
Make the code more nm-like.
2022-04-20 12:05:17 +02:00
Thomas Haller
3571292d97
glib-aux: treat '=' as special character in nm_unbase64char()
This will be useful.
2022-04-20 12:05:17 +02:00
Thomas Haller
e3240781b1
glib-aux: use switch in nm_unbase64char()
This seams easier to read. And as we have a unit test that covers all
possible 256 input values, it's easy to refactor and ensure the code
still works.
2022-04-20 12:05:17 +02:00
Thomas Haller
63dcc5680b
glib-aux/tests: add unbase64mem test
This is copied and adjusted from "src/core/tests/test-systemd.c",
where it currently tests the systemd implementation.
2022-04-20 12:05:16 +02:00
Thomas Haller
0aa7d59557
glib-aux: add nm_unbase64{char,mem,mem_full}() helpers
These are taken from systemd code. We want to stop using systemd code,
so we can eventually drop it.
2022-04-20 12:05:16 +02:00
Thomas Haller
de926723f0
glib-aux: add nm_utils_hash_to_array() helper
We effectively already have this function, with the name
nm_utils_named_values_from_strdict(). Which is a decent name,
if you have a strdict. But it seems odd to use for other dictionaries.

Instead, add a variant with a different name. Naming is important,
and just to have the better name, the function is effectively duplicated.
2022-04-15 09:04:28 +02:00
Thomas Haller
78aad6cf51
glib-aux: add "name_ptr" union field to NMUtilsNamedValue
NMUtilsNamedValue is a key-value tuple, usually the key is a string
(hence the name "Named").

But this struct is also useful for keys that are not strings.
Add another "name_ptr" union field to access the key that way.

The alternative would be to add another struct, which serves
a very similar purpose though.
2022-04-14 21:31:36 +02:00
Thomas Haller
c44b49db6f
glib-aux: add nm_parse_env_file() helpers for parsing systemd's env-files
We write lease files for internal DHCP client ("systemd" and "nettools")
in a systemd-specific format. We want to drop systemd code, so we need
to have our own parsing code.

Granted, nettools only writes a single "ADDRESS=" line, so parsing that
would be easy. On the other hand, systemd's parser is not complicated
either (in particular, if we can steal their implementation). Also, it's
a commonly used format in systemd, so having the parser would allow us
to parse similar formats.

Also, we could opt to choose that format, where it makes sense.
2022-04-14 14:51:02 +02:00
Thomas Haller
7df494bc9a
glib-aux: add nm_ascii_is_{whitespace,newline}() helper 2022-04-14 14:51:02 +02:00
Thomas Haller
4b9ea28cd4
tests: improve nmtst_assert_strv() helper macro 2022-04-14 14:51:01 +02:00
Thomas Haller
24dab91a66
glib-aux/trivial: add code comment to nm_str_buf_get_str_unsafe() 2022-04-13 09:25:06 +02:00
Thomas Haller
2c5bacd416
std-aux: add NM_UTILS_GET_NEXT_REALLOC_SIZE_488 define 2022-04-13 09:23:28 +02:00
Thomas Haller
9ce4a16523
glib-aux: add assertions for valid prefix length 2022-04-08 15:59:50 +02:00
Thomas Haller
0cf9db42d4
glib-aux: use uint32 type for prefix length parameter
Of course, the prefix length cannot be larger than 32 or 128.
But as C does implicit conversions, a buggy prefix length can
lead to a (wrongly) valid prefix length.

Make the type uint32, to prevent that (at least for common cases,
unless you pass a huge 64 bit integer).
2022-04-08 15:59:50 +02:00
Thomas Haller
b5a06dedd4
glib-aux: move nm_utils_ip4_address_clear_host_address() to header so it can be inlined 2022-04-08 15:59:50 +02:00