📄 hsb-ddns.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 + -