diff options
author | Damien Miller <djm@mindrot.org> | 2010-05-21 14:57:10 +1000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2010-05-21 14:57:10 +1000 |
commit | d530f5f471491b6be9edb58a063f2590e4dce48d (patch) | |
tree | e536e2b4031a4dd70026ff49c39b02b72af06f30 /channels.h | |
parent | c6afb5f2c095a6a4380cc13a6480abb7614d949f (diff) |
- djm@cvs.openbsd.org 2010/05/14 23:29:23
[channels.c channels.h mux.c ssh.c]
Pause the mux channel while waiting for reply from aynch callbacks.
Prevents misordering of replies if new requests arrive while waiting.
Extend channel open confirm callback to allow signalling failure
conditions as well as success. Use this to 1) fix a memory leak, 2)
start using the above pause mechanism and 3) delay sending a success/
failure message on mux slave session open until we receive a reply from
the server.
motivated by and with feedback from markus@
Diffstat (limited to 'channels.h')
-rw-r--r-- | channels.h | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/channels.h b/channels.h index cc71885f4..0680ed00e 100644 --- a/channels.h +++ b/channels.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: channels.h,v 1.103 2010/01/26 01:28:35 djm Exp $ */ | 1 | /* $OpenBSD: channels.h,v 1.104 2010/05/14 23:29:23 djm Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | 4 | * Author: Tatu Ylonen <ylo@cs.hut.fi> |
@@ -60,6 +60,7 @@ | |||
60 | struct Channel; | 60 | struct Channel; |
61 | typedef struct Channel Channel; | 61 | typedef struct Channel Channel; |
62 | 62 | ||
63 | typedef void channel_open_fn(int, int, void *); | ||
63 | typedef void channel_callback_fn(int, void *); | 64 | typedef void channel_callback_fn(int, void *); |
64 | typedef int channel_infilter_fn(struct Channel *, char *, int); | 65 | typedef int channel_infilter_fn(struct Channel *, char *, int); |
65 | typedef void channel_filter_cleanup_fn(int, void *); | 66 | typedef void channel_filter_cleanup_fn(int, void *); |
@@ -130,7 +131,7 @@ struct Channel { | |||
130 | char *ctype; /* type */ | 131 | char *ctype; /* type */ |
131 | 132 | ||
132 | /* callback */ | 133 | /* callback */ |
133 | channel_callback_fn *open_confirm; | 134 | channel_open_fn *open_confirm; |
134 | void *open_confirm_ctx; | 135 | void *open_confirm_ctx; |
135 | channel_callback_fn *detach_user; | 136 | channel_callback_fn *detach_user; |
136 | int detach_close; | 137 | int detach_close; |
@@ -151,6 +152,7 @@ struct Channel { | |||
151 | /* multiplexing protocol hook, called for each packet received */ | 152 | /* multiplexing protocol hook, called for each packet received */ |
152 | mux_callback_fn *mux_rcb; | 153 | mux_callback_fn *mux_rcb; |
153 | void *mux_ctx; | 154 | void *mux_ctx; |
155 | int mux_pause; | ||
154 | }; | 156 | }; |
155 | 157 | ||
156 | #define CHAN_EXTENDED_IGNORE 0 | 158 | #define CHAN_EXTENDED_IGNORE 0 |
@@ -208,7 +210,7 @@ void channel_stop_listening(void); | |||
208 | void channel_send_open(int); | 210 | void channel_send_open(int); |
209 | void channel_request_start(int, char *, int); | 211 | void channel_request_start(int, char *, int); |
210 | void channel_register_cleanup(int, channel_callback_fn *, int); | 212 | void channel_register_cleanup(int, channel_callback_fn *, int); |
211 | void channel_register_open_confirm(int, channel_callback_fn *, void *); | 213 | void channel_register_open_confirm(int, channel_open_fn *, void *); |
212 | void channel_register_filter(int, channel_infilter_fn *, | 214 | void channel_register_filter(int, channel_infilter_fn *, |
213 | channel_outfilter_fn *, channel_filter_cleanup_fn *, void *); | 215 | channel_outfilter_fn *, channel_filter_cleanup_fn *, void *); |
214 | void channel_register_status_confirm(int, channel_confirm_cb *, | 216 | void channel_register_status_confirm(int, channel_confirm_cb *, |