diff options
Diffstat (limited to 'lib/libftp/FtpRetr.c')
-rw-r--r-- | lib/libftp/FtpRetr.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/libftp/FtpRetr.c b/lib/libftp/FtpRetr.c new file mode 100644 index 0000000..889621f --- /dev/null +++ b/lib/libftp/FtpRetr.c @@ -0,0 +1,82 @@ +/* + Library for ftpd clients.(libftp) + Copyright by Oleg Orel + All rights reserved. + +This library is desined for free, non-commercial software creation. +It is changeable and can be improved. The author would greatly appreciate +any advises, new components and patches of the existing programs. +Commercial usage is also possible with participation of it's author. + + + +*/ + +#include "FtpLibrary.h" + +STATUS FtpRetr (FTP * con , char * command , + char *in , char * out) +{ + FILE *o; + int c; + struct stat st; + char buffer[FTPBUFSIZ],buffer2[FTPBUFSIZ]; + register int size; + + FtpFilenameChecker(&in,&out); + + if ( FtpTestFlag(con,FTP_REST) && stat(out,&st)==0) + { + con -> seek = st.st_size; + if ((o=Ftpfopen(out,"a+"))==NULL) + return EXIT(con,LQUIT); + } + else + { + con -> seek = 0; + if ((o=Ftpfopen(out,"w+"))==NULL) + return EXIT(con,LQUIT); + } + + + if ( FtpError(FtpData(con,command,in,"r"))) + { + + if (con->seek==0) return EXIT(con,con->errno); + + con -> seek = 0; + fclose(o); + + if ( FtpError(FtpData(con,command,in,"r")) ) + { + return EXIT(con,con->errno); + } + + if ((o=Ftpfopen(out,"w+"))==NULL) + return EXIT(con,LQUIT); + } + + + fseek(o,con->seek,0); + + while((size=FtpReadBlock(con,buffer,FTPBUFSIZ))>0) + { + if (write(fileno(o),buffer,size)!=size) + return EXIT(con,LQUIT); + } + + Ftpfclose(o); + return FtpClose(con); +} + + + + + + + + + + + + |