OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [uclinux/] [userland/] [telnet/] [terminal.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 763 simons
/*
2
 * Copyright (c) 1988, 1990, 1993
3
 *      The Regents of the University of California.  All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * 1. Redistributions of source code must retain the above copyright
9
 *    notice, this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright
11
 *    notice, this list of conditions and the following disclaimer in the
12
 *    documentation and/or other materials provided with the distribution.
13
 * 3. All advertising materials mentioning features or use of this software
14
 *    must display the following acknowledgement:
15
 *      This product includes software developed by the University of
16
 *      California, Berkeley and its contributors.
17
 * 4. Neither the name of the University nor the names of its contributors
18
 *    may be used to endorse or promote products derived from this software
19
 *    without specific prior written permission.
20
 *
21
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
 * SUCH DAMAGE.
32
 */
33
 
34
#ifndef lint
35
static char sccsid[] = "@(#)terminal.c  8.1 (Berkeley) 6/6/93";
36
#endif /* not lint */
37
 
38
#include <arpa/telnet.h>
39
#include <sys/types.h>
40
 
41
#include <stdlib.h>
42
 
43
#include "ring.h"
44
 
45
#include "externs.h"
46
#include "types.h"
47
 
48
Ring            ttyoring, ttyiring;
49
unsigned char   ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ];
50
 
51
int termdata;                   /* Debugging flag */
52
 
53
#ifdef  USE_TERMIO
54
# ifndef VDISCARD
55
cc_t termFlushChar;
56
# endif
57
# ifndef VLNEXT
58
cc_t termLiteralNextChar;
59
# endif
60
# ifndef VSUSP
61
cc_t termSuspChar;
62
# endif
63
# ifndef VWERASE
64
cc_t termWerasChar;
65
# endif
66
# ifndef VREPRINT
67
cc_t termRprntChar;
68
# endif
69
# ifndef VSTART
70
cc_t termStartChar;
71
# endif
72
# ifndef VSTOP
73
cc_t termStopChar;
74
# endif
75
# ifndef VEOL
76
cc_t termForw1Char;
77
# endif
78
# ifndef VEOL2
79
cc_t termForw2Char;
80
# endif
81
# ifndef VSTATUS
82
cc_t termAytChar;
83
# endif
84
#else
85
cc_t termForw2Char;
86
cc_t termAytChar;
87
#endif
88
 
89
/*
90
 * initialize the terminal data structures.
91
 */
92
 
93
    void
94
init_terminal()
95
{
96
    if (ring_init(&ttyoring, ttyobuf, sizeof ttyobuf) != 1) {
97
        exit(1);
98
    }
99
    if (ring_init(&ttyiring, ttyibuf, sizeof ttyibuf) != 1) {
100
        exit(1);
101
    }
102
    autoflush = TerminalAutoFlush();
103
}
104
 
105
 
106
/*
107
 *              Send as much data as possible to the terminal.
108
 *
109
 *              Return value:
110
 *                      -1: No useful work done, data waiting to go out.
111
 *                       0: No data was waiting, so nothing was done.
112
 *                       1: All waiting data was written out.
113
 *                       n: All data - n was written out.
114
 */
115
 
116
 
117
    int
118
ttyflush(drop)
119
    int drop;
120
{
121
    register int n, n0, n1;
122
 
123
    n0 = ring_full_count(&ttyoring);
124
    if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) {
125
        if (drop) {
126
            TerminalFlushOutput();
127
            /* we leave 'n' alone! */
128
        } else {
129
            n = TerminalWrite(ttyoring.consume, n);
130
        }
131
    }
132
    if (n > 0) {
133
        if (termdata && n) {
134
            Dump('>', ttyoring.consume, n);
135
        }
136
        /*
137
         * If we wrote everything, and the full count is
138
         * larger than what we wrote, then write the
139
         * rest of the buffer.
140
         */
141
        if (n1 == n && n0 > n) {
142
                n1 = n0 - n;
143
                if (!drop)
144
                        n1 = TerminalWrite(ttyoring.bottom, n1);
145
                if (n1 > 0)
146
                        n += n1;
147
        }
148
        ring_consumed(&ttyoring, n);
149
    }
150
    if (n < 0)
151
        return -1;
152
    if (n == n0) {
153
        if (n0)
154
            return -1;
155
        return 0;
156
    }
157
    return n0 - n + 1;
158
}
159
 
160
 
161
/*
162
 * These routines decides on what the mode should be (based on the values
163
 * of various global variables).
164
 */
165
 
166
 
167
    int
168
getconnmode()
169
{
170
    extern int linemode;
171
    int mode = 0;
172
#ifdef  KLUDGELINEMODE
173
    extern int kludgelinemode;
174
#endif
175
 
176
    if (In3270)
177
        return(MODE_FLOW);
178
 
179
    if (my_want_state_is_dont(TELOPT_ECHO))
180
        mode |= MODE_ECHO;
181
 
182
    if (localflow)
183
        mode |= MODE_FLOW;
184
 
185
    if (my_want_state_is_will(TELOPT_BINARY))
186
        mode |= MODE_INBIN;
187
 
188
    if (his_want_state_is_will(TELOPT_BINARY))
189
        mode |= MODE_OUTBIN;
190
 
191
#ifdef  KLUDGELINEMODE
192
    if (kludgelinemode) {
193
        if (my_want_state_is_dont(TELOPT_SGA)) {
194
            mode |= (MODE_TRAPSIG|MODE_EDIT);
195
            if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) {
196
                mode &= ~MODE_ECHO;
197
            }
198
        }
199
        return(mode);
200
    }
201
#endif
202
    if (my_want_state_is_will(TELOPT_LINEMODE))
203
        mode |= linemode;
204
    return(mode);
205
}
206
 
207
    void
208
setconnmode(force)
209
    int force;
210
{
211
    register int newmode;
212
 
213
    newmode = getconnmode()|(force?MODE_FORCE:0);
214
 
215
    TerminalNewMode(newmode);
216
 
217
 
218
}
219
 
220
 
221
    void
222
setcommandmode()
223
{
224
    TerminalNewMode(-1);
225
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.