[make-initrd] [PATCH 1/3] Reimplement ueventd
Leonid Krivoshein
klark.devel at gmail.com
Fri May 5 08:21:25 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"
> +
> [...]
> +void move_files(char *srcdir, char *dstdir)
> +{
> + struct dirent *ent;
> + int srcfd, dstfd;
> +
> + if ((srcfd = open(srcdir, O_RDONLY | O_CLOEXEC)) < 0)
> + fatal("open: %s: %m", srcdir);
> +
> + errno = 0;
> + if ((dstfd = open(dstdir, O_RDONLY | O_CLOEXEC)) < 0) {
> + if (errno == ENOENT) {
open() тоже прерываемый примитив, но его ты оборачивать не стал. Так
задумано?
> + if (mkdir(dstdir, 0755) < 0)
> + fatal("mkdir: %s: %m", dstdir);
> + dstfd = open(dstdir, O_RDONLY | O_CLOEXEC);
> + }
> + if (dstfd < 0)
> + fatal("open: %s: %m", dstdir);
> + }
> +
> + DIR *d = fdopendir(srcfd);
> + if (!d)
> + fatal("fdopendir: %m");
> +
> + while ((ent = xreaddir(d, srcdir)) != NULL) {
> + if (ent->d_name[0] != '.' && ent->d_type == DT_REG &&
> + renameat(srcfd, ent->d_name, dstfd, ent->d_name) < 0)
> + fatal("rename `%s/%s' -> `%s/%s': %m", srcdir, ent->d_name, dstdir, ent->d_name);
> + }
> +
> + closedir(d);
> + close(dstfd);
Возможно тут и нет ошибки, но srcfd будет закрыт только при завершении
программы, а что насчёт повторного вызова функции с такой же srcdir или
такое невозможно?
> +}
> [...]
--
WBR, Leonid Krivoshein.
More information about the Make-initrd
mailing list