+void ast_after_bridge_goto_read(struct ast_channel *chan, char *buffer, size_t buf_size)
+{
+ struct ast_datastore *datastore;
+ struct after_bridge_goto_ds *after_bridge;
+ char *current_pos = buffer;
+ size_t remaining_size = buf_size;
+
+ SCOPED_CHANNELLOCK(lock, chan);
+
+ datastore = ast_channel_datastore_find(chan, &after_bridge_goto_info, NULL);
+ if (!datastore) {
+ buffer[0] = '\0';
+ return;
+ }
+
+ after_bridge = datastore->data;
+
+ if (after_bridge->parseable_goto) {
+ snprintf(buffer, buf_size, "%s", after_bridge->parseable_goto);
+ return;
+ }
+
+ if (!ast_strlen_zero(after_bridge->context)) {
+ snprintf(current_pos, remaining_size, "%s,", after_bridge->context);
+ remaining_size = remaining_size - strlen(current_pos);
+ current_pos += strlen(current_pos);
+ }
+
+ if (after_bridge->run_h_exten) {
+ snprintf(current_pos, remaining_size, "h,");
+ remaining_size = remaining_size - strlen(current_pos);
+ current_pos += strlen(current_pos);
+ } else if (!ast_strlen_zero(after_bridge->exten)) {
+ snprintf(current_pos, remaining_size, "%s,", after_bridge->exten);
+ remaining_size = remaining_size - strlen(current_pos);
+ current_pos += strlen(current_pos);
+ }
+
+ snprintf(current_pos, remaining_size, "%d", after_bridge->priority);
+}
+