diff options
Diffstat (limited to 'lib/libftp/FtpMessage.c')
-rw-r--r-- | lib/libftp/FtpMessage.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/lib/libftp/FtpMessage.c b/lib/libftp/FtpMessage.c new file mode 100644 index 0000000..dd02261 --- /dev/null +++ b/lib/libftp/FtpMessage.c @@ -0,0 +1,130 @@ +/* + 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" + + +static char * FtpMessageList[1000]; + +INLINE static char *___gets(char *s, int maxchars, FTP *ftp) +{ + char *p=s; + int c; + + while (1) + { + if ((c = FtpGetc(ftp,FTPCMD(ftp))) == EOF) + return NULL; + + if ( c == '\n' && *(p-1) == '\r' ) + { + p--; + *p='\0'; + return s; + } + + if ( (p-s) > maxchars ) return NULL; + + *p++=(char)c; + } +} + + + + +int FtpGetMessage(FTP *con , char * Message ) +{ + int i=0,n; + char tmp[1024]; + + while(1) + { + if (___gets(tmp,sizeof tmp,con)==NULL) + return EXIT(con,QUIT); + if (isdigit(tmp[0]) && + isdigit(tmp[1]) && + isdigit(tmp[2]) && + tmp[3]!='-') break; + if ( con -> debug != NULL ) + (*con->debug)(con,0,tmp); + } + + strcpy(Message,tmp); + FtpInitMessageList(); + FtpMessageList[n=FtpNumber(Message)] = + ( char * ) malloc ( strlen(Message) + 1); + strcpy(FtpMessageList[n] , Message ); + if ( con -> debug != NULL ) + (*con->debug)(con,n,Message); + + return n; +} + +STATUS FtpSendMessage(FTP *ftp,char * Message ) +{ + char *msg=Message; + + while (*Message) + FtpAssert(ftp,FtpPutc(ftp,FTPCMD(ftp),*Message++)); + + FtpAssert(ftp,FtpPutc(ftp,FTPCMD(ftp),'\015')); + FtpAssert(ftp,FtpPutc(ftp,FTPCMD(ftp),'\012')); + + if ( ftp -> debug != NULL ) + (*ftp->debug)(ftp,0,msg); + return 1; +} + +char *FtpMessage(int number) +{ + extern int sys_nerr,errno; +#ifndef __FreeBSD__ + extern char *sys_errlist[]; +#endif + + FtpInitMessageList(); + if ( number == 0 ) + return sys_errlist[errno]; + return (FtpMessageList[abs(number)]==NULL)? + "":FtpMessageList[abs(number)]; +} + + +STATUS FtpInitMessageList() +{ + int i; + static u = 0; + + if ( u ) + return 1; + + u = 1; + + for (i=0;i<1000;i++) + FtpMessageList[i]=NULL; + + return 1; +} + +int FtpNumber(char *Message) +{ + return (Message[0] - '0') * 100 + + (Message[1] - '0') * 10 + + (Message[2] - '0') ; +} + + + + + |