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*/