2 * Copyright (c) 1999 Markus Friedl. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 /* RCSID("$OpenBSD: nchan.h,v 1.11 2001/05/04 23:47:34 markus Exp $"); */
31 * SSH Protocol 1.5 aka New Channel Protocol
32 * Thanks to Martina, Axel and everyone who left Erlangen, leaving me bored.
33 * Written by Markus Friedl in October 1999
35 * Protocol versions 1.3 and 1.5 differ in the handshake protocol used for the
36 * tear down of channels:
38 * 1.3: strict request-ack-protocol:
42 * 1.5: uses variations of:
47 * i.e. both sides have to close the channel
49 * See the debugging output from 'ssh -v' and 'sshd -d' of
50 * ssh-1.2.27 as an example.
54 /* ssh-proto-1.5 overloads prot-1.3-message-types */
55 #define SSH_MSG_CHANNEL_INPUT_EOF SSH_MSG_CHANNEL_CLOSE
56 #define SSH_MSG_CHANNEL_OUTPUT_CLOSE SSH_MSG_CHANNEL_CLOSE_CONFIRMATION
58 /* possible input states */
59 #define CHAN_INPUT_OPEN 0x01
60 #define CHAN_INPUT_WAIT_DRAIN 0x02
61 #define CHAN_INPUT_WAIT_OCLOSE 0x04
62 #define CHAN_INPUT_CLOSED 0x08
64 /* possible output states */
65 #define CHAN_OUTPUT_OPEN 0x10
66 #define CHAN_OUTPUT_WAIT_DRAIN 0x20
67 #define CHAN_OUTPUT_WAIT_IEOF 0x40
68 #define CHAN_OUTPUT_CLOSED 0x80
70 #define CHAN_CLOSE_SENT 0x01
71 #define CHAN_CLOSE_RCVD 0x02
72 #define CHAN_DEAD 0x04
76 typedef void chan_event_fn(Channel * c);
78 /* for the input state */
79 extern chan_event_fn *chan_rcvd_oclose;
80 extern chan_event_fn *chan_read_failed;
81 extern chan_event_fn *chan_ibuf_empty;
83 /* for the output state */
84 extern chan_event_fn *chan_rcvd_ieof;
85 extern chan_event_fn *chan_write_failed;
86 extern chan_event_fn *chan_obuf_empty;
88 int chan_is_dead(Channel * c);
89 void chan_mark_dead(Channel * c);
91 void chan_init_iostates(Channel * c);