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 + -
显示快捷键?