/* Utility functions that I'm used to from C but for which I couldn't find TTCN-3 implementations * * (C) 2017 Harald Welte * All rights reserved. * * Released under the terms of GNU General Public License, Version 2 or * (at your option) any later version. * * SPDX-License-Identifier: GPL-2.0-or-later */ #include #include #include #include #include #include #include #include #include namespace Native__Functions { OCTETSTRING f__inet6__addr(const CHARSTRING& in) { char buf[INET6_ADDRSTRLEN]; TTCN_Buffer ttcn_buffer(in); int ret; ret = inet_pton(AF_INET6, (const char *)ttcn_buffer.get_data(), buf); if(ret < 1) fprintf(stderr, "inet_pton failed: %d %s\n", ret, strerror(errno)); return OCTETSTRING(16, (const unsigned char *)&buf[0]); } OCTETSTRING f__inet__addr(const CHARSTRING& in) { TTCN_Buffer ttcn_buffer(in); in_addr_t ia; ia = inet_addr((const char *)ttcn_buffer.get_data()); return OCTETSTRING(4, (const unsigned char *)&ia); } OCTETSTRING f__inet__haddr(const CHARSTRING& in) { TTCN_Buffer ttcn_buffer(in); in_addr_t ia; ia = inet_addr((const char *)ttcn_buffer.get_data()); ia = ntohl(ia); return OCTETSTRING(4, (const unsigned char *)&ia); } CHARSTRING f__inet__ntoa(const OCTETSTRING& in) { TTCN_Buffer ttcn_buffer(in); const struct in_addr ia = *(const struct in_addr *)ttcn_buffer.get_data(); const char *str = inet_ntoa(ia); return CHARSTRING(str); } CHARSTRING f__inet__hntoa(const OCTETSTRING& in) { TTCN_Buffer ttcn_buffer(in); struct in_addr ia = *(const in_addr *)ttcn_buffer.get_data(); ia.s_addr = htonl(ia.s_addr); const char *str = inet_ntoa(ia); return CHARSTRING(str); } CHARSTRING f__str__tolower(const CHARSTRING& in) { TTCN_Buffer ttcn_buffer(in); TTCN_Buffer buf_out; CHARSTRING out; unsigned int i; const char *in_str = (const char *)ttcn_buffer.get_data(); for (i = 0; i < strlen(in_str); i++) buf_out.put_c((unsigned char) tolower(in_str[i])); buf_out.get_string(out); return out; } CHARSTRING f__str__toupper(const CHARSTRING& in) { TTCN_Buffer ttcn_buffer(in); TTCN_Buffer buf_out; CHARSTRING out; unsigned int i; const char *in_str = (const char *)ttcn_buffer.get_data(); for (i = 0; i < strlen(in_str); i++) buf_out.put_c((unsigned char) toupper(in_str[i])); buf_out.get_string(out); return out; } } // namespace