--- libaitio/src/pty.c 2011/09/19 22:41:04 1.1.2.2 +++ libaitio/src/pty.c 2011/09/19 23:09:16 1.1.2.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: pty.c,v 1.1.2.2 2011/09/19 22:41:04 misho Exp $ +* $Id: pty.c,v 1.1.2.3 2011/09/19 23:09:16 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -47,7 +47,7 @@ SUCH DAMAGE. /* - * ioAllocPTY() Allocate new PTY + * ioAllocPTY() Allocate new PTY and TTY * @ptyfd = master fd, pty * @ttyfd = slave fd, tty * @name = tty device name if not null @@ -76,12 +76,12 @@ ioAllocPTY(int *ptyfd, int *ttyfd, char * __restrict n } /* - * ioFreePTY() Release PTY + * ioFreeTTY() Release TTY * @ttyname = tty filename * return: none */ inline void -ioFreePTY(const char *ttyname) +ioFreeTTY(const char *ttyname) { assert(ttyname); if (!ttyname) @@ -119,14 +119,14 @@ ioChgWinPTY(int ptyfd, u_short row, u_short col, u_sho } /* - * ioSetOwnerPTY() Set owner to PTY + * ioSetOwnerTTY() Set owner to TTY * @ttyname = tty filename * @UID = uid * @GID = gid * return: -1 error or 0 ok */ int -ioSetOwnerPTY(const char *ttyname, uid_t UID, gid_t GID) +ioSetOwnerTTY(const char *ttyname, uid_t UID, gid_t GID) { struct group *grp; gid_t gid; @@ -163,6 +163,59 @@ ioSetOwnerPTY(const char *ttyname, uid_t UID, gid_t GI LOGERR; return -1; } + + return 0; +} + +/* + * ioSetSidTTY() Makes the process's controlling TTY and sets it to sane modes. + * @ttyfd = slave fd, tty + * @ttyname = tty filename + * return: -1 error or 0 ok + */ +int +ioSetSidTTY(int *ttyfd, const char *ttyname) +{ + int fd; + + /* First disconnect from the old controlling tty. */ +#ifdef TIOCNOTTY + fd = open(_PATH_TTY, O_RDWR | O_NOCTTY); + if (fd >= 0) { + ioctl(fd, TIOCNOTTY, NULL); + close(fd); + } +#endif + setsid(); + + /* Verify that we are successfully disconnected from the controlling tty. */ + fd = open(_PATH_TTY, O_RDWR | O_NOCTTY); + if (fd >= 0) { + io_SetErr(ENXIO, "Error:: Failed to disconnect from controlling tty."); + close(fd); + return -1; + } + /* Make it our controlling tty. */ +#ifdef TIOCSCTTY + if (ioctl(*ttyfd, TIOCSCTTY, NULL) == -1) { + LOGERR; + return -1; + } +#endif + fd = open(ttyname, O_RDWR); + if (fd == -1) { + LOGERR; + return -1; + } else + close(fd); + + /* Verify that we now have a controlling tty. */ + fd = open(_PATH_TTY, O_WRONLY); + if (fd == -1) { + LOGERR; + return -1; + } else + close(fd); return 0; }