Exemple #1
0
 private void Send_IAC(IAC command, Byte option)
 {
     Debug.WriteLine("Send IAC {0} {1} (255 {2:D0} {3:D0})", command, (Telnet.Option)option, (Byte)command, option);
     Byte[] buf = new Byte[3];
     buf[0] = (Byte)IAC.IAC;
     buf[1] = (Byte)command;
     buf[2] = option;
     _Send(buf, 0, 3);
 }
Exemple #2
0
 public static Token NOP(IAC command)
 {
     Byte[] buf = new Byte[1];
     buf[0] = (Byte)command;
     return(new Token(TokenType.NOP, buf, 0, 1));
 }
Exemple #3
0
        private Token GetToken(ref Int32 p, Byte[] buffer, ref Int32 q)
        {
            Int32 op    = p; // original value of index into mRecvBuf
            Int32 oq    = q; // original value of index into buffer
            Int32 state = 0;
            Int32 n;

            while ((n = PeekTokenByte(p, buffer, q)) != -1)
            {
                IAC b = (IAC)n;
                switch (state)
                {
                case 0:     // start
                    if (b == IAC.IAC)
                    {
                        state = 3;
                    }
                    else if (n == '\r')
                    {
                        state = 2;
                    }
                    else
                    {
                        state = 1;
                    }
                    ReadTokenByte(ref p, buffer, ref q);
                    break;

                case 1:     // data
                    if ((b == IAC.IAC) || (n == '\r'))
                    {
                        return(new Token(TokenType.Data, buffer, oq, q - oq));
                    }
                    ReadTokenByte(ref p, buffer, ref q);
                    break;

                case 2:     // CR
                    if ((n == '\n') || (n == 0))
                    {
                        ReadTokenByte(ref p, buffer, ref q);
                        if ((mRecvBuf != null) && (p == mRecvBuf.Length) && (p != op) && (q != oq))
                        {
                            // recopy if this token was split across 2 buffers
                            n = (p - op) + (q - oq);
                            Byte[] buf = new Byte[n];
                            n = 0;
                            for (Int32 i = op; i < p; i++)
                            {
                                buf[n++] = mRecvBuf[i];
                            }
                            for (Int32 i = oq; i < q; i++)
                            {
                                buf[n++] = buffer[i];
                            }
                            return(new Token(TokenType.Data, buf, 0, n));
                        }
                        return(new Token(TokenType.Data, buffer, oq, q - oq));
                    }
                    if (q == oq)
                    {
                        return(new Token(TokenType.Data, mRecvBuf, op, p - op));
                    }
                    return(new Token(TokenType.Data, buffer, oq, q - oq));

                case 3:     // IAC
                    if (b == IAC.IAC)
                    {
                        Token t = (q == oq) ? new Token(TokenType.Data, mRecvBuf, op, 1) : new Token(TokenType.Data, buffer, oq, 1);
                        ReadTokenByte(ref p, buffer, ref q);
                        return(t);
                    }
                    if ((b == IAC.GA) || (b == IAC.BRK) || (b == IAC.IP) || (b == IAC.AO) || (b == IAC.AYT) || (b == IAC.EC) || (b == IAC.EL) || (b == IAC.EOR) || (b == IAC.EOF) || (b == IAC.SUSP) || (b == IAC.ABORT))
                    {
                        ReadTokenByte(ref p, buffer, ref q);
                        return(new Token(TokenType.Command, buffer, q - 1, 1));
                    }
                    if (b == IAC.DM)
                    {
                        ReadTokenByte(ref p, buffer, ref q);
                        if (q == oq)
                        {
                            return(new Token(TokenType.DM, mRecvBuf, p - 1, 1));
                        }
                        return(new Token(TokenType.DM, buffer, q - 1, 1));
                    }
                    ReadTokenByte(ref p, buffer, ref q);
                    if (b == IAC.DO)
                    {
                        state = 4;
                    }
                    else if (b == IAC.DONT)
                    {
                        state = 5;
                    }
                    else if (b == IAC.WILL)
                    {
                        state = 6;
                    }
                    else if (b == IAC.WONT)
                    {
                        state = 7;
                    }
                    else if (b == IAC.SB)
                    {
                        state = 8;
                    }
                    else if (q == oq)
                    {
                        return(new Token(TokenType.NOP, mRecvBuf, p - 1, 1));
                    }
                    else
                    {
                        return(new Token(TokenType.NOP, buffer, q - 1, 1));
                    }
                    break;

                case 4:     // IAC DO
                    ReadTokenByte(ref p, buffer, ref q);
                    return(new Token(TokenType.DO, buffer, q - 1, 1));

                case 5:     // IAC DONT
                    ReadTokenByte(ref p, buffer, ref q);
                    return(new Token(TokenType.DONT, buffer, q - 1, 1));

                case 6:     // IAC WILL
                    ReadTokenByte(ref p, buffer, ref q);
                    return(new Token(TokenType.WILL, buffer, q - 1, 1));

                case 7:     // IAC WONT
                    ReadTokenByte(ref p, buffer, ref q);
                    return(new Token(TokenType.WONT, buffer, q - 1, 1));

                case 8:     // IAC SB
                    ReadTokenByte(ref p, buffer, ref q);
                    state = 9;
                    break;

                case 9:     // IAC SB OPT ...
                    if (b == IAC.IAC)
                    {
                        state = 10;
                    }
                    ReadTokenByte(ref p, buffer, ref q);
                    break;

                case 10:     // IAC SB OPT ... IAC
                    ReadTokenByte(ref p, buffer, ref q);
                    if (b == IAC.SE)
                    {
                        if ((mRecvBuf != null) && (p == mRecvBuf.Length) && (p != op) && (q != oq))
                        {
                            // recopy if this token was split across 2 buffers
                            n = (p - op) + (q - oq);
                            Byte[] buf = new Byte[n];
                            n = 0;
                            for (Int32 i = op; i < p; i++)
                            {
                                buf[n++] = mRecvBuf[i];
                            }
                            for (Int32 i = oq; i < q; i++)
                            {
                                buf[n++] = buffer[i];
                            }
                            return(new Token(TokenType.SB, buf, 2, n - 4));
                        }
                        return(new Token(TokenType.SB, buffer, oq + 2, q - oq - 4));
                    }
                    if (b == IAC.IAC)
                    {
                        state = 11;
                    }
                    else
                    {
                        state = 9;
                    }
                    break;

                case 11:     // IAC SB OPT ... IAC IAC ...
                    if (b == IAC.IAC)
                    {
                        state = 12;
                    }
                    ReadTokenByte(ref p, buffer, ref q);
                    break;

                case 12:     // IAC SB OPT ... IAC IAC ... IAC
                    ReadTokenByte(ref p, buffer, ref q);
                    if (b == IAC.SE)
                    {
                        if ((mRecvBuf != null) && (p == mRecvBuf.Length) && (p != op) && (q != oq))
                        {
                            // recopy if this token was split across 2 buffers (undoubling IACs)
                            n = (p - op) + (q - oq);
                            Byte[] buf = new Byte[n];
                            n = 0;
                            for (Int32 i = op; i < p; i++)
                            {
                                buf[n++] = mRecvBuf[i];
                            }
                            for (Int32 i = oq; i < q; i++)
                            {
                                buf[n++] = buffer[i];
                            }
                            for (Int32 i = 0; i < n; i++)
                            {
                                if (buf[i] != (Byte)IAC.IAC)
                                {
                                    continue;
                                }
                                if (buf[i] == buf[i + 1])
                                {
                                    n--;
                                    for (Int32 j = i; j < n; j++)
                                    {
                                        buf[j] = buf[j + 1];
                                    }
                                }
                            }
                            return(new Token(TokenType.SB, buf, 2, n - 4));
                        }
                        // undouble embedded IACs
                        n = q;
                        for (Int32 i = oq; i < n; i++)
                        {
                            if (buffer[i] != (Byte)IAC.IAC)
                            {
                                continue;
                            }
                            if (buffer[i] == buffer[i + 1])
                            {
                                n--;
                                for (Int32 j = i; j < n; j++)
                                {
                                    buffer[j] = buffer[j + 1];
                                }
                            }
                        }
                        return(new Token(TokenType.SB, buffer, oq + 2, n - oq - 4));
                    }
                    state = 11;
                    break;
                }
            }
            if (state == 0)
            {
                return(new Token(TokenType.None, null, 0, 0));
            }
            if (state == 1)
            {
                return(new Token(TokenType.Data, buffer, oq, q - oq));
            }
            return(new Token(TokenType.Invalid, null, 0, 0));
        }
Exemple #4
0
 private void Send_IAC(IAC command)
 {
     Send_IAC((Byte)command);
 }