Home | History | Annotate | Download | only in lib
      1 /*
      2  * lib/error.c		Error Handling
      3  *
      4  *	This library is free software; you can redistribute it and/or
      5  *	modify it under the terms of the GNU Lesser General Public
      6  *	License as published by the Free Software Foundation version 2.1
      7  *	of the License.
      8  *
      9  * Copyright (c) 2008 Thomas Graf <tgraf (at) suug.ch>
     10  */
     11 
     12 #include <netlink-private/netlink.h>
     13 #include <netlink/netlink.h>
     14 
     15 static const char *errmsg[NLE_MAX+1] = {
     16 [NLE_SUCCESS]		= "Success",
     17 [NLE_FAILURE]		= "Unspecific failure",
     18 [NLE_INTR]		= "Interrupted system call",
     19 [NLE_BAD_SOCK]		= "Bad socket",
     20 [NLE_AGAIN]		= "Try again",
     21 [NLE_NOMEM]		= "Out of memory",
     22 [NLE_EXIST]		= "Object exists",
     23 [NLE_INVAL]		= "Invalid input data or parameter",
     24 [NLE_RANGE]		= "Input data out of range",
     25 [NLE_MSGSIZE]		= "Message size not sufficient",
     26 [NLE_OPNOTSUPP]		= "Operation not supported",
     27 [NLE_AF_NOSUPPORT]	= "Address family not supported",
     28 [NLE_OBJ_NOTFOUND]	= "Object not found",
     29 [NLE_NOATTR]		= "Attribute not available",
     30 [NLE_MISSING_ATTR]	= "Missing attribute",
     31 [NLE_AF_MISMATCH]	= "Address family mismatch",
     32 [NLE_SEQ_MISMATCH]	= "Message sequence number mismatch",
     33 [NLE_MSG_OVERFLOW]	= "Kernel reported message overflow",
     34 [NLE_MSG_TRUNC]		= "Kernel reported truncated message",
     35 [NLE_NOADDR]		= "Invalid address for specified address family",
     36 [NLE_SRCRT_NOSUPPORT]	= "Source based routing not supported",
     37 [NLE_MSG_TOOSHORT]	= "Netlink message is too short",
     38 [NLE_MSGTYPE_NOSUPPORT]	= "Netlink message type is not supported",
     39 [NLE_OBJ_MISMATCH]	= "Object type does not match cache",
     40 [NLE_NOCACHE]		= "Unknown or invalid cache type",
     41 [NLE_BUSY]		= "Object busy",
     42 [NLE_PROTO_MISMATCH]	= "Protocol mismatch",
     43 [NLE_NOACCESS]		= "No Access",
     44 [NLE_PERM]		= "Operation not permitted",
     45 [NLE_PKTLOC_FILE]	= "Unable to open packet location file",
     46 [NLE_PARSE_ERR]		= "Unable to parse object",
     47 [NLE_NODEV]		= "No such device",
     48 [NLE_IMMUTABLE]		= "Immutable attribute",
     49 [NLE_DUMP_INTR]		= "Dump inconsistency detected, interrupted",
     50 };
     51 
     52 /**
     53  * Return error message for an error code
     54  * @return error message
     55  */
     56 const char *nl_geterror(int error)
     57 {
     58 	error = abs(error);
     59 
     60 	if (error > NLE_MAX)
     61 		error = NLE_FAILURE;
     62 
     63 	return errmsg[error];
     64 }
     65 
     66 /**
     67  * Print a libnl error message
     68  * @arg s		error message prefix
     69  *
     70  * Prints the error message of the call that failed last.
     71  *
     72  * If s is not NULL and *s is not a null byte the argument
     73  * string is printed, followed by a colon and a blank. Then
     74  * the error message and a new-line.
     75  */
     76 void nl_perror(int error, const char *s)
     77 {
     78 	if (s && *s)
     79 		fprintf(stderr, "%s: %s\n", s, nl_geterror(error));
     80 	else
     81 		fprintf(stderr, "%s\n", nl_geterror(error));
     82 }
     83 
     84 int nl_syserr2nlerr(int error)
     85 {
     86 	error = abs(error);
     87 
     88 	switch (error) {
     89 	case EBADF:		return NLE_BAD_SOCK;
     90 	case EADDRINUSE:	return NLE_EXIST;
     91 	case EEXIST:		return NLE_EXIST;
     92 	case EADDRNOTAVAIL:	return NLE_NOADDR;
     93 	case ESRCH:		/* fall through */
     94 	case ENOENT:		return NLE_OBJ_NOTFOUND;
     95 	case EINTR:		return NLE_INTR;
     96 	case EAGAIN:		return NLE_AGAIN;
     97 	case ENOTSOCK:		return NLE_BAD_SOCK;
     98 	case ENOPROTOOPT:	return NLE_INVAL;
     99 	case EFAULT:		return NLE_INVAL;
    100 	case EACCES:		return NLE_NOACCESS;
    101 	case EINVAL:		return NLE_INVAL;
    102 	case ENOBUFS:		return NLE_NOMEM;
    103 	case ENOMEM:		return NLE_NOMEM;
    104 	case EAFNOSUPPORT:	return NLE_AF_NOSUPPORT;
    105 	case EPROTONOSUPPORT:	return NLE_PROTO_MISMATCH;
    106 	case EOPNOTSUPP:	return NLE_OPNOTSUPP;
    107 	case EPERM:		return NLE_PERM;
    108 	case EBUSY:		return NLE_BUSY;
    109 	case ERANGE:		return NLE_RANGE;
    110 	case ENODEV:		return NLE_NODEV;
    111 	default:		return NLE_FAILURE;
    112 	}
    113 }
    114 
    115 /** @} */
    116 
    117