summaryrefslogtreecommitdiff
path: root/third_party/uip-1.0/doc/html/a00044.html
blob: 40e5ad25700378337ba66b17f234780e9d56285e (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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>uIP 1.0: telnetd.c</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.6 -->
<div class="tabs">
  <ul>
    <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
    <li><a href="files.html"><span>Files</span></a></li>
    <li><a href="examples.html"><span>Examples</span></a></li>
  </ul></div>
<h1>telnetd.c</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> * Copyright (c) 2003, Adam Dunkels.</span>
<a name="l00003"></a>00003 <span class="comment"> * All rights reserved.</span>
<a name="l00004"></a>00004 <span class="comment"> *</span>
<a name="l00005"></a>00005 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
<a name="l00006"></a>00006 <span class="comment"> * modification, are permitted provided that the following conditions</span>
<a name="l00007"></a>00007 <span class="comment"> * are met:</span>
<a name="l00008"></a>00008 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
<a name="l00009"></a>00009 <span class="comment"> *    notice, this list of conditions and the following disclaimer.</span>
<a name="l00010"></a>00010 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
<a name="l00011"></a>00011 <span class="comment"> *    notice, this list of conditions and the following disclaimer in the</span>
<a name="l00012"></a>00012 <span class="comment"> *    documentation and/or other materials provided with the distribution.</span>
<a name="l00013"></a>00013 <span class="comment"> * 3. The name of the author may not be used to endorse or promote</span>
<a name="l00014"></a>00014 <span class="comment"> *    products derived from this software without specific prior</span>
<a name="l00015"></a>00015 <span class="comment"> *    written permission.</span>
<a name="l00016"></a>00016 <span class="comment"> *</span>
<a name="l00017"></a>00017 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS</span>
<a name="l00018"></a>00018 <span class="comment"> * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED</span>
<a name="l00019"></a>00019 <span class="comment"> * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
<a name="l00020"></a>00020 <span class="comment"> * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY</span>
<a name="l00021"></a>00021 <span class="comment"> * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
<a name="l00022"></a>00022 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE</span>
<a name="l00023"></a>00023 <span class="comment"> * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
<a name="l00024"></a>00024 <span class="comment"> * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,</span>
<a name="l00025"></a>00025 <span class="comment"> * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING</span>
<a name="l00026"></a>00026 <span class="comment"> * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span>
<a name="l00027"></a>00027 <span class="comment"> * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
<a name="l00028"></a>00028 <span class="comment"> *</span>
<a name="l00029"></a>00029 <span class="comment"> * This file is part of the uIP TCP/IP stack</span>
<a name="l00030"></a>00030 <span class="comment"> *</span>
<a name="l00031"></a>00031 <span class="comment"> * $Id: telnetd.c,v 1.2 2006/06/07 09:43:54 adam Exp $</span>
<a name="l00032"></a>00032 <span class="comment"> *</span>
<a name="l00033"></a>00033 <span class="comment"> */</span>
<a name="l00034"></a>00034 
<a name="l00035"></a>00035 <span class="preprocessor">#include "<a class="code" href="a00136.html">uip.h</a>"</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include "telnetd.h"</span>
<a name="l00037"></a>00037 <span class="preprocessor">#include "<a class="code" href="a00121.html">memb.h</a>"</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include "<a class="code" href="a00107.html">shell.h</a>"</span>
<a name="l00039"></a>00039 
<a name="l00040"></a>00040 <span class="preprocessor">#include &lt;string.h&gt;</span>
<a name="l00041"></a>00041 
<a name="l00042"></a>00042 <span class="preprocessor">#define ISO_nl       0x0a</span>
<a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define ISO_cr       0x0d</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span>
<a name="l00045"></a>00045 <span class="keyword">struct </span>telnetd_line {
<a name="l00046"></a>00046   <span class="keywordtype">char</span> line[TELNETD_CONF_LINELEN];
<a name="l00047"></a>00047 };
<a name="l00048"></a>00048 <a name="a206"></a><a class="code" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB</a>(linemem, <span class="keyword">struct</span> telnetd_line, TELNETD_CONF_NUMLINES);
<a name="l00049"></a>00049 
<a name="l00050"></a>00050 <span class="preprocessor">#define STATE_NORMAL 0</span>
<a name="l00051"></a>00051 <span class="preprocessor"></span><span class="preprocessor">#define STATE_IAC    1</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span><span class="preprocessor">#define STATE_WILL   2</span>
<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor">#define STATE_WONT   3</span>
<a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#define STATE_DO     4</span>
<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#define STATE_DONT   5</span>
<a name="l00056"></a>00056 <span class="preprocessor"></span><span class="preprocessor">#define STATE_CLOSE  6</span>
<a name="l00057"></a>00057 <span class="preprocessor"></span>
<a name="l00058"></a>00058 <span class="keyword">static</span> <span class="keyword">struct </span><a name="_a207"></a><a class="code" href="a00086.html">telnetd_state</a> s;
<a name="l00059"></a>00059 
<a name="l00060"></a>00060 <span class="preprocessor">#define TELNET_IAC   255</span>
<a name="l00061"></a>00061 <span class="preprocessor"></span><span class="preprocessor">#define TELNET_WILL  251</span>
<a name="l00062"></a>00062 <span class="preprocessor"></span><span class="preprocessor">#define TELNET_WONT  252</span>
<a name="l00063"></a>00063 <span class="preprocessor"></span><span class="preprocessor">#define TELNET_DO    253</span>
<a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#define TELNET_DONT  254</span>
<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00066"></a>00066 <span class="keyword">static</span> <span class="keywordtype">char</span> *
<a name="l00067"></a>00067 alloc_line(<span class="keywordtype">void</span>)
<a name="l00068"></a>00068 {
<a name="l00069"></a>00069   <span class="keywordflow">return</span> <a name="a208"></a><a class="code" href="a00159.html#gfe5e93119035e14cc485760a176249ba">memb_alloc</a>(&amp;linemem);
<a name="l00070"></a>00070 }
<a name="l00071"></a>00071 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00072"></a>00072 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00073"></a>00073 dealloc_line(<span class="keywordtype">char</span> *line)
<a name="l00074"></a>00074 {
<a name="l00075"></a>00075   <a name="a209"></a><a class="code" href="a00159.html#gceb952d27de8125d5146ac0bee325b8f">memb_free</a>(&amp;linemem, line);
<a name="l00076"></a>00076 }
<a name="l00077"></a>00077 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00078"></a>00078 <span class="keywordtype">void</span>
<a name="l00079"></a>00079 <a name="a210"></a>shell_quit(<span class="keywordtype">char</span> *str)
<a name="l00080"></a>00080 {
<a name="l00081"></a>00081   s.<a name="a211"></a><a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_CLOSE;
<a name="l00082"></a>00082 }
<a name="l00083"></a>00083 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00084"></a>00084 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00085"></a>00085 sendline(<span class="keywordtype">char</span> *line)
<a name="l00086"></a>00086 {
<a name="l00087"></a>00087   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
<a name="l00088"></a>00088   
<a name="l00089"></a>00089   <span class="keywordflow">for</span>(i = 0; i &lt; TELNETD_CONF_NUMLINES; ++i) {
<a name="l00090"></a>00090     <span class="keywordflow">if</span>(s.<a name="a212"></a><a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i] == <a name="a213"></a><a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
<a name="l00091"></a>00091       s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i] = line;
<a name="l00092"></a>00092       <span class="keywordflow">break</span>;
<a name="l00093"></a>00093     }
<a name="l00094"></a>00094   }
<a name="l00095"></a>00095   <span class="keywordflow">if</span>(i == TELNETD_CONF_NUMLINES) {
<a name="l00096"></a>00096     dealloc_line(line);
<a name="l00097"></a>00097   }
<a name="l00098"></a>00098 }
<a name="l00099"></a>00099 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00100"></a>00100 <span class="keywordtype">void</span>
<a name="l00101"></a>00101 <a name="a214"></a>shell_prompt(<span class="keywordtype">char</span> *str)
<a name="l00102"></a>00102 {
<a name="l00103"></a>00103   <span class="keywordtype">char</span> *line;
<a name="l00104"></a>00104   line = alloc_line();
<a name="l00105"></a>00105   <span class="keywordflow">if</span>(line != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
<a name="l00106"></a>00106     strncpy(line, str, TELNETD_CONF_LINELEN);
<a name="l00107"></a>00107     <span class="comment">/*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/</span>
<a name="l00108"></a>00108     sendline(line);
<a name="l00109"></a>00109   }
<a name="l00110"></a>00110 }
<a name="l00111"></a>00111 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00112"></a>00112 <span class="keywordtype">void</span>
<a name="l00113"></a>00113 <a name="a215"></a>shell_output(<span class="keywordtype">char</span> *str1, <span class="keywordtype">char</span> *str2)
<a name="l00114"></a>00114 {
<a name="l00115"></a>00115   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> len;
<a name="l00116"></a>00116   <span class="keywordtype">char</span> *line;
<a name="l00117"></a>00117 
<a name="l00118"></a>00118   line = alloc_line();
<a name="l00119"></a>00119   <span class="keywordflow">if</span>(line != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
<a name="l00120"></a>00120     len = strlen(str1);
<a name="l00121"></a>00121     strncpy(line, str1, TELNETD_CONF_LINELEN);
<a name="l00122"></a>00122     <span class="keywordflow">if</span>(len &lt; TELNETD_CONF_LINELEN) {
<a name="l00123"></a>00123       strncpy(line + len, str2, TELNETD_CONF_LINELEN - len);
<a name="l00124"></a>00124     }
<a name="l00125"></a>00125     len = strlen(line);
<a name="l00126"></a>00126     <span class="keywordflow">if</span>(len &lt; TELNETD_CONF_LINELEN - 2) {
<a name="l00127"></a>00127       line[len] = <a name="a216"></a><a class="code" href="a00161.html#g6cda47c85ce1b58b501b44ac9cccc50e">ISO_cr</a>;
<a name="l00128"></a>00128       line[len+1] = <a name="a217"></a><a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a>;
<a name="l00129"></a>00129       line[len+2] = 0;
<a name="l00130"></a>00130     }
<a name="l00131"></a>00131     <span class="comment">/*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/</span>
<a name="l00132"></a>00132     sendline(line);
<a name="l00133"></a>00133   }
<a name="l00134"></a>00134 }
<a name="l00135"></a>00135 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00136"></a>00136 <span class="keywordtype">void</span>
<a name="l00137"></a>00137 telnetd_init(<span class="keywordtype">void</span>)
<a name="l00138"></a>00138 {
<a name="l00139"></a>00139   <a name="a218"></a><a class="code" href="a00147.html#gdd1ab3704ecd4900eec61a6897d32dc8">uip_listen</a>(<a name="a219"></a><a class="code" href="a00148.html#g69a7a4951ff21b302267532c21ee78fc">HTONS</a>(23));
<a name="l00140"></a>00140   <a name="a220"></a><a class="code" href="a00159.html#gd58a6c7e62ae59bf7a016ded12ca2910">memb_init</a>(&amp;linemem);
<a name="l00141"></a>00141   <a name="a221"></a><a class="code" href="a00107.html#69b075ef7e4d7bcf5a903d3d75baac02">shell_init</a>();
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00144"></a>00144 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00145"></a>00145 acked(<span class="keywordtype">void</span>)
<a name="l00146"></a>00146 {
<a name="l00147"></a>00147   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
<a name="l00148"></a>00148   
<a name="l00149"></a>00149   <span class="keywordflow">while</span>(s.<a name="a222"></a><a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a> &gt; 0) {
<a name="l00150"></a>00150     dealloc_line(s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[0]);
<a name="l00151"></a>00151     <span class="keywordflow">for</span>(i = 1; i &lt; TELNETD_CONF_NUMLINES; ++i) {
<a name="l00152"></a>00152       s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i - 1] = s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i];
<a name="l00153"></a>00153     }
<a name="l00154"></a>00154     s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[TELNETD_CONF_NUMLINES - 1] = <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00155"></a>00155     --s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>;
<a name="l00156"></a>00156   }
<a name="l00157"></a>00157 }
<a name="l00158"></a>00158 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00159"></a>00159 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00160"></a>00160 senddata(<span class="keywordtype">void</span>)
<a name="l00161"></a>00161 {
<a name="l00162"></a>00162   <span class="keyword">static</span> <span class="keywordtype">char</span> *<a name="a223"></a><a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>, *lineptr;
<a name="l00163"></a>00163   <span class="keyword">static</span> <span class="keywordtype">int</span> buflen, linelen;
<a name="l00164"></a>00164   
<a name="l00165"></a>00165   bufptr = <a name="a224"></a><a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
<a name="l00166"></a>00166   buflen = 0;
<a name="l00167"></a>00167   <span class="keywordflow">for</span>(s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a> = 0; s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a> &lt; TELNETD_CONF_NUMLINES &amp;&amp;
<a name="l00168"></a>00168         s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>] != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a> ; ++s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>) {
<a name="l00169"></a>00169     lineptr = s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[s.<a class="code" href="a00086.html#d85fc90c30d1fc37c63c4844be5fe09d">numsent</a>];
<a name="l00170"></a>00170     linelen = strlen(lineptr);
<a name="l00171"></a>00171     <span class="keywordflow">if</span>(linelen &gt; TELNETD_CONF_LINELEN) {
<a name="l00172"></a>00172       linelen = TELNETD_CONF_LINELEN;
<a name="l00173"></a>00173     }
<a name="l00174"></a>00174     <span class="keywordflow">if</span>(buflen + linelen &lt; <a name="a225"></a><a class="code" href="a00147.html#gb5fecbc62edd128012cea0f47b57ab9f">uip_mss</a>()) {
<a name="l00175"></a>00175       memcpy(bufptr, lineptr, linelen);
<a name="l00176"></a>00176       bufptr += linelen;
<a name="l00177"></a>00177       buflen += linelen;
<a name="l00178"></a>00178     } <span class="keywordflow">else</span> {
<a name="l00179"></a>00179       <span class="keywordflow">break</span>;
<a name="l00180"></a>00180     }
<a name="l00181"></a>00181   }
<a name="l00182"></a>00182   <a name="a226"></a><a class="code" href="a00147.html#g04b053a623aac7cd4195157d470661b3">uip_send</a>(<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>, buflen);
<a name="l00183"></a>00183 }
<a name="l00184"></a>00184 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00185"></a>00185 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00186"></a>00186 closed(<span class="keywordtype">void</span>)
<a name="l00187"></a>00187 {
<a name="l00188"></a>00188   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
<a name="l00189"></a>00189   
<a name="l00190"></a>00190   <span class="keywordflow">for</span>(i = 0; i &lt; TELNETD_CONF_NUMLINES; ++i) {
<a name="l00191"></a>00191     <span class="keywordflow">if</span>(s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i] != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
<a name="l00192"></a>00192       dealloc_line(s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i]);
<a name="l00193"></a>00193     }
<a name="l00194"></a>00194   }
<a name="l00195"></a>00195 }
<a name="l00196"></a>00196 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00197"></a>00197 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00198"></a>00198 get_char(<a name="a227"></a><a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> c)
<a name="l00199"></a>00199 {
<a name="l00200"></a>00200   <span class="keywordflow">if</span>(c == <a class="code" href="a00161.html#g6cda47c85ce1b58b501b44ac9cccc50e">ISO_cr</a>) {
<a name="l00201"></a>00201     <span class="keywordflow">return</span>;
<a name="l00202"></a>00202   }
<a name="l00203"></a>00203   
<a name="l00204"></a>00204   s.<a name="a228"></a><a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>[(int)s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>] = c;
<a name="l00205"></a>00205   <span class="keywordflow">if</span>(s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>[(<span class="keywordtype">int</span>)s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>] == <a class="code" href="a00161.html#g3212e70c55244608ac16316888c354f0">ISO_nl</a> ||
<a name="l00206"></a>00206      s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> == <span class="keyword">sizeof</span>(s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>) - 1) {
<a name="l00207"></a>00207     <span class="keywordflow">if</span>(s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> &gt; 0) {
<a name="l00208"></a>00208       s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>[(int)s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>] = 0;
<a name="l00209"></a>00209       <span class="comment">/*      petsciiconv_topetscii(s.buf, TELNETD_CONF_LINELEN);*/</span>
<a name="l00210"></a>00210     }
<a name="l00211"></a>00211     <a name="a229"></a><a class="code" href="a00107.html#86beee1f69d05b16022dfb430470e9ce">shell_input</a>(s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>);
<a name="l00212"></a>00212     s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> = 0;
<a name="l00213"></a>00213   } <span class="keywordflow">else</span> {
<a name="l00214"></a>00214     ++s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a>;
<a name="l00215"></a>00215   }
<a name="l00216"></a>00216 }
<a name="l00217"></a>00217 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00218"></a>00218 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00219"></a>00219 sendopt(<a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> option, <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> value)
<a name="l00220"></a>00220 {
<a name="l00221"></a>00221   <span class="keywordtype">char</span> *line;
<a name="l00222"></a>00222   line = alloc_line();
<a name="l00223"></a>00223   <span class="keywordflow">if</span>(line != <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>) {
<a name="l00224"></a>00224     line[0] = TELNET_IAC;
<a name="l00225"></a>00225     line[1] = option;
<a name="l00226"></a>00226     line[2] = value;
<a name="l00227"></a>00227     line[3] = 0;
<a name="l00228"></a>00228     sendline(line);
<a name="l00229"></a>00229   }
<a name="l00230"></a>00230 }
<a name="l00231"></a>00231 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00232"></a>00232 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00233"></a>00233 newdata(<span class="keywordtype">void</span>)
<a name="l00234"></a>00234 {
<a name="l00235"></a>00235   <a name="a230"></a><a class="code" href="a00153.html#g77570ac4fcab86864fa1916e55676da2">u16_t</a> len;
<a name="l00236"></a>00236   <a class="code" href="a00153.html#g4caecabca98b43919dd11be1c0d4cd8e">u8_t</a> c;
<a name="l00237"></a>00237   <span class="keywordtype">char</span> *dataptr;
<a name="l00238"></a>00238     
<a name="l00239"></a>00239   
<a name="l00240"></a>00240   len = <a name="a231"></a><a class="code" href="a00147.html#g1a1bc437c09ddef238abab41d77c3177">uip_datalen</a>();
<a name="l00241"></a>00241   dataptr = (<span class="keywordtype">char</span> *)<a class="code" href="a00150.html#g561b8eda32e059d4e7397f776268cc63">uip_appdata</a>;
<a name="l00242"></a>00242   
<a name="l00243"></a>00243   <span class="keywordflow">while</span>(len &gt; 0 &amp;&amp; s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> &lt; <span class="keyword">sizeof</span>(s.<a class="code" href="a00086.html#54a466311575a727830a92a6c3621cb2">buf</a>)) {
<a name="l00244"></a>00244     c = *dataptr;
<a name="l00245"></a>00245     ++dataptr;
<a name="l00246"></a>00246     --len;
<a name="l00247"></a>00247     <span class="keywordflow">switch</span>(s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a>) {
<a name="l00248"></a>00248     <span class="keywordflow">case</span> STATE_IAC:
<a name="l00249"></a>00249       <span class="keywordflow">if</span>(c == TELNET_IAC) {
<a name="l00250"></a>00250         get_char(c);
<a name="l00251"></a>00251         s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
<a name="l00252"></a>00252       } <span class="keywordflow">else</span> {
<a name="l00253"></a>00253         <span class="keywordflow">switch</span>(c) {
<a name="l00254"></a>00254         <span class="keywordflow">case</span> TELNET_WILL:
<a name="l00255"></a>00255           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_WILL;
<a name="l00256"></a>00256           <span class="keywordflow">break</span>;
<a name="l00257"></a>00257         <span class="keywordflow">case</span> TELNET_WONT:
<a name="l00258"></a>00258           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_WONT;
<a name="l00259"></a>00259           <span class="keywordflow">break</span>;
<a name="l00260"></a>00260         <span class="keywordflow">case</span> TELNET_DO:
<a name="l00261"></a>00261           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_DO;
<a name="l00262"></a>00262           <span class="keywordflow">break</span>;
<a name="l00263"></a>00263         <span class="keywordflow">case</span> TELNET_DONT:
<a name="l00264"></a>00264           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_DONT;
<a name="l00265"></a>00265           <span class="keywordflow">break</span>;
<a name="l00266"></a>00266         <span class="keywordflow">default</span>:
<a name="l00267"></a>00267           s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
<a name="l00268"></a>00268           <span class="keywordflow">break</span>;
<a name="l00269"></a>00269         }
<a name="l00270"></a>00270       }
<a name="l00271"></a>00271       <span class="keywordflow">break</span>;
<a name="l00272"></a>00272     <span class="keywordflow">case</span> STATE_WILL:
<a name="l00273"></a>00273       <span class="comment">/* Reply with a DONT */</span>
<a name="l00274"></a>00274       sendopt(TELNET_DONT, c);
<a name="l00275"></a>00275       s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
<a name="l00276"></a>00276       <span class="keywordflow">break</span>;
<a name="l00277"></a>00277       
<a name="l00278"></a>00278     <span class="keywordflow">case</span> STATE_WONT:
<a name="l00279"></a>00279       <span class="comment">/* Reply with a DONT */</span>
<a name="l00280"></a>00280       sendopt(TELNET_DONT, c);
<a name="l00281"></a>00281       s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
<a name="l00282"></a>00282       <span class="keywordflow">break</span>;
<a name="l00283"></a>00283     <span class="keywordflow">case</span> STATE_DO:
<a name="l00284"></a>00284       <span class="comment">/* Reply with a WONT */</span>
<a name="l00285"></a>00285       sendopt(TELNET_WONT, c);
<a name="l00286"></a>00286       s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
<a name="l00287"></a>00287       <span class="keywordflow">break</span>;
<a name="l00288"></a>00288     <span class="keywordflow">case</span> STATE_DONT:
<a name="l00289"></a>00289       <span class="comment">/* Reply with a WONT */</span>
<a name="l00290"></a>00290       sendopt(TELNET_WONT, c);
<a name="l00291"></a>00291       s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
<a name="l00292"></a>00292       <span class="keywordflow">break</span>;
<a name="l00293"></a>00293     <span class="keywordflow">case</span> STATE_NORMAL:
<a name="l00294"></a>00294       <span class="keywordflow">if</span>(c == TELNET_IAC) {
<a name="l00295"></a>00295         s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_IAC;
<a name="l00296"></a>00296       } <span class="keywordflow">else</span> {
<a name="l00297"></a>00297         get_char(c);
<a name="l00298"></a>00298       }
<a name="l00299"></a>00299       <span class="keywordflow">break</span>;
<a name="l00300"></a>00300     }
<a name="l00301"></a>00301 
<a name="l00302"></a>00302     
<a name="l00303"></a>00303   }
<a name="l00304"></a>00304   
<a name="l00305"></a>00305 }
<a name="l00306"></a>00306 <span class="comment">/*---------------------------------------------------------------------------*/</span>
<a name="l00307"></a>00307 <span class="keywordtype">void</span>
<a name="l00308"></a>00308 telnetd_appcall(<span class="keywordtype">void</span>)
<a name="l00309"></a>00309 {
<a name="l00310"></a>00310   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;
<a name="l00311"></a>00311   <span class="keywordflow">if</span>(<a name="a232"></a><a class="code" href="a00147.html#gdb971fb1525d0c5002f52125b05f3218">uip_connected</a>()) {
<a name="l00312"></a>00312     <span class="comment">/*    tcp_markconn(uip_conn, &amp;s);*/</span>
<a name="l00313"></a>00313     <span class="keywordflow">for</span>(i = 0; i &lt; TELNETD_CONF_NUMLINES; ++i) {
<a name="l00314"></a>00314       s.<a class="code" href="a00086.html#cca775e46d4405b7775b328f7694f7e7">lines</a>[i] = <a class="code" href="a00160.html#g070d2ce7b6bb7e5c05602aa8c308d0c4">NULL</a>;
<a name="l00315"></a>00315     }
<a name="l00316"></a>00316     s.<a class="code" href="a00086.html#5eced097547fd3fac4ba2a255493d921">bufptr</a> = 0;
<a name="l00317"></a>00317     s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
<a name="l00318"></a>00318 
<a name="l00319"></a>00319     <a name="a233"></a><a class="code" href="a00107.html#d1f18f739da7703628c3663209463a0d">shell_start</a>();
<a name="l00320"></a>00320   }
<a name="l00321"></a>00321 
<a name="l00322"></a>00322   <span class="keywordflow">if</span>(s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> == STATE_CLOSE) {
<a name="l00323"></a>00323     s.<a class="code" href="a00086.html#41bf109b6a45328d5744c0a76563fb6c">state</a> = STATE_NORMAL;
<a name="l00324"></a>00324     <a name="a234"></a><a class="code" href="a00147.html#g61db1dcb7c760e4dd5d60bf4e5576dca">uip_close</a>();
<a name="l00325"></a>00325     <span class="keywordflow">return</span>;
<a name="l00326"></a>00326   }
<a name="l00327"></a>00327   
<a name="l00328"></a>00328   <span class="keywordflow">if</span>(<a name="a235"></a><a class="code" href="a00147.html#gef6c4140c632b6a406779342cf3b6eb6">uip_closed</a>() ||
<a name="l00329"></a>00329      <a name="a236"></a><a class="code" href="a00147.html#gfbd5fc486dfdf6bf6fc9db52b1f418c4">uip_aborted</a>() ||
<a name="l00330"></a>00330      <a name="a237"></a><a class="code" href="a00147.html#g7b2ac4b18bd2ac3912fe67b3b17158c3">uip_timedout</a>()) {
<a name="l00331"></a>00331     closed();
<a name="l00332"></a>00332   }
<a name="l00333"></a>00333   
<a name="l00334"></a>00334   <span class="keywordflow">if</span>(<a name="a238"></a><a class="code" href="a00147.html#gde6634974418e3240c212b9b16864368">uip_acked</a>()) {
<a name="l00335"></a>00335     acked();
<a name="l00336"></a>00336   }
<a name="l00337"></a>00337   
<a name="l00338"></a>00338   <span class="keywordflow">if</span>(<a name="a239"></a><a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>()) {
<a name="l00339"></a>00339     newdata();
<a name="l00340"></a>00340   }
<a name="l00341"></a>00341   
<a name="l00342"></a>00342   <span class="keywordflow">if</span>(<a name="a240"></a><a class="code" href="a00147.html#ga8933ad15a2e2947dae4a5cff50e6007">uip_rexmit</a>() ||
<a name="l00343"></a>00343      <a class="code" href="a00147.html#g26a14b8dae3f861830af9e7cf1e03725">uip_newdata</a>() ||
<a name="l00344"></a>00344      <a class="code" href="a00147.html#gde6634974418e3240c212b9b16864368">uip_acked</a>() ||
<a name="l00345"></a>00345      <a class="code" href="a00147.html#gdb971fb1525d0c5002f52125b05f3218">uip_connected</a>() ||
<a name="l00346"></a>00346      <a name="a241"></a><a class="code" href="a00147.html#g58bb90796c1cdad3aac2ecf44d87b20e">uip_poll</a>()) {
<a name="l00347"></a>00347     senddata();
<a name="l00348"></a>00348   }
<a name="l00349"></a>00349 }
<a name="l00350"></a>00350 <span class="comment">/*---------------------------------------------------------------------------*/</span>
</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
</body>
</html>