📄 transportrules.cc
字号:
private: CORBA::ULong network_; CORBA::ULong netmask_; CORBA::Boolean apply_to_localhost_;};/////////////////////////////////////////////////////////////////////////////class builtinRuleType : public transportRules::RuleType {public: builtinRuleType() { transportRules::addRuleType((transportRules::RuleType*)this); } virtual ~builtinRuleType() {} transportRules::Rule* createRule(const char* address_mask) { CORBA::ULong network, netmask; if ( strcmp(address_mask,"*" ) == 0 ) { return (transportRules::Rule*) new builtinMatchAllRule(address_mask); } else if ( strcmp(address_mask,"localhost") == 0 ) { return (transportRules::Rule*) new builtinLocalHostRule(address_mask); } else if ( parseIPv4AddressMask(address_mask,network,netmask) ) { return (transportRules::Rule*) new builtinIPv4Rule(address_mask, network, netmask); } else { return 0; } } static CORBA::Boolean parseIPv4AddressMask(const char* address, CORBA::ULong& network, CORBA::ULong& netmask) { CORBA::String_var cp(address); char* mask = strchr((char*)cp,'/'); if (mask) { *mask = '\0'; mask++; } else { mask = (char*) "255.255.255.255"; } if ( ! LibcWrapper::isipaddr(cp) ) return 0; network = inet_addr((const char*)cp); if ( ! LibcWrapper::isipaddr(mask) ) return 0; netmask = inet_addr(mask); return 1; }};static builtinRuleType builtinRuleType_;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////staticCORBA::BooleanparseAndAddRuleString(omnivector<transportRules::RuleActionPair*>& ruleStore, const char* rule_string) { transportRules::sequenceString action(4); CORBA::String_var address_mask; CORBA::Boolean reset_list = 0; CORBA::String_var rs(rule_string); // make a copy // Extract address mask char* p = rs; while ( isspace(*p) ) p++; char* q = p; while ( !isspace(*p) && *p != '\0' ) p++; if (*p == '\0') return 0; *p = '\0'; if ( *q == '^' ) { reset_list = 1; q++; if (*q == '\0') return 0; } address_mask = CORBA::string_dup(q); p++; // Extract action list, one or more comma separated action. // There may also be white spaces between the actions and comma separators. while ( isspace(*p) ) p++; q = p; p = strchr(q,','); while ( p && p != q ) { *p = '\0'; char* t = q; while ( !isspace(*t) && *t != '\0' ) t++; *t = '\0'; action.length(action.length()+1); action[action.length()-1] = (const char*) q; p++; while ( isspace(*p) ) p++; q = p; p = strchr(q,','); } if (*q == ',') return 0; if (*q != '\0') { p = q; while ( !isspace(*p) && *p != '\0' ) p++; if (*p != '\0') *p = '\0'; action.length(action.length()+1); action[action.length()-1] = (const char*) q; } omnivector<transportRules::RuleType*>& ruletypes = *ruleTypes(); omnivector<transportRules::RuleType*>::iterator i = ruletypes.begin(); omnivector<transportRules::RuleType*>::iterator last = ruletypes.end(); while (i != last) { transportRules::Rule* rule = (*i)->createRule(address_mask); if (rule) { transportRules::RuleActionPair* ra; ra = new transportRules::RuleActionPair(rule,action); if (reset_list) ruleStore.erase(ruleStore.begin(),ruleStore.end()); ruleStore.push_back(ra); return 1; } i++; } return 0;}/////////////////////////////////////////////////////////////////////////////staticchar*dumpRuleString(transportRules::RuleActionPair* ra) { transportRules::sequenceString& ss = ra->action_; CORBA::ULong len = strlen(ra->rule_->addressMask()) + 1; CORBA::ULong i = 0; for (; i < ss.length(); i++) { len += strlen(ss[i]) + 1; } CORBA::String_var v(CORBA::string_alloc(len)); sprintf(v,"%s ",ra->rule_->addressMask()); i = 0; while ( i < ss.length() ) { strcat(v,ss[i]); i++; if (i != ss.length()) strcat(v,","); } return v._retn();}/////////////////////////////////////////////////////////////////////////////class clientTransportRuleHandler : public orbOptions::Handler {public: clientTransportRuleHandler() : orbOptions::Handler("clientTransportRule", "clientTransportRule = <address mask> [action]+", 1, "-ORBclientTransportRule \"<address mask> [action]+\"") {} void visit(const char* value, orbOptions::Source) throw (orbOptions::BadParam) { if (!parseAndAddRuleString(clientRules_.pd_rules,value)) { throw orbOptions::BadParam(key(),value,"Unrecognised address mask"); } } void dump(orbOptions::sequenceString& result) { omnivector<transportRules::RuleActionPair*> ::iterator i = clientRules_.pd_rules.begin(); omnivector<transportRules::RuleActionPair*> ::iterator last = clientRules_.pd_rules.end(); while ( i != last ) { CORBA::String_var v; v = dumpRuleString(*i); orbOptions::addKVString(key(),v,result); i++; } }};static clientTransportRuleHandler clientTransportRuleHandler_;/////////////////////////////////////////////////////////////////////////////class serverTransportRuleHandler : public orbOptions::Handler {public: serverTransportRuleHandler() : orbOptions::Handler("serverTransportRule", "serverTransportRule = <address mask> [action]+", 1, "-ORBserverTransportRule \"<address mask> [action]+\"") {} void visit(const char* value, orbOptions::Source) throw (orbOptions::BadParam) { if (!parseAndAddRuleString(serverRules_.pd_rules,value)) { throw orbOptions::BadParam(key(),value,"Unrecognised address mask"); } } void dump(orbOptions::sequenceString& result) { omnivector<transportRules::RuleActionPair*> ::iterator i = serverRules_.pd_rules.begin(); omnivector<transportRules::RuleActionPair*> ::iterator last = serverRules_.pd_rules.end(); while ( i != last ) { CORBA::String_var v; v = dumpRuleString(*i); orbOptions::addKVString(key(),v,result); i++; } }};static serverTransportRuleHandler serverTransportRuleHandler_;/////////////////////////////////////////////////////////////////////////////// Module initialiser ///////////////////////////////////////////////////////////////////////////////class omni_transportRules_initialiser : public omniInitialiser {public: omni_transportRules_initialiser() { orbOptions::singleton().registerHandler(clientTransportRuleHandler_); orbOptions::singleton().registerHandler(serverTransportRuleHandler_); } virtual ~omni_transportRules_initialiser() { omnivector<transportRules::RuleType*>*& ruletypes = ruleTypes(); if (ruletypes) { delete ruletypes; ruletypes = 0; } } void attach() { if (clientRules_.pd_rules.size() == 0) { // Add a default rule parseAndAddRuleString(clientRules_.pd_rules, "* unix,ssl,tcp"); } if (serverRules_.pd_rules.size() == 0) { // Add a default rule parseAndAddRuleString(serverRules_.pd_rules, "* unix,ssl,tcp"); } } void detach() { serverRules_.reset(); clientRules_.reset(); }};static omni_transportRules_initialiser initialiser;omniInitialiser& omni_transportRules_initialiser_ = initialiser;OMNI_NAMESPACE_END(omni)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -