Пример #1
0
const Meta_Class* find_meta_class(
    const Meta_Class* source_meta_class,
    const char* class_name)
{
    // Check this class.

    if (eqi(source_meta_class->name, class_name))
        return source_meta_class;

    // Check superclass chain.

    for (const Meta_Class* p = source_meta_class;
        p;
        p = p->super_meta_class)
    {
        if (eqi(p->name, class_name))
            return p;
    }

    // Check meta-repository.

    if (source_meta_class->meta_repository)
        return find_meta_class(source_meta_class->meta_repository, class_name);

    // Not found!
    return 0;
}
Пример #2
0
bool is_subclass(const Meta_Class* ancestor, const Meta_Class* descendant)
{
    if (ancestor == &Instance::static_meta_class)
        return true;

    if (eqi(ancestor->name, "Instance"))
        return true;

    for (const Meta_Class* p = descendant; p; p = p->super_meta_class)
    {
        if (p == ancestor || eqi(p->name, ancestor->name))
            return true;
    }

    return false;
}
Пример #3
0
const Meta_Feature* find_feature(
    const Meta_Class* mc, const char* name, uint32 type)
{
    for (size_t i = 0; i < mc->num_meta_features; i++)
    {
        const Meta_Feature* mf = mc->meta_features[i];

        if (eqi(mf->name, name) && (mf->flags & type))
            return mf;
    }

    return 0;
}
Пример #4
0
Envelope* Module::find_provider(const char* class_name)
{
    for (List_Elem* p = _envelopes.head; p; p = p->next)
    {
        Envelope* env = (Envelope*)p;

        if (eqi(env->class_name(), class_name))
            return env;
    }

    // Not found:
    return 0;
}
Пример #5
0
Enum_Associators_Status Link_Provider::enum_associators(
    const Instance* instance,
    const String& result_class,
    const String& role,
    const String& result_role,
    Enum_Associators_Handler<Instance>* handler)
{
    Auto_Mutex am(resource.mutex);

    //
    // This function implements the associators operation across the following
    // class.
    //
    //     [Association]
    //     class Link
    //     {
    //         [Key] Employee REF Emp;
    //         [Key] Manager REF Mgr;
    //     };
    //
    // The instance parameter refers to the "source" instance of the
    // association. This function creates "result" instances and passes
    // them to the handler. If the source is a manager, the results will
    // be employees. If the source is an employee, the result will be
    // a single manager.
    //

    //
    // Client use cases:
    //
    //     $ cimcli a Manager.Id=1001
    //     $ cimcli a Employee.Id=4001
    //

    // Case 1: the source is a manager; results are employees.

    Manager* manager = cast<Manager*>(instance);

    if (manager)
    {
        // The result class must be Employee (or empty).

        if (result_class.size() && result_class != "Employee")
            return ENUM_ASSOCIATORS_FAILED;

        // [Source] role must be "Mgr" or empty.

        if (!role.empty() && !eqi(role, "Mgr"))
            return ENUM_ASSOCIATORS_FAILED;

        // Result_role must be "Emp" or empty.

        if (!result_role.empty() && !eqi(result_role, "Emp"))
            return ENUM_ASSOCIATORS_FAILED;

        // We only have one manager in this module.

        if (manager->Id.value == 1001)
        {
            for (size_t i = 0; i < resource.employees.size(); i++)
                handler->handle(resource.employees[i]->clone());

            return ENUM_ASSOCIATORS_OK;
        }

        return ENUM_ASSOCIATORS_FAILED;
    }

    // Case 2: the source is an employee; result is a manager.

    Employee* employee = cast<Employee*>(instance);

    if (employee)
    {
        // The result class must be Manager (or empty).

        if (result_class.size() && result_class != "Manager")
            return ENUM_ASSOCIATORS_FAILED;

        // [Source] role must be "Emp" or empty.

        if (!role.empty() && !eqi(role, "Emp"))
            return ENUM_ASSOCIATORS_FAILED;

        // Result_role must be "Mgr" or empty.

        if (!result_role.empty() && !eqi(result_role, "Mgr"))
            return ENUM_ASSOCIATORS_FAILED;

        // Find this employee and send result instance.

        for (size_t i = 0; i < resource.employees.size(); i++)
        {
            if (key_eq(resource.employees[i], employee))
            {
                handler->handle(resource.manager->clone());
                return ENUM_ASSOCIATORS_OK;
            }
        }

        return ENUM_ASSOCIATORS_FAILED;
    }

    return ENUM_ASSOCIATORS_FAILED;
}
Пример #6
0
 for_each(line,lines)
 {
  int col, accept = 0, /*proxyflag = 0, */valid = 1, setchainname = 0, commonflag = 0; 
  unsigned long long traffic = 0;
  unsigned long pkts = 0;
  char *ipaddr = NULL,*ptr;
  
  valid_columns(ptr, line->str, ' ', col)
  if(valid) switch(col)
  { 
   case 1: if(eq(ptr,"Chain"))
           {
            setchainname = 1;
           }
           else if(eq(ptr,"pkts")) 
           {
            valid = 0;
           }
           else
           {
            sscanf(ptr,"%lu",&pkts); 
           }
           break;
   case 2: if(setchainname)
           {
            if(!strncmp(ptr,"post_",5) || eq(ptr,"POSTROUTING"))
            {
             downloadflag = 1;            
            }
            else 
            {
             if(!strncmp(ptr,"forw_",5) || eq(ptr,"FORWARD"))
             {
              downloadflag = 0;
             }
            }            
            if(eq(ptr,"post_common") || eq(ptr,"forw_common"))
            {
             commonflag = 1;
            }
           }
           else
           {
            sscanf(ptr,"%Lu",&traffic); 
            traffic += (1<<19);
            traffic >>= 20;
           }
           break;
   case 3: if((strncmp(ptr,"post_",5) && strncmp(ptr,"forw_",5)) || commonflag)
           {
            accept = eq(ptr,mark);
           }
           break;
   case 7: if(ipv6 && !downloadflag)
           {
            ipaddr = ptr;
           }
           break;
   case 8: if(ipv6 && downloadflag)
           {
            ipaddr = ptr;
           }
           else if(!ipv6)
           {
/*          if(downloadflag)
            { 
             if(strstr(proxy_ip,ptr))
             {
              proxyflag = 1;
             }

            } 
            else 
            {  */
            if(!downloadflag)
            {
             ipaddr = ptr;
            }
           }
           break;
   case 9: if(!ipv6 && downloadflag)
           {
            ipaddr = ptr;
           }
           break;
  }
  
  if(accept && traffic>0 && ipaddr)
  {
   /* IPv6 subnet - /64 */
   char *isipv6 = strstr(ipaddr,"/64");
   if(ipv6 && isipv6)
   {
    *isipv6=0;
    printf("(IPv6) ");
   }
   else
   {
    printf("(IPv4) ");
   }
/*   
   if(proxyflag)
   {
    printf("(proxy) ");
   }
   else
*/   
   if(!downloadflag)
   {
    printf("(up) ");
   }
   else
   {
    printf("(down) ");
   }
   
   traffic_detected = 1;
   printf("%s %Lu MB (%ld pkts)\n", ipaddr, traffic, pkts);

   if_exists(ip, ips, eqi(ip->addr,ipaddr)); 
   else 
   {
Пример #7
0
static bool _identical_base(const Meta_Class* mc1, const Meta_Class* mc2)
{
    if (!mc1 != !mc2)
        return false;

    if (!mc1)
        return true;

    if (mc1->flags != mc2->flags)
        return false;

    if (!eqi(mc1->name, mc2->name))
        return false;

    if (mc1->num_meta_features != mc2->num_meta_features)
        return false;

    for (size_t i = 0; i < mc1->num_meta_features; i++)
    {
        const Meta_Feature* mf1 = mc1->meta_features[i];
        const Meta_Feature* mf2 = mc2->meta_features[i];

        if (mf1->flags != mf2->flags)
            return false;

        if (!eqi(mf1->name, mf2->name))
            return false;

        if (mf1->flags & CIMPLE_FLAG_PROPERTY)
        {
            const Meta_Property* mp1 = (const Meta_Property*)mf1;
            const Meta_Property* mp2 = (const Meta_Property*)mf2;

            if (mp1->type != mp2->type)
                return false;

            if (mp1->subscript != mp2->subscript)
                return false;

            if (mp1->offset != mp2->offset)
                return false;
        }

        if (mf1->flags & CIMPLE_FLAG_REFERENCE)
        {
            const Meta_Reference* mr1 = (const Meta_Reference*)mf1;
            const Meta_Reference* mr2 = (const Meta_Reference*)mf2;

            if (!identical(mr1->meta_class, mr2->meta_class))
                return false;

            if (mr1->offset != mr2->offset)
                return false;
        }

        if (mf1->flags & CIMPLE_FLAG_METHOD)
        {
            const Meta_Method* mm1 = (const Meta_Method*)mf1;
            const Meta_Method* mm2 = (const Meta_Method*)mf2;

            if (!_identical_base((Meta_Class*)mm1, (Meta_Class*)mm2))
                return false;

            if (mm1->return_type != mm2->return_type)
                return false;
        }
    }

    if (mc1->size != mc2->size)
        return false;

    // Identical:
    return true;
}