openpty.c
来自「minix操作系统最新版本(3.1.1)的源代码」· C语言 代码 · 共 84 行
C
84 行
/* * openpty() tries to open a pty; applications won't have to * duplicate this code all the time (or change it if the system * pty interface changes). * * First version by Ben Gras <beng@few.vu.nl>, * Initially heavily based on telnetd/pty.c * by Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>. * */#include <libutil.h>#include <termios.h>#include <fcntl.h>#include <grp.h>#include <string.h>#include <stdlib.h>#include <errno.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/ioc_tty.h>#define DEV_DIR "/dev"/* * Allocate a PTY, by trying to open one repeatedly. */int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp){ char buff[128], temp[128]; register int i, j; int pty_fd = -1, gr; static char tty_name[128]; struct group *ttygroup; gid_t tty_gid = 0; if(!amaster || !aslave) { errno = EINVAL; return -1; } for(i = 'p'; i < 'w'; i++) { j = 0; do { sprintf(buff, "%s/pty%c%c", DEV_DIR, i, (j < 10) ? j + '0' : j + 'a' - 10); if((*amaster = open(buff, O_RDWR)) >= 0) { sprintf(tty_name, "%s/tty%c%c", DEV_DIR, i, (j < 10) ? j + '0' : j + 'a' - 10); if((*aslave = open(tty_name, O_RDWR)) >= 0) { break; } close(*amaster); } j++; if (j == 16) break; } while(1); /* Did we find one? */ if (j < 16) break; } if (*amaster < 0) { errno = ENOENT; return(-1); } setgrent(); ttygroup = getgrnam("tty"); endgrent(); if(ttygroup) tty_gid = ttygroup->gr_gid; if(name) strcpy(name, tty_name); /* Ignore errors on these. */ chown(tty_name, getuid(), tty_gid); chmod(tty_name, 0620); /* -rw--w---- */ if(termp) tcsetattr(*aslave, TCSAFLUSH, termp); if(winp) ioctl(*aslave, TIOCSWINSZ, winp); return(0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?