int orte_iof_base_setup_prefork(orte_iof_base_io_conf_t *opts) { int ret = -1; fflush(stdout); /* first check to make sure we can do ptys */ #if OPAL_ENABLE_PTY_SUPPORT if (opts->usepty) { /** * It has been reported that on MAC OS X 10.4 and prior one cannot * safely close the writing side of a pty before completly reading * all data inside. * There seems to be two issues: first all pending data is * discarded, and second it randomly generate kernel panics. * Apparently this issue was fixed in 10.5 so by now we use the * pty exactly as we use the pipes. * This comment is here as a reminder. */ ret = opal_openpty(&(opts->p_stdout[0]), &(opts->p_stdout[1]), (char*)NULL, (struct termios*)NULL, (struct winsize*)NULL); } #else opts->usepty = 0; #endif #if defined(__WINDOWS__) /* Windows doesn't have a 'pipe' function. * So we need to do something a bit more complex */ /* * http://www-106.ibm.com/developerworks/linux/library/l-rt4/?open&t=grl,l=252,p=pipes */ #else if (ret < 0) { if (pipe(opts->p_stdout) < 0) { ORTE_ERROR_LOG(ORTE_ERR_SYS_LIMITS_PIPES); return ORTE_ERR_SYS_LIMITS_PIPES; } } if (pipe(opts->p_stdin) < 0) { ORTE_ERROR_LOG(ORTE_ERR_SYS_LIMITS_PIPES); return ORTE_ERR_SYS_LIMITS_PIPES; } if (pipe(opts->p_stderr) < 0) { ORTE_ERROR_LOG(ORTE_ERR_SYS_LIMITS_PIPES); return ORTE_ERR_SYS_LIMITS_PIPES; } if (pipe(opts->p_internal) < 0) { ORTE_ERROR_LOG(ORTE_ERR_SYS_LIMITS_PIPES); return ORTE_ERR_SYS_LIMITS_PIPES; } #endif return ORTE_SUCCESS; }
int orte_iof_base_setup_prefork(orte_iof_base_io_conf_t *opts) { int ret = -1; fflush(stdout); /* first check to make sure we can do ptys */ #if OPAL_ENABLE_PTY_SUPPORT if (opts->usepty) { /** * It has been reported that on MAC OS X 10.4 and prior one cannot * safely close the writing side of a pty before completly reading * all data inside. * There seems to be two issues: first all pending data is * discarded, and second it randomly generate kernel panics. * Apparently this issue was fixed in 10.5 so by now we use the * pty exactly as we use the pipes. * This comment is here as a reminder. */ ret = opal_openpty(&(opts->p_stdout[0]), &(opts->p_stdout[1]), (char*)NULL, (struct termios*)NULL, (struct winsize*)NULL); } #else opts->usepty = 0; #endif if (ret < 0) { opts->usepty = 0; if (pipe(opts->p_stdout) < 0) { ORTE_ERROR_LOG(ORTE_ERR_SYS_LIMITS_PIPES); return ORTE_ERR_SYS_LIMITS_PIPES; } } if (opts->connect_stdin) { if (pipe(opts->p_stdin) < 0) { ORTE_ERROR_LOG(ORTE_ERR_SYS_LIMITS_PIPES); return ORTE_ERR_SYS_LIMITS_PIPES; } } if( !orte_iof_base.redirect_app_stderr_to_stdout ) { if (pipe(opts->p_stderr) < 0) { ORTE_ERROR_LOG(ORTE_ERR_SYS_LIMITS_PIPES); return ORTE_ERR_SYS_LIMITS_PIPES; } } #if OPAL_PMIX_V1 if (pipe(opts->p_internal) < 0) { ORTE_ERROR_LOG(ORTE_ERR_SYS_LIMITS_PIPES); return ORTE_ERR_SYS_LIMITS_PIPES; } #endif return ORTE_SUCCESS; }