1
0
mirror of https://github.com/systemd/systemd.git synced 2025-06-07 07:17:09 +03:00

Merge pull request #8617 from keszybz/tmpfiles-relax

Do not exit with error when systemd-tmpfiles --boot fails
This commit is contained in:
Lennart Poettering 2018-04-05 11:54:02 +02:00 committed by GitHub
commit 6064de2de8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 16 deletions

View File

@ -225,11 +225,15 @@
<refsect1> <refsect1>
<title>Exit status</title> <title>Exit status</title>
<para>On success, 0 is returned. If the configuration was invalid (invalid syntax, missing <para>On success, 0 is returned. If the configuration was syntactically invalid (syntax errors,
arguments, …), so some lines had to be ignored, but no other errors occurred, missing arguments, …), so some lines had to be ignored, but no other errors occurred,
<constant>65</constant> is returned (<constant>EX_DATAERR</constant> from <constant>65</constant> is returned (<constant>EX_DATAERR</constant> from
<filename>/usr/include/sysexits.h</filename>). Otherwise, <constant>1</constant> is returned <filename>/usr/include/sysexits.h</filename>). If the configuration was syntactically valid, but
(<constant>EXIT_FAILURE</constant> from <filename>/usr/include/stdlib.h</filename>). could not be executed (lack of permissions, creation of files in missing directories, invalid
contents when writing to <filename>/sys/</filename> values, …), <constant>73</constant> is
returned (<constant>EX_DATAERR</constant> from <filename>/usr/include/sysexits.h</filename>).
Otherwise, <constant>1</constant> is returned (<constant>EXIT_FAILURE</constant> from
<filename>/usr/include/stdlib.h</filename>).
</para> </para>
</refsect1> </refsect1>

View File

@ -98,6 +98,10 @@ int acquire_data_fd(const void *data, size_t size, unsigned flags);
#define ERRNO_IS_DISCONNECT(r) \ #define ERRNO_IS_DISCONNECT(r) \
IN_SET(r, ENOTCONN, ECONNRESET, ECONNREFUSED, ECONNABORTED, EPIPE, ENETUNREACH) IN_SET(r, ENOTCONN, ECONNRESET, ECONNREFUSED, ECONNABORTED, EPIPE, ENETUNREACH)
/* Resource exhaustion, could be our fault or general system trouble */
#define ERRNO_IS_RESOURCE(r) \
IN_SET(r, ENOMEM, EMFILE, ENFILE)
int fd_move_above_stdio(int fd); int fd_move_above_stdio(int fd);
int rearrange_stdio(int original_input_fd, int original_output_fd, int original_error_fd); int rearrange_stdio(int original_input_fd, int original_output_fd, int original_error_fd);

View File

@ -1289,7 +1289,7 @@ static int write_one_file(Item *i, const char *path) {
fd = safe_close(fd); fd = safe_close(fd);
done: done:
if (stat(path, &st) < 0) if (stat(path, &st) < 0)
return log_error_errno(errno, "stat(%s) failed: %m", path); return log_error_errno(errno, "stat(%s) failed: %m", path);
@ -2725,7 +2725,7 @@ static int read_config_files(char **config_dirs, char **args, bool *invalid_conf
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
int r, k; int r, k, r_process = 0;
ItemArray *a; ItemArray *a;
Iterator iterator; Iterator iterator;
_cleanup_strv_free_ char **config_dirs = NULL; _cleanup_strv_free_ char **config_dirs = NULL;
@ -2772,7 +2772,7 @@ int main(int argc, char *argv[]) {
t = strv_join(config_dirs, "\n\t"); t = strv_join(config_dirs, "\n\t");
if (t) if (t)
log_debug("Looking for configuration files in (higher priority first:\n\t%s", t); log_debug("Looking for configuration files in (higher priority first):\n\t%s", t);
} }
/* If command line arguments are specified along with --replace, read all /* If command line arguments are specified along with --replace, read all
@ -2788,22 +2788,20 @@ int main(int argc, char *argv[]) {
if (r < 0) if (r < 0)
goto finish; goto finish;
/* The non-globbing ones usually create things, hence we apply /* The non-globbing ones usually create things, hence we apply
* them first */ * them first */
ORDERED_HASHMAP_FOREACH(a, items, iterator) { ORDERED_HASHMAP_FOREACH(a, items, iterator) {
k = process_item_array(a); k = process_item_array(a);
if (k < 0 && r == 0) if (k < 0 && r_process == 0)
r = k; r_process = k;
} }
/* The globbing ones usually alter things, hence we apply them /* The globbing ones usually alter things, hence we apply them
* second. */ * second. */
ORDERED_HASHMAP_FOREACH(a, globs, iterator) { ORDERED_HASHMAP_FOREACH(a, globs, iterator) {
k = process_item_array(a); k = process_item_array(a);
if (k < 0 && r == 0) if (k < 0 && r_process == 0)
r = k; r_process = k;
} }
finish: finish:
@ -2818,10 +2816,12 @@ finish:
mac_selinux_finish(); mac_selinux_finish();
if (r < 0) if (r < 0 || ERRNO_IS_RESOURCE(-r_process))
return EXIT_FAILURE; return EXIT_FAILURE;
else if (invalid_config) else if (invalid_config)
return EX_DATAERR; return EX_DATAERR;
else if (r_process < 0)
return EX_CANTCREAT;
else else
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -20,4 +20,4 @@ ConditionCapability=CAP_SYS_MODULE
Type=oneshot Type=oneshot
RemainAfterExit=yes RemainAfterExit=yes
ExecStart=@rootbindir@/systemd-tmpfiles --prefix=/dev --create --boot ExecStart=@rootbindir@/systemd-tmpfiles --prefix=/dev --create --boot
SuccessExitStatus=65 SuccessExitStatus=65 73

View File

@ -20,4 +20,4 @@ RefuseManualStop=yes
Type=oneshot Type=oneshot
RemainAfterExit=yes RemainAfterExit=yes
ExecStart=@rootbindir@/systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev ExecStart=@rootbindir@/systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev
SuccessExitStatus=65 SuccessExitStatus=65 73