?? intotodns.c
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h> //for O_RDWR,open
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <sys/poll.h> //for poll
#include <linux/if.h> //for ifreq
#include <linux/route.h>
#include <unistd.h>
#include <stdint.h>
#include "IntotoDNS.h"
#ifndef __WAG302TYPE_H__
#define TRUE 1
#define FALSE 0
#endif
typedef uint32_t bool_t;
bool_t IsValidIP(in_addr_t ulIP);
///////////////////////////////////////////////////////////////////////////////
// domain name server (DNS)
///////////////////////////////////////////////////////////////////////////////
static bool_t IntotoExchangeUdpMsg(
uint16_t usPort,
void *pMsg,
uint32_t ulSize,
bool_t bExpectResp
)
{
int iSockFd = socket(AF_INET,SOCK_DGRAM,0);
if (iSockFd>=0)
{
int iSendBytes = 0;
struct sockaddr_in sin = {0};
sin.sin_family = AF_INET;
sin.sin_port = htons(usPort);
sin.sin_addr.s_addr = INADDR_LOOPBACK;
iSendBytes = sendto(iSockFd, pMsg, ulSize,
MSG_DONTROUTE, (struct sockaddr*)&sin, sizeof(sin));
if (iSendBytes==ulSize && bExpectResp)
{
fd_set RcvFdSet;
struct timeval timeout = {0};
struct sockaddr sockFrom = {0};
int iSockFromLen = 0;
FD_ZERO(&RcvFdSet);
FD_SET(iSockFd, &RcvFdSet);
timeout.tv_sec = 2; //seconds
select(iSockFd + 1, &RcvFdSet, NULL, NULL, &timeout);
iSendBytes = (FD_ISSET(iSockFd, &RcvFdSet))?
recvfrom(iSockFd, pMsg, ulSize, 0, &sockFrom, &iSockFromLen): -1;
}
close(iSockFd);
if (iSendBytes != ulSize)
{
printf("IntotoExchangeUdpMsg fail port:%d SendBytes:%d ulSize:%d!\n",
usPort, iSendBytes, ulSize);
}
return iSendBytes == ulSize;
}
printf("IntotoExchangeUdpMsg fail port:%d!\n", usPort);
return FALSE;
}
#define DNSRD_SUPPORT
#define DNSRD_LOOPBACK_PORT_NUM_START 65097
#ifdef DNSRD_SUPPORT
#define DNSRD_LOOPBACK_PORT (DNSRD_LOOPBACK_PORT_NUM_START + 0 )
#define DNSRD_LOCAL_PORT (DNSRD_LOOPBACK_PORT_NUM_START + 1 )
#endif /*DNSRD_SUPPORT*/
bool_t IntotoStaticNameServerAdd(in_addr_t ulIP)
{
DNSRDCntrlMsg_t DnsMsg = {0};
DnsMsg.CmdType = DNSRD_ADD_NAME_SERVER;
DnsMsg.Cmd.Server.ServerIp = ulIP;
DnsMsg.Cmd.Server.uiFlags = DNSRD_ADMIN_CONFIG;
return IntotoExchangeUdpMsg(DNSRD_LOOPBACK_PORT, &DnsMsg, sizeof(DnsMsg), TRUE);
}
static bool_t IntotoStaticNameServerRemove(in_addr_t ulIP)
{
DNSRDCntrlMsg_t DnsMsg = {0};
DnsMsg.CmdType = DNSRD_DROP_NAME_SERVER;
DnsMsg.Cmd.Server.ServerIp = ulIP;
DnsMsg.Cmd.Server.uiFlags = DNSRD_ADMIN_CONFIG;
return IntotoExchangeUdpMsg(DNSRD_LOOPBACK_PORT, &DnsMsg, sizeof(DnsMsg), TRUE);
}
void IntotoStaticNameServerRemoveAll(void)
{
#define T_SUCCESS 0
DNSRDCntrlMsg_t DnsList = {0};
DNSServer_t *pServers = DnsList.Cmd.CmdServList.servers;
DnsList.CmdType = DNSRD_GET_SERVER_LIST;
if (IntotoExchangeUdpMsg(DNSRD_LOOPBACK_PORT, &DnsList, sizeof(DnsList),TRUE)
&& T_SUCCESS==DnsList.CmdType)
{
uint32_t ulCount = DnsList.Cmd.CmdServList.srvrcnt;
while (ulCount-->0)
{
//if (DNSRD_ADMIN_CONFIG==pServers[ulCount].uiFlags)
//{
// Remove it.
IntotoStaticNameServerRemove(pServers[ulCount].ServerIp);
//}
}
}
}
bool_t IntotoStaticNameServerUpdate(
in_addr_t inDnsPrimary,
in_addr_t inDnsSecondary
)
{
IntotoStaticNameServerRemoveAll();
if (IsValidIP(inDnsPrimary))
{
IntotoStaticNameServerAdd(inDnsPrimary);
}
if (IsValidIP(inDnsSecondary))
{
IntotoStaticNameServerAdd(inDnsSecondary);
}
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -