Skip to content

Commit

Permalink
preset-all: continue on errors, report more errors
Browse files Browse the repository at this point in the history
Firstly, if we encounter an error when iterating over the directory, gather
the error but continue. This is unlikely to happen, but if it happens, then
it doesn't seem very useful to break the preset processing at a random
point. If we can't process a unit — too bad, but since we already might
have processed some units earlier, we might as well try to process the
remaining ones.

Secondly, add missing error codes for units that are in a bad state to the
exclusion list. Those, we report them in the changes list, but consider the
whole operation a success. (-ETXTBSY and -ENOLINK were missing.)

Thirdly, add a message generator for -ENOLINK.

Fixes systemd/systemd#21224.

(cherry picked from commit a4f0e0d)
  • Loading branch information
keszybz committed May 8, 2024
1 parent 9333db0 commit 672226b
Showing 1 changed file with 27 additions and 10 deletions.
37 changes: 27 additions & 10 deletions src/shared/install.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,11 @@ void install_changes_dump(int r, const char *verb, const InstallChange *changes,
err = log_error_errno(changes[i].type, "Failed to %s unit, unit %s does not exist.",
verb, changes[i].path);
break;
case -ENOLINK:
err = log_error_errno(changes[i].type, "Failed to %s unit, %s is an unresolvable alias.",
verb, changes[i].path);
break;

case -EUNATCH:
err = log_error_errno(changes[i].type, "Failed to %s unit, cannot resolve specifiers in \"%s\".",
verb, changes[i].path);
Expand Down Expand Up @@ -3600,31 +3605,43 @@ int unit_file_preset_all(
if (r < 0)
return r;

r = 0;
STRV_FOREACH(i, lp.search_path) {
_cleanup_closedir_ DIR *d = NULL;

d = opendir(*i);
if (!d) {
if (errno == ENOENT)
continue;

return -errno;
if (errno != ENOENT)
RET_GATHER(r, -errno);
continue;
}

FOREACH_DIRENT(de, d, return -errno) {
FOREACH_DIRENT(de, d, RET_GATHER(r, -errno)) {
int k;

if (!unit_name_is_valid(de->d_name, UNIT_NAME_ANY))
continue;

if (!IN_SET(de->d_type, DT_LNK, DT_REG))
continue;

r = preset_prepare_one(scope, &plus, &minus, &lp, de->d_name, &presets, changes, n_changes);
if (r < 0 &&
!IN_SET(r, -EEXIST, -ERFKILL, -EADDRNOTAVAIL, -EBADSLT, -EIDRM, -EUCLEAN, -ELOOP, -ENOENT, -EUNATCH, -EXDEV))
k = preset_prepare_one(scope, &plus, &minus, &lp, de->d_name, &presets, changes, n_changes);
if (k < 0 &&
!IN_SET(k, -EEXIST,
-ERFKILL,
-EADDRNOTAVAIL,
-ETXTBSY,
-EBADSLT,
-EIDRM,
-EUCLEAN,
-ELOOP,
-EXDEV,
-ENOENT,
-ENOLINK,
-EUNATCH))
/* Ignore generated/transient/missing/invalid units when applying preset, propagate other errors.
* Coordinate with install_changes_dump() above. */
return r;
* Coordinate with install_change_dump_error() above. */
RET_GATHER(r, k);
}
}

Expand Down

0 comments on commit 672226b

Please sign in to comment.