user_term.c
author viric@llimona
Mon, 24 Sep 2007 13:59:40 +0200
changeset 38 f1e581c862d5
parent 28 b73712b8370d
child 49 1cead94cfd99
permissions -rw-r--r--
Improved help. Moving to 0.2.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     1
#include <sys/types.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     2
#include <unistd.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     3
#include <errno.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     4
#include <fcntl.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     5
#include <string.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     6
#include <stdlib.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     7
#include <sys/ioctl.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     8
#include <termios.h>
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
     9
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    10
#include "main.h"
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    11
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    12
static int is_tios_saved = 0;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    13
static struct termios saved_tios;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    14
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    15
void prepare_user_terminal()
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
    int res;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    18
    struct termios tios;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    19
28
b73712b8370d use the termios calls to stdout instead of stdin.
viric@llimona
parents: 27
diff changeset
    20
    res = tcgetattr(1, &tios);
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    21
    if (res == -1)
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    22
        error("tcgetatttr");
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
    memcpy(&saved_tios, &tios, sizeof(struct termios));
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    25
    is_tios_saved = 1;
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    27
    tios.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN);
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    28
    /*cfmakeraw(&tios);*/
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    29
28
b73712b8370d use the termios calls to stdout instead of stdin.
viric@llimona
parents: 27
diff changeset
    30
    res = tcsetattr(1, TCSANOW, &tios);
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    31
    if (res == -1)
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    32
        error("tcsetatttr");
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
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    35
void restore_user_terminal()
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    36
{
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    37
    int res;
28
b73712b8370d use the termios calls to stdout instead of stdin.
viric@llimona
parents: 27
diff changeset
    38
    res = tcsetattr(1, TCSANOW, &saved_tios);
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    39
    if (res == -1)
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    40
        error("tcsetatttr");
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
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    43
void finish(int ret)
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    44
{
27
014831063421 Fixed bug in the finish() code - it always set the saved_tios.
viric@llimona
parents: 26
diff changeset
    45
    if (is_tios_saved)
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    46
        restore_user_terminal();
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    47
    exit(ret);
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
diff changeset
    48
}