qmsk/net/socket/address.pyx
changeset 49 e2f79e68418a
parent 46 64b4ffb44754
equal deleted inserted replaced
48:ee7ade660c0b 49:e2f79e68418a
     1 cimport qmsk.net.libc as libc
     1 cimport qmsk.net.libc as libc
     2 cimport qmsk.net.py as py
     2 cimport qmsk.net.py as py
     3 
     3 
     4 from qmsk.net.socket.address cimport *
     4 #from qmsk.net.socket.address cimport *
       
     5 
       
     6 cimport qmsk.net.libc as libc
     5 
     7 
     6 cimport qmsk.net.socket.platform as platform
     8 cimport qmsk.net.socket.platform as platform
     7 
     9 
     8 cdef class sockaddr :
    10 # concrete sockaddr implementation types
     9     cdef void _init_family (self, platform.sa_family_t family=platform.AF_UNSPEC) :
       
    10         self.family = family
       
    11 
       
    12     # XXX:use size_t
       
    13     cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 :
       
    14         """
       
    15             Get the sockaddr pointer and sockaddr length for this address
       
    16         """ 
       
    17 
       
    18         raise NotImplementedError()
       
    19 
       
    20     cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL :
       
    21         """
       
    22             Get the sockaddr pointer
       
    23         """
       
    24 
       
    25         cdef platform.sockaddr *sa
       
    26         cdef platform.socklen_t sa_len
       
    27 
       
    28         self._get_sockaddr(&sa, &sa_len)
       
    29 
       
    30         return sa
       
    31     
       
    32     cdef platform.socklen_t _get_sockaddr_len (self) except -1 :
       
    33         """
       
    34             Get the sockaddr len
       
    35         """
       
    36 
       
    37         cdef platform.sockaddr *sa
       
    38         cdef platform.socklen_t sa_len
       
    39 
       
    40         self._get_sockaddr(&sa, &sa_len)
       
    41 
       
    42         return sa_len
       
    43 
       
    44     cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 :
       
    45         """
       
    46             Set the sockaddr value for this address; sa_len must match!
       
    47         """
       
    48 
       
    49         raise NotImplementedError()
       
    50 
       
    51     def getnameinfo (self) :
       
    52         """
       
    53             Returns a (host, serv) tuple for this address à la getnameinfo
       
    54 
       
    55             >>> addr = sockaddr_in()
       
    56             >>> assert addr.getnameinfo() == (addr.addr, str(addr.port))
       
    57         """
       
    58 
       
    59         cdef platform.sockaddr *sa
       
    60         cdef platform.socklen_t sa_len
       
    61 
       
    62         # XXX: take as args?
       
    63         cdef int flags = platform.NI_NUMERICHOST | platform.NI_NUMERICSERV
       
    64         
       
    65         # get our abstract sockaddr
       
    66         self._get_sockaddr(&sa, &sa_len)
       
    67 
       
    68         # get nice text format
       
    69         return platform.getnameinfo(sa, sa_len, flags)
       
    70 
       
    71     property addr :
       
    72         """
       
    73             The ASCII literal network address
       
    74         """
       
    75 
       
    76         def __get__ (self) :
       
    77             """
       
    78                 Default implmentation using getnameinfo()
       
    79             """
       
    80 
       
    81             addr, port = self.getnameinfo()
       
    82 
       
    83             return addr
       
    84 
       
    85     property port :
       
    86         """
       
    87             The integer port number
       
    88         """
       
    89 
       
    90         def __get__ (self) :
       
    91             """
       
    92                 Default implementation using getnameinfo() and int()
       
    93             """
       
    94 
       
    95             addr, port = self.getnameinfo()
       
    96 
       
    97             return int(port)
       
    98     
       
    99     def __repr__ (self) :
       
   100         return "sockaddr(%d, %s, %d)" % (self.family, self.addr, self.port)
       
   101 
       
   102 # mapping of AF -> sockaddr, user-modifyable
    11 # mapping of AF -> sockaddr, user-modifyable
   103 cimport qmsk.net.socket.af_inet, qmsk.net.socket.af_inet6
    12 cimport qmsk.net.socket.af_inet, qmsk.net.socket.af_inet6
   104 
    13 
   105 SOCKADDR_BY_FAMILY = {
    14 SOCKADDR_BY_FAMILY = {
   106     platform.AF_INET:   qmsk.net.socket.af_inet.sockaddr_in,
    15     platform.AF_INET:   qmsk.net.socket.af_inet.sockaddr_in,
   224 def getaddrinfo (hostname, service, int family, int socktype, int protocol = 0, int flags = 0) :
   133 def getaddrinfo (hostname, service, int family, int socktype, int protocol = 0, int flags = 0) :
   225     """
   134     """
   226         Look up given hostname/service using the given socket parameters, and return a sequence of addrinfo objects.
   135         Look up given hostname/service using the given socket parameters, and return a sequence of addrinfo objects.
   227             
   136             
   228             hostname        - internet address/hostname to look up, or None (for INADDR_ANY/localhost, see AI_PASSIVE)
   137             hostname        - internet address/hostname to look up, or None (for INADDR_ANY/localhost, see AI_PASSIVE)
   229             service         - port/service to use, or None (for ephemeral)
   138             service         - port/service to use, or None (for ephemeral). Should be given as a string
   230             family          - address family to use, one of AF_*. May be AF_UNSPEC.
   139             family          - address family to use, one of AF_*. May be AF_UNSPEC.
   231             socktype        - socket type to use, one of SOCK_*.
   140             socktype        - socket type to use, one of SOCK_*.
   232             protocol        - protocol to use, one of IPPROTO_* or zero to pick the default protocol for the given
   141             protocol        - protocol to use, one of IPPROTO_* or zero to pick the default protocol for the given
   233                               socktype.
   142                               socktype.
   234             flags           - bitmask of AI_* flags for getaddrinfo()
   143             flags           - bitmask of AI_* flags for getaddrinfo()
   265 
   174 
   266     if hostname is not None :
   175     if hostname is not None :
   267         _hostname = hostname
   176         _hostname = hostname
   268     
   177     
   269     if service is not None :
   178     if service is not None :
       
   179         # XXX: also accept integer port number?
       
   180         if isinstance(service, int) :
       
   181             service = str(service)
       
   182 
   270         _service = service
   183         _service = service
   271 
   184 
   272     # operate!
   185     # operate!
   273     err = platform.c_getaddrinfo(_hostname, _service, &hints, &res)
   186     err = platform.c_getaddrinfo(_hostname, _service, &hints, &res)
   274 
   187