www.pudn.com > Ftpwork > Handle.h
/***************************************************************************
Handle.h - description
-------------------
begin : Wed Nov 6 2002
copyright : (C) 2002 by
email :
***************************************************************************/
/***************************************************************************
* *
* This 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. *
* *
***************************************************************************/
#include
#define MAX_BLOCK 65535
int ComHand(char *Buffer,int Len,ThreadState *state);
int VldComHand(char *Buffer,int Len,ThreadState *state);
int SendFile(int File,ThreadState *state,char *filename);
int RecvFile(int File,ThreadState *state,unsigned long filesize);
int Handle(char *Buffer,int Len,ThreadState *state)
{
char Type;
Type=*Buffer;
switch(Type){
case 'c' :
return ComHand( Buffer, Len, state );
break;
default:
break;
}
return TRUE;
}
int ComHand(char *Buffer,int Len,ThreadState *state)
{
char Type;
Type=*(Buffer+1);
switch(Type){
case 'v' :
char a[20];
char b[20];
char One[20];
char Two[20];
char Respond[50];
sscanf(Buffer,"%*s username=%s password=%s",a,b);
sprintf(One,"%s","Hello");
sprintf(Two,"%s","123");
int Ret;
Ret= StringCompare(a,One);
if (Ret == TRUE)
{
Ret= StringCompare(b,Two);
if(Ret == TRUE){
*(state->Validate)=TRUE;
sprintf( Respond, "%s", "cy info=Welcome" );
}
else{
sprintf( Respond, "%s", "cn info=Sorry Password is not correct" );
}
}
else
{
sprintf( Respond, "%s", "cn info=Sorry There is no this account" );
}
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
break;
case 'q':
return FALSE;
break;
default:
if(*(state->Validate)==FALSE){
sprintf( Respond, "%s", "cn info=You are not validate" );
MySend( state->SockID, Respond,20, MSG_NOSIGNAL );
}
else VldComHand( Buffer, Len, state);
break;
}
return TRUE;
}
int VldComHand(char *Buffer,int Len,ThreadState *state)
{
char Type;
Type=*(Buffer+1);
char *Respond;
char tem[MAX_PATH];
switch(Type){
case 'l' :
long BufLen;
BufLen=GetLen(state->Path);
Respond=new char[BufLen+8];
sprintf( Respond, "%s", "cy info=" );
GetList(state->Path,Respond);
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
delete Respond;
break;
case 'c' :
sscanf(Buffer,"%*s path=%s",tem);
if( StringCompare(tem, ".")==TRUE ){
Respond=new char[MAX_PATH];
sprintf( Respond, "%s", "cy info=" );
strcat( Respond, state->Path );
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
delete Respond;
return TRUE;
}
else{
char filename[MAX_PATH];
Respond=new char[MAX_PATH+8];
int Temb=NOT_EXIST;
if( StringCompare(tem, "..")==TRUE ){
if( StringCompare(state->Path, RootPath)==TRUE )
sprintf(filename,"%s", "" );
else {
for(int i=strlen(state->Path)-2;i>=0;i--)
if(*(state->Path+i)=='/'){
*(state->Path+i)='\0';
break;
}
sprintf( filename, "%s" , state->Path );
Temb=DIR_EXIST;
}
}
else{
sprintf( filename, "%s" , state->Path );
strcat( filename, tem );
Temb=DirExist(filename);
}
switch(Temb){
case DIR_EXIST :
strcat( filename,"/" );
sprintf( state->Path , "%s", filename );
sprintf( Respond, "%s", "cy info=" );
strcat( Respond, filename );
break;
case FILE_EXIST :
sprintf( Respond, "%s", "cn info=It is a file not directory" );
break;
case NOT_EXIST :
sprintf( Respond, "%s", "cn info=The directory is not exist" );
break;
}
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
delete Respond;
}
break;
case 'm' :
Respond=new char[50];
int Temc;
char Temd[50];
char filename[MAX_PATH];
sscanf(Buffer,"%*s path=%s",Temd);
sprintf( filename, "%s" , state->Path );
strcat( filename, Temd );
Temc=DirExist(filename);
if( (Temc==DIR_EXIST)||(Temc==FILE_EXIST) ){
sprintf( Respond, "%s", "cn info=The directory is already exist" );
}
else{
sem_wait( &sem );
getcwd( tem, MAX_PATH );
printf("%s\n",tem);
chdir( state->Path );
if( mkdir( Temd, S_IROTH|S_IRUSR|S_IWUSR ) ==-1)
sprintf( Respond, "%s", "cN info=Can not make this directory" );
else
sprintf( Respond, "%s", "cy info=OK" );
chdir( tem );
sem_post( &sem );
}
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
delete Respond;
break;
case 'g':
char Teme[MAX_PATH];
Respond=new char[50];
sscanf(Buffer,"%*s file=%s",tem);
sprintf( Teme, "%s", state->Path );
strcat( Teme, tem );
int fileg;
fileg = open( Teme, O_RDONLY );
if( fileg==-1 ){
sprintf( Respond, "%s", "cn info=Can not open this file" );
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
}
else
SendFile( fileg, state, Teme );
delete Respond;
break;
case 'p':
char Temf[MAX_PATH];
Respond=new char[50];
unsigned long Temg;
sscanf(Buffer,"%*s file=%s size=%d",tem,&Temg);
sprintf( Temf, "%s", state->Path );
strcat( Temf, tem );
if( DirExist(Temf)==NOT_EXIST ){
int filep;
filep = open( Temf, O_RDWR | O_CREAT, S_IRWXU | S_IRWXO );
if( filep==-1 ){
sprintf( Respond, "%s", "cn info=Can not create this file" );
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
}
else{
sprintf( Respond, "%s", "cy" );
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
RecvFile( filep, state, Temg );
}
}
else{
sprintf( Respond, "%s", "cn info=File or directory already exist" );
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
}
delete Respond;
break;
default:
break;
}
return TRUE;
}
int SendFile(int File,ThreadState *state,char *filename)
{
char Respond[60];
sprintf( Respond, "%s", "cy info=" );
struct stat stat_p; // 'stat_p' is a pointer to a structure
stat (filename, &stat_p);
char tem[10];
sprintf(tem,"%d", stat_p.st_size);
strcat( Respond, tem );
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
char Permission[3];
int SockState[1];
MyRecv( state->SockID, Permission, 3, 0, SockState );
if(*SockState<1){
close(File);
return FALSE;
}
if(Permission[1]=='e')return FALSE;
else{
char *sendbuf=new char[MAX_BLOCK];
unsigned long SendSize;
SendSize=0;
long a;
while( SendSizeSockID, sendbuf, a, MSG_NOSIGNAL );
SendSize+=MAX_BLOCK;
}
delete []sendbuf;
}
close(File);
return TRUE;
}
int RecvFile(int File,ThreadState *state,unsigned long filesize)
{
char Respond[3];
sprintf( Respond, "%s", "cb" );
MySend( state->SockID, Respond,strlen(Respond)+1, MSG_NOSIGNAL );
char *recvbuf=new char[MAX_BLOCK];
unsigned long RecvSize;
RecvSize=0;
long a,b;
while( RecvSizeSockID, recvbuf, MAX_BLOCK, 0, SockState );
if(*SockState<1){
return FALSE;
close(File);
}
b=write( File, recvbuf, a);
RecvSize+=b;
}
delete []recvbuf;
close(File);
return TRUE;
}