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;
}