summaryrefslogtreecommitdiffstats
path: root/src/errno_status.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2022-10-20 21:34:20 -0400
committerDavid Robillard <d@drobilla.net>2022-10-21 12:45:39 -0400
commitd072adfbe40e15715e2065f1900f8d5a76491c5f (patch)
tree350f7c5c70e84d7a1d98a8e9389af4a4d3631cb1 /src/errno_status.c
parent60e86c7b2a05dab33fc66f4fa5b2954d79456cb6 (diff)
downloadzix-d072adfbe40e15715e2065f1900f8d5a76491c5f.tar.gz
zix-d072adfbe40e15715e2065f1900f8d5a76491c5f.tar.bz2
zix-d072adfbe40e15715e2065f1900f8d5a76491c5f.zip
Hide errno utility functions
Diffstat (limited to 'src/errno_status.c')
-rw-r--r--src/errno_status.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/errno_status.c b/src/errno_status.c
new file mode 100644
index 0000000..1830234
--- /dev/null
+++ b/src/errno_status.c
@@ -0,0 +1,48 @@
+// Copyright 2014-2022 David Robillard <d@drobilla.net>
+// SPDX-License-Identifier: ISC
+
+#include "errno_status.h"
+
+#include "zix/common.h"
+
+#include <errno.h>
+#include <stddef.h>
+
+ZixStatus
+zix_errno_status_if(const int r)
+{
+ return r ? zix_errno_status(errno) : ZIX_STATUS_SUCCESS;
+}
+
+ZixStatus
+zix_errno_status(const int e)
+{
+ typedef struct {
+ int code;
+ ZixStatus status;
+ } Mapping;
+
+ static const Mapping map[] = {
+ {0, ZIX_STATUS_SUCCESS},
+ {EACCES, ZIX_STATUS_BAD_PERMS},
+ {EAGAIN, ZIX_STATUS_UNAVAILABLE},
+ {EEXIST, ZIX_STATUS_EXISTS},
+ {EINVAL, ZIX_STATUS_BAD_ARG},
+ {ENOENT, ZIX_STATUS_NOT_FOUND},
+ {ENOMEM, ZIX_STATUS_NO_MEM},
+ {ENOSYS, ZIX_STATUS_NOT_SUPPORTED},
+ {EPERM, ZIX_STATUS_BAD_PERMS},
+ {ETIMEDOUT, ZIX_STATUS_TIMEOUT},
+ {0, ZIX_STATUS_ERROR}, // Fallback mapping
+ };
+
+ static const size_t n_mappings = sizeof(map) / sizeof(Mapping);
+
+ // Find the index of the matching mapping (or leave it at the fallback entry)
+ size_t m = 0;
+ while (m < n_mappings && map[m].code != e) {
+ ++m;
+ }
+
+ return map[m].status;
+}