This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git

commit 2fc11388fa60f0c8ae9884e98fb693ee7a6f6115
Author: Alan Carvalho de Assis <[email protected]>
AuthorDate: Fri Oct 9 11:10:00 2026 -0300

    examples/scl3300test: Add Murata SCL3300 inclinometer test program.
    
    Add a program to check the SCL3300 driver on a board.  It goes through
    the driver's uORB topics and ioctls and reports PASS or FAIL for each
    test:
     - whoami: SNIOC_WHO_AM_I returns 0xC1.
     - selftest: SNIOC_SELFTEST succeeds.
     - info: prints SNIOC_GET_INFO for each topic.
     - read: mean and standard deviation of 200 samples per axis.
     - modes: Modes 1, 2, 3, 4 and 1, with the info and noise of each,
       and an invalid mode is rejected.
     - power: 100 power-down/wake-up cycles with SCL3300_POWER_DOWN_IDLE,
       checking that the mode survives.
     - reset: SNIOC_RESET, then read.
     - all: every test above.
    
    Tested on an STM32F4Discovery with an SCL3300.
    
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Alan Carvalho de Assis <[email protected]>
---
 examples/scl3300test/CMakeLists.txt     |  35 ++
 examples/scl3300test/Kconfig            |  33 ++
 examples/scl3300test/Make.defs          |  25 ++
 examples/scl3300test/Makefile           |  34 ++
 examples/scl3300test/scl3300test_main.c | 594 ++++++++++++++++++++++++++++++++
 5 files changed, 721 insertions(+)

diff --git a/examples/scl3300test/CMakeLists.txt 
b/examples/scl3300test/CMakeLists.txt
new file mode 100644
index 000000000..26deb6533
--- /dev/null
+++ b/examples/scl3300test/CMakeLists.txt
@@ -0,0 +1,35 @@
+# 
##############################################################################
+# apps/examples/scl3300test/CMakeLists.txt
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for
+# additional information regarding copyright ownership.  The ASF licenses this
+# file to you under the Apache License, Version 2.0 (the "License"); you may 
not
+# use this file except in compliance with the License.  You may obtain a copy 
of
+# the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations under
+# the License.
+#
+# 
##############################################################################
+
+if(CONFIG_EXAMPLES_SCL3300TEST)
+  nuttx_add_application(
+    NAME
+    ${CONFIG_EXAMPLES_SCL3300TEST_PROGNAME}
+    PRIORITY
+    ${CONFIG_EXAMPLES_SCL3300TEST_PRIORITY}
+    STACKSIZE
+    ${CONFIG_EXAMPLES_SCL3300TEST_STACKSIZE}
+    MODULE
+    ${CONFIG_EXAMPLES_SCL3300TEST}
+    SRCS
+    scl3300test_main.c)
+endif()
diff --git a/examples/scl3300test/Kconfig b/examples/scl3300test/Kconfig
new file mode 100644
index 000000000..00f035c53
--- /dev/null
+++ b/examples/scl3300test/Kconfig
@@ -0,0 +1,33 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+config EXAMPLES_SCL3300TEST
+       tristate "SCL3300 inclinometer test program"
+       default n
+       depends on SENSORS_SCL3300
+       ---help---
+               Enable the Murata SCL3300 test program. It checks WHOAMI and the
+               self-test, prints the device info, measures the noise in every
+               operation mode, cycles the power-down policy and resets the
+               device, using the driver's uORB topics and ioctls.
+
+if EXAMPLES_SCL3300TEST
+
+config EXAMPLES_SCL3300TEST_PROGNAME
+       string "Program name"
+       default "scl3300test"
+       ---help---
+               This is the name of the program that will be used when the NSH 
ELF
+               program is installed.
+
+config EXAMPLES_SCL3300TEST_PRIORITY
+       int "scl3300test task priority"
+       default 100
+
+config EXAMPLES_SCL3300TEST_STACKSIZE
+       int "scl3300test stack size"
+       default 4096
+
+endif
diff --git a/examples/scl3300test/Make.defs b/examples/scl3300test/Make.defs
new file mode 100644
index 000000000..606ec45dd
--- /dev/null
+++ b/examples/scl3300test/Make.defs
@@ -0,0 +1,25 @@
+############################################################################
+# apps/examples/scl3300test/Make.defs
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+ifneq ($(CONFIG_EXAMPLES_SCL3300TEST),)
+CONFIGURED_APPS += $(APPDIR)/examples/scl3300test
+endif
diff --git a/examples/scl3300test/Makefile b/examples/scl3300test/Makefile
new file mode 100644
index 000000000..e72dfa941
--- /dev/null
+++ b/examples/scl3300test/Makefile
@@ -0,0 +1,34 @@
+############################################################################
+# apps/examples/scl3300test/Makefile
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(APPDIR)/Make.defs
+
+# SCL3300 inclinometer test program
+
+PROGNAME  = $(CONFIG_EXAMPLES_SCL3300TEST_PROGNAME)
+PRIORITY  = $(CONFIG_EXAMPLES_SCL3300TEST_PRIORITY)
+STACKSIZE = $(CONFIG_EXAMPLES_SCL3300TEST_STACKSIZE)
+MODULE    = $(CONFIG_EXAMPLES_SCL3300TEST)
+
+MAINSRC = scl3300test_main.c
+
+include $(APPDIR)/Application.mk
diff --git a/examples/scl3300test/scl3300test_main.c 
b/examples/scl3300test/scl3300test_main.c
new file mode 100644
index 000000000..6e7609e82
--- /dev/null
+++ b/examples/scl3300test/scl3300test_main.c
@@ -0,0 +1,594 @@
+/****************************************************************************
+ * apps/examples/scl3300test/scl3300test_main.c
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <math.h>
+#include <poll.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include <nuttx/sensors/ioctl.h>
+#include <nuttx/sensors/scl3300.h>
+#include <nuttx/uorb.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#ifdef CONFIG_SENSORS_USE_B16
+#  define TODOUBLE(v)     ((double)(v) / 65536.0)
+#else
+#  define TODOUBLE(v)     ((double)(v))
+#endif
+
+#define SCL3300TEST_WHOAMI     0xc1
+#define SCL3300TEST_NSAMPLES   200      /* Samples per noise measurement */
+#define SCL3300TEST_NSKIP      20       /* Samples dropped after a change */
+#define SCL3300TEST_NCYCLES    100      /* Power-down/wake-up cycles */
+#define SCL3300TEST_INTERVAL   10000    /* Sampling interval in us */
+#define SCL3300TEST_TIMEOUT    1000     /* Read timeout in ms */
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: open_topic
+ ****************************************************************************/
+
+static int open_topic(int devno, FAR const char *name)
+{
+  char path[64];
+  int fd;
+
+  snprintf(path, sizeof(path), "/dev/uorb/sensor_%s%d", name, devno);
+  fd = open(path, O_RDONLY | O_NONBLOCK);
+  if (fd < 0)
+    {
+      printf("Failed to open %s: %d\n", path, errno);
+    }
+
+  return fd;
+}
+
+/****************************************************************************
+ * Name: read_sample
+ ****************************************************************************/
+
+static int read_sample(int fd, FAR void *buf, size_t len)
+{
+  struct pollfd pfd;
+  int ret;
+
+  pfd.fd     = fd;
+  pfd.events = POLLIN;
+
+  ret = poll(&pfd, 1, SCL3300TEST_TIMEOUT);
+  if (ret <= 0)
+    {
+      return -ETIMEDOUT;
+    }
+
+  ret = read(fd, buf, len);
+  return ret == (int)len ? OK : -EIO;
+}
+
+/****************************************************************************
+ * Name: test_whoami
+ ****************************************************************************/
+
+static int test_whoami(int devno)
+{
+  uint8_t id = 0;
+  int ret;
+  int fd;
+
+  fd = open_topic(devno, "inclinometer");
+  if (fd < 0)
+    {
+      return fd;
+    }
+
+  ret = ioctl(fd, SNIOC_WHO_AM_I, (unsigned long)((uintptr_t)&id));
+  close(fd);
+
+  ret = (ret == 0 && id == SCL3300TEST_WHOAMI) ? OK : -EIO;
+  printf("WHOAMI: 0x%02x -> %s\n", id, ret == OK ? "PASS" : "FAIL");
+  return ret;
+}
+
+/****************************************************************************
+ * Name: test_selftest
+ ****************************************************************************/
+
+static int test_selftest(int devno)
+{
+  int ret;
+  int fd;
+
+  fd = open_topic(devno, "inclinometer");
+  if (fd < 0)
+    {
+      return fd;
+    }
+
+  ret = ioctl(fd, SNIOC_SELFTEST, 0);
+  close(fd);
+
+  printf("SELFTEST: %d -> %s\n", ret, ret == 0 ? "PASS" : "FAIL");
+  return ret == 0 ? OK : -EIO;
+}
+
+/****************************************************************************
+ * Name: get_info
+ ****************************************************************************/
+
+static int get_info(int devno, FAR const char *name,
+                    FAR struct sensor_device_info_s *info)
+{
+  int ret;
+  int fd;
+
+  fd = open_topic(devno, name);
+  if (fd < 0)
+    {
+      return fd;
+    }
+
+  ret = ioctl(fd, SNIOC_GET_INFO, (unsigned long)((uintptr_t)info));
+  close(fd);
+  return ret < 0 ? -errno : OK;
+}
+
+/****************************************************************************
+ * Name: print_info
+ ****************************************************************************/
+
+static int print_info(int devno, FAR const char *name)
+{
+  struct sensor_device_info_s info;
+  int ret;
+
+  ret = get_info(devno, name, &info);
+  if (ret < 0)
+    {
+      printf("INFO %s: failed %d\n", name, ret);
+      return ret;
+    }
+
+  printf("INFO %s: %s %s v%" PRIu32 ", %.2f mA, range %.4f, "
+         "resolution %.7f, interval %" PRId32 "..%" PRId32 " us\n",
+         name, info.vendor, info.name, info.version,
+         TODOUBLE(info.power), TODOUBLE(info.max_range),
+         TODOUBLE(info.resolution), info.min_delay, info.max_delay);
+  return OK;
+}
+
+/****************************************************************************
+ * Name: test_info
+ ****************************************************************************/
+
+static int test_info(int devno)
+{
+  int ret;
+
+  ret = print_info(devno, "inclinometer");
+#ifdef CONFIG_SENSORS_SCL3300_ACCEL
+  if (ret == OK)
+    {
+      ret = print_info(devno, "accel");
+    }
+#endif
+
+  return ret;
+}
+
+/****************************************************************************
+ * Name: measure
+ *
+ * Description:
+ *   Read SCL3300TEST_NSAMPLES inclinometer samples and print the mean and
+ *   the standard deviation of each axis.
+ *
+ ****************************************************************************/
+
+static int measure(int fd)
+{
+  struct sensor_inclinometer data;
+  double sum[3];
+  double sq[3];
+  double val[3];
+  double mean;
+  double temp = 0.0;
+  int got = 0;
+  int i;
+  int k;
+
+  memset(sum, 0, sizeof(sum));
+  memset(sq, 0, sizeof(sq));
+
+  ioctl(fd, SNIOC_SET_INTERVAL, SCL3300TEST_INTERVAL);
+
+  /* Drop the samples taken while the output settles */
+
+  for (i = 0; i < SCL3300TEST_NSKIP; i++)
+    {
+      read_sample(fd, &data, sizeof(data));
+    }
+
+  for (i = 0; i < SCL3300TEST_NSAMPLES; i++)
+    {
+      if (read_sample(fd, &data, sizeof(data)) < 0)
+        {
+          continue;
+        }
+
+      val[0] = TODOUBLE(data.x);
+      val[1] = TODOUBLE(data.y);
+      val[2] = TODOUBLE(data.z);
+      for (k = 0; k < 3; k++)
+        {
+          sum[k] += val[k];
+          sq[k]  += val[k] * val[k];
+        }
+
+      temp = TODOUBLE(data.temperature);
+      got++;
+    }
+
+  if (got == 0)
+    {
+      printf("  No samples received\n");
+      return -ETIMEDOUT;
+    }
+
+  printf("  %d/%d samples, temperature %.2f C\n", got,
+         SCL3300TEST_NSAMPLES, temp);
+  for (k = 0; k < 3; k++)
+    {
+      mean = sum[k] / got;
+      printf("  %c: mean %9.4f deg, stddev %.5f deg\n", 'X' + k, mean,
+             sqrt(fabs(sq[k] / got - mean * mean)));
+    }
+
+  return got == SCL3300TEST_NSAMPLES ? OK : -EIO;
+}
+
+/****************************************************************************
+ * Name: test_read
+ ****************************************************************************/
+
+static int test_read(int devno)
+{
+  int ret;
+  int fd;
+
+  fd = open_topic(devno, "inclinometer");
+  if (fd < 0)
+    {
+      return fd;
+    }
+
+  printf("READ:\n");
+  ret = measure(fd);
+  close(fd);
+  return ret;
+}
+
+/****************************************************************************
+ * Name: test_modes
+ *
+ * Description:
+ *   Go through Modes 1, 2, 3, 4 and back to 1, printing the device info
+ *   and the noise in each.  Then check that an invalid mode is rejected.
+ *
+ ****************************************************************************/
+
+static int test_modes(int devno)
+{
+  static const int modes[] =
+  {
+    SCL3300_MODE_1, SCL3300_MODE_2, SCL3300_MODE_3, SCL3300_MODE_4,
+    SCL3300_MODE_1
+  };
+
+  int result = OK;
+  int ret;
+  int fd;
+  int i;
+
+  fd = open_topic(devno, "inclinometer");
+  if (fd < 0)
+    {
+      return fd;
+    }
+
+  for (i = 0; i < sizeof(modes) / sizeof(modes[0]); i++)
+    {
+      printf("MODE %d:\n", modes[i]);
+      ret = ioctl(fd, SNIOC_SET_OPERATIONAL_MODE, modes[i]);
+      if (ret < 0)
+        {
+          printf("  SNIOC_SET_OPERATIONAL_MODE failed: %d -> FAIL\n",
+                 errno);
+          result = -EIO;
+          continue;
+        }
+
+      test_info(devno);
+      if (measure(fd) < 0)
+        {
+          result = -EIO;
+        }
+    }
+
+  ret = ioctl(fd, SNIOC_SET_OPERATIONAL_MODE, SCL3300_MODE_4 + 1);
+  if (ret < 0 && errno == EINVAL)
+    {
+      printf("MODE %d: rejected -> PASS\n", SCL3300_MODE_4 + 1);
+    }
+  else
+    {
+      printf("MODE %d: accepted -> FAIL\n", SCL3300_MODE_4 + 1);
+      result = -EIO;
+    }
+
+  close(fd);
+  return result;
+}
+
+/****************************************************************************
+ * Name: test_power
+ *
+ * Description:
+ *   Select Mode 4 and the power-down-when-idle policy, then activate and
+ *   deactivate the inclinometer SCL3300TEST_NCYCLES times, reading one
+ *   sample each time.  The mode must survive every power-down.  The
+ *   defaults (Mode 1, always on) are restored at the end.
+ *
+ ****************************************************************************/
+
+static int test_power(int devno)
+{
+#ifdef CONFIG_SENSORS_SCL3300_ACCEL
+  struct sensor_device_info_s before;
+  struct sensor_device_info_s after;
+#endif
+  struct sensor_inclinometer data;
+  int fails = 0;
+  int ret;
+  int fd;
+  int i;
+
+  /* Opening the topic activates it, so the device powers down when this
+   * descriptor is closed.
+   */
+
+  fd = open_topic(devno, "inclinometer");
+  if (fd < 0)
+    {
+      return fd;
+    }
+
+  ret = ioctl(fd, SNIOC_SET_OPERATIONAL_MODE, SCL3300_MODE_4);
+  if (ret >= 0)
+    {
+      ret = ioctl(fd, SNIOC_SET_POWER_MODE, SCL3300_POWER_DOWN_IDLE);
+    }
+
+  close(fd);
+  if (ret < 0)
+    {
+      printf("POWER: ioctl failed: %d -> FAIL\n", errno);
+      return -EIO;
+    }
+
+#ifdef CONFIG_SENSORS_SCL3300_ACCEL
+  get_info(devno, "accel", &before);
+#endif
+
+  printf("POWER: %d power-down/wake-up cycles\n", SCL3300TEST_NCYCLES);
+  for (i = 0; i < SCL3300TEST_NCYCLES; i++)
+    {
+      fd = open_topic(devno, "inclinometer");
+      if (fd < 0)
+        {
+          fails++;
+          continue;
+        }
+
+      ioctl(fd, SNIOC_SET_INTERVAL, SCL3300TEST_INTERVAL);
+      if (read_sample(fd, &data, sizeof(data)) < 0)
+        {
+          fails++;
+        }
+
+      close(fd);
+    }
+
+#ifdef CONFIG_SENSORS_SCL3300_ACCEL
+  /* The accelerometer resolution depends on the mode */
+
+  get_info(devno, "accel", &after);
+  if (after.resolution != before.resolution)
+    {
+      printf("  Mode not preserved\n");
+      fails++;
+    }
+#endif
+
+  fd = open_topic(devno, "inclinometer");
+  if (fd >= 0)
+    {
+      ioctl(fd, SNIOC_SET_POWER_MODE, SCL3300_POWER_ALWAYS_ON);
+      ioctl(fd, SNIOC_SET_OPERATIONAL_MODE, SCL3300_MODE_1);
+      close(fd);
+    }
+
+  printf("POWER: %d failures -> %s\n", fails, fails == 0 ? "PASS" : "FAIL");
+  return fails == 0 ? OK : -EIO;
+}
+
+/****************************************************************************
+ * Name: test_reset
+ ****************************************************************************/
+
+static int test_reset(int devno)
+{
+  int ret;
+  int fd;
+
+  fd = open_topic(devno, "inclinometer");
+  if (fd < 0)
+    {
+      return fd;
+    }
+
+  ret = ioctl(fd, SNIOC_RESET, 0);
+  close(fd);
+
+  printf("RESET: %d -> %s\n", ret, ret == 0 ? "PASS" : "FAIL");
+  if (ret < 0)
+    {
+      return -EIO;
+    }
+
+  return test_read(devno);
+}
+
+/****************************************************************************
+ * Name: show_usage
+ ****************************************************************************/
+
+static void show_usage(FAR const char *progname)
+{
+  printf("Usage: %s [-n devno] <command>\n", progname);
+  printf("  -n devno  Topic instance (default 0)\n");
+  printf("Commands:\n");
+  printf("  whoami    Read WHOAMI\n");
+  printf("  selftest  Run the self-test\n");
+  printf("  info      Print the device info of each topic\n");
+  printf("  read      Print mean and noise of %d samples\n",
+         SCL3300TEST_NSAMPLES);
+  printf("  modes     Measure in Modes 1, 2, 3, 4 and 1\n");
+  printf("  power     Cycle the power-down-when-idle policy\n");
+  printf("  reset     Reset the device and read again\n");
+  printf("  all       All of the above\n");
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: main
+ ****************************************************************************/
+
+int main(int argc, FAR char *argv[])
+{
+  FAR const char *cmd;
+  int devno = 0;
+  int ret = OK;
+  int opt;
+
+  optind = 1;
+
+  while ((opt = getopt(argc, argv, "n:h")) != ERROR)
+    {
+      switch (opt)
+        {
+          case 'n':
+            devno = atoi(optarg);
+            break;
+
+          default:
+            show_usage(argv[0]);
+            return EXIT_FAILURE;
+        }
+    }
+
+  if (optind >= argc)
+    {
+      show_usage(argv[0]);
+      return EXIT_FAILURE;
+    }
+
+  cmd = argv[optind];
+  if (strcmp(cmd, "whoami") == 0)
+    {
+      ret = test_whoami(devno);
+    }
+  else if (strcmp(cmd, "selftest") == 0)
+    {
+      ret = test_selftest(devno);
+    }
+  else if (strcmp(cmd, "info") == 0)
+    {
+      ret = test_info(devno);
+    }
+  else if (strcmp(cmd, "read") == 0)
+    {
+      ret = test_read(devno);
+    }
+  else if (strcmp(cmd, "modes") == 0)
+    {
+      ret = test_modes(devno);
+    }
+  else if (strcmp(cmd, "power") == 0)
+    {
+      ret = test_power(devno);
+    }
+  else if (strcmp(cmd, "reset") == 0)
+    {
+      ret = test_reset(devno);
+    }
+  else if (strcmp(cmd, "all") == 0)
+    {
+      ret |= test_whoami(devno);
+      ret |= test_selftest(devno);
+      ret |= test_info(devno);
+      ret |= test_read(devno);
+      ret |= test_modes(devno);
+      ret |= test_power(devno);
+      ret |= test_reset(devno);
+      printf("ALL: %s\n", ret == OK ? "PASS" : "FAIL");
+    }
+  else
+    {
+      show_usage(argv[0]);
+      return EXIT_FAILURE;
+    }
+
+  return ret == OK ? EXIT_SUCCESS : EXIT_FAILURE;
+}

Reply via email to