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

📄 pdt.c

📁 性能优秀的SIP Proxy
💻 C
📖 第 1 页 / 共 2 页
字号:
					}					break;				case PDT_DELETE:					if(itree==NULL)					{						LOG(L_ERR,							"PDT:pdt_sync_cache: Error to remove from tree, tree does not exist\n");						goto error;					}					if(pdt_remove_prefix_from_tree(itree, &it->sdomain, &ito->cell->prefix)!=0)					{						LOG(L_ERR,							"PDT:pdt_sync_cache: Error to remove from tree\n");						goto error;					}					break;				default:					LOG(L_ERR, "PDT:pdt_sync_cache: unknown operation\n");			}			ito->count++;			ito = ito->n;		}		if(it->diff!=NULL)			itree->idsync = it->diff->id;		it = it->next;	}	lock_release(&_dhash->hl_lock);	return 0;error:	lock_release(&_dhash->hl_lock);	return -1;}void pdt_clean_cache(unsigned int ticks, void *param){	pd_op_t *ito, *tmp;	hash_t *it;	/* DBG("PDT:pdt_clean_cache: ...\n"); */		if(_dhash==NULL)	{		LOG(L_ERR, "PDT:pdt_clean_cache: strange situation\n");		return;	}		lock_get(&_dhash->hl_lock);	it = _dhash->hash;	while(it!=NULL)	{		ito = it->diff;		while(ito!=NULL)		{			if(ito->count >= _dhash->workers)			{				DBG("PDT:pdt_clean_cache: cleaning sdomain<%.*s> op[%d]=%d...\n",					it->sdomain.len, it->sdomain.s, ito->id, ito->op);				free_cell(ito->cell);				if(ito->p!=NULL)					(ito->p)->n = ito->n;				else					it->diff = ito->n;				if(ito->n!=NULL)					(ito->n)->p = ito->p;				tmp = ito;				ito = ito->n;				shm_free(tmp);			} 			else				ito = ito->n;		}		it = it->next;		}	lock_release(&_dhash->hl_lock);	return;}/** *	Fifo command example: *  *	--- *	 :pdt_add:[response_file]\n *	 sdomain\n *	 prefix\n *	 domain\n *	 \n * 	-- */int pdt_fifo_add(FILE *stream, char *response_file){	db_key_t db_keys[NR_KEYS] = {sdomain_column, prefix_column, domain_column};	db_val_t db_vals[NR_KEYS];	db_op_t  db_ops[NR_KEYS] = {OP_EQ, OP_EQ};	char dbuf[256], sdbuf[256], pbuf[256];	str sd, sp, sdomain;	if(_dhash==NULL)	{		LOG(L_ERR, "PDT:pdt_fifo_add: strange situation\n");		fifo_reply(response_file, "500 pdt_fifo_add - server error\n");		return -1;	}	/* read sdomain */	sdomain.s = sdbuf;	if(!read_line(sdomain.s, 255, stream, &sdomain.len) || sdomain.len==0)		{		LOG(L_ERR, "PDT:pdt_fifo_add: could not read domain\n");		fifo_reply(response_file, "400 pdt_fifo_add - domain not found\n");		return 1;	}	sdbuf[sdomain.len] = '\0';	if(*sdomain.s=='\0' || *sdomain.s=='.')	{		LOG(L_INFO, "PDT:pdt_fifo_add: empty sdomain\n");		fifo_reply(response_file, "400 pdt_fifo_add - empty param\n");		return 1;	}		/* read prefix */	sp.s = pbuf;	if(!read_line(sp.s, 255, stream, &sp.len) || sp.len==0)		{		LOG(L_ERR, "PDT:pdt_fifo_add: could not read prefix\n");		fifo_reply(response_file, "400 pdt_fifo_add - prefix not found\n");		return 1;	}	pbuf[sp.len] = '\0';	if(*sp.s=='\0' || *sp.s=='.')	{		LOG(L_INFO, "PDT:pdt_fifo_add: empty prefix\n");		fifo_reply(response_file, "400 pdt_fifo_add - empty param\n");		return 1;	}	while(sp.s!=NULL && *sp.s!='\0')	{		if(*sp.s < '0' || *sp.s > '9')		{			LOG(L_ERR, "PDT:pdt_fifo_add: bad prefix [%s]\n", pbuf);			fifo_reply(response_file, "400 pdt_fifo_add - bad prefix\n");			return 1;		}		sp.s++;	}	sp.s = pbuf;	/* read domain */	sd.s = dbuf;	if(!read_line(sd.s, 255, stream, &sd.len) || sd.len==0)		{		LOG(L_ERR, "PDT:pdt_fifo_add: could not read domain\n");		fifo_reply(response_file, "400 pdt_fifo_add - domain not found\n");		return 1;	}	dbuf[sd.len] = '\0';	if(*sd.s=='\0' || *sd.s=='.')	{		LOG(L_INFO, "PDT:pdt_fifo_add: empty domain\n");		fifo_reply(response_file, "400 pdt_fifo_add - empty param\n");		return 1;	}	if(pdt_check_pd(_dhash, &sdomain, &sp, &sd)==1)	{		LOG(L_ERR, "PDT:pdt_fifo_add: (sdomain,prefix,domain) exists\n");		fifo_reply(response_file,			"400 pdt_fifo_add - (sdomain,prefix,domain) exists already\n");		return 1;	}	db_vals[0].type = DB_STR;	db_vals[0].nul = 0;	db_vals[0].val.str_val.s = sdomain.s;	db_vals[0].val.str_val.len = sdomain.len;	db_vals[1].type = DB_STR;	db_vals[1].nul = 0;	db_vals[1].val.str_val.s = sp.s;	db_vals[1].val.str_val.len = sp.len;	db_vals[2].type = DB_STR;	db_vals[2].nul = 0;	db_vals[2].val.str_val.s = sd.s;	db_vals[2].val.str_val.len = sd.len;		/* insert a new domain into database */	if(pdt_dbf.insert(db_con, db_keys, db_vals, NR_KEYS)<0)	{		LOG(L_ERR, "PDT:pdt_fifo_add: error storing new prefix/domain\n");		fifo_reply(response_file, "430 Cannot store prefix/domain\n");		return -1;	}		if(pdt_add_to_hash(_dhash, &sdomain, &sp, &sd)!=0)	{		LOG(L_ERR, "PDT:pdt_fifo_add: could not add to cache\n");		fifo_reply(response_file, "431 could not add to cache\n");		goto error;	}	fifo_reply(response_file, "230 Added <%.*s> [%.*s] <%.*s>\n",		sdomain.len, sdomain.s, sp.len, sp.s, sd.len, sd.s);	return 0;	error:	if(pdt_dbf.delete(db_con, db_keys, db_ops, db_vals, NR_KEYS)<0)		LOG(L_ERR,"PDT:pdt_fifo_add: database/cache are inconsistent\n");		return -1;}/** *	Fifo command example: *  *	--- *	 :pdt_delete:[response_file]\n *	 sdomain *	 domain\n *	 \n * 	-- */static int pdt_fifo_delete(FILE *stream, char *response_file){	char sdbuf[256], sdomainbuf[256];	str sd, sdomain;	int ret;		db_key_t db_keys[2] = {sdomain_column, domain_column};	db_val_t db_vals[2];	db_op_t  db_ops[2] = {OP_EQ, OP_EQ};	if(_dhash==NULL)	{		LOG(L_ERR, "PDT:pdt_fifo_delete: strange situation\n");		fifo_reply(response_file, "500 pdt_fifo_delete - server error\n");		return -1;	}	/* read sdomain */	sdomain.s = sdomainbuf;	if(!read_line(sdomain.s, 255, stream, &sdomain.len) || sdomain.len==0)		{		LOG(L_ERR, "PDT:pdt_fifo_delete: could not read sdomain\n");		fifo_reply(response_file, "400 pdt_fifo_delete - sdomain not found\n");		return 1;	}	sdomainbuf[sdomain.len] = '\0';	if(*sdomain.s=='\0' || *sdomain.s=='.')	{		LOG(L_INFO, "PDT:pdt_fifo_delete: empty sdomain\n");		fifo_reply(response_file, "400 pdt_fifo_delete - empty param\n");		return 1;	}		/* read domain */	sd.s = sdbuf;	if(!read_line(sd.s, 255, stream, &sd.len) || sd.len==0)		{		LOG(L_ERR, "PDT:pdt_fifo_delete: could not read domain\n");		fifo_reply(response_file, "400 pdt_fifo_delete - domain not found\n");		return 1;	}	sdbuf[sd.len] = '\0';	if(*sd.s=='\0' || *sd.s=='.')	{		LOG(L_INFO, "PDT:pdt_fifo_delete: empty domain\n");		fifo_reply(response_file, "400 pdt_fifo_delete - empty param\n");		return 1;	}	if((ret = pdt_remove_from_hash_list(_dhash, &sdomain, &sd))<0)	{		DBG("PDT:pdt_fifo_delete: error encountered when deleting domain\n");		fifo_reply(response_file, "error encountered when deleting domain!\n");		return -1;	}		if(ret==1)	{		DBG("PDT:pdt_fifo_delete: prefix for sdomain [%.*s]domain [%.*s] not found\n",				sdomain.len, sdomain.s, sd.len, sd.s);		fifo_reply(response_file, "404 domain not found!\n");		return 0;	}	//	pdt_print_hash_list(_dhash);	/* ret=0 means domain was deleted from cache, so it must be deleted from db */	db_vals[0].type = DB_STR;	db_vals[0].nul = 0;	db_vals[0].val.str_val.s = sdomain.s;	db_vals[0].val.str_val.len = sdomain.len;		db_vals[1].type = DB_STR;	db_vals[1].nul = 0;	db_vals[1].val.str_val.s = sd.s;	db_vals[1].val.str_val.len = sd.len;	if(pdt_dbf.delete(db_con, db_keys, db_ops, db_vals, 2)<0)	{		LOG(L_ERR,"PDT:pdt_fifo_delete: database/cache are inconsistent\n");		fifo_reply(response_file, "602 database/cache are inconsistent!\n");	} 	else 		fifo_reply(response_file, "200 domain removed!\n");			return 0;}/** *	Fifo command example: *  *	--- *	 :pdt_list:[response_file]\n *	 sdomain\n *	 prefix\n *	 domain\n *	 \n * 	-- * * 	- '.' (dot) means NULL value  * 	- the comparison operation is 'START WITH' -- if domain is 'a' then * 	  all domains starting with 'a' are listed */static int pdt_fifo_list(FILE *stream, char *response_file){	char sdbuf[256], pbuf[256], sdomainbuf[256];	str sd, sp, sdomain;	pd_t *it;	int i;	FILE *freply=NULL;	hash_t *h;	if(_dhash==NULL)	{		LOG(L_ERR, "PDT:pdt_fifo_list: strange situation\n");		fifo_reply(response_file, "500 pdt_fifo_list - server error\n");		return -1;	}	sdomain.s = sdomainbuf;	if(!read_line(sdomain.s, 255, stream, &sdomain.len) || sdomain.len==0)		{		LOG(L_ERR, "PDT:pdt_fifo_list: could not read domain\n");		fifo_reply(response_file, "400 pdt_fifo_list - domain not found\n");		return 1;	}	sdomainbuf[sdomain.len] = '\0';	if(*sdomain.s=='\0' || *sdomain.s=='.')	{		sdomain.s   = NULL;		sdomain.len = 0;	}		sp.s = pbuf;	if(!read_line(sp.s, 255, stream, &sp.len) || sp.len==0)		{		LOG(L_ERR, "PDT:pdt_fifo_list: could not read prefix\n");		fifo_reply(response_file, "400 pdt_fifo_list - prefix not found\n");		return 1;	}	pbuf[sp.len] = '\0';	if(*sp.s!='\0' && *sp.s!='.')	{		while(sp.s!=NULL && *sp.s!='\0')		{			if(*sp.s < '0' || *sp.s > '9')			{				LOG(L_ERR, "PDT:pdt_fifo_list: bad prefix [%s]\n", pbuf);				fifo_reply(response_file, "400 pdt_fifo_list - bad prefix\n");				return 1;			}			sp.s++;		}		sp.s = pbuf;	} else {		sp.s   = NULL;		sp.len = 0;	}	sd.s = sdbuf;	if(!read_line(sd.s, 255, stream, &sd.len) || sd.len==0)		{		LOG(L_ERR, "PDT:pdt_fifo_list: could not read domain\n");		fifo_reply(response_file, "400 pdt_fifo_list - domain not found\n");		return 1;	}	sdbuf[sd.len] = '\0';	if(*sd.s=='\0' || *sd.s=='.')	{		sd.s   = NULL;		sd.len = 0;	}	freply = open_reply_pipe(response_file);	if(freply==NULL)	{		LOG(L_ERR, "PDT:pdt_fifo_list: can't open reply fifo '%s'\n",				response_file);		return -1;	}		lock_get(&_dhash->hl_lock);	h = _dhash->hash;	while(h!=NULL)	{		if(sdomain.s==NULL || 			(sdomain.s!=NULL && h->sdomain.len>=sdomain.len && 			 strncmp(h->sdomain.s, sdomain.s, sdomain.len)==0))		{			for(i=0; i<h->hash_size; i++)			{				it = h->dhash[i];				while(it!=NULL)				{					if((sp.s==NULL && sd.s==NULL)						|| (sp.s!=NULL && it->prefix.len>=sp.len &&							strncmp(it->prefix.s, sp.s, sp.len)==0)						|| (sd.s!=NULL && it->domain.len>=sd.len &&							strncasecmp(it->domain.s, sd.s, sd.len)==0))					fprintf(freply, "%.*s %.*s %.*s\n",						h->sdomain.len, h->sdomain.s,						it->prefix.len, it->prefix.s,						it->domain.len, it->domain.s);					it = it->n;				}			}		}			h = h->next;	}	lock_release(&_dhash->hl_lock);		fprintf(freply, "\n*200 OK\n");	if(freply!=NULL)		fclose(freply);	return 0;}static int get_domainprefix_unixsock(str* msg){	return 0;#if 0	db_key_t db_keys[NR_KEYS];	db_val_t db_vals[NR_KEYS];	db_op_t  db_ops[NR_KEYS] = {OP_EQ, OP_EQ};	code_t code;	dc_t* cell; 	str sdomain, sauth;	int authorized=0;			/* read a line -the domain name parameter- from the fifo */	if(unixsock_read_line(&sdomain, msg) != 0)		{		unixsock_reply_asciiz("400 Domain expected\n");		goto send_err;	}	/* read a line -the authorization to register new domains- from the fifo */	if(unixsock_read_line(&sauth, msg) != 0)	{			unixsock_reply_asciiz("400 Authorization expected\n");		goto send_err;	}	sdomain.s[sdomain.len] = '\0';	/* see what kind of user we have */	authorized = sauth.s[0]-'0';	lock_get(&l);	/* search the domain in the hashtable */	cell = get_code_from_hash(hash->dhash, hash->hash_size, sdomain.s);		/* the domain is registered */	if(cell)	{		lock_release(&l);					/* domain already in the database */		unixsock_reply_printf("201 Domain name=%.*s Domain code=%d%d\n",				      sdomain.len, ZSW(sdomain.s), cell->code, code_terminator);		unixsock_reply_send();		return 0;			}		/* domain not registered yet */	/* user not authorized to register new domains */		if(!authorized)	{		lock_release(&l);		unixsock_reply_asciiz("203 Domain name not registered yet\n");		unixsock_reply_send();		return 0;	}	code = *next_code;	*next_code = apply_correction(code+1);			/* prepare for insertion into database */	db_keys[0] = DB_KEY_CODE;	db_keys[1] = DB_KEY_NAME;	db_vals[0].type = DB_INT;	db_vals[0].nul = 0;	db_vals[0].val.int_val = code;	db_vals[1].type = DB_STR;	db_vals[1].nul = 0;	db_vals[1].val.str_val.s = sdomain.s;	db_vals[1].val.str_val.len = sdomain.len;	DBG("%d %.*s\n", code, sdomain.len, sdomain.s);				/* insert a new domain into database */	if(pdt_dbf.insert(db_con, db_keys, db_vals, NR_KEYS)<0)	{		/* next available code is still code */		*next_code = code;		lock_release(&l);		LOG(L_ERR, "PDT: get_domaincode: error storing a"				" new domain\n");		unixsock_reply_asciiz("204 Cannot register the new domain in a consistent way\n");		unixsock_reply_send();		return -1;	}		/* insert the new domain into hashtables, too */	cell = new_cell(sdomain.s, code);	if(add_to_double_hash(hash, cell)<0)		goto error;			lock_release(&l);	/* user authorized to register new domains */	unixsock_reply_printf("202 Domain name=%.*s New domain code=%d%d\n",			      sdomain.len, ZSW(sdomain.s), code, code_terminator);	unixsock_reply_send();	return 0; error:	/* next available code is still code */	*next_code = code;	/* delete from database */	if(pdt_dbf.delete(db_con, db_keys, db_ops, db_vals, NR_KEYS)<0)		LOG(L_ERR,"PDT: get_domaincode: database/share-memory are inconsistent\n");	lock_release(&l);	unixsock_reply_asciiz("500 Database/shared-memory are inconsistent\n");send_err:	unixsock_reply_send();	return -1;#endif}

⌨️ 快捷键说明

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