module Native_Functions {

	/* direct import of inet_pton(AF_INET6) C function, returns net byte order */
	external function f_inet6_addr(in charstring ch) return octetstring;
	/* direct import of inet_addr() C function, returns net byte order */
	external function f_inet_addr(in charstring ch) return octetstring;
	/* like inet_addr() but return is host byte order */
	external function f_inet_haddr(in charstring ch) return octetstring;

	/* direct import of inet_ntoa() C function, input net byte order */
	external function f_inet_ntoa(in octetstring oct) return charstring;
	/* like inet_ntoa() but input is host byte order */
	external function f_inet_hntoa(in octetstring oct) return charstring;

	/* convert content of charstring to lower-case using tolower(3) */
	external function f_str_tolower(in charstring input) return charstring;

	/* convert content of charstring to upper-case using toupper(3) */
	external function f_str_toupper(in charstring input) return charstring;
}
