return 1;
}
+int gpiod_set_output_value(enum gpiod_line_value in, enum gpiod_line_value *out)
+{
+ switch (in) {
+ case GPIOD_LINE_VALUE_INACTIVE:
+ case GPIOD_LINE_VALUE_ACTIVE:
+ *out = in;
+ break;
+ default:
+ *out = GPIOD_LINE_VALUE_INACTIVE;
+ errno = EINVAL;
+ return -1;
+ }
+
+ return 0;
+}
+
void gpiod_line_mask_zero(uint64_t *mask)
{
*mask = 0ULL;
struct gpiod_info_event *gpiod_info_event_read_fd(int fd);
int gpiod_poll_fd(int fd, int64_t timeout);
+int gpiod_set_output_value(enum gpiod_line_value in,
+ enum gpiod_line_value *out);
void gpiod_line_mask_zero(uint64_t *mask);
void gpiod_line_mask_fill(uint64_t *mask);
const enum gpiod_line_value *values,
size_t num_values)
{
+ size_t i;
+ int ret;
+
if (num_values > LINES_MAX) {
errno = EINVAL;
return -1;
}
- memcpy(config->output_values, values, num_values * sizeof(*values));
+ for (i = 0; i < num_values; i++) {
+ ret = gpiod_set_output_value(values[i],
+ &config->output_values[i]);
+ if (ret) {
+ config->num_output_values = 0;
+ return ret;
+ }
+ }
+
config->num_output_values = num_values;
return 0;
{
assert(settings);
- switch (value) {
- case GPIOD_LINE_VALUE_INACTIVE:
- case GPIOD_LINE_VALUE_ACTIVE:
- settings->output_value = value;
- break;
- default:
- settings->output_value = GPIOD_LINE_VALUE_INACTIVE;
- errno = EINVAL;
- return -1;
- }
-
- return 0;
+ return gpiod_set_output_value(value, &settings->output_value);
}
GPIOD_API enum gpiod_line_value
g_assert_cmpint(gpiod_line_settings_get_output_value(retrieved), ==,
GPIOD_LINE_VALUE_INACTIVE);
}
+
+GPIOD_TEST_CASE(set_output_values_invalid_value)
+{
+ static const enum gpiod_line_value values[] = {
+ GPIOD_LINE_VALUE_ACTIVE,
+ GPIOD_LINE_VALUE_INACTIVE,
+ 999,
+ GPIOD_LINE_VALUE_INACTIVE,
+ };
+
+ g_autoptr(struct_gpiod_line_config) config = NULL;
+
+ config = gpiod_test_create_line_config_or_fail();
+
+ g_assert_cmpint(gpiod_line_config_set_output_values(config, values, 4),
+ ==, -1);
+ gpiod_test_expect_errno(EINVAL);
+}