Hello community, here is the log from the commit of package libgpiod for openSUSE:Factory checked in at 2019-10-30 14:48:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libgpiod (Old) and /work/SRC/openSUSE:Factory/.libgpiod.new.2990 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libgpiod" Wed Oct 30 14:48:01 2019 rev:7 rq:743965 version:1.4.1 Changes: -------- --- /work/SRC/openSUSE:Factory/libgpiod/libgpiod.changes 2019-06-13 23:06:41.323182197 +0200 +++ /work/SRC/openSUSE:Factory/.libgpiod.new.2990/libgpiod.changes 2019-10-30 14:48:06.170200416 +0100 @@ -1,0 +2,13 @@ +Wed Oct 30 07:44:00 UTC 2019 - Guillaume GARDET <[email protected]> + +- Update to v1.4.1 (Bug fixes release): + * fix GCC8 warnings when building python bindings + * fix a bug in gpioinfo where lines used by the kernel without any consumer + string were reported as unused + * fix a bug in line::event_get_fd() in C++ bindings where the exception + wouldn't be throws in error cases due to a missing 'throw' keyword + * fix a couple bugs in the test-suite + * disable a failing assertion in the test-suite that stopped working after + linux v5.2.7 + +------------------------------------------------------------------- Old: ---- libgpiod-1.4.tar.gz New: ---- libgpiod-1.4.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libgpiod.spec ++++++ --- /var/tmp/diff_new_pack.og3K2A/_old 2019-10-30 14:48:07.158201466 +0100 +++ /var/tmp/diff_new_pack.og3K2A/_new 2019-10-30 14:48:07.158201466 +0100 @@ -28,7 +28,7 @@ %endif Name: libgpiod -Version: 1.4 +Version: 1.4.1 Release: 0 Summary: Tools for interacting with the linux GPIO character device License: LGPL-2.1-or-later ++++++ libgpiod-1.4.tar.gz -> libgpiod-1.4.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libgpiod-1.4/NEWS new/libgpiod-1.4.1/NEWS --- old/libgpiod-1.4/NEWS 2019-06-06 15:18:00.000000000 +0200 +++ new/libgpiod-1.4.1/NEWS 2019-08-07 12:08:52.000000000 +0200 @@ -1,3 +1,16 @@ +libgpiod v1.4.1 +=============== + +Bug fixes: +- fix GCC8 warnings when building python bindings +- fix a bug in gpioinfo where lines used by the kernel without any consumer + string were reported as unused +- fix a bug in line::event_get_fd() in C++ bindings where the exception + wouldn't be throws in error cases due to a missing 'throw' keyword +- fix a couple bugs in the test-suite +- disable a failing assertion in the test-suite that stopped working after + linux v5.2.7 + libgpiod v1.4 ============= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libgpiod-1.4/bindings/cxx/line.cpp new/libgpiod-1.4.1/bindings/cxx/line.cpp --- old/libgpiod-1.4/bindings/cxx/line.cpp 2019-06-06 15:18:00.000000000 +0200 +++ new/libgpiod-1.4.1/bindings/cxx/line.cpp 2019-08-07 12:08:52.000000000 +0200 @@ -183,8 +183,8 @@ int ret = ::gpiod_line_event_get_fd(this->_m_line); if (ret < 0) - ::std::system_error(errno, ::std::system_category(), - "unable to get the line event file descriptor"); + throw ::std::system_error(errno, ::std::system_category(), + "unable to get the line event file descriptor"); return ret; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libgpiod-1.4/bindings/python/gpiodmodule.c new/libgpiod-1.4.1/bindings/python/gpiodmodule.c --- old/libgpiod-1.4/bindings/python/gpiodmodule.c 2019-06-06 15:18:00.000000000 +0200 +++ new/libgpiod-1.4.1/bindings/python/gpiodmodule.c 2019-08-07 12:08:52.000000000 +0200 @@ -103,7 +103,9 @@ return ret; } -static int gpiod_LineEvent_init(void) +static int gpiod_LineEvent_init(PyObject *Py_UNUSED(ignored0), + PyObject *Py_UNUSED(ignored1), + PyObject *Py_UNUSED(ignored2)) { PyErr_SetString(PyExc_NotImplementedError, "Only gpiod.Line can create new LineEvent objects."); @@ -121,7 +123,8 @@ PyDoc_STRVAR(gpiod_LineEvent_get_type_doc, "Event type of this line event (integer)."); -PyObject *gpiod_LineEvent_get_type(gpiod_LineEventObject *self) +PyObject *gpiod_LineEvent_get_type(gpiod_LineEventObject *self, + PyObject *Py_UNUSED(ignored)) { int rv; @@ -136,7 +139,8 @@ PyDoc_STRVAR(gpiod_LineEvent_get_sec_doc, "Seconds value of the line event timestamp (integer)."); -PyObject *gpiod_LineEvent_get_sec(gpiod_LineEventObject *self) +PyObject *gpiod_LineEvent_get_sec(gpiod_LineEventObject *self, + PyObject *Py_UNUSED(ignored)) { return Py_BuildValue("I", self->event.ts.tv_sec); } @@ -144,7 +148,8 @@ PyDoc_STRVAR(gpiod_LineEvent_get_nsec_doc, "Nanoseconds value of the line event timestamp (integer)."); -PyObject *gpiod_LineEvent_get_nsec(gpiod_LineEventObject *self) +PyObject *gpiod_LineEvent_get_nsec(gpiod_LineEventObject *self, + PyObject *Py_UNUSED(ignored)) { return Py_BuildValue("I", self->event.ts.tv_nsec); } @@ -153,7 +158,8 @@ "Line object representing the GPIO line on which this event\n" "occurred (gpiod.Line object)."); -gpiod_LineObject *gpiod_LineEvent_get_source(gpiod_LineEventObject *self) +gpiod_LineObject *gpiod_LineEvent_get_source(gpiod_LineEventObject *self, + PyObject *Py_UNUSED(ignored)) { Py_INCREF(self->source); return self->source; @@ -221,7 +227,9 @@ .tp_repr = (reprfunc)gpiod_LineEvent_repr, }; -static int gpiod_Line_init(void) +static int gpiod_Line_init(PyObject *Py_UNUSED(ignored0), + PyObject *Py_UNUSED(ignored1), + PyObject *Py_UNUSED(ignored2)) { PyErr_SetString(PyExc_NotImplementedError, "Only gpiod.Chip can create new Line objects."); @@ -241,7 +249,8 @@ "\n" "Get the GPIO chip owning this line."); -static PyObject *gpiod_Line_owner(gpiod_LineObject *self) +static PyObject *gpiod_Line_owner(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { Py_INCREF(self->owner); return (PyObject *)self->owner; @@ -252,7 +261,8 @@ "\n" "Get the offset of the GPIO line."); -static PyObject *gpiod_Line_offset(gpiod_LineObject *self) +static PyObject *gpiod_Line_offset(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self->owner)) return NULL; @@ -265,7 +275,8 @@ "\n" "Get the name of the GPIO line."); -static PyObject *gpiod_Line_name(gpiod_LineObject *self) +static PyObject *gpiod_Line_name(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { const char *name; @@ -284,7 +295,8 @@ "\n" "Get the consumer string of the GPIO line."); -static PyObject *gpiod_Line_consumer(gpiod_LineObject *self) +static PyObject *gpiod_Line_consumer(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { const char *consumer; @@ -303,7 +315,8 @@ "\n" "Get the direction setting of this GPIO line."); -static PyObject *gpiod_Line_direction(gpiod_LineObject *self) +static PyObject *gpiod_Line_direction(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { PyObject *ret; int dir; @@ -326,7 +339,8 @@ "\n" "Get the active state setting of this GPIO line."); -static PyObject *gpiod_Line_active_state(gpiod_LineObject *self) +static PyObject *gpiod_Line_active_state(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { PyObject *ret; int active; @@ -349,7 +363,8 @@ "\n" "Check if this line is used by the kernel or other user space process."); -static PyObject *gpiod_Line_is_used(gpiod_LineObject *self) +static PyObject *gpiod_Line_is_used(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self->owner)) return NULL; @@ -365,7 +380,8 @@ "\n" "Check if this line represents an open-drain GPIO."); -static PyObject *gpiod_Line_is_open_drain(gpiod_LineObject *self) +static PyObject *gpiod_Line_is_open_drain(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self->owner)) return NULL; @@ -381,7 +397,8 @@ "\n" "Check if this line represents an open-source GPIO."); -static PyObject *gpiod_Line_is_open_source(gpiod_LineObject *self) +static PyObject *gpiod_Line_is_open_source(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self->owner)) return NULL; @@ -469,7 +486,8 @@ "\n" "Check if this user has ownership of this line."); -static PyObject *gpiod_Line_is_requested(gpiod_LineObject *self) +static PyObject *gpiod_Line_is_requested(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self->owner)) return NULL; @@ -485,7 +503,8 @@ "\n" "Read the current value of this GPIO line."); -static PyObject *gpiod_Line_get_value(gpiod_LineObject *self) +static PyObject *gpiod_Line_get_value(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { gpiod_LineBulkObject *bulk_obj; PyObject *vals, *ret; @@ -547,7 +566,8 @@ "\n" "Release this GPIO line."); -static PyObject *gpiod_Line_release(gpiod_LineObject *self) +static PyObject *gpiod_Line_release(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { gpiod_LineBulkObject *bulk_obj; PyObject *ret; @@ -605,7 +625,8 @@ "\n" "Read a single line event from this GPIO line object."); -static gpiod_LineEventObject *gpiod_Line_event_read(gpiod_LineObject *self) +static gpiod_LineEventObject *gpiod_Line_event_read(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { gpiod_LineEventObject *ret; int rv; @@ -639,7 +660,8 @@ "\n" "Get the event file descriptor number associated with this line."); -static PyObject *gpiod_Line_event_get_fd(gpiod_LineObject *self) +static PyObject *gpiod_Line_event_get_fd(gpiod_LineObject *self, + PyObject *Py_UNUSED(ignored)) { int fd; @@ -733,7 +755,7 @@ }, { .ml_name = "request", - .ml_meth = (PyCFunction)gpiod_Line_request, + .ml_meth = (PyCFunction)(void (*)(void))gpiod_Line_request, .ml_flags = METH_VARARGS | METH_KEYWORDS, .ml_doc = gpiod_Line_request_doc, }, @@ -763,7 +785,7 @@ }, { .ml_name = "event_wait", - .ml_meth = (PyCFunction)gpiod_Line_event_wait, + .ml_meth = (PyCFunction)(void (*)(void))gpiod_Line_event_wait, .ml_flags = METH_VARARGS | METH_KEYWORDS, .ml_doc = gpiod_Line_event_wait_doc, }, @@ -811,7 +833,8 @@ return gpiod_ChipIsClosed(line->owner); } -static int gpiod_LineBulk_init(gpiod_LineBulkObject *self, PyObject *args) +static int gpiod_LineBulk_init(gpiod_LineBulkObject *self, + PyObject *args, PyObject *Py_UNUSED(ignored)) { PyObject *lines, *iter, *next; Py_ssize_t i; @@ -911,7 +934,8 @@ "\n" "Convert this LineBulk to a list"); -static PyObject *gpiod_LineBulk_to_list(gpiod_LineBulkObject *self) +static PyObject *gpiod_LineBulk_to_list(gpiod_LineBulkObject *self, + PyObject *Py_UNUSED(ignored)) { PyObject *list; Py_ssize_t i; @@ -1079,7 +1103,8 @@ "of each value in the returned list corresponds with the index of the line\n" "in this gpiod.LineBulk object."); -static PyObject *gpiod_LineBulk_get_values(gpiod_LineBulkObject *self) +static PyObject *gpiod_LineBulk_get_values(gpiod_LineBulkObject *self, + PyObject *Py_UNUSED(ignored)) { int rv, vals[GPIOD_LINE_BULK_MAX_LINES]; struct gpiod_line_bulk bulk; @@ -1196,7 +1221,8 @@ "\n" "Release all lines held by this LineBulk object."); -static PyObject *gpiod_LineBulk_release(gpiod_LineBulkObject *self) +static PyObject *gpiod_LineBulk_release(gpiod_LineBulkObject *self, + PyObject *Py_UNUSED(ignored)) { struct gpiod_line_bulk bulk; @@ -1293,7 +1319,7 @@ if (gpiod_LineBulkOwnerIsClosed(self)) return NULL; - list = gpiod_LineBulk_to_list(self); + list = gpiod_LineBulk_to_list(self, NULL); if (!list) return NULL; @@ -1324,7 +1350,7 @@ }, { .ml_name = "request", - .ml_meth = (PyCFunction)gpiod_LineBulk_request, + .ml_meth = (PyCFunction)(void (*)(void))gpiod_LineBulk_request, .ml_doc = gpiod_LineBulk_request_doc, .ml_flags = METH_VARARGS | METH_KEYWORDS, }, @@ -1348,7 +1374,7 @@ }, { .ml_name = "event_wait", - .ml_meth = (PyCFunction)gpiod_LineBulk_event_wait, + .ml_meth = (PyCFunction)(void (*)(void))gpiod_LineBulk_event_wait, .ml_doc = gpiod_LineBulk_event_wait_doc, .ml_flags = METH_VARARGS | METH_KEYWORDS, }, @@ -1402,7 +1428,8 @@ gpiod_OPEN_BY_NUMBER, }; -static int gpiod_Chip_init(gpiod_ChipObject *self, PyObject *args) +static int gpiod_Chip_init(gpiod_ChipObject *self, + PyObject *args, PyObject *Py_UNUSED(ignored)) { int rv, how = gpiod_OPEN_LOOKUP; PyThreadState *thread; @@ -1468,7 +1495,8 @@ "Close the associated gpiochip descriptor. The chip object must no longer\n" "be used after this method is called.\n"); -static PyObject *gpiod_Chip_close(gpiod_ChipObject *self) +static PyObject *gpiod_Chip_close(gpiod_ChipObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self)) return NULL; @@ -1482,7 +1510,8 @@ PyDoc_STRVAR(gpiod_Chip_enter_doc, "Controlled execution enter callback."); -static PyObject *gpiod_Chip_enter(gpiod_ChipObject *chip) +static PyObject *gpiod_Chip_enter(gpiod_ChipObject *chip, + PyObject *Py_UNUSED(ignored)) { Py_INCREF(chip); return (PyObject *)chip; @@ -1491,7 +1520,8 @@ PyDoc_STRVAR(gpiod_Chip_exit_doc, "Controlled execution exit callback."); -static PyObject *gpiod_Chip_exit(gpiod_ChipObject *chip) +static PyObject *gpiod_Chip_exit(gpiod_ChipObject *chip, + PyObject *Py_UNUSED(ignored)) { return PyObject_CallMethod((PyObject *)chip, "close", ""); } @@ -1501,7 +1531,8 @@ "\n" "Get the name of the GPIO chip"); -static PyObject *gpiod_Chip_name(gpiod_ChipObject *self) +static PyObject *gpiod_Chip_name(gpiod_ChipObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self)) return NULL; @@ -1514,7 +1545,8 @@ "\n" "Get the label of the GPIO chip"); -static PyObject *gpiod_Chip_label(gpiod_ChipObject *self) +static PyObject *gpiod_Chip_label(gpiod_ChipObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self)) return NULL; @@ -1527,7 +1559,8 @@ "\n" "Get the number of lines exposed by this GPIO chip."); -static PyObject *gpiod_Chip_num_lines(gpiod_ChipObject *self) +static PyObject *gpiod_Chip_num_lines(gpiod_ChipObject *self, + PyObject *Py_UNUSED(ignored)) { if (gpiod_ChipIsClosed(self)) return NULL; @@ -1726,7 +1759,7 @@ "Get all lines exposed by this Chip."); static gpiod_LineBulkObject * -gpiod_Chip_get_all_lines(gpiod_ChipObject *self) +gpiod_Chip_get_all_lines(gpiod_ChipObject *self, PyObject *Py_UNUSED(ignored)) { gpiod_LineBulkObject *bulk_obj; struct gpiod_line_bulk bulk; @@ -1966,7 +1999,9 @@ .tp_methods = gpiod_Chip_methods, }; -static int gpiod_ChipIter_init(gpiod_ChipIterObject *self) +static int gpiod_ChipIter_init(gpiod_ChipIterObject *self, + PyObject *Py_UNUSED(ignored0), + PyObject *Py_UNUSED(ignored1)) { self->iter = gpiod_chip_iter_new(); if (!self->iter) { @@ -2034,7 +2069,8 @@ .tp_iternext = (iternextfunc)gpiod_ChipIter_next, }; -static int gpiod_LineIter_init(gpiod_LineIterObject *self, PyObject *args) +static int gpiod_LineIter_init(gpiod_LineIterObject *self, + PyObject *args, PyObject *Py_UNUSED(ignored)) { gpiod_ChipObject *chip_obj; int rv; @@ -2120,7 +2156,7 @@ " name\n" " Name of the line to find (string)."); -static gpiod_LineObject *gpiod_Module_find_line(PyObject *self GPIOD_UNUSED, +static gpiod_LineObject *gpiod_Module_find_line(PyObject *Py_UNUSED(self), PyObject *args) { gpiod_LineObject *line_obj; @@ -2178,7 +2214,8 @@ "\n" "Get the API version of the library as a human-readable string."); -static PyObject *gpiod_Module_version_string(void) +static PyObject *gpiod_Module_version_string(PyObject *Py_UNUSED(ignored0), + PyObject *Py_UNUSED(ignored1)) { return PyUnicode_FromFormat("%s", gpiod_version_string()); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libgpiod-1.4/configure.ac new/libgpiod-1.4.1/configure.ac --- old/libgpiod-1.4/configure.ac 2019-06-06 15:18:00.000000000 +0200 +++ new/libgpiod-1.4.1/configure.ac 2019-08-07 12:08:52.000000000 +0200 @@ -8,7 +8,7 @@ AC_PREREQ(2.61) -AC_INIT([libgpiod], 1.4) +AC_INIT([libgpiod], 1.4.1) AC_SUBST(EXTRA_VERSION, []) AC_DEFINE_UNQUOTED([GPIOD_VERSION_STR], @@ -32,7 +32,7 @@ # NOTE: this version only applies to the core C library. AC_SUBST(ABI_VERSION, [3.1.1]) # Have a separate ABI version for C++ bindings: -AC_SUBST(ABI_CXX_VERSION, [1.2.0]) +AC_SUBST(ABI_CXX_VERSION, [1.3.0]) AC_CONFIG_AUX_DIR([autostuff]) AC_CONFIG_MACRO_DIRS([m4]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libgpiod-1.4/tests/gpiod-test.c new/libgpiod-1.4.1/tests/gpiod-test.c --- old/libgpiod-1.4/tests/gpiod-test.c 2019-06-06 15:18:00.000000000 +0200 +++ new/libgpiod-1.4.1/tests/gpiod-test.c 2019-08-07 12:08:52.000000000 +0200 @@ -311,8 +311,11 @@ msg("cleaning up"); free(globals.pipebuf); + if (globals.toolpath) + free(globals.toolpath); - gpio_mockup_unref(globals.mockup); + if (globals.mockup) + gpio_mockup_unref(globals.mockup); } static void event_lock(void) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libgpiod-1.4/tests/mockup/gpio-mockup.c new/libgpiod-1.4.1/tests/mockup/gpio-mockup.c --- old/libgpiod-1.4/tests/mockup/gpio-mockup.c 2019-06-06 15:18:00.000000000 +0200 +++ new/libgpiod-1.4.1/tests/mockup/gpio-mockup.c 2019-08-07 12:08:52.000000000 +0200 @@ -120,7 +120,8 @@ * Then see if we can freely load and unload it. If it's already * loaded - no problem, we'll remove it next anyway. */ - rv = kmod_module_probe_insert_module(ctx->module, 0, + rv = kmod_module_probe_insert_module(ctx->module, + KMOD_PROBE_IGNORE_LOADED, "gpio_mockup_ranges=-1,4", NULL, NULL, NULL); if (rv) @@ -304,11 +305,7 @@ if (!ctx->chips) goto err_remove_module; - for (i = 0; i < num_chips; i++) { - ctx->chips[i] = malloc(sizeof(struct gpio_mockup_chip)); - if (!ctx->chips[i]) - goto err_free_chips; - } + ctx->num_chips = num_chips; pfd.fd = udev_monitor_get_fd(monitor); pfd.events = POLLIN | POLLPRI; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libgpiod-1.4/tests/tests-event.c new/libgpiod-1.4.1/tests/tests-event.c --- old/libgpiod-1.4/tests/tests-event.c 2019-06-06 15:18:00.000000000 +0200 +++ new/libgpiod-1.4.1/tests/tests-event.c 2019-08-07 12:08:52.000000000 +0200 @@ -200,8 +200,12 @@ TEST_ASSERT_EQ(ev.event_type, GPIOD_LINE_EVENT_FALLING_EDGE); - rv = gpiod_line_get_value(line); - TEST_ASSERT_EQ(rv, 1); + /* + * The assertion below was commented out after it stopped working + * with kernel past v5.2.7 due to upstream commit 223ecaf140b1. + */ + //rv = gpiod_line_get_value(line); + //TEST_ASSERT_EQ(rv, 0); } TEST_DEFINE(event_get_value_active_low, "events - mixing events and gpiod_line_get_value() (active-low flag)", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libgpiod-1.4/tools/gpioinfo.c new/libgpiod-1.4.1/tools/gpioinfo.c --- old/libgpiod-1.4/tools/gpioinfo.c 2019-06-06 15:18:00.000000000 +0200 +++ new/libgpiod-1.4.1/tools/gpioinfo.c 2019-08-07 12:08:52.000000000 +0200 @@ -119,8 +119,12 @@ : prinfo(&of, 12, "unnamed"); printf(" "); - consumer ? prinfo(&of, 12, "\"%s\"", consumer) - : prinfo(&of, 12, "unused"); + if (!gpiod_line_is_used(line)) + prinfo(&of, 12, "unused"); + else + consumer ? prinfo(&of, 12, "\"%s\"", consumer) + : prinfo(&of, 12, "kernel"); + printf(" "); prinfo(&of, 8, "%s ", direction == GPIOD_LINE_DIRECTION_INPUT
