PreviousUpNext

15.4.1177  src/lib/std/src/socket/plain-socket.pkg

## plain-socket.pkg

# Compiled by:
#     src/lib/std/src/standard-core.sublib


stipulate
    package ps  =  pre_socket;                                                          # pre_socket                            is from   src/lib/std/src/socket/pre-socket.pkg
    package ci  =  mythryl_callable_c_library_interface;                                # mythryl_callable_c_library_interface  is from   src/lib/std/src/unsafe/mythryl-callable-c-library-interface.pkg
herein

    package   plain_socket                                                              # "generic" has a technical meaning; if this nomenclature isn't strongly standard, "plain_socket" would be shorter and clearer...? XXX BUGGO FIXME
    : (weak)  Plain_Socket                                                              # Plain_Socket                  is from   src/lib/std/src/socket/plain-socket.api
    {
        fun socket_fn  fun_name
            =
            ci::find_c_function { lib_name => "socket", fun_name };                     # socket                                is in     src/c/lib/socket/cfun-list.h


        my  c_socket:    (Int, Int, Int) -> ps::Socket_Fd                               # (domain, type, protocol) -> Socket_Fd
            =                                                                           # "c_socket" is probably "create_socket"
            socket_fn "socket";                                                         # socket                                def in    src/c/lib/socket/socket.c


        my c_socket_pair:        (Int, Int, Int) -> (ps::Socket_Fd, ps::Socket_Fd)
            =                                                                           # "c_socket_pair" is probably "create_socket_pair"
            socket_fn "socketPair";                                                     # socketPair                            def in    src/c/lib/socket/socketpair.c


        fun fd2sock file_descriptor
            =
            ps::SOCKET { file_descriptor, nonblocking => REF FALSE };

        #  Create sockets using default protocol 
        #
        fun socket (ps::af::ADDRESS_FAMILY (af, _), ps::socket::SOCKET_TYPE (ty, _))
            =
            fd2sock (c_socket (af, ty, 0));

        fun socket_pair (ps::af::ADDRESS_FAMILY (af, _), ps::socket::SOCKET_TYPE (ty, _))
            =
            {   my (s1, s2) = c_socket_pair (af, ty, 0);

                ( fd2sock s1,
                  fd2sock s2
                );
            };

        #  Create sockets using the specified protocol 
        #
        fun socket' (ps::af::ADDRESS_FAMILY (af, _), ps::socket::SOCKET_TYPE (ty, _), protocol)
            =
            fd2sock (c_socket (af, ty, protocol));

        fun socket_pair' (ps::af::ADDRESS_FAMILY (af, _), ps::socket::SOCKET_TYPE (ty, _), protocol)
            =
            {   my (s1, s2) = c_socket_pair (af, ty, protocol);

                ( fd2sock s1,
                  fd2sock s2
                );
            };
    };

end;

## COPYRIGHT (c) 1995 AT&T Bell Laboratories.
## Subsequent changes by Jeff Prothero Copyright (c) 2010-2012,
## released under Gnu Public Licence version 3.


Comments and suggestions to: bugs@mythryl.org

PreviousUpNext