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;
	/* direct import of inet_ntop(AF_INET6) C function, input net byte order */
	external function f_inet6_ntoa(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;
}
