summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am4
-rw-r--r--src/util/util.h8
-rw-r--r--src/util/util_errors.c41
-rw-r--r--src/util/util_errors.h75
4 files changed, 120 insertions, 8 deletions
diff --git a/Makefile.am b/Makefile.am
index 4ff02b8e7..79e6e571c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -363,6 +363,7 @@ dist_noinst_HEADERS = \
src/util/crypto/sss_crypto.h \
src/util/dlinklist.h \
src/util/util.h \
+ src/util/util_errors.h \
src/util/strtonum.h \
src/util/sss_nss.h \
src/util/sss_ldap.h \
@@ -524,7 +525,8 @@ libsss_util_la_SOURCES = \
src/util/authtok.c \
src/util/sss_selinux.c \
src/util/domain_info_utils.c \
- src/util/util_lock.c
+ src/util/util_lock.c \
+ src/util/util_errors.c
libsss_util_la_LIBADD = \
$(SSSD_LIBS) \
$(UNICODE_LIBS) \
diff --git a/src/util/util.h b/src/util/util.h
index 7026f0b93..9657826e2 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -44,11 +44,7 @@
#include <dhash.h>
#include "util/atomic_io.h"
-
-#ifndef HAVE_ERRNO_T
-#define HAVE_ERRNO_T
-typedef int errno_t;
-#endif
+#include "util/util_errors.h"
#define _(STRING) gettext (STRING)
@@ -221,8 +217,6 @@ errno_t set_debug_file_from_fd(const int fd);
#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))
-#define EOK 0
-
#define SSSD_MAIN_OPTS SSSD_DEBUG_OPTS
#define FLAGS_NONE 0x0000
diff --git a/src/util/util_errors.c b/src/util/util_errors.c
new file mode 100644
index 000000000..92dced3c5
--- /dev/null
+++ b/src/util/util_errors.c
@@ -0,0 +1,41 @@
+/*
+ Copyright (C) 2012 Red Hat
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Authors:
+ Simo Sorce <ssorce@redhat.com>
+*/
+
+#include "util/util.h"
+
+struct err_string {
+ const char *msg;
+};
+
+struct err_string error_to_str[] = {
+ { "Invalid Error" }, /* ERR_INVALID */
+ { "Internal Error" }, /* ERR_INTERNAL */
+};
+
+
+const char *sss_strerror(errno_t error)
+{
+ if (IS_SSSD_ERROR(error)) {
+ return error_to_str[SSSD_ERR_IDX(error)].msg;
+ }
+
+ return strerror(error);
+}
+
diff --git a/src/util/util_errors.h b/src/util/util_errors.h
new file mode 100644
index 000000000..eb0df77e6
--- /dev/null
+++ b/src/util/util_errors.h
@@ -0,0 +1,75 @@
+/*
+ Copyright (C) 2012 Red Hat
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ Authors:
+ Simo Sorce <ssorce@redhat.com>
+*/
+
+#ifndef __SSSD_UTIL_ERRORS_H__
+#define __SSSD_UTIL_ERRORS_H__
+
+#ifndef HAVE_ERRNO_T
+#define HAVE_ERRNO_T
+typedef int errno_t;
+#endif
+
+/*
+ * We define a specific number space so that we do not overlap with other
+ * generic errors returned by various libraries. This will make it easy
+ * to have functions that double check that what was returned was a SSSD
+ * specific error where it matters. For example we may want to ensure some
+ * particularly sensitive paths only return SSSD sepcific errors as that
+ * will insure all error conditions have been explicitly dealt with,
+ * and are not the result of assigning the wrong return result.
+ *
+ * Basic system errno errors can still be used, but when an error condition
+ * does not properly map to a system error we should use a SSSD specific one
+ */
+
+#define ERR_BASE 0x555D0000
+#define ERR_MASK 0x0000FFFF
+
+/* never use ERR_INVALID, it is used for catching and returning
+ * information on invalid error numbers */
+/* never use ERR_LAST, this represent the maximum error value available
+ * and is used to validate error codes */
+enum sssd_errors {
+ ERR_INVALID = ERR_BASE + 0,
+ ERR_INTERNAL,
+ ERR_LAST /* ALWAYS LAST */
+};
+
+#define SSSD_ERR_IDX(err) ((err) & ERR_MASK)
+#define IS_SSSD_ERROR(err) \
+ ((((err) & ERR_BASE) == ERR_BASE) && \
+ SSSD_ERR_IDX(err) < ERR_LAST)
+
+#define ERR_OK 0
+/* Backwards compat */
+#ifndef EOK
+#define EOK ERR_OK
+#endif
+
+/**
+ * @brief return a string descriing the error number like strerror()
+ *
+ * @param error An errno_t number, can be a SSSD error or a system error
+ *
+ * @return A statically allocated string.
+ */
+const char *sss_strerror(errno_t error);
+
+#endif /* __SSSD_UTIL_ERRORS_H__ */