%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2005-2016. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%%     http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%

%%

%%% Description : SSH connection protocol 

-type role()               :: client | server .
-type connection_ref()     :: pid().
-type channel_id()         :: pos_integer().

-define(DEFAULT_PACKET_SIZE, 65536).
-define(DEFAULT_WINDOW_SIZE, 10*?DEFAULT_PACKET_SIZE).

-define(DEFAULT_TIMEOUT, 5000).
-define(MAX_PROTO_VERSION, 255).      % Max length of the hello string

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% CONNECT messages
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%----------------------------------------------------------------------
%%% #   SSH_MSG_xxx
%%% Description: Packet types used by the connection protocol.
%%%----------------------------------------------------------------------
-define(SSH_MSG_GLOBAL_REQUEST,  80).
-define(SSH_MSG_REQUEST_SUCCESS,  81).
-define(SSH_MSG_REQUEST_FAILURE,  82).
-define(SSH_MSG_CHANNEL_OPEN,  90).
-define(SSH_MSG_CHANNEL_OPEN_CONFIRMATION,  91).
-define(SSH_MSG_CHANNEL_OPEN_FAILURE,  92).
-define(SSH_MSG_CHANNEL_WINDOW_ADJUST,  93).
-define(SSH_MSG_CHANNEL_DATA,  94).
-define(SSH_MSG_CHANNEL_EXTENDED_DATA,  95).
-define(SSH_MSG_CHANNEL_EOF,  96).
-define(SSH_MSG_CHANNEL_CLOSE,  97).
-define(SSH_MSG_CHANNEL_REQUEST,  98).
-define(SSH_MSG_CHANNEL_SUCCESS,  99).
-define(SSH_MSG_CHANNEL_FAILURE,  100).

-record(ssh_msg_global_request,
	{
	  name,
	  want_reply,
	  data %% ...
	 }).

-record(ssh_msg_request_success,
	{
	  data  %% ...
	 }).

-record(ssh_msg_request_failure,
	{
	 }).


-record(ssh_msg_channel_open,
	{
	  channel_type,
	  sender_channel,
	  initial_window_size,
	  maximum_packet_size,
	  data %% ...
	 }).

-record(ssh_msg_channel_open_confirmation,
	{
	  recipient_channel,
	  sender_channel,
	  initial_window_size,
	  maximum_packet_size,
	  data  %% ...
	 }).


%%%----------------------------------------------------------------------
%%% #   SSH_OPEN_xxx
%%% Description: Reason codes for SSH_MSG_OPEN_FAILURE packages.
%%%----------------------------------------------------------------------

-define(SSH_OPEN_ADMINISTRATIVELY_PROHIBITED,	1).
-define(SSH_OPEN_CONNECT_FAILED,		2).
-define(SSH_OPEN_UNKNOWN_CHANNEL_TYPE,		3).
-define(SSH_OPEN_RESOURCE_SHORTAGE,		4).

-record(ssh_msg_channel_open_failure,
	{
	  recipient_channel,
	  reason,
	  description,
	  lang
	 }).

	 
-record(ssh_msg_channel_window_adjust,
	{
	  recipient_channel,
	  bytes_to_add
	 }).

-record(ssh_msg_channel_data,
	{
	  recipient_channel,
	  data
	 }).

%%%----------------------------------------------------------------------
%%% #   SSH_EXTENDED_DATA_xxx
%%% Description: Type codes for SSH_MSG_CHANNEL_EXTENDED_DATA packages
%%%----------------------------------------------------------------------
-define(SSH_EXTENDED_DATA_DEFAULT, 0).
-define(SSH_EXTENDED_DATA_STDERR,  1).

-record(ssh_msg_channel_extended_data,
	{
	  recipient_channel,
	  data_type_code,
	  data
	 }).

-record(ssh_msg_channel_eof,
	{
	  recipient_channel
	 }).

-record(ssh_msg_channel_close,
	{
	  recipient_channel
	 }).


-record(ssh_msg_channel_request,
	{
	  recipient_channel,
	  request_type,
	  want_reply,
	  data         %% ...
	 }).


-record(ssh_msg_channel_success,
	{
	  recipient_channel
	 }).


-record(ssh_msg_channel_failure,
	{
	  recipient_channel
	 }).

-define(TERMINAL_WIDTH, 80).
-define(TERMINAL_HEIGHT, 24).
-define(DEFAULT_TERMINAL, "vt100").

-define(TTY_OP_END,0).  %% Indicates end of options.
-define(VINTR,1).       %% Interrupt character; 255 if none. Similarly for the
			%% other characters. Not all of these characters are
                        %% supported on all systems.
-define(VQUIT,2).       %% The quit character (sends SIGQUIT signal on POSIX
                        %%                    systems).
-define(VERASE,3).      %% Erase the character to left of the cursor.
-define(VKILL,4).       %% Kill the current input line.
-define(VEOF,5).        %% End-of-file character (sends EOF from the terminal).
-define(VEOL,6).        %% End-of-line character in addition to carriage return
                        %% or,and). linefeed.
-define(VEOL2,7).       %% Additional end-of-line character.
-define(VSTART,8).      %% Continues paused output (normally control-Q).
-define(VSTOP,9).       %% Pauses output (normally control-S).
-define(VSUSP,10).      %% Suspends the current program.
-define(VDSUSP,11).     %% Another suspend character.
-define(VREPRINT,12).   %% Reprints the current input line.
-define(VWERASE,13).    %% Erases a word left of cursor.
-define(VLNEXT,14).     %% Enter the next character typed literally, even if it
                        %% is a special character
-define(VFLUSH,15).     %% Character to flush output.
-define(VSWTCH,16).     %% Switch to a different shell layer.
-define(VSTATUS,17).    %% Prints system status line (load, command, pid etc).
-define(VDISCARD,18).   %% Toggles the flushing of terminal output.
-define(IGNPAR,30).     %% The ignore parity flag.  The parameter SHOULD be 0 if
                        %% this flag is FALSE set, and 1 if it is TRUE.
-define(PARMRK,31).     %% Mark parity and framing errors.
-define(INPCK,32).      %% Enable checking of parity errors.
-define(ISTRIP,33).     %% Strip 8th bit off characters.
-define(INLCR,34).      %% Map NL into CR on input.
-define(IGNCR,35).      %% Ignore CR on input.
-define(ICRNL,36).      %% Map CR to NL on input.
-define(IUCLC,37).      %% Translate uppercase characters to lowercase.
-define(IXON,38).       %% Enable output flow control.
-define(IXANY,39).      %% Any char will restart after stop.
-define(IXOFF,40).      %% Enable input flow control.
-define(IMAXBEL,41).    %% Ring bell on input queue full.
-define(ISIG,50).       %% Enable signals INTR, QUIT, [D]SUSP.
-define(ICANON,51).     %% Canonicalize input lines.
-define(XCASE,52).      %% Enable input and output of uppercase characters by
                        %% preceding their lowercase equivalents with `\'.
-define(ECHO,53).       %% Enable echoing.
-define(ECHOE,54).      %% Visually erase chars.
-define(ECHOK,55).      %% Kill character discards current line.
-define(ECHONL,56).     %% Echo NL even if ECHO is off.
-define(NOFLSH,57).     %% Don't flush after interrupt.
-define(TOSTOP,58).     %% Stop background jobs from output.
-define(IEXTEN,59).     %% Enable extensions.
-define(ECHOCTL,60).    %% Echo control characters as ^(Char).
-define(ECHOKE,61).     %% Visual erase for line kill.
-define(PENDIN,62).     %% Retype pending input.
-define(OPOST,70).      %% Enable output processing.
-define(OLCUC,71).      %% Convert lowercase to uppercase.
-define(ONLCR,72).      %% Map NL to CR-NL.
-define(OCRNL,73).      %% Translate carriage return to newline (output).
-define(ONOCR,74).      %% Translate newline to carriage return-newline
                        %% (output).
-define(ONLRET,75).     %% Newline performs a carriage return (output).
-define(CS7,90).        %% 7 bit mode.
-define(CS8,91).        %% 8 bit mode.
-define(PARENB,92).     %% Parity enable.
-define(PARODD,93).     %% Odd parity, else even.

%%  Specifies the input baud rate in bits per second.
-define(TTY_OP_ISPEED,128).
%%  Specifies the output baud rate in bits per second.
-define(TTY_OP_OSPEED,129).  

-record(channel,
	{
	  type,          %% "session"
	  sys,           %% "none", "shell", "exec" "subsystem"
	  user,          %% "user" process id (default to cm user)
	  flow_control, 

	  local_id,           %% local channel id

	  recv_window_size,
	  recv_window_pending = 0, %% Sum of window size updates that has not
	                           %% yet been sent. This limits the number
	                           %% of sent update msgs.
	  recv_packet_size,
	  recv_close = false,

	  remote_id,          %% remote channel id
	  send_window_size,
	  send_packet_size,
	  sent_close = false,
	  send_buf = []
	 }).

-record(connection, {
	  requests = [], %% [{ChannelId, Pid}...] awaiting reply on request,
	  channel_cache,
	  port_bindings,
	  channel_id_seed,
	  cli_spec,
	  address, 
	  port,
	  options,
	  exec,
	  system_supervisor,
	  sub_system_supervisor,
	  connection_supervisor
	 }).
