"""Error Handling (lib/error.c).

https://github.com/thom311/libnl/blob/libnl3_2_25/lib/error.c

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation version 2.1
of the License.
"""

import errno

import libnl.errno_

errmsg = dict((i, '') for i in range(libnl.errno_.NLE_MAX + 1))
errmsg.update({  # https://github.com/thom311/libnl/blob/libnl3_2_25/lib/error.c#L15
    libnl.errno_.NLE_SUCCESS: 'Success',
    libnl.errno_.NLE_FAILURE: 'Unspecific failure',
    libnl.errno_.NLE_INTR: 'Interrupted system call',
    libnl.errno_.NLE_BAD_SOCK: 'Bad socket',
    libnl.errno_.NLE_AGAIN: 'Try again',
    libnl.errno_.NLE_NOMEM: 'Out of memory',
    libnl.errno_.NLE_EXIST: 'Object exists',
    libnl.errno_.NLE_INVAL: 'Invalid input data or parameter',
    libnl.errno_.NLE_RANGE: 'Input data out of range',
    libnl.errno_.NLE_MSGSIZE: 'Message size not sufficient',
    libnl.errno_.NLE_OPNOTSUPP: 'Operation not supported',
    libnl.errno_.NLE_AF_NOSUPPORT: 'Address family not supported',
    libnl.errno_.NLE_OBJ_NOTFOUND: 'Object not found',
    libnl.errno_.NLE_NOATTR: 'Attribute not available',
    libnl.errno_.NLE_MISSING_ATTR: 'Missing attribute',
    libnl.errno_.NLE_AF_MISMATCH: 'Address family mismatch',
    libnl.errno_.NLE_SEQ_MISMATCH: 'Message sequence number mismatch',
    libnl.errno_.NLE_MSG_OVERFLOW: 'Kernel reported message overflow',
    libnl.errno_.NLE_MSG_TRUNC: 'Kernel reported truncated message',
    libnl.errno_.NLE_NOADDR: 'Invalid address for specified address family',
    libnl.errno_.NLE_SRCRT_NOSUPPORT: 'Source based routing not supported',
    libnl.errno_.NLE_MSG_TOOSHORT: 'Netlink message is too short',
    libnl.errno_.NLE_MSGTYPE_NOSUPPORT: 'Netlink message type is not supported',
    libnl.errno_.NLE_OBJ_MISMATCH: 'Object type does not match cache',
    libnl.errno_.NLE_NOCACHE: 'Unknown or invalid cache type',
    libnl.errno_.NLE_BUSY: 'Object busy',
    libnl.errno_.NLE_PROTO_MISMATCH: 'Protocol mismatch',
    libnl.errno_.NLE_NOACCESS: 'No Access',
    libnl.errno_.NLE_PERM: 'Operation not permitted',
    libnl.errno_.NLE_PKTLOC_FILE: 'Unable to open packet location file',
    libnl.errno_.NLE_PARSE_ERR: 'Unable to parse object',
    libnl.errno_.NLE_NODEV: 'No such device',
    libnl.errno_.NLE_IMMUTABLE: 'Immutable attribute',
    libnl.errno_.NLE_DUMP_INTR: 'Dump inconsistency detected, interrupted',
})


def nl_syserr2nlerr(error_):
    """https://github.com/thom311/libnl/blob/libnl3_2_25/lib/error.c#L84."""
    error_ = abs(error_)
    legend = {
        errno.EBADF: libnl.errno_.NLE_BAD_SOCK,
        errno.EADDRINUSE: libnl.errno_.NLE_EXIST,
        errno.EEXIST: libnl.errno_.NLE_EXIST,
        errno.EADDRNOTAVAIL: libnl.errno_.NLE_NOADDR,
        errno.ESRCH: libnl.errno_.NLE_OBJ_NOTFOUND,
        errno.ENOENT: libnl.errno_.NLE_OBJ_NOTFOUND,
        errno.EINTR: libnl.errno_.NLE_INTR,
        errno.EAGAIN: libnl.errno_.NLE_AGAIN,
        errno.ENOTSOCK: libnl.errno_.NLE_BAD_SOCK,
        errno.ENOPROTOOPT: libnl.errno_.NLE_INVAL,
        errno.EFAULT: libnl.errno_.NLE_INVAL,
        errno.EACCES: libnl.errno_.NLE_NOACCESS,
        errno.EINVAL: libnl.errno_.NLE_INVAL,
        errno.ENOBUFS: libnl.errno_.NLE_NOMEM,
        errno.ENOMEM: libnl.errno_.NLE_NOMEM,
        errno.EAFNOSUPPORT: libnl.errno_.NLE_AF_NOSUPPORT,
        errno.EPROTONOSUPPORT: libnl.errno_.NLE_PROTO_MISMATCH,
        errno.EOPNOTSUPP: libnl.errno_.NLE_OPNOTSUPP,
        errno.EPERM: libnl.errno_.NLE_PERM,
        errno.EBUSY: libnl.errno_.NLE_BUSY,
        errno.ERANGE: libnl.errno_.NLE_RANGE,
        errno.ENODEV: libnl.errno_.NLE_NODEV,
    }
    return int(legend.get(error_, libnl.errno_.NLE_FAILURE))