}
}
+/**
+ * Helper to send a meta datafeed package (SR_DF_META) to the session bus.
+ *
+ * @param sdi The device instance to send the package from. Must not be NULL.
+ * @param key The config key to send to the session bus.
+ * @param var The value to send to the session bus.
+ *
+ * @retval SR_OK Success.
+ * @retval SR_ERR_ARG Invalid argument.
+ *
+ * @private
+ */
+SR_PRIV int sr_session_send_meta(const struct sr_dev_inst *sdi,
+ uint32_t key, GVariant *var)
+{
+ struct sr_config *cfg;
+ struct sr_datafeed_packet packet;
+ struct sr_datafeed_meta meta;
+ int ret;
+
+ cfg = sr_config_new(key, var);
+ if (!cfg)
+ return SR_ERR;
+
+ memset(&meta, 0, sizeof(meta));
+
+ packet.type = SR_DF_META;
+ packet.payload = &meta;
+
+ meta.config = g_slist_append(NULL, cfg);
+
+ ret = sr_session_send(sdi, &packet);
+ g_slist_free(meta.config);
+ sr_config_free(cfg);
+
+ return ret;
+}
+
/**
* Send a packet to whatever is listening on the datafeed bus.
*
/* We should be using g_io_create_watch(), but can't without
* changing the driver API, as the callback signature is different.
*/
-#ifdef G_OS_WIN32
+#ifdef _WIN32
g_io_channel_win32_make_pollfd(channel, events, &pollfd);
#else
pollfd.fd = g_io_channel_unix_get_fd(channel);
g_memdup(src, sizeof(struct sr_config)));
}
-/** @private */
-SR_PRIV int sr_packet_copy(const struct sr_datafeed_packet *packet,
+SR_API int sr_packet_copy(const struct sr_datafeed_packet *packet,
struct sr_datafeed_packet **copy)
{
const struct sr_datafeed_meta *meta;
case SR_DF_LOGIC:
logic = packet->payload;
logic_copy = g_malloc(sizeof(*logic_copy));
+ if (!logic_copy)
+ return SR_ERR;
logic_copy->length = logic->length;
logic_copy->unitsize = logic->unitsize;
+ logic_copy->data = g_malloc(logic->length * logic->unitsize);
+ if (!logic_copy->data) {
+ g_free(logic_copy);
+ return SR_ERR;
+ }
memcpy(logic_copy->data, logic->data, logic->length * logic->unitsize);
(*copy)->payload = logic_copy;
break;
return SR_OK;
}
-void sr_packet_free(struct sr_datafeed_packet *packet)
+SR_API void sr_packet_free(struct sr_datafeed_packet *packet)
{
const struct sr_datafeed_meta *meta;
const struct sr_datafeed_logic *logic;
sr_err("Unknown packet type %d", packet->type);
}
g_free(packet);
-
}
/** @} */