tty.c
来自「bbs server linux平台下软件源码」· C语言 代码 · 共 615 行 · 第 1/2 页
C
615 行
#endif /* USE_PTYS */ return 0; /* OK */}/**************************** TTY MODE stuffs ****************************/void get_term_mode(tty, termptr)int tty;struct term_mode *termptr;{#ifdef TIOCSLTC (void) ioctl(tty, TIOCGLTC, (char *) &(termptr->ltc));#endif#ifdef TIOCLSET (void) ioctl(tty, TIOCLGET, (char *) &(termptr->lmode));#endif#ifdef USE_SYSV_TERMIO (void) ioctl(tty, TCGETA, (char *) &(termptr->tio));#else /* USE_SYSV_TERMIO */ (void) ioctl(tty, TIOCGETP, (char *) &(termptr->sb)); (void) ioctl(tty, TIOCGETC, (char *) &(termptr->tc)); (void) ioctl(tty, TIOCGETD, (char *) &(termptr->ldis));#endif /* USE_SYSV_TERMIO */}void set_term_mode(tty, termptr)int tty;struct term_mode *termptr;{#ifdef TIOCSLTC (void) ioctl(tty, TIOCSLTC, (char *) &(termptr->ltc));#endif#ifdef TIOCLSET (void) ioctl(tty, TIOCLSET, (char *) &(termptr->lmode));#endif#ifdef USE_SYSV_TERMIO (void) ioctl(tty, TCSETA, (char *) &(termptr->tio));#else /* USE_SYSV_TERMIO */ (void) ioctl(tty, TIOCSETP, (char *) &(termptr->sb)); (void) ioctl(tty, TIOCSETC, (char *) &(termptr->tc)); (void) ioctl(tty, TIOCSETD, (char *) &(termptr->ldis));#endif /* USE_SYSV_TERMIO */}#ifndef _POSIX_VDISABLE#define _POSIX_VDISABLE 0 /* or 0377? */#endifvoid make_raw(oldtermptr, newtermptr)struct term_mode *oldtermptr, *newtermptr;{ *newtermptr = *oldtermptr;#ifdef TIOCSLTC newtermptr->ltc.t_suspc = 0377; newtermptr->ltc.t_dsuspc = 0377; newtermptr->ltc.t_flushc = 0377; newtermptr->ltc.t_lnextc = 0377;#endif#if defined(TIOCLSET) && defined(LPASS8) newtermptr->lmode |= LPASS8;#endif#ifdef USE_SYSV_TERMIO newtermptr->tio.c_iflag &= ~(ICRNL | IXON);# ifdef ISTRIP newtermptr->tio.c_iflag &= ~ISTRIP;# endif# ifdef ONLCR newtermptr->tio.c_oflag &= ~ONLCR;# endif newtermptr->tio.c_cflag |= CS8; newtermptr->tio.c_cflag &= ~(PARENB); newtermptr->tio.c_lflag &= ~(ICANON | ISIG | ECHO); newtermptr->tio.c_cc[VMIN] = 1; newtermptr->tio.c_cc[VTIME] = 0; newtermptr->tio.c_cc[VINTR] = _POSIX_VDISABLE; newtermptr->tio.c_cc[VQUIT] = _POSIX_VDISABLE; newtermptr->tio.c_cc[VINTR] = _POSIX_VDISABLE;# ifdef VSTART newtermptr->tio.c_cc[VSTART] = _POSIX_VDISABLE;# endif# ifdef VSTOP newtermptr->tio.c_cc[VSTOP] = _POSIX_VDISABLE;# endif# ifdef VDISCARD newtermptr->tio.c_cc[VDISCARD] = _POSIX_VDISABLE;# endif# ifdef VSUSP newtermptr->tio.c_cc[VSUSP] = _POSIX_VDISABLE;# endif# ifdef VDSUSP newtermptr->tio.c_cc[VDSUSP] = _POSIX_VDISABLE;# endif#else /* USE_SYSV_TERMIO */ newtermptr->sb.sg_flags &= ~(CRMOD | ECHO); newtermptr->sb.sg_flags |= CBREAK; newtermptr->tc.t_quitc = _POSIX_VDISABLE; newtermptr->tc.t_intrc = _POSIX_VDISABLE; newtermptr->tc.t_startc = _POSIX_VDISABLE; newtermptr->tc.t_stopc = _POSIX_VDISABLE;#endif /* USE_SYSV_TERMIO */}/******************************* UTMP stuffs *******************************/#include <utmp.h>#ifdef HAS_UTMPX# include <utmpx.h># define USE_SYSV_UTMP /* * utmpx is very similar to utmp */# define utmp utmpx# define ut_time ut_xtime# define setutent setutxent# define endutent endutxent# define getutid getutxid# define pututline pututxline#endif#ifdef USE_SYSV_UTMP# ifndef SVR4 /* otherwise declared in utmp.h */extern struct utmp *getutid();#if (! defined(linux))extern void pututline();#endifextern void setutent();extern void endutent();# endif /* !SVR4 */# ifndef SYSV386extern struct passwd *getpwuid();# endifextern time_t time();#else /* not USE_SYSV_UTMP */# define UTMP_FILENAME "/etc/utmp"#endif#ifdef CRAY# define PTYCHLEN 4#else# define PTYCHLEN 2#endif/* * addutmp() and rmutmp() will run in different processes -- * one in subsubprocess, and the other in subprocess. There is no way to * pass values or the status to each other by means of global variables. *//* addutmp() -- add a record to the utmp file */void addutmp(){ struct utmp utmp; struct passwd *pw;#ifndef USE_SYSV_UTMP int utmpf; int tslot;#endif pw = getpwuid(getuid());#ifdef USE_SYSV_UTMP (void) setutent(); /* * set up entry to search for */ (void) bzero((char *) &utmp, sizeof(struct utmp)); utmp.ut_type = DEAD_PROCESS; (void) strncpy((char *) utmp.ut_id, ttydev + strlen(ttydev) - PTYCHLEN, sizeof(utmp.ut_id)); /* * position to entry in utmp file */ (void) getutid(&utmp); /* * set up the new entry */ (void) bzero((char *) &utmp, sizeof(struct utmp)); utmp.ut_type = USER_PROCESS;# ifdef HAS_UTMPX utmpx.ut_exit.e_exit = 0; utmpx.ut_exit.e_termination = 0;# else# if !defined(linux) utmp.ut_exit.e_exit = 2;# endif# endif (void) strncpy((char *) utmp.ut_user, (pw && pw->pw_name) ? pw->pw_name : "???", sizeof(utmp.ut_user)); (void) strncpy((char *) utmp.ut_id, ttydev + strlen(ttydev) - PTYCHLEN, sizeof(utmp.ut_id)); utmp.ut_pid = getpid();# ifdef HAS_UTMPX utmpx.ut_syslen = 1; utmpx.ut_session = getsid(0); utmpx.ut_tv.tv_usec = 0;# endif#else /* USE_SYSV_UTMP */# ifndef apollo tslot = ttyslot();# else tslot = 1;# endif utmpf = open(UTMP_FILENAME, O_WRONLY); if (utmpf < 0) return; bzero((char *) &utmp, sizeof(struct utmp));#endif /* USE_SYSV_UTMP */ /* * common utmp fields */ (void) strncpy(utmp.ut_line, ttydev + strlen("/dev/"), sizeof(utmp.ut_line)); (void) strncpy(utmp.ut_name, (pw && pw->pw_name) ? pw->pw_name : "???", sizeof(utmp.ut_name)); utmp.ut_time = time((time_t *) 0);#ifdef USE_SYSV_UTMP (void) pututline(&utmp); (void) endutent();#else lseek(utmpf, (long) (tslot * sizeof(struct utmp)), 0); write(utmpf, (char *) &utmp, sizeof(struct utmp)); close(utmpf);#endif}void rmutmp(child_pid)int child_pid;{ struct utmp utmp;#ifdef USE_SYSV_UTMP struct utmp *utptr;#else int utmpf; int tslot;#endif#ifdef USE_SYSV_UTMP (void) setutent(); utmp.ut_type = USER_PROCESS; (void) bzero(utmp.ut_id, sizeof(utmp.ut_id)); (void) strncpy((char *) utmp.ut_id, ttydev + strlen(ttydev) - PTYCHLEN, sizeof(utmp.ut_id)); utptr = getutid(&utmp); /* * write it out only if it exists, and the pid's match */ if (utptr && (utptr->ut_pid == child_pid)) { utptr->ut_type = DEAD_PROCESS; utptr->ut_time = time((time_t *) 0); (void) pututline(utptr); } (void) endutent();#else /* USE_SYSV_UTMP */ utmpf = open(UTMP_FILENAME, O_RDWR); if (utmpf < 0) return; tslot = 0; while (read(utmpf, (char *) &utmp, sizeof(utmp)) == sizeof(utmp)) { if (strncmp(utmp.ut_line, ttydev + strlen("/dev/"), sizeof(utmp.ut_line)) != 0) { tslot++; continue; } /* * find the right slot */ utmp.ut_name[0] = '\0'; utmp.ut_time = time((time_t *) 0); lseek(utmpf, (long) (tslot * sizeof(struct utmp)), 0); write(utmpf, (char *) &utmp, sizeof(struct utmp)); close(utmpf); break; }#endif /* USE_SYSV_UTMP */ return;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?