#ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "%s [terminal command...]\n", argv[0]); return 1; } int master = -1, slave = -1, outcome = 0; openpty(&master, &slave, NULL, NULL, NULL); pid_t process = fork(); if (process < 0) { fprintf(stderr, "error allocating ptty: %s\n", strerror(errno)); return 1; } else if (process != 0) { close(master); FILE *terminal = fdopen((slave = slave), "a+"); Py_InitializeEx(0); PyRun_SimpleString("import sys, os"); char redirect[128]; snprintf(redirect, sizeof redirect, "sys.stdin = os.fdopen(%i, \"r\")", (int) slave); PyRun_SimpleString(redirect); snprintf(redirect, sizeof redirect, "sys.stdout = os.fdopen(%i, \"w\")", (int) slave); PyRun_SimpleString(redirect); snprintf(redirect, sizeof redirect, "sys.stderr = os.fdopen(%i, \"w\")", (int) slave); PyRun_SimpleString(redirect); PyRun_SimpleString("import readline"); fprintf(terminal, "***** Interactive Python Terminal (%i on %s) *****\n", getpid(), ttyname(slave)); outcome = PyRun_InteractiveLoop(terminal, ""); fclose(terminal); PyRun_SimpleString("sys.stdin = sys.__stdin__"); PyRun_SimpleString("sys.stdout = sys.__stdout__"); PyRun_SimpleString("sys.stderr = sys.__stderr__"); Py_Finalize(); } else { //run xterm close(slave); login_tty(master); execvp(argv[1], argv + 1); fprintf(stderr, "execvp error: %s\n", strerror(errno)); _exit(0); } return 0; }