user_term.c
author viric@llimona
Sun, 17 Feb 2008 22:27:55 +0100
changeset 88 a7f546938313
parent 82 5cbe47923060
permissions -rw-r--r--
Adding port number on the ethernet protocol.
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)
82
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 72
diff changeset
    29
    {
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 72
diff changeset
    30
        debugmsg("tcgetattr(1) failed - not a terminal");
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 72
diff changeset
    31
        return;
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 72
diff changeset
    32
    }
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    33
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    34
    memcpy(&saved_tios, &tios, sizeof(struct termios));
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    35
    is_tios_saved = 1;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    36
72
d42f36e87bf3 Better terminal character passing.
viric@llimona
parents: 64
diff changeset
    37
    cfmakeraw(&tios);
d42f36e87bf3 Better terminal character passing.
viric@llimona
parents: 64
diff changeset
    38
    tios.c_lflag &= ~ECHO;
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    39
82
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 72
diff changeset
    40
    res = tcsetattr(1, TCSANOW, &tios);
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    41
    if (res == -1)
82
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 72
diff changeset
    42
        debugmsg("tcsetattr(1) failed - not a terminal");
26
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
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    45
void restore_user_terminal()
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    46
{
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    47
    int res;
82
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 72
diff changeset
    48
    res = tcsetattr(1, TCSANOW, &saved_tios);
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    49
    if (res == -1)
82
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 72
diff changeset
    50
        debugmsg("tcsetatttr failed: %s", strerror(errno));
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    51
}
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    52
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    53
void finish(int ret)
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    54
{
27
014831063421 Fixed bug in the finish() code - it always set the saved_tios.
viric@llimona
parents: 26
diff changeset
    55
    if (is_tios_saved)
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    56
        restore_user_terminal();
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    57
    exit(ret);
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    58
}