[make-initrd] [PATCH 1/3] Reimplement ueventd
Leonid Krivoshein
klark.devel at gmail.com
Fri May 5 07:03:16 MSK 2023
On 5/4/23 16:42, Alexey Gladkov wrote:
> [...]
> diff --git a/datasrc/ueventd/queue-processor.c b/datasrc/ueventd/queue-processor.c
> new file mode 100644
> index 00000000..ab5e03e4
> --- /dev/null
> +++ b/datasrc/ueventd/queue-processor.c
> @@ -0,0 +1,116 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <sys/wait.h>
> +
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <signal.h>
> +#include <dirent.h>
> +#include <fcntl.h>
> +#include <errno.h>
> +
> +#include "ueventd.h"
> +
> +static void event_handler(struct watch *queue, char *path) __attribute__((nonnull(1, 2)));
> +static void move_files(char *srcdir, char *dstdir) __attribute__((nonnull(1, 2)));
> +static void signal_unhandled_events(struct watch *queue) __attribute__((nonnull(1)));
> +
> +void event_handler(struct watch *queue, char *path)
> +{
> + char *argv[] = { handler_file, path, NULL };
> + pid_t pid = vfork();
> +
> + if (pid < 0) {
> + err("fork: %m");
Сначала я подумал, что тут пропущен первый аргумент и таких мест
оказалось много. err() -- и твой макрос из ueventd.h, и стандартный
вызов из <err.h> с отличающейся семантикой. В новом коде ueventd
используется твой макрос, но в остальном коде make-initrd используется
стандартный вызов. Так недолго самому запутаться, см.: git grep 'err('.
> +
> + } else if (!pid) {
> + execve(argv[0], argv, environ);
> + fatal("exec: %s: %m", argv[0]);
> + } else {
> + int status = 0;
> +
> + if (waitpid_retry(pid, &status, 0) != pid || !WIFEXITED(status))
> + info("%s: session=%lu: %s failed",
> + queue->q_name, session, handler_file);
> + else
> + info("%s: session=%lu: %s finished with return code %d",
> + queue->q_name, session, handler_file, WEXITSTATUS(status));
> + }
> +}
> [...]
--
WBR, Leonid Krivoshein.
More information about the Make-initrd
mailing list