1
0
mirror of https://github.com/systemd/systemd synced 2026-03-26 00:34:53 +01:00

Compare commits

..

No commits in common. "218262c0b17729b135a9922e0e28487abe375e17" and "ceea13e20fd6258dca06fc0c9c227d30f568bec2" have entirely different histories.

32 changed files with 438 additions and 546 deletions

View File

@ -3,13 +3,13 @@
#include <sd-hwdb.h> #include <sd-hwdb.h>
int print_usb_properties(uint16_t vid, uint16_t pid) { int print_usb_properties(uint16_t vid, uint16_t pid) {
char match[STRLEN("usb:vp") + DECIMAL_STR_MAX(uint16_t) * 2]; char match[15];
sd_hwdb *hwdb; sd_hwdb *hwdb;
const char *key, *value; const char *key, *value;
int r; int r;
/* Match this USB vendor and product ID combination */ /* Match this USB vendor and product ID combination */
xsprintf(match, "usb:v%04Xp%04X", vid, pid); snprintf(match, sizeof match, "usb:v%04Xp%04X", vid, pid);
r = sd_hwdb_new(&hwdb); r = sd_hwdb_new(&hwdb);
if (r < 0) if (r < 0)

View File

@ -662,56 +662,49 @@
<varlistentry> <varlistentry>
<term><varname>ReceiveChecksumOffload=</varname></term> <term><varname>ReceiveChecksumOffload=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. If set to true, hardware offload for checksumming of ingress <para>Takes a boolean. If set to true, the hardware offload for checksumming of ingress
network packets is enabled. When unset, the kernel's default will be used.</para> network packets is enabled. When unset, the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><varname>TransmitChecksumOffload=</varname></term> <term><varname>TransmitChecksumOffload=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. If set to true, hardware offload for checksumming of egress <para>Takes a boolean. If set to true, the hardware offload for checksumming of egress
network packets is enabled. When unset, the kernel's default will be used.</para> network packets is enabled. When unset, the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><varname>TCPSegmentationOffload=</varname></term> <term><varname>TCPSegmentationOffload=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. If set to true, TCP Segmentation Offload (TSO) is enabled. <para>Takes a boolean. If set to true, the TCP Segmentation Offload (TSO) is enabled.
When unset, the kernel's default will be used.</para> When unset, the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><varname>TCP6SegmentationOffload=</varname></term> <term><varname>TCP6SegmentationOffload=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. If set to true, TCP6 Segmentation Offload (tx-tcp6-segmentation) is enabled. <para>Takes a boolean. If set to true, the TCP6 Segmentation Offload (tx-tcp6-segmentation) is enabled.
When unset, the kernel's default will be used.</para> When unset, the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><varname>GenericSegmentationOffload=</varname></term> <term><varname>GenericSegmentationOffload=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. If set to true, Generic Segmentation Offload (GSO) is enabled. <para>Takes a boolean. If set to true, the Generic Segmentation Offload (GSO) is enabled.
When unset, the kernel's default will be used.</para> When unset, the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><varname>GenericReceiveOffload=</varname></term> <term><varname>GenericReceiveOffload=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. If set to true, Generic Receive Offload (GRO) is enabled. <para>Takes a boolean. If set to true, the Generic Receive Offload (GRO) is enabled.
When unset, the kernel's default will be used.</para> When unset, the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><varname>GenericReceiveOffloadHardware=</varname></term>
<listitem>
<para>Takes a boolean. If set to true, hardware accelerated Generic Receive Offload (GRO) is
enabled. When unset, the kernel's default will be used.</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><varname>LargeReceiveOffload=</varname></term> <term><varname>LargeReceiveOffload=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. If set to true, Large Receive Offload (LRO) is enabled. <para>Takes a boolean. If set to true, the Large Receive Offload (LRO) is enabled.
When unset, the kernel's default will be used.</para> When unset, the kernel's default will be used.</para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -743,7 +736,7 @@
<varlistentry> <varlistentry>
<term><varname>RxFlowControl=</varname></term> <term><varname>RxFlowControl=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. When set, enables receive flow control, also known as the ethernet <para>Takes a boolean. When set, enables the receive flow control, also known as the ethernet
receive PAUSE message (generate and send ethernet PAUSE frames). When unset, the kernel's receive PAUSE message (generate and send ethernet PAUSE frames). When unset, the kernel's
default will be used.</para> default will be used.</para>
</listitem> </listitem>
@ -751,7 +744,7 @@
<varlistentry> <varlistentry>
<term><varname>TxFlowControl=</varname></term> <term><varname>TxFlowControl=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. When set, enables transmit flow control, also known as the ethernet <para>Takes a boolean. When set, enables the transmit flow control, also known as the ethernet
transmit PAUSE message (respond to received ethernet PAUSE frames). When unset, the kernel's transmit PAUSE message (respond to received ethernet PAUSE frames). When unset, the kernel's
default will be used.</para> default will be used.</para>
</listitem> </listitem>
@ -759,7 +752,7 @@
<varlistentry> <varlistentry>
<term><varname>AutoNegotiationFlowControl=</varname></term> <term><varname>AutoNegotiationFlowControl=</varname></term>
<listitem> <listitem>
<para>Takes a boolean. When set, auto negotiation enables the interface to exchange state <para>Takes a boolean. When set, the auto negotiation enables the interface to exchange state
advertisements with the connected peer so that the two devices can agree on the ethernet advertisements with the connected peer so that the two devices can agree on the ethernet
PAUSE configuration. When unset, the kernel's default will be used.</para> PAUSE configuration. When unset, the kernel's default will be used.</para>
</listitem> </listitem>

View File

@ -15,9 +15,9 @@ char *format_ifname_full(int ifindex, char buf[static IF_NAMESIZE + 1], FormatIf
return NULL; return NULL;
if (FLAGS_SET(flag, FORMAT_IFNAME_IFINDEX_WITH_PERCENT)) if (FLAGS_SET(flag, FORMAT_IFNAME_IFINDEX_WITH_PERCENT))
assert(snprintf_ok(buf, IF_NAMESIZE + 1, "%%%d", ifindex)); snprintf(buf, IF_NAMESIZE + 1, "%%%d", ifindex);
else else
assert(snprintf_ok(buf, IF_NAMESIZE + 1, "%d", ifindex)); snprintf(buf, IF_NAMESIZE + 1, "%d", ifindex);
return buf; return buf;
} }
@ -56,23 +56,23 @@ char *format_bytes_full(char *buf, size_t l, uint64_t t, FormatBytesFlag flag) {
for (size_t i = 0; i < n; i++) for (size_t i = 0; i < n; i++)
if (t >= table[i].factor) { if (t >= table[i].factor) {
if (flag & FORMAT_BYTES_BELOW_POINT) { if (flag & FORMAT_BYTES_BELOW_POINT) {
(void) snprintf(buf, l, snprintf(buf, l,
"%" PRIu64 ".%" PRIu64 "%s", "%" PRIu64 ".%" PRIu64 "%s",
t / table[i].factor, t / table[i].factor,
i != n - 1 ? i != n - 1 ?
(t / table[i + 1].factor * UINT64_C(10) / table[n - 1].factor) % UINT64_C(10): (t / table[i + 1].factor * UINT64_C(10) / table[n - 1].factor) % UINT64_C(10):
(t * UINT64_C(10) / table[i].factor) % UINT64_C(10), (t * UINT64_C(10) / table[i].factor) % UINT64_C(10),
table[i].suffix); table[i].suffix);
} else } else
(void) snprintf(buf, l, snprintf(buf, l,
"%" PRIu64 "%s", "%" PRIu64 "%s",
t / table[i].factor, t / table[i].factor,
table[i].suffix); table[i].suffix);
goto finish; goto finish;
} }
(void) snprintf(buf, l, "%" PRIu64 "%s", t, flag & FORMAT_BYTES_TRAILING_B ? "B" : ""); snprintf(buf, l, "%" PRIu64 "%s", t, flag & FORMAT_BYTES_TRAILING_B ? "B" : "");
finish: finish:
buf[l-1] = 0; buf[l-1] = 0;

View File

@ -146,20 +146,6 @@
#define ALIGN8_PTR(p) ((void*) ALIGN8((unsigned long) (p))) #define ALIGN8_PTR(p) ((void*) ALIGN8((unsigned long) (p)))
static inline size_t ALIGN_TO(size_t l, size_t ali) { static inline size_t ALIGN_TO(size_t l, size_t ali) {
/* Check that alignment is exponent of 2 */
#if SIZE_MAX == UINT_MAX
assert(__builtin_popcount(ali) == 1);
#elif SIZE_MAX == ULONG_MAX
assert(__builtin_popcountl(ali) == 1);
#elif SIZE_MAX == ULONGLONG_MAX
assert(__builtin_popcountll(ali) == 1);
#else
#error "Unexpected size_t"
#endif
if (l > SIZE_MAX - (ali - 1))
return SIZE_MAX; /* indicate overflow */
return ((l + ali - 1) & ~(ali - 1)); return ((l + ali - 1) & ~(ali - 1));
} }

View File

@ -433,62 +433,62 @@ char *format_timestamp_relative(char *buf, size_t l, usec_t t) {
usec_t years = d / USEC_PER_YEAR; usec_t years = d / USEC_PER_YEAR;
usec_t months = (d % USEC_PER_YEAR) / USEC_PER_MONTH; usec_t months = (d % USEC_PER_YEAR) / USEC_PER_MONTH;
(void) snprintf(buf, l, USEC_FMT " %s " USEC_FMT " %s %s", snprintf(buf, l, USEC_FMT " %s " USEC_FMT " %s %s",
years, years,
years == 1 ? "year" : "years", years == 1 ? "year" : "years",
months, months,
months == 1 ? "month" : "months", months == 1 ? "month" : "months",
s); s);
} else if (d >= USEC_PER_MONTH) { } else if (d >= USEC_PER_MONTH) {
usec_t months = d / USEC_PER_MONTH; usec_t months = d / USEC_PER_MONTH;
usec_t days = (d % USEC_PER_MONTH) / USEC_PER_DAY; usec_t days = (d % USEC_PER_MONTH) / USEC_PER_DAY;
(void) snprintf(buf, l, USEC_FMT " %s " USEC_FMT " %s %s", snprintf(buf, l, USEC_FMT " %s " USEC_FMT " %s %s",
months, months,
months == 1 ? "month" : "months", months == 1 ? "month" : "months",
days, days,
days == 1 ? "day" : "days", days == 1 ? "day" : "days",
s); s);
} else if (d >= USEC_PER_WEEK) { } else if (d >= USEC_PER_WEEK) {
usec_t weeks = d / USEC_PER_WEEK; usec_t weeks = d / USEC_PER_WEEK;
usec_t days = (d % USEC_PER_WEEK) / USEC_PER_DAY; usec_t days = (d % USEC_PER_WEEK) / USEC_PER_DAY;
(void) snprintf(buf, l, USEC_FMT " %s " USEC_FMT " %s %s", snprintf(buf, l, USEC_FMT " %s " USEC_FMT " %s %s",
weeks, weeks,
weeks == 1 ? "week" : "weeks", weeks == 1 ? "week" : "weeks",
days, days,
days == 1 ? "day" : "days", days == 1 ? "day" : "days",
s); s);
} else if (d >= 2*USEC_PER_DAY) } else if (d >= 2*USEC_PER_DAY)
(void) snprintf(buf, l, USEC_FMT " days %s", d / USEC_PER_DAY, s); snprintf(buf, l, USEC_FMT " days %s", d / USEC_PER_DAY, s);
else if (d >= 25*USEC_PER_HOUR) else if (d >= 25*USEC_PER_HOUR)
(void) snprintf(buf, l, "1 day " USEC_FMT "h %s", snprintf(buf, l, "1 day " USEC_FMT "h %s",
(d - USEC_PER_DAY) / USEC_PER_HOUR, s); (d - USEC_PER_DAY) / USEC_PER_HOUR, s);
else if (d >= 6*USEC_PER_HOUR) else if (d >= 6*USEC_PER_HOUR)
(void) snprintf(buf, l, USEC_FMT "h %s", snprintf(buf, l, USEC_FMT "h %s",
d / USEC_PER_HOUR, s); d / USEC_PER_HOUR, s);
else if (d >= USEC_PER_HOUR) else if (d >= USEC_PER_HOUR)
(void) snprintf(buf, l, USEC_FMT "h " USEC_FMT "min %s", snprintf(buf, l, USEC_FMT "h " USEC_FMT "min %s",
d / USEC_PER_HOUR, d / USEC_PER_HOUR,
(d % USEC_PER_HOUR) / USEC_PER_MINUTE, s); (d % USEC_PER_HOUR) / USEC_PER_MINUTE, s);
else if (d >= 5*USEC_PER_MINUTE) else if (d >= 5*USEC_PER_MINUTE)
(void) snprintf(buf, l, USEC_FMT "min %s", snprintf(buf, l, USEC_FMT "min %s",
d / USEC_PER_MINUTE, s); d / USEC_PER_MINUTE, s);
else if (d >= USEC_PER_MINUTE) else if (d >= USEC_PER_MINUTE)
(void) snprintf(buf, l, USEC_FMT "min " USEC_FMT "s %s", snprintf(buf, l, USEC_FMT "min " USEC_FMT "s %s",
d / USEC_PER_MINUTE, d / USEC_PER_MINUTE,
(d % USEC_PER_MINUTE) / USEC_PER_SEC, s); (d % USEC_PER_MINUTE) / USEC_PER_SEC, s);
else if (d >= USEC_PER_SEC) else if (d >= USEC_PER_SEC)
(void) snprintf(buf, l, USEC_FMT "s %s", snprintf(buf, l, USEC_FMT "s %s",
d / USEC_PER_SEC, s); d / USEC_PER_SEC, s);
else if (d >= USEC_PER_MSEC) else if (d >= USEC_PER_MSEC)
(void) snprintf(buf, l, USEC_FMT "ms %s", snprintf(buf, l, USEC_FMT "ms %s",
d / USEC_PER_MSEC, s); d / USEC_PER_MSEC, s);
else if (d > 0) else if (d > 0)
(void) snprintf(buf, l, USEC_FMT"us %s", snprintf(buf, l, USEC_FMT"us %s",
d, s); d, s);
else else
(void) snprintf(buf, l, "now"); snprintf(buf, l, "now");
buf[l-1] = 0; buf[l-1] = 0;
return buf; return buf;

View File

@ -95,7 +95,7 @@ static Group *group_free(Group *g) {
static const char *maybe_format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy) { static const char *maybe_format_timespan(char *buf, size_t l, usec_t t, usec_t accuracy) {
if (arg_raw) { if (arg_raw) {
(void) snprintf(buf, l, USEC_FMT, t); snprintf(buf, l, USEC_FMT, t);
return buf; return buf;
} }
return format_timespan(buf, l, t, accuracy); return format_timespan(buf, l, t, accuracy);
@ -109,7 +109,7 @@ static const char *maybe_format_bytes(char *buf, size_t l, bool is_valid, uint64
if (!is_valid) if (!is_valid)
return "-"; return "-";
if (arg_raw) { if (arg_raw) {
(void) snprintf(buf, l, "%" PRIu64, t); snprintf(buf, l, "%" PRIu64, t);
return buf; return buf;
} }
return format_bytes(buf, l, t); return format_bytes(buf, l, t);

View File

@ -375,11 +375,11 @@ static char *format_cgroup_memory_limit_comparison(char *buf, size_t l, Unit *u,
} }
if (r < 0) { if (r < 0) {
(void) snprintf(buf, l, " (error getting kernel value: %s)", strerror_safe(r)); snprintf(buf, l, " (error getting kernel value: %s)", strerror_safe(r));
return buf; return buf;
} }
(void) snprintf(buf, l, " (different value in kernel: %" PRIu64 ")", kval); snprintf(buf, l, " (different value in kernel: %" PRIu64 ")", kval);
return buf; return buf;
} }

View File

@ -57,11 +57,11 @@ static int audit_callback(
if (sd_bus_creds_get_egid(audit->creds, &gid) >= 0) if (sd_bus_creds_get_egid(audit->creds, &gid) >= 0)
xsprintf(gid_buf, GID_FMT, gid); xsprintf(gid_buf, GID_FMT, gid);
(void) snprintf(msgbuf, msgbufsize, snprintf(msgbuf, msgbufsize,
"auid=%s uid=%s gid=%s%s%s%s%s%s%s", "auid=%s uid=%s gid=%s%s%s%s%s%s%s",
login_uid_buf, uid_buf, gid_buf, login_uid_buf, uid_buf, gid_buf,
audit->path ? " path=\"" : "", strempty(audit->path), audit->path ? "\"" : "", audit->path ? " path=\"" : "", strempty(audit->path), audit->path ? "\"" : "",
audit->cmdline ? " cmdline=\"" : "", strempty(audit->cmdline), audit->cmdline ? "\"" : ""); audit->cmdline ? " cmdline=\"" : "", strempty(audit->cmdline), audit->cmdline ? "\"" : "");
return 0; return 0;
} }

View File

@ -256,9 +256,6 @@ int curl_glue_make(CURL **ret, const char *url, void *userdata) {
if (curl_easy_setopt(c, CURLOPT_LOW_SPEED_LIMIT, 30L) != CURLE_OK) if (curl_easy_setopt(c, CURLOPT_LOW_SPEED_LIMIT, 30L) != CURLE_OK)
return -EIO; return -EIO;
if (curl_easy_setopt(c, CURLOPT_PROTOCOLS, CURLPROTO_HTTP|CURLPROTO_HTTPS|CURLPROTO_FILE) != CURLE_OK)
return -EIO;
*ret = TAKE_PTR(c); *ret = TAKE_PTR(c);
return 0; return 0;
} }

View File

@ -185,11 +185,10 @@ static int import_fs(int argc, char *argv[], void *userdata) {
if (r < 0) if (r < 0)
return log_oom(); return log_oom();
(void) mkdir_parents_label(temp_path, 0700);
dest = temp_path; dest = temp_path;
} }
(void) mkdir_parents_label(dest, 0700);
progress.limit = (RateLimit) { 200*USEC_PER_MSEC, 1 }; progress.limit = (RateLimit) { 200*USEC_PER_MSEC, 1 };
{ {

View File

@ -9,7 +9,6 @@
#include "btrfs-util.h" #include "btrfs-util.h"
#include "copy.h" #include "copy.h"
#include "fd-util.h" #include "fd-util.h"
#include "format-util.h"
#include "fs-util.h" #include "fs-util.h"
#include "hostname-util.h" #include "hostname-util.h"
#include "import-common.h" #include "import-common.h"
@ -249,8 +248,6 @@ static int raw_import_finish(RawImport *i) {
i->temp_path = mfree(i->temp_path); i->temp_path = mfree(i->temp_path);
log_info("Wrote %s.", FORMAT_BYTES(i->written_uncompressed));
return 0; return 0;
} }
@ -322,9 +319,6 @@ static int raw_import_try_reflink(RawImport *i) {
if (i->compress.type != IMPORT_COMPRESS_UNCOMPRESSED) if (i->compress.type != IMPORT_COMPRESS_UNCOMPRESSED)
return 0; return 0;
if (i->offset != UINT64_MAX || i->size_max != UINT64_MAX)
return 0;
if (!S_ISREG(i->input_stat.st_mode) || !S_ISREG(i->output_stat.st_mode)) if (!S_ISREG(i->input_stat.st_mode) || !S_ISREG(i->output_stat.st_mode))
return 0; return 0;
@ -371,7 +365,7 @@ static int raw_import_write(const void *p, size_t sz, void *userdata) {
} }
/* Generate sparse file if we created/truncated the file */ /* Generate sparse file if we created/truncated the file */
if (S_ISREG(i->output_stat.st_mode) && i->offset == UINT64_MAX) { if (S_ISREG(i->output_stat.st_mode)) {
ssize_t n; ssize_t n;
n = sparse_write(i->output_fd, p, sz, 64); n = sparse_write(i->output_fd, p, sz, 64);

View File

@ -928,7 +928,7 @@ static int method_pull_tar_or_raw(sd_bus_message *msg, void *userdata, sd_bus_er
if (r < 0) if (r < 0)
return r; return r;
if (!http_url_is_valid(remote) && !file_url_is_valid(remote)) if (!http_url_is_valid(remote))
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
"URL %s is invalid", remote); "URL %s is invalid", remote);

View File

@ -117,7 +117,7 @@ static int pull_job_restart(PullJob *j, const char *new_url) {
void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) { void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) {
PullJob *j = NULL; PullJob *j = NULL;
CURLcode code; CURLcode code;
long protocol; long status;
int r; int r;
if (curl_easy_getinfo(curl, CURLINFO_PRIVATE, (char **)&j) != CURLE_OK) if (curl_easy_getinfo(curl, CURLINFO_PRIVATE, (char **)&j) != CURLE_OK)
@ -131,62 +131,50 @@ void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) {
goto finish; goto finish;
} }
code = curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol); code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
if (code != CURLE_OK) { if (code != CURLE_OK) {
r = log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to retrieve response code: %s", curl_easy_strerror(code)); r = log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to retrieve response code: %s", curl_easy_strerror(code));
goto finish; goto finish;
} } else if (status == 304) {
log_info("Image already downloaded. Skipping download.");
j->etag_exists = true;
r = 0;
goto finish;
} else if (status >= 300) {
if (IN_SET(protocol, CURLPROTO_HTTP, CURLPROTO_HTTPS)) { if (status == 404 && j->on_not_found) {
long status; _cleanup_free_ char *new_url = NULL;
code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status); /* This resource wasn't found, but the implementor wants to maybe let us know a new URL, query for it. */
if (code != CURLE_OK) { r = j->on_not_found(j, &new_url);
r = log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to retrieve response code: %s", curl_easy_strerror(code)); if (r < 0)
goto finish; goto finish;
}
if (status == 304) { if (r > 0) { /* A new url to use */
log_info("Image already downloaded. Skipping download."); assert(new_url);
j->etag_exists = true;
r = 0;
goto finish;
} else if (status >= 300) {
if (status == 404 && j->on_not_found) { r = pull_job_restart(j, new_url);
_cleanup_free_ char *new_url = NULL;
/* This resource wasn't found, but the implementor wants to maybe let us know a new URL, query for it. */
r = j->on_not_found(j, &new_url);
if (r < 0) if (r < 0)
goto finish; goto finish;
if (r > 0) { /* A new url to use */ code = curl_easy_getinfo(j->curl, CURLINFO_RESPONSE_CODE, &status);
assert(new_url); if (code != CURLE_OK) {
r = log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to retrieve response code: %s", curl_easy_strerror(code));
r = pull_job_restart(j, new_url); goto finish;
if (r < 0)
goto finish;
code = curl_easy_getinfo(j->curl, CURLINFO_RESPONSE_CODE, &status);
if (code != CURLE_OK) {
r = log_error_errno(SYNTHETIC_ERRNO(EIO), "Failed to retrieve response code: %s", curl_easy_strerror(code));
goto finish;
}
if (status == 0)
return;
} }
}
r = log_error_errno( if (status == 0)
status == 404 ? SYNTHETIC_ERRNO(ENOMEDIUM) : SYNTHETIC_ERRNO(EIO), /* Make the most common error recognizable */ return;
"HTTP request to %s failed with code %li.", j->url, status); }
goto finish;
} else if (status < 200) {
r = log_error_errno(SYNTHETIC_ERRNO(EIO), "HTTP request to %s finished with unexpected code %li.", j->url, status);
goto finish;
} }
r = log_error_errno(
status == 404 ? SYNTHETIC_ERRNO(ENOMEDIUM) : SYNTHETIC_ERRNO(EIO), /* Make the most common error recognizable */
"HTTP request to %s failed with code %li.", j->url, status);
goto finish;
} else if (status < 200) {
r = log_error_errno(SYNTHETIC_ERRNO(EIO), "HTTP request to %s finished with unexpected code %li.", j->url, status);
goto finish;
} }
if (j->state != PULL_JOB_RUNNING) { if (j->state != PULL_JOB_RUNNING) {
@ -272,8 +260,6 @@ void pull_job_curl_on_finished(CurlGlue *g, CURL *curl, CURLcode result) {
} }
} }
log_info("Acquired %s.", FORMAT_BYTES(j->written_uncompressed));
r = 0; r = 0;
finish: finish:
@ -306,7 +292,7 @@ static int pull_job_write_uncompressed(const void *p, size_t sz, void *userdata)
if (j->disk_fd >= 0) { if (j->disk_fd >= 0) {
if (S_ISREG(j->disk_stat.st_mode) && j->offset == UINT64_MAX) { if (S_ISREG(j->disk_stat.st_mode)) {
ssize_t n; ssize_t n;
n = sparse_write(j->disk_fd, p, sz, 64); n = sparse_write(j->disk_fd, p, sz, 64);

View File

@ -835,7 +835,7 @@ int raw_pull_start(
assert(!(flags & (PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY)) || !(flags & PULL_DIRECT)); assert(!(flags & (PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY)) || !(flags & PULL_DIRECT));
assert(!(flags & (PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY)) || !checksum); assert(!(flags & (PULL_SETTINGS|PULL_ROOTHASH|PULL_ROOTHASH_SIGNATURE|PULL_VERITY)) || !checksum);
if (!http_url_is_valid(url) && !file_url_is_valid(url)) if (!http_url_is_valid(url))
return -EINVAL; return -EINVAL;
if (local && !pull_validate_local(local, flags)) if (local && !pull_validate_local(local, flags))

View File

@ -597,7 +597,7 @@ int tar_pull_start(
assert(!(flags & PULL_SETTINGS) || !(flags & PULL_DIRECT)); assert(!(flags & PULL_SETTINGS) || !(flags & PULL_DIRECT));
assert(!(flags & PULL_SETTINGS) || !checksum); assert(!(flags & PULL_SETTINGS) || !checksum);
if (!http_url_is_valid(url) && !file_url_is_valid(url)) if (!http_url_is_valid(url))
return -EINVAL; return -EINVAL;
if (local && !pull_validate_local(local, flags)) if (local && !pull_validate_local(local, flags))

View File

@ -110,7 +110,7 @@ static int pull_tar(int argc, char *argv[], void *userdata) {
int r; int r;
url = argv[1]; url = argv[1];
if (!http_url_is_valid(url) && !file_url_is_valid(url)) if (!http_url_is_valid(url))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "URL '%s' is not valid.", url); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "URL '%s' is not valid.", url);
if (argc >= 3) if (argc >= 3)
@ -183,7 +183,7 @@ static int pull_raw(int argc, char *argv[], void *userdata) {
int r; int r;
url = argv[1]; url = argv[1];
if (!http_url_is_valid(url) && !file_url_is_valid(url)) if (!http_url_is_valid(url))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "URL '%s' is not valid.", url); return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "URL '%s' is not valid.", url);
if (argc >= 3) if (argc >= 3)

View File

@ -997,16 +997,20 @@ const char* bus_match_node_type_to_string(enum bus_match_node_type t, char buf[]
return "path_namespace"; return "path_namespace";
case BUS_MATCH_ARG ... BUS_MATCH_ARG_LAST: case BUS_MATCH_ARG ... BUS_MATCH_ARG_LAST:
return snprintf_ok(buf, l, "arg%i", t - BUS_MATCH_ARG); snprintf(buf, l, "arg%i", t - BUS_MATCH_ARG);
return buf;
case BUS_MATCH_ARG_PATH ... BUS_MATCH_ARG_PATH_LAST: case BUS_MATCH_ARG_PATH ... BUS_MATCH_ARG_PATH_LAST:
return snprintf_ok(buf, l, "arg%ipath", t - BUS_MATCH_ARG_PATH); snprintf(buf, l, "arg%ipath", t - BUS_MATCH_ARG_PATH);
return buf;
case BUS_MATCH_ARG_NAMESPACE ... BUS_MATCH_ARG_NAMESPACE_LAST: case BUS_MATCH_ARG_NAMESPACE ... BUS_MATCH_ARG_NAMESPACE_LAST:
return snprintf_ok(buf, l, "arg%inamespace", t - BUS_MATCH_ARG_NAMESPACE); snprintf(buf, l, "arg%inamespace", t - BUS_MATCH_ARG_NAMESPACE);
return buf;
case BUS_MATCH_ARG_HAS ... BUS_MATCH_ARG_HAS_LAST: case BUS_MATCH_ARG_HAS ... BUS_MATCH_ARG_HAS_LAST:
return snprintf_ok(buf, l, "arg%ihas", t - BUS_MATCH_ARG_HAS); snprintf(buf, l, "arg%ihas", t - BUS_MATCH_ARG_HAS);
return buf;
default: default:
return NULL; return NULL;

View File

@ -2125,7 +2125,7 @@ static int pull_tar(int argc, char *argv[], void *userdata) {
assert(bus); assert(bus);
remote = argv[1]; remote = argv[1];
if (!http_url_is_valid(remote) && !file_url_is_valid(remote)) if (!http_url_is_valid(remote))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"URL '%s' is not valid.", remote); "URL '%s' is not valid.", remote);
@ -2181,7 +2181,7 @@ static int pull_raw(int argc, char *argv[], void *userdata) {
assert(bus); assert(bus);
remote = argv[1]; remote = argv[1];
if (!http_url_is_valid(remote) && !file_url_is_valid(remote)) if (!http_url_is_valid(remote))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"URL '%s' is not valid.", remote); "URL '%s' is not valid.", remote);

View File

@ -323,10 +323,10 @@ char* dns_resource_key_to_string(const DnsResourceKey *key, char *buf, size_t bu
c = dns_class_to_string(key->class); c = dns_class_to_string(key->class);
t = dns_type_to_string(key->type); t = dns_type_to_string(key->type);
(void) snprintf(buf, buf_size, "%s %s%s%.0u %s%s%.0u", snprintf(buf, buf_size, "%s %s%s%.0u %s%s%.0u",
dns_resource_key_name(key), dns_resource_key_name(key),
strempty(c), c ? "" : "CLASS", c ? 0 : key->class, strempty(c), c ? "" : "CLASS", c ? 0 : key->class,
strempty(t), t ? "" : "TYPE", t ? 0 : key->type); strempty(t), t ? "" : "TYPE", t ? 0 : key->type);
return ans; return ans;
} }

View File

@ -70,14 +70,13 @@ DEFINE_STRING_TABLE_LOOKUP(port, NetDevPort);
DEFINE_CONFIG_PARSE_ENUM(config_parse_port, port, NetDevPort, "Failed to parse Port setting"); DEFINE_CONFIG_PARSE_ENUM(config_parse_port, port, NetDevPort, "Failed to parse Port setting");
static const char* const netdev_feature_table[_NET_DEV_FEAT_MAX] = { static const char* const netdev_feature_table[_NET_DEV_FEAT_MAX] = {
[NET_DEV_FEAT_RX] = "rx-checksum", [NET_DEV_FEAT_RX] = "rx-checksum",
[NET_DEV_FEAT_TX] = "tx-checksum-", /* The suffix "-" means any feature beginning with "tx-checksum-" */ [NET_DEV_FEAT_TX] = "tx-checksum-", /* The suffix "-" means any feature beginning with "tx-checksum-" */
[NET_DEV_FEAT_GSO] = "tx-generic-segmentation", [NET_DEV_FEAT_GSO] = "tx-generic-segmentation",
[NET_DEV_FEAT_GRO] = "rx-gro", [NET_DEV_FEAT_GRO] = "rx-gro",
[NET_DEV_FEAT_GRO_HW] = "rx-gro-hw", [NET_DEV_FEAT_LRO] = "rx-lro",
[NET_DEV_FEAT_LRO] = "rx-lro", [NET_DEV_FEAT_TSO] = "tx-tcp-segmentation",
[NET_DEV_FEAT_TSO] = "tx-tcp-segmentation", [NET_DEV_FEAT_TSO6] = "tx-tcp6-segmentation",
[NET_DEV_FEAT_TSO6] = "tx-tcp6-segmentation",
}; };
static const char* const ethtool_link_mode_bit_table[] = { static const char* const ethtool_link_mode_bit_table[] = {

View File

@ -23,7 +23,6 @@ typedef enum NetDevFeature {
NET_DEV_FEAT_TX, NET_DEV_FEAT_TX,
NET_DEV_FEAT_GSO, NET_DEV_FEAT_GSO,
NET_DEV_FEAT_GRO, NET_DEV_FEAT_GRO,
NET_DEV_FEAT_GRO_HW,
NET_DEV_FEAT_LRO, NET_DEV_FEAT_LRO,
NET_DEV_FEAT_TSO, NET_DEV_FEAT_TSO,
NET_DEV_FEAT_TSO6, NET_DEV_FEAT_TSO6,

View File

@ -36,29 +36,16 @@ bool http_url_is_valid(const char *url) {
return ascii_is_valid(p); return ascii_is_valid(p);
} }
bool file_url_is_valid(const char *url) {
const char *p;
if (isempty(url))
return false;
p = startswith(url, "file:/");
if (isempty(p))
return false;
return ascii_is_valid(p);
}
bool documentation_url_is_valid(const char *url) { bool documentation_url_is_valid(const char *url) {
const char *p; const char *p;
if (isempty(url)) if (isempty(url))
return false; return false;
if (http_url_is_valid(url) || file_url_is_valid(url)) if (http_url_is_valid(url))
return true; return true;
p = STARTSWITH_SET(url, "info:", "man:"); p = STARTSWITH_SET(url, "file:/", "info:", "man:");
if (isempty(p)) if (isempty(p))
return false; return false;

View File

@ -6,7 +6,6 @@
#include "macro.h" #include "macro.h"
bool http_url_is_valid(const char *url) _pure_; bool http_url_is_valid(const char *url) _pure_;
bool file_url_is_valid(const char *url) _pure_;
bool documentation_url_is_valid(const char *url) _pure_; bool documentation_url_is_valid(const char *url) _pure_;

View File

@ -188,8 +188,6 @@ tests += [
[['src/test/test-util.c']], [['src/test/test-util.c']],
[['src/test/test-macro.c']],
[['src/test/test-json.c']], [['src/test/test-json.c']],
[['src/test/test-modhex.c']], [['src/test/test-modhex.c']],

View File

@ -20,7 +20,7 @@ const char* nss_status_to_string(enum nss_status status, char *buf, size_t buf_l
case NSS_STATUS_RETURN: case NSS_STATUS_RETURN:
return "NSS_STATUS_RETURN"; return "NSS_STATUS_RETURN";
default: default:
(void) snprintf(buf, buf_len, "%i", status); snprintf(buf, buf_len, "%i", status);
return buf; return buf;
} }
}; };

View File

@ -1,343 +0,0 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <stddef.h>
#include "log.h"
#include "macro.h"
#include "tests.h"
static void test_align_power2(void) {
unsigned long i, p2;
log_info("/* %s */", __func__);
assert_se(ALIGN_POWER2(0) == 0);
assert_se(ALIGN_POWER2(1) == 1);
assert_se(ALIGN_POWER2(2) == 2);
assert_se(ALIGN_POWER2(3) == 4);
assert_se(ALIGN_POWER2(4) == 4);
assert_se(ALIGN_POWER2(5) == 8);
assert_se(ALIGN_POWER2(6) == 8);
assert_se(ALIGN_POWER2(7) == 8);
assert_se(ALIGN_POWER2(9) == 16);
assert_se(ALIGN_POWER2(10) == 16);
assert_se(ALIGN_POWER2(11) == 16);
assert_se(ALIGN_POWER2(12) == 16);
assert_se(ALIGN_POWER2(13) == 16);
assert_se(ALIGN_POWER2(14) == 16);
assert_se(ALIGN_POWER2(15) == 16);
assert_se(ALIGN_POWER2(16) == 16);
assert_se(ALIGN_POWER2(17) == 32);
assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
for (i = 1; i < 131071; ++i) {
for (p2 = 1; p2 < i; p2 <<= 1)
/* empty */ ;
assert_se(ALIGN_POWER2(i) == p2);
}
for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
for (p2 = 1; p2 && p2 < i; p2 <<= 1)
/* empty */ ;
assert_se(ALIGN_POWER2(i) == p2);
}
}
static void test_max(void) {
static const struct {
int a;
int b[CONST_MAX(10, 100)];
} val1 = {
.a = CONST_MAX(10, 100),
};
int d = 0;
unsigned long x = 12345;
unsigned long y = 54321;
const char str[] = "a_string_constant";
const unsigned long long arr[] = {9999ULL, 10ULL, 0ULL, 3000ULL, 2000ULL, 1000ULL, 100ULL, 9999999ULL};
void *p = (void *)str;
void *q = (void *)&str[16];
log_info("/* %s */", __func__);
assert_cc(sizeof(val1.b) == sizeof(int) * 100);
/* CONST_MAX returns (void) instead of a value if the passed arguments
* are not of the same type or not constant expressions. */
assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
assert_se(val1.a == 100);
assert_se(MAX(++d, 0) == 1);
assert_se(d == 1);
assert_cc(MAXSIZE(char[3], uint16_t) == 3);
assert_cc(MAXSIZE(char[3], uint32_t) == 4);
assert_cc(MAXSIZE(char, long) == sizeof(long));
assert_se(MAX(-5, 5) == 5);
assert_se(MAX(5, 5) == 5);
assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
assert_se(LESS_BY(8, 4) == 4);
assert_se(LESS_BY(8, 8) == 0);
assert_se(LESS_BY(4, 8) == 0);
assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
assert_se(CMP(3, 5) == -1);
assert_se(CMP(5, 3) == 1);
assert_se(CMP(5, 5) == 0);
assert_se(CMP(x, y) == -1);
assert_se(CMP(y, x) == 1);
assert_se(CMP(x, x) == 0);
assert_se(CMP(y, y) == 0);
assert_se(CMP(UINT64_MAX, (uint64_t) 0) == 1);
assert_se(CMP((uint64_t) 0, UINT64_MAX) == -1);
assert_se(CMP(UINT64_MAX, UINT64_MAX) == 0);
assert_se(CMP(INT64_MIN, INT64_MAX) == -1);
assert_se(CMP(INT64_MAX, INT64_MIN) == 1);
assert_se(CMP(INT64_MAX, INT64_MAX) == 0);
assert_se(CMP(INT64_MIN, INT64_MIN) == 0);
assert_se(CMP(INT64_MAX, (int64_t) 0) == 1);
assert_se(CMP((int64_t) 0, INT64_MIN) == 1);
assert_se(CMP(INT64_MIN, (int64_t) 0) == -1);
assert_se(CMP((int64_t) 0, INT64_MAX) == -1);
assert_se(CMP(&str[2], &str[7]) == -1);
assert_se(CMP(&str[2], &str[2]) == 0);
assert_se(CMP(&str[7], (const char *)str) == 1);
assert_se(CMP(str[2], str[7]) == 1);
assert_se(CMP(str[7], *str) == 1);
assert_se(CMP((const unsigned long long *)arr, &arr[3]) == -1);
assert_se(CMP(*arr, arr[3]) == 1);
assert_se(CMP(p, q) == -1);
assert_se(CMP(q, p) == 1);
assert_se(CMP(p, p) == 0);
assert_se(CMP(q, q) == 0);
assert_se(CLAMP(-5, 0, 1) == 0);
assert_se(CLAMP(5, 0, 1) == 1);
assert_se(CLAMP(5, -10, 1) == 1);
assert_se(CLAMP(5, -10, 10) == 5);
assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
}
#pragma GCC diagnostic push
#ifdef __clang__
# pragma GCC diagnostic ignored "-Waddress-of-packed-member"
#endif
static void test_container_of(void) {
struct mytype {
uint8_t pad1[3];
uint64_t v1;
uint8_t pad2[2];
uint32_t v2;
} myval = { };
log_info("/* %s */", __func__);
assert_cc(sizeof(myval) >= 17);
assert_se(container_of(&myval.v1, struct mytype, v1) == &myval);
assert_se(container_of(&myval.v2, struct mytype, v2) == &myval);
assert_se(container_of(&container_of(&myval.v2,
struct mytype,
v2)->v1,
struct mytype,
v1) == &myval);
}
#pragma GCC diagnostic pop
static void test_div_round_up(void) {
int div;
log_info("/* %s */", __func__);
/* basic tests */
assert_se(DIV_ROUND_UP(0, 8) == 0);
assert_se(DIV_ROUND_UP(1, 8) == 1);
assert_se(DIV_ROUND_UP(8, 8) == 1);
assert_se(DIV_ROUND_UP(12, 8) == 2);
assert_se(DIV_ROUND_UP(16, 8) == 2);
/* test multiple evaluation */
div = 0;
assert_se(DIV_ROUND_UP(div++, 8) == 0 && div == 1);
assert_se(DIV_ROUND_UP(++div, 8) == 1 && div == 2);
assert_se(DIV_ROUND_UP(8, div++) == 4 && div == 3);
assert_se(DIV_ROUND_UP(8, ++div) == 2 && div == 4);
/* overflow test with exact division */
assert_se(sizeof(0U) == 4);
assert_se(0xfffffffaU % 10U == 0U);
assert_se(0xfffffffaU / 10U == 429496729U);
assert_se(DIV_ROUND_UP(0xfffffffaU, 10U) == 429496729U);
assert_se((0xfffffffaU + 10U - 1U) / 10U == 0U);
assert_se(0xfffffffaU / 10U + !!(0xfffffffaU % 10U) == 429496729U);
/* overflow test with rounded division */
assert_se(0xfffffffdU % 10U == 3U);
assert_se(0xfffffffdU / 10U == 429496729U);
assert_se(DIV_ROUND_UP(0xfffffffdU, 10U) == 429496730U);
assert_se((0xfffffffdU + 10U - 1U) / 10U == 0U);
assert_se(0xfffffffdU / 10U + !!(0xfffffffdU % 10U) == 429496730U);
}
static void test_ptr_to_int(void) {
log_info("/* %s */", __func__);
/* Primary reason to have this test is to validate that pointers are large enough to hold entire int range */
assert_se(PTR_TO_INT(INT_TO_PTR(0)) == 0);
assert_se(PTR_TO_INT(INT_TO_PTR(1)) == 1);
assert_se(PTR_TO_INT(INT_TO_PTR(-1)) == -1);
assert_se(PTR_TO_INT(INT_TO_PTR(INT_MAX)) == INT_MAX);
assert_se(PTR_TO_INT(INT_TO_PTR(INT_MIN)) == INT_MIN);
}
static void test_in_set(void) {
log_info("/* %s */", __func__);
assert_se(IN_SET(1, 1));
assert_se(IN_SET(1, 1, 2, 3, 4));
assert_se(IN_SET(2, 1, 2, 3, 4));
assert_se(IN_SET(3, 1, 2, 3, 4));
assert_se(IN_SET(4, 1, 2, 3, 4));
assert_se(!IN_SET(0, 1));
assert_se(!IN_SET(0, 1, 2, 3, 4));
}
static void test_foreach_pointer(void) {
int a, b, c, *i;
size_t k = 0;
log_info("/* %s */", __func__);
FOREACH_POINTER(i, &a, &b, &c) {
switch (k) {
case 0:
assert_se(i == &a);
break;
case 1:
assert_se(i == &b);
break;
case 2:
assert_se(i == &c);
break;
default:
assert_not_reached();
break;
}
k++;
}
assert(k == 3);
FOREACH_POINTER(i, &b) {
assert(k == 3);
assert(i == &b);
k = 4;
}
assert(k == 4);
FOREACH_POINTER(i, NULL, &c, NULL, &b, NULL, &a, NULL) {
switch (k) {
case 4:
assert_se(i == NULL);
break;
case 5:
assert_se(i == &c);
break;
case 6:
assert_se(i == NULL);
break;
case 7:
assert_se(i == &b);
break;
case 8:
assert_se(i == NULL);
break;
case 9:
assert_se(i == &a);
break;
case 10:
assert_se(i == NULL);
break;
default:
assert_not_reached();
break;
}
k++;
}
assert(k == 11);
}
static void test_align_to(void) {
log_info("/* %s */", __func__);
assert_se(ALIGN_TO(0, 1) == 0);
assert_se(ALIGN_TO(1, 1) == 1);
assert_se(ALIGN_TO(2, 1) == 2);
assert_se(ALIGN_TO(3, 1) == 3);
assert_se(ALIGN_TO(4, 1) == 4);
assert_se(ALIGN_TO(SIZE_MAX-1, 1) == SIZE_MAX-1);
assert_se(ALIGN_TO(SIZE_MAX, 1) == SIZE_MAX);
assert_se(ALIGN_TO(0, 2) == 0);
assert_se(ALIGN_TO(1, 2) == 2);
assert_se(ALIGN_TO(2, 2) == 2);
assert_se(ALIGN_TO(3, 2) == 4);
assert_se(ALIGN_TO(4, 2) == 4);
assert_se(ALIGN_TO(SIZE_MAX-3, 2) == SIZE_MAX-3);
assert_se(ALIGN_TO(SIZE_MAX-2, 2) == SIZE_MAX-1);
assert_se(ALIGN_TO(SIZE_MAX-1, 2) == SIZE_MAX-1);
assert_se(ALIGN_TO(SIZE_MAX, 2) == SIZE_MAX); /* overflow */
assert_se(ALIGN_TO(0, 4) == 0);
assert_se(ALIGN_TO(1, 4) == 4);
assert_se(ALIGN_TO(2, 4) == 4);
assert_se(ALIGN_TO(3, 4) == 4);
assert_se(ALIGN_TO(4, 4) == 4);
assert_se(ALIGN_TO(SIZE_MAX-3, 4) == SIZE_MAX-3);
assert_se(ALIGN_TO(SIZE_MAX-2, 4) == SIZE_MAX); /* overflow */
assert_se(ALIGN_TO(SIZE_MAX-1, 4) == SIZE_MAX); /* overflow */
assert_se(ALIGN_TO(SIZE_MAX, 4) == SIZE_MAX); /* overflow */
}
int main(int argc, char *argv[]) {
test_setup_logging(LOG_INFO);
test_align_power2();
test_max();
test_container_of();
test_div_round_up();
test_in_set();
test_foreach_pointer();
test_ptr_to_int();
test_align_to();
return 0;
}

View File

@ -36,7 +36,7 @@ static const char* af_to_string(int family, char *buf, size_t buf_len) {
if (name) if (name)
return name; return name;
(void) snprintf(buf, buf_len, "%i", family); snprintf(buf, buf_len, "%i", family);
return buf; return buf;
} }

View File

@ -17,6 +17,191 @@
#include "tests.h" #include "tests.h"
#include "util.h" #include "util.h"
static void test_align_power2(void) {
unsigned long i, p2;
log_info("/* %s */", __func__);
assert_se(ALIGN_POWER2(0) == 0);
assert_se(ALIGN_POWER2(1) == 1);
assert_se(ALIGN_POWER2(2) == 2);
assert_se(ALIGN_POWER2(3) == 4);
assert_se(ALIGN_POWER2(4) == 4);
assert_se(ALIGN_POWER2(5) == 8);
assert_se(ALIGN_POWER2(6) == 8);
assert_se(ALIGN_POWER2(7) == 8);
assert_se(ALIGN_POWER2(9) == 16);
assert_se(ALIGN_POWER2(10) == 16);
assert_se(ALIGN_POWER2(11) == 16);
assert_se(ALIGN_POWER2(12) == 16);
assert_se(ALIGN_POWER2(13) == 16);
assert_se(ALIGN_POWER2(14) == 16);
assert_se(ALIGN_POWER2(15) == 16);
assert_se(ALIGN_POWER2(16) == 16);
assert_se(ALIGN_POWER2(17) == 32);
assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
for (i = 1; i < 131071; ++i) {
for (p2 = 1; p2 < i; p2 <<= 1)
/* empty */ ;
assert_se(ALIGN_POWER2(i) == p2);
}
for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
for (p2 = 1; p2 && p2 < i; p2 <<= 1)
/* empty */ ;
assert_se(ALIGN_POWER2(i) == p2);
}
}
static void test_max(void) {
static const struct {
int a;
int b[CONST_MAX(10, 100)];
} val1 = {
.a = CONST_MAX(10, 100),
};
int d = 0;
unsigned long x = 12345;
unsigned long y = 54321;
const char str[] = "a_string_constant";
const unsigned long long arr[] = {9999ULL, 10ULL, 0ULL, 3000ULL, 2000ULL, 1000ULL, 100ULL, 9999999ULL};
void *p = (void *)str;
void *q = (void *)&str[16];
log_info("/* %s */", __func__);
assert_cc(sizeof(val1.b) == sizeof(int) * 100);
/* CONST_MAX returns (void) instead of a value if the passed arguments
* are not of the same type or not constant expressions. */
assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
assert_se(val1.a == 100);
assert_se(MAX(++d, 0) == 1);
assert_se(d == 1);
assert_cc(MAXSIZE(char[3], uint16_t) == 3);
assert_cc(MAXSIZE(char[3], uint32_t) == 4);
assert_cc(MAXSIZE(char, long) == sizeof(long));
assert_se(MAX(-5, 5) == 5);
assert_se(MAX(5, 5) == 5);
assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
assert_se(LESS_BY(8, 4) == 4);
assert_se(LESS_BY(8, 8) == 0);
assert_se(LESS_BY(4, 8) == 0);
assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
assert_se(CMP(3, 5) == -1);
assert_se(CMP(5, 3) == 1);
assert_se(CMP(5, 5) == 0);
assert_se(CMP(x, y) == -1);
assert_se(CMP(y, x) == 1);
assert_se(CMP(x, x) == 0);
assert_se(CMP(y, y) == 0);
assert_se(CMP(UINT64_MAX, (uint64_t) 0) == 1);
assert_se(CMP((uint64_t) 0, UINT64_MAX) == -1);
assert_se(CMP(UINT64_MAX, UINT64_MAX) == 0);
assert_se(CMP(INT64_MIN, INT64_MAX) == -1);
assert_se(CMP(INT64_MAX, INT64_MIN) == 1);
assert_se(CMP(INT64_MAX, INT64_MAX) == 0);
assert_se(CMP(INT64_MIN, INT64_MIN) == 0);
assert_se(CMP(INT64_MAX, (int64_t) 0) == 1);
assert_se(CMP((int64_t) 0, INT64_MIN) == 1);
assert_se(CMP(INT64_MIN, (int64_t) 0) == -1);
assert_se(CMP((int64_t) 0, INT64_MAX) == -1);
assert_se(CMP(&str[2], &str[7]) == -1);
assert_se(CMP(&str[2], &str[2]) == 0);
assert_se(CMP(&str[7], (const char *)str) == 1);
assert_se(CMP(str[2], str[7]) == 1);
assert_se(CMP(str[7], *str) == 1);
assert_se(CMP((const unsigned long long *)arr, &arr[3]) == -1);
assert_se(CMP(*arr, arr[3]) == 1);
assert_se(CMP(p, q) == -1);
assert_se(CMP(q, p) == 1);
assert_se(CMP(p, p) == 0);
assert_se(CMP(q, q) == 0);
assert_se(CLAMP(-5, 0, 1) == 0);
assert_se(CLAMP(5, 0, 1) == 1);
assert_se(CLAMP(5, -10, 1) == 1);
assert_se(CLAMP(5, -10, 10) == 5);
assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
}
#pragma GCC diagnostic push
#ifdef __clang__
# pragma GCC diagnostic ignored "-Waddress-of-packed-member"
#endif
static void test_container_of(void) {
struct mytype {
uint8_t pad1[3];
uint64_t v1;
uint8_t pad2[2];
uint32_t v2;
} myval = { };
log_info("/* %s */", __func__);
assert_cc(sizeof(myval) >= 17);
assert_se(container_of(&myval.v1, struct mytype, v1) == &myval);
assert_se(container_of(&myval.v2, struct mytype, v2) == &myval);
assert_se(container_of(&container_of(&myval.v2,
struct mytype,
v2)->v1,
struct mytype,
v1) == &myval);
}
#pragma GCC diagnostic pop
static void test_div_round_up(void) {
int div;
log_info("/* %s */", __func__);
/* basic tests */
assert_se(DIV_ROUND_UP(0, 8) == 0);
assert_se(DIV_ROUND_UP(1, 8) == 1);
assert_se(DIV_ROUND_UP(8, 8) == 1);
assert_se(DIV_ROUND_UP(12, 8) == 2);
assert_se(DIV_ROUND_UP(16, 8) == 2);
/* test multiple evaluation */
div = 0;
assert_se(DIV_ROUND_UP(div++, 8) == 0 && div == 1);
assert_se(DIV_ROUND_UP(++div, 8) == 1 && div == 2);
assert_se(DIV_ROUND_UP(8, div++) == 4 && div == 3);
assert_se(DIV_ROUND_UP(8, ++div) == 2 && div == 4);
/* overflow test with exact division */
assert_se(sizeof(0U) == 4);
assert_se(0xfffffffaU % 10U == 0U);
assert_se(0xfffffffaU / 10U == 429496729U);
assert_se(DIV_ROUND_UP(0xfffffffaU, 10U) == 429496729U);
assert_se((0xfffffffaU + 10U - 1U) / 10U == 0U);
assert_se(0xfffffffaU / 10U + !!(0xfffffffaU % 10U) == 429496729U);
/* overflow test with rounded division */
assert_se(0xfffffffdU % 10U == 3U);
assert_se(0xfffffffdU / 10U == 429496729U);
assert_se(DIV_ROUND_UP(0xfffffffdU, 10U) == 429496730U);
assert_se((0xfffffffdU + 10U - 1U) / 10U == 0U);
assert_se(0xfffffffdU / 10U + !!(0xfffffffdU % 10U) == 429496730U);
}
static void test_u64log2(void) { static void test_u64log2(void) {
log_info("/* %s */", __func__); log_info("/* %s */", __func__);
@ -64,6 +249,18 @@ static void test_unprotect_errno(void) {
assert_se(errno == 4711); assert_se(errno == 4711);
} }
static void test_in_set(void) {
log_info("/* %s */", __func__);
assert_se(IN_SET(1, 1));
assert_se(IN_SET(1, 1, 2, 3, 4));
assert_se(IN_SET(2, 1, 2, 3, 4));
assert_se(IN_SET(3, 1, 2, 3, 4));
assert_se(IN_SET(4, 1, 2, 3, 4));
assert_se(!IN_SET(0, 1));
assert_se(!IN_SET(0, 1, 2, 3, 4));
}
static void test_log2i(void) { static void test_log2i(void) {
log_info("/* %s */", __func__); log_info("/* %s */", __func__);
@ -212,12 +409,109 @@ static void test_system_tasks_max_scale(void) {
assert_se(system_tasks_max_scale(UINT64_MAX/4, UINT64_MAX) == UINT64_MAX); assert_se(system_tasks_max_scale(UINT64_MAX/4, UINT64_MAX) == UINT64_MAX);
} }
static void test_foreach_pointer(void) {
int a, b, c, *i;
size_t k = 0;
log_info("/* %s */", __func__);
FOREACH_POINTER(i, &a, &b, &c) {
switch (k) {
case 0:
assert_se(i == &a);
break;
case 1:
assert_se(i == &b);
break;
case 2:
assert_se(i == &c);
break;
default:
assert_not_reached();
break;
}
k++;
}
assert(k == 3);
FOREACH_POINTER(i, &b) {
assert(k == 3);
assert(i == &b);
k = 4;
}
assert(k == 4);
FOREACH_POINTER(i, NULL, &c, NULL, &b, NULL, &a, NULL) {
switch (k) {
case 4:
assert_se(i == NULL);
break;
case 5:
assert_se(i == &c);
break;
case 6:
assert_se(i == NULL);
break;
case 7:
assert_se(i == &b);
break;
case 8:
assert_se(i == NULL);
break;
case 9:
assert_se(i == &a);
break;
case 10:
assert_se(i == NULL);
break;
default:
assert_not_reached();
break;
}
k++;
}
assert(k == 11);
}
static void test_ptr_to_int(void) {
log_info("/* %s */", __func__);
/* Primary reason to have this test is to validate that pointers are large enough to hold entire int range */
assert_se(PTR_TO_INT(INT_TO_PTR(0)) == 0);
assert_se(PTR_TO_INT(INT_TO_PTR(1)) == 1);
assert_se(PTR_TO_INT(INT_TO_PTR(-1)) == -1);
assert_se(PTR_TO_INT(INT_TO_PTR(INT_MAX)) == INT_MAX);
assert_se(PTR_TO_INT(INT_TO_PTR(INT_MIN)) == INT_MIN);
}
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
test_setup_logging(LOG_INFO); test_setup_logging(LOG_INFO);
test_align_power2();
test_max();
test_container_of();
test_div_round_up();
test_u64log2(); test_u64log2();
test_protect_errno(); test_protect_errno();
test_unprotect_errno(); test_unprotect_errno();
test_in_set();
test_log2i(); test_log2i();
test_eqzero(); test_eqzero();
test_raw_clone(); test_raw_clone();
@ -225,6 +519,8 @@ int main(int argc, char *argv[]) {
test_physical_memory_scale(); test_physical_memory_scale();
test_system_tasks_max(); test_system_tasks_max();
test_system_tasks_max_scale(); test_system_tasks_max_scale();
test_foreach_pointer();
test_ptr_to_int();
return 0; return 0;
} }

View File

@ -57,7 +57,6 @@ Link.TCPSegmentationOffload, config_parse_tristate,
Link.TCP6SegmentationOffload, config_parse_tristate, 0, offsetof(LinkConfig, features[NET_DEV_FEAT_TSO6]) Link.TCP6SegmentationOffload, config_parse_tristate, 0, offsetof(LinkConfig, features[NET_DEV_FEAT_TSO6])
Link.UDPSegmentationOffload, config_parse_warn_compat, DISABLED_LEGACY, 0 Link.UDPSegmentationOffload, config_parse_warn_compat, DISABLED_LEGACY, 0
Link.GenericReceiveOffload, config_parse_tristate, 0, offsetof(LinkConfig, features[NET_DEV_FEAT_GRO]) Link.GenericReceiveOffload, config_parse_tristate, 0, offsetof(LinkConfig, features[NET_DEV_FEAT_GRO])
Link.GenericReceiveOffloadHardware, config_parse_tristate, 0, offsetof(LinkConfig, features[NET_DEV_FEAT_GRO_HW])
Link.LargeReceiveOffload, config_parse_tristate, 0, offsetof(LinkConfig, features[NET_DEV_FEAT_LRO]) Link.LargeReceiveOffload, config_parse_tristate, 0, offsetof(LinkConfig, features[NET_DEV_FEAT_LRO])
Link.RxChannels, config_parse_ring_buffer_or_channel, 0, offsetof(LinkConfig, channels.rx) Link.RxChannels, config_parse_ring_buffer_or_channel, 0, offsetof(LinkConfig, channels.rx)
Link.TxChannels, config_parse_ring_buffer_or_channel, 0, offsetof(LinkConfig, channels.tx) Link.TxChannels, config_parse_ring_buffer_or_channel, 0, offsetof(LinkConfig, channels.tx)

View File

@ -60,7 +60,7 @@ static const char *modalias_usb(sd_device *dev, char *s, size_t size) {
return NULL; return NULL;
(void) sd_device_get_sysattr_value(dev, "product", &n); (void) sd_device_get_sysattr_value(dev, "product", &n);
(void) snprintf(s, size, "usb:v%04Xp%04X:%s", vn, pn, strempty(n)); snprintf(s, size, "usb:v%04Xp%04X:%s", vn, pn, strempty(n));
return s; return s;
} }

View File

@ -36,7 +36,6 @@ TCPSegmentationOffload=
TCP6SegmentationOffload= TCP6SegmentationOffload=
UDPSegmentationOffload= UDPSegmentationOffload=
GenericReceiveOffload= GenericReceiveOffload=
GenericReceiveOffloadHardware=
LargeReceiveOffload= LargeReceiveOffload=
RxChannels= RxChannels=
TxChannels= TxChannels=

View File

@ -1227,9 +1227,6 @@ check_result_common() {
setfacl -m "user:${SUDO_USER:?}:r-X" "${TESTDIR:?}/"failed setfacl -m "user:${SUDO_USER:?}:r-X" "${TESTDIR:?}/"failed
fi fi
ret=1 ret=1
elif get_bool "$TIMED_OUT"; then
echo "(timeout)" >"${TESTDIR:?}/failed"
ret=2
elif [ -e "$workspace/testok" ]; then elif [ -e "$workspace/testok" ]; then
# …/testok always counts (but with lower priority than …/failed) # …/testok always counts (but with lower priority than …/failed)
ret=0 ret=0
@ -1238,6 +1235,9 @@ check_result_common() {
echo "${TESTNAME:?} was skipped:" echo "${TESTNAME:?} was skipped:"
cat "$workspace/skipped" cat "$workspace/skipped"
ret=0 ret=0
elif get_bool "$TIMED_OUT"; then
echo "(timeout)" >"${TESTDIR:?}/failed"
ret=2
else else
echo "(failed; see logs)" >"${TESTDIR:?}/failed" echo "(failed; see logs)" >"${TESTDIR:?}/failed"
ret=3 ret=3