int r = 0;
// Fetch file descriptors from context
- const int stdout = ctx->pipes.stdout[1];
- const int stderr = ctx->pipes.stderr[1];
+ const int stdout = ctx->pipes.stdout[0];
+ const int stderr = ctx->pipes.stderr[0];
const int pidfd = ctx->pidfd;
+ // Close any unused file descriptors
+ if (ctx->pipes.stdout[1]) {
+ close(ctx->pipes.stdout[1]);
+ ctx->pipes.stdout[1] = 0;
+ }
+ if (ctx->pipes.stderr[1]) {
+ close(ctx->pipes.stderr[1]);
+ ctx->pipes.stderr[1] = 0;
+ }
+
+ // Make a list of all file descriptors we are interested in
int fds[] = {
stdout, stderr, pidfd,
};
}
}
+ // Connect standard output and error
+ if (ctx->pipes.stdout[1] && ctx->pipes.stderr[1]) {
+ r = dup2(ctx->pipes.stdout[1], STDOUT_FILENO);
+ if (r < 0) {
+ ERROR(jail->pakfire, "Could not connect fd %d to stdout: %m\n",
+ ctx->pipes.stdout[1]);
+
+ return 1;
+ }
+
+ r = dup2(ctx->pipes.stderr[1], STDERR_FILENO);
+ if (r < 0) {
+ ERROR(jail->pakfire, "Could not connect fd %d to stderr: %m\n",
+ ctx->pipes.stderr[1]);
+
+ return 1;
+ }
+
+ // Close the reading sides of the pipe
+ close(ctx->pipes.stdout[0]);
+ close(ctx->pipes.stderr[0]);
+ }
+
// Reset open file limit (http://0pointer.net/blog/file-descriptor-limits.html)
r = pakfire_rlimit_reset_nofile(jail->pakfire);
if (r)