Ftpsock.pas
Falk0ner, вс, 06/07/2008 - 15:35.
unit FtpSock;
{
CrtSocket for Delphi 32
Copyright (C) 1999-2001 Paul Toth <tothpaul@free.fr>
<a href="http://tothpaul.free.fr
This" title="http://tothpaul.free.fr
This">http://tothpaul.free.fr
This</a> program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
interface
uses
CrtSock,SysUtils;
Function FtpLogon(Server,User,Password:string):integer;
Procedure FtpLogoff;
Function FtpQuote(cmd:string):boolean;
Function FtpOpenWrite(FileName:string):integer;
Function FtpOpenRead(FileName:string):integer;
Function FtpClose(FileHandle:integer):boolean;
Function FtpError:string;
implementation
var
ftpin,ftpout:TextFile;
last:string;
read:boolean;
Function FtpError:string;
begin
result:=last;
end;
Function ReadString:string;
begin
repeat
readln(ftpin,Result);
// writeln(result);
until (Length(Result)<4)or(Result[4]<>'-');
last:=Result;
end;
Procedure WriteString(s:string);
begin
// writeln('>>>',s);
WriteLn(ftpout,s);
end;
Function Status:char;
var
s:string;
begin
s:=ReadString;
if s='' then Status:='?' else Status:=s[1];
end;
Function Exec(cmd:string):char;
begin
Writestring(cmd);
Result:=Status;
end;
Function FtpLogon(Server,User,Password:string):integer;
begin
Result:=CallServer(Server,21);
if Result>0 then begin
AssignCrtSock(Result,ftpin,ftpout);
if Status='2' then begin
if (Exec('USER '+User)='3') and (Exec('PASS '+Password)='2') then exit;
Disconnect(Result);
Result:=-3;
end else begin
Disconnect(Result);
Result:=-2;
end;
end;
end;
Procedure FtpLogoff;
begin
Exec('QUIT');
CloseFile(ftpout);
end;
Function FtpQuote(cmd:string):boolean;
begin
Writestring(Cmd);
Result:=(Status='2');
end;
Function GetValue(var s:string):integer;
var
i:integer;
begin
i:=length(s); while s[i]<>',' do dec(i);
Result:=StrToInt(copy(s,i+1,3));
SetLength(s,i-1);
end;
Function FtpOpenWrite(FileName:string):integer;
var
s:string;
b,e:integer;
port:word;
begin
read:=false;
Result:=-1;
if Exec('PASV')<>'2' then exit;
b:=4; while (b<length(last)) and (not (last[b] in ['0'..'9'])) do inc(b);
e:=Length(last); while (e>0) and (not (last[b] in ['0'..'9'])) do dec(b);
s:=copy(last,b,e-b-1);
port:=getvalue(s);
port:=256*getvalue(s)+port;
for e:=1 to Length(s) do if s[e]=',' then s[e]:='.'; // replace "," by "." in IP address
WriteString('STOR '+FileName);
// writeln('call ',s,':',port);
Result:=CallServer(s,port);
if (Status<>'1')and(Result>=0) then begin
Disconnect(Result);
Result:=-1;
end;
end;
Function FtpOpenRead(FileName:string):integer;
var
s:string;
b,e:integer;
port:word;
begin
read:=true;
Result:=-1;
if Exec('PASV')<>'2' then exit;
b:=4; while (b<length(last)) and (not (last[b] in ['0'..'9'])) do inc(b);
e:=Length(last); while (e>0) and (not (last[b] in ['0'..'9'])) do dec(b);
s:=copy(last,b,e-b-1);
port:=getvalue(s);
port:=256*getvalue(s)+port;
for e:=1 to Length(s) do if s[e]=',' then s[e]:='.'; // replace "," by "." in IP address
WriteString('RETR '+FileName);
Result:=CallServer(s,port);
if (Status<>'1')and(Result>=0) then begin
Disconnect(Result);
Result:=-1;
end;
end;
Function FtpClose(FileHandle:integer):boolean;
begin
Disconnect(FileHandle);
result:=Status='2';
end;
end.
{
CrtSocket for Delphi 32
Copyright (C) 1999-2001 Paul Toth <tothpaul@free.fr>
<a href="http://tothpaul.free.fr
This" title="http://tothpaul.free.fr
This">http://tothpaul.free.fr
This</a> program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
interface
uses
CrtSock,SysUtils;
Function FtpLogon(Server,User,Password:string):integer;
Procedure FtpLogoff;
Function FtpQuote(cmd:string):boolean;
Function FtpOpenWrite(FileName:string):integer;
Function FtpOpenRead(FileName:string):integer;
Function FtpClose(FileHandle:integer):boolean;
Function FtpError:string;
implementation
var
ftpin,ftpout:TextFile;
last:string;
read:boolean;
Function FtpError:string;
begin
result:=last;
end;
Function ReadString:string;
begin
repeat
readln(ftpin,Result);
// writeln(result);
until (Length(Result)<4)or(Result[4]<>'-');
last:=Result;
end;
Procedure WriteString(s:string);
begin
// writeln('>>>',s);
WriteLn(ftpout,s);
end;
Function Status:char;
var
s:string;
begin
s:=ReadString;
if s='' then Status:='?' else Status:=s[1];
end;
Function Exec(cmd:string):char;
begin
Writestring(cmd);
Result:=Status;
end;
Function FtpLogon(Server,User,Password:string):integer;
begin
Result:=CallServer(Server,21);
if Result>0 then begin
AssignCrtSock(Result,ftpin,ftpout);
if Status='2' then begin
if (Exec('USER '+User)='3') and (Exec('PASS '+Password)='2') then exit;
Disconnect(Result);
Result:=-3;
end else begin
Disconnect(Result);
Result:=-2;
end;
end;
end;
Procedure FtpLogoff;
begin
Exec('QUIT');
CloseFile(ftpout);
end;
Function FtpQuote(cmd:string):boolean;
begin
Writestring(Cmd);
Result:=(Status='2');
end;
Function GetValue(var s:string):integer;
var
i:integer;
begin
i:=length(s); while s[i]<>',' do dec(i);
Result:=StrToInt(copy(s,i+1,3));
SetLength(s,i-1);
end;
Function FtpOpenWrite(FileName:string):integer;
var
s:string;
b,e:integer;
port:word;
begin
read:=false;
Result:=-1;
if Exec('PASV')<>'2' then exit;
b:=4; while (b<length(last)) and (not (last[b] in ['0'..'9'])) do inc(b);
e:=Length(last); while (e>0) and (not (last[b] in ['0'..'9'])) do dec(b);
s:=copy(last,b,e-b-1);
port:=getvalue(s);
port:=256*getvalue(s)+port;
for e:=1 to Length(s) do if s[e]=',' then s[e]:='.'; // replace "," by "." in IP address
WriteString('STOR '+FileName);
// writeln('call ',s,':',port);
Result:=CallServer(s,port);
if (Status<>'1')and(Result>=0) then begin
Disconnect(Result);
Result:=-1;
end;
end;
Function FtpOpenRead(FileName:string):integer;
var
s:string;
b,e:integer;
port:word;
begin
read:=true;
Result:=-1;
if Exec('PASV')<>'2' then exit;
b:=4; while (b<length(last)) and (not (last[b] in ['0'..'9'])) do inc(b);
e:=Length(last); while (e>0) and (not (last[b] in ['0'..'9'])) do dec(b);
s:=copy(last,b,e-b-1);
port:=getvalue(s);
port:=256*getvalue(s)+port;
for e:=1 to Length(s) do if s[e]=',' then s[e]:='.'; // replace "," by "." in IP address
WriteString('RETR '+FileName);
Result:=CallServer(s,port);
if (Status<>'1')and(Result>=0) then begin
Disconnect(Result);
Result:=-1;
end;
end;
Function FtpClose(FileHandle:integer):boolean;
begin
Disconnect(FileHandle);
result:=Status='2';
end;
end.
Отправить комментарий