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-local.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 };
     47 
     48 /**
     49  * Return error message for an error code
     50  * @return error message
     51  */
     52 const char *nl_geterror(int error)
     53 {
     54 	error = abs(error);
     55 
     56 	if (error > NLE_MAX)
     57 		error = NLE_FAILURE;
     58 
     59 	return errmsg[error];
     60 }
     61 
     62 /**
     63  * Print a libnl error message
     64  * @arg s		error message prefix
     65  *
     66  * Prints the error message of the call that failed last.
     67  *
     68  * If s is not NULL and *s is not a null byte the argument
     69  * string is printed, followed by a colon and a blank. Then
     70  * the error message and a new-line.
     71  */
     72 void nl_perror(int error, const char *s)
     73 {
     74 	if (s && *s)
     75 		fprintf(stderr, "%s: %s\n", s, nl_geterror(error));
     76 	else
     77 		fprintf(stderr, "%s\n", nl_geterror(error));
     78 }
     79 
     80 int nl_syserr2nlerr(int error)
     81 {
     82 	error = abs(error);
     83 
     84 	switch (error) {
     85 	case EBADF:		return NLE_BAD_SOCK;
     86 	case EADDRINUSE:	return NLE_EXIST;
     87 	case EEXIST:		return NLE_EXIST;
     88 	case EADDRNOTAVAIL:	return NLE_NOADDR;
     89 	case ENOENT:		return NLE_OBJ_NOTFOUND;
     90 	case EINTR:		return NLE_INTR;
     91 	case EAGAIN:		return NLE_AGAIN;
     92 	case ENOTSOCK:		return NLE_BAD_SOCK;
     93 	case ENOPROTOOPT:	return NLE_INVAL;
     94 	case EFAULT:		return NLE_INVAL;
     95 	case EACCES:		return NLE_NOACCESS;
     96 	case EINVAL:		return NLE_INVAL;
     97 	case ENOBUFS:		return NLE_NOMEM;
     98 	case ENOMEM:		return NLE_NOMEM;
     99 	case EAFNOSUPPORT:	return NLE_AF_NOSUPPORT;
    100 	case EPROTONOSUPPORT:	return NLE_PROTO_MISMATCH;
    101 	case EOPNOTSUPP:	return NLE_OPNOTSUPP;
    102 	case EPERM:		return NLE_PERM;
    103 	case EBUSY:		return NLE_BUSY;
    104 	case ERANGE:		return NLE_RANGE;
    105 	default:		return NLE_FAILURE;
    106 	}
    107 }
    108 
    109 /** @} */
    110 
    111