static void setupTerminal(void) { int _stdin, _stdout, _stderr; boolean_t ctty = B_FALSE; char *data; char *log_config = "{}"; char *log_driver = "json-file"; boolean_t open_stdin = getStdinStatus(); if ((data = mdataGet("docker:tty")) != NULL) { if (strcmp("true", data) == 0) { ctty = B_TRUE; } free(data); } if ((data = mdataGet("docker:logdriver")) != NULL) { if (strcmp("json-file", data) != 0) { log_driver = strdup(data); if (log_driver == NULL) { fatal(ERR_STRDUP, "unable to strdup() logdriver: %s\n", strerror(errno)); } } free(data); } if ((data = mdataGet("docker:logconfig")) != NULL) { log_config = strdup(data); if (log_config == NULL) { fatal(ERR_STRDUP, "unable to strdup() logconfig: %s\n", strerror(errno)); } free(data); } dlog("INFO logdriver %s\n", log_driver); dlog("INFO logconfig %s\n", log_config); dlog("SWITCHING TO /dev/zfd/*\n"); /* * If 'OpenStdin' is set on the container we reopen stdin as connected to * the zfd. Otherwise we leave it opened as /dev/null. */ if (open_stdin) { if (close(0) == -1) { fatal(ERR_CLOSE, "failed to close(0): %s\n", strerror(errno)); } _stdin = open("/dev/zfd/0", O_RDWR); if (_stdin == -1) { if (errno == ENOENT) { _stdin = open("/dev/null", O_RDONLY); if (_stdin == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/null: %s\n", strerror(errno)); } } else { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } } } /* * When we're not using json-file, we want to fork a logger child to handle * the logging driver. */ if (strcmp("json-file", log_driver) != 0 && strcmp("none", log_driver) != 0) { fatal(ERR_UNKNOWN_LOG_DRIVER, "unsupported log driver: '%s'\n", log_driver); } if (close(1) == -1) { fatal(ERR_CLOSE, "failed to close(1): %s\n", strerror(errno)); } if (close(2) == -1) { fatal(ERR_CLOSE, "failed to close(2): %s\n", strerror(errno)); } if (ctty) { /* Configure output as a controlling terminal */ _stdout = open("/dev/zfd/0", O_WRONLY); if (_stdout == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } _stderr = open("/dev/zfd/0", O_WRONLY); if (_stderr == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } if (setsid() < 0) { fatal(ERR_OPEN_CONSOLE, "failed to create process session: %s\n", strerror(errno)); } if (ioctl(_stdout, TIOCSCTTY, NULL) < 0) { fatal(ERR_OPEN_CONSOLE, "failed set controlling tty: %s\n", strerror(errno)); } } else { /* Configure individual pipe style output */ _stdout = open("/dev/zfd/1", O_WRONLY); if (_stdout == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/1: %s\n", strerror(errno)); } _stderr = open("/dev/zfd/2", O_WRONLY); if (_stderr == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/2: %s\n", strerror(errno)); } } }
static void setupTerminal(boolean_t ctty) { int _stdin, _stdout, _stderr; boolean_t open_stdin = getStdinStatus(); dlog("SWITCHING TO /dev/zfd/*\n"); /* * If 'OpenStdin' is set on the container we reopen stdin as connected to * the zfd. Otherwise we leave it opened as /dev/null. */ if (open_stdin) { if (close(0) == -1) { fatal(ERR_CLOSE, "failed to close(0): %s\n", strerror(errno)); } _stdin = zfd_open("/dev/zfd/0", O_RDWR); if (_stdin == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } assertFd(_stdin, STDIN_FILENO); } if (close(1) == -1) { fatal(ERR_CLOSE, "failed to close(1): %s\n", strerror(errno)); } if (close(2) == -1) { fatal(ERR_CLOSE, "failed to close(2): %s\n", strerror(errno)); } if (ctty) { /* Configure output as a controlling terminal */ _stdout = zfd_open("/dev/zfd/0", O_WRONLY); if (_stdout == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } assertFd(_stdout, STDOUT_FILENO); _stderr = zfd_open("/dev/zfd/0", O_WRONLY); if (_stderr == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } assertFd(_stderr, STDERR_FILENO); if (setsid() < 0) { fatal(ERR_OPEN_CONSOLE, "failed to create process session: %s\n", strerror(errno)); } if (ioctl(_stdout, TIOCSCTTY, NULL) < 0) { fatal(ERR_OPEN_CONSOLE, "failed set controlling tty: %s\n", strerror(errno)); } } else { /* Configure individual pipe style output */ _stdout = zfd_open("/dev/zfd/1", O_WRONLY); if (_stdout == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/1: %s\n", strerror(errno)); } assertFd(_stdout, STDOUT_FILENO); _stderr = zfd_open("/dev/zfd/2", O_WRONLY); if (_stderr == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/2: %s\n", strerror(errno)); } assertFd(_stderr, STDERR_FILENO); } }
static void setupTerminal(void) { int _stdin, _stdout, _stderr; boolean_t ctty = B_FALSE; char *data; boolean_t open_stdin = getStdinStatus(); if ((data = mdataGet("docker:tty")) != NULL) { if (strcmp("true", data) == 0) { ctty = B_TRUE; } free(data); } dlog("SWITCHING TO /dev/zfd/*\n"); /* * If 'OpenStdin' is set on the container we reopen stdin as connected to * the zfd. Otherwise we leave it opened as /dev/null. */ if (open_stdin) { if (close(0) == -1) { fatal(ERR_CLOSE, "failed to close(0): %s\n", strerror(errno)); } _stdin = open("/dev/zfd/0", O_RDWR); if (_stdin == -1) { if (errno == ENOENT) { _stdin = open("/dev/null", O_RDONLY); if (_stdin == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/null: %s\n", strerror(errno)); } } else { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } } } if (close(1) == -1) { fatal(ERR_CLOSE, "failed to close(1): %s\n", strerror(errno)); } if (close(2) == -1) { fatal(ERR_CLOSE, "failed to close(2): %s\n", strerror(errno)); } if (ctty) { /* Configure output as a controlling terminal */ _stdout = open("/dev/zfd/0", O_WRONLY); if (_stdout == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } _stderr = open("/dev/zfd/0", O_WRONLY); if (_stderr == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/0: %s\n", strerror(errno)); } if (setsid() < 0) { fatal(ERR_OPEN_CONSOLE, "failed to create process session: %s\n", strerror(errno)); } if (ioctl(_stdout, TIOCSCTTY, NULL) < 0) { fatal(ERR_OPEN_CONSOLE, "failed set controlling tty: %s\n", strerror(errno)); } } else { /* Configure individual pipe style output */ _stdout = open("/dev/zfd/1", O_WRONLY); if (_stdout == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/1: %s\n", strerror(errno)); } _stderr = open("/dev/zfd/2", O_WRONLY); if (_stderr == -1) { fatal(ERR_OPEN_CONSOLE, "failed to open /dev/zfd/2: %s\n", strerror(errno)); } } }