diff options
Diffstat (limited to 'src/utl_yaml.cpp')
-rwxr-xr-x | src/utl_yaml.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/utl_yaml.cpp b/src/utl_yaml.cpp new file mode 100755 index 00000000..237e85af --- /dev/null +++ b/src/utl_yaml.cpp @@ -0,0 +1,124 @@ +#include "utl_yaml.h" +#include <common/Network/Packet/CPktCmn.h> +/* + Hanoh Haim + Cisco Systems, Inc. +*/ + +/* +Copyright (c) 2015-2015 Cisco Systems, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + + + +#define INADDRSZ 4 + +static int my_inet_pton4(const char *src, unsigned char *dst) +{ + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + unsigned char tmp[INADDRSZ], *tp; + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr(digits, ch)) != NULL) { + unsigned int _new = *tp * 10 + (pch - digits); + + if (_new > 255) + return (0); + if (! saw_digit) { + if (++octets > 4) + return (0); + saw_digit = 1; + } + *tp = (unsigned char)_new; + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } else + return (0); + } + if (octets < 4) + return (0); + + memcpy(dst, tmp, INADDRSZ); + return (1); +} + + +bool utl_yaml_read_ip_addr(const YAML::Node& node, + std::string name, + uint32_t & val){ + std::string tmp; + uint32_t ip; + bool res=false; + try { + node[name] >> tmp ; + if ( my_inet_pton4((char *)tmp.c_str(), (unsigned char *)&ip) ){ + val=PKT_NTOHL(ip); + res=true; + } + }catch ( const std::exception& e ) { + } + return (res); +} + +bool utl_yaml_read_uint32(const YAML::Node& node, + std::string name, + uint32_t & val){ + bool res=false; + + try { + node[name] >> val ; + res=true; + }catch ( const std::exception& e ) { + } + return (res); + +} + +bool utl_yaml_read_uint16(const YAML::Node& node, + std::string name, + uint16_t & val){ + uint32_t val_tmp; + bool res=false; + + try { + node[name] >> val_tmp ; + val = (uint16_t)val_tmp; + res=true; + }catch ( const std::exception& e ) { + } +} + +bool utl_yaml_read_bool(const YAML::Node& node, + std::string name, + bool & val){ + bool res=false; + try { + node[name] >> val ; + res=true; + }catch ( const std::exception& e ) { + } + return( res); +} + + |