]> andersk Git - openssh.git/blobdiff - channels.c
- (djm) Pick up LOGIN_PROGRAM from environment or PATH if not set by headers
[openssh.git] / channels.c
index b485b50f6ae4c6e543be6871ad807345b89814f0..c77f6b96a4a96534251074e6c8aec25ef9cf6654 100644 (file)
  */
 
 #include "includes.h"
-RCSID("$Id$");
+RCSID("$OpenBSD: channels.c,v 1.66 2000/08/19 21:55:51 markus Exp $");
 
 #include "ssh.h"
 #include "packet.h"
 #include "xmalloc.h"
 #include "buffer.h"
-#include "authfd.h"
 #include "uidswap.h"
 #include "readconf.h"
 #include "servconf.h"
@@ -34,6 +33,11 @@ RCSID("$Id$");
 
 #include "ssh2.h"
 
+#include <openssl/rsa.h>
+#include <openssl/dsa.h>
+#include "key.h"
+#include "authfd.h"
+
 /* Maximum number of fake X11 displays to try. */
 #define MAX_DISPLAYS  1000
 
@@ -135,7 +139,7 @@ Channel *
 channel_lookup(int id)
 {
        Channel *c;
-       if (id < 0 && id > channels_alloc) {
+       if (id < 0 || id > channels_alloc) {
                log("channel_lookup: %d: bad id", id);
                return NULL;
        }
@@ -240,6 +244,7 @@ channel_new(char *ctype, int type, int rfd, int wfd, int efd,
        c->cb_arg = NULL;
        c->cb_event = 0;
        c->dettach_user = NULL;
+       c->input_filter = NULL;
        debug("channel %d: new [%s]", found, remote_name);
        return found;
 }
@@ -661,7 +666,14 @@ channel_handle_rfd(Channel *c, fd_set * readset, fd_set * writeset)
                        }
                        return -1;
                }
-               buffer_append(&c->input, buf, len);
+               if(c->input_filter != NULL) {
+                       if (c->input_filter(c, buf, len) == -1) {
+                               debug("filter stops channel %d", c->self);
+                               chan_read_failed(c);
+                       }
+               } else {
+                       buffer_append(&c->input, buf, len);
+               }
        }
        return 1;
 }
@@ -932,7 +944,6 @@ channel_output_poll()
                                packet_send();
                                buffer_consume(&c->input, len);
                                c->remote_window -= len;
-                               debug("channel %d: send data len %d", c->self, len);
                        }
                } else if (c->istate == CHAN_INPUT_WAIT_DRAIN) {
                        if (compat13)
@@ -2306,6 +2317,16 @@ channel_cancel_cleanup(int id)
        }
        c->dettach_user = NULL;
 }
+void   
+channel_register_filter(int id, channel_filter_fn *fn)
+{
+       Channel *c = channel_lookup(id);
+       if (c == NULL) {
+               log("channel_register_filter: %d: bad id", id);
+               return;
+       }
+       c->input_filter = fn;
+}
 
 void
 channel_set_fds(int id, int rfd, int wfd, int efd, int extusage)
This page took 1.841072 seconds and 4 git commands to generate.