File: error.c

package info (click to toggle)
libgpiod 2.2.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,108 kB
  • sloc: ansic: 26,612; sh: 7,554; cpp: 4,944; python: 2,426; makefile: 811; xml: 49
file content (67 lines) | stat: -rw-r--r-- 1,506 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// SPDX-License-Identifier: LGPL-2.1-or-later
// SPDX-FileCopyrightText: 2022-2024 Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

#include <errno.h>
#include <glib.h>
#include <gpiod-glib.h>
#include <stdarg.h>

G_DEFINE_QUARK(g-gpiod-error, gpiodglib_error)

static GpiodglibError error_from_errno(void)
{
	switch (errno) {
	case EPERM:
		return GPIODGLIB_ERR_PERM;
	case ENOENT:
		return GPIODGLIB_ERR_NOENT;
	case EINTR:
		return GPIODGLIB_ERR_INTR;
	case EIO:
		return GPIODGLIB_ERR_IO;
	case ENXIO:
		return GPIODGLIB_ERR_NXIO;
	case E2BIG:
		return GPIODGLIB_ERR_E2BIG;
	case EBADFD:
		return GPIODGLIB_ERR_BADFD;
	case ECHILD:
		return GPIODGLIB_ERR_CHILD;
	case EAGAIN:
		return GPIODGLIB_ERR_AGAIN;
	case ENOMEM:
		/* Special case - as a convention GLib just aborts on ENOMEM. */
		g_error("out of memory");
	case EACCES:
		return GPIODGLIB_ERR_ACCES;
	case EFAULT:
		return GPIODGLIB_ERR_FAULT;
	case EBUSY:
		return GPIODGLIB_ERR_BUSY;
	case EEXIST:
		return GPIODGLIB_ERR_EXIST;
	case ENODEV:
		return GPIODGLIB_ERR_NODEV;
	case EINVAL:
		return GPIODGLIB_ERR_INVAL;
	case ENOTTY:
		return GPIODGLIB_ERR_NOTTY;
	case EPIPE:
		return GPIODGLIB_ERR_PIPE;
	default:
		return GPIODGLIB_ERR_FAILED;
	}
}

void _gpiodglib_set_error_from_errno(GError **err, const gchar *fmt, ...)
{
	g_autofree gchar *msg = NULL;
	va_list va;

	va_start(va, fmt);
	msg = g_strdup_vprintf(fmt, va);
	va_end(va);

	g_set_error(err, GPIODGLIB_ERROR, error_from_errno(),
		    "%s: %s", msg, g_strerror(errno));
}