summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysinstall/termcap.c
blob: 0df0a77cb5edd8c5f574b5650fa333df96b7fbb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
 * Copyright (c) 1994, Paul Richards.
 *
 * All rights reserved.
 *
 * This software may be used, modified, copied, distributed, and sold, in both
 * source and binary form provided that the above copyright and these terms
 * are retained, verbatim, as the first lines of this file.  Under no
 * circumstances is the author responsible for the proper functioning of this
 * software, nor does the author assume any responsibility for damages
 * incurred with its use.
 *
 * $FreeBSD$
 */

#include "sysinstall.h"
#include <stdarg.h>
#include <fcntl.h>
#include <sys/errno.h>
#include <sys/ioctl.h>
#include <sys/consio.h>

#define VTY_STATUS_LINE    24
#define TTY_STATUS_LINE    23

static void
prompt_term(char **termp, char **termcapp)
{
    char str[80];
    static struct {
	const char *term, *termcap;
    } lookup[] = { { "ansi", termcap_ansi },
		   { "vt100", termcap_vt100 },
		   { "cons25", termcap_cons25 },
		   { "cons25-m", termcap_cons25_m },
		   { "xterm", termcap_xterm },
		   { "cons25w", termcap_cons25w } }; /* must be last */

    if (RunningAsInit) {
	while (1) {
	    int i;

	    printf("\nThese are the predefined terminal types available to\n");
	    printf("sysinstall when running stand-alone.  Please choose the\n");
	    printf("closest match for your particular terminal.\n\n");
	    printf("1 ...................... Standard ANSI terminal.\n");
	    printf("2 ...................... VT100 or compatible terminal.\n");
	    printf("3 ...................... FreeBSD system console (color).\n");
	    printf("4 ...................... FreeBSD system console (monochrome).\n\n");
	    printf("5 ...................... xterm terminal emulator.\n\n");
	    printf("Your choice: (1-5) ");
	    fflush(stdout);
	    fgets(str, sizeof(str), stdin);
	    i = str[0] - '0';
	    if (i > 0 && i < 6) {
		*termp = (char *)lookup[i - 1].term;
		*termcapp = (char *)lookup[i - 1].termcap;
		break;
	    }
	    else
		printf("\007Invalid choice, please try again.\n\n");
	}
    }
    else {
	printf("\nPlease set your TERM variable before running this program.\n");
	printf("Defaulting to an ANSI compatible terminal - please press RETURN\n");
	fgets(str, sizeof(str), stdin);	/* Just to make it interactive */
	*termp = (char *)"ansi";
	*termcapp = (char *)termcap_ansi;
    }
}

int
set_termcap(void)
{
    char           *term;
    int		   stat;
    struct winsize ws;

    term = getenv("TERM");
    stat = ioctl(STDERR_FILENO, GIO_COLOR, &ColorDisplay);

    if (!RunningAsInit) {
	if (isDebug())
	    DebugFD = open("sysinstall.debug", O_WRONLY|O_CREAT|O_TRUNC, 0644);
	else
	    DebugFD = -1;
	if (DebugFD < 0)
	    DebugFD = open("/dev/null", O_RDWR, 0);
    }

    if (!OnVTY || (stat < 0)) {
	if (!term) {
	    char *term, *termcap;

	    prompt_term(&term, &termcap);
	    if (setenv("TERM", term, 1) < 0)
		return -1;
	    if (setenv("TERMCAP", termcap, 1) < 0)
		return -1;
	}
	if (DebugFD < 0)
	    DebugFD = open("/dev/null", O_RDWR, 0);
    }
    else {
	int i, on;

	if (getpid() == 1) {
	    DebugFD = open("/dev/ttyv1", O_WRONLY);
	    if (DebugFD != -1) {
		on = 1;
		i = ioctl(DebugFD, TIOCCONS, (char *)&on);
		msgDebug("ioctl(%d, TIOCCONS, NULL) = %d (%s)\n",
			 DebugFD, i, !i ? "success" : strerror(errno));
	    }
	}

#ifdef PC98
	if (!term) {
	    if (setenv("TERM", "cons25w", 1) < 0)
		return -1;
	    if (setenv("TERMCAP", termcap_cons25w, 1) < 0)
		return -1;
	}
#else
	if (ColorDisplay) {
	    if (!term) {
		if (setenv("TERM", "cons25", 1) < 0)
		    return -1;
		if (setenv("TERMCAP", termcap_cons25, 1) < 0)
		    return -1;
	    }
	}
	else {
	    if (!term) {
		if (setenv("TERM", "cons25-m", 1) < 0)
		    return -1;
		if (setenv("TERMCAP", termcap_cons25_m, 1) < 0)
		    return -1;
	    }
	}
#endif
    }
    if (ioctl(0, TIOCGWINSZ, &ws) == -1) {
	msgDebug("Unable to get terminal size - errno %d\n", errno);
	ws.ws_row = 0;
    }
    StatusLine = ws.ws_row ? ws.ws_row - 1: (OnVTY ? VTY_STATUS_LINE : TTY_STATUS_LINE);
    return 0;
}
OpenPOWER on IntegriCloud