+ if (nfd < 0 && strcmp(device, "/dev/null"))
+ nfd = open("/dev/null", flags);
+
+ if (nfd < 0)
+ return -1;
+
+ fd = dup2(nfd, fd);
+
+ if (nfd > STDERR_FILENO)
+ close(nfd);
+
+ return (fd < 0) ? -1 : 0;
+}
+
+int patch_stdio(const char *device)
+{
+ int fd, rv = 0;
+ const char *fdname[3] = { "stdin", "stdout", "stderr" };
+
+ for (fd = STDIN_FILENO; fd <= STDERR_FILENO; fd++) {
+ if (patch_fd(device, fd, fd ? O_WRONLY : O_RDONLY)) {
+ ERROR("Failed to redirect %s to %s: %m\n",
+ fdname[fd], device);
+ rv = -1;
+ }
+ }