my_system: cleanup and propagate exitstatus

Origin commit data
------------------
Branch: ni/coolstream
Commit: e1df8ebafd
Author: Stefan Seyfried <seife@tuxbox-git.slipkontur.de>
Date: 2013-03-24 (Sun, 24 Mar 2013)


------------------
No further description and justification available within origin commit message!

------------------
This commit was generated by Migit
This commit is contained in:
Stefan Seyfried
2013-03-24 11:38:09 +01:00
parent 299ff29d6d
commit 65a057a0be

View File

@@ -103,7 +103,7 @@ int my_system(int argc, const char *arg, ...)
case -1: /* can't vfork */
perror("vfork");
ret = -errno;
goto out;
break;
case 0: /* child process */
for(i = 3; i < maxfd; i++)
close(i);
@@ -111,21 +111,17 @@ int my_system(int argc, const char *arg, ...)
perror("my_system setsid");
if (execvp(argv[0], (char * const *)argv))
{
if (errno != ENOENT) { /* don't complain if argv[0] only does not exist */
std::string txt = "ERROR: my_system \"" + (std::string) argv[0] + "\"";
perror(txt.c_str());
}
ret = -errno;
if (errno != ENOENT) /* don't complain if argv[0] only does not exist */
fprintf(stderr, "ERROR: my_system \"%s\": %m\n", argv[0]);
}
_exit (0); // terminate c h i l d proces s only
_exit(ret); // terminate c h i l d proces s only
default: /* parent returns to calling process */
waitpid(pid, &childExit, 0);
if (WEXITSTATUS(childExit) != 0)
ret = (signed char)WEXITSTATUS(childExit);
break;
}
/* it is probably pure luck that ret gets propagated back from child to parent */
waitpid(pid, &childExit, 0);
if(childExit != 0)
ret = childExit;
out:
va_end(args);
return ret;
}