⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddns.c

📁 使用C语言的cgi程序
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include "PRO_file.h"
#include "PRO_GetStr.h"
#include "PRO_SetStr.h"
#include "PRO_SetMultiItemStr.h"
#include "ddns.h"
#include "wan.h"
#include "h_const.h"
#include "system.h"

#define SYSCONF "/var/sys_ipcam.conf"

int ReadDDNSConf(ddns_conf *conf,int poe_acc_index)
{
	FILE *fp;
	char key[32],hostname[48];
	char *p;
	char no[3];
	if(!conf)
		return DDNS_ReadConfErr;
	fp=fopen(SYSCONF,"rt");
	if(!fp)
		return DDNS_ReadConfErr;
#ifdef _MULTI_PPPOE_		
	if(poe_acc_index>=0&&poe_acc_index<MAX_PPPOE_ACCOUNT)
		sprintf(no,"%d",poe_acc_index+1);
	else
#endif
		no[0]='\0';
	sprintf(key,"%sddns_name",no);
	PRO_GetStr("DDNS",key,conf->ddns_user,DDNS_MaxNameLen,fp);

	sprintf(key,"%sddns_pwd",no);
	PRO_GetStr("DDNS",key,conf->ddns_pwd,DDNS_MaxPassLen,fp);

	sprintf(key,"%sdomain_name",no);
	PRO_GetStr("DDNS",key,hostname,48,fp);

	fclose(fp);

	p=strrchr(hostname,'.');
	if(!p||p==hostname)
		return -1;
	memset(conf->tl_domain,'\0',sizeof(conf->tl_domain));
	strncpy(conf->tl_domain,p+1,DDNS_MaxTlDmLen);
	*p=0;
	p=strrchr(hostname,'.');
	if(!p||p==hostname)
		return -1;
	memset(conf->dyn_domain,'\0',sizeof(conf->dyn_domain));
	strncpy(conf->dyn_domain,p+1,DDNS_MaxDynDmLen);
	*p=0;
	memset(conf->user_domain,'\0',sizeof(conf->user_domain));
	strncpy(conf->user_domain,hostname,DDNS_MaxUserDmLen);

	return DDNS_OK;
}

int CheckDDNSConf(ddns_conf *conf)
{
	return DDNS_OK;
}

int SaveDDNSConf(ddns_conf *conf,int poe_acc_index)
{
	multi_items	all_items[DDNS_ITEM_NUM];
	char domain[48];
	int ret;
	char no[3];
	ret=CheckDDNSConf(conf);
	if(ret)
		return ret;
#ifdef _MULTI_PPPOE_		
	if(poe_acc_index>=0&&poe_acc_index<MAX_PPPOE_ACCOUNT)
		sprintf(no,"%d",poe_acc_index+1);
	else
#endif
		no[0]='\0';
 		
	sprintf(all_items[DDNS_USER].key,"%sddns_name",no);
	all_items[DDNS_USER].value=conf->ddns_user;

	sprintf(all_items[DDNS_PWD].key,"%sddns_pwd",no);
	all_items[DDNS_PWD].value=conf->ddns_pwd;

	sprintf(all_items[DOMAIN_NAME].key,"%sdomain_name",no);
	sprintf(domain,"%s.%s.%s",conf->user_domain,conf->dyn_domain,conf->tl_domain);
	all_items[DOMAIN_NAME].value=domain;

	ret=PRO_SetMultiItemStr("DDNS",all_items,DDNS_ITEM_NUM,SYSCONF);
	if(ret)
		return DDNS_SaveConfErr;
	
	//system("/sbin/ez-ipupdate >/dev/null 2>&1");
	StartDDNS(0);

	return DDNS_OK;
}

int StartDDNS(int bg)
{
	char cmd[128];
	ddns_conf conf, *pConf;
	ReadDDNSConf(&conf, 0);
	pConf = &conf;
	ReadSystemSettings(&system_conf);
	if(pConf->ddns_user[0] && pConf->user_domain[0])
	{
		sprintf(cmd, "/sbin/ez-ipupdate -u %s:%s -h %s.%s.%s -S %s -i %s 2>/dev/null %s", pConf->ddns_user, pConf->ddns_pwd, 
						pConf->user_domain, pConf->dyn_domain, pConf->tl_domain,
						(strcmp("3322", pConf->dyn_domain)==0)?"qdns":pConf->dyn_domain,
						(system_conf.Connection == CONNECTION_SINGLE_PPPOE)?PPP0_WAN:ETH_WAN, (bg == 1)?"&":"");
		
		system(cmd);
		return 0;
	}
	return -1;
}

int StopDDNS()
{
	system("/bin/killall -QUIT ez-ipupdate 2>/dev/null");
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -