+ return SR_OK;
+}
+
+/**
+ * Start a session.
+ *
+ * There can only be one session at a time. TODO
+ *
+ * @return SR_OK upon success, SR_ERR upon errors.
+ */
+int sr_session_start(void)
+{
+ struct sr_device *device;
+ GSList *l;
+ int ret;
+
+ if (!session) {
+ sr_err("session: %s: session was NULL; a session must be "
+ "created first, before starting it.", __func__);
+ return SR_ERR; /* TODO: SR_ERR_BUG? */
+ }
+
+ if (!session->devices) {
+ /* TODO: Actually the case? */
+ sr_err("session: %s: session->devices was NULL; a session "
+ "cannot be started without devices.", __func__);
+ return SR_ERR; /* TODO: SR_ERR_BUG? */
+ }
+
+ /* TODO: Check plugin_index validity? */
+
+ sr_info("session: starting");
+
+ for (l = session->devices; l; l = l->next) {
+ device = l->data;
+ /* TODO: Check for device != NULL. */
+ if ((ret = device->plugin->start_acquisition(
+ device->plugin_index, device)) != SR_OK) {
+ sr_err("session: %s: could not start an acquisition "
+ "(%d)", __func__, ret);
+ break;
+ }
+ }
+
+ /* TODO: What if there are multiple devices? Which return code? */
+
+ return ret;
+}
+
+/**
+ * Run the session.
+ *
+ * TODO: Various error checks etc.
+ *
+ * @return SR_OK upon success, SR_ERR_BUG upon errors.
+ */
+int sr_session_run(void)
+{
+ if (!session) {
+ sr_err("session: %s: session was NULL; a session must be "
+ "created first, before running it.", __func__);
+ return SR_ERR_BUG;
+ }
+
+ if (!session->devices) {
+ /* TODO: Actually the case? */
+ sr_err("session: %s: session->devices was NULL; a session "
+ "cannot be run without devices.", __func__);
+ return SR_ERR_BUG;
+ }
+
+ sr_info("session: running");
+ session->running = TRUE;
+
+ /* Do we have real sources? */
+ if (num_sources == 1 && sources[0].fd == -1) {
+ /* Dummy source, freewheel over it. */
+ while (session->running)
+ sources[0].cb(-1, 0, sources[0].user_data);
+ } else {
+ /* Real sources, use g_poll() main loop. */
+ sr_session_run_poll();
+ }
+
+ return SR_OK;