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; }
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; }
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; }
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; }
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; }
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 {
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; }