diff options
Diffstat (limited to 'otherlibs/unix/getproto.c')
-rw-r--r-- | otherlibs/unix/getproto.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/otherlibs/unix/getproto.c b/otherlibs/unix/getproto.c new file mode 100644 index 000000000..56ea69913 --- /dev/null +++ b/otherlibs/unix/getproto.c @@ -0,0 +1,53 @@ +#include <mlvalues.h> +#include <alloc.h> +#include <memory.h> +#include <fail.h> +#include "unix.h" + +#ifdef HAS_SOCKETS + +#include <netdb.h> + +static value alloc_proto_entry(entry) + struct protoent * entry; +{ + value res; + Push_roots(r, 2); + + r[0] = copy_string(entry->p_name); + r[1] = copy_string_array(entry->p_aliases); + res = alloc_tuple(3); + Field(res,0) = r[0]; + Field(res,1) = r[1]; + Field(res,2) = Val_int(entry->p_proto); + Pop_roots(); + return res; +} + +value unix_getprotobyname(name) /* ML */ + value name; +{ + struct protoent * entry; + entry = getprotobyname(String_val(name)); + if (entry == (struct protoent *) NULL) mlraise(Atom(NOT_FOUND_EXN)); + return alloc_proto_entry(entry); +} + +value unix_getprotobynumber(proto) /* ML */ + value proto; +{ + struct protoent * entry; + entry = getprotobynumber(Int_val(proto)); + if (entry == (struct protoent *) NULL) mlraise(Atom(NOT_FOUND_EXN)); + return alloc_proto_entry(entry); +} + +#else + +value unix_getprotobynumber() +{ invalid_argument("getprotobynumber not implemented"); } + +value unix_getprotobyname() +{ invalid_argument("getprotobyname not implemented"); } + +#endif |