+
+/* Set error location */
+
+void silc_set_errno_location(const char *filename,
+ SilcUInt32 current_line_number,
+ SilcUInt32 current_column_number)
+{
+ SilcTls tls = silc_thread_get_tls();
+
+ if (!tls)
+ return;
+
+ if (filename)
+ silc_snprintf(tls->filename, sizeof(tls->filename), filename);
+ tls->cur_line = current_line_number;
+ tls->cur_column = current_column_number;
+}
+
+/* Get error location */
+
+SilcBool silc_errno_location(const char **filename,
+ SilcUInt32 *current_line,
+ SilcUInt32 *current_column)
+{
+ SilcTls tls = silc_thread_get_tls();
+
+ if (!tls)
+ return FALSE;
+ if (tls->filename[0] == '\0' && !tls->cur_line && !tls->cur_column)
+ return FALSE;
+
+ if (filename)
+ *filename = tls->filename;
+ if (current_line)
+ *current_line = tls->cur_line;
+ if (current_column)
+ *current_column = tls->cur_column;
+
+ return TRUE;
+}