mmo-project/fortran/server/src/mod_dill.f90

119 lines
4.3 KiB
Fortran

module mod_dill
use iso_c_binding, only: c_char, c_int, c_int64_t, c_size_t
implicit none
private
public :: ipaddr, ipaddr_local, ipaddr_port, ipaddr_remote, ipaddr_str, &
IPADDR_MAXSTRLEN, IPADDR_IPV4, IPADDR_IPV6, mrecv, msend, &
suffix_attach, suffix_detach, tcp_accept, tcp_close, tcp_connect, &
tcp_listen
integer(c_int), parameter :: IPADDR_IPV4 = 1
integer(c_int), parameter :: IPADDR_IPV6 = 2
integer(c_int), parameter :: IPADDR_MAXSTRLEN = 46
type, bind(c) :: ipaddr
character(c_char) :: address(32)
end type ipaddr
interface
integer(c_int) function ipaddr_local(addr, name, port, mode) &
bind(c, name='dill_ipaddr_local')
import :: c_char, c_int, ipaddr
type(ipaddr), intent(out) :: addr
character(c_char), intent(in) :: name(*)
integer(c_int), value, intent(in) :: port
integer(c_int), value, intent(in) :: mode
end function ipaddr_local
integer(c_int) function ipaddr_port(addr) &
bind(c, name='dill_ipaddr_port')
import :: c_int, ipaddr
type(ipaddr), intent(in) :: addr
end function ipaddr_port
integer(c_int) function ipaddr_remote(addr, name, port, mode, deadline) &
bind(c, name='dill_ipaddr_remote')
import :: c_char, c_int, c_int64_t, ipaddr
type(ipaddr), intent(out) :: addr
character(c_char), intent(in) :: name(*)
integer(c_int), value, intent(in) :: port
integer(c_int), value, intent(in) :: mode
integer(c_int64_t), value, intent(in) :: deadline
end function ipaddr_remote
subroutine ipaddr_str(addr, buf) &
bind(c, name='dill_ipaddr_str')
import :: c_char, ipaddr
type(ipaddr), intent(in) :: addr
character(c_char), intent(in out) :: buf(*)
end subroutine ipaddr_str
integer(c_size_t) function mrecv(s, buf, len, deadline) &
bind(c, name='dill_mrecv')
import :: c_char, c_int, c_int64_t, c_size_t
integer(c_int), value, intent(in) :: s
character(c_char), intent(in out) :: buf(*)
integer(c_size_t), value, intent(in) :: len
integer(c_int64_t), value, intent(in) :: deadline
end function mrecv
integer(c_int) function msend(s, buf, len, deadline) &
bind(c, name='dill_msend')
import :: c_char, c_int, c_int64_t, c_size_t
integer(c_int), value, intent(in) :: s
character(c_char), intent(in) :: buf(*)
integer(c_size_t), value, intent(in) :: len
integer(c_int64_t), value, intent(in) :: deadline
end function msend
integer(c_int) function suffix_attach(s, suffix, suffixlen) &
bind(c, name='dill_suffix_attach')
import :: c_char, c_int, c_size_t
integer(c_int), value, intent(in) :: s
character(c_char), intent(in) :: suffix(*)
integer(c_size_t), value, intent(in) :: suffixlen
end function suffix_attach
integer(c_int) function suffix_detach(s, deadline) &
bind(c, name='dill_suffix_detach')
import :: c_int, c_int64_t
integer(c_int), value, intent(in) :: s
integer(c_int64_t), value, intent(in) :: deadline
end function suffix_detach
integer(c_int) function tcp_accept(s, addr, deadline) &
bind(c, name='dill_tcp_accept')
import :: c_int, c_int64_t, ipaddr
integer(c_int), value, intent(in) :: s
type(ipaddr), intent(out) :: addr
integer(c_int64_t), value, intent(in) :: deadline
end function tcp_accept
integer(c_int) function tcp_close(s, deadline) &
bind(c, name='dill_tcp_close')
import :: c_int, c_int64_t
integer(c_int), value, intent(in) :: s
integer(c_int64_t), value, intent(in) :: deadline
end function tcp_close
integer(c_int) function tcp_connect(addr, deadline) &
bind(c, name='dill_tcp_connect')
import :: c_int, c_int64_t, ipaddr
type(ipaddr), intent(in) :: addr
integer(c_int64_t), value, intent(in) :: deadline
end function tcp_connect
integer(c_int) function tcp_listen(addr, backlog) &
bind(c, name='dill_tcp_listen')
import :: c_int, ipaddr
type(ipaddr), intent(in) :: addr
integer(c_int), value, intent(in) :: backlog
end function tcp_listen
end interface
end module mod_dill