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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     1
/*
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     2
    Terminal Mixer - multi-point multi-user access to terminal applications
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     4
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     5
    Please find the license in the provided COPYING file.
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     6
*/
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     7
#include <sys/types.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     8
#include <unistd.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     9
#include <errno.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    10
#include <fcntl.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    11
#include <string.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    12
#include <stdlib.h>
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    13
#include <stdio.h>
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    14
#include <sys/ioctl.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    15
#include <termios.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    16
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    17
#include "main.h"
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    18
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    19
static int is_tios_saved = 0;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    20
static struct termios saved_tios;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    21
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    22
void prepare_user_terminal()
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    23
{
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    24
    int res;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    25
    struct termios tios;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    26
28
b73712b8370d use the termios calls to stdout instead of stdin.
viric@llimona
parents: 27
diff changeset
    27
    res = tcgetattr(1, &tios);
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    28
    if (res == -1)
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    29
        error("tcgetatttr");
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    30
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    31
    memcpy(&saved_tios, &tios, sizeof(struct termios));
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    32
    is_tios_saved = 1;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    33
72
d42f36e87bf3 Better terminal character passing.
viric@llimona
parents: 64
diff changeset
    34
    cfmakeraw(&tios);
d42f36e87bf3 Better terminal character passing.
viric@llimona
parents: 64
diff changeset
    35
    tios.c_lflag &= ~ECHO;
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    36
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    37
    res = tcsetattr(0, TCSANOW, &tios);
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    38
    if (res == -1)
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    39
        error("tcsetatttr");
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    40
}
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    41
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    42
void restore_user_terminal()
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    43
{
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    44
    int res;
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    45
    res = tcsetattr(0, TCSANOW, &saved_tios);
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    46
    if (res == -1)
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    47
    {
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    48
        /* cannot call error(), because it calls finish(), then
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    49
         * restore_user_terminal() */
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    50
        fprintf(stderr,"tcsetatttr failed: %s", strerror(errno));
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    51
        exit(-1);
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 28
diff changeset
    52
    }
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    53
}
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    54
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    55
void finish(int ret)
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    56
{
27
014831063421 Fixed bug in the finish() code - it always set the saved_tios.
viric@llimona
parents: 26
diff changeset
    57
    if (is_tios_saved)
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    58
        restore_user_terminal();
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    59
    exit(ret);
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    60
}