import ctypes.util
import errno
import os
import socket

libc = ctypes.CDLL(ctypes.util.find_library('c'))


def if_indextoname(ifindex):
    libc.if_indextoname.argtypes = [ctypes.c_uint32, ctypes.c_char_p]
    libc.if_indextoname.restype = ctypes.c_char_p

    ifname = ctypes.create_string_buffer(16)
    ifname = libc.if_indextoname(ifindex, ifname)
    if not ifname:
        err = errno.ENXIO
        raise OSError(err, os.strerror(err))
    return ifname


def open_udp_port(bindaddr, min, max):
    """
      Try to open a UDP listening port in the given range
    """
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    for port in range(min, max + 1):
        try:
            sock.bind((bindaddr, port))
            return sock, port
        except:
            pass

    sock.close()
    return None, None