[make-initrd] [PATCH 1/3] Reimplement ueventd

Alexey Gladkov gladkov.alexey at gmail.com
Fri May 5 20:24:31 MSK 2023


On Fri, May 05, 2023 at 08:21:25AM +0300, Leonid Krivoshein wrote:
> 
> 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 или 
> такое невозможно?

Нет, srcfd будет закрыт в closedir.

https://git.altlinux.org/gears/g/glibc.git?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/closedir.c#l30

> > +}
> > [...]
> 
> 
> -- 
> WBR, Leonid Krivoshein.
> _______________________________________________
> Make-initrd mailing list
> Make-initrd at lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/make-initrd

-- 
Rgrds, legion



More information about the Make-initrd mailing list