From: Arnout Vandecappelle <arnout@mind.be>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH 1/3] e2fsprogs: nommu: Add patch to use vfork in nommu arch.
Date: Sat, 16 Nov 2013 01:59:52 +0100 [thread overview]
Message-ID: <5286C388.2000004@mind.be> (raw)
In-Reply-To: <1384504293-2067-2-git-send-email-Sonic.adi@gmail.com>
Hi Sonic,
Again, it doesn't look like these fork replacements will work...
On 15/11/13 09:31, sonic.adi at gmail.com wrote:
> From: Sonic Zhang <sonic.zhang@analog.com>
>
> Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>
> ---
> package/e2fsprogs/e2fsprogs-nommu.patch | 231 ++++++++++++++++++++++++++++++++
> 1 file changed, 231 insertions(+)
> create mode 100644 package/e2fsprogs/e2fsprogs-nommu.patch
>
> diff --git a/package/e2fsprogs/e2fsprogs-nommu.patch b/package/e2fsprogs/e2fsprogs-nommu.patch
> new file mode 100644
> index 0000000..6aef365
> --- /dev/null
> +++ b/package/e2fsprogs/e2fsprogs-nommu.patch
> @@ -0,0 +1,231 @@
> +--- e2fsprogs-1.42.4/e2fsck/logfile.c 2012-05-29 09:29:48.000000000 +0800
> ++++ e2fsprogs-1.42.4.nommu/e2fsck/logfile.c 2012-09-24 17:49:18.878104451 +0800
> +@@ -220,7 +220,11 @@
> + exit(1);
> + }
> +
> ++#ifndef HAVE_FORK
> ++ pid = vfork();
> ++#else
> + pid = fork();
> ++#endif
This one creates a child process that will read from an fd that is
written by its parent, so I don't think this will work (parent is
suspended until child exec's or exits). However, because of the call to
daemon() in-between, it might work. Have you tested it?
> + if (pid < 0) {
> + perror("fork");
> + exit(1);
> +@@ -264,7 +268,11 @@
> + outbufsize -= c;
> + cp += c;
> + }
> ++#ifndef HAVE_FORK
> ++ _exit(0);
> ++#else
> + exit(0);
> ++#endif
> + }
> +
> + close(fds[0]);
> +--- e2fsprogs-1.42.4/lib/ss/pager.c 2012-03-19 02:18:33.000000000 +0800
> ++++ e2fsprogs-1.42.4.nommu/lib/ss/pager.c 2012-09-24 17:54:33.862356418 +0800
> +@@ -79,7 +79,11 @@
> + if (pipe(filedes) != 0)
> + return(-1);
> +
> ++#ifndef HAVE_FORK
> ++ switch(vfork()) {
> ++#else
> + switch(fork()) {
> ++#endif
> + case -1:
> + return(-1);
> + case 0:
> +--- e2fsprogs-1.42.4/lib/ss/help.c 2012-03-19 02:18:33.000000000 +0800
> ++++ e2fsprogs-1.42.4.nommu/lib/ss/help.c 2012-09-24 17:55:00.326105930 +0800
> +@@ -107,7 +107,11 @@
> + free(buf);
> + return;
> + }
> ++#ifndef HAVE_FORK
> ++ switch (child = vfork()) {
> ++#else
> + switch (child = fork()) {
> ++#endif
> + case -1:
> + ss_perror(sci_idx, errno, "Can't fork for pager");
> + return;
> +--- e2fsprogs-1.42.4/lib/fpopen.c 2012-03-19 02:18:33.000000000 +0800
> ++++ e2fsprogs-1.42.4.nommu/lib/fpopen.c 2012-09-24 17:55:54.050106645 +0800
> +@@ -94,7 +94,11 @@
> + return NULL;
> +
> + /* Fork and execute the correct program. */
> ++#ifndef HAVE_FORK
> ++ if ((pid = vfork()) < 0) {
> ++#else
> + if ((pid = fork()) < 0) {
> ++#endif
> + perror("fork");
> + return NULL;
> + } else if (pid == 0) {
> +@@ -109,7 +113,11 @@
> + }
> + (void) execvp(prog, argv);
> + perror(prog);
> ++#ifndef HAVE_FORK
> ++ _exit(1);
> ++#else
> + exit(1);
> ++#endif
> + }
> + return fdopen(do_stdin ? fds[1] : fds[0], mode);
> + }
> +--- e2fsprogs-1.42.4/lib/uuid/gen_uuid.c 2012-03-19 02:18:33.000000000 +0800
> ++++ e2fsprogs-1.42.4.nommu/lib/uuid/gen_uuid.c 2012-09-24 17:56:41.186106057 +0800
> +@@ -504,11 +504,19 @@
> + if (access_ret == 0 && (st.st_mode & (S_ISUID | S_ISGID)) == 0)
> + access_ret = access(UUIDD_DIR, W_OK);
> + if (access_ret == 0 && start_attempts++ < 5) {
> ++#ifndef HAVE_FORK
> ++ if ((pid = vfork()) == 0) {
> ++#else
> + if ((pid = fork()) == 0) {
> ++#endif
> + close_all_fds();
> + execl(uuidd_path, "uuidd", "-qT", "300",
> + (char *) NULL);
> ++#ifndef HAVE_FORK
> ++ _exit(1);
> ++#else
> + exit(1);
> ++#endif
> + }
> + (void) waitpid(pid, 0, 0);
> + if (connect(s, (const struct sockaddr *) &srv_addr,
> +--- e2fsprogs-1.42.4/misc/uuidd.c 2012-03-19 02:18:33.000000000 +0800
> ++++ e2fsprogs-1.42.4.nommu/misc/uuidd.c 2012-09-24 17:57:49.630106531 +0800
> +@@ -56,7 +56,11 @@
> + static void die(const char *msg)
> + {
> + perror(msg);
> ++#ifndef HAVE_FORK
> ++ _exit(1);
> ++#else
> + exit(1);
> ++#endif
> + }
> +
> + static void create_daemon(void)
> +@@ -64,7 +68,11 @@
> + pid_t pid;
> + uid_t euid;
> +
> ++#ifndef HAVE_FORK
> ++ pid = vfork();
> ++#else
> + pid = fork();
> ++#endif
This looks like a home-grown implementation of daemon() - why didn't
T.T'so just you daemon()? Anyway, it probably won't work because the
child returns from the function, thereby corrupting the parent's stack
frame. It may work accidentally, though.
> + if (pid == -1) {
> + perror("fork");
> + exit(1);
> +--- e2fsprogs-1.42.4/misc/fsck.c 2012-04-27 06:44:12.000000000 +0800
> ++++ e2fsprogs-1.42.4.nommu/misc/fsck.c 2012-09-24 17:52:49.297070304 +0800
> +@@ -491,7 +491,11 @@
> + /* Fork and execute the correct program. */
> + if (noexecute)
> + pid = -1;
> ++#ifndef HAVE_FORK
> ++ else if ((pid = vfork()) < 0) {
> ++#else
> + else if ((pid = fork()) < 0) {
> ++#endif
> + perror("fork");
> + free(inst);
> + return errno;
> +@@ -501,7 +505,11 @@
> + (void) execv(s, argv);
> + perror(argv[0]);
> + free(inst);
> ++#ifndef HAVE_FORK
> ++ _exit(EXIT_ERROR);
> ++#else
> + exit(EXIT_ERROR);
> ++#endif
> + }
> +
> + for (i=0; i < argc; i++)
> +@@ -641,10 +649,18 @@
> + * time to set up the signal handler
> + */
> + if (inst2->start_time < time(0)+2) {
> ++#ifndef HAVE_FORK
> ++ if (vfork() == 0) {
> ++#else
> + if (fork() == 0) {
> ++#endif
> + sleep(1);
> + kill(inst2->pid, SIGUSR1);
> ++#ifndef HAVE_FORK
> ++ _exit(0);
> ++#else
> + exit(0);
> ++#endif
Hm, this looks like cut and paste code from util-linux, where I
commented on a better way to implement this.
> + }
> + } else
> + kill(inst2->pid, SIGUSR1);
> +--- e2fsprogs-1.42.4/misc/logsave.c 2012-03-19 02:18:33.000000000 +0800
> ++++ e2fsprogs-1.42.4.nommu/misc/logsave.c 2012-09-24 17:51:18.062105881 +0800
> +@@ -181,7 +181,11 @@
> + #endif
> + #endif
> +
> ++#ifndef HAVE_FORK
> ++ pid = vfork();
> ++#else
> + pid = fork();
> ++#endif
> + if (pid < 0) {
> + perror("vfork");
> + exit(1);
> +@@ -193,7 +197,11 @@
> +
> + execvp(argv[0], argv);
> + perror(argv[0]);
> ++#ifndef HAVE_FORK
> ++ _exit(1);
> ++#else
> + exit(1);
> ++#endif
> + }
> + child_pid = pid;
> + close(fds[1]);
> +@@ -307,7 +315,11 @@
> + send_output("----------------\n", 0, send_flag);
> +
> + if (outbuf) {
> ++#ifndef HAVE_FORK
> ++ pid = vfork();
> ++#else
> + pid = fork();
> ++#endif
The idea here is to background the process, but vfork doesn't actually
background so you could just as well skip it completely. Or use daemon(1,1).
Regards,
Arnout
> + if (pid < 0) {
> + perror("fork");
> + exit(1);
> +@@ -329,5 +341,9 @@
> + if (outfd >= 0)
> + close(outfd);
> +
> ++#ifndef HAVE_FORK
> ++ _exit(rc);
> ++#else
> + exit(rc);
> ++#endif
> + }
> +--- e2fsprogs-1.42.8/configure.in.old 2013-11-11 15:31:35.626098053 +0800
> ++++ e2fsprogs-1.42.8/configure.in 2013-11-11 15:31:08.652956982 +0800
> +@@ -1020,6 +1020,7 @@
> + fallocate64
> + fchown
> + fdatasync
> ++ fork
> + fstat64
> + ftruncate64
> + getdtablesize
>
--
Arnout Vandecappelle arnout at mind be
Senior Embedded Software Architect +32-16-286500
Essensium/Mind http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
next prev parent reply other threads:[~2013-11-16 0:59 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-15 8:31 [Buildroot] [PATCH] e2fsprogs: Disable elf shared library when BR2_PREFER_STATIC_LIB is selected sonic.adi at gmail.com
2013-11-15 8:31 ` [Buildroot] [PATCH 1/3] e2fsprogs: nommu: Add patch to use vfork in nommu arch sonic.adi at gmail.com
2013-11-15 8:40 ` Thomas De Schampheleire
2013-11-16 0:59 ` Arnout Vandecappelle [this message]
2013-11-16 9:42 ` Thomas Petazzoni
2013-11-15 8:31 ` [Buildroot] [PATCH 2/3] e2fsprogs: flat: Add patch to append uuid link flag after the blkid link flags when checking the blkid library in the FLAT binary mode sonic.adi at gmail.com
2013-11-15 8:56 ` Thomas De Schampheleire
2013-11-15 8:31 ` [Buildroot] [PATCH 3/3] e2fsprogs: Disable elf shared library when BR2_PREFER_STATIC_LIB is selected sonic.adi at gmail.com
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5286C388.2000004@mind.be \
--to=arnout@mind.be \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox