WriteBuf checks for blocking. Outbound telnet buffer flush now escaped telnet IAC

This commit is contained in:
mysticbbs 2012-07-14 15:03:05 -04:00
parent fb3b61187c
commit 2f8206edf2
1 changed files with 44 additions and 13 deletions

View File

@ -61,7 +61,8 @@ Type
Function WriteLine (Str: String) : LongInt; Function WriteLine (Str: String) : LongInt;
Function WriteStr (Str: String) : LongInt; Function WriteStr (Str: String) : LongInt;
Function WriteFile (Str: String) : Boolean; Function WriteFile (Str: String) : Boolean;
Procedure ProcessBuf (Var Buf: TSocketBuffer; Var Len: LongInt); Procedure TelnetInBuffer (Var Buf: TSocketBuffer; Var Len: LongInt);
Procedure TelnetOutBuffer (Var Buf: TSocketBuffer; Var Len: LongInt);
Function ReadBuf (Var Buf; Len: LongInt) : LongInt; Function ReadBuf (Var Buf; Len: LongInt) : LongInt;
Function ReadLine (Var Str: String) : LongInt; Function ReadLine (Var Str: String) : LongInt;
Function SetBlocking (Block: Boolean): LongInt; Function SetBlocking (Block: Boolean): LongInt;
@ -87,6 +88,8 @@ Implementation
{ TELNET NEGOTIATION CONSTANTS } { TELNET NEGOTIATION CONSTANTS }
Const Const
MaxStatusText = 20;
Telnet_IAC = #255; Telnet_IAC = #255;
Telnet_DONT = #254; Telnet_DONT = #254;
Telnet_DO = #253; Telnet_DO = #253;
@ -163,16 +166,22 @@ Function TSocketClass.WriteBuf (Var Buf; Len: LongInt) : LongInt;
Begin Begin
Result := fpSend(FSocketHandle, @Buf, Len, FPSENDOPT); Result := fpSend(FSocketHandle, @Buf, Len, FPSENDOPT);
// While (Result = -1) and ((SocketError = SYS_EWOULDBLOCK) or (SocketError = SYS_ENOBUFS)) Do Begin While (Result = -1) and (SocketError = ESOCKEWOULDBLOCK) Do Begin
// WaitMS(10); WaitMS(10);
// Result := fpSend(FSocketHandle, @Buf, Len, FPSENDOPT); Result := fpSend(FSocketHandle, @Buf, Len, FPSENDOPT);
// End; End;
End; End;
Procedure TSocketClass.BufFlush; Procedure TSocketClass.BufFlush;
Var
Count : LongInt;
Start : LongInt;
Begin Begin
If FOutBufPos > 0 Then Begin If FOutBufPos > 0 Then Begin
If FTelnetClient or FTelnetServer Then
TelnetOutBuffer(FOutBuf, FOutBufPos);
WriteBuf (FOutBuf, FOutBufPos); WriteBuf (FOutBuf, FOutBufPos);
FOutBufPos := 0; FOutBufPos := 0;
@ -244,7 +253,30 @@ Begin
Result := True; Result := True;
End; End;
Procedure TSocketClass.ProcessBuf (Var Buf: TSocketBuffer; Var Len: LongInt); Procedure TSocketClass.TelnetOutBuffer (Var Buf: TSocketBuffer; Var Len: LongInt);
Var
Temp : TSocketBuffer;
TempPos : LongInt;
Count : LongInt;
Begin
TempPos := 0;
For Count := 0 to Len Do
If Buf[Count] = TELNET_IAC Then Begin
Temp[TempPos] := TELNET_IAC;
Inc (TempPos);
Temp[TempPos] := TELNET_IAC;
Inc (TempPos);
End Else Begin
Temp[TempPos] := Buf[Count];
Inc (TempPos);
End;
Buf := Temp;
Len := TempPos - 1;
End;
Procedure TSocketClass.TelnetInBuffer (Var Buf: TSocketBuffer; Var Len: LongInt);
Procedure SendCommand (YesNo, CmdType: Char); Procedure SendCommand (YesNo, CmdType: Char);
Var Var
@ -386,7 +418,7 @@ Begin
Exit; Exit;
End; End;
If FTelnetClient or FTelnetServer Then ProcessBuf(FInBuf, FInBufEnd); If FTelnetClient or FTelnetServer Then TelnetInBuffer(FInBuf, FInBufEnd);
End; End;
If Len > FInBufEnd - FInBufPos Then Len := FInBufEnd - FInBufPos; If Len > FInBufEnd - FInBufPos Then Len := FInBufEnd - FInBufPos;
@ -467,7 +499,6 @@ Begin
Result := PInAddr(HostEnt^.h_addr_list^)^.S_addr Result := PInAddr(HostEnt^.h_addr_list^)^.S_addr
Else Else
Result := LongInt(StrToNetAddr(Host)); Result := LongInt(StrToNetAddr(Host));
// Result := NetAddrToStr(@Host[1]);
End; End;
Function TSocketClass.Connect (Address: String; Port: Word) : Boolean; Function TSocketClass.Connect (Address: String; Port: Word) : Boolean;
@ -530,8 +561,8 @@ Begin
If Sock = -1 Then Exit; If Sock = -1 Then Exit;
FPeerIP := NetAddrToStr(SIN.sin_addr); FPeerIP := NetAddrToStr(SIN.sin_addr);
PHE := GetHostByAddr(@SIN.sin_addr, 4, PF_INET); PHE := GetHostByAddr(@SIN.sin_addr, 4, PF_INET);
If Not Assigned(PHE) Then If Not Assigned(PHE) Then
FPeerName := 'Unknown' FPeerName := 'Unknown'
Else Else
@ -565,7 +596,7 @@ Begin
If SocketStatus = NIL Then Exit; If SocketStatus = NIL Then Exit;
Try Try
If SocketStatus.Count > 20 Then If SocketStatus.Count > MaxStatusText Then
SocketStatus.Delete(0); SocketStatus.Delete(0);
Res := '(' + Copy(DateDos2Str(CurDateDos, 1), 1, 5) + ' ' + TimeDos2Str(CurDateDos, False) + ') ' + Str; Res := '(' + Copy(DateDos2Str(CurDateDos, 1), 1, 5) + ' ' + TimeDos2Str(CurDateDos, False) + ') ' + Str;
@ -573,7 +604,7 @@ Begin
If Length(Res) > 74 Then Begin If Length(Res) > 74 Then Begin
SocketStatus.Add(Copy(Res, 1, 74)); SocketStatus.Add(Copy(Res, 1, 74));
If SocketStatus.Count > 20 Then If SocketStatus.Count > MaxStatusText Then
SocketStatus.Delete(0); SocketStatus.Delete(0);
SocketStatus.Add(strRep(' ', 14) + Copy(Res, 75, 255)); SocketStatus.Add(strRep(' ', 14) + Copy(Res, 75, 255));