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

📄 hsb-ddns.c

📁 一个收集所有最基本功能的函数库;所有的函数都是尽量短小和简单 使用 doxygen 生成文档 所有代码以在 Linux 系统上可以编译并运行为准;每当在 lib 目录里增加了一个功能函数
💻 C
字号:
/*************************************************************************** *            hsb-ddns.c * *  Mon May 30 13:14:44 2007 *  Copyright  2007  kf701 *  Email kf_701 AT 21cn.com ****************************************************************************/#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <glib.h>#include <mysql/mysql.h>#include "kf701.h"#define UPDATE 1#define INSERT 0#define TMP_FILE "/tmp/dns.data"typedef struct{	char hsbip[18];	char hsbpass[20];} HSB ;GHashTable * table;static int32_t update_hsb_db( int32_t flag, char*hsbid, char*hsbip, char*hsbpass );static void update_hsb_file( char*hsbid, char*hsbpass, char*hsbip );void run(struct sockaddr *addr, uint8_t *data, uint32_t size){	gchar *hsbid = g_malloc0( 32 );	HSB *hsb = g_malloc0( sizeof(HSB) );	if( 2 != sscanf( (const char*)data, "client_domain=%s\npassword=%s\n", hsbid, hsb->hsbpass) )	{		sys_warn("bad hsb data\n");		g_free( hsbid );		g_free( hsb );		return;	}	strncpy( hsb->hsbip, inet_ntoa(((struct sockaddr_in*)addr)->sin_addr), sizeof(hsb->hsbip) );	sys_log("hsbid = %s, hsbip = %s\n", hsbid, hsb->hsbip );	HSB *p = g_hash_table_lookup( table, hsbid );	if( NULL == p )	{		/* 如果 hsb-ddns.out 重新启动后,对已存在的 hsbid 进行 INSERT 时		 * 会出错误,这时可以直接更新。 还有一个办法,就是在此程序启动时,		 * 先把 DB 里已有的 hsbid 记录全读出来存入 hash table		 */		if( -1 == update_hsb_db(INSERT, hsbid, hsb->hsbip, hsb->hsbpass) )			update_hsb_db( UPDATE, hsbid, hsb->hsbip, hsb->hsbpass );		update_hsb_file( hsbid, hsb->hsbpass, hsb->hsbip );		g_hash_table_insert( table, hsbid, hsb );	}	else if( 0 != strcmp( hsb->hsbip, p->hsbip ) )	{		update_hsb_db( UPDATE, hsbid, hsb->hsbip, hsb->hsbpass );		update_hsb_file( hsbid, hsb->hsbpass, hsb->hsbip );		g_hash_table_insert( table, hsbid, hsb );	}}int main(int argc, char **argv){	debug_verbose = 4;	daemon( 0, 0 );	table = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free);	udp_server( 9877, 1024, run );	return 0;}static int32_t update_hsb_db( int32_t flag, char*hsbid, char*hsbip, char*hsbpass ){	if( flag == UPDATE )		sys_log("%s: %s\n", __func__, "UPDATE");	else		sys_log("%s: %s\n", __func__, "INSERT");	MYSQL *mysql = mysql_init(NULL);	if( NULL == mysql_real_connect(mysql, "localhost", "root", NULL, "hsbdb", 0, NULL, 0) )	{		sys_err("connect db err: %s\n",mysql_error(mysql));		goto mysql_err;	}		char query[256];	if( UPDATE == flag )		sprintf( query, "update hsbtable set hsbip=\"%s\", hsbpass=\"%s\" where hsbid=\"%s\"", hsbip, hsbpass, hsbid );	else if( INSERT == flag )		sprintf( query, "insert into hsbtable(hsbid,hsbip,hsbpass) value(\"%s\",\"%s\",\"%s\")", hsbid, hsbip, hsbpass );	if( 0 != mysql_real_query(mysql, query, strlen(query)) )	{		sys_err("query err: %s\n",mysql_error(mysql));		goto mysql_err;	}	mysql_close( mysql );	return 0;mysql_err:	mysql_close( mysql );	return -1;}static void update_hsb_file( char*hsbid, char*hsbpass, char*hsbip){	char tbuf[256];	snprintf(tbuf, sizeof(tbuf), "sed -i -e \"/^%s=.*$/d\" %s",hsbid,TMP_FILE);	system(tbuf);	snprintf(tbuf, sizeof(tbuf), "echo \"%s=%s=%s\" >> %s",hsbid,hsbpass,hsbip,TMP_FILE);	system(tbuf);}

⌨️ 快捷键说明

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