factor out NOFORK/NOEXEC code from find. Use it for xargs too.

This commit is contained in:
Denis Vlasenko
2007-04-09 21:32:30 +00:00
parent 1b4b2cb20e
commit cd7001f705
4 changed files with 76 additions and 68 deletions

View File

@@ -238,37 +238,19 @@ ACTF(inum)
ACTF(exec)
{
int i, rc;
char *argv[ap->exec_argc+1];
char *argv[ap->exec_argc + 1];
for (i = 0; i < ap->exec_argc; i++)
argv[i] = subst(ap->exec_argv[i], ap->subst_count[i], fileName);
argv[i] = NULL; /* terminate the list */
if (ENABLE_FEATURE_EXEC_PREFER_APPLETS) {
const struct BB_applet *a = find_applet_by_name(argv[0]);
if (a) {
if (a->nofork) {
rc = a->main(ap->exec_argc, argv);
goto f;
}
#ifndef BB_NOMMU
if (a->noexec) {
rc = fork();
if (rc) goto w;
current_applet = a;
run_current_applet_and_exit(ap->exec_argc, argv);
}
#endif
}
}
rc = spawn(argv);
w:
rc = wait4pid(rc);
rc = spawn_and_wait(argv);
if (rc < 0)
bb_perror_msg("%s", argv[0]);
f:
for (i = 0; i < ap->exec_argc; i++)
free(argv[i]);
return rc == 0; /* return 1 if success */
i = 0;
while (argv[i])
free(argv[i++]);
return rc == 0; /* return 1 if exitcode 0 */
}
#endif