Home | History | Annotate | Download | only in dropbear
      1 /*
      2  * Dropbear - a SSH2 server
      3  *
      4  * Copyright (c) 2002,2003 Matt Johnston
      5  * All rights reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a copy
      8  * of this software and associated documentation files (the "Software"), to deal
      9  * in the Software without restriction, including without limitation the rights
     10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11  * copies of the Software, and to permit persons to whom the Software is
     12  * furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included in
     15  * all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     23  * SOFTWARE. */
     24 
     25 #ifndef _CHANNEL_H_
     26 #define _CHANNEL_H_
     27 
     28 #include "includes.h"
     29 #include "buffer.h"
     30 #include "circbuffer.h"
     31 
     32 /* channel->type values */
     33 #define CHANNEL_ID_NONE 0
     34 #define CHANNEL_ID_SESSION 1
     35 #define CHANNEL_ID_X11 2
     36 #define CHANNEL_ID_AGENT 3
     37 #define CHANNEL_ID_TCPDIRECT 4
     38 #define CHANNEL_ID_TCPFORWARDED 5
     39 
     40 #define SSH_OPEN_ADMINISTRATIVELY_PROHIBITED    1
     41 #define SSH_OPEN_CONNECT_FAILED                 2
     42 #define SSH_OPEN_UNKNOWN_CHANNEL_TYPE           3
     43 #define SSH_OPEN_RESOURCE_SHORTAGE              4
     44 
     45 /* Not a real type */
     46 #define SSH_OPEN_IN_PROGRESS					99
     47 
     48 #define MAX_CHANNELS 100 /* simple mem restriction, includes each tcp/x11
     49 							connection, so can't be _too_ small */
     50 
     51 #define CHAN_EXTEND_SIZE 3 /* how many extra slots to add when we need more */
     52 
     53 #define RECV_MAXWINDOW 8000 /* tweak */
     54 #define RECV_WINDOWEXTEND 1000 /* We send a "window extend" every
     55 								RECV_WINDOWEXTEND bytes */
     56 #define RECV_MAXPACKET RECV_MAXWINDOW /* tweak */
     57 
     58 struct ChanType;
     59 
     60 struct Channel {
     61 
     62 	unsigned int index; /* the local channel index */
     63 	unsigned int remotechan;
     64 	unsigned int recvwindow, transwindow;
     65 	unsigned int recvdonelen;
     66 	unsigned int recvmaxpacket, transmaxpacket;
     67 	void* typedata; /* a pointer to type specific data */
     68 	int writefd; /* read from wire, written to insecure side */
     69 	int readfd; /* read from insecure size, written to wire */
     70 	int errfd; /* used like writefd or readfd, depending if it's client or server.
     71 				  Doesn't exactly belong here, but is cleaner here */
     72 	circbuffer *writebuf; /* data from the wire, for local consumption */
     73 	circbuffer *extrabuf; /* extended-data for the program - used like writebuf
     74 					     but for stderr */
     75 
     76 	/* whether close/eof messages have been exchanged */
     77 	int sent_close, recv_close;
     78 	int recv_eof, sent_eof;
     79 
     80 	int initconn; /* used for TCP forwarding, whether the channel has been
     81 					 fully initialised */
     82 
     83 	int await_open; /* flag indicating whether we've sent an open request
     84 					   for this channel (and are awaiting a confirmation
     85 					   or failure). */
     86 
     87 	int flushing;
     88 
     89 	const struct ChanType* type;
     90 
     91 };
     92 
     93 struct ChanType {
     94 
     95 	int sepfds; /* Whether this channel has seperate pipes for in/out or not */
     96 	char *name;
     97 	int (*inithandler)(struct Channel*);
     98 	int (*check_close)(struct Channel*);
     99 	void (*reqhandler)(struct Channel*);
    100 	void (*closehandler)(struct Channel*);
    101 
    102 };
    103 
    104 void chaninitialise(const struct ChanType *chantypes[]);
    105 void chancleanup();
    106 void setchannelfds(fd_set *readfd, fd_set *writefd);
    107 void channelio(fd_set *readfd, fd_set *writefd);
    108 struct Channel* getchannel();
    109 struct Channel* newchannel(unsigned int remotechan,
    110 		const struct ChanType *type,
    111 		unsigned int transwindow, unsigned int transmaxpacket);
    112 
    113 void recv_msg_channel_open();
    114 void recv_msg_channel_request();
    115 void send_msg_channel_failure(struct Channel *channel);
    116 void send_msg_channel_success(struct Channel *channel);
    117 void recv_msg_channel_data();
    118 void recv_msg_channel_extended_data();
    119 void recv_msg_channel_window_adjust();
    120 void recv_msg_channel_close();
    121 void recv_msg_channel_eof();
    122 
    123 void common_recv_msg_channel_data(struct Channel *channel, int fd,
    124 		circbuffer * buf);
    125 
    126 #ifdef DROPBEAR_CLIENT
    127 extern const struct ChanType clichansess;
    128 #endif
    129 
    130 #if defined(USING_LISTENERS) || defined(DROPBEAR_CLIENT)
    131 int send_msg_channel_open_init(int fd, const struct ChanType *type);
    132 void recv_msg_channel_open_confirmation();
    133 void recv_msg_channel_open_failure();
    134 #endif
    135 
    136 #endif /* _CHANNEL_H_ */
    137