コード例 #1
0
ファイル: sec_object.c プロジェクト: biparadox/cubelib-1.11
int sec_object_getvalue(void * sec_obj,char * valuename,void * value)
{
	int ret;
	SEC_OBJECT * sec_object=(SEC_OBJECT *)sec_obj;
	if(sec_object==NULL)
		return -EINVAL;
	
	pthread_rwlock_wrlock(&(sec_object->rwlock));
	ret=struct_read_elem(valuename,sec_object->share_data,value,sec_object->struct_template);
	pthread_rwlock_unlock(&(sec_object->rwlock));
	return ret;
}
コード例 #2
0
ファイル: dispatch.c プロジェクト: zyc14588/cube-1.3-app
int rule_get_target(void * router_rule,void * message,void **result)
{
    BYTE * target;
    int ret;
    char buffer[DIGEST_SIZE*2];
    ROUTE_RULE * rule= (ROUTE_RULE *)router_rule;
    *result=NULL;
    switch(rule->target_type){
	    case ROUTE_TARGET_NAME:
	    case ROUTE_TARGET_PORT:
	    case ROUTE_TARGET_LOCAL:
		    target=Talloc0(DIGEST_SIZE);
		    Strncpy(target,rule->target_name,DIGEST_SIZE);
		    break;
	    case ROUTE_TARGET_UUID:
		    ret=Strnlen(rule->target_name,DIGEST_SIZE*2);
		    target=Talloc0(DIGEST_SIZE);
		    if(ret ==DIGEST_SIZE*2)
		    {
			if(target==NULL)
				return -ENOMEM;
			ret=uuid_to_digest(rule->target_name,target);
			if(ret<0)
				return ret;
		    }		
		    else if(ret<DIGEST_SIZE/4*3)
		    {
		    	Memcpy(target,rule->target_name,ret);
		    }
		    else
			return -EINVAL;
		    break;
	    case ROUTE_TARGET_CONN:
		    target=Talloc0(DIGEST_SIZE);
		    if(target==NULL)
			return -ENOMEM;	
		    ret=Strnlen(rule->target_name,DIGEST_SIZE*2);
		    if(ret>DIGEST_SIZE/4*3-1)
			return -EINVAL;
		    target[0]=':';
		    Memcpy(target+1,rule->target_name,ret);
		    break;
	    case ROUTE_TARGET_RECORD:
		   {
			ret=message_read_elem(message,rule->target_name,0,&target);
			if(ret<0)
				return -EINVAL;
			if(target==NULL)
				return -EINVAL;
			break;
		   }

	    case ROUTE_TARGET_EXPAND:
		   {
			int expand_type;
			int expand_subtype;
			MSG_EXPAND * expand;
			void * expand_template;
			void * expand_data;
			int len;
		
			len=Strlen(rule->target_name);
			if(len>DIGEST_SIZE*3)
				return -EINVAL;
			
			int i=0;
			int offset=0;
			offset=message_read_typestr(rule->target_name,&expand_type,&expand_subtype);
			if(offset<0)
				return offset;
			while(rule->target_name[offset++]!=':')
			{
				if(offset>=len)
					return -EINVAL;
			}

		        ret = message_get_define_expand(message,&expand,expand_type,expand_subtype);
			if(ret<0)
				return -EINVAL;
			if(expand==NULL)
				return -EINVAL;
			expand_template=memdb_get_template(expand_type,expand_subtype);
			if(expand_template==NULL)
				return -EINVAL;		
			target=Talloc(DIGEST_SIZE*2+1);
			ret=struct_read_elem(rule->target_name+offset,expand->expand,target,expand_template);		
			if(ret<0)
				return ret;
		   	if(target==NULL)
				return -EINVAL;
		   	break;
		   }

/*
	    case ROUTE_TARGET_SPLIT:
		    return -EINVAL;

	    case ROUTE_TARGET_MIXUUID:
		    {
			    void * json_root;
			    void * json_elem;
			    const int repeat_time=2;
			    char mixvalue[repeat_time][DIGEST_SIZE*2];
			    char tag[16];
			    char uuid[DIGEST_SIZE*2];
			    int i;

			    ret=json_solve_str(&json_root,rule->target_name);
			    if(ret<0)
				    return ret;
			    if(json_get_type(json_root)!=JSON_ELEM_MAP)
				    return -EINVAL;
			
			    memset(uuid,0,DIGEST_SIZE*2);

			    char * value;
			    char name[DIGEST_SIZE*2];

			    for(i=0;i<repeat_time;i++)
			    {
			   	 memset(mixvalue[i],0,DIGEST_SIZE*2);

				 if(i==0)
				 {
			      	 	 // first json_elem is the node uuid value
			       		json_elem=json_get_first_child(json_root);
				 }
				 else
				 {
					json_elem=json_get_next_child(json_root);

				 }
				 ret=json_node_getname(json_elem,name);
			    	 if(ret<0)
					return ret;
				 if(json_get_type(json_elem)!=JSON_ELEM_STRING)
					return -EINVAL;

				 ret=json_node_getvalue(json_elem,tag,15);
				// tag is "RECORD"  means this elem defines an elem in the message's record
				 if(strcmp(tag,"RECORD")==0)
				 {
					void * record;	
					ret=message_read_elem(message,name,0,&record);
					if(ret<0)
						return ret;
				        int len=strlen(record);
					if(len<DIGEST_SIZE*2)
					{
						Memcpy(mixvalue[i],record,len);
					}
					else
					{
						Memcpy(mixvalue[i],record,DIGEST_SIZE*2);
					}
				}
				// tag is "name" means this elem defines remote proc's value
				else if(strcmp(tag,"NAME")==0)
				{
				        int len=strlen(name);
					if(len<DIGEST_SIZE*2)
					{
						Memcpy(mixvalue[i],name,len);
					}
					else
					{
						Memcpy(mixvalue[i],name,DIGEST_SIZE*2);
					}
				}

			    	else if(strncmp(tag,"EXPAND",6)==0)
			    	{
					char * type=tag+7;
			       		if(strlen(type)!=4)
					{
						return -EINVAL;	
					}		
					void * expand;
				        ret = message_get_define_expand(message,&expand,type);
					if(ret<0)
						return -EINVAL;
					if(expand==NULL)
						return -EINVAL;
					void * struct_template=load_record_template(type);
					if(struct_template==NULL)
						return -EINVAL;
					ret=struct_read_elem(name,expand,mixvalue[i],struct_template);		
					free_struct_template(struct_template);
					if(ret<0)
						return ret;
			    	}

		    		else
			    	{
			    		return -EINVAL;
			    	}
			  	if(i==0)
					continue;
			  	if(i==1)
			   	{
					comp_proc_uuid(mixvalue[0],mixvalue[1],uuid);
				  	continue;
			    	}
			   	comp_proc_uuid(uuid,mixvalue[i],uuid);
		
			  }
		   	 target=malloc(DIGEST_SIZE*2);
		 	 Memcpy(target,uuid,DIGEST_SIZE*2);
		   	 break;
		   }
*/		    
	    case ROUTE_TARGET_ERROR:
	    default:
		    return -EINVAL;
    }
    *result=target;
    return rule->target_type;	

}