www.pudn.com > Net_apps.rar > ddns.c


                                                                            /* 
********************************************************************************************************* 
* Copyright 2003 Service & Quality Technology CO., LTD. ALL RIGHTS RESERVED. 
* This software is provided under license and contains proprietary and 
* confidential material which is the property of SQ tech. 
* 
* FileName     : ddns.c 
* Description  : ddns clinet 
* 
* 
* Version control: 
*  $Revision: 0.1 $    Date: 2004/05/12 12:00:00  gofly 
*      first implemetation 
* 
********************************************************************************************************* 
*/ 
#include "opt.h" 
#if DDNS_OPEN 
#include "..\include\L3\net_apps\ddns\ddns.h" 
 
OS_EVENT		         *DdnsEvenSem; 
struct _TddnsState       *debugDdnsstate; 
INT8U                     ddnscount=0; 
/****************************************************************************/ 
/* FUNCTION NAME :   DdnsThread 
/* DESCRIPTION   : 
/* in PARAMETERS : 
/* out PARAMETERS: 
/* RETURN VALUES : 
/* EXAMPLE	 : 
*****************************************************************************/ 
void DdnsThread (void *data) 
{ 
 
    TddnsState              ddnsState; 
    INT8U                   Msg[128]; 
    INT8U                   ucErr; 
    debugDdnsstate  =   &ddnsState; 
 
    DdnsEvenSem             =    (OS_EVENT*)OSSemCreate(0); 
    ddnsState.RequestCount  =     0; 
    DdnsLog (NULL, 0, IOINIT); 
    sprintf(Msg,"DDNS CLIENT START.\x0d\x0a\x00"); 
    DdnsLog (Msg, strlen(Msg), IOW); 
    ddnsState.RequestCount  =   0; 
 
    while (Sntp_Status != OK ) 
    { 
        OSTimeDlyHMSM(0, 0, 1 , 0); 
        if(Sntp_Status == OK ) 
        { 
            break; 
        } 
    } 
 
   while(1) 
   { 
 
        ddnsState.ddns_state    =   DDNS_STOP; 
        sprintf(Msg,"DDNS CLIENT EVENT\x0d\x0a\x00"); 
        DdnsLog (Msg, strlen(Msg), IOW); 
        ddnsState.RequestCount++; 
 
        ddnscount = 1; 
 
        ddnsState.ddns_state    =   DDNS_NEW; 
        ddnsState.sock          =   INVALID_SOCKET; 
        while(2) 
        { 
            OSTimeDlyHMSM(0, 0, 0 , 200); 
            switch(ddnsState.ddns_state) 
            { 
                case DDNS_NEW: 
                    DdnsConnect((void*)&ddnsState); 
                    break; 
 
                case DDNS_SEND: 
                    DdnsSend((void*)&ddnsState); 
                    break; 
 
                case DDNS_RECV: 
                    DdnsRecv((void*)&ddnsState); 
                    break; 
 
                default: 
                    break; 
 
            } 
 
            if(ddnsState.ddns_state == DDNS_CLOSE) 
            { 
                close(ddnsState.sock); 
 
                if (ddnscount == 0) 
                { 
                    ddnsState.ddns_state = DDNS_STOP; 
                    break; 
                } 
                else 
                { 
                    ddnscount = 0; 
                    ddnsState.ddns_state = DDNS_NEW; 
                } 
            } 
 
        }// while(2) 
        OSSemPend(DdnsEvenSem, 0, &ucErr); 
 
   }// while(1) 
 
 
 
 
} 
 
/****************************************************************************/ 
/* FUNCTION NAME :   DdnsRecv 
/* DESCRIPTION   : 
/* in PARAMETERS : 
/* out PARAMETERS: 
/* RETURN VALUES : 
/* EXAMPLE	 : 
*****************************************************************************/ 
void DdnsRecv(void *data) 
{ 
    TddnsState * pDdnsState  = data; 
    INT8U               maxfdp1; 
    fd_set              readset; 
    INT8U               time_count; 
    INT16S              recv_len; 
    INT8U               Msg[1024]; 
    INT8U              *pMsgRecv; 
    struct  timeval     timeout={DDNS_RECV_TIMEOUT,0}; 
    maxfdp1    =  pDdnsState->sock + 1; 
    time_count =  0; 
    while(1) 
    { 
        FD_ZERO(&readset); 
        FD_SET(pDdnsState->sock , &readset); 
 
        select(maxfdp1, &readset, 0, 0,&timeout); 
 
        if(FD_ISSET(pDdnsState->sock, &readset)) 
        { 
            memset(Msg,0x00,sizeof(Msg)); 
            recv_len = recv(pDdnsState->sock , Msg, sizeof(Msg), 0); 
            if(recv_len <= 0) goto GOTO_DdnsRecv_ERR_END; 
 
            break; 
 
        } 
        else 
        { 
           time_count++; 
           if(time_count > 30) 
           { 
             goto GOTO_DdnsRecv_ERR_END; 
 
           } 
 
        } 
 
    }// while(1) 
 
 
    pMsgRecv = strstr(Msg,"\x0d\x0a\x0d\x0a") ; 
    pMsgRecv+=4;  // skip \n\n 
//   *pMsgRecv = '"'; 
 //  *(pMsgRecv + strlen(pMsgRecv)) = '"'; 
    DdnsLog(pMsgRecv,strlen(pMsgRecv),IOW); 
    sprintf(Msg,"\x0d\x0a""DDNS_DEBUG DdnsRecv  Success\x0d\x0a\x00") ; 
    DdnsLog(Msg,strlen(Msg),IOW); 
 
//    if (ddnscount == 1) 
//    { 
//        pDdnsState->ddns_state = DDNS_CLOSE; 
//        //ddnscount = 0; 
 
//    } 
//    else 
//    { 
//        pDdnsState->ddns_state = DDNS_CLOSE; 
//    } 
    pDdnsState->ddns_state = DDNS_CLOSE; 
    IoDDNS("DDNS_STAT",pMsgRecv, IOW, ROOT); 
    return; 
 
    GOTO_DdnsRecv_ERR_END: 
    sprintf(Msg,"DDNS_DEBUG DdnsRecv  fail\x0d\x0a\x00") ; 
    DdnsLog(Msg,strlen(Msg),IOW); 
    ddnscount = 0; 
    pDdnsState->ddns_state = DDNS_CLOSE; 
} 
/****************************************************************************/ 
/* FUNCTION NAME :   DdnsSend 
/* DESCRIPTION   : 
/* in PARAMETERS : 
/* out PARAMETERS: 
/* RETURN VALUES : 
/* EXAMPLE	 : 
*****************************************************************************/ 
void DdnsSend(void *data) 
{ 
    TddnsState * pDdnsState  = data; 
    INT8U   Msg[256]; 
    INT8U   AccessCode[128]; 
    INT16S   send_len; 
    //--- wile change from eeprom 
  /*  INT8U *pname        = "gofly"; 
    INT8U *ppass        = "goflytku"; 
    INT8U *phostname    = "gofly.dyndns.org";*/ 
    //------------------------------------- 
    INT8U *pname        = IoDDNS("DDNS_USER",NULL,IOR,ROOT); 
    INT8U *ppass        = IoDDNS("DDNS_GET_PASS",NULL,IOR,ROOT); 
    INT8U *phostname    = IoDDNS("DDNS_HOST",NULL,IOR,ROOT); 
    INT8U myip[20]; 
 
    sprintf((char*)Msg,"%s:%s\x00",pname,ppass); 
    Base64Encode((INT8U * const)AccessCode,(const INT8U*)Msg,strlen(Msg)); 
 
    if (ddnscount == 1) 
    { 
        memcpy(myip,"127.0.0.1",9); 
    } 
    else //if (ddnscount == 0) 
    { 
        if (PPPoE_Status == OK )///sock,Msg,strlen(Msg),0); 
 
    sprintf(Msg,"DDNS_DEBUG DdnsSend send size = %d  \x0d\x0a\x00", send_len) ; 
    DdnsLog(Msg,strlen(Msg),IOW); 
 
    if(send_len <= 0) goto  GOTO_DdnsSend_ERR_END; 
 
    sprintf(Msg,"DDNS_DEBUG DdnsSend ok  \x0d\x0a\x00") ; 
    DdnsLog(Msg,strlen(Msg),IOW); 
    pDdnsState->ddns_state = DDNS_RECV; 
    return; 
 
    GOTO_DdnsSend_ERR_END: 
    sprintf(Msg,"DDNS_DEBUG DdnsSend  fail\x0d\x0a\x00") ; 
    DdnsLog(Msg,strlen(Msg),IOW); 
    ddnscount = 0; 
    pDdnsState->ddns_state = DDNS_CLOSE; 
 
} 
/****************************************************************************/ 
/* FUNCTION NAME :   DdnsConnect 
/* DESCRIPTION   : 
/* in PARAMETERS : 
/* out PARAMETERS: 
/* RETURN VALUES : 
/* EXAMPLE	 : 
*****************************************************************************/ 
void DdnsConnect(void *data) 
{ 
    TddnsState * pDdnsState  = data; 
    INT8U        Msg[128]; 
    pDdnsState->S_ip_port_data.sin_port        =       htons(80); 
    pDdnsState->sock                           =       socket(0,SOCK_STREAM,0); 
    pDdnsState->S_ip_port_data.sin_addr.s_addr =       DDNS_SERVER_IP4;//0x5ec4d03f;//0x3fd0c45E;//63.208.196.94 
 
    if(pDdnsState->sock == 0xff) 
    { 
        sprintf(Msg,"DDNS_DEBUG ddns_connect socket() fail \x0d\x0a\x00") ; 
        DdnsLog(Msg,strlen(Msg),IOW); 
        goto GOTO_DdnsConnect_ERR_END; 
    } 
    if( -1  ==  connect(pDdnsState->sock, &pDdnsState->S_ip_port_data, 0)) 
    { 
 
        sprintf(Msg,"DDNS_DEBUG ddns_connect connect() fail  \x0d\x0a\x00") ; 
        DdnsLog(Msg,strlen(Msg),IOW); 
        close(pDdnsState->sock ); 
        goto GOTO_DdnsConnect_ERR_END; 
    } 
 
 
        sprintf(Msg,"DDNS_DEBUG ddns_connect connect() ok  \x0d\x0a\x00") ; 
        DdnsLog(Msg,strlen(Msg),IOW); 
        pDdnsState->ddns_state = DDNS_SEND; 
 
        return; 
 
        GOTO_DdnsConnect_ERR_END: 
 
        sprintf(Msg,"DDNS_DEBUG ddns_connect connect() fail  \x0d\x0a\x00") ; 
        DdnsLog(Msg,strlen(Msg),IOW); 
        ddnscount = 0; 
        pDdnsState->ddns_state = DDNS_CLOSE; 
 
 
} 
/****************************************************************************/ 
/* FUNCTION NAME :   DdnsLog 
/* DESCRIPTION   : 
/* in PARAMETERS : 
/* out PARAMETERS: 
/* RETURN VALUES : 
/* EXAMPLE	 : 
*****************************************************************************/ 
 
void DdnsLog (INT8U *data,INT32U Size,INT8U op) 
{ 
 static INT8U Log[1024]; 
 
 debugDdnsstate->pLog = Log; 
 if(op == IOW)SHOW_EX1(DDNS_DEBUG ,data); 
 
 asm {PUSHF; CLI} 
 switch(op) 
 { 
    case IOR: 
        memset(data, 0x00, Size); 
        Size = min(Size, sizeof(Log)); 
        memcpy(data, Log,Size); 
 
        break; 
    case IOW: 
        if(Size  > sizeof(Log)) break; 
 
        if(Size + strlen(Log)  >=  sizeof(Log)) 
            memset(Log, 0x00, sizeof(Log)); 
        strcat(Log, data); 
 
        break; 
    case IOINIT: 
        memset(Log, 0x00, sizeof(Log)); 
        break; 
 } 
 
 
 asm  POPF 
} 
/****************************************************************************/ 
/* FUNCTION NAME :   DdnsApi 
/* DESCRIPTION   : 
/* in PARAMETERS : 
/* out PARAMETERS: 
/* RETURN VALUES : 
/* EXAMPLE	 : 
*****************************************************************************/ 
 
void DdnsApi (INT8U *RecvD,INT8U *SendD,INT32U SendDSize) 
{ 
 
    if(debugDdnsstate->ddns_state    ==   DDNS_STOP) 
        sprintf(RecvD, "%d DDNS EVEN ALLOW\x00",debugDdnsstate->RequestCount); 
    else 
        sprintf(RecvD, "%d DDNS EVEN deny\x00",debugDdnsstate->RequestCount); 
 
    DdnsStart(); 
 
} 
 
void DdnsStart() 
{ 
    //OSTimeDlyResume(1); 
    OSSemPost(DdnsEvenSem); 
} 
#endif/*DDNS_OPEN*/