ssize_t iiod_client_read_attr(struct iiod_client *client, int desc, const struct iio_device *dev, const struct iio_channel *chn, const char *attr, char *dest, size_t len, bool is_debug) { const char *id = iio_device_get_id(dev); char buf[1024]; ssize_t ret; if (attr) { if (chn) { if (!iio_channel_find_attr(chn, attr)) return -ENOENT; } else if (is_debug) { if (!iio_device_find_debug_attr(dev, attr)) return -ENOENT; } else { if (!iio_device_find_attr(dev, attr)) return -ENOENT; } } if (chn) snprintf(buf, sizeof(buf), "READ %s %s %s %s\r\n", id, iio_channel_is_output(chn) ? "OUTPUT" : "INPUT", iio_channel_get_id(chn), attr ? attr : ""); else if (is_debug) snprintf(buf, sizeof(buf), "READ %s DEBUG %s\r\n", id, attr ? attr : ""); else snprintf(buf, sizeof(buf), "READ %s %s\r\n", id, attr ? attr : ""); iio_mutex_lock(client->lock); ret = (ssize_t) iiod_client_exec_command(client, desc, buf); if (ret < 0) goto out_unlock; if ((size_t) ret + 1 > len) { ret = -EIO; goto out_unlock; } /* +1: Also read the trailing \n */ ret = iiod_client_read_all(client, desc, dest, ret + 1); if (ret > 0) { /* Discard the trailing \n */ ret--; /* Replace it with a \0 just in case */ dest[ret] = '\0'; } out_unlock: iio_mutex_unlock(client->lock); return ret; }
static ssize_t network_write_dev_attr(const struct iio_device *dev, const char *attr, const char *src, size_t len, bool is_debug) { if (attr && ((is_debug && !iio_device_find_debug_attr(dev, attr)) || (!is_debug && !iio_device_find_attr(dev, attr)))) return -ENOENT; return network_write_attr_helper(dev, NULL, attr, src, len, is_debug); }
ssize_t iiod_client_write_attr(struct iiod_client *client, int desc, const struct iio_device *dev, const struct iio_channel *chn, const char *attr, const char *src, size_t len, bool is_debug) { struct iio_context_pdata *pdata = client->pdata; const struct iiod_client_ops *ops = client->ops; const char *id = iio_device_get_id(dev); char buf[1024]; ssize_t ret; int resp; if (attr) { if (chn) { if (!iio_channel_find_attr(chn, attr)) return -ENOENT; } else if (is_debug) { if (!iio_device_find_debug_attr(dev, attr)) return -ENOENT; } else { if (!iio_device_find_attr(dev, attr)) return -ENOENT; } } if (chn) snprintf(buf, sizeof(buf), "WRITE %s %s %s %s %lu\r\n", id, iio_channel_is_output(chn) ? "OUTPUT" : "INPUT", iio_channel_get_id(chn), attr ? attr : "", (unsigned long) len); else if (is_debug) snprintf(buf, sizeof(buf), "WRITE %s DEBUG %s %lu\r\n", id, attr ? attr : "", (unsigned long) len); else snprintf(buf, sizeof(buf), "WRITE %s %s %lu\r\n", id, attr ? attr : "", (unsigned long) len); iio_mutex_lock(client->lock); ret = ops->write(pdata, desc, buf, strlen(buf)); if (ret < 0) goto out_unlock; ret = iiod_client_write_all(client, desc, src, len); if (ret < 0) goto out_unlock; ret = iiod_client_read_integer(client, desc, &resp); if (ret < 0) goto out_unlock; ret = (ssize_t) resp; out_unlock: iio_mutex_unlock(client->lock); return ret; }
int iioc_write_attr(struct iio_device *dev, const char *attr_name, const char *attr_val) { char *ret; if (attr_val == NULL || attr_val == "" || attr_name == NULL || attr_name == "") { IIOC_DBG("Parameter attr_name or attr_val is NULL.\n"); return -EINVAL; } ret = (char *)iio_device_find_attr(dev, attr_name); if (!ret) { IIOC_DBG("%s attribute is not found.\n", attr_name); return -EINVAL; } return iio_device_attr_write(dev, attr_name, attr_val); }