user_term.c
author viric@llimona
Mon, 08 Oct 2007 12:59:27 +0200
changeset 79 7d316733d4b1
parent 72 d42f36e87bf3
child 82 5cbe47923060
permissions -rw-r--r--
Added filterdes.

/*
    Terminal Mixer - multi-point multi-user access to terminal applications
    Copyright (C) 2007  LluĂ­s Batlle i Rossell

    Please find the license in the provided COPYING file.
*/
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <termios.h>

#include "main.h"

static int is_tios_saved = 0;
static struct termios saved_tios;

void prepare_user_terminal()
{
    int res;
    struct termios tios;

    res = tcgetattr(1, &tios);
    if (res == -1)
        error("tcgetatttr");

    memcpy(&saved_tios, &tios, sizeof(struct termios));
    is_tios_saved = 1;

    cfmakeraw(&tios);
    tios.c_lflag &= ~ECHO;

    res = tcsetattr(0, TCSANOW, &tios);
    if (res == -1)
        error("tcsetatttr");
}

void restore_user_terminal()
{
    int res;
    res = tcsetattr(0, TCSANOW, &saved_tios);
    if (res == -1)
    {
        /* cannot call error(), because it calls finish(), then
         * restore_user_terminal() */
        fprintf(stderr,"tcsetatttr failed: %s", strerror(errno));
        exit(-1);
    }
}

void finish(int ret)
{
    if (is_tios_saved)
        restore_user_terminal();
    exit(ret);
}